diff --git a/dev/.documenter-siteinfo.json b/dev/.documenter-siteinfo.json index c66d3c752..72cd7a8f2 100644 --- a/dev/.documenter-siteinfo.json +++ b/dev/.documenter-siteinfo.json @@ -1 +1 @@ -{"documenter":{"julia_version":"1.9.4","generation_timestamp":"2023-12-16T09:51:26","documenter_version":"1.2.1"}} \ No newline at end of file +{"documenter":{"julia_version":"1.10.2","generation_timestamp":"2024-04-10T14:42:28","documenter_version":"1.3.0"}} \ No newline at end of file diff --git a/dev/actors/about/index.html b/dev/actors/about/index.html index e858a5c47..d49242ea1 100644 --- a/dev/actors/about/index.html +++ b/dev/actors/about/index.html @@ -1,5 +1,5 @@ -Actor · Rocket.jl

Actors

An Actor is the most primitive unit of computation: it receives a message and performs a computation.

An actor is analogous to an object in an object-oriented languages. An object receives a message (a method call) and does something depending on which message it receives (the method we are calling). The main difference is that actors are completely isolated from each other, and they will never share memory. It’s also worth mentioning that an actor can maintain a private state that should never be changed directly by another actor.

For a quick introduction to Actor models, see this article.

The API of Rocket.jl's Actors is similar to RxJS subscribers.

First example

The following example implements an Actor that retains each received value from an Observable.

using Rocket
+Actor · Rocket.jl

Actors

An Actor is the most primitive unit of computation: it receives a message and performs a computation.

An actor is analogous to an object in an object-oriented languages. An object receives a message (a method call) and does something depending on which message it receives (the method we are calling). The main difference is that actors are completely isolated from each other, and they will never share memory. It’s also worth mentioning that an actor can maintain a private state that should never be changed directly by another actor.

For a quick introduction to Actor models, see this article.

The API of Rocket.jl's Actors is similar to RxJS subscribers.

First example

The following example implements an Actor that retains each received value from an Observable.

using Rocket
 
 struct CustomKeepActor <: Actor{Int}
     values::Vector{Int}
@@ -69,4 +69,4 @@
 # Logs
 # 1
 # 2
-# 3
+# 3
diff --git a/dev/actors/types/buffer/index.html b/dev/actors/types/buffer/index.html index c12de303d..eeb6f6096 100644 --- a/dev/actors/types/buffer/index.html +++ b/dev/actors/types/buffer/index.html @@ -1,11 +1,11 @@ -Buffer · Rocket.jl

Buffer actor

Rocket.bufferFunction
buffer(::Type{T}, size::Int) where T

Arguments

  • ::Type{T}: Type of data in buffer
  • size::Int: size of buffer

Creation operator for the BufferActor actor.

Examples

using Rocket
+Buffer · Rocket.jl

Buffer actor

Rocket.bufferFunction
buffer(::Type{T}, size::Int) where T

Arguments

  • ::Type{T}: Type of data in buffer
  • size::Int: size of buffer

Creation operator for the BufferActor actor.

Examples

using Rocket
 
 actor = buffer(Int, 3)
 actor isa BufferActor{Int}
 
 # output
-true

See also: BufferActor, AbstractActor

source
Rocket.BufferActorType
BufferActor{D}() where D

Buffer actor provides a storage actor. It copies last incoming successful next events in a values array, throws an ErrorException on error! event and does nothing on completion event. Note: Actor does not check the size of incoming data.

Examples

using Rocket
+true

See also: BufferActor, AbstractActor

source
Rocket.BufferActorType
BufferActor{D}() where D

Buffer actor provides a storage actor. It copies last incoming successful next events in a values array, throws an ErrorException on error! event and does nothing on completion event. Note: Actor does not check the size of incoming data.

Examples

using Rocket
 
 source = of([ 1, 2, 3 ])
 actor  = buffer(Int, 3)
@@ -14,4 +14,4 @@
 show(getvalues(actor))
 
 # output
-[1, 2, 3]

See also: Actor, buffer

source
+[1, 2, 3]

See also: Actor, buffer

source
diff --git a/dev/actors/types/circularkeep/index.html b/dev/actors/types/circularkeep/index.html index f1263d230..896c81a17 100644 --- a/dev/actors/types/circularkeep/index.html +++ b/dev/actors/types/circularkeep/index.html @@ -1,11 +1,11 @@ -CircularKeep · Rocket.jl

CircularKeep actor

Rocket.circularkeepFunction
circularkeep(::Type{T}, capacity::Int) where T

Arguments

  • ::Type{T}: Type of keep data
  • capacity::Int: circular buffer capacity

Creation operator for the CircularKeepActor actor.

Examples

using Rocket
+CircularKeep · Rocket.jl

CircularKeep actor

Rocket.circularkeepFunction
circularkeep(::Type{T}, capacity::Int) where T

Arguments

  • ::Type{T}: Type of keep data
  • capacity::Int: circular buffer capacity

Creation operator for the CircularKeepActor actor.

Examples

using Rocket
 
 actor = circularkeep(Int, 3)
 actor isa CircularKeepActor{Int}
 
 # output
-true

See also: CircularKeepActor, AbstractActor

source
Rocket.CircularKeepActorType
CirucalKeepActor{D}() where D

Circual keep actor is similar to keep actor, but uses CircularBuffer as a storage. It saves all incoming successful next events in a values circular buffer, throws an ErrorException on error! event and does nothing on completion event.

Examples

using Rocket
+true

See also: CircularKeepActor, AbstractActor

source
Rocket.CircularKeepActorType
CirucalKeepActor{D}() where D

Circual keep actor is similar to keep actor, but uses CircularBuffer as a storage. It saves all incoming successful next events in a values circular buffer, throws an ErrorException on error! event and does nothing on completion event.

Examples

using Rocket
 
 source = from(1:5)
 actor  = circularkeep(Int, 3)
@@ -14,4 +14,4 @@
 show(getvalues(actor))
 
 # output
-[3, 4, 5]

See also: Actor, keep, circularkeep

source
+[3, 4, 5]

See also: Actor, keep, circularkeep

source
diff --git a/dev/actors/types/function/index.html b/dev/actors/types/function/index.html index b3ea17c58..d02e67368 100644 --- a/dev/actors/types/function/index.html +++ b/dev/actors/types/function/index.html @@ -1,5 +1,5 @@ -Function · Rocket.jl

Function actor

Rocket.FunctionActorType
FunctionActor{D} <: Actor{D}

FunctionActor provides a simple interface to use a single function as a next! callback, error! callback throws an ErrorException and complete! callback does nothing. Should not be used explicitly because it will be created automatically when passing a Function object as an actor in subscribe! function.

Examples

using Rocket
+Function · Rocket.jl

Function actor

Rocket.FunctionActorType
FunctionActor{D} <: Actor{D}

FunctionActor provides a simple interface to use a single function as a next! callback, error! callback throws an ErrorException and complete! callback does nothing. Should not be used explicitly because it will be created automatically when passing a Function object as an actor in subscribe! function.

Examples

using Rocket
 
 source = from(1:5)
 subscribe!(source, (t) -> println(t))
@@ -10,4 +10,4 @@
 2
 3
 4
-5

See also: Actor, subscribe!

source
+5

See also: Actor, subscribe!

source
diff --git a/dev/actors/types/keep/index.html b/dev/actors/types/keep/index.html index df2babc7d..d469b9659 100644 --- a/dev/actors/types/keep/index.html +++ b/dev/actors/types/keep/index.html @@ -1,11 +1,11 @@ -Keep · Rocket.jl

Keep actor

Rocket.keepFunction
keep(::Type{T}) where T

Arguments

  • ::Type{T}: Type of keep data

Creation operator for the KeepActor actor.

Examples

using Rocket
+Keep · Rocket.jl

Keep actor

Rocket.keepFunction
keep(::Type{T}) where T

Arguments

  • ::Type{T}: Type of keep data

Creation operator for the KeepActor actor.

Examples

using Rocket
 
 actor = keep(Int)
 actor isa KeepActor{Int}
 
 # output
-true

See also: KeepActor, AbstractActor

source
Rocket.KeepActorType
KeepActor{D}() where D

Keep actor provides a storage actor. It saves all incoming successful next events in a values array, throws an ErrorException on error! event and does nothing on completion event.

Examples

using Rocket
+true

See also: KeepActor, AbstractActor

source
Rocket.KeepActorType
KeepActor{D}() where D

Keep actor provides a storage actor. It saves all incoming successful next events in a values array, throws an ErrorException on error! event and does nothing on completion event.

Examples

using Rocket
 
 source = from(1:5)
 actor  = keep(Int)
@@ -14,4 +14,4 @@
 show(getvalues(actor))
 
 # output
-[1, 2, 3, 4, 5]

See also: Actor, keep

source
+[1, 2, 3, 4, 5]

See also: Actor, keep

source
diff --git a/dev/actors/types/lambda/index.html b/dev/actors/types/lambda/index.html index c17d467f1..7180a7b13 100644 --- a/dev/actors/types/lambda/index.html +++ b/dev/actors/types/lambda/index.html @@ -1,9 +1,9 @@ -Lambda · Rocket.jl

Lambda actor

Rocket.lambdaFunction
lambda(; on_next = nothing, on_error = nothing, on_complete = nothing)
+Lambda · Rocket.jl

Lambda actor

Rocket.lambdaFunction
lambda(; on_next = nothing, on_error = nothing, on_complete = nothing)
 lambda(::Type{T}; on_next = nothing, on_error = nothing, on_complete = nothing) where T

Creation operator for the 'LambdaActor' actor.

Examples

using Rocket
 
 actor = lambda(Int; on_next = (d) -> println(d))
 actor isa LambdaActor{Int}
 
 # output
-true

See also: LambdaActor, AbstractActor

source
Rocket.LambdaActorType
LambdaActor{D, N, E, C}(on_next::N, on_error::E, on_complete::C) where D

Lambda actor wraps on_next, on_error, on_complete callbacks for data, error and complete events. Should not be used explicitly, use lambda creation operator instead.

Constructor arguments

  • on_next: Callback for data event. Optional. Default is nothing.
  • on_error: Callback for error event. Optional. Default is nothing.
  • on_complete: Callback for complete event. Optional. Default is nothing.

See also: Actor, lambda

source
+true

See also: LambdaActor, AbstractActor

source
Rocket.LambdaActorType
LambdaActor{D, N, E, C}(on_next::N, on_error::E, on_complete::C) where D

Lambda actor wraps on_next, on_error, on_complete callbacks for data, error and complete events. Should not be used explicitly, use lambda creation operator instead.

Constructor arguments

  • on_next: Callback for data event. Optional. Default is nothing.
  • on_error: Callback for error event. Optional. Default is nothing.
  • on_complete: Callback for complete event. Optional. Default is nothing.

See also: Actor, lambda

source
diff --git a/dev/actors/types/logger/index.html b/dev/actors/types/logger/index.html index 02fc2bb01..c46d64e8d 100644 --- a/dev/actors/types/logger/index.html +++ b/dev/actors/types/logger/index.html @@ -1,5 +1,5 @@ -Logger · Rocket.jl

Logger actor

Rocket.loggerFunction
logger([ io::IO ], name::String = "LogActor")
+Logger · Rocket.jl

Logger actor

Rocket.loggerFunction
logger([ io::IO ], name::String = "LogActor")
 logger(::Type{T}, [ io::IO ], name::String = "LogActor") where T

Creation operator for the LoggerActor actor.

Examples

using Rocket
 
 source = from([ 0, 1, 2 ])
@@ -36,4 +36,4 @@
 [CustomBuffer] Data: 0
 [CustomBuffer] Data: 1
 [CustomBuffer] Data: 2
-[CustomBuffer] Completed

See also: LoggerActor, AbstractActor

source
Rocket.LoggerActorType
LoggerActor{D}(name::String = "LogActor", io::O) where { D, O }

The LoggerActor logs all next!/error!/complete! events that are sent from an Observable.

Constructor arguments

  • name: name of the logger. Optional. Default is LogActor.
  • io: io stream to log in, maybe nothing to write to stdout

See also: Actor, logger

source
+[CustomBuffer] Completed

See also: LoggerActor, AbstractActor

source
Rocket.LoggerActorType
LoggerActor{D}(name::String = "LogActor", io::O) where { D, O }

The LoggerActor logs all next!/error!/complete! events that are sent from an Observable.

Constructor arguments

  • name: name of the logger. Optional. Default is LogActor.
  • io: io stream to log in, maybe nothing to write to stdout

See also: Actor, logger

source
diff --git a/dev/actors/types/server/index.html b/dev/actors/types/server/index.html index 6a7a8878b..6686c6754 100644 --- a/dev/actors/types/server/index.html +++ b/dev/actors/types/server/index.html @@ -1,5 +1,5 @@ -Server · Rocket.jl

Server actor

Rocket.serverFunction
server(port::Int)
+Server · Rocket.jl

Server actor

Rocket.serverFunction
server(port::Int)
 server(address::A, port::Int) where { A <: IPAddr }
 server(::Type{D}, port::Int)
-server(::Type{D}, address::A, port::Int) where { A <: IPAddr }

Creation operator for the ServerActor actor.

See also: AbstractActor

source
Rocket.ServerActorType
ServerActor{D, Address, Port}() where D

The ServerActor sends all next!/error!/complete! events to the local network listeners with specified Address and Port parameters via TCPSocket.

See also: Actor, server

source
+server(::Type{D}, address::A, port::Int) where { A <: IPAddr }

Creation operator for the ServerActor actor.

See also: AbstractActor

source
Rocket.ServerActorType
ServerActor{D, Address, Port}() where D

The ServerActor sends all next!/error!/complete! events to the local network listeners with specified Address and Port parameters via TCPSocket.

See also: Actor, server

source
diff --git a/dev/actors/types/storage/index.html b/dev/actors/types/storage/index.html index 502ceee10..ee00961a3 100644 --- a/dev/actors/types/storage/index.html +++ b/dev/actors/types/storage/index.html @@ -1,11 +1,11 @@ -Storage · Rocket.jl

Storage actor

Rocket.storageFunction
storage(::Type{T}) where T

Arguments

  • ::Type{T}: Type of storage data

Creation operator for the StorageActor actor.

Examples

using Rocket
+Storage · Rocket.jl

Storage actor

Rocket.storageFunction
storage(::Type{T}) where T

Arguments

  • ::Type{T}: Type of storage data

Creation operator for the StorageActor actor.

Examples

using Rocket
 
 actor = storage(Int)
 actor isa StorageActor{Int}
 
 # output
-true

See also: StorageActor, AbstractActor

source
Rocket.StorageActorType
StorageActor{D}() where D

Storage actor provides an actor that stores a single (last) value passed to the next! callback. It saves last incoming successful next event in the value field, throws an ErrorException on error! event and does nothing on completion event. Before any events value initialised with nothing.

Examples

using Rocket
+true

See also: StorageActor, AbstractActor

source
Rocket.StorageActorType
StorageActor{D}() where D

Storage actor provides an actor that stores a single (last) value passed to the next! callback. It saves last incoming successful next event in the value field, throws an ErrorException on error! event and does nothing on completion event. Before any events value initialised with nothing.

Examples

using Rocket
 
 source = from(1:5)
 actor  = storage(Int)
@@ -14,4 +14,4 @@
 show(getvalues(actor))
 
 # output
-5

See also: Actor, storage

source
+5

See also: Actor, storage

source
diff --git a/dev/actors/types/sync/index.html b/dev/actors/types/sync/index.html index 21cd8fa6b..ef51904b9 100644 --- a/dev/actors/types/sync/index.html +++ b/dev/actors/types/sync/index.html @@ -1,5 +1,5 @@ -Sync · Rocket.jl

Sync actor

Rocket.syncFunction
sync(actor::A; withlock::Bool = true, timeout::Int = -1) where A
+Sync · Rocket.jl

Sync actor

Rocket.syncFunction
sync(actor::A; withlock::Bool = true, timeout::Int = -1) where A
 sync(factory::F; withlock::Bool = true, timeout::Int = -1) where { F <: AbstractActorFactory }

Creation operator for the SyncActor actor. Accepts optional named timeout argument which specifies maximum number of milliseconds to wait (throws SyncActorTimedOutException() on timeout). Also accepts optional withlock boolean flag indicating that every next!, error! and complete! event should be guarded with ReentrantLock.

Examples

using Rocket
 
 actor  = keep(Int)
@@ -28,4 +28,4 @@
 show(values)
 
 # output
-[0, 1, 2, 3, 4, 5]

See also: SyncActor, AbstractActor

source
Rocket.SyncActorType
SyncActor{T, A}(actor::A; withlock::Bool = true, timeout::Int = -1) where { T, A }

Sync actor provides a synchronized interface to wait for an actor to be notified with a complete event. By default creates a re-entrant lock for synchronizing next!, error! and complete! events.

See also: Actor, sync

source
+[0, 1, 2, 3, 4, 5]

See also: SyncActor, AbstractActor

source
Rocket.SyncActorType
SyncActor{T, A}(actor::A; withlock::Bool = true, timeout::Int = -1) where { T, A }

Sync actor provides a synchronized interface to wait for an actor to be notified with a complete event. By default creates a re-entrant lock for synchronizing next!, error! and complete! events.

See also: Actor, sync

source
diff --git a/dev/actors/types/void/index.html b/dev/actors/types/void/index.html index 8b31cd698..349a7ed57 100644 --- a/dev/actors/types/void/index.html +++ b/dev/actors/types/void/index.html @@ -1,5 +1,5 @@ -Void · Rocket.jl

Void actor

Rocket.voidFunction
void()
+Void · Rocket.jl

Void actor

Rocket.voidFunction
void()
 void(::Type{T}) where T

Creation operator for the VoidActor actor.

Examples

using Rocket
 
 actor = void(Int)
@@ -7,7 +7,7 @@
 
 # output
 true
-

See also: VoidActor, AbstractActor

source
Rocket.VoidActorType
VoidActor{D}() where D

Void actor does nothing with input data, error and complete events, can be useful for debugging (e.g. to start side-effects with tap operator)

Examples

using Rocket
+

See also: VoidActor, AbstractActor

source
Rocket.VoidActorType
VoidActor{D}() where D

Void actor does nothing with input data, error and complete events, can be useful for debugging (e.g. to start side-effects with tap operator)

Examples

using Rocket
 
 source = from([ 0, 1, 2 ])
 actor  = VoidActor{Int}()
@@ -16,4 +16,4 @@
 ;
 
 # output
-

See also: Actor, void, tap

source
+

See also: Actor, void, tap

source
diff --git a/dev/api/actors/index.html b/dev/api/actors/index.html index 12a83abcd..236e1658b 100644 --- a/dev/api/actors/index.html +++ b/dev/api/actors/index.html @@ -1,5 +1,5 @@ -Actors · Rocket.jl

Actors API

How to create a custom Actor

At first custom actor should implement a custom method for the as_actor function. Rocket.jl also provides a number of helper actor abstract types with predefined as_actor method behavior (see Traits API section).

using Rocket
+Actors · Rocket.jl

Actors API

How to create a custom Actor

At first custom actor should implement a custom method for the as_actor function. Rocket.jl also provides a number of helper actor abstract types with predefined as_actor method behavior (see Traits API section).

using Rocket
 
 struct MyCustomActor end
 
@@ -16,7 +16,7 @@
 
 struct MyCustomCompletionActor <: CompletionActor{Int} end
 
-Rocket.on_complete!(actor::MyCustomCompletionActor) = # custom logic here

Traits

Rocket.as_actorFunction
as_actor(any)

This function checks actor trait behavior specification. May be used explicitly to specify actor trait behavior for any object.

See also: ActorTrait

source
Rocket.BaseActorTraitType

Base actor trait specifies actor to listen for all next!, error! and complete! events. BaseActorTrait is a subtype of ActorTrait.

See also: Actor

source
Rocket.InvalidActorTraitType

Default actor trait behavior for any object. Actor with such a trait specificaion cannot be used as a valid actor in subscribe! function. Doing so will raise an error. InvalidActorTrait is a subtype of ActorTrait.

See also: ActorTrait

source

Types

Rocket.ActorType

Can be used as a super type for common actor. Automatically specifies a BaseActorTrait trait behavior. Every Actor must implement its own methods for on_next!(actor, data), on_error!(actor, err) and on_complete!(actor) functions. Actor is a subtype of AbstractActor type.

Examples

using Rocket
+Rocket.on_complete!(actor::MyCustomCompletionActor) = # custom logic here

Traits

Rocket.as_actorFunction
as_actor(any)

This function checks actor trait behavior specification. May be used explicitly to specify actor trait behavior for any object.

See also: ActorTrait

source
Rocket.BaseActorTraitType

Base actor trait specifies actor to listen for all next!, error! and complete! events. BaseActorTrait is a subtype of ActorTrait.

See also: Actor

source
Rocket.InvalidActorTraitType

Default actor trait behavior for any object. Actor with such a trait specificaion cannot be used as a valid actor in subscribe! function. Doing so will raise an error. InvalidActorTrait is a subtype of ActorTrait.

See also: ActorTrait

source

Types

Rocket.ActorType

Can be used as a super type for common actor. Automatically specifies a BaseActorTrait trait behavior. Every Actor must implement its own methods for on_next!(actor, data), on_error!(actor, err) and on_complete!(actor) functions. Actor is a subtype of AbstractActor type.

Examples

using Rocket
 
 struct MyActor <: Actor{String} end
 
@@ -24,7 +24,7 @@
 
 # output
 
-BaseActorTrait{String}()

See also: AbstractActor, as_actor, BaseActorTrait, ActorTrait, on_next!, on_error!, on_complete!

source
Rocket.NextActorType

Can be used as a super type for "next-only" actor. Automatically specifies a NextActorTrait trait behavior. Every NextActor must implement its own methods for on_next!(actor, data) function only. NextActor is a subtype of AbstractActor type.

Examples

using Rocket
 
 struct MyNextActor <: NextActor{String} end
 
@@ -32,7 +32,7 @@
 
 # output
 
-NextActorTrait{String}()

See also: AbstractActor, as_actor, NextActorTrait, ActorTrait, on_next!

source
Rocket.ErrorActorType

Can be used as a super type for "error-only" actor. Automatically specifies a ErrorActorTrait trait behavior. Every ErrorActor must implement its own methods for on_error!(actor, err) function only. ErrorActor is a subtype of AbstractActor type.

Examples

using Rocket
+NextActorTrait{String}()

See also: AbstractActor, as_actor, NextActorTrait, ActorTrait, on_next!

source
Rocket.ErrorActorType

Can be used as a super type for "error-only" actor. Automatically specifies a ErrorActorTrait trait behavior. Every ErrorActor must implement its own methods for on_error!(actor, err) function only. ErrorActor is a subtype of AbstractActor type.

Examples

using Rocket
 
 struct MyErrorActor <: ErrorActor{String} end
 
@@ -40,7 +40,7 @@
 
 # output
 
-ErrorActorTrait{String}()

See also: AbstractActor, as_actor, ErrorActorTrait, ActorTrait, on_error!

source
Rocket.CompletionActorType

Can be used as a super type for "completion-only" actor. Automatically specifies a CompletionActorTrait trait behavior. Every CompletionActor must implement its own methods for on_complete!(actor) function only. CompletionActor is a subtype of AbstractActor type.

Examples

using Rocket
+ErrorActorTrait{String}()

See also: AbstractActor, as_actor, ErrorActorTrait, ActorTrait, on_error!

source
Rocket.CompletionActorType

Can be used as a super type for "completion-only" actor. Automatically specifies a CompletionActorTrait trait behavior. Every CompletionActor must implement its own methods for on_complete!(actor) function only. CompletionActor is a subtype of AbstractActor type.

Examples

using Rocket
 
 struct MyCompletionActor <: CompletionActor{String} end
 
@@ -48,7 +48,7 @@
 
 # output
 
-CompletionActorTrait{String}()

See also: AbstractActor, as_actor, CompletionActorTrait, ActorTrait, on_complete!

source

Events

Rocket.next!Function
next!(actor, data)
-next!(actor, data, scheduler)

This function is used to deliver a "next" event to an actor with some data. Takes optional scheduler object to schedule execution of data delivery.

See also: AbstractActor, on_next!

source
Rocket.error!Function
error!(actor, err)
-error!(actor, err, scheduler)

This function is used to deliver a "error" event to an actor with some err. Takes optional scheduler object to schedule execution of error delivery.

See also: AbstractActor, on_error!

source
Rocket.complete!Function
complete!(actor)
-complete!(actor, scheduler)

This function is used to deliver a "complete" event to an actor. Takes optional scheduler object to schedule execution of complete event delivery.

See also: AbstractActor, on_complete!

source
Rocket.on_next!Function
on_next!(actor, data)

Both Actor and NextActor objects must implement its own method for on_next! function which will be called on "next" event.

See also: Actor, NextActor

source
Rocket.on_error!Function
on_error!(actor, err)

Both Actor and ErrorActor objects must implement its own method for on_error! function which will be called on "error" event.

See also: Actor, ErrorActor

source
Rocket.on_complete!Function
on_complete!(actor)

Both Actor and CompletionActor objects must implement its own method for on_complete! function which will be called on "complete" event.

See also: Actor, CompletionActor

source

Factory

Errors

+CompletionActorTrait{String}()

See also: AbstractActor, as_actor, CompletionActorTrait, ActorTrait, on_complete!

source

Events

Rocket.next!Function
next!(actor, data)
+next!(actor, data, scheduler)

This function is used to deliver a "next" event to an actor with some data. Takes optional scheduler object to schedule execution of data delivery.

See also: AbstractActor, on_next!

source
Rocket.error!Function
error!(actor, err)
+error!(actor, err, scheduler)

This function is used to deliver a "error" event to an actor with some err. Takes optional scheduler object to schedule execution of error delivery.

See also: AbstractActor, on_error!

source
Rocket.complete!Function
complete!(actor)
+complete!(actor, scheduler)

This function is used to deliver a "complete" event to an actor. Takes optional scheduler object to schedule execution of complete event delivery.

See also: AbstractActor, on_complete!

source
Rocket.on_next!Function
on_next!(actor, data)

Both Actor and NextActor objects must implement its own method for on_next! function which will be called on "next" event.

See also: Actor, NextActor

source
Rocket.on_error!Function
on_error!(actor, err)

Both Actor and ErrorActor objects must implement its own method for on_error! function which will be called on "error" event.

See also: Actor, ErrorActor

source
Rocket.on_complete!Function
on_complete!(actor)

Both Actor and CompletionActor objects must implement its own method for on_complete! function which will be called on "complete" event.

See also: Actor, CompletionActor

source

Factory

Rocket.AbstractActorFactoryType

Abstract type for all possible actor factories

See also: Actor

source
Rocket.create_actorFunction
create_actor(::Type{L}, factory::F) where { L, F <: AbstractActorFactory }

Actor creator function for a given factory F. Should be implemented explicitly for any AbstractActorFactory object

See also: AbstractActorFactory, MissingCreateActorFactoryImplementationError

source
Rocket.MissingCreateActorFactoryImplementationErrorType

This error will be throw if Julia cannot find specific method of 'create_actor()' function for given actor factory

See also: AbstractActorFactory, create_actor

source

Errors

Rocket.InvalidActorTraitUsageErrorType

This error will be thrown if next!, error! or complete! functions are called with invalid actor object

See also: next!, error!, complete!, InvalidActorTrait

source
Rocket.InconsistentSourceActorDataTypesErrorType

This error will be thrown if next! function is called with inconsistent data type

See also: AbstractActor, Subscribable, next!

source
Rocket.MissingDataArgumentInNextCallType

This error will be thrown if next! function is called without data argument

See also: next!

source
Rocket.MissingErrorArgumentInErrorCallType

This error will be thrown if error! function is called without err argument

See also: error!

source
Rocket.ExtraArgumentInCompleteCallType

This error will be thrown if complete! function is called with extra data/err argument

See also: complete!

source
Rocket.MissingOnNextImplementationErrorType

This error will be thrown if Julia cannot find specific method of 'on_next!()' function for given actor and data

See also: on_next!

source
Rocket.MissingOnErrorImplementationErrorType

This error will be thrown if Julia cannot find specific method of 'on_error!()' function for given actor

See also: on_error!

source
Rocket.MissingOnCompleteImplementationErrorType

This error will be thrown if Julia cannot find specific method of 'on_complete!()' function for given actor and data

See also: on_next!

source
diff --git a/dev/api/observables/index.html b/dev/api/observables/index.html index 0e9a52436..c568d9b9b 100644 --- a/dev/api/observables/index.html +++ b/dev/api/observables/index.html @@ -1,5 +1,5 @@ -Observables · Rocket.jl

Observables API

Any observable-like should implement a valid subscribable logic.

Traits

Rocket.as_subscribableFunction
as_subscribable(any)

This function checks subscribable trait behavior specification. Can be used explicitly to specify subscribable trait behavior for any object.

See also: SubscribableTrait

source

Types

Rocket.SubscribableType

Super type for any simple subscribable object. Automatically specifies a SimpleSubscribableTrait trait behavior. Objects with specified SimpleSubscribableTrait subscribable trait must implement: on_subscribe!(subscribable, actor) method. Subscribable is a subtype of AbstractSubscribable type.

Examples

using Rocket
+Observables · Rocket.jl

Observables API

Any observable-like should implement a valid subscribable logic.

Traits

Rocket.as_subscribableFunction
as_subscribable(any)

This function checks subscribable trait behavior specification. Can be used explicitly to specify subscribable trait behavior for any object.

See also: SubscribableTrait

source

Types

Rocket.SubscribableType

Super type for any simple subscribable object. Automatically specifies a SimpleSubscribableTrait trait behavior. Objects with specified SimpleSubscribableTrait subscribable trait must implement: on_subscribe!(subscribable, actor) method. Subscribable is a subtype of AbstractSubscribable type.

Examples

using Rocket
 
 struct MySubscribable <: Subscribable{String} end
 
@@ -7,7 +7,7 @@
 
 # output
 
-SimpleSubscribableTrait{String}()

See also: SubscribableTrait, SimpleSubscribableTrait

source
Rocket.ScheduledSubscribableType

Super type for any scheduled subscribable object. Automatically specifies a ScheduledSubscribableTrait trait behavior. Objects with specified ScheduledSubscribableTrait subscribable trait must implement: on_subscribe!(subscribable, actor, scheduler) method. ScheduledSubscribable is a subtype of AbstractSubscribable type.

Examples

using Rocket
+SimpleSubscribableTrait{String}()

See also: SubscribableTrait, SimpleSubscribableTrait

source
Rocket.ScheduledSubscribableType

Super type for any scheduled subscribable object. Automatically specifies a ScheduledSubscribableTrait trait behavior. Objects with specified ScheduledSubscribableTrait subscribable trait must implement: on_subscribe!(subscribable, actor, scheduler) method. ScheduledSubscribable is a subtype of AbstractSubscribable type.

Examples

using Rocket
 
 struct MyScheduledSubscribable <: ScheduledSubscribable{String} end
 
@@ -15,7 +15,7 @@
 
 # output
 
-ScheduledSubscribableTrait{String}()

See also: SubscribableTrait, ScheduledSubscribableTrait

source
Rocket.subscribe!Function
subscribe!(subscribable::T, actor::S)   where { T, S }
 subscribe!(subscribable::T, factory::F) where { T, F <: AbstractActorFactory }
 subscribe!(subscriptions::Tuple)
 subscribe!(subscriptions::AbstractVector)

subscribe! function is used to attach an actor to subscribable. It also checks types of subscribable and actors to be a valid Subscribable and Actor objects respectively. Passing not valid subscribable or/and actor object will throw an error. If the input argument to the subscribe! function is either a tuple or a vector, it will first check that all of the arguments are valid source and actor objects and if its true will subscribe for each of them individually.

Arguments

  • subscribable: valid subscribable object
  • actor: valid actor object

Examples

using Rocket
@@ -47,7 +47,7 @@
 # output
 
 ERROR: Type Int64 is not a valid subscribable type.
-[...]

See also: on_subscribe!, as_subscribable

source
Rocket.on_subscribe!Function
on_subscribe!(subscribable, actor)
 on_subscribe!(subscribable, actor, scheduler)

Every valid subscribable object have to define its own method for on_subscribe! function which specifies subscription logic and has return a valid Teardown object.

Objects with specified SimpleSubscribableTrait subscribable trait must implement: on_subscribe!(subscribable, actor) method. Objects with specified ScheduledSubscribableTrait subscribable trait must implement: on_subscribe!(subscribable, actor, scheduler) method.

Arguments

  • subscribable: Subscribable object
  • actor: Actor object
  • scheduler: Scheduler object (only for scheduled subscribables)

Examples

using Rocket
 
 struct MySubscribable <: Subscribable{Int} end
@@ -82,4 +82,4 @@
 # output
 
 [LogActor] Data: 0
-[LogActor] Completed

See also: Subscribable, ScheduledSubscribable, SimpleSubscribableTrait, ScheduledSubscribableTrait, Teardown, logger

source

Errors

+[LogActor] Completed

See also: Subscribable, ScheduledSubscribable, SimpleSubscribableTrait, ScheduledSubscribableTrait, Teardown, logger

source

Errors

diff --git a/dev/api/operators/index.html b/dev/api/operators/index.html index dcd921312..6b81fbd6d 100644 --- a/dev/api/operators/index.html +++ b/dev/api/operators/index.html @@ -1,5 +1,5 @@ -Operators · Rocket.jl

Operators API

How to create a custom operator

If you need to write an operator that cannot be made from a combination of existing operators, then you can write a custom operator from scratch.

Each operator (e.g. MyFancyOperator) needs to either be (1) a subtype of one of abstract OperatorTrait trait types, or (2) define a

Rocket.as_operator(::Type{<:MyFancyOperator}) = TypedOperatorTrait{T, R}()
+Operators · Rocket.jl

Operators API

How to create a custom operator

If you need to write an operator that cannot be made from a combination of existing operators, then you can write a custom operator from scratch.

Each operator (e.g. MyFancyOperator) needs to either be (1) a subtype of one of abstract OperatorTrait trait types, or (2) define a

Rocket.as_operator(::Type{<:MyFancyOperator}) = TypedOperatorTrait{T, R}()
 # or
 Rocket.as_operator(::Type{<:MyFancyOperator}) = InferableOperatorTrait()

trait behavior.

In addition, an operator must implement a specific method for on_call! function with custom logic which has to return another Observable as a result of applying MyFancyOperator to a source.

Rocket.on_call!(::Type{L}, ::Type{R}, operator::MyFancyOperator, source) where L = # some custom logic here
 
@@ -8,7 +8,7 @@
 
 Rocket.on_call(::Type{L}, ::Type{R}, operator::MyFancyOperator, source) where L = # some custom logic here
 Rocket.operator_right(::MyFancyOperator, ::Type{L}) where L = R # where R should be an actual type, Int or even L itself e.g.
-
Note

It is not allowed to modify the source Observable in any way; you have to return a new observable.

See more examples on custom operators in Traits API section

Note

It might be useful to return a ProxyObservable from an on_call! function. ProxyObservable is a special Observable which proxying actors with the source and/or source with actors.

Traits

Rocket.TypedOperatorTraitType

Typed operator trait specifies operator to be statically typed with input and output data types. Typed operator with input type L and output type R can only operate on input Observable with data type L and will always produce an Observable with data type R.

Examples

using Rocket
+
Note

It is not allowed to modify the source Observable in any way; you have to return a new observable.

See more examples on custom operators in Traits API section

Note

It might be useful to return a ProxyObservable from an on_call! function. ProxyObservable is a special Observable which proxying actors with the source and/or source with actors.

Traits

Rocket.TypedOperatorTraitType

Typed operator trait specifies operator to be statically typed with input and output data types. Typed operator with input type L and output type R can only operate on input Observable with data type L and will always produce an Observable with data type R.

Examples

using Rocket
 
 struct MyTypedOperator <: TypedOperator{Int, Int} end
 
@@ -41,7 +41,7 @@
 [LogActor] Data: 1
 [LogActor] Data: 2
 [LogActor] Data: 3
-[LogActor] Completed

See also: OperatorTrait, TypedOperator, OperatorTrait, ProxyObservable, ActorProxy, logger

source
Rocket.LeftTypedOperatorTraitType

Left typed operator trait specifies operator to be statically typed with input data type. To infer output data type this object should specify a special function operator_right(operator, ::Type{L}) where L which will be used to infer output data type. Left typed operator with input type L can only operate on input Observable with data type L and will always produce an Observable with data type inferred from operator_right(operator, ::Type{L}).

Examples

using Rocket
+[LogActor] Completed

See also: OperatorTrait, TypedOperator, OperatorTrait, ProxyObservable, ActorProxy, logger

source
Rocket.LeftTypedOperatorTraitType

Left typed operator trait specifies operator to be statically typed with input data type. To infer output data type this object should specify a special function operator_right(operator, ::Type{L}) where L which will be used to infer output data type. Left typed operator with input type L can only operate on input Observable with data type L and will always produce an Observable with data type inferred from operator_right(operator, ::Type{L}).

Examples

using Rocket
 
 struct CountIntegersOperator <: LeftTypedOperator{Int} end
 
@@ -78,7 +78,7 @@
 [LogActor] Data: (0, 0)
 [LogActor] Data: (1, 0)
 [LogActor] Data: (2, 0)
-[LogActor] Completed

See also: OperatorTrait, LeftTypedOperator, operator_right, OperatorTrait, ProxyObservable, ActorProxy, enumerate, logger

source
Rocket.RightTypedOperatorTraitType

Right typed operator trait specifies operator to be statically typed with output data type. It can operate on input Observable with any data type L but will always produce an Observable with data type R.

Examples

using Rocket
 
 struct ConvertToFloatOperator <: RightTypedOperator{Float64} end
 
@@ -112,7 +112,7 @@
 [LogActor] Data: 1.0
 [LogActor] Data: 2.0
 [LogActor] Data: 3.0
-[LogActor] Completed

See also: OperatorTrait, RightTypedOperator, OperatorTrait, ProxyObservable, ActorProxy, logger

source
Rocket.InferableOperatorTraitType

Inferable operator trait specifies operator to be statically typed neither with input data type nor with output data type. To infer output data type this object should specify a special function operator_right(operator, ::Type{L}) where L where L is input data type which will be used to infer output data type.

using Rocket
 
 struct IdentityOperator <: InferableOperator end
 
@@ -154,35 +154,35 @@
 [LogActor] Data: 2.0
 [LogActor] Data: 3.0
 [LogActor] Completed
-

See also: OperatorTrait, InferableOperator, operator_right, OperatorTrait, ProxyObservable, ActorProxy, logger

source
Rocket.InvalidOperatorTraitType

InvalidOperatorTrait trait specifies special 'invalid' behavior and types with such a trait specification cannot be used as an operator for an observable stream. By default any type has InvalidOperatorTrait trait specification

See also: OperatorTrait

source

Types

Rocket.InvalidOperatorTraitType

InvalidOperatorTrait trait specifies special 'invalid' behavior and types with such a trait specification cannot be used as an operator for an observable stream. By default any type has InvalidOperatorTrait trait specification

See also: OperatorTrait

source

Types

Rocket.TypedOperatorType

Can be used as a supertype for any operator. Automatically specifies TypedOperatorTrait behavior.

Examples

using Rocket
 
 struct MyOperator <: TypedOperator{Float64,String} end
 
 as_operator(MyOperator) === TypedOperatorTrait{Float64,String}()
 
 # output
-true

See also: AbstractOperator, TypedOperatorTrait

source
Rocket.on_call!Function
on_call!(::Type, ::Type, operator, source)

Each operator must implement its own method for on_call! function. This function is used to invoke operator on some Observable and to produce another Observable with new logic (operator specific).

See also: AbstractOperator

source
Rocket.on_call!Function
on_call!(::Type, ::Type, operator, source)

Each operator must implement its own method for on_call! function. This function is used to invoke operator on some Observable and to produce another Observable with new logic (operator specific).

See also: AbstractOperator

source
Rocket.OperatorsCompositionType
OperatorsComposition(operators)

OperatorsComposition is an object which helps to create a composition of multiple operators. To create a composition of two or more operators overloaded + or |> can be used.

using Rocket
 
 composition = map(Int, (d) -> d ^ 2) + filter(d -> d % 2 == 0)
 
@@ -208,4 +208,4 @@
 
 [LogActor] Data: 4
 [LogActor] Data: 16
-[LogActor] Completed
source

Errors

+[LogActor] Completed
source

Errors

Rocket.InvalidOperatorTraitUsageErrorType

This error will be thrown if |> pipe operator is called with invalid operator object

See also: on_call!

source
Rocket.InconsistentSourceOperatorDataTypesErrorType

This error will be thrown if |> pipe operator is called with inconsistent data type

See also: on_call!

source
Rocket.MissingOnCallImplementationErrorType

This error will be thrown if Julia cannot find specific method of on_call! function for a given operator.

See also: on_call!

source
Rocket.MissingOperatorRightImplementationErrorType

This error will be thrown if Julia cannot find specific method of operator_right function for a given operator.

See also: operator_right

source
diff --git a/dev/api/subjects/index.html b/dev/api/subjects/index.html index 7f833774d..2b7f6e5af 100644 --- a/dev/api/subjects/index.html +++ b/dev/api/subjects/index.html @@ -1,2 +1,2 @@ -Subjects · Rocket.jl

Subjects API

Traits

Rocket.as_subjectFunction
as_subject(::Type)

This function checks subject trait behavior specification. Should be used explicitly to specify subject trait behavior for any object type.

See also: SubjectTrait

source

Factory

Errors

+Subjects · Rocket.jl

Subjects API

Traits

Rocket.as_subjectFunction
as_subject(::Type)

This function checks subject trait behavior specification. Should be used explicitly to specify subject trait behavior for any object type.

See also: SubjectTrait

source

Factory

Errors

diff --git a/dev/api/teardown/index.html b/dev/api/teardown/index.html index ddff93764..be7a19f33 100644 --- a/dev/api/teardown/index.html +++ b/dev/api/teardown/index.html @@ -1,5 +1,5 @@ -Teardown · Rocket.jl

Teardown API

Any subscription-like object should implement a valid teardown logic.

Example

using Rocket
+Teardown · Rocket.jl

Teardown API

Any subscription-like object should implement a valid teardown logic.

Example

using Rocket
 
 struct MuCustomSubscription <: Teardown
     # some fields here
@@ -9,7 +9,7 @@
 
 function on_unsubscribe!(subscription::MyCustomSubscription)
     # dispose resources here
-end

Traits

Rocket.as_teardownFunction
as_teardown(::Type)

This function checks teardown trait behavior specification. Should be used explicitly to specify teardown logic trait behavior for any object.

Examples

using Rocket
+end

Traits

Rocket.as_teardownFunction
as_teardown(::Type)

This function checks teardown trait behavior specification. Should be used explicitly to specify teardown logic trait behavior for any object.

Examples

using Rocket
 
 struct MySubscription <: Teardown end
 
@@ -22,6 +22,6 @@
 
 # output
 
-Unsubscribed!

See also: Teardown, TeardownLogic

source

Types

Types

Rocket.unsubscribe!Function
unsubscribe!(subscription)
 unsubscribe!(subscriptions::Tuple)
-unsubscribe!(subscriptions::AbstractVector)

unsubscribe! function is used to cancel Observable execution and to dispose any kind of resources used during an Observable execution. If the input argument to the unsubscribe! function is either a tuple or a vector, it will first check that all of the arguments are valid subscription objects and if its true will unsubscribe from each of them individually.

See also: Teardown, TeardownLogic, on_unsubscribe!

source

Errors

+unsubscribe!(subscriptions::AbstractVector)

unsubscribe! function is used to cancel Observable execution and to dispose any kind of resources used during an Observable execution. If the input argument to the unsubscribe! function is either a tuple or a vector, it will first check that all of the arguments are valid subscription objects and if its true will unsubscribe from each of them individually.

See also: Teardown, TeardownLogic, on_unsubscribe!

source

Errors

Rocket.InvalidTeardownLogicTraitUsageErrorType

This error will be thrown if unsubscribe! function is called with invalid teardown object.

See also: unsubscribe!

source
Rocket.InvalidMultipleTeardownLogicTraitUsageErrorType

This error will be thrown if unsubscribe! function is called with a tuple with invalid teardown object in it.

See also: unsubscribe!

source
Rocket.MissingOnUnsubscribeImplementationErrorType

This error will be thrown if Julia cannot find specific method of on_unsubscribe!() function for given teardown object.

See also: on_unsubscribe!

source
diff --git a/dev/assets/documenter.js b/dev/assets/documenter.js index f5311607b..c6562b558 100644 --- a/dev/assets/documenter.js +++ b/dev/assets/documenter.js @@ -4,7 +4,6 @@ requirejs.config({ 'highlight-julia': 'https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.8.0/languages/julia.min', 'headroom': 'https://cdnjs.cloudflare.com/ajax/libs/headroom/0.12.0/headroom.min', 'jqueryui': 'https://cdnjs.cloudflare.com/ajax/libs/jqueryui/1.13.2/jquery-ui.min', - 'minisearch': 'https://cdn.jsdelivr.net/npm/minisearch@6.1.0/dist/umd/index.min', 'katex-auto-render': 'https://cdnjs.cloudflare.com/ajax/libs/KaTeX/0.16.8/contrib/auto-render.min', 'jquery': 'https://cdnjs.cloudflare.com/ajax/libs/jquery/3.7.0/jquery.min', 'headroom-jquery': 'https://cdnjs.cloudflare.com/ajax/libs/headroom/0.12.0/jQuery.headroom.min', @@ -103,9 +102,10 @@ $(document).on("click", ".docstring header", function () { }); }); -$(document).on("click", ".docs-article-toggle-button", function () { +$(document).on("click", ".docs-article-toggle-button", function (event) { let articleToggleTitle = "Expand docstring"; let navArticleToggleTitle = "Expand all docstrings"; + let animationSpeed = event.noToggleAnimation ? 0 : 400; debounce(() => { if (isExpanded) { @@ -116,7 +116,7 @@ $(document).on("click", ".docs-article-toggle-button", function () { isExpanded = false; - $(".docstring section").slideUp(); + $(".docstring section").slideUp(animationSpeed); } else { $(this).removeClass("fa-chevron-down").addClass("fa-chevron-up"); $(".docstring-article-toggle-button") @@ -127,7 +127,7 @@ $(document).on("click", ".docs-article-toggle-button", function () { articleToggleTitle = "Collapse docstring"; navArticleToggleTitle = "Collapse all docstrings"; - $(".docstring section").slideDown(); + $(".docstring section").slideDown(animationSpeed); } $(this).prop("title", navArticleToggleTitle); @@ -224,224 +224,465 @@ $(document).ready(function () { }) //////////////////////////////////////////////////////////////////////////////// -require(['jquery', 'minisearch'], function($, minisearch) { - -// In general, most search related things will have "search" as a prefix. -// To get an in-depth about the thought process you can refer: https://hetarth02.hashnode.dev/series/gsoc +require(['jquery'], function($) { -let results = []; -let timer = undefined; +$(document).ready(function () { + let meta = $("div[data-docstringscollapsed]").data(); -let data = documenterSearchIndex["docs"].map((x, key) => { - x["id"] = key; // minisearch requires a unique for each object - return x; + if (meta?.docstringscollapsed) { + $("#documenter-article-toggle-button").trigger({ + type: "click", + noToggleAnimation: true, + }); + } }); -// list below is the lunr 2.1.3 list minus the intersect with names(Base) -// (all, any, get, in, is, only, which) and (do, else, for, let, where, while, with) -// ideally we'd just filter the original list but it's not available as a variable -const stopWords = new Set([ - "a", - "able", - "about", - "across", - "after", - "almost", - "also", - "am", - "among", - "an", - "and", - "are", - "as", - "at", - "be", - "because", - "been", - "but", - "by", - "can", - "cannot", - "could", - "dear", - "did", - "does", - "either", - "ever", - "every", - "from", - "got", - "had", - "has", - "have", - "he", - "her", - "hers", - "him", - "his", - "how", - "however", - "i", - "if", - "into", - "it", - "its", - "just", - "least", - "like", - "likely", - "may", - "me", - "might", - "most", - "must", - "my", - "neither", - "no", - "nor", - "not", - "of", - "off", - "often", - "on", - "or", - "other", - "our", - "own", - "rather", - "said", - "say", - "says", - "she", - "should", - "since", - "so", - "some", - "than", - "that", - "the", - "their", - "them", - "then", - "there", - "these", - "they", - "this", - "tis", - "to", - "too", - "twas", - "us", - "wants", - "was", - "we", - "were", - "what", - "when", - "who", - "whom", - "why", - "will", - "would", - "yet", - "you", - "your", -]); - -let index = new minisearch({ - fields: ["title", "text"], // fields to index for full-text search - storeFields: ["location", "title", "text", "category", "page"], // fields to return with search results - processTerm: (term) => { - let word = stopWords.has(term) ? null : term; - if (word) { - // custom trimmer that doesn't strip @ and !, which are used in julia macro and function names - word = word - .replace(/^[^a-zA-Z0-9@!]+/, "") - .replace(/[^a-zA-Z0-9@!]+$/, ""); - } +}) +//////////////////////////////////////////////////////////////////////////////// +require(['jquery'], function($) { - return word ?? null; - }, - // add . as a separator, because otherwise "title": "Documenter.Anchors.add!", would not find anything if searching for "add!", only for the entire qualification - tokenize: (string) => string.split(/[\s\-\.]+/), - // options which will be applied during the search - searchOptions: { - boost: { title: 100 }, - fuzzy: 2, +/* +To get an in-depth about the thought process you can refer: https://hetarth02.hashnode.dev/series/gsoc + +PSEUDOCODE: + +Searching happens automatically as the user types or adjusts the selected filters. +To preserve responsiveness, as much as possible of the slow parts of the search are done +in a web worker. Searching and result generation are done in the worker, and filtering and +DOM updates are done in the main thread. The filters are in the main thread as they should +be very quick to apply. This lets filters be changed without re-searching with minisearch +(which is possible even if filtering is on the worker thread) and also lets filters be +changed _while_ the worker is searching and without message passing (neither of which are +possible if filtering is on the worker thread) + +SEARCH WORKER: + +Import minisearch + +Build index + +On message from main thread + run search + find the first 200 unique results from each category, and compute their divs for display + note that this is necessary and sufficient information for the main thread to find the + first 200 unique results from any given filter set + post results to main thread + +MAIN: + +Launch worker + +Declare nonconstant globals (worker_is_running, last_search_text, unfiltered_results) + +On text update + if worker is not running, launch_search() + +launch_search + set worker_is_running to true, set last_search_text to the search text + post the search query to worker + +on message from worker + if last_search_text is not the same as the text in the search field, + the latest search result is not reflective of the latest search query, so update again + launch_search() + otherwise + set worker_is_running to false + + regardless, display the new search results to the user + save the unfiltered_results as a global + update_search() + +on filter click + adjust the filter selection + update_search() + +update_search + apply search filters by looping through the unfiltered_results and finding the first 200 + unique results that match the filters + + Update the DOM +*/ + +/////// SEARCH WORKER /////// + +function worker_function(documenterSearchIndex, documenterBaseURL, filters) { + importScripts( + "https://cdn.jsdelivr.net/npm/minisearch@6.1.0/dist/umd/index.min.js" + ); + + let data = documenterSearchIndex.map((x, key) => { + x["id"] = key; // minisearch requires a unique for each object + return x; + }); + + // list below is the lunr 2.1.3 list minus the intersect with names(Base) + // (all, any, get, in, is, only, which) and (do, else, for, let, where, while, with) + // ideally we'd just filter the original list but it's not available as a variable + const stopWords = new Set([ + "a", + "able", + "about", + "across", + "after", + "almost", + "also", + "am", + "among", + "an", + "and", + "are", + "as", + "at", + "be", + "because", + "been", + "but", + "by", + "can", + "cannot", + "could", + "dear", + "did", + "does", + "either", + "ever", + "every", + "from", + "got", + "had", + "has", + "have", + "he", + "her", + "hers", + "him", + "his", + "how", + "however", + "i", + "if", + "into", + "it", + "its", + "just", + "least", + "like", + "likely", + "may", + "me", + "might", + "most", + "must", + "my", + "neither", + "no", + "nor", + "not", + "of", + "off", + "often", + "on", + "or", + "other", + "our", + "own", + "rather", + "said", + "say", + "says", + "she", + "should", + "since", + "so", + "some", + "than", + "that", + "the", + "their", + "them", + "then", + "there", + "these", + "they", + "this", + "tis", + "to", + "too", + "twas", + "us", + "wants", + "was", + "we", + "were", + "what", + "when", + "who", + "whom", + "why", + "will", + "would", + "yet", + "you", + "your", + ]); + + let index = new MiniSearch({ + fields: ["title", "text"], // fields to index for full-text search + storeFields: ["location", "title", "text", "category", "page"], // fields to return with results processTerm: (term) => { let word = stopWords.has(term) ? null : term; if (word) { + // custom trimmer that doesn't strip @ and !, which are used in julia macro and function names word = word .replace(/^[^a-zA-Z0-9@!]+/, "") .replace(/[^a-zA-Z0-9@!]+$/, ""); + + word = word.toLowerCase(); } return word ?? null; }, + // add . as a separator, because otherwise "title": "Documenter.Anchors.add!", would not + // find anything if searching for "add!", only for the entire qualification tokenize: (string) => string.split(/[\s\-\.]+/), - }, -}); + // options which will be applied during the search + searchOptions: { + prefix: true, + boost: { title: 100 }, + fuzzy: 2, + }, + }); -index.addAll(data); + index.addAll(data); + + /** + * Used to map characters to HTML entities. + * Refer: https://github.com/lodash/lodash/blob/main/src/escape.ts + */ + const htmlEscapes = { + "&": "&", + "<": "<", + ">": ">", + '"': """, + "'": "'", + }; + + /** + * Used to match HTML entities and HTML characters. + * Refer: https://github.com/lodash/lodash/blob/main/src/escape.ts + */ + const reUnescapedHtml = /[&<>"']/g; + const reHasUnescapedHtml = RegExp(reUnescapedHtml.source); + + /** + * Escape function from lodash + * Refer: https://github.com/lodash/lodash/blob/main/src/escape.ts + */ + function escape(string) { + return string && reHasUnescapedHtml.test(string) + ? string.replace(reUnescapedHtml, (chr) => htmlEscapes[chr]) + : string || ""; + } -let filters = [...new Set(data.map((x) => x.category))]; -var modal_filters = make_modal_body_filters(filters); -var filter_results = []; + /** + * Make the result component given a minisearch result data object and the value + * of the search input as queryString. To view the result object structure, refer: + * https://lucaong.github.io/minisearch/modules/_minisearch_.html#searchresult + * + * @param {object} result + * @param {string} querystring + * @returns string + */ + function make_search_result(result, querystring) { + let search_divider = `
`; + let display_link = + result.location.slice(Math.max(0), Math.min(50, result.location.length)) + + (result.location.length > 30 ? "..." : ""); // To cut-off the link because it messes with the overflow of the whole div + + if (result.page !== "") { + display_link += ` (${result.page})`; + } -$(document).on("keyup", ".documenter-search-input", function (event) { - // Adding a debounce to prevent disruptions from super-speed typing! - debounce(() => update_search(filter_results), 300); + let textindex = new RegExp(`${querystring}`, "i").exec(result.text); + let text = + textindex !== null + ? result.text.slice( + Math.max(textindex.index - 100, 0), + Math.min( + textindex.index + querystring.length + 100, + result.text.length + ) + ) + : ""; // cut-off text before and after from the match + + text = text.length ? escape(text) : ""; + + let display_result = text.length + ? "..." + + text.replace( + new RegExp(`${escape(querystring)}`, "i"), // For first occurrence + '$&' + ) + + "..." + : ""; // highlights the match + + let in_code = false; + if (!["page", "section"].includes(result.category.toLowerCase())) { + in_code = true; + } + + // We encode the full url to escape some special characters which can lead to broken links + let result_div = ` + +
+
${escape(result.title)}
+
${result.category}
+
+

+ ${display_result} +

+
+ ${display_link} +
+
+ ${search_divider} + `; + + return result_div; + } + + self.onmessage = function (e) { + let query = e.data; + let results = index.search(query, { + filter: (result) => { + // Only return relevant results + return result.score >= 1; + }, + }); + + // Pre-filter to deduplicate and limit to 200 per category to the extent + // possible without knowing what the filters are. + let filtered_results = []; + let counts = {}; + for (let filter of filters) { + counts[filter] = 0; + } + let present = {}; + + for (let result of results) { + cat = result.category; + cnt = counts[cat]; + if (cnt < 200) { + id = cat + "---" + result.location; + if (present[id]) { + continue; + } + present[id] = true; + filtered_results.push({ + location: result.location, + category: cat, + div: make_search_result(result, query), + }); + } + } + + postMessage(filtered_results); + }; +} + +// `worker = Threads.@spawn worker_function(documenterSearchIndex)`, but in JavaScript! +const filters = [ + ...new Set(documenterSearchIndex["docs"].map((x) => x.category)), +]; +const worker_str = + "(" + + worker_function.toString() + + ")(" + + JSON.stringify(documenterSearchIndex["docs"]) + + "," + + JSON.stringify(documenterBaseURL) + + "," + + JSON.stringify(filters) + + ")"; +const worker_blob = new Blob([worker_str], { type: "text/javascript" }); +const worker = new Worker(URL.createObjectURL(worker_blob)); + +/////// SEARCH MAIN /////// + +// Whether the worker is currently handling a search. This is a boolean +// as the worker only ever handles 1 or 0 searches at a time. +var worker_is_running = false; + +// The last search text that was sent to the worker. This is used to determine +// if the worker should be launched again when it reports back results. +var last_search_text = ""; + +// The results of the last search. This, in combination with the state of the filters +// in the DOM, is used compute the results to display on calls to update_search. +var unfiltered_results = []; + +// Which filter is currently selected +var selected_filter = ""; + +$(document).on("input", ".documenter-search-input", function (event) { + if (!worker_is_running) { + launch_search(); + } }); +function launch_search() { + worker_is_running = true; + last_search_text = $(".documenter-search-input").val(); + worker.postMessage(last_search_text); +} + +worker.onmessage = function (e) { + if (last_search_text !== $(".documenter-search-input").val()) { + launch_search(); + } else { + worker_is_running = false; + } + + unfiltered_results = e.data; + update_search(); +}; + $(document).on("click", ".search-filter", function () { if ($(this).hasClass("search-filter-selected")) { - $(this).removeClass("search-filter-selected"); + selected_filter = ""; } else { - $(this).addClass("search-filter-selected"); + selected_filter = $(this).text().toLowerCase(); } - // Adding a debounce to prevent disruptions from crazy clicking! - debounce(() => get_filters(), 300); + // This updates search results and toggles classes for UI: + update_search(); }); -/** - * A debounce function, takes a function and an optional timeout in milliseconds - * - * @function callback - * @param {number} timeout - */ -function debounce(callback, timeout = 300) { - clearTimeout(timer); - timer = setTimeout(callback, timeout); -} - /** * Make/Update the search component - * - * @param {string[]} selected_filters */ -function update_search(selected_filters = []) { - let initial_search_body = ` -
Type something to get started!
- `; - +function update_search() { let querystring = $(".documenter-search-input").val(); if (querystring.trim()) { - results = index.search(querystring, { - filter: (result) => { - // Filtering results - if (selected_filters.length === 0) { - return result.score >= 1; - } else { - return ( - result.score >= 1 && selected_filters.includes(result.category) - ); - } - }, - }); + if (selected_filter == "") { + results = unfiltered_results; + } else { + results = unfiltered_results.filter((result) => { + return selected_filter == result.category.toLowerCase(); + }); + } let search_result_container = ``; + let modal_filters = make_modal_body_filters(); let search_divider = `
`; if (results.length) { @@ -449,19 +690,23 @@ function update_search(selected_filters = []) { let count = 0; let search_results = ""; - results.forEach(function (result) { - if (result.location) { - // Checking for duplication of results for the same page - if (!links.includes(result.location)) { - search_results += make_search_result(result, querystring); - count++; - } - + for (var i = 0, n = results.length; i < n && count < 200; ++i) { + let result = results[i]; + if (result.location && !links.includes(result.location)) { + search_results += result.div; + count++; links.push(result.location); } - }); + } - let result_count = `
${count} result(s)
`; + if (count == 1) { + count_str = "1 result"; + } else if (count == 200) { + count_str = "200+ results"; + } else { + count_str = count + " results"; + } + let result_count = `
${count_str}
`; search_result_container = `
@@ -490,125 +735,37 @@ function update_search(selected_filters = []) { $(".search-modal-card-body").html(search_result_container); } else { - filter_results = []; - modal_filters = make_modal_body_filters(filters, filter_results); - if (!$(".search-modal-card-body").hasClass("is-justify-content-center")) { $(".search-modal-card-body").addClass("is-justify-content-center"); } - $(".search-modal-card-body").html(initial_search_body); + $(".search-modal-card-body").html(` +
Type something to get started!
+ `); } } /** * Make the modal filter html * - * @param {string[]} filters - * @param {string[]} selected_filters * @returns string */ -function make_modal_body_filters(filters, selected_filters = []) { - let str = ``; - - filters.forEach((val) => { - if (selected_filters.includes(val)) { - str += `${val}`; - } else { - str += `${val}`; - } - }); +function make_modal_body_filters() { + let str = filters + .map((val) => { + if (selected_filter == val.toLowerCase()) { + return `${val}`; + } else { + return `${val}`; + } + }) + .join(""); - let filter_html = ` + return `
Filters: ${str} -
- `; - - return filter_html; -} - -/** - * Make the result component given a minisearch result data object and the value of the search input as queryString. - * To view the result object structure, refer: https://lucaong.github.io/minisearch/modules/_minisearch_.html#searchresult - * - * @param {object} result - * @param {string} querystring - * @returns string - */ -function make_search_result(result, querystring) { - let search_divider = `
`; - let display_link = - result.location.slice(Math.max(0), Math.min(50, result.location.length)) + - (result.location.length > 30 ? "..." : ""); // To cut-off the link because it messes with the overflow of the whole div - - if (result.page !== "") { - display_link += ` (${result.page})`; - } - - let textindex = new RegExp(`\\b${querystring}\\b`, "i").exec(result.text); - let text = - textindex !== null - ? result.text.slice( - Math.max(textindex.index - 100, 0), - Math.min( - textindex.index + querystring.length + 100, - result.text.length - ) - ) - : ""; // cut-off text before and after from the match - - let display_result = text.length - ? "..." + - text.replace( - new RegExp(`\\b${querystring}\\b`, "i"), // For first occurrence - '$&' - ) + - "..." - : ""; // highlights the match - - let in_code = false; - if (!["page", "section"].includes(result.category.toLowerCase())) { - in_code = true; - } - - // We encode the full url to escape some special characters which can lead to broken links - let result_div = ` - -
-
${result.title}
-
${result.category}
-
-

- ${display_result} -

-
- ${display_link} -
-
- ${search_divider} - `; - - return result_div; -} - -/** - * Get selected filters, remake the filter html and lastly update the search modal - */ -function get_filters() { - let ele = $(".search-filters .search-filter-selected").get(); - filter_results = ele.map((x) => $(x).text().toLowerCase()); - modal_filters = make_modal_body_filters(filters, filter_results); - update_search(filter_results); +
`; } }) @@ -635,103 +792,107 @@ $(document).ready(function () { //////////////////////////////////////////////////////////////////////////////// require(['jquery'], function($) { -let search_modal_header = ` - -`; - -let initial_search_body = ` -
Type something to get started!
-`; - -let search_modal_footer = ` - -`; - -$(document.body).append( - ` - diff --git a/dev/operators/mathematical/max/index.html b/dev/operators/mathematical/max/index.html index 62770bb23..8ff39a5f8 100644 --- a/dev/operators/mathematical/max/index.html +++ b/dev/operators/mathematical/max/index.html @@ -1,5 +1,5 @@ -max · Rocket.jl

Max Operator

Base.maxFunction
max(; from = nothing)

Creates a max operator, which emits a single item: the item with the largest value.

Arguments

  • from: optional initial maximum value, if nothing first item from the source will be used as initial instead

Producing

Stream of type <: Subscribable{Union{L, Nothing}} where L refers to type of source stream

Examples

using Rocket
+max · Rocket.jl

Max Operator

Base.maxFunction
max(; from = nothing)

Creates a max operator, which emits a single item: the item with the largest value.

Arguments

  • from: optional initial maximum value, if nothing first item from the source will be used as initial instead

Producing

Stream of type <: Subscribable{Union{L, Nothing}} where L refers to type of source stream

Examples

using Rocket
 
 source = from([ i for i in 1:42 ])
 subscribe!(source |> max(), logger())
@@ -9,4 +9,4 @@
 
 [LogActor] Data: 42
 [LogActor] Completed
-

See also: AbstractOperator, InferableOperator, ProxyObservable, logger

source

Description

The max operator operates on an Observable of similar objects. When the source Observable completes, it emits the item with the largest value.

See also

Operators

+

See also: AbstractOperator, InferableOperator, ProxyObservable, logger

source

Description

The max operator operates on an Observable of similar objects. When the source Observable completes, it emits the item with the largest value.

See also

Operators

diff --git a/dev/operators/mathematical/min/index.html b/dev/operators/mathematical/min/index.html index 2d961ca4e..e00b6a752 100644 --- a/dev/operators/mathematical/min/index.html +++ b/dev/operators/mathematical/min/index.html @@ -1,5 +1,5 @@ -min · Rocket.jl

Min Operator

Base.minFunction
min(; from = nothing)

Creates a min operator, which emits a single item: the item with the smallest value.

Arguments

  • from: optional initial minimal value, if nothing first item from the source will be used as initial instead

Producing

Stream of type <: Subscribable{Union{L, Nothing}} where L refers to type of source stream

Examples

using Rocket
+min · Rocket.jl

Min Operator

Base.minFunction
min(; from = nothing)

Creates a min operator, which emits a single item: the item with the smallest value.

Arguments

  • from: optional initial minimal value, if nothing first item from the source will be used as initial instead

Producing

Stream of type <: Subscribable{Union{L, Nothing}} where L refers to type of source stream

Examples

using Rocket
 
 source = from([ i for i in 1:42 ])
 subscribe!(source |> min(), logger())
@@ -9,4 +9,4 @@
 
 [LogActor] Data: 1
 [LogActor] Completed
-

See also: AbstractOperator, InferableOperator, ProxyObservable, logger

source

Description

The min operator operates on an Observable of similar objects. When source Observable completes, it emits the item with the smallest value.

See also

Operators

+

See also: AbstractOperator, InferableOperator, ProxyObservable, logger

source

Description

The min operator operates on an Observable of similar objects. When source Observable completes, it emits the item with the smallest value.

See also

Operators

diff --git a/dev/operators/mathematical/reduce/index.html b/dev/operators/mathematical/reduce/index.html index edca4772a..e100b6553 100644 --- a/dev/operators/mathematical/reduce/index.html +++ b/dev/operators/mathematical/reduce/index.html @@ -1,5 +1,5 @@ -reduce · Rocket.jl

Reduce Operator

Base.reduceFunction
reduce(::Type{R}, reduceFn::Function, seed::R) where R
+reduce · Rocket.jl

Reduce Operator

Base.reduceFunction
reduce(::Type{R}, reduceFn::Function, seed::R) where R
 reduce(reduceFn::F) where { F <: Function }

Creates a reduce operator, which applies a given accumulator reduceFn function over the source Observable, and returns the accumulated result when the source completes, given an optional seed value. If a seed value is specified, then that value will be used as the initial value for the accumulator. If no seed value is specified, the first item of the source is used as the seed.

Arguments

  • ::Type{R}: the type of data of transformed value
  • reduceFn::Function: transformation function with (data::T, current::R) -> R signature
  • seed::R: optional seed accumulation value

Producing

Stream of type <: Subscribable{R}

Examples

using Rocket
 
 source = from([ i for i in 1:10 ])
@@ -20,4 +20,4 @@
 
 [LogActor] Data: 903
 [LogActor] Completed
-

See also: AbstractOperator, RightTypedOperator, ProxyObservable, logger

source

Description

reduce applies an accumulator function to each value of the source Observable (from the past) and reduces it to a single value that is emitted by the output Observable. Note that reduce will only emit one value, only when the source Observable completes. It is equivalent to applying scan followed by last.

It returns an Observable that applies a specified accumulator function to each item emitted by the source Observable. If a seed value is specified, then that value will be used as the initial value of the accumulator. If no seed value is specified, the first item of the source is used as the seed.

See also

Operators, scan, last

+

See also: AbstractOperator, RightTypedOperator, ProxyObservable, logger

source

Description

reduce applies an accumulator function to each value of the source Observable (from the past) and reduces it to a single value that is emitted by the output Observable. Note that reduce will only emit one value, only when the source Observable completes. It is equivalent to applying scan followed by last.

It returns an Observable that applies a specified accumulator function to each item emitted by the source Observable. If a seed value is specified, then that value will be used as the initial value of the accumulator. If no seed value is specified, the first item of the source is used as the seed.

See also

Operators, scan, last

diff --git a/dev/operators/mathematical/sum/index.html b/dev/operators/mathematical/sum/index.html index 6d164b0f0..1f5b711de 100644 --- a/dev/operators/mathematical/sum/index.html +++ b/dev/operators/mathematical/sum/index.html @@ -1,5 +1,5 @@ -sum · Rocket.jl

Sum Operator

Base.sumFunction
sum(; from = nothing)

Creates a sum operator, which applies a sum accumulator function over the source Observable, and returns the accumulated result when the source completes, given an optional initial value.

The sum operator is similar to reduce(T, T, +) (see reduce).

Arguments

  • from: optional initial accumulation value, if nothing first value will be used instead

Producing

Stream of type <: Subscribable{L} where L refers to type of source stream

Examples

using Rocket
+sum · Rocket.jl

Sum Operator

Base.sumFunction
sum(; from = nothing)

Creates a sum operator, which applies a sum accumulator function over the source Observable, and returns the accumulated result when the source completes, given an optional initial value.

The sum operator is similar to reduce(T, T, +) (see reduce).

Arguments

  • from: optional initial accumulation value, if nothing first value will be used instead

Producing

Stream of type <: Subscribable{L} where L refers to type of source stream

Examples

using Rocket
 
 source = from([ i for i in 1:42 ])
 subscribe!(source |> sum(), logger())
@@ -19,4 +19,4 @@
 
 [LogActor] Data: 1000
 [LogActor] Completed
-

See also: AbstractOperator, InferableOperator, ProxyObservable, reduce, logger

source

Description

sum operates on an Observable of objects on which + is defined. When the source Observable completes, it emits the sum of all previous items. The sum operator is similar to reduce(T, T, +) (see reduce).

See also

Operators, reduce

+

See also: AbstractOperator, InferableOperator, ProxyObservable, reduce, logger

source

Description

sum operates on an Observable of objects on which + is defined. When the source Observable completes, it emits the sum of all previous items. The sum operator is similar to reduce(T, T, +) (see reduce).

See also

Operators, reduce

diff --git a/dev/operators/multicasting/about/index.html b/dev/operators/multicasting/about/index.html index a193632fa..245640c7b 100644 --- a/dev/operators/multicasting/about/index.html +++ b/dev/operators/multicasting/about/index.html @@ -1,2 +1,2 @@ -About multicasting operators · Rocket.jl
+About multicasting operators · Rocket.jl
diff --git a/dev/operators/multicasting/multicast/index.html b/dev/operators/multicasting/multicast/index.html index 0ece49d26..153b83e06 100644 --- a/dev/operators/multicasting/multicast/index.html +++ b/dev/operators/multicasting/multicast/index.html @@ -1,5 +1,5 @@ -multicast · Rocket.jl

Multicast Operator

Rocket.multicastFunction
multicast(subject::S) where S
+multicast · Rocket.jl

Multicast Operator

Rocket.multicastFunction
multicast(subject::S) where S
 multicast(factory::F) where { F <: AbstractSubjectFactory }

The multicast()operator takes a Subject and uses it to share the source execution. It returns what’s known as aConnectableObservable`, which has a connect() method. It has one simple job - subscribes to the source with the provided subject.

Example

using Rocket
 
 subject = Subject(Int)
@@ -30,4 +30,4 @@
 [1] Data: 5
 [2] Data: 5
 [1] Completed
-[2] Completed

See also: ConnectableObservable, Subject, share, publish

source

See also

Operators

+[2] Completed

See also: ConnectableObservable, Subject, share, publish

source

See also

Operators

diff --git a/dev/operators/multicasting/publish/index.html b/dev/operators/multicasting/publish/index.html index 3646953ce..6203b4162 100644 --- a/dev/operators/multicasting/publish/index.html +++ b/dev/operators/multicasting/publish/index.html @@ -1,2 +1,2 @@ -publish · Rocket.jl

Publish Operators

See also

Operators

+publish · Rocket.jl

Publish Operators

See also

Operators

diff --git a/dev/operators/multicasting/share/index.html b/dev/operators/multicasting/share/index.html index c8d323b5f..c6eae3bf2 100644 --- a/dev/operators/multicasting/share/index.html +++ b/dev/operators/multicasting/share/index.html @@ -1,2 +1,2 @@ -share · Rocket.jl

Share Operators

See also

Operators

+share · Rocket.jl

Share Operators

See also

Operators

diff --git a/dev/operators/transformation/about/index.html b/dev/operators/transformation/about/index.html index 181073261..c212bab42 100644 --- a/dev/operators/transformation/about/index.html +++ b/dev/operators/transformation/about/index.html @@ -1,2 +1,2 @@ -About transformation operators · Rocket.jl
+About transformation operators · Rocket.jl
diff --git a/dev/operators/transformation/accumulated/index.html b/dev/operators/transformation/accumulated/index.html index b46f3c312..12e5275cc 100644 --- a/dev/operators/transformation/accumulated/index.html +++ b/dev/operators/transformation/accumulated/index.html @@ -1,5 +1,5 @@ -accumulated · Rocket.jl

Accumulated Operator

Rocket.accumulatedFunction
accumulated()

Creates an accumulated operator, which returns an Observable that emits the current item with all of the previous items emitted by the source Observable in one single ordered array.

Producing

Stream of type <: Subscribable{Vector{L}} where L refers to type of source stream

Examples

using Rocket
+accumulated · Rocket.jl

Accumulated Operator

Rocket.accumulatedFunction
accumulated()

Creates an accumulated operator, which returns an Observable that emits the current item with all of the previous items emitted by the source Observable in one single ordered array.

Producing

Stream of type <: Subscribable{Vector{L}} where L refers to type of source stream

Examples

using Rocket
 
 source = from([ 1, 2, 3 ])
 subscribe!(source |> accumulated(), logger())
@@ -20,4 +20,4 @@
 # output
 
 [LogActor] Data: [1]
-[LogActor] Completed

See also: AbstractOperator, InferableOperator, ProxyObservable, logger

source

Description

Combines all values emitted by the source, using an accumulator function that joins a new source value with the all past values emmited into one single array. This is similar to scan with vcat accumulation function.

See also

Operators

+[LogActor] Completed

See also: AbstractOperator, InferableOperator, ProxyObservable, logger

source

Description

Combines all values emitted by the source, using an accumulator function that joins a new source value with the all past values emmited into one single array. This is similar to scan with vcat accumulation function.

See also

Operators

diff --git a/dev/operators/transformation/concat_map/index.html b/dev/operators/transformation/concat_map/index.html index c19c774e4..2b6628ae2 100644 --- a/dev/operators/transformation/concat_map/index.html +++ b/dev/operators/transformation/concat_map/index.html @@ -1,5 +1,5 @@ -concat_map · Rocket.jl

ConcatMap Operator

Rocket.concat_mapFunction
concat_map(::Type{R}, mappingFn::F = identity) where { R, F <: Function }

Creates a concat_map operator, which returns an Observable that emits the result of applying the projection function to each item emitted by the source Observable and taking values from each projected inner Observable sequentially. Essentialy it projects each source value to an Observable which is merged in the output Observable, in a serialized fashion waiting for each one to complete before merging the next.

Arguments

  • ::Type{R}: the type of data of output Observables after projection with mappingFn
  • mappingFn::F: projection function with (data) -> Observable{R} signature

Producing

Stream of type <: Subscribable{R}

Examples

using Rocket
+concat_map · Rocket.jl

ConcatMap Operator

Rocket.concat_mapFunction
concat_map(::Type{R}, mappingFn::F = identity) where { R, F <: Function }

Creates a concat_map operator, which returns an Observable that emits the result of applying the projection function to each item emitted by the source Observable and taking values from each projected inner Observable sequentially. Essentialy it projects each source value to an Observable which is merged in the output Observable, in a serialized fashion waiting for each one to complete before merging the next.

Arguments

  • ::Type{R}: the type of data of output Observables after projection with mappingFn
  • mappingFn::F: projection function with (data) -> Observable{R} signature

Producing

Stream of type <: Subscribable{R}

Examples

using Rocket
 
 source = from([ 0, 0 ]) |> concat_map(Int, d -> from([ 1, 2, 3 ], scheduler = AsyncScheduler(0)))
 subscribe!(source, logger())
@@ -13,4 +13,4 @@
 [LogActor] Data: 1
 [LogActor] Data: 2
 [LogActor] Data: 3
-[LogActor] Completed

See also: AbstractOperator, RightTypedOperator, ProxyObservable, logger

source

Description

Returns an Observable that emits items based on applying a function that you supply to each item emitted by the source Observable, where that function returns an (so-called "inner") Observable. Each new inner Observable is concatenated with the previous inner Observable.

Warning

If source values arrive endlessly and faster than their corresponding inner Observables can complete, it will result in memory issues as inner Observables amass in an unbounded buffer waiting for their turn to be subscribed to.

Note

concat_map is equivalent to merge_map with concurrency parameter set to 1.

See also

Operators, merge_map

+[LogActor] Completed

See also: AbstractOperator, RightTypedOperator, ProxyObservable, logger

source

Description

Returns an Observable that emits items based on applying a function that you supply to each item emitted by the source Observable, where that function returns an (so-called "inner") Observable. Each new inner Observable is concatenated with the previous inner Observable.

Warning

If source values arrive endlessly and faster than their corresponding inner Observables can complete, it will result in memory issues as inner Observables amass in an unbounded buffer waiting for their turn to be subscribed to.

Note

concat_map is equivalent to merge_map with concurrency parameter set to 1.

See also

Operators, merge_map

diff --git a/dev/operators/transformation/concat_map_to/index.html b/dev/operators/transformation/concat_map_to/index.html index 4a24f8b0c..52f660d01 100644 --- a/dev/operators/transformation/concat_map_to/index.html +++ b/dev/operators/transformation/concat_map_to/index.html @@ -1,5 +1,5 @@ -concat_map_to · Rocket.jl

ConcatMapTo Operator

Rocket.concat_map_toFunction
switch_map_to(inner_observable)

Creates a switch_map_to operator, which returns an observable of values merged together by joining the passed observable with itself, one after the other, for each value emitted from the source. Essentially it projects each source value to the same Observable which is merged multiple times in a serialized fashion on the output Observable.

Arguments

  • inner_observable: an Observable to replace each value from the source Observable.

Producing

Stream of type <: Subscribable{R} where R refers to the eltype of inner_observable

Examples

using Rocket
+concat_map_to · Rocket.jl

ConcatMapTo Operator

Rocket.concat_map_toFunction
switch_map_to(inner_observable)

Creates a switch_map_to operator, which returns an observable of values merged together by joining the passed observable with itself, one after the other, for each value emitted from the source. Essentially it projects each source value to the same Observable which is merged multiple times in a serialized fashion on the output Observable.

Arguments

  • inner_observable: an Observable to replace each value from the source Observable.

Producing

Stream of type <: Subscribable{R} where R refers to the eltype of inner_observable

Examples

using Rocket
 
 source = from([ 0, 0, 0 ])
 subscribe!(source |> concat_map_to(from([ 1, 2, 3 ])), logger())
@@ -16,4 +16,4 @@
 [LogActor] Data: 1
 [LogActor] Data: 2
 [LogActor] Data: 3
-[LogActor] Completed

See also: concat_map, AbstractOperator, RightTypedOperator, ProxyObservable, logger

source
Note

concat_map_to is equivalent to concat_map with mappingFn set to (_) -> inner_observable.

See also

Operators, concat_map

+[LogActor] Completed

See also: concat_map, AbstractOperator, RightTypedOperator, ProxyObservable, logger

source
Note

concat_map_to is equivalent to concat_map with mappingFn set to (_) -> inner_observable.

See also

Operators, concat_map

diff --git a/dev/operators/transformation/enumerate/index.html b/dev/operators/transformation/enumerate/index.html index b46317ef1..7d7ebaa7c 100644 --- a/dev/operators/transformation/enumerate/index.html +++ b/dev/operators/transformation/enumerate/index.html @@ -1,5 +1,5 @@ -enumerate · Rocket.jl

Enumerate Operator

Base.Iterators.enumerateFunction
enumerate()

Creates an enumerate operator, which converts each value emitted by the source Observable into a tuple of its order number and the value itself.

The enumerate operator is similar to scan(Tuple{Int, Int}, (d, c) -> (d, c[2] + 1), (0, 0)) (see scan).

Producing

Stream of type <: Subscribable{Tuple{Int, L}} where L refers to type of source stream

Examples

using Rocket
+enumerate · Rocket.jl

Enumerate Operator

Base.Iterators.enumerateFunction
enumerate()

Creates an enumerate operator, which converts each value emitted by the source Observable into a tuple of its order number and the value itself.

The enumerate operator is similar to scan(Tuple{Int, Int}, (d, c) -> (d, c[2] + 1), (0, 0)) (see scan).

Producing

Stream of type <: Subscribable{Tuple{Int, L}} where L refers to type of source stream

Examples

using Rocket
 
 source = from([ 0 for _ in 1:3 ])
 subscribe!(source |> enumerate(), logger())
@@ -11,7 +11,7 @@
 [LogActor] Data: (2, 0)
 [LogActor] Data: (3, 0)
 [LogActor] Completed
-

See also: AbstractOperator, InferableOperator, ProxyObservable, scan, map, logger

source

Description

enumerate returns an Observable that converts each value emitted by the source Observable into a tuple of its order number and the value itself.

Example

Get a value from the source with its order number

using Rocket
+

See also: AbstractOperator, InferableOperator, ProxyObservable, scan, map, logger

source

Description

enumerate returns an Observable that converts each value emitted by the source Observable into a tuple of its order number and the value itself.

Example

Get a value from the source with its order number

using Rocket
 
 source = from([ 0.0, 0.2, 0.4, 0.6, 0.8, 1.0 ])
 subscribe!(source |> enumerate(), logger())
@@ -24,4 +24,4 @@
 [LogActor] Data: (0.6, 4)
 [LogActor] Data: (0.8, 5)
 [LogActor] Data: (1.0, 6)
-[LogActor] Completed

See also

Operators, scan

+[LogActor] Completed

See also

Operators, scan

diff --git a/dev/operators/transformation/exhaust_map/index.html b/dev/operators/transformation/exhaust_map/index.html index ed0571438..c395dc662 100644 --- a/dev/operators/transformation/exhaust_map/index.html +++ b/dev/operators/transformation/exhaust_map/index.html @@ -1,5 +1,5 @@ -exhaust_map · Rocket.jl

ExhaustMap Operator

Rocket.exhaust_mapFunction
exhaust_map(::Type{R}, mappingFn::F = identity) where { R, F <: Function }

Creates a exhaust_map operator, which returns an Observable containing projected Observables of each item of the source, ignoring projected Observables that start before their preceding Observable has completed. Essentially it projects each source value to an Observable which is merged in the output Observable only if the previous projected Observable has completed.

Arguments

  • ::Type{R}: the type of data of output Observables after projection with mappingFn
  • mappingFn::F: projection function with (data) -> Observable{R} signature

Producing

Stream of type <: Subscribable{R}

Examples

using Rocket
+exhaust_map · Rocket.jl

ExhaustMap Operator

Rocket.exhaust_mapFunction
exhaust_map(::Type{R}, mappingFn::F = identity) where { R, F <: Function }

Creates a exhaust_map operator, which returns an Observable containing projected Observables of each item of the source, ignoring projected Observables that start before their preceding Observable has completed. Essentially it projects each source value to an Observable which is merged in the output Observable only if the previous projected Observable has completed.

Arguments

  • ::Type{R}: the type of data of output Observables after projection with mappingFn
  • mappingFn::F: projection function with (data) -> Observable{R} signature

Producing

Stream of type <: Subscribable{R}

Examples

using Rocket
 
 source = from([ 0, 0 ]) |> async() |> exhaust_map(Int, d -> from([ 1, 2 ]) |> async())
 subscribe!(source, logger())
@@ -9,4 +9,4 @@
 
 [LogActor] Data: 1
 [LogActor] Data: 2
-[LogActor] Completed

See also: AbstractOperator, RightTypedOperator, ProxyObservable, logger

source

See also

Operators

+[LogActor] Completed

See also: AbstractOperator, RightTypedOperator, ProxyObservable, logger

source

See also

Operators

diff --git a/dev/operators/transformation/lowercase/index.html b/dev/operators/transformation/lowercase/index.html index e217a6128..6ba653694 100644 --- a/dev/operators/transformation/lowercase/index.html +++ b/dev/operators/transformation/lowercase/index.html @@ -1,5 +1,5 @@ -lowercase · Rocket.jl

Lowercase Operator

Base.Unicode.lowercaseFunction
lowercase()

Creates an lowercase operator, which forces each value to be in lower case

Producing

Stream of type <: Subscribable{L} where L referes to type of data of input Observable

Examples

using Rocket
+lowercase · Rocket.jl

Lowercase Operator

Base.Unicode.lowercaseFunction
lowercase()

Creates an lowercase operator, which forces each value to be in lower case

Producing

Stream of type <: Subscribable{L} where L referes to type of data of input Observable

Examples

using Rocket
 
 source = of("Hello, world!")
 subscribe!(source |> lowercase(), logger())
@@ -8,4 +8,4 @@
 # output
 
 [LogActor] Data: hello, world!
-[LogActor] Completed

See also: AbstractOperator, InferableOperator, ProxyObservable, logger

source

See also

Operators, map, uppercase

+[LogActor] Completed

See also: AbstractOperator, InferableOperator, ProxyObservable, logger

source

See also

Operators, map, uppercase

diff --git a/dev/operators/transformation/map/index.html b/dev/operators/transformation/map/index.html index 436bb4252..b43a796fa 100644 --- a/dev/operators/transformation/map/index.html +++ b/dev/operators/transformation/map/index.html @@ -1,5 +1,5 @@ -map · Rocket.jl

Map Operator

Base.mapFunction
map(::Type{R}, mappingFn::F) where { F <: Function }

Creates a map operator, which applies a given mappingFn to each value emmited by the source Observable, and emits the resulting values as an Observable. You have to specify output R type after mappingFn projection.

Arguments

  • ::Type{R}: the type of data of transformed value, may be or may not be the same as source type
  • mappingFn::Function: transformation function with (data::L) -> R signature, where L is type of data in input source

Producing

Stream of type <: Subscribable{R}

Examples

using Rocket
+map · Rocket.jl

Map Operator

Base.mapFunction
map(::Type{R}, mappingFn::F) where { F <: Function }

Creates a map operator, which applies a given mappingFn to each value emmited by the source Observable, and emits the resulting values as an Observable. You have to specify output R type after mappingFn projection.

Arguments

  • ::Type{R}: the type of data of transformed value, may be or may not be the same as source type
  • mappingFn::Function: transformation function with (data::L) -> R signature, where L is type of data in input source

Producing

Stream of type <: Subscribable{R}

Examples

using Rocket
 
 source = from([ 1, 2, 3 ])
 subscribe!(source |> map(Int, (d) -> d ^ 2), logger())
@@ -10,7 +10,7 @@
 [LogActor] Data: 1
 [LogActor] Data: 4
 [LogActor] Data: 9
-[LogActor] Completed

See also: AbstractOperator, RightTypedOperator, ProxyObservable, logger

source

Description

The map operator, similar to map(f, array), applies a function to each value from the source. It's important to note that the function f is expected to be pure and without any side effects. The map operator is designed to create a copy of the original observable for each new subscriber. It independently executes the f function for each subscriber and doesn't share the resulting value. This might be inconvenient when f involves complex calculations or side effects.

using Rocket
+[LogActor] Completed

See also: AbstractOperator, RightTypedOperator, ProxyObservable, logger

source

Description

The map operator, similar to map(f, array), applies a function to each value from the source. It's important to note that the function f is expected to be pure and without any side effects. The map operator is designed to create a copy of the original observable for each new subscriber. It independently executes the f function for each subscriber and doesn't share the resulting value. This might be inconvenient when f involves complex calculations or side effects.

using Rocket
 
 function f(x)
     println("Function `f` called") # Assume heavy calculations or side-effects
@@ -72,4 +72,4 @@
 [LogActor] Data: 2
 Function `f` called
 [LogActor] Data: 3
-[LogActor] Completed

See also

Operators

+[LogActor] Completed

See also

Operators

diff --git a/dev/operators/transformation/map_to/index.html b/dev/operators/transformation/map_to/index.html index 3bbc93c42..ffb2c2e69 100644 --- a/dev/operators/transformation/map_to/index.html +++ b/dev/operators/transformation/map_to/index.html @@ -1,5 +1,5 @@ -map_to · Rocket.jl

MapTo Operator

Rocket.map_toFunction
map_to(value::T) where T

Creates a map operator, which emits the given constant value on the output Observable every time the source Observable emits a value.

Arguments

  • value::T: the constant value to map each source value to

Producing

Stream of type <: Subscribable{T}

Examples

using Rocket
+map_to · Rocket.jl

MapTo Operator

Rocket.map_toFunction
map_to(value::T) where T

Creates a map operator, which emits the given constant value on the output Observable every time the source Observable emits a value.

Arguments

  • value::T: the constant value to map each source value to

Producing

Stream of type <: Subscribable{T}

Examples

using Rocket
 
 source = from([ 1, 2, 3 ])
 subscribe!(source |> map_to('a'), logger())
@@ -10,4 +10,4 @@
 [LogActor] Data: a
 [LogActor] Data: a
 [LogActor] Data: a
-[LogActor] Completed

See also: map, AbstractOperator, RightTypedOperator, ProxyObservable, logger

source

Description

Takes a constant value as argument, and emits that whenever the source Observable emits a value. In other words, ignores the actual source value, and simply uses the emission moment to know when to emit the given value.

See also

Operators

+[LogActor] Completed

See also: map, AbstractOperator, RightTypedOperator, ProxyObservable, logger

source

Description

Takes a constant value as argument, and emits that whenever the source Observable emits a value. In other words, ignores the actual source value, and simply uses the emission moment to know when to emit the given value.

See also

Operators

diff --git a/dev/operators/transformation/merge_map/index.html b/dev/operators/transformation/merge_map/index.html index e40826950..3295bcf84 100644 --- a/dev/operators/transformation/merge_map/index.html +++ b/dev/operators/transformation/merge_map/index.html @@ -1,5 +1,5 @@ -merge_map · Rocket.jl

MergeMap Operator

Rocket.merge_mapFunction
merge_map(::Type{R}, mappingFn::F = identity; concurrent::Int = typemax(Int)) where { R, F <: Function }

Creates a merge_map operator, which returns an Observable that emits the result of applying the projection function mappingFn to each item emitted by the source Observable and merging the results of the Observables obtained from this transformation.

Arguments

  • ::Type{R}: the type of data of output Observables after projection with mappingFn
  • mappingFn::F: projection function with (data) -> Observable{R} signature
  • concurrent::Int: optional, default is typemax(Int), maximum number of input Observables being subscribed to concurrently

Producing

Stream of type <: Subscribable{R}

Examples

using Rocket
+merge_map · Rocket.jl

MergeMap Operator

Rocket.merge_mapFunction
merge_map(::Type{R}, mappingFn::F = identity; concurrent::Int = typemax(Int)) where { R, F <: Function }

Creates a merge_map operator, which returns an Observable that emits the result of applying the projection function mappingFn to each item emitted by the source Observable and merging the results of the Observables obtained from this transformation.

Arguments

  • ::Type{R}: the type of data of output Observables after projection with mappingFn
  • mappingFn::F: projection function with (data) -> Observable{R} signature
  • concurrent::Int: optional, default is typemax(Int), maximum number of input Observables being subscribed to concurrently

Producing

Stream of type <: Subscribable{R}

Examples

using Rocket
 
 source = from([ 0, 0 ]) |> merge_map(Int, d -> from([ 1, 2, 3 ], scheduler = AsyncScheduler(0)))
 subscribe!(source, logger())
@@ -13,4 +13,4 @@
 [LogActor] Data: 2
 [LogActor] Data: 3
 [LogActor] Data: 3
-[LogActor] Completed

See also: AbstractOperator, RightTypedOperator, ProxyObservable, logger

source

See also

Operators

+[LogActor] Completed

See also: AbstractOperator, RightTypedOperator, ProxyObservable, logger

source

See also

Operators

diff --git a/dev/operators/transformation/override/index.html b/dev/operators/transformation/override/index.html index 82a0d4021..349d2564b 100644 --- a/dev/operators/transformation/override/index.html +++ b/dev/operators/transformation/override/index.html @@ -1,5 +1,5 @@ -override · Rocket.jl

Override Operator

Rocket.overrideFunction
override(handler::OverrideHandler)

Creates an override operator that overrides each emission from source observable with value provided in handler. If handler contains nothing source observable emits as usual. For constant override see map_to. Use Rocket.setvalue! to set new value for handler.

Producing

Stream of type <: Subscribable{Union{L, T}} where L refers to the type of source stream and T referes to the type of handler's value

Examples

using Rocket 
+override · Rocket.jl

Override Operator

Rocket.overrideFunction
override(handler::OverrideHandler)

Creates an override operator that overrides each emission from source observable with value provided in handler. If handler contains nothing source observable emits as usual. For constant override see map_to. Use Rocket.setvalue! to set new value for handler.

Producing

Stream of type <: Subscribable{Union{L, T}} where L refers to the type of source stream and T referes to the type of handler's value

Examples

using Rocket 
 
 subject = Subject(Int)
 handler = OverrideHandler(Int, -1)
@@ -29,5 +29,5 @@
 [LogActor] Data: 3
 [LogActor] Data: 4
 [LogActor] Data: -2
-[LogActor] Data: -2

See also: OverrideHandler

source

See also

Operators

+[LogActor] Data: -2

See also: OverrideHandler

source

See also

Operators

diff --git a/dev/operators/transformation/pairwise/index.html b/dev/operators/transformation/pairwise/index.html index b2a589628..f78328af5 100644 --- a/dev/operators/transformation/pairwise/index.html +++ b/dev/operators/transformation/pairwise/index.html @@ -1,5 +1,5 @@ -pairwise · Rocket.jl

Pairwise Operator

Rocket.pairwiseFunction
pairwise([ initial ])

Creates a pairwise operator, which groups pairs of consecutive emissions together and emits them as a tuple of two values. Accepts optional initial seed value to start pairing from.

using Rocket
+pairwise · Rocket.jl

Pairwise Operator

Rocket.pairwiseFunction
pairwise([ initial ])

Creates a pairwise operator, which groups pairs of consecutive emissions together and emits them as a tuple of two values. Accepts optional initial seed value to start pairing from.

using Rocket
 
 source = from(1:5) |> pairwise()
 
@@ -26,4 +26,4 @@
 [LogActor] Data: (2, 3)
 [LogActor] Data: (3, 4)
 [LogActor] Data: (4, 5)
-[LogActor] Completed

See also: AbstractOperator, InferableOperator, logger

source

See also

Operators

+[LogActor] Completed

See also: AbstractOperator, InferableOperator, logger

source

See also

Operators

diff --git a/dev/operators/transformation/scan/index.html b/dev/operators/transformation/scan/index.html index 3499551dd..404ec5f93 100644 --- a/dev/operators/transformation/scan/index.html +++ b/dev/operators/transformation/scan/index.html @@ -1,5 +1,5 @@ -scan · Rocket.jl

Scan Operator

Rocket.scanFunction
scan(::Type{R}, scanFn::F, seed::R) where { R, F <: Function }
+scan · Rocket.jl

Scan Operator

Rocket.scanFunction
scan(::Type{R}, scanFn::F, seed::R) where { R, F <: Function }
 scan(scanFn::F) where { F <: Function }

Creates a scan operator, which applies a given accumulator scanFn function to each value emmited by the source Observable, and returns each intermediate result with an optional seed value. If a seed value is specified, then that value will be used as the initial value for the accumulator. If no seed value is specified, the first item of the source is used as the seed.

Arguments

  • ::Type{R}: the type of data of transformed value, may be or may not be the same as type of input source
  • scanFn::Function: accumulator function with (data::T, current::R) -> R signature
  • seed::R: optional initial value for accumulator function

Producing

Stream of type <: Subscribable{R}

Examples

using Rocket
 
 source = from([ 1, 2, 3 ])
@@ -24,4 +24,4 @@
 [LogActor] Data: [1, 2]
 [LogActor] Data: [1, 2, 3]
 [LogActor] Completed
-

See also: AbstractOperator, RightTypedOperator, ProxyObservable, reduce, logger

source

Description

Combines all values emitted by the source, using an accumulator function that joins a new source value with the past accumulation. This is similar to reduce, but emits the intermediate accumulations.

Returns an Observable that applies a specified accumulator function to each item emitted by the source Observable. If a seed value is specified, then that value will be used as the initial value for the accumulator. If no seed value is specified, the first item of the source is used as the seed.

See also

Operators

+

See also: AbstractOperator, RightTypedOperator, ProxyObservable, reduce, logger

source

Description

Combines all values emitted by the source, using an accumulator function that joins a new source value with the past accumulation. This is similar to reduce, but emits the intermediate accumulations.

Returns an Observable that applies a specified accumulator function to each item emitted by the source Observable. If a seed value is specified, then that value will be used as the initial value for the accumulator. If no seed value is specified, the first item of the source is used as the seed.

See also

Operators

diff --git a/dev/operators/transformation/start_with/index.html b/dev/operators/transformation/start_with/index.html index 0b25d07a8..fe5f24e5d 100644 --- a/dev/operators/transformation/start_with/index.html +++ b/dev/operators/transformation/start_with/index.html @@ -1,5 +1,5 @@ -start_with · Rocket.jl

StartWith Operator

Rocket.start_withFunction
start_with(object::O) where O

Creates a start_with operator, which forces an observable to emit given object as a first value.

Producing

Stream of type <: Subscribable{Union{L, O}} where L refers to type of source stream <: Subscribable{L}

Examples

using Rocket
+start_with · Rocket.jl

StartWith Operator

Rocket.start_withFunction
start_with(object::O) where O

Creates a start_with operator, which forces an observable to emit given object as a first value.

Producing

Stream of type <: Subscribable{Union{L, O}} where L refers to type of source stream <: Subscribable{L}

Examples

using Rocket
 
 source = from(1:3) |> start_with(0)
 subscribe!(source, logger())
@@ -11,4 +11,4 @@
 [LogActor] Data: 1
 [LogActor] Data: 2
 [LogActor] Data: 3
-[LogActor] Completed

See also: AbstractOperator, InferableOperator, ProxyObservable, logger

source

See also

Operators

+[LogActor] Completed

See also: AbstractOperator, InferableOperator, ProxyObservable, logger

source

See also

Operators

diff --git a/dev/operators/transformation/substitute/index.html b/dev/operators/transformation/substitute/index.html index b02e9cb90..4230d9f0d 100644 --- a/dev/operators/transformation/substitute/index.html +++ b/dev/operators/transformation/substitute/index.html @@ -1,5 +1,5 @@ -substitute · Rocket.jl

Substitute Operator

Rocket.substituteFunction
substitute(::Type{T}, mapFn::F, handler::SubstituteHandler) where { T, F <: Function }

This operator forces observable to substitute each emmited value with the latest computed value with the corresponding handler and release! function. After release! on handler substitute operator computes new value with mapFn but does not emit it until next emission from source observable. Always calls mapFn on first value from source observable.

Producing

Stream of type <: Subscribable{T}

Examples

using Rocket
+substitute · Rocket.jl

Substitute Operator

Rocket.substituteFunction
substitute(::Type{T}, mapFn::F, handler::SubstituteHandler) where { T, F <: Function }

This operator forces observable to substitute each emmited value with the latest computed value with the corresponding handler and release! function. After release! on handler substitute operator computes new value with mapFn but does not emit it until next emission from source observable. Always calls mapFn on first value from source observable.

Producing

Stream of type <: Subscribable{T}

Examples

using Rocket
 
 subject = Subject(Int)
 
@@ -28,4 +28,4 @@
 [LogActor] Data: i = 1
 [LogActor] Data: i = 3
 [LogActor] Data: i = 3
-[LogActor] Data: i = 3

See also: SubstituteHandler

source

See also

Operators

+[LogActor] Data: i = 3

See also: SubstituteHandler

source

See also

Operators

diff --git a/dev/operators/transformation/switch_map/index.html b/dev/operators/transformation/switch_map/index.html index e73e876cf..5ce29773d 100644 --- a/dev/operators/transformation/switch_map/index.html +++ b/dev/operators/transformation/switch_map/index.html @@ -1,5 +1,5 @@ -switch_map · Rocket.jl

SwitchMap Operator

Rocket.switch_mapFunction
switch_map(::Type{R}, mappingFn::F = identity) where { R, F <: Function }

Creates a switch_map operator, which returns an Observable that emits items based on applying a function mappingFn that you supply to each item emitted by the source Observable, where that function returns an (so-called "inner") Observable. Each time it observes one of these inner Observables, the output Observable begins emitting the items emitted by that inner Observable. When a new inner Observable is emitted, switch_map stops emitting items from the earlier-emitted inner Observable and begins emitting items from the new one. It continues to behave like this for subsequent inner Observables.

Arguments

  • ::Type{R}: the type of data of output Observables after projection with mappingFn
  • mappingFn::F: projection function with (data) -> Observable{R} signature

Producing

Stream of type <: Subscribable{R}

Examples

using Rocket
+switch_map · Rocket.jl

SwitchMap Operator

Rocket.switch_mapFunction
switch_map(::Type{R}, mappingFn::F = identity) where { R, F <: Function }

Creates a switch_map operator, which returns an Observable that emits items based on applying a function mappingFn that you supply to each item emitted by the source Observable, where that function returns an (so-called "inner") Observable. Each time it observes one of these inner Observables, the output Observable begins emitting the items emitted by that inner Observable. When a new inner Observable is emitted, switch_map stops emitting items from the earlier-emitted inner Observable and begins emitting items from the new one. It continues to behave like this for subsequent inner Observables.

Arguments

  • ::Type{R}: the type of data of output Observables after projection with mappingFn
  • mappingFn::F: projection function with (data) -> Observable{R} signature

Producing

Stream of type <: Subscribable{R}

Examples

using Rocket
 
 source = from([ of(1), of(2), of(3) ])
 subscribe!(source |> switch_map(Int), logger())
@@ -21,4 +21,4 @@
 [LogActor] Data: 1.0
 [LogActor] Data: 4.0
 [LogActor] Data: 9.0
-[LogActor] Completed

See also: AbstractOperator, RightTypedOperator, ProxyObservable, logger

source

See also

Operators

+[LogActor] Completed

See also: AbstractOperator, RightTypedOperator, ProxyObservable, logger

source

See also

Operators

diff --git a/dev/operators/transformation/switch_map_to/index.html b/dev/operators/transformation/switch_map_to/index.html index a615a8c55..2c5bbd930 100644 --- a/dev/operators/transformation/switch_map_to/index.html +++ b/dev/operators/transformation/switch_map_to/index.html @@ -1,5 +1,5 @@ -switch_map_to · Rocket.jl

SwitchMapTo Operator

Rocket.switch_map_toFunction
switch_map_to(inner_observable)

Creates a switch_map_to operator, which projects each source value to the same Observable which is flattened multiple times with switch_map in the output Observable.

Arguments

  • inner_observable: an Observable to replace each value from the source Observable.

Producing

Stream of type <: Subscribable{R} where R refers to the eltype of inner_observable

Examples

using Rocket
+switch_map_to · Rocket.jl

SwitchMapTo Operator

Rocket.switch_map_toFunction
switch_map_to(inner_observable)

Creates a switch_map_to operator, which projects each source value to the same Observable which is flattened multiple times with switch_map in the output Observable.

Arguments

  • inner_observable: an Observable to replace each value from the source Observable.

Producing

Stream of type <: Subscribable{R} where R refers to the eltype of inner_observable

Examples

using Rocket
 
 source = from([ 0, 0, 0 ])
 subscribe!(source |> switch_map_to(from([ 1, 2, 3 ])), logger())
@@ -16,4 +16,4 @@
 [LogActor] Data: 1
 [LogActor] Data: 2
 [LogActor] Data: 3
-[LogActor] Completed

See also: switch_map, AbstractOperator, RightTypedOperator, ProxyObservable, logger

source
Note

switch_map_to is equivalent to switch_map with mappingFn set to (_) -> inner_observable.

See also

Operators

+[LogActor] Completed

See also: switch_map, AbstractOperator, RightTypedOperator, ProxyObservable, logger

source
Note

switch_map_to is equivalent to switch_map with mappingFn set to (_) -> inner_observable.

See also

Operators

diff --git a/dev/operators/transformation/to_array/index.html b/dev/operators/transformation/to_array/index.html index ed1342a45..707371169 100644 --- a/dev/operators/transformation/to_array/index.html +++ b/dev/operators/transformation/to_array/index.html @@ -1,5 +1,5 @@ -to_array · Rocket.jl

Uppercase Operator

Rocket.to_arrayFunction
to_array()

Creates a to_array operator, which reduces all values into a single array and returns this result when the source completes.

Producing

Stream of type <: Subscribable{Vector{L}} where L refers to type of source stream

Examples

using Rocket
+to_array · Rocket.jl

Uppercase Operator

Rocket.to_arrayFunction
to_array()

Creates a to_array operator, which reduces all values into a single array and returns this result when the source completes.

Producing

Stream of type <: Subscribable{Vector{L}} where L refers to type of source stream

Examples

using Rocket
 
 source = from([ 1, 2, 3 ])
 subscribe!(source |> to_array(), logger())
@@ -9,4 +9,4 @@
 
 [LogActor] Data: [1, 2, 3]
 [LogActor] Completed
-

See also: AbstractOperator, InferableOperator, ProxyObservable, logger

source

See also

Operators, map, lowercase

+

See also: AbstractOperator, InferableOperator, ProxyObservable, logger

source

See also

Operators, map, lowercase

diff --git a/dev/operators/transformation/uppercase/index.html b/dev/operators/transformation/uppercase/index.html index 0d0e3d797..308c84bda 100644 --- a/dev/operators/transformation/uppercase/index.html +++ b/dev/operators/transformation/uppercase/index.html @@ -1,5 +1,5 @@ -uppercase · Rocket.jl

Uppercase Operator

Base.Unicode.uppercaseFunction
uppercase()

Creates an uppercase operator, which forces each value to be in upper case

Producing

Stream of type <: Subscribable{L} where L referes to type of data of input Observable

Examples

using Rocket
+uppercase · Rocket.jl

Uppercase Operator

Base.Unicode.uppercaseFunction
uppercase()

Creates an uppercase operator, which forces each value to be in upper case

Producing

Stream of type <: Subscribable{L} where L referes to type of data of input Observable

Examples

using Rocket
 
 source = of("Hello, world!")
 subscribe!(source |> uppercase(), logger())
@@ -8,4 +8,4 @@
 # output
 
 [LogActor] Data: HELLO, WORLD!
-[LogActor] Completed

See also: AbstractOperator, InferableOperator, ProxyObservable, logger

source

See also

Operators, map, lowercase

+[LogActor] Completed

See also: AbstractOperator, InferableOperator, ProxyObservable, logger

source

See also

Operators, map, lowercase

diff --git a/dev/operators/utility/about/index.html b/dev/operators/utility/about/index.html index 6ade909bc..6d0b87e2a 100644 --- a/dev/operators/utility/about/index.html +++ b/dev/operators/utility/about/index.html @@ -1,2 +1,2 @@ -About utility operators · Rocket.jl
+About utility operators · Rocket.jl
diff --git a/dev/operators/utility/async/index.html b/dev/operators/utility/async/index.html index 74c1bf430..6e5f999ce 100644 --- a/dev/operators/utility/async/index.html +++ b/dev/operators/utility/async/index.html @@ -1,2 +1,2 @@ -async · Rocket.jl
+async · Rocket.jl
diff --git a/dev/operators/utility/default_if_empty/index.html b/dev/operators/utility/default_if_empty/index.html index 9f6cba16b..1f055cf31 100644 --- a/dev/operators/utility/default_if_empty/index.html +++ b/dev/operators/utility/default_if_empty/index.html @@ -1,5 +1,5 @@ -default_if_empty · Rocket.jl

DefaultIfEmpty Operator

Rocket.default_if_emptyFunction
default_if_empty(value::T)
+default_if_empty · Rocket.jl

DefaultIfEmpty Operator

Rocket.default_if_emptyFunction
default_if_empty(value::T)
 default_if_empty(callback::Function)

Creates a default_if_empty operator, which emits a given value if the source Observable completes without emitting any next value, otherwise mirrors the source Observable. Optionally accepts a zero-argument callback that will be executed to generate default value. Note: Callback function's output is always converted to the eltype of the original observable.

using Rocket
 
 source = completed(Int) |> default_if_empty(0)
@@ -18,4 +18,4 @@
 
 # output
 [LogActor] Data: 42
-[LogActor] Completed

See also: AbstractOperator, InferableOperator, logger, map

source

Description

default_if_empty emits the values emitted by the source Observable or a specified default value if the source Observable is empty (completes without having emitted any next value).

See also

Operators

+[LogActor] Completed

See also: AbstractOperator, InferableOperator, logger, map

source

Description

default_if_empty emits the values emitted by the source Observable or a specified default value if the source Observable is empty (completes without having emitted any next value).

See also

Operators

diff --git a/dev/operators/utility/delay/index.html b/dev/operators/utility/delay/index.html index a3a215f96..140441245 100644 --- a/dev/operators/utility/delay/index.html +++ b/dev/operators/utility/delay/index.html @@ -1,5 +1,5 @@ -delay · Rocket.jl

Delay Operator

Rocket.delayFunction
delay(delay::Int)

Creates a delay operator, which delays the emission of items from the source Observable by a given timeout.

Arguments:

  • delay::Int: the delay duration in milliseconds (a number) until which the emission of the source items is delayed.

Producing

Stream of type <: Subscribable{L} where L refers to type of source stream

See also: AbstractOperator, InferableOperator, ProxyObservable

source

Description

Delays the emission of items from the source Observable by a given timeout

Example

Delay every value with 1 second to the output

using Rocket
+delay · Rocket.jl

Delay Operator

Rocket.delayFunction
delay(delay::Int)

Creates a delay operator, which delays the emission of items from the source Observable by a given timeout.

Arguments:

  • delay::Int: the delay duration in milliseconds (a number) until which the emission of the source items is delayed.

Producing

Stream of type <: Subscribable{L} where L refers to type of source stream

See also: AbstractOperator, InferableOperator, ProxyObservable

source

Description

Delays the emission of items from the source Observable by a given timeout

Example

Delay every value with 1 second to the output

using Rocket
 using Dates
 
 source = from([ 1, 2, 3 ])
@@ -14,4 +14,4 @@
 03:43: 1
 03:43: 2
 03:43: 3
-

See also

Operators

+

See also

Operators

diff --git a/dev/operators/utility/discontinue/index.html b/dev/operators/utility/discontinue/index.html index 1bf8e4c13..bbb078e17 100644 --- a/dev/operators/utility/discontinue/index.html +++ b/dev/operators/utility/discontinue/index.html @@ -1,5 +1,5 @@ -discontinue · Rocket.jl

Discontinue Operator

Rocket.discontinueFunction
discontinue()

Creates an operator, which prevents an emitting of self-depending messages and breaks a possible infinite loop. Does nothing if observable scheduled asynchronously.

Producing

Stream of type <: Subscribable{L} where L refers to type of source stream

Examples

using Rocket
+discontinue · Rocket.jl

Discontinue Operator

Rocket.discontinueFunction
discontinue()

Creates an operator, which prevents an emitting of self-depending messages and breaks a possible infinite loop. Does nothing if observable scheduled asynchronously.

Producing

Stream of type <: Subscribable{L} where L refers to type of source stream

Examples

using Rocket
 
 s = BehaviorSubject(0)
 
@@ -10,4 +10,4 @@
 # output
 
 [LogActor] Data: 0
-[LogActor] Data: 1

See also: AbstractOperator, RightTypedOperator, ProxyObservable, logger

source

See also

Operators

+[LogActor] Data: 1

See also: AbstractOperator, RightTypedOperator, ProxyObservable, logger

source

See also

Operators

diff --git a/dev/operators/utility/error_if_empty/index.html b/dev/operators/utility/error_if_empty/index.html index e2d399742..10f6f36cd 100644 --- a/dev/operators/utility/error_if_empty/index.html +++ b/dev/operators/utility/error_if_empty/index.html @@ -1,5 +1,5 @@ -error_if_empty · Rocket.jl

ErrorIfEmpty Operator

Rocket.error_if_emptyFunction
error_if_empty(err)

Creates a error_if_empty operator, which emits a given error if the source Observable completes without emitting any next value, otherwise mirrors the source Observable.

using Rocket
+error_if_empty · Rocket.jl

ErrorIfEmpty Operator

Rocket.error_if_emptyFunction
error_if_empty(err)

Creates a error_if_empty operator, which emits a given error if the source Observable completes without emitting any next value, otherwise mirrors the source Observable.

using Rocket
 
 source = completed(Int) |> error_if_empty("Empty")
 
@@ -7,4 +7,4 @@
 ;
 
 # output
-[LogActor] Error: Empty

See also: AbstractOperator, InferableOperator, logger, map

source

Description

error_if_empty emits the values emitted by the source Observable or a specified error message if the source Observable is empty (completes without having emitted any next value).

See also

Operators

+[LogActor] Error: Empty

See also: AbstractOperator, InferableOperator, logger, map

source

Description

error_if_empty emits the values emitted by the source Observable or a specified error message if the source Observable is empty (completes without having emitted any next value).

See also

Operators

diff --git a/dev/operators/utility/limit_subscribers/index.html b/dev/operators/utility/limit_subscribers/index.html index c8050b288..9baa4ac9f 100644 --- a/dev/operators/utility/limit_subscribers/index.html +++ b/dev/operators/utility/limit_subscribers/index.html @@ -1,13 +1,13 @@ -limit_subscribers · Rocket.jl

LimitSubscribers Operator

Rocket.LimitSubscribersGuardType
LimitSubscribersGuard(limit::Int = 1, exclusive = true)

Guard structure used in limit_subscribers operator.

Arguments

  • limit: number of concurrent subscribers
  • exclusive: boolean flag, which indicates whenever this guard can be shared with other observables in other limit_subscribers operator. If set to true, reusing this guard in a different limit_subscribers operator for other observable will result in automatic unsubscription of all present actors.

Note

This structure is useful in Pluto.jl notebooks in particular, allowing for automatic subscription/unsubscription of observables.

Example


+limit_subscribers · Rocket.jl

LimitSubscribers Operator

Rocket.LimitSubscribersGuardType
LimitSubscribersGuard(limit::Int = 1, exclusive = true)

Guard structure used in limit_subscribers operator.

Arguments

  • limit: number of concurrent subscribers
  • exclusive: boolean flag, which indicates whenever this guard can be shared with other observables in other limit_subscribers operator. If set to true, reusing this guard in a different limit_subscribers operator for other observable will result in automatic unsubscription of all present actors.

Note

This structure is useful in Pluto.jl notebooks in particular, allowing for automatic subscription/unsubscription of observables.

Example


 # Cell 1
 guard = LimitSubscribersGuard()
 
 # Cell 2
-subscription = subscribe!(some_stream |> limit_subscribers(guard), logger())

See also: limit_subscribers, subscribe!

source
Rocket.limit_subscribersFunction
limit_subscribers(limit::Int = 1, exclusive::Bool = true)
 limit_subscribers(guard::LimitSubscribersGuard)

Creates an operator that limits number of concurrent actors to the given observable. On new subscription, if limit is exceeded, oldest actor is automatically unsubscribed and receives a completion event.

Arguments

  • limit: number of concurrent subscribers
  • exclusive: boolean flag, which indicates whenever this guard can be shared with other observables in other limit_subscribers operator. If set to true, reusing this guard in a different limit_subscribers operator for other observable will result in automatic unsubscription of all present actors.

Note

This structure is useful in Pluto.jl notebooks in particular, allowing for automatic subscription/unsubscription of observables.

Example


 # Cell 1
 guard = LimitSubscribersGuard()
 
 # Cell 2
-subscription = subscribe!(some_stream |> limit_subscribers(guard), logger())

See also: LimitSubscribersGuard

source

See also

Operators

+subscription = subscribe!(some_stream |> limit_subscribers(guard), logger())

See also: LimitSubscribersGuard

source

See also

Operators

diff --git a/dev/operators/utility/noop/index.html b/dev/operators/utility/noop/index.html index 17c89468b..eafbeb0a3 100644 --- a/dev/operators/utility/noop/index.html +++ b/dev/operators/utility/noop/index.html @@ -1,5 +1,5 @@ -noop · Rocket.jl

Noop Operator

Rocket.noopFunction
noop()

Creates a noop operator, which does nothing, but breaks operator composition type inference checking procedure for Julia's compiler. It might be useful for very long chain of operators, because Julia tries to statically infer data types at compile-time for the whole chain and can run into StackOverflow issues.

using Rocket
+noop · Rocket.jl

Noop Operator

Rocket.noopFunction
noop()

Creates a noop operator, which does nothing, but breaks operator composition type inference checking procedure for Julia's compiler. It might be useful for very long chain of operators, because Julia tries to statically infer data types at compile-time for the whole chain and can run into StackOverflow issues.

using Rocket
 
 # foo() block to enforce local scope for scope variable
 function foo()
@@ -22,4 +22,4 @@
 [LogActor] Data: 1003
 [LogActor] Data: 1004
 [LogActor] Data: 1005
-[LogActor] Completed

See also: AbstractOperator, InferableOperator, logger, map

source

See also

Operators

+[LogActor] Completed

See also: AbstractOperator, InferableOperator, logger, map

source

See also

Operators

diff --git a/dev/operators/utility/ref_count/index.html b/dev/operators/utility/ref_count/index.html index 54e6beb61..582710a4c 100644 --- a/dev/operators/utility/ref_count/index.html +++ b/dev/operators/utility/ref_count/index.html @@ -1,5 +1,5 @@ -ref_count · Rocket.jl

Ref Count Operator

Rocket.ref_countFunction
ref_count()

Make a ConnectableObservable behave like a ordinary observable and automates the way you can connect to it. Internally it counts the subscriptions to the observable and subscribes (only once) to the source if the number of subscriptions is larger than 0. If the number of subscriptions is smaller than 1, it unsubscribes from the source. This way you can make sure that everything before the published refCount has only a single subscription independently of the number of subscribers to the target observable.

Note that using the share operator is exactly the same as using the publish operator (making the observable hot) and the ref_count() operator in a sequence.

Example

using Rocket
+ref_count · Rocket.jl

Ref Count Operator

Rocket.ref_countFunction
ref_count()

Make a ConnectableObservable behave like a ordinary observable and automates the way you can connect to it. Internally it counts the subscriptions to the observable and subscribes (only once) to the source if the number of subscriptions is larger than 0. If the number of subscriptions is smaller than 1, it unsubscribes from the source. This way you can make sure that everything before the published refCount has only a single subscription independently of the number of subscribers to the target observable.

Note that using the share operator is exactly the same as using the publish operator (making the observable hot) and the ref_count() operator in a sequence.

Example

using Rocket
 
 subject = Subject(Int, scheduler = AsapScheduler())
 source  = from(1:5) |> multicast(subject) |> ref_count()
@@ -21,4 +21,4 @@
 [1] Data: 4
 [1] Data: 5
 [1] Completed
-[2] Completed

See also: AbstractOperator, publish, multicast, share

source

See also

Operators

+[2] Completed

See also: AbstractOperator, publish, multicast, share

source

See also

Operators

diff --git a/dev/operators/utility/safe/index.html b/dev/operators/utility/safe/index.html index 9b605e10a..70eea5cde 100644 --- a/dev/operators/utility/safe/index.html +++ b/dev/operators/utility/safe/index.html @@ -1,2 +1,2 @@ -safe · Rocket.jl
+safe · Rocket.jl
diff --git a/dev/operators/utility/skip_complete/index.html b/dev/operators/utility/skip_complete/index.html index e98cac4fe..092980cdb 100644 --- a/dev/operators/utility/skip_complete/index.html +++ b/dev/operators/utility/skip_complete/index.html @@ -1,5 +1,5 @@ -skip_complete · Rocket.jl

SkipComplete Operator

Rocket.skip_completeFunction
skip_complete()

Creates a skip_complete operator, which filters out complete event by the source Observable by emitting only next and error messages.

Producing

Stream of type <: Subscribable{L} where L refers to type of source stream

Examples

using Rocket
+skip_complete · Rocket.jl

SkipComplete Operator

Rocket.skip_completeFunction
skip_complete()

Creates a skip_complete operator, which filters out complete event by the source Observable by emitting only next and error messages.

Producing

Stream of type <: Subscribable{L} where L refers to type of source stream

Examples

using Rocket
 
 source = from([ 1, 2, 3 ])
 subscribe!(source |> skip_complete(), logger())
@@ -9,4 +9,4 @@
 [LogActor] Data: 1
 [LogActor] Data: 2
 [LogActor] Data: 3
-

See also: AbstractOperator, InferableOperator, ProxyObservable, skip_error, skip_next, logger

source

See also

Operators

+

See also: AbstractOperator, InferableOperator, ProxyObservable, skip_error, skip_next, logger

source

See also

Operators

diff --git a/dev/operators/utility/skip_error/index.html b/dev/operators/utility/skip_error/index.html index 16d73f581..dc9af8cda 100644 --- a/dev/operators/utility/skip_error/index.html +++ b/dev/operators/utility/skip_error/index.html @@ -1,9 +1,9 @@ -skip_error · Rocket.jl

SkipError Operator

Rocket.skip_errorFunction
skip_error()

Creates a skip_error operator, which filters out error event by the source Observable by emitting only next and complete messages.

Producing

Stream of type <: Subscribable{L} where L refers to type of source stream

Examples

using Rocket
+skip_error · Rocket.jl
+

See also: AbstractOperator, InferableOperator, ProxyObservable, skip_error, skip_complete, logger

source

See also

Operators

diff --git a/dev/operators/utility/skip_next/index.html b/dev/operators/utility/skip_next/index.html index a3c3c22b5..c0dc078b6 100644 --- a/dev/operators/utility/skip_next/index.html +++ b/dev/operators/utility/skip_next/index.html @@ -1,5 +1,5 @@ -skip_next · Rocket.jl

SkipNext Operator

Rocket.skip_nextFunction
skip_next()

Creates a skip_next operator, which filters out all next messages by the source Observable by emitting only error and complete messages.

Producing

Stream of type <: Subscribable{L} where L refers to type of source stream

Examples

using Rocket
+skip_next · Rocket.jl

SkipNext Operator

Rocket.skip_nextFunction
skip_next()

Creates a skip_next operator, which filters out all next messages by the source Observable by emitting only error and complete messages.

Producing

Stream of type <: Subscribable{L} where L refers to type of source stream

Examples

using Rocket
 
 source = from([ 1, 2, 3 ])
 subscribe!(source |> skip_next(), logger())
@@ -7,4 +7,4 @@
 
 # output
 [LogActor] Completed
-

See also: AbstractOperator, InferableOperator, ProxyObservable, skip_error, skip_complete, logger

source

See also

Operators

+

See also: AbstractOperator, InferableOperator, ProxyObservable, skip_error, skip_complete, logger

source

See also

Operators

diff --git a/dev/operators/utility/tap/index.html b/dev/operators/utility/tap/index.html index 1deae7e5b..84dc75e7e 100644 --- a/dev/operators/utility/tap/index.html +++ b/dev/operators/utility/tap/index.html @@ -1,5 +1,5 @@ -tap · Rocket.jl

Tap Operator

Rocket.tapFunction
tap(tapFn::F) where { F <: Function }

Creates a tap operator, which performs a side effect for every emission on the source Observable, but return an Observable that is identical to the source.

Arguments

  • tapFn::Function: side-effect tap function with (data) -> Nothing signature

Producing

Stream of type <: Subscribable{L} where L refers to type of source stream

Examples

using Rocket
+tap · Rocket.jl

Tap Operator

Rocket.tapFunction
tap(tapFn::F) where { F <: Function }

Creates a tap operator, which performs a side effect for every emission on the source Observable, but return an Observable that is identical to the source.

Arguments

  • tapFn::Function: side-effect tap function with (data) -> Nothing signature

Producing

Stream of type <: Subscribable{L} where L refers to type of source stream

Examples

using Rocket
 
 source = from([ 1, 2, 3 ])
 subscribe!(source |> tap((d) -> println("In tap: $d")), logger())
@@ -14,4 +14,4 @@
 In tap: 3
 [LogActor] Data: 3
 [LogActor] Completed
-

See also: tap_on_subscribe, tap_on_complete, logger

source

Description

Returns an Observable that resembles the source Observable, but modifies it so that the provided Observer is called to perform a side effect for every value emitted by the source.

This operator is useful for debugging your Observables, verifying correct values, or performing other side effects.

Note: this operator differs from a subscribe on the Observable. If the Observable returned by tap is not subscribed, the side effects specified by the Observer will never happen. tap therefore simply spies on existing execution, it does not trigger an execution to happen like subscribe does.

See also

Operators

+

See also: tap_on_subscribe, tap_on_complete, logger

source

Description

Returns an Observable that resembles the source Observable, but modifies it so that the provided Observer is called to perform a side effect for every value emitted by the source.

This operator is useful for debugging your Observables, verifying correct values, or performing other side effects.

Note: this operator differs from a subscribe on the Observable. If the Observable returned by tap is not subscribed, the side effects specified by the Observer will never happen. tap therefore simply spies on existing execution, it does not trigger an execution to happen like subscribe does.

See also

Operators

diff --git a/dev/operators/utility/tap_on_complete/index.html b/dev/operators/utility/tap_on_complete/index.html index 7048d51b0..bf609aef4 100644 --- a/dev/operators/utility/tap_on_complete/index.html +++ b/dev/operators/utility/tap_on_complete/index.html @@ -1,5 +1,5 @@ -tap_on_complete · Rocket.jl

TapOnComplete Operator

Rocket.tap_on_completeFunction
tap_on_complete(tapFn::F) where { F <: Function }

Creates a tap operator, which performs a side effect for only complete emission on the source Observable, but return an Observable that is identical to the source.

Arguments

  • tapFn::Function: side-effect tap function with () -> Nothing signature

Producing

Stream of type <: Subscribable{L} where L refers to type of source stream

Examples

using Rocket
+tap_on_complete · Rocket.jl

TapOnComplete Operator

Rocket.tap_on_completeFunction
tap_on_complete(tapFn::F) where { F <: Function }

Creates a tap operator, which performs a side effect for only complete emission on the source Observable, but return an Observable that is identical to the source.

Arguments

  • tapFn::Function: side-effect tap function with () -> Nothing signature

Producing

Stream of type <: Subscribable{L} where L refers to type of source stream

Examples

using Rocket
 
 source = from([ 1, 2, 3 ])
 subscribe!(source |> tap_on_complete(() -> println("Complete event received")), logger())
@@ -12,4 +12,4 @@
 [LogActor] Data: 3
 [LogActor] Completed
 Complete event received
-

See also: tap_on_subscribe, tap, logger

source

Description

Returns an Observable that resembles the source Observable, but modifies it so that the provided Observer is called to perform a side effect on complete event emission by the source.

This operator is useful for debugging your Observables, verifying correctness, or performing other side effects.

Note: this operator differs from a subscribe on the Observable. If the Observable returned by tap_on_complete is not subscribed, the side effects specified by the Observer will never happen. tap_on_complete therefore simply spies on future execution, it does not trigger an execution to happen like subscribe does.

See also

Operators

+

See also: tap_on_subscribe, tap, logger

source

Description

Returns an Observable that resembles the source Observable, but modifies it so that the provided Observer is called to perform a side effect on complete event emission by the source.

This operator is useful for debugging your Observables, verifying correctness, or performing other side effects.

Note: this operator differs from a subscribe on the Observable. If the Observable returned by tap_on_complete is not subscribed, the side effects specified by the Observer will never happen. tap_on_complete therefore simply spies on future execution, it does not trigger an execution to happen like subscribe does.

See also

Operators

diff --git a/dev/operators/utility/tap_on_subscribe/index.html b/dev/operators/utility/tap_on_subscribe/index.html index b7ab57fc9..c308ea3c3 100644 --- a/dev/operators/utility/tap_on_subscribe/index.html +++ b/dev/operators/utility/tap_on_subscribe/index.html @@ -1,5 +1,5 @@ -tap_on_subscribe · Rocket.jl

TapOnSubscribe Operator

Rocket.tap_on_subscribeFunction
tap_on_subscribe(tapFn::F, strategy::S = TapBeforeSubscription()) where { F <: Function }

Creates a tap operator, which performs a side effect on the subscription on the source Observable, but return an Observable that is identical to the source.

Arguments

  • tapFn::Function: side-effect tap function with () -> Nothing signature
  • strategy: (optional), specifies the order of a side-effect and an actual subscription, uses TapBeforeSubscription by default

Producing

Stream of type <: Subscribable{L} where L refers to type of source stream

Examples

using Rocket
+tap_on_subscribe · Rocket.jl

TapOnSubscribe Operator

Rocket.tap_on_subscribeFunction
tap_on_subscribe(tapFn::F, strategy::S = TapBeforeSubscription()) where { F <: Function }

Creates a tap operator, which performs a side effect on the subscription on the source Observable, but return an Observable that is identical to the source.

Arguments

  • tapFn::Function: side-effect tap function with () -> Nothing signature
  • strategy: (optional), specifies the order of a side-effect and an actual subscription, uses TapBeforeSubscription by default

Producing

Stream of type <: Subscribable{L} where L refers to type of source stream

Examples

using Rocket
 
 source = from([ 1, 2, 3 ])
 subscribe!(source |> tap_on_subscribe(() -> println("Someone subscribed")), logger())
@@ -23,4 +23,4 @@
 [LogActor] Data: 2
 [LogActor] Data: 3
 [LogActor] Completed
-Someone subscribed

See also: TapBeforeSubscription, TapAfterSubscription, tap, tap_on_unsubscribe, tap_on_complete, logger

source

Description

Returns an Observable that resembles the source Observable, but modifies it so that the provided Observer is called to perform a side effect on subscription to the source.

This operator is useful for debugging your Observables, verifying correctness, or performing other side effects.

Note: this operator differs from a subscribe on the Observable. If the Observable returned by tap_on_subscribe is not subscribed, the side effects specified by the Observer will never happen. tap_on_subscribe therefore simply spies on future execution, it does not trigger an execution to happen like subscribe does.

See also

Operators

+Someone subscribed

See also: TapBeforeSubscription, TapAfterSubscription, tap, tap_on_unsubscribe, tap_on_complete, logger

source

Description

Returns an Observable that resembles the source Observable, but modifies it so that the provided Observer is called to perform a side effect on subscription to the source.

This operator is useful for debugging your Observables, verifying correctness, or performing other side effects.

Note: this operator differs from a subscribe on the Observable. If the Observable returned by tap_on_subscribe is not subscribed, the side effects specified by the Observer will never happen. tap_on_subscribe therefore simply spies on future execution, it does not trigger an execution to happen like subscribe does.

See also

Operators

diff --git a/dev/operators/utility/tap_on_unsubscribe/index.html b/dev/operators/utility/tap_on_unsubscribe/index.html index c4af84b0a..9784d276e 100644 --- a/dev/operators/utility/tap_on_unsubscribe/index.html +++ b/dev/operators/utility/tap_on_unsubscribe/index.html @@ -1,5 +1,5 @@ -tap_on_unsubscribe · Rocket.jl

TapOnUnsubscribe Operator

Rocket.tap_on_unsubscribeFunction
tap_on_unsubscribe(tapFn::F, strategy::S = TapBeforeUnsubscription()) where { F <: Function }

Creates a tap operator, which performs a side effect on the unsubscription on the source Observable, but return an Observable that is identical to the source. Tap callback triggers only once.

Arguments

  • tapFn::Function: side-effect tap function with () -> Nothing signature
  • strategy: (optional), specifies the order of a side-effect and an actual unsubscription, uses TapBeforeUnsubscription by default

Producing

Stream of type <: Subscribable{L} where L refers to type of source stream

Examples

using Rocket
+tap_on_unsubscribe · Rocket.jl

TapOnUnsubscribe Operator

Rocket.tap_on_unsubscribeFunction
tap_on_unsubscribe(tapFn::F, strategy::S = TapBeforeUnsubscription()) where { F <: Function }

Creates a tap operator, which performs a side effect on the unsubscription on the source Observable, but return an Observable that is identical to the source. Tap callback triggers only once.

Arguments

  • tapFn::Function: side-effect tap function with () -> Nothing signature
  • strategy: (optional), specifies the order of a side-effect and an actual unsubscription, uses TapBeforeUnsubscription by default

Producing

Stream of type <: Subscribable{L} where L refers to type of source stream

Examples

using Rocket
 
 source = from([ 1, 2, 3 ])
 subscription = subscribe!(source |> tap_on_unsubscribe(() -> println("Someone unsubscribed")), logger())
@@ -12,4 +12,4 @@
 [LogActor] Data: 2
 [LogActor] Data: 3
 [LogActor] Completed
-Someone unsubscribed

See also: TapBeforeUnsubscription, TapAfterUnsubscription, tap, tap_on_subscribe, tap_on_complete, logger

source

Description

Returns an Observable that resembles the source Observable, but modifies it so that the provided Observer is called to perform a side effect on unsubscription from the source.

This operator is useful for debugging your Observables, verifying correctness, or performing other side effects.

See also

Operators

+Someone unsubscribed

See also: TapBeforeUnsubscription, TapAfterUnsubscription, tap, tap_on_subscribe, tap_on_complete, logger

source

Description

Returns an Observable that resembles the source Observable, but modifies it so that the provided Observer is called to perform a side effect on unsubscription from the source.

This operator is useful for debugging your Observables, verifying correctness, or performing other side effects.

See also

Operators

diff --git a/dev/search_index.js b/dev/search_index.js index 15ea339f3..6002ccdf7 100644 --- a/dev/search_index.js +++ b/dev/search_index.js @@ -1,3 +1,3 @@ var documenterSearchIndex = {"docs": -[{"location":"operators/utility/skip_complete/#operator_skip_complete","page":"skip_complete","title":"SkipComplete Operator","text":"","category":"section"},{"location":"operators/utility/skip_complete/","page":"skip_complete","title":"skip_complete","text":"skip_complete","category":"page"},{"location":"operators/utility/skip_complete/#Rocket.skip_complete","page":"skip_complete","title":"Rocket.skip_complete","text":"skip_complete()\n\nCreates a skip_complete operator, which filters out complete event by the source Observable by emitting only next and error messages.\n\nProducing\n\nStream of type <: Subscribable{L} where L refers to type of source stream\n\nExamples\n\nusing Rocket\n\nsource = from([ 1, 2, 3 ])\nsubscribe!(source |> skip_complete(), logger())\n;\n\n# output\n[LogActor] Data: 1\n[LogActor] Data: 2\n[LogActor] Data: 3\n\n\nSee also: AbstractOperator, InferableOperator, ProxyObservable, skip_error, skip_next, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/utility/skip_complete/#See-also","page":"skip_complete","title":"See also","text":"","category":"section"},{"location":"operators/utility/skip_complete/","page":"skip_complete","title":"skip_complete","text":"Operators","category":"page"},{"location":"operators/transformation/start_with/#operator_start_with","page":"start_with","title":"StartWith Operator","text":"","category":"section"},{"location":"operators/transformation/start_with/","page":"start_with","title":"start_with","text":"start_with","category":"page"},{"location":"operators/transformation/start_with/#Rocket.start_with","page":"start_with","title":"Rocket.start_with","text":"start_with(object::O) where O\n\nCreates a start_with operator, which forces an observable to emit given object as a first value.\n\nProducing\n\nStream of type <: Subscribable{Union{L, O}} where L refers to type of source stream <: Subscribable{L}\n\nExamples\n\nusing Rocket\n\nsource = from(1:3) |> start_with(0)\nsubscribe!(source, logger())\n;\n\n# output\n\n[LogActor] Data: 0\n[LogActor] Data: 1\n[LogActor] Data: 2\n[LogActor] Data: 3\n[LogActor] Completed\n\nSee also: AbstractOperator, InferableOperator, ProxyObservable, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/transformation/start_with/#See-also","page":"start_with","title":"See also","text":"","category":"section"},{"location":"operators/transformation/start_with/","page":"start_with","title":"start_with","text":"Operators","category":"page"},{"location":"actors/types/server/#actor_server","page":"Server","title":"Server actor","text":"","category":"section"},{"location":"actors/types/server/","page":"Server","title":"Server","text":"server","category":"page"},{"location":"actors/types/server/#Rocket.server","page":"Server","title":"Rocket.server","text":"server(port::Int)\nserver(address::A, port::Int) where { A <: IPAddr }\nserver(::Type{D}, port::Int)\nserver(::Type{D}, address::A, port::Int) where { A <: IPAddr }\n\nCreation operator for the ServerActor actor.\n\nSee also: AbstractActor\n\n\n\n\n\n","category":"function"},{"location":"actors/types/server/","page":"Server","title":"Server","text":"ServerActor","category":"page"},{"location":"actors/types/server/#Rocket.ServerActor","page":"Server","title":"Rocket.ServerActor","text":"ServerActor{D, Address, Port}() where D\n\nThe ServerActor sends all next!/error!/complete! events to the local network listeners with specified Address and Port parameters via TCPSocket.\n\nSee also: Actor, server\n\n\n\n\n\n","category":"type"},{"location":"operators/transformation/exhaust_map/#operator_exhaust_map","page":"exhaust_map","title":"ExhaustMap Operator","text":"","category":"section"},{"location":"operators/transformation/exhaust_map/","page":"exhaust_map","title":"exhaust_map","text":"exhaust_map","category":"page"},{"location":"operators/transformation/exhaust_map/#Rocket.exhaust_map","page":"exhaust_map","title":"Rocket.exhaust_map","text":"exhaust_map(::Type{R}, mappingFn::F = identity) where { R, F <: Function }\n\nCreates a exhaust_map operator, which returns an Observable containing projected Observables of each item of the source, ignoring projected Observables that start before their preceding Observable has completed. Essentially it projects each source value to an Observable which is merged in the output Observable only if the previous projected Observable has completed.\n\nArguments\n\n::Type{R}: the type of data of output Observables after projection with mappingFn\nmappingFn::F: projection function with (data) -> Observable{R} signature\n\nProducing\n\nStream of type <: Subscribable{R}\n\nExamples\n\nusing Rocket\n\nsource = from([ 0, 0 ]) |> async() |> exhaust_map(Int, d -> from([ 1, 2 ]) |> async())\nsubscribe!(source, logger())\n;\n\n# output\n\n[LogActor] Data: 1\n[LogActor] Data: 2\n[LogActor] Completed\n\nSee also: AbstractOperator, RightTypedOperator, ProxyObservable, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/transformation/exhaust_map/#See-also","page":"exhaust_map","title":"See also","text":"","category":"section"},{"location":"operators/transformation/exhaust_map/","page":"exhaust_map","title":"exhaust_map","text":"Operators","category":"page"},{"location":"operators/utility/ref_count/#operator_ref_count","page":"ref_count","title":"Ref Count Operator","text":"","category":"section"},{"location":"operators/utility/ref_count/","page":"ref_count","title":"ref_count","text":"ref_count","category":"page"},{"location":"operators/utility/ref_count/#Rocket.ref_count","page":"ref_count","title":"Rocket.ref_count","text":"ref_count()\n\nMake a ConnectableObservable behave like a ordinary observable and automates the way you can connect to it. Internally it counts the subscriptions to the observable and subscribes (only once) to the source if the number of subscriptions is larger than 0. If the number of subscriptions is smaller than 1, it unsubscribes from the source. This way you can make sure that everything before the published refCount has only a single subscription independently of the number of subscribers to the target observable.\n\nNote that using the share operator is exactly the same as using the publish operator (making the observable hot) and the ref_count() operator in a sequence.\n\nExample\n\nusing Rocket\n\nsubject = Subject(Int, scheduler = AsapScheduler())\nsource = from(1:5) |> multicast(subject) |> ref_count()\n\nactor1 = logger(\"1\")\nactor2 = logger(\"2\")\n\nsubscription1 = subscribe!(source, actor1)\nsubscription2 = subscribe!(source, actor2)\n\nunsubscribe!(subscription1)\nunsubscribe!(subscription2)\n;\n\n# output\n[1] Data: 1\n[1] Data: 2\n[1] Data: 3\n[1] Data: 4\n[1] Data: 5\n[1] Completed\n[2] Completed\n\nSee also: AbstractOperator, publish, multicast, share\n\n\n\n\n\n","category":"function"},{"location":"operators/utility/ref_count/#See-also","page":"ref_count","title":"See also","text":"","category":"section"},{"location":"operators/utility/ref_count/","page":"ref_count","title":"ref_count","text":"Operators","category":"page"},{"location":"actors/types/keep/#actor_keep","page":"Keep","title":"Keep actor","text":"","category":"section"},{"location":"actors/types/keep/","page":"Keep","title":"Keep","text":"keep","category":"page"},{"location":"actors/types/keep/#Rocket.keep","page":"Keep","title":"Rocket.keep","text":"keep(::Type{T}) where T\n\nArguments\n\n::Type{T}: Type of keep data\n\nCreation operator for the KeepActor actor.\n\nExamples\n\nusing Rocket\n\nactor = keep(Int)\nactor isa KeepActor{Int}\n\n# output\ntrue\n\nSee also: KeepActor, AbstractActor\n\n\n\n\n\n","category":"function"},{"location":"actors/types/keep/","page":"Keep","title":"Keep","text":"KeepActor","category":"page"},{"location":"actors/types/keep/#Rocket.KeepActor","page":"Keep","title":"Rocket.KeepActor","text":"KeepActor{D}() where D\n\nKeep actor provides a storage actor. It saves all incoming successful next events in a values array, throws an ErrorException on error! event and does nothing on completion event.\n\nExamples\n\nusing Rocket\n\nsource = from(1:5)\nactor = keep(Int)\n\nsubscribe!(source, actor)\nshow(getvalues(actor))\n\n# output\n[1, 2, 3, 4, 5]\n\nSee also: Actor, keep\n\n\n\n\n\n","category":"type"},{"location":"observables/types/collected/#observable_collected","page":"Collected","title":"Collected Observable","text":"","category":"section"},{"location":"observables/types/collected/","page":"Collected","title":"Collected","text":"collectLatest","category":"page"},{"location":"observables/types/collected/#Rocket.collectLatest","page":"Collected","title":"Rocket.collectLatest","text":"collectLatest(sources::S, mappingFn::F = copy) where { S, F }\ncollectLatest(::Type{T}, ::Type{R}, sources::S, mappingFn::F = copy)\n\nCollects values from multible Observables and emits it in one single array every time each inner Observable has a new value. Reemits errors from inner observables. Completes when all inner observables completes.\n\nArguments\n\nsources: input sources\nmappingFn: optional mappingFn applied to an array of emited values, copy by default, should return a Vector\n\nNote: collectLatest completes immediately if sources are empty.\n\nOptional arguments\n\n::Type{T}: optional type of emmiting values of inner observables\n::Type{R}: optional return type after applying mappingFn to a vector of values\n\nExamples\n\nusing Rocket\n\ncollected = collectLatest([ of(1), from([ 1, 2 ]) ])\n\nsubscribe!(collected, logger())\n;\n\n# output\n\n[LogActor] Data: [1, 1]\n[LogActor] Data: [1, 2]\n[LogActor] Completed\n\nSee also: Subscribable, subscribe!, combineLatest\n\n\n\n\n\n","category":"function"},{"location":"observables/types/collected/#Description","page":"Collected","title":"Description","text":"","category":"section"},{"location":"observables/types/collected/","page":"Collected","title":"Collected","text":"collectLatest collects the values from all Observables in its vector argument. This is done by subscribing to each Observable in order and, whenever an Observable emits, collecting a vector of the most recent values from each Observable (in order). If you pass n Observables to collectLatest, the returned Observable will always emit an ordered vector of n values.","category":"page"},{"location":"observables/types/collected/","page":"Collected","title":"Collected","text":"To ensure that the output vector has a consistent length, collectLatest waits for all input Observables to emit at least once before it starts emitting results. This means that if some Observable emits values before other Observables started emitting, all these values but the last will be lost. On the other hand, if some Observable does not emit a value but completes, the resulting Observable will complete simultaneously without emitting anything. Furthermore, if some input Observable does not emit any value and never completes, collectLatest will also never emit and never complete.","category":"page"},{"location":"observables/types/collected/","page":"Collected","title":"Collected","text":"If at least one Observable was passed to collectLatest and all passed Observables emitted, then the resulting Observable will complete when all combined streams complete. So even if some Observable completes, the result of collectLatest will still emit values when the other Observables do. In case of a completed Observable, its value will now remain to be the last emitted value. On the other hand, if any Observable errors, collectLatest will also immediately error.","category":"page"},{"location":"observables/types/defer/#observable_defer","page":"Defer","title":"Defer Observable","text":"","category":"section"},{"location":"observables/types/defer/","page":"Defer","title":"Defer","text":"defer","category":"page"},{"location":"observables/types/defer/#Rocket.defer","page":"Defer","title":"Rocket.defer","text":"defer(::Type{D}, factoryFn::F) where { D, F <: Function }\n\nCreates an Observable that, on subscribe, calls an Observable factory to make an Observable for each new Observer.\n\nArguments\n\nT: type of output data source, created by the factoryFn\nfactoryFn: the Observable factory function to invoke for each Observer that subscribes to the output Observable\n\nExamples\n\nusing Rocket\n\nsource = defer(Int, () -> from([ 1, 2, 3 ]))\n\nsubscribe!(source, logger())\n;\n\n# output\n[LogActor] Data: 1\n[LogActor] Data: 2\n[LogActor] Data: 3\n[LogActor] Completed\n\nSee also: Subscribable, subscribe!, logger\n\n\n\n\n\n","category":"function"},{"location":"observables/types/defer/#Description","page":"Defer","title":"Description","text":"","category":"section"},{"location":"observables/types/defer/","page":"Defer","title":"Defer","text":"defer allows you to create the Observable only when the Actor subscribes, and create a fresh Observable for each Actor. It waits until an Actor subscribes to it, and then it generates an Observable, typically with an Observable factory function. It does this afresh for each subscriber, so although each subscriber may think it is subscribing to the same Observable, in fact each subscriber gets its own individual Observable.","category":"page"},{"location":"operators/filtering/last/#operator_last","page":"last","title":"Last Operator","text":"","category":"section"},{"location":"operators/filtering/last/","page":"last","title":"last","text":"last","category":"page"},{"location":"operators/filtering/last/#Base.last","page":"last","title":"Base.last","text":"last(; default = nothing)\n\nCreates a last operator, which returns an Observable that emits only the last item emitted by the source Observable. Sends LastNotFoundException error message if a given source completes without emitting a single value.\n\nArguments\n\ndefault: an optional default value to provide if no values were emitted\n\nProducing\n\nStream of type <: Subscribable{L} where L refers to type of source stream\n\nExamples\n\nusing Rocket\n\nsource = from([ 1, 2, 3 ])\nsubscribe!(source |> last(), logger())\n;\n\n# output\n\n[LogActor] Data: 3\n[LogActor] Completed\n\n\nusing Rocket\n\nsource = from(Int[])\nsubscribe!(source |> last() |> catch_error((err, obs) -> of(1)), logger())\n;\n\n# output\n\n[LogActor] Data: 1\n[LogActor] Completed\n\nusing Rocket\n\nsource = from(Int[])\nsubscribe!(source |> last(default = 1), logger())\n;\n\n# output\n\n[LogActor] Data: 1\n[LogActor] Completed\n\nSee also: AbstractOperator, InferableOperator, ProxyObservable, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/filtering/last/#Description","page":"last","title":"Description","text":"","category":"section"},{"location":"operators/filtering/last/","page":"last","title":"last","text":"last operator returns an Observable that emits only the last item emitted by the source Observable.","category":"page"},{"location":"operators/filtering/last/#See-also","page":"last","title":"See also","text":"","category":"section"},{"location":"operators/filtering/last/","page":"last","title":"last","text":"Operators","category":"page"},{"location":"operators/utility/tap_on_subscribe/#operator_tap_on_subscribe","page":"tap_on_subscribe","title":"TapOnSubscribe Operator","text":"","category":"section"},{"location":"operators/utility/tap_on_subscribe/","page":"tap_on_subscribe","title":"tap_on_subscribe","text":"TapBeforeSubscription\nTapAfterSubscription\ntap_on_subscribe","category":"page"},{"location":"operators/utility/tap_on_subscribe/#Rocket.TapBeforeSubscription","page":"tap_on_subscribe","title":"Rocket.TapBeforeSubscription","text":"TapBeforeSubscription\n\nOne of the strategies for tap_on_subscribe operator. With TapBeforeSubscription tap callback will be called before actual subscription.\n\nSee also: tap_on_subscribe, TapAfterSubscription\n\n\n\n\n\n","category":"type"},{"location":"operators/utility/tap_on_subscribe/#Rocket.TapAfterSubscription","page":"tap_on_subscribe","title":"Rocket.TapAfterSubscription","text":"TapAfterSubscription\n\nOne of the strategies for tap_on_subscribe operator. With TapBeforeSubscription tap callback will be called after actual subscription.\n\nSee also: tap_on_subscribe, TapBeforeSubscription\n\n\n\n\n\n","category":"type"},{"location":"operators/utility/tap_on_subscribe/#Rocket.tap_on_subscribe","page":"tap_on_subscribe","title":"Rocket.tap_on_subscribe","text":"tap_on_subscribe(tapFn::F, strategy::S = TapBeforeSubscription()) where { F <: Function }\n\nCreates a tap operator, which performs a side effect on the subscription on the source Observable, but return an Observable that is identical to the source.\n\nArguments\n\ntapFn::Function: side-effect tap function with () -> Nothing signature\nstrategy: (optional), specifies the order of a side-effect and an actual subscription, uses TapBeforeSubscription by default\n\nProducing\n\nStream of type <: Subscribable{L} where L refers to type of source stream\n\nExamples\n\nusing Rocket\n\nsource = from([ 1, 2, 3 ])\nsubscribe!(source |> tap_on_subscribe(() -> println(\"Someone subscribed\")), logger())\n;\n\n# output\n\nSomeone subscribed\n[LogActor] Data: 1\n[LogActor] Data: 2\n[LogActor] Data: 3\n[LogActor] Completed\n\nusing Rocket\n\nsource = from([ 1, 2, 3 ])\nsubscribe!(source |> tap_on_subscribe(() -> println(\"Someone subscribed\"), TapAfterSubscription()), logger())\n;\n\n# output\n\n[LogActor] Data: 1\n[LogActor] Data: 2\n[LogActor] Data: 3\n[LogActor] Completed\nSomeone subscribed\n\nSee also: TapBeforeSubscription, TapAfterSubscription, tap, tap_on_unsubscribe, tap_on_complete, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/utility/tap_on_subscribe/#Description","page":"tap_on_subscribe","title":"Description","text":"","category":"section"},{"location":"operators/utility/tap_on_subscribe/","page":"tap_on_subscribe","title":"tap_on_subscribe","text":"Returns an Observable that resembles the source Observable, but modifies it so that the provided Observer is called to perform a side effect on subscription to the source.","category":"page"},{"location":"operators/utility/tap_on_subscribe/","page":"tap_on_subscribe","title":"tap_on_subscribe","text":"This operator is useful for debugging your Observables, verifying correctness, or performing other side effects.","category":"page"},{"location":"operators/utility/tap_on_subscribe/","page":"tap_on_subscribe","title":"tap_on_subscribe","text":"Note: this operator differs from a subscribe on the Observable. If the Observable returned by tap_on_subscribe is not subscribed, the side effects specified by the Observer will never happen. tap_on_subscribe therefore simply spies on future execution, it does not trigger an execution to happen like subscribe does.","category":"page"},{"location":"operators/utility/tap_on_subscribe/#See-also","page":"tap_on_subscribe","title":"See also","text":"","category":"section"},{"location":"operators/utility/tap_on_subscribe/","page":"tap_on_subscribe","title":"tap_on_subscribe","text":"Operators","category":"page"},{"location":"operators/utility/safe/#operator_safe","page":"safe","title":"Safe Operator","text":"","category":"section"},{"location":"operators/utility/safe/","page":"safe","title":"safe","text":"safe","category":"page"},{"location":"operators/utility/safe/#Rocket.safe","page":"safe","title":"Rocket.safe","text":"safe()\n\nCreates a SafeOperator, which wraps on_subscribe! and each next!, error! and complete! callbacks into try-catch block.\n\nProducing\n\nStream of type <: Subscribable{L} where L refers to type of source stream\n\nSee also: AbstractOperator, InferableOperator, ProxyObservable, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/utility/safe/#See-also","page":"safe","title":"See also","text":"","category":"section"},{"location":"operators/utility/safe/","page":"safe","title":"safe","text":"Operators","category":"page"},{"location":"operators/utility/skip_next/#operator_skip_next","page":"skip_next","title":"SkipNext Operator","text":"","category":"section"},{"location":"operators/utility/skip_next/","page":"skip_next","title":"skip_next","text":"skip_next","category":"page"},{"location":"operators/utility/skip_next/#Rocket.skip_next","page":"skip_next","title":"Rocket.skip_next","text":"skip_next()\n\nCreates a skip_next operator, which filters out all next messages by the source Observable by emitting only error and complete messages.\n\nProducing\n\nStream of type <: Subscribable{L} where L refers to type of source stream\n\nExamples\n\nusing Rocket\n\nsource = from([ 1, 2, 3 ])\nsubscribe!(source |> skip_next(), logger())\n;\n\n# output\n[LogActor] Completed\n\n\nSee also: AbstractOperator, InferableOperator, ProxyObservable, skip_error, skip_complete, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/utility/skip_next/#See-also","page":"skip_next","title":"See also","text":"","category":"section"},{"location":"operators/utility/skip_next/","page":"skip_next","title":"skip_next","text":"Operators","category":"page"},{"location":"operators/transformation/switch_map/#operator_switch_map","page":"switch_map","title":"SwitchMap Operator","text":"","category":"section"},{"location":"operators/transformation/switch_map/","page":"switch_map","title":"switch_map","text":"switch_map","category":"page"},{"location":"operators/transformation/switch_map/#Rocket.switch_map","page":"switch_map","title":"Rocket.switch_map","text":"switch_map(::Type{R}, mappingFn::F = identity) where { R, F <: Function }\n\nCreates a switch_map operator, which returns an Observable that emits items based on applying a function mappingFn that you supply to each item emitted by the source Observable, where that function returns an (so-called \"inner\") Observable. Each time it observes one of these inner Observables, the output Observable begins emitting the items emitted by that inner Observable. When a new inner Observable is emitted, switch_map stops emitting items from the earlier-emitted inner Observable and begins emitting items from the new one. It continues to behave like this for subsequent inner Observables.\n\nArguments\n\n::Type{R}: the type of data of output Observables after projection with mappingFn\nmappingFn::F: projection function with (data) -> Observable{R} signature\n\nProducing\n\nStream of type <: Subscribable{R}\n\nExamples\n\nusing Rocket\n\nsource = from([ of(1), of(2), of(3) ])\nsubscribe!(source |> switch_map(Int), logger())\n;\n\n# output\n\n[LogActor] Data: 1\n[LogActor] Data: 2\n[LogActor] Data: 3\n[LogActor] Completed\n\nusing Rocket\n\nsource = from([ 1, 2, 3 ])\nsubscribe!(source |> switch_map(Float64, (d) -> of(convert(Float64, d ^ 2))), logger())\n;\n\n# output\n\n[LogActor] Data: 1.0\n[LogActor] Data: 4.0\n[LogActor] Data: 9.0\n[LogActor] Completed\n\nSee also: AbstractOperator, RightTypedOperator, ProxyObservable, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/transformation/switch_map/#See-also","page":"switch_map","title":"See also","text":"","category":"section"},{"location":"operators/transformation/switch_map/","page":"switch_map","title":"switch_map","text":"Operators","category":"page"},{"location":"api/actors/#actors_api","page":"Actors","title":"Actors API","text":"","category":"section"},{"location":"api/actors/#How-to-create-a-custom-Actor","page":"Actors","title":"How to create a custom Actor","text":"","category":"section"},{"location":"api/actors/","page":"Actors","title":"Actors","text":"At first custom actor should implement a custom method for the as_actor function. Rocket.jl also provides a number of helper actor abstract types with predefined as_actor method behavior (see Traits API section).","category":"page"},{"location":"api/actors/","page":"Actors","title":"Actors","text":"using Rocket\n\nstruct MyCustomActor end\n\nas_actor(::Type{<:MyCustomActor}) = Rocket.BaseActorTrait{Int}()\n","category":"page"},{"location":"api/actors/","page":"Actors","title":"Actors","text":"or","category":"page"},{"location":"api/actors/","page":"Actors","title":"Actors","text":"using Rocket\n\nstruct MyCustomActor <: Actor{Int} end # Automatically specifies BaseActorTrait{Int} behavior.","category":"page"},{"location":"api/actors/","page":"Actors","title":"Actors","text":"Additionally custom actor must provide a custom methods for on_next!, on_error! and/or on_complete! functions. Depending on specified actor trait behavior some methods may or may not be optional.","category":"page"},{"location":"api/actors/","page":"Actors","title":"Actors","text":"using Rocket\n\nstruct MyCustomActor <: Actor{Int} end\n\nRocket.on_next!(actor::MyCustomActor, data::Int) = # custom logic here\nRocket.on_error!(actor::MyCustomActor, err) = # custom logic here\nRocket.on_complete!(actor::MyCustomActor) = # custom logic here","category":"page"},{"location":"api/actors/","page":"Actors","title":"Actors","text":"or","category":"page"},{"location":"api/actors/","page":"Actors","title":"Actors","text":"using Rocket\n\nstruct MyCustomCompletionActor <: CompletionActor{Int} end\n\nRocket.on_complete!(actor::MyCustomCompletionActor) = # custom logic here","category":"page"},{"location":"api/actors/#actors_api_traits","page":"Actors","title":"Traits","text":"","category":"section"},{"location":"api/actors/","page":"Actors","title":"Actors","text":"as_actor\nActorTrait\nBaseActorTrait\nNextActorTrait\nErrorActorTrait\nCompletionActorTrait\nInvalidActorTrait","category":"page"},{"location":"api/actors/#Rocket.as_actor","page":"Actors","title":"Rocket.as_actor","text":"as_actor(any)\n\nThis function checks actor trait behavior specification. May be used explicitly to specify actor trait behavior for any object.\n\nSee also: ActorTrait\n\n\n\n\n\n","category":"function"},{"location":"api/actors/#Rocket.ActorTrait","page":"Actors","title":"Rocket.ActorTrait","text":"Abstract type for all possible actor traits\n\nSee also: BaseActorTrait, NextActorTrait, ErrorActorTrait, CompletionActorTrait, InvalidActorTrait\n\n\n\n\n\n","category":"type"},{"location":"api/actors/#Rocket.BaseActorTrait","page":"Actors","title":"Rocket.BaseActorTrait","text":"Base actor trait specifies actor to listen for all next!, error! and complete! events. BaseActorTrait is a subtype of ActorTrait.\n\nSee also: Actor\n\n\n\n\n\n","category":"type"},{"location":"api/actors/#Rocket.NextActorTrait","page":"Actors","title":"Rocket.NextActorTrait","text":"Next actor trait specifies actor to listen for next! events only. NextActorTrait is a subtype of ActorTrait.\n\nSee also: NextActor\n\n\n\n\n\n","category":"type"},{"location":"api/actors/#Rocket.ErrorActorTrait","page":"Actors","title":"Rocket.ErrorActorTrait","text":"Error actor trait specifies actor to listen for error! events only. ErrorActorTrait is a subtype of ActorTrait.\n\nSee also: ErrorActor\n\n\n\n\n\n","category":"type"},{"location":"api/actors/#Rocket.CompletionActorTrait","page":"Actors","title":"Rocket.CompletionActorTrait","text":"Completion actor trait specifies actor to listen for complete! events only. CompletionActorTrait is a subtype of ActorTrait.\n\nSee also: CompletionActor\n\n\n\n\n\n","category":"type"},{"location":"api/actors/#Rocket.InvalidActorTrait","page":"Actors","title":"Rocket.InvalidActorTrait","text":"Default actor trait behavior for any object. Actor with such a trait specificaion cannot be used as a valid actor in subscribe! function. Doing so will raise an error. InvalidActorTrait is a subtype of ActorTrait.\n\nSee also: ActorTrait\n\n\n\n\n\n","category":"type"},{"location":"api/actors/#Types","page":"Actors","title":"Types","text":"","category":"section"},{"location":"api/actors/","page":"Actors","title":"Actors","text":"AbstractActor\nActor\nNextActor\nErrorActor\nCompletionActor","category":"page"},{"location":"api/actors/#Rocket.AbstractActor","page":"Actors","title":"Rocket.AbstractActor","text":"Supertype type for Actor, NextActor, ErrorActor and CompletionActor types.\n\nSee also: Actor, NextActor, ErrorActor, CompletionActor\n\n\n\n\n\n","category":"type"},{"location":"api/actors/#Rocket.Actor","page":"Actors","title":"Rocket.Actor","text":"Can be used as a super type for common actor. Automatically specifies a BaseActorTrait trait behavior. Every Actor must implement its own methods for on_next!(actor, data), on_error!(actor, err) and on_complete!(actor) functions. Actor is a subtype of AbstractActor type.\n\nExamples\n\nusing Rocket\n\nstruct MyActor <: Actor{String} end\n\nRocket.as_actor(MyActor)\n\n# output\n\nBaseActorTrait{String}()\n\nSee also: AbstractActor, as_actor, BaseActorTrait, ActorTrait, on_next!, on_error!, on_complete!\n\n\n\n\n\n","category":"type"},{"location":"api/actors/#Rocket.NextActor","page":"Actors","title":"Rocket.NextActor","text":"Can be used as a super type for \"next-only\" actor. Automatically specifies a NextActorTrait trait behavior. Every NextActor must implement its own methods for on_next!(actor, data) function only. NextActor is a subtype of AbstractActor type.\n\nExamples\n\nusing Rocket\n\nstruct MyNextActor <: NextActor{String} end\n\nRocket.as_actor(MyNextActor)\n\n# output\n\nNextActorTrait{String}()\n\nSee also: AbstractActor, as_actor, NextActorTrait, ActorTrait, on_next!\n\n\n\n\n\n","category":"type"},{"location":"api/actors/#Rocket.ErrorActor","page":"Actors","title":"Rocket.ErrorActor","text":"Can be used as a super type for \"error-only\" actor. Automatically specifies a ErrorActorTrait trait behavior. Every ErrorActor must implement its own methods for on_error!(actor, err) function only. ErrorActor is a subtype of AbstractActor type.\n\nExamples\n\nusing Rocket\n\nstruct MyErrorActor <: ErrorActor{String} end\n\nRocket.as_actor(MyErrorActor)\n\n# output\n\nErrorActorTrait{String}()\n\nSee also: AbstractActor, as_actor, ErrorActorTrait, ActorTrait, on_error!\n\n\n\n\n\n","category":"type"},{"location":"api/actors/#Rocket.CompletionActor","page":"Actors","title":"Rocket.CompletionActor","text":"Can be used as a super type for \"completion-only\" actor. Automatically specifies a CompletionActorTrait trait behavior. Every CompletionActor must implement its own methods for on_complete!(actor) function only. CompletionActor is a subtype of AbstractActor type.\n\nExamples\n\nusing Rocket\n\nstruct MyCompletionActor <: CompletionActor{String} end\n\nRocket.as_actor(MyCompletionActor)\n\n# output\n\nCompletionActorTrait{String}()\n\nSee also: AbstractActor, as_actor, CompletionActorTrait, ActorTrait, on_complete!\n\n\n\n\n\n","category":"type"},{"location":"api/actors/#Events","page":"Actors","title":"Events","text":"","category":"section"},{"location":"api/actors/","page":"Actors","title":"Actors","text":"next!\nerror!\ncomplete!","category":"page"},{"location":"api/actors/#Rocket.next!","page":"Actors","title":"Rocket.next!","text":"next!(actor, data)\nnext!(actor, data, scheduler)\n\nThis function is used to deliver a \"next\" event to an actor with some data. Takes optional scheduler object to schedule execution of data delivery.\n\nSee also: AbstractActor, on_next!\n\n\n\n\n\n","category":"function"},{"location":"api/actors/#Rocket.error!","page":"Actors","title":"Rocket.error!","text":"error!(actor, err)\nerror!(actor, err, scheduler)\n\nThis function is used to deliver a \"error\" event to an actor with some err. Takes optional scheduler object to schedule execution of error delivery.\n\nSee also: AbstractActor, on_error!\n\n\n\n\n\n","category":"function"},{"location":"api/actors/#Rocket.complete!","page":"Actors","title":"Rocket.complete!","text":"complete!(actor)\ncomplete!(actor, scheduler)\n\nThis function is used to deliver a \"complete\" event to an actor. Takes optional scheduler object to schedule execution of complete event delivery.\n\nSee also: AbstractActor, on_complete!\n\n\n\n\n\n","category":"function"},{"location":"api/actors/","page":"Actors","title":"Actors","text":"on_next!\non_error!\non_complete!","category":"page"},{"location":"api/actors/#Rocket.on_next!","page":"Actors","title":"Rocket.on_next!","text":"on_next!(actor, data)\n\nBoth Actor and NextActor objects must implement its own method for on_next! function which will be called on \"next\" event.\n\nSee also: Actor, NextActor\n\n\n\n\n\n","category":"function"},{"location":"api/actors/#Rocket.on_error!","page":"Actors","title":"Rocket.on_error!","text":"on_error!(actor, err)\n\nBoth Actor and ErrorActor objects must implement its own method for on_error! function which will be called on \"error\" event.\n\nSee also: Actor, ErrorActor\n\n\n\n\n\n","category":"function"},{"location":"api/actors/#Rocket.on_complete!","page":"Actors","title":"Rocket.on_complete!","text":"on_complete!(actor)\n\nBoth Actor and CompletionActor objects must implement its own method for on_complete! function which will be called on \"complete\" event.\n\nSee also: Actor, CompletionActor\n\n\n\n\n\n","category":"function"},{"location":"api/actors/#Factory","page":"Actors","title":"Factory","text":"","category":"section"},{"location":"api/actors/","page":"Actors","title":"Actors","text":"AbstractActorFactory\ncreate_actor\nMissingCreateActorFactoryImplementationError","category":"page"},{"location":"api/actors/#Rocket.AbstractActorFactory","page":"Actors","title":"Rocket.AbstractActorFactory","text":"Abstract type for all possible actor factories\n\nSee also: Actor\n\n\n\n\n\n","category":"type"},{"location":"api/actors/#Rocket.create_actor","page":"Actors","title":"Rocket.create_actor","text":"create_actor(::Type{L}, factory::F) where { L, F <: AbstractActorFactory }\n\nActor creator function for a given factory F. Should be implemented explicitly for any AbstractActorFactory object\n\nSee also: AbstractActorFactory, MissingCreateActorFactoryImplementationError\n\n\n\n\n\n","category":"function"},{"location":"api/actors/#Rocket.MissingCreateActorFactoryImplementationError","page":"Actors","title":"Rocket.MissingCreateActorFactoryImplementationError","text":"This error will be throw if Julia cannot find specific method of 'create_actor()' function for given actor factory\n\nSee also: AbstractActorFactory, create_actor\n\n\n\n\n\n","category":"type"},{"location":"api/actors/#Errors","page":"Actors","title":"Errors","text":"","category":"section"},{"location":"api/actors/","page":"Actors","title":"Actors","text":"InvalidActorTraitUsageError\nInconsistentSourceActorDataTypesError\nMissingDataArgumentInNextCall\nMissingErrorArgumentInErrorCall\nExtraArgumentInCompleteCall\nMissingOnNextImplementationError\nMissingOnErrorImplementationError\nMissingOnCompleteImplementationError","category":"page"},{"location":"api/actors/#Rocket.InvalidActorTraitUsageError","page":"Actors","title":"Rocket.InvalidActorTraitUsageError","text":"This error will be thrown if next!, error! or complete! functions are called with invalid actor object\n\nSee also: next!, error!, complete!, InvalidActorTrait\n\n\n\n\n\n","category":"type"},{"location":"api/actors/#Rocket.InconsistentSourceActorDataTypesError","page":"Actors","title":"Rocket.InconsistentSourceActorDataTypesError","text":"This error will be thrown if next! function is called with inconsistent data type\n\nSee also: AbstractActor, Subscribable, next!\n\n\n\n\n\n","category":"type"},{"location":"api/actors/#Rocket.MissingDataArgumentInNextCall","page":"Actors","title":"Rocket.MissingDataArgumentInNextCall","text":"This error will be thrown if next! function is called without data argument\n\nSee also: next!\n\n\n\n\n\n","category":"type"},{"location":"api/actors/#Rocket.MissingErrorArgumentInErrorCall","page":"Actors","title":"Rocket.MissingErrorArgumentInErrorCall","text":"This error will be thrown if error! function is called without err argument\n\nSee also: error!\n\n\n\n\n\n","category":"type"},{"location":"api/actors/#Rocket.ExtraArgumentInCompleteCall","page":"Actors","title":"Rocket.ExtraArgumentInCompleteCall","text":"This error will be thrown if complete! function is called with extra data/err argument\n\nSee also: complete!\n\n\n\n\n\n","category":"type"},{"location":"api/actors/#Rocket.MissingOnNextImplementationError","page":"Actors","title":"Rocket.MissingOnNextImplementationError","text":"This error will be thrown if Julia cannot find specific method of 'on_next!()' function for given actor and data\n\nSee also: on_next!\n\n\n\n\n\n","category":"type"},{"location":"api/actors/#Rocket.MissingOnErrorImplementationError","page":"Actors","title":"Rocket.MissingOnErrorImplementationError","text":"This error will be thrown if Julia cannot find specific method of 'on_error!()' function for given actor\n\nSee also: on_error!\n\n\n\n\n\n","category":"type"},{"location":"api/actors/#Rocket.MissingOnCompleteImplementationError","page":"Actors","title":"Rocket.MissingOnCompleteImplementationError","text":"This error will be thrown if Julia cannot find specific method of 'on_complete!()' function for given actor and data\n\nSee also: on_next!\n\n\n\n\n\n","category":"type"},{"location":"observables/types/array/#observable_array","page":"Array","title":"Array Observable","text":"","category":"section"},{"location":"observables/types/array/","page":"Array","title":"Array","text":"from","category":"page"},{"location":"observables/types/array/#Rocket.from","page":"Array","title":"Rocket.from","text":"from(x; scheduler::H = AsapScheduler()) where { H <: AbstractScheduler }\nfrom(a::Vector{D}; scheduler::H = AsapScheduler()) where { D, H <: AbstractScheduler }\n\nCreation operator for the ArrayObservable that emits either a single value if x has a Scalar trait specification or a collection of values if x has a NonScalar trait specification. Throws an ErrorException if x has UndefinedScalarness trait type. To specify scalarness for arbitrary type T some can implement an additional method for scalarness(::Type{<:MyType}) function and to specify scalarness behavior. Optionally accepts custom scheduler-like object to schedule messages delivery.\n\nArguments\n\nx: an object to be wrapped into array of values\nscheduler: optional, scheduler-like object\n\nFor an object x to be a valid input for a from operator it must implement Rocket.scalarness(::Type{ <: T }) method which should return either Rocket.Scalar or Rocket.NonScalar objects. In first case from operator will treat x as a single scalar value and will wrap it into a vector while in the second case from operator will convert x object into an array using collect function.\n\nFor arbitrary iterable objects consider using iterable creation operator.\n\nNote\n\nfrom operators creates a copy of x using collect on a given object.\n\nExamples\n\nusing Rocket\n\nsource = from([ 0, 1, 2 ])\nsubscribe!(source, logger())\n;\n\n# output\n\n[LogActor] Data: 0\n[LogActor] Data: 1\n[LogActor] Data: 2\n[LogActor] Completed\n\n\nusing Rocket\n\nsource = from(( 0, 1, 2 ))\nsubscribe!(source, logger())\n;\n\n# output\n\n[LogActor] Data: 0\n[LogActor] Data: 1\n[LogActor] Data: 2\n[LogActor] Completed\n\n\nusing Rocket\n\nsource = from(0)\nsubscribe!(source, logger())\n;\n\n# output\n\n[LogActor] Data: 0\n[LogActor] Completed\n\n\nusing Rocket\n\nsource = from(\"Hello, world!\")\nsubscribe!(source, logger())\n;\n\n# output\n\n[LogActor] Data: H\n[LogActor] Data: e\n[LogActor] Data: l\n[LogActor] Data: l\n[LogActor] Data: o\n[LogActor] Data: ,\n[LogActor] Data:\n[LogActor] Data: w\n[LogActor] Data: o\n[LogActor] Data: r\n[LogActor] Data: l\n[LogActor] Data: d\n[LogActor] Data: !\n[LogActor] Completed\n\n\nSee also: ArrayObservable, subscribe!, logger, iterable\n\n\n\n\n\n","category":"function"},{"location":"observables/types/array/","page":"Array","title":"Array","text":"ArrayObservable","category":"page"},{"location":"observables/types/array/#Rocket.ArrayObservable","page":"Array","title":"Rocket.ArrayObservable","text":"ArrayObservable{D, H}(values::Vector{D}, scheduler::H) where { D, H }\n\nArrayObservable wraps a regular Julia array into an observable. Uses scheduler object to schedule messages delivery.\n\nConstructor arguments\n\nvalues: array of values to be wrapped\nscheduler: Scheduler-like object\n\nSee also: Subscribable, from\n\n\n\n\n\n","category":"type"},{"location":"api/teardown/#teardown_api","page":"Teardown","title":"Teardown API","text":"","category":"section"},{"location":"api/teardown/","page":"Teardown","title":"Teardown","text":"Any subscription-like object should implement a valid teardown logic.","category":"page"},{"location":"api/teardown/#Example","page":"Teardown","title":"Example","text":"","category":"section"},{"location":"api/teardown/","page":"Teardown","title":"Teardown","text":"using Rocket\n\nstruct MuCustomSubscription <: Teardown\n # some fields here\nend\n\nRocket.as_teardown(::Type{<:MuCustomSubscription}) = UnsubscribableTeardownLogic()\n\nfunction on_unsubscribe!(subscription::MyCustomSubscription)\n # dispose resources here\nend","category":"page"},{"location":"api/teardown/#Traits","page":"Teardown","title":"Traits","text":"","category":"section"},{"location":"api/teardown/","page":"Teardown","title":"Teardown","text":"TeardownLogic\nas_teardown\nUnsubscribableTeardownLogic\non_unsubscribe!\nCallableTeardownLogic\nVoidTeardownLogic\nInvalidTeardownLogic","category":"page"},{"location":"api/teardown/#Rocket.TeardownLogic","page":"Teardown","title":"Rocket.TeardownLogic","text":"Abstract type for all possible teardown logic traits.\n\nSee also: UnsubscribableTeardownLogic, CallableTeardownLogic, VoidTeardownLogic, InvalidTeardownLogic\n\n\n\n\n\n","category":"type"},{"location":"api/teardown/#Rocket.as_teardown","page":"Teardown","title":"Rocket.as_teardown","text":"as_teardown(::Type)\n\nThis function checks teardown trait behavior specification. Should be used explicitly to specify teardown logic trait behavior for any object.\n\nExamples\n\nusing Rocket\n\nstruct MySubscription <: Teardown end\n\nRocket.as_teardown(::Type{<:MySubscription}) = UnsubscribableTeardownLogic()\nRocket.on_unsubscribe!(s::MySubscription) = println(\"Unsubscribed!\")\n\nsubscription = MySubscription()\nunsubscribe!(subscription)\n;\n\n# output\n\nUnsubscribed!\n\nSee also: Teardown, TeardownLogic\n\n\n\n\n\n","category":"function"},{"location":"api/teardown/#Rocket.UnsubscribableTeardownLogic","page":"Teardown","title":"Rocket.UnsubscribableTeardownLogic","text":"Unsubscribable teardown logic trait behavior. Unsubscribable teardown object must define its own method for on_unsubscribe!() function which will be invoked when actor decides to unsubscribe! from Observable.\n\nSee also: TeardownLogic, on_unsubscribe!, unsubscribe!\n\n\n\n\n\n","category":"type"},{"location":"api/teardown/#Rocket.on_unsubscribe!","page":"Teardown","title":"Rocket.on_unsubscribe!","text":"on_unsubscribe!(teardown)\n\nEach valid teardown object with UnsubscribableTeardownLogic trait behavior must implement its own method for on_unsubscribe!() function which will be invoked when actor decides to unsubscribe! from Observable.\n\nSee also: Teardown, TeardownLogic, UnsubscribableTeardownLogic\n\n\n\n\n\n","category":"function"},{"location":"api/teardown/#Rocket.CallableTeardownLogic","page":"Teardown","title":"Rocket.CallableTeardownLogic","text":"Callable teardown logic trait behavior. Callable teardown object must be callable (insert meme with a surprised Pikachu here).\n\nSee also: TeardownLogic, on_unsubscribe!, unsubscribe!\n\n\n\n\n\n","category":"type"},{"location":"api/teardown/#Rocket.VoidTeardownLogic","page":"Teardown","title":"Rocket.VoidTeardownLogic","text":"Void teardown logic trait behavior. Void teardown object does nothing in unsubscribe! and may not define any additional methods.\n\nSee also: TeardownLogic, on_unsubscribe!, unsubscribe!\n\n\n\n\n\n","category":"type"},{"location":"api/teardown/#Rocket.InvalidTeardownLogic","page":"Teardown","title":"Rocket.InvalidTeardownLogic","text":"Default teardown logic trait behavour. Invalid teardwon object cannot be used in unsubscribe! function. Doing so will raise an error.\n\nSee also: TeardownLogic, on_unsubscribe!, unsubscribe!\n\n\n\n\n\n","category":"type"},{"location":"api/teardown/#Types","page":"Teardown","title":"Types","text":"","category":"section"},{"location":"api/teardown/","page":"Teardown","title":"Teardown","text":"Teardown\nunsubscribe!","category":"page"},{"location":"api/teardown/#Rocket.Teardown","page":"Teardown","title":"Rocket.Teardown","text":"Abstract type for any teardown object. Each teardown object must be a subtype of Teardown.\n\nSee also: TeardownLogic\n\n\n\n\n\n","category":"type"},{"location":"api/teardown/#Rocket.unsubscribe!","page":"Teardown","title":"Rocket.unsubscribe!","text":"unsubscribe!(subscription)\nunsubscribe!(subscriptions::Tuple)\nunsubscribe!(subscriptions::AbstractVector)\n\nunsubscribe! function is used to cancel Observable execution and to dispose any kind of resources used during an Observable execution. If the input argument to the unsubscribe! function is either a tuple or a vector, it will first check that all of the arguments are valid subscription objects and if its true will unsubscribe from each of them individually. \n\nSee also: Teardown, TeardownLogic, on_unsubscribe!\n\n\n\n\n\n","category":"function"},{"location":"api/teardown/#Errors","page":"Teardown","title":"Errors","text":"","category":"section"},{"location":"api/teardown/","page":"Teardown","title":"Teardown","text":"InvalidTeardownLogicTraitUsageError\nInvalidMultipleTeardownLogicTraitUsageError\nMissingOnUnsubscribeImplementationError","category":"page"},{"location":"api/teardown/#Rocket.InvalidTeardownLogicTraitUsageError","page":"Teardown","title":"Rocket.InvalidTeardownLogicTraitUsageError","text":"This error will be thrown if unsubscribe! function is called with invalid teardown object.\n\nSee also: unsubscribe!\n\n\n\n\n\n","category":"type"},{"location":"api/teardown/#Rocket.InvalidMultipleTeardownLogicTraitUsageError","page":"Teardown","title":"Rocket.InvalidMultipleTeardownLogicTraitUsageError","text":"This error will be thrown if unsubscribe! function is called with a tuple with invalid teardown object in it.\n\nSee also: unsubscribe!\n\n\n\n\n\n","category":"type"},{"location":"api/teardown/#Rocket.MissingOnUnsubscribeImplementationError","page":"Teardown","title":"Rocket.MissingOnUnsubscribeImplementationError","text":"This error will be thrown if Julia cannot find specific method of on_unsubscribe!() function for given teardown object.\n\nSee also: on_unsubscribe!\n\n\n\n\n\n","category":"type"},{"location":"operators/transformation/accumulated/#operator_accumulated","page":"accumulated","title":"Accumulated Operator","text":"","category":"section"},{"location":"operators/transformation/accumulated/","page":"accumulated","title":"accumulated","text":"accumulated","category":"page"},{"location":"operators/transformation/accumulated/#Rocket.accumulated","page":"accumulated","title":"Rocket.accumulated","text":"accumulated()\n\nCreates an accumulated operator, which returns an Observable that emits the current item with all of the previous items emitted by the source Observable in one single ordered array.\n\nProducing\n\nStream of type <: Subscribable{Vector{L}} where L refers to type of source stream\n\nExamples\n\nusing Rocket\n\nsource = from([ 1, 2, 3 ])\nsubscribe!(source |> accumulated(), logger())\n;\n\n# output\n\n[LogActor] Data: [1]\n[LogActor] Data: [1, 2]\n[LogActor] Data: [1, 2, 3]\n[LogActor] Completed\n\n\nusing Rocket\n\nsource = of(1)\nsubscribe!(source |> accumulated(), logger())\n;\n\n# output\n\n[LogActor] Data: [1]\n[LogActor] Completed\n\nSee also: AbstractOperator, InferableOperator, ProxyObservable, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/transformation/accumulated/#Description","page":"accumulated","title":"Description","text":"","category":"section"},{"location":"operators/transformation/accumulated/","page":"accumulated","title":"accumulated","text":"Combines all values emitted by the source, using an accumulator function that joins a new source value with the all past values emmited into one single array. This is similar to scan with vcat accumulation function.","category":"page"},{"location":"operators/transformation/accumulated/#See-also","page":"accumulated","title":"See also","text":"","category":"section"},{"location":"operators/transformation/accumulated/","page":"accumulated","title":"accumulated","text":"Operators","category":"page"},{"location":"operators/mathematical/max/#operator_max","page":"max","title":"Max Operator","text":"","category":"section"},{"location":"operators/mathematical/max/","page":"max","title":"max","text":"max","category":"page"},{"location":"operators/mathematical/max/#Base.max","page":"max","title":"Base.max","text":"max(; from = nothing)\n\nCreates a max operator, which emits a single item: the item with the largest value.\n\nArguments\n\nfrom: optional initial maximum value, if nothing first item from the source will be used as initial instead\n\nProducing\n\nStream of type <: Subscribable{Union{L, Nothing}} where L refers to type of source stream\n\nExamples\n\nusing Rocket\n\nsource = from([ i for i in 1:42 ])\nsubscribe!(source |> max(), logger())\n;\n\n# output\n\n[LogActor] Data: 42\n[LogActor] Completed\n\n\nSee also: AbstractOperator, InferableOperator, ProxyObservable, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/mathematical/max/#Description","page":"max","title":"Description","text":"","category":"section"},{"location":"operators/mathematical/max/","page":"max","title":"max","text":"The max operator operates on an Observable of similar objects. When the source Observable completes, it emits the item with the largest value.","category":"page"},{"location":"operators/mathematical/max/#See-also","page":"max","title":"See also","text":"","category":"section"},{"location":"operators/mathematical/max/","page":"max","title":"max","text":"Operators","category":"page"},{"location":"operators/errors/catch_error/#operator_catch_error","page":"catch_error","title":"Catch Error Operator","text":"","category":"section"},{"location":"operators/errors/catch_error/","page":"catch_error","title":"catch_error","text":"catch_error","category":"page"},{"location":"operators/errors/catch_error/#Rocket.catch_error","page":"catch_error","title":"Rocket.catch_error","text":"catch_error(selectorFn::F) where F\n\nCreates a CatchErrorOperator, which catches errors on the observable to be handled by returning a new observable or throwing an error.\n\nArguments:\n\nselectorFn::F: a callable object that takes as arguments err, which is the error, and caught, which is the source observable, in case you'd like to \"retry\" that observable by returning it again. Whatever observable is returned by the selector will be used to continue the observable chain.\n\nProducing\n\nStream of type <: Subscribable{L} where L refers to type of source stream\n\nExamples\n\nusing Rocket\n\nsource = from(1:5) |> safe() |> map(Int, (d) -> d == 4 ? error(4) : d) |> catch_error((err, obs) -> of(1))\n\nsubscribe!(source, logger())\n;\n\n# output\n[LogActor] Data: 1\n[LogActor] Data: 2\n[LogActor] Data: 3\n[LogActor] Data: 1\n[LogActor] Completed\n\nSee also: AbstractOperator, InferableOperator, rerun, logger, safe\n\n\n\n\n\n","category":"function"},{"location":"operators/errors/catch_error/#See-also","page":"catch_error","title":"See also","text":"","category":"section"},{"location":"operators/errors/catch_error/","page":"catch_error","title":"catch_error","text":"Operators","category":"page"},{"location":"operators/about/#section_operators","page":"Operator","title":"Operators","text":"","category":"section"},{"location":"operators/about/","page":"Operator","title":"Operator","text":"Even though the Observable is the foundation, reactive extensions are mostly useful because of their operators. Operators are the essential pieces that allow complex asynchronous code to be easily composed in a declarative manner.","category":"page"},{"location":"operators/about/#what_are_operators","page":"Operator","title":"What are operators?","text":"","category":"section"},{"location":"operators/about/","page":"Operator","title":"Operator","text":"There are two kinds of operators:","category":"page"},{"location":"operators/about/#Pipeable-operators","page":"Operator","title":"Pipeable operators","text":"","category":"section"},{"location":"operators/about/","page":"Operator","title":"Operator","text":"Pipeable Operators are the kind that can be piped to Observables using the syntax source |> operator(). These include the filter() and map() operators. When called, operators do not change the existing Observable instance. Instead, they return a new Observable, whose subscription logic is based on the first Observable.","category":"page"},{"location":"operators/about/","page":"Operator","title":"Operator","text":"note: Note\nA Pipeable Operator is a function that takes an Observable as its input and returns another Observable. It is a pure operation: the previous Observable remains unmodified.","category":"page"},{"location":"operators/about/","page":"Operator","title":"Operator","text":"A Pipeable Operator is essentially a pure callable object that accepts one Observable as input and returns another Observable as output. Subscribing to the output Observable will also subscribe to the input Observable.","category":"page"},{"location":"operators/about/","page":"Operator","title":"Operator","text":"For example, the operator called map() is analogous to the Array method of the same name. Just like the array method map((d) -> d ^ 2, [ 1, 2, 3 ]) yields [ 1, 4, 9 ], the Observable emits 1, 4, 9:","category":"page"},{"location":"operators/about/","page":"Operator","title":"Operator","text":"source = from([ 1, 2, 3 ])\nsubscribe!(source |> map(Int, (d) -> d ^ 2), lambda(\n on_next = (d) -> println(d)\n))\n\n// Logs:\n// 1\n// 4\n// 9","category":"page"},{"location":"operators/about/","page":"Operator","title":"Operator","text":"Another useful operator is first():","category":"page"},{"location":"operators/about/","page":"Operator","title":"Operator","text":"source = from([ 1, 2, 3 ])\nsubscribe!(source |> first(), lambda(\n on_next = (d) -> println(d),\n on_complete = () -> \"Completed\"\n))\n\n// Logs:\n// 1\n// Completed","category":"page"},{"location":"operators/about/#Creation-operators","page":"Operator","title":"Creation operators","text":"","category":"section"},{"location":"operators/about/","page":"Operator","title":"Operator","text":"Distinct from pipeable operators, creation operators are functions that can be used to create an Observable with some common predefined behavior or by joining other Observables. For example: from([ 1, 2, 3 ]) creates an observable that will sequentially emit 1, 2, and 3.","category":"page"},{"location":"operators/about/","page":"Operator","title":"Operator","text":"source = from([ 1, 2, 3 ])\nsubscribe!(source, lambda(\n on_next = (d) -> println(\"Value: $d\"),\n on_error = (e) -> println(\"Oh no, error: $e\")\n on_complete = () -> println(\"Completed\")\n))\n\n// Logs:\n// Value: 1\n// Value: 2\n// Value: 3\n// Completed","category":"page"},{"location":"operators/about/#Operators-piping","page":"Operator","title":"Operators piping","text":"","category":"section"},{"location":"operators/about/","page":"Operator","title":"Operator","text":"Pipeable operators are special objects that can be used like ordinary functions with on_call!(operator, source). In practice however they tend to accumulate and quickly grow unreadable: on_call!(operator1, on_call!(operator2, on_call!(operator3, source))). Therefore, Rocket.jl overloads |> for operators and Observables:","category":"page"},{"location":"operators/about/","page":"Operator","title":"Operator","text":"using Rocket\n\nsource = from(1:100) |> filter((d) -> d % 2 === 0) |> map(Int, (d) -> d ^ 2) |> sum()\n\nsubscribe!(source, logger())\n\n// Logs\n// [LogActor] Data: 171700\n// [LogActor] Completed","category":"page"},{"location":"operators/about/","page":"Operator","title":"Operator","text":"It is also possible to create an operator composition with + or |>. It might be useful to create an alias for some often used operator chain","category":"page"},{"location":"operators/about/","page":"Operator","title":"Operator","text":"using Rocket\n\nmapAndFilter = map(Int, d -> d ^ 2) + filter(d -> d % 2 == 0) \n\nsource = from(1:5) |> mapAndFilter\n\nsubscribe!(source, logger())\n\n// Logs\n// [LogActor] Data: 4\n// [LogActor] Data: 16\n// [LogActor] Completed\n\nmapAndFilterAndSum = mapAndFilter + sum()\n\nsource = from(1:5) |> mapAndFilterAndSum\n\nsubscribe!(source, logger())\n\n// Logs\n// [LogActor] Data: 20\n// [LogActor] Completed","category":"page"},{"location":"operators/about/","page":"Operator","title":"Operator","text":"For stylistic reasons, on_call!(operator, source) is never used in practice - even if there is only one operator. Instead, source |> operator() is generally preferred.","category":"page"},{"location":"observables/types/iterable/#observable_iterable","page":"Iterable","title":"Iterable Observable","text":"","category":"section"},{"location":"observables/types/iterable/","page":"Iterable","title":"Iterable","text":"iterable","category":"page"},{"location":"observables/types/iterable/#Rocket.iterable","page":"Iterable","title":"Rocket.iterable","text":"iterable(iterator; scheduler::H = AsapScheduler()) where { H <: AbstractScheduler }\n\nCreation operator for the IterableObservable that wraps given iterator into an observable object.\n\nArguments\n\niterator: an iterator object to be wrapped an observable\nscheduler: optional, scheduler-like object\n\nNote\n\niterable operators does not create a copy of iterator. Any changes in the iterator object might be visible in the created observable. For side-effects free behavior consider using from creation operator which creates a copy of a given object with a collect function.\n\nExamples\n\nusing Rocket\n\nsource = iterable([ 0, 1, 2 ])\nsubscribe!(source, logger())\n;\n\n# output\n\n[LogActor] Data: 0\n[LogActor] Data: 1\n[LogActor] Data: 2\n[LogActor] Completed\n\nusing Rocket\n\nsource = iterable(\"Hello\")\nsubscribe!(source, logger())\n;\n\n# output\n\n[LogActor] Data: H\n[LogActor] Data: e\n[LogActor] Data: l\n[LogActor] Data: l\n[LogActor] Data: o\n[LogActor] Completed\n\nSee also: ScheduledSubscribable, subscribe!, from\n\n\n\n\n\n","category":"function"},{"location":"observables/types/generate/#observable_generate","page":"Generate","title":"Generate Observable","text":"","category":"section"},{"location":"observables/types/generate/","page":"Generate","title":"Generate","text":"generate","category":"page"},{"location":"observables/types/generate/#Rocket.generate","page":"Generate","title":"Rocket.generate","text":"generate(initial::D, condition::C, iterator::I; scheduler::H = AsapScheduler()) where { D, C, I, H <: AbstractScheduler }\n\nGenerates an observable sequence by running a state-driven loop producing the sequence's elements, using the specified scheduler to send out observer messages.\n\nArguments\n\ninitial: initial state\ncondition: condition to terminate generation (upon returning false)\niterator: iteration step function\nscheduler: optional, scheduler-like object\n\nNote\n\niterator object should return objects of the same type as initial.\n\nExamples\n\nusing Rocket\n\nsource = generate(1, x -> x < 3, x -> x + 1)\nsubscribe!(source, logger())\n;\n\n# output\n[LogActor] Data: 1\n[LogActor] Data: 2\n[LogActor] Completed\n\nSee also: ScheduledSubscribable, subscribe!\n\n\n\n\n\n","category":"function"},{"location":"operators/filtering/ignore/#operator_ignore","page":"ignore","title":"Ignore operator","text":"","category":"section"},{"location":"operators/filtering/ignore/","page":"ignore","title":"ignore","text":"ignore","category":"page"},{"location":"operators/filtering/ignore/#Rocket.ignore","page":"ignore","title":"Rocket.ignore","text":"ignore(count::Int)\n\nCreates a ignore operator, which returns an Observable that skips the first count items emitted by the source Observable.\n\nArguments\n\ncount::Int: the number of times, items emitted by source Observable should be skipped.\n\nProducing\n\nStream of type <: Subscribable{L} where L refers to type of source stream\n\nExamples\n\nusing Rocket\n\nsource = from(1:5)\n\nsubscribe!(source |> ignore(2), logger())\n;\n\n# output\n\n[LogActor] Data: 3\n[LogActor] Data: 4\n[LogActor] Data: 5\n[LogActor] Completed\n\nSee also: AbstractOperator, InferableOperator, ProxyObservable, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/filtering/ignore/#See-also","page":"ignore","title":"See also","text":"","category":"section"},{"location":"operators/filtering/ignore/","page":"ignore","title":"ignore","text":"Operators","category":"page"},{"location":"subjects/types/replay/#subject_replay","page":"Replay","title":"ReplaySubject","text":"","category":"section"},{"location":"subjects/types/replay/","page":"Replay","title":"Replay","text":"ReplaySubject\nReplaySubjectFactory","category":"page"},{"location":"subjects/types/replay/#Rocket.ReplaySubject","page":"Replay","title":"Rocket.ReplaySubject","text":"ReplaySubject(::Type{D}, size::Int) where D\nReplaySubject(::Type{D}, size::Int, factory::F) where { D, F <: AbstractSubjectFactory }\nReplaySubject(::Type{D}, size::Int, subject::S) where { D, S }\n\nA variant of Subject that \"replays\" or emits old values to new subscribers. It buffers a set number of values and will emit those values immediately to any new subscribers in addition to emitting new values to existing subscribers.\n\nSee also: ReplaySubjectFactory, Subject, SubjectFactory\n\n\n\n\n\n","category":"function"},{"location":"subjects/types/replay/#Rocket.ReplaySubjectFactory","page":"Replay","title":"Rocket.ReplaySubjectFactory","text":"ReplaySubjectFactory(size::Int, factory::F) where { F <: AbstractSubjectFactory }\nReplaySubjectFactory(size::Int; scheduler::H = AsapScheduler()) where { H <: AbstractScheduler }\n\nA variant of SubjectFactory that creates an instance of ReplaySubject.\n\nSee also: SubjectFactory, AbstractSubjectFactory, ReplaySubject, Subject\n\n\n\n\n\n","category":"function"},{"location":"subjects/types/replay/#Description","page":"Replay","title":"Description","text":"","category":"section"},{"location":"subjects/types/replay/","page":"Replay","title":"Replay","text":"A ReplaySubject is similar to a BehaviorSubject in that it can send old values to new subscribers, but it can also record a part of the Observable execution.","category":"page"},{"location":"subjects/types/replay/","page":"Replay","title":"Replay","text":"note: Note\nA ReplaySubject records multiple values from the Observable execution and replays them to new subscribers.","category":"page"},{"location":"subjects/types/replay/#Examples","page":"Replay","title":"Examples","text":"","category":"section"},{"location":"subjects/types/replay/","page":"Replay","title":"Replay","text":"When creating a ReplaySubject, you can specify how many values to replay:","category":"page"},{"location":"subjects/types/replay/","page":"Replay","title":"Replay","text":"using Rocket\n\nsubject = ReplaySubject(Int, 3) # buffer 3 values for new subscribers\n\nsubscription1 = subscribe!(subject, logger(\"1\"))\n\nnext!(subject, 1)\nnext!(subject, 2)\nnext!(subject, 3)\nnext!(subject, 4)\n\nsubscription2 = subscribe!(subject, logger(\"2\"))\n\nnext!(subject, 5)\n\nunsubscribe!(subscription1)\nunsubscribe!(subscription2)\n\n// Logs\n// [1] Data: 1\n// [1] Data: 2\n// [1] Data: 3\n// [1] Data: 4\n// [2] Data: 2\n// [2] Data: 3\n// [2] Data: 4\n// [1] Data: 5\n// [2] Data: 5","category":"page"},{"location":"observables/about/#section_observables","page":"Observable","title":"Observables","text":"","category":"section"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"Observables are lazy Push collections of multiple values. They fill the missing spot in the following table:","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"Type Single Multiple\nPull Function Iterator\nPush Promise Observable","category":"page"},{"location":"observables/about/#First-example","page":"Observable","title":"First example","text":"","category":"section"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"For example, the following code specifies an Observable that pushes the values 1, 2, 3 immediately (synchronously) when subscribed to, and the value 4 after one second has passed since subscription.","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"using Rocket\n\nsource = make(Int) do actor\n next!(actor, 1)\n next!(actor, 2)\n next!(actor, 3)\n setTimeout(1000) do\n next!(actor, 4)\n complete!(actor)\n end\nend","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"To invoke the Observable and inspect these values, we need to subscribe to it. It is important to note that observables are lazy collections which means they don't emit anything until someone subscribes to it. Every subscription spawns its own independent execution of observable. There are some exceptions to this rule, e.g. Subjects and some operators (share(), etc..) which may change this behaviour","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"using Rocket\n\nsource = make(Int) do actor\n next!(actor, 1)\n next!(actor, 2)\n next!(actor, 3)\n setTimeout(1000) do\n next!(actor, 4)\n complete!(actor)\n end\nend\n\nprintln(\"Just before subscribe\")\nsubscribe!(source, lambda(\n on_next = (d) -> println(d),\n on_complete = () -> println(\"Completed\")\n))\nprintln(\"Just after subscribe\")\n\n# Logs\n# Just before subscribe\n# 1\n# 2\n# 3\n# Just after subscribe\n# 4\n# Completed","category":"page"},{"location":"observables/about/#Pull-vs-Push","page":"Observable","title":"Pull vs Push","text":"","category":"section"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"Pull and Push are two different protocols that describe how a data Producer communicates with a data Consumer.","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"In a Pull system, the Consumer determines when it receives data from the Producer. The Producer itself is unaware of when the data are delivered to the Consumer.","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"Every Julia Function is a Pull system. The function is a Producer of data, and the code that calls the function is consuming data by \"pulling\" a return value from the call.","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"Type PRODUCER CONSUMER\nPull Passive: produces data when requested. Active: decides when data is requested.\nPush Active: produces data at its own pace. Passive: reacts to received data.","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"In Push systems, the Producer determines when to send data to the Consumer. The Consumer is unaware of when it will receive that data.","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"Futures and promises are the most common type of Push systems today. A Promise (the Producer) delivers a resolved value to registered callbacks (the Consumers). Unlike functions, it is the Promise that determines precisely when a value is \"pushed\" to the callbacks.","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"Rocket.jl introduces Observables, a new Push system for Julia. An Observable is a Producer of multiple values, \"pushing\" them to Observers (Consumers or Actors).","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"A Function is a lazily evaluated computation that synchronously returns a single value on invocation.\nA Generator is a lazily evaluated computation that synchronously returns zero to (potentially) infinite values on iteration.\nA Promise is a computation that may (or may not) eventually return a single value.\nAn Observable is a lazily evaluated computation that can synchronously or asynchronously return zero to (potentially) infinite values from the time it's invoked.","category":"page"},{"location":"observables/about/#Observables-as-generalizations-of-functions","page":"Observable","title":"Observables as generalizations of functions","text":"","category":"section"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"In contrast to functions, Observables can \"return\" multiple values over time. For example, functions can't do this:","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"function foo()\n println(\"Hello!\")\n return 0\n return 1 # Dead code, will never happen\nend","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"Observables, however, can do this:","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"using Rocket\n\nfoo = make(Int) do actor\n next!(actor, 0)\n next!(actor, 1)\n complete!(actor)\nend\n","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"Observables can also \"return\" values asynchronously after some time:","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"using Rocket\n\nfoo = make(Int) do actor\n setTimeout(1000) do\n next!(actor, 0)\n complete!(actor)\n end\nend","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"Assume we have a function foo and some observable:","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"Function call foo(args...) means \"give me one value synchronously\" (pull strategy)\nIn contrast subscription to an observable with subscribe(observable, ...) means \"notify me about any amount of values, either synchronously or asynchronously\" (push strategy)","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"When a new value is available in an observable we say that the observable emits or generates an update. Values that are generated by an observable are sometimes also called future values, because there is no principled way to predict when an observable will generate a new value. In some programming languages, observables are referred to as generators or streams and we will use all three terms interchangeably.","category":"page"},{"location":"observables/about/#Anatomy-of-an-Observable","page":"Observable","title":"Anatomy of an Observable","text":"","category":"section"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"Observables are (1) created using creation operators (it is also possible to build an Observable from scratch with custom logic); (2) subscribed to with an Actor; (3) execute to deliver next! / error! / complete! notifications to the Actor, and (4) their execution may be disposed. These four aspects are all encoded in an Observable instance, but some of these aspects are related to other types, such as Subscribable and Subscription.","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"The core responsibilities of an Observable are:","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"Creating Observables\nSubscribing to Observables\nExecuting the Observable\nDisposing Observables","category":"page"},{"location":"observables/about/#Creating-Observables","page":"Observable","title":"Creating Observables","text":"","category":"section"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"You can create an Observable in various ways using Creation operators. You can also build an Observable from scratch. To see how you can build an Observable with custom logic, consult the API Section.","category":"page"},{"location":"observables/about/#Subscribing-to-Observables","page":"Observable","title":"Subscribing to Observables","text":"","category":"section"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"The Observable source in the example can be subscribed to.","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"using Rocket\n\nsubscribe!(source, lambda(\n on_next = (d) -> println(d)\n))","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"This example shows how subscribe calls are not shared among multiple Actors of the same Observable. When calling subscribe! with an Actor, the function on_subscribe! that is attached to this particular Observable is executed for that given actor. Each call to subscribe! triggers its own independent setup for that given actor.","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"note: Note\nSubscribing to an Observable is like calling a function, providing callbacks where the data will be delivered to.","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"The subscribe! function also supports multiple subscriptions at once. If the input argument to the subscribe! function is a tuple or a vector, it will first check that all of the arguments are valid source objects and actors and if its true will subscribe from each of them individually.","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"\nsource1 = Subject(Int)\nsource2 = Subject(Int)\n\nsubscriptions = subscribe!([\n (source1, logger()),\n (source2, logger()),\n])\n\n# Later on\n# unsubscribe!(subscriptions)\n","category":"page"},{"location":"observables/about/#Executing-Observables","page":"Observable","title":"Executing Observables","text":"","category":"section"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"The execution produces multiple values over time, either synchronously or asynchronously.","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"An Observable Execution can deliver three types of notifications:","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"Next: sends a value, such as an Int, String, Dict, etc.;\nError: sends any error as a value;\nComplete: does not send a value.","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"\"Next\" notifications are the most important and most common type: they represent actual data being delivered to an subscriber. \"Error\" and \"Complete\" notifications terminate the Observable Execution.","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"note: Note\nIn an Observable Execution, any number of Next notifications may be delivered. However, once a single Error or Complete notification is delivered, nothing else can be delivered afterwards.","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"The following is an example of an Observable execution that delivers three Next notifications and subsequently completes:","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"using Rocket\n\nsource = make(Int) do actor\n next!(actor, 1)\n next!(actor, 2)\n next!(actor, 3)\n complete!(actor)\nend\n\n# or the same with creation operator\n\nsource = from([ 1, 2, 3 ])","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"It is advised to wrap any code in subscribe by a try/catch block that delivers an Error notification upon an exception:","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"using Rocket\n\nsource = make(Int) do actor\n try\n next!(actor, 1)\n next!(actor, 2)\n next!(actor, 3)\n complete!(actor)\n catch e\n error!(actor, e)\n end\nend\n","category":"page"},{"location":"observables/about/#Disposing-Observable-Executions","page":"Observable","title":"Disposing Observable Executions","text":"","category":"section"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"It is common for an Actor to abort execution of an Observable Execution. Once the Actor is done receiving values, it may stop the execution in order to free computation power or memory resources.","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"When subscribe! is called, the Actor gets attached to the newly created Observable execution. This call also returns an object, the Subscription:","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"subscription = subscribe!(source, actor)","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"The Subscription represents the ongoing execution, and has a minimal API that allows you to cancel the execution. Read more about Subscription type here.","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"With","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"unsubscribe!(subscription)","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"you can cancel the ongoing execution.","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"note: Note\nsubscribe! returns a Subscription that represents the ongoing execution. Simply call unsubscribe! on the Subscription to cancel the execution.","category":"page"},{"location":"actors/types/circularkeep/#actor_circularkeep","page":"CircularKeep","title":"CircularKeep actor","text":"","category":"section"},{"location":"actors/types/circularkeep/","page":"CircularKeep","title":"CircularKeep","text":"circularkeep","category":"page"},{"location":"actors/types/circularkeep/#Rocket.circularkeep","page":"CircularKeep","title":"Rocket.circularkeep","text":"circularkeep(::Type{T}, capacity::Int) where T\n\nArguments\n\n::Type{T}: Type of keep data\ncapacity::Int: circular buffer capacity\n\nCreation operator for the CircularKeepActor actor.\n\nExamples\n\nusing Rocket\n\nactor = circularkeep(Int, 3)\nactor isa CircularKeepActor{Int}\n\n# output\ntrue\n\nSee also: CircularKeepActor, AbstractActor\n\n\n\n\n\n","category":"function"},{"location":"actors/types/circularkeep/","page":"CircularKeep","title":"CircularKeep","text":"CircularKeepActor","category":"page"},{"location":"actors/types/circularkeep/#Rocket.CircularKeepActor","page":"CircularKeep","title":"Rocket.CircularKeepActor","text":"CirucalKeepActor{D}() where D\n\nCircual keep actor is similar to keep actor, but uses CircularBuffer as a storage. It saves all incoming successful next events in a values circular buffer, throws an ErrorException on error! event and does nothing on completion event.\n\nExamples\n\nusing Rocket\n\nsource = from(1:5)\nactor = circularkeep(Int, 3)\n\nsubscribe!(source, actor)\nshow(getvalues(actor))\n\n# output\n[3, 4, 5]\n\nSee also: Actor, keep, circularkeep\n\n\n\n\n\n","category":"type"},{"location":"operators/utility/default_if_empty/#operator_ref_default_if_empty","page":"default_if_empty","title":"DefaultIfEmpty Operator","text":"","category":"section"},{"location":"operators/utility/default_if_empty/","page":"default_if_empty","title":"default_if_empty","text":"default_if_empty","category":"page"},{"location":"operators/utility/default_if_empty/#Rocket.default_if_empty","page":"default_if_empty","title":"Rocket.default_if_empty","text":"default_if_empty(value::T)\ndefault_if_empty(callback::Function)\n\nCreates a default_if_empty operator, which emits a given value if the source Observable completes without emitting any next value, otherwise mirrors the source Observable. Optionally accepts a zero-argument callback that will be executed to generate default value. Note: Callback function's output is always converted to the eltype of the original observable.\n\nusing Rocket\n\nsource = completed(Int) |> default_if_empty(0)\n\nsubscribe!(source, logger())\n;\n\n# output\n[LogActor] Data: 0\n[LogActor] Completed\n\nusing Rocket\n\nsource = completed(Int) |> default_if_empty(() -> 42)\n\nsubscribe!(source, logger())\n;\n\n# output\n[LogActor] Data: 42\n[LogActor] Completed\n\nSee also: AbstractOperator, InferableOperator, logger, map\n\n\n\n\n\n","category":"function"},{"location":"operators/utility/default_if_empty/#Description","page":"default_if_empty","title":"Description","text":"","category":"section"},{"location":"operators/utility/default_if_empty/","page":"default_if_empty","title":"default_if_empty","text":"default_if_empty emits the values emitted by the source Observable or a specified default value if the source Observable is empty (completes without having emitted any next value).","category":"page"},{"location":"operators/utility/default_if_empty/#See-also","page":"default_if_empty","title":"See also","text":"","category":"section"},{"location":"operators/utility/default_if_empty/","page":"default_if_empty","title":"default_if_empty","text":"Operators","category":"page"},{"location":"observables/types/never/#observable_never","page":"Never","title":"Never Observable","text":"","category":"section"},{"location":"observables/types/never/","page":"Never","title":"Never","text":"never","category":"page"},{"location":"observables/types/never/#Rocket.never","page":"Never","title":"Rocket.never","text":"never(T = Any)\n\nCreation operator for the NeverObservable that emits neither values nor errors nor the completion notification. It can be used for testing purposes or for composing with other Observables. Please note that by never emitting a complete notification, this Observable keeps the subscription from being disposed automatically. Subscriptions need to be manually disposed.\n\nArguments\n\nT: Type of Observable data, optional, Any is the default\n\nExamples\n\nusing Rocket\n\nsource = never()\nsubscribe!(source, logger())\n;\n\n# output\n\n\nSee also: NeverObservable, subscribe!, logger\n\n\n\n\n\n","category":"function"},{"location":"observables/types/never/","page":"Never","title":"Never","text":"NeverObservable","category":"page"},{"location":"observables/types/never/#Rocket.NeverObservable","page":"Never","title":"Rocket.NeverObservable","text":"NeverObservable{D}()\n\nAn Observable that emits no items to the Observer and never completes.\n\nType parameters\n\nD: Type of Observable data\n\nSee also: Subscribable, never\n\n\n\n\n\n","category":"type"},{"location":"operators/utility/about/#Utility-category","page":"About utility operators","title":"Utility category","text":"","category":"section"},{"location":"operators/utility/about/","page":"About utility operators","title":"About utility operators","text":"There are operators for different purposes, and they may be categorized as: creation, transformation, filtering, joining, multicasting, error handling, utility, etc. In the following list you will find all the operators organized in utility category.","category":"page"},{"location":"operators/utility/about/","page":"About utility operators","title":"About utility operators","text":"tap\ntap_on_subscribe\ntap_on_unsubscribe\ntap_on_complete\ndelay\nsafe\nnoop\nref_count\nasync\ndefault_if_empty\nerror_if_empty\nskip_next\nskip_error\nskip_complete\ndiscontinue\nlimit_subscribers","category":"page"},{"location":"operators/utility/about/#See-also","page":"About utility operators","title":"See also","text":"","category":"section"},{"location":"operators/utility/about/","page":"About utility operators","title":"About utility operators","text":"Operators","category":"page"},{"location":"operators/all/#operators_list","page":"All","title":"List of all available operators","text":"","category":"section"},{"location":"operators/all/","page":"All","title":"All","text":"There are operators for different purposes, and they may be categorized as: creation, transformation, filtering, joining, multicasting, error handling, utility, etc.","category":"page"},{"location":"operators/all/#Creation-operators","page":"All","title":"Creation operators","text":"","category":"section"},{"location":"operators/all/","page":"All","title":"All","text":"make\nof\nfrom\niterable\nfaulted\nnever\ncompleted\ntimer\ninterval\nproxy\nfile\ncombined\nrace\nconnectable\nmerged\nconcat\ngenerate\nnetwork\ndefer\nzipped","category":"page"},{"location":"operators/all/#Transformation-operators","page":"All","title":"Transformation operators","text":"","category":"section"},{"location":"operators/all/","page":"All","title":"All","text":"map\nmap_to\nscan\naccumulated\nenumerate\nuppercase\nlowercase\nto_array\nswitch_map\nswitch_map_to\nmerge_map\nconcat_map\nconcat_map_to\nexhaust_map\nstart_with\npairwise\nsubstitute\noverride","category":"page"},{"location":"operators/all/#Filtering-operators","page":"All","title":"Filtering operators","text":"","category":"section"},{"location":"operators/all/","page":"All","title":"All","text":"filter\nfilter_type\nsome\ntake\ntake_until\nfirst\nlast\nfind\nfind_index\nignore","category":"page"},{"location":"operators/all/#Mathematical-and-Aggregate-operators","page":"All","title":"Mathematical and Aggregate operators","text":"","category":"section"},{"location":"operators/all/","page":"All","title":"All","text":"count\nmax\nmin\nreduce\nsum","category":"page"},{"location":"operators/all/#Error-handling-operators","page":"All","title":"Error handling operators","text":"","category":"section"},{"location":"operators/all/","page":"All","title":"All","text":"catch_error\nrerun\nerror_if\nerror_if_not","category":"page"},{"location":"operators/all/#Join-operator","page":"All","title":"Join operator","text":"","category":"section"},{"location":"operators/all/","page":"All","title":"All","text":"with_latest","category":"page"},{"location":"operators/all/#Multicasting-operators","page":"All","title":"Multicasting operators","text":"","category":"section"},{"location":"operators/all/","page":"All","title":"All","text":"multicast\npublish\npublish_behavior\npublish_replay\nshare\nshare_replay","category":"page"},{"location":"operators/all/#Utility-operators","page":"All","title":"Utility operators","text":"","category":"section"},{"location":"operators/all/","page":"All","title":"All","text":"tap\ntap_on_subscribe\ntap_on_unsubscribe\ntap_on_complete\ndelay\nsafe\nnoop\nref_count\nasync\ndefault_if_empty\nerror_if_empty\nskip_next\nskip_error\nskip_complete\ndiscontinue\nlimit_subscribers","category":"page"},{"location":"observables/types/concat/#observable_concat","page":"Concat","title":"Concat Observable","text":"","category":"section"},{"location":"observables/types/concat/","page":"Concat","title":"Concat","text":"concat","category":"page"},{"location":"observables/types/concat/#Rocket.concat","page":"Concat","title":"Rocket.concat","text":"concat(sources...)\nconcat(sources::S) where { S <: Tuple }\n\nCombines multiple Observables to create an Observable which sequentially emits all values from given Observable and then moves on to the next. All values of each passed Observable merged into a single Observable, in order, in serial fashion.\n\nArguments\n\nsources: input sources\n\nExamples\n\nusing Rocket\n\nsource1 = of(1)\nsource2 = of(2)\n\nsubscribe!(concat(source1, source2), logger())\n;\n\n# output\n[LogActor] Data: 1\n[LogActor] Data: 2\n[LogActor] Completed\n\nusing Rocket\n\nsource1 = of(1) |> async()\nsource2 = of(2)\n\nsubscribe!(concat(source1, source2), logger())\n;\n\n# output\n[LogActor] Data: 1\n[LogActor] Data: 2\n[LogActor] Completed\n\nSee also: Subscribable, subscribe!\n\n\n\n\n\n","category":"function"},{"location":"observables/types/labeled/#observable_labeled","page":"Labeled","title":"Labeled Observable","text":"","category":"section"},{"location":"observables/types/labeled/","page":"Labeled","title":"Labeled","text":"labeled","category":"page"},{"location":"observables/types/labeled/#Rocket.labeled","page":"Labeled","title":"Rocket.labeled","text":"labeled(names::Val, stream)\n\nCreation operator for the LabeledObservable that wraps given stream, that produces Tuple values into a NamedTuple with given names.\n\nArguments\n\nnames: a Val object that contains a tuple of symbols\nstream: an observable that emits a Tuple, length of the Tuple events must be equal to the length of the names argument\n\nExamples\n\nusing Rocket\n\nsource = labeled(Val((:x, :y)), from([ (1, 2), (2, 3), (3, 4) ]))\nsubscribe!(source, logger())\n;\n\n# output\n\n[LogActor] Data: (x = 1, y = 2)\n[LogActor] Data: (x = 2, y = 3)\n[LogActor] Data: (x = 3, y = 4)\n[LogActor] Completed\n\nSee also: ScheduledSubscribable, subscribe!, from\n\n\n\n\n\n","category":"function"},{"location":"observables/types/labeled/","page":"Labeled","title":"Labeled","text":"LabeledObservable","category":"page"},{"location":"observables/types/labeled/#Rocket.LabeledObservable","page":"Labeled","title":"Rocket.LabeledObservable","text":"LabeledObservable{D, S}()\n\nAn Observable that emits NamesTuple items from a source Observable that emits Tuple items.\n\nSee also: Subscribable, labeled\n\n\n\n\n\n","category":"type"},{"location":"actors/types/lambda/#actor_lambda","page":"Lambda","title":"Lambda actor","text":"","category":"section"},{"location":"actors/types/lambda/","page":"Lambda","title":"Lambda","text":"lambda","category":"page"},{"location":"actors/types/lambda/#Rocket.lambda","page":"Lambda","title":"Rocket.lambda","text":"lambda(; on_next = nothing, on_error = nothing, on_complete = nothing)\nlambda(::Type{T}; on_next = nothing, on_error = nothing, on_complete = nothing) where T\n\nCreation operator for the 'LambdaActor' actor.\n\nExamples\n\nusing Rocket\n\nactor = lambda(Int; on_next = (d) -> println(d))\nactor isa LambdaActor{Int}\n\n# output\ntrue\n\nSee also: LambdaActor, AbstractActor\n\n\n\n\n\n","category":"function"},{"location":"actors/types/lambda/","page":"Lambda","title":"Lambda","text":"LambdaActor","category":"page"},{"location":"actors/types/lambda/#Rocket.LambdaActor","page":"Lambda","title":"Rocket.LambdaActor","text":"LambdaActor{D, N, E, C}(on_next::N, on_error::E, on_complete::C) where D\n\nLambda actor wraps on_next, on_error, on_complete callbacks for data, error and complete events. Should not be used explicitly, use lambda creation operator instead.\n\nConstructor arguments\n\non_next: Callback for data event. Optional. Default is nothing.\non_error: Callback for error event. Optional. Default is nothing.\non_complete: Callback for complete event. Optional. Default is nothing.\n\nSee also: Actor, lambda\n\n\n\n\n\n","category":"type"},{"location":"operators/utility/error_if_empty/#operator_ref_error_if_empty","page":"error_if_empty","title":"ErrorIfEmpty Operator","text":"","category":"section"},{"location":"operators/utility/error_if_empty/","page":"error_if_empty","title":"error_if_empty","text":"error_if_empty","category":"page"},{"location":"operators/utility/error_if_empty/#Rocket.error_if_empty","page":"error_if_empty","title":"Rocket.error_if_empty","text":"error_if_empty(err)\n\nCreates a error_if_empty operator, which emits a given error if the source Observable completes without emitting any next value, otherwise mirrors the source Observable.\n\nusing Rocket\n\nsource = completed(Int) |> error_if_empty(\"Empty\")\n\nsubscribe!(source, logger())\n;\n\n# output\n[LogActor] Error: Empty\n\nSee also: AbstractOperator, InferableOperator, logger, map\n\n\n\n\n\n","category":"function"},{"location":"operators/utility/error_if_empty/#Description","page":"error_if_empty","title":"Description","text":"","category":"section"},{"location":"operators/utility/error_if_empty/","page":"error_if_empty","title":"error_if_empty","text":"error_if_empty emits the values emitted by the source Observable or a specified error message if the source Observable is empty (completes without having emitted any next value).","category":"page"},{"location":"operators/utility/error_if_empty/#See-also","page":"error_if_empty","title":"See also","text":"","category":"section"},{"location":"operators/utility/error_if_empty/","page":"error_if_empty","title":"error_if_empty","text":"Operators","category":"page"},{"location":"subjects/types/subject/#subject","page":"Subject","title":"Subject","text":"","category":"section"},{"location":"subjects/types/subject/","page":"Subject","title":"Subject","text":"Subject\nSubjectFactory","category":"page"},{"location":"subjects/types/subject/#Rocket.Subject","page":"Subject","title":"Rocket.Subject","text":"Subject(::Type{D}; scheduler::H = AsapScheduler())\n\nA Subject is a special type of Observable that allows values to be multicasted to many Observers. Subjects are like EventEmitters. Every Subject is an Observable and an Actor. You can subscribe to a Subject, and you can call next! to feed values as well as error! and complete!.\n\nNote: By convention, every actor subscribed to a Subject observable is not allowed to throw exceptions during next!, error! and complete! calls. Doing so would lead to undefined behaviour. Use safe() operator to bypass this rule. \n\nSee also: SubjectFactory, ReplaySubject, BehaviorSubject, safe\n\n\n\n\n\n","category":"type"},{"location":"subjects/types/subject/#Rocket.SubjectFactory","page":"Subject","title":"Rocket.SubjectFactory","text":"SubjectFactory(scheduler::H) where { H <: AbstractScheduler }\n\nA base subject factory that creates an instance of Subject with specified scheduler.\n\nSee also: AbstractSubjectFactory, Subject\n\n\n\n\n\n","category":"type"},{"location":"subjects/types/subject/#Description","page":"Subject","title":"Description","text":"","category":"section"},{"location":"subjects/types/subject/","page":"Subject","title":"Subject","text":"Every Subject is an Observable. Given a Subject, you can subscribe to it, providing an Actor, which will start receiving values normally. From the perspective of the Observer, it cannot tell whether the Observable execution is coming from a plain unicast Observable or a Subject.","category":"page"},{"location":"subjects/types/subject/","page":"Subject","title":"Subject","text":"Internally to the Subject, subscribe does not invoke a new execution that delivers values. It simply registers the given Observer in a list of Observers.","category":"page"},{"location":"subjects/types/subject/","page":"Subject","title":"Subject","text":"Every Subject is an Actor. It is an object with the methods next!, error!, and complete!. To feed a new value to the Subject, just call next!(subject, theValue), and it will be multicasted to the Actors registered to listen to the Subject.","category":"page"},{"location":"subjects/types/subject/","page":"Subject","title":"Subject","text":"note: Note\nBy convention, every actor subscribed to a Subject observable is not allowed to throw exceptions during next!, error! and complete! calls. Doing so would lead to undefined behaviour. Use safe() operator to bypass this rule. ","category":"page"},{"location":"subjects/types/subject/#Examples","page":"Subject","title":"Examples","text":"","category":"section"},{"location":"subjects/types/subject/","page":"Subject","title":"Subject","text":"In the following example, the BehaviorSubject is initialized with the value 0 which the first Observer receives when it subscribes. The second Observer receives the value 2 even though it subscribed after the value 2 was sent.","category":"page"},{"location":"subjects/types/subject/","page":"Subject","title":"Subject","text":"using Rocket\n\nsubject = Subject(Int)\n\nsubscription1 = subscribe!(subject, logger(\"1\"))\n\nnext!(subject, 1)\nnext!(subject, 2)\n\nsubscription2 = subscribe!(subject, logger(\"2\"))\n\nnext!(subject, 3)\n\nunsubscribe!(subscription1)\nunsubscribe!(subscription2)\n\n// Logs\n// [1] Data: 1\n// [1] Data: 2\n// [1] Data: 3\n// [2] Data: 3","category":"page"},{"location":"utils/#Utils","page":"Utils","title":"Utils","text":"","category":"section"},{"location":"utils/","page":"Utils","title":"Utils","text":"setTimeout\nRocket.combined_type\nRocket.union_type","category":"page"},{"location":"utils/#Rocket.setTimeout","page":"Utils","title":"Rocket.setTimeout","text":"setTimeout(f::Function, timeout::Int)\n\nCreates a Task which will asynchornously invoke fucntion f after specified timeout time in milliseconds.\n\nArguments\n\nf::Function, function to be invoked asynchronously\ntimeout::Int, timeout in milliseconds\n\nExamples\n\nusing Rocket\nusing Dates\n\nprintln(\"Before: \", Dates.format(now(), \"MM:SS\"))\nsetTimeout(1000) do\n println(\"Inside: \", Dates.format(now(), \"MM:SS\"))\nend\nprintln(\"Right after: \", Dates.format(now(), \"MM:SS\"))\n;\n\n# Logs\n# Before: 20:59\n# Right after: 20:59\n# Inside: 21:00\n\n\n\n\n\n","category":"function"},{"location":"utils/#Rocket.combined_type","page":"Utils","title":"Rocket.combined_type","text":"combined_type(sources)\n\nReturns a Tuple el-type of observable el-types in sources argument in the same order\n\n\n\n\n\n","category":"function"},{"location":"utils/#Rocket.union_type","page":"Utils","title":"Rocket.union_type","text":"union_type(sources)\n\nReturns a Union el-type of observable el-types in sources argument\n\n\n\n\n\n","category":"function"},{"location":"utils/#Helpers","page":"Utils","title":"Helpers","text":"","category":"section"},{"location":"utils/","page":"Utils","title":"Utils","text":"Rocket.@MStorage\nRocket.setstorage!","category":"page"},{"location":"utils/#Rocket.@MStorage","page":"Utils","title":"Rocket.@MStorage","text":"@MStorage(n::Int)\n\nHelper function to generate tuple-like structure MStorageN, but with mutable fields and empty constructor. It is possible then to take a snapshot(::MStorage) which returns a tuple with the same types and values from storage. Some operators and observables use pregenerated MStorage to instatiate uninitialized mutable storage in case when stream is allowed to not emit any values before completion.\n\nGenerated structure layout\n\nstruct MStorageN{V1, V2, ..., VN}\n v1 :: V1\n v2 :: V2\n ...\n vn :: VN\nend\n\nSee also: setstorage!\n\n\n\n\n\n","category":"macro"},{"location":"utils/#Rocket.setstorage!","page":"Utils","title":"Rocket.setstorage!","text":"setstorage!(s, v, ::Val{I}) where I\n\nThis function can be used to set a new value v for storage s with a given value v and index I. Using parametrized Val{I} for indexing ensures for index to be resolved at compile-time and if-else branch optimization.\n\nSee also: @MStorage\n\n\n\n\n\n","category":"function"},{"location":"observables/types/completed/#observable_completed","page":"Completed","title":"Completed Observable","text":"","category":"section"},{"location":"observables/types/completed/","page":"Completed","title":"Completed","text":"completed","category":"page"},{"location":"observables/types/completed/#Rocket.completed","page":"Completed","title":"Rocket.completed","text":"completed(::Type{T} = Any; scheduler::H = AsapScheduler()) where { T, H <: AbstractScheduler }\n\nCreation operator for the CompletedObservable that emits no items to the Actor and immediately sends a complete notification on subscription.\n\nArguments\n\nT: type of output data source, optional, Any is the default\nscheduler: optional, scheduler-like object\n\nExamples\n\nusing Rocket\n\nsource = completed(Int)\nsubscribe!(source, logger())\n;\n\n# output\n\n[LogActor] Completed\n\n\nSee also: CompletedObservable, subscribe!, logger\n\n\n\n\n\n","category":"function"},{"location":"observables/types/completed/","page":"Completed","title":"Completed","text":"CompletedObservable","category":"page"},{"location":"observables/types/completed/#Rocket.CompletedObservable","page":"Completed","title":"Rocket.CompletedObservable","text":"CompletedObservable{D, H}(scheduler::H)\n\nObservable that emits no items to the Actor and just sends a complete notification on subscription.\n\nConstructor arguments\n\nscheduler: Scheduler-like object\n\nSee also: Subscribable, completed\n\n\n\n\n\n","category":"type"},{"location":"operators/utility/tap/#operator_tap","page":"tap","title":"Tap Operator","text":"","category":"section"},{"location":"operators/utility/tap/","page":"tap","title":"tap","text":"tap","category":"page"},{"location":"operators/utility/tap/#Rocket.tap","page":"tap","title":"Rocket.tap","text":"tap(tapFn::F) where { F <: Function }\n\nCreates a tap operator, which performs a side effect for every emission on the source Observable, but return an Observable that is identical to the source.\n\nArguments\n\ntapFn::Function: side-effect tap function with (data) -> Nothing signature\n\nProducing\n\nStream of type <: Subscribable{L} where L refers to type of source stream\n\nExamples\n\nusing Rocket\n\nsource = from([ 1, 2, 3 ])\nsubscribe!(source |> tap((d) -> println(\"In tap: $d\")), logger())\n;\n\n# output\n\nIn tap: 1\n[LogActor] Data: 1\nIn tap: 2\n[LogActor] Data: 2\nIn tap: 3\n[LogActor] Data: 3\n[LogActor] Completed\n\n\nSee also: tap_on_subscribe, tap_on_complete, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/utility/tap/#Description","page":"tap","title":"Description","text":"","category":"section"},{"location":"operators/utility/tap/","page":"tap","title":"tap","text":"Returns an Observable that resembles the source Observable, but modifies it so that the provided Observer is called to perform a side effect for every value emitted by the source.","category":"page"},{"location":"operators/utility/tap/","page":"tap","title":"tap","text":"This operator is useful for debugging your Observables, verifying correct values, or performing other side effects.","category":"page"},{"location":"operators/utility/tap/","page":"tap","title":"tap","text":"Note: this operator differs from a subscribe on the Observable. If the Observable returned by tap is not subscribed, the side effects specified by the Observer will never happen. tap therefore simply spies on existing execution, it does not trigger an execution to happen like subscribe does.","category":"page"},{"location":"operators/utility/tap/#See-also","page":"tap","title":"See also","text":"","category":"section"},{"location":"operators/utility/tap/","page":"tap","title":"tap","text":"Operators","category":"page"},{"location":"observables/types/network/#observable_network","page":"Network","title":"Network Observable","text":"","category":"section"},{"location":"observables/types/network/","page":"Network","title":"Network","text":"network","category":"page"},{"location":"observables/types/network/#Rocket.network","page":"Network","title":"Rocket.network","text":"network(::Type{D}, port::Int) where D\nnetwork(::Type{D}, address::A, port::Int) where { D, A <: IPAddr }\n\nnetwork(::Type{Vector{D}}, port::Int, buffer_size::Int) where D\nnetwork(::Type{Vector{D}}, address::A, port::Int, buffer_size::Int) where { D, A <: IPAddr }\n\nCreation operator for the NetworkObservable that emits messages from the server with specified address and port arguments.\n\nSee also: NetworkObservable, subscribe!\n\n\n\n\n\n","category":"function"},{"location":"observables/types/network/","page":"Network","title":"Network","text":"NetworkObservable","category":"page"},{"location":"observables/types/network/#Rocket.NetworkObservable","page":"Network","title":"Rocket.NetworkObservable","text":"NetworkObservable{D, Address, Port, S}()\n\nNetworkObservable listens for the messages of type D from remote server with specified Address and Port parameters.\n\nSee also: network, Subscribable\n\n\n\n\n\n","category":"type"},{"location":"observables/types/function/#observable_function","page":"Function","title":"Function Observable","text":"","category":"section"},{"location":"observables/types/function/","page":"Function","title":"Function","text":"make","category":"page"},{"location":"observables/types/function/#Rocket.make","page":"Function","title":"Rocket.make","text":"make(f::Function, type::Type{D})\n\nCreation operator for the FunctionObservable.\n\nArguments\n\nf: function to be invoked on subscription\ntype: type of data in observable\n\nExamples\n\nusing Rocket\n\nsource = make(Int) do actor\n next!(actor, 0)\n complete!(actor)\nend\n\nsubscription = subscribe!(source, logger());\nunsubscribe!(subscription)\n;\n\n# output\n\n[LogActor] Data: 0\n[LogActor] Completed\n\n\nusing Rocket\n\nsource = make(Int) do actor\n next!(actor, 0)\n setTimeout(100) do\n next!(actor, 1)\n complete!(actor)\n end\nend\n\nsubscription = subscribe!(source, logger())\nunsubscribe!(subscription)\n;\n\n# output\n\n[LogActor] Data: 0\n\nSee also: FunctionObservable, subscribe!, logger\n\n\n\n\n\n","category":"function"},{"location":"observables/types/function/","page":"Function","title":"Function","text":"FunctionObservable","category":"page"},{"location":"observables/types/function/#Rocket.FunctionObservable","page":"Function","title":"Rocket.FunctionObservable","text":"FunctionObservable{D}(f::F)\n\nFunctionObservable wraps a callback f, which is called when the Observable is initially subscribed to. This function is given an Actor, to which new values can be nexted (with next!(actor, data)), or an error! method can be called to raise an error, or complete! can be called to notify of a successful completion.\n\nArguments\n\nf::F: function to be invoked on subscription\n\nSee also: Subscribable, make\n\n\n\n\n\n","category":"type"},{"location":"observables/types/race/#observable_race","page":"Race","title":"Race Observable","text":"","category":"section"},{"location":"observables/types/race/","page":"Race","title":"Race","text":"race","category":"page"},{"location":"observables/types/race/#Rocket.race","page":"Race","title":"Rocket.race","text":"race(sources...)\nrace(sources::S) where { S <: Tuple }\n\nCombines multiple Observables to create an Observable that mirrors the output of the first Observable to emit an item. Essentially it subscribes to the observable that was the first to start emitting.\n\nArguments\n\nsources: input sources\n\nExamples\n\nusing Rocket\n\nsource1 = of(1)\nsource2 = of(2)\n\nsubscribe!(race(source1, source2), logger())\n;\n\n# output\n[LogActor] Data: 1\n[LogActor] Completed\n\nusing Rocket\n\nsource1 = of(1) |> async()\nsource2 = of(2)\n\nsubscribe!(race(source1, source2), logger())\n;\n\n# output\n[LogActor] Data: 2\n[LogActor] Completed\n\nSee also: Subscribable, subscribe!\n\n\n\n\n\n","category":"function"},{"location":"operators/transformation/concat_map_to/#operator_concat_map_to","page":"concat_map_to","title":"ConcatMapTo Operator","text":"","category":"section"},{"location":"operators/transformation/concat_map_to/","page":"concat_map_to","title":"concat_map_to","text":"concat_map_to","category":"page"},{"location":"operators/transformation/concat_map_to/#Rocket.concat_map_to","page":"concat_map_to","title":"Rocket.concat_map_to","text":"switch_map_to(inner_observable)\n\nCreates a switch_map_to operator, which returns an observable of values merged together by joining the passed observable with itself, one after the other, for each value emitted from the source. Essentially it projects each source value to the same Observable which is merged multiple times in a serialized fashion on the output Observable.\n\nArguments\n\ninner_observable: an Observable to replace each value from the source Observable.\n\nProducing\n\nStream of type <: Subscribable{R} where R refers to the eltype of inner_observable\n\nExamples\n\nusing Rocket\n\nsource = from([ 0, 0, 0 ])\nsubscribe!(source |> concat_map_to(from([ 1, 2, 3 ])), logger())\n;\n\n# output\n\n[LogActor] Data: 1\n[LogActor] Data: 2\n[LogActor] Data: 3\n[LogActor] Data: 1\n[LogActor] Data: 2\n[LogActor] Data: 3\n[LogActor] Data: 1\n[LogActor] Data: 2\n[LogActor] Data: 3\n[LogActor] Completed\n\nSee also: concat_map, AbstractOperator, RightTypedOperator, ProxyObservable, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/transformation/concat_map_to/","page":"concat_map_to","title":"concat_map_to","text":"note: Note\nconcat_map_to is equivalent to concat_map with mappingFn set to (_) -> inner_observable.","category":"page"},{"location":"operators/transformation/concat_map_to/#See-also","page":"concat_map_to","title":"See also","text":"","category":"section"},{"location":"operators/transformation/concat_map_to/","page":"concat_map_to","title":"concat_map_to","text":"Operators, concat_map","category":"page"},{"location":"operators/errors/error_if_not/#operator_error_if_not","page":"error_if_not","title":"Error If Not Operator","text":"","category":"section"},{"location":"operators/errors/error_if_not/","page":"error_if_not","title":"error_if_not","text":"Note: error_if_not is an alias for error_if operator with inverted checkFn.","category":"page"},{"location":"operators/errors/error_if_not/","page":"error_if_not","title":"error_if_not","text":"error_if_not","category":"page"},{"location":"operators/errors/error_if_not/#Rocket.error_if_not","page":"error_if_not","title":"Rocket.error_if_not","text":"error_if_not(checkFn, errorFn)\n\nCreates an error_if_not operator, which performs a check for every emission on the source Observable with checkFn. If checkFn returns false, the operator sends an error event and unsubscribes from the observable.\n\nNote: error_if_not is an alias for error_if operator with inverted checkFn.\n\nArguments\n\ncheckFn: check function with (data) -> Bool signature\nerrorFn: error object generating function with (data) -> Any signature, optional\n\nProducing\n\nStream of type <: Subscribable{L} where L refers to type of source stream\n\nExamples\n\nusing Rocket\n\nsource = from([1, 2, 3]) |> error_if_not((data) -> data < 2, (data) -> \"CustomError\")\n\nsubscription = subscribe!(source, lambda(\n on_next = (d) -> println(\"Next: \", d),\n on_error = (e) -> println(\"Error: \", e),\n on_complete = () -> println(\"Completed\")\n))\n;\n\n# output\nNext: 1\nError: CustomError\n\nSee also: error_if, error_if_empty, default_if_empty, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/errors/error_if_not/#See-also","page":"error_if_not","title":"See also","text":"","category":"section"},{"location":"operators/errors/error_if_not/","page":"error_if_not","title":"error_if_not","text":"Operators","category":"page"},{"location":"todo/#TODO","page":"TODO","title":"TODO","text":"","category":"section"},{"location":"todo/","page":"TODO","title":"TODO","text":"This package in under development and some features of the reactive framework not yet implemented.","category":"page"},{"location":"operators/mathematical/count/#operator_count","page":"count","title":"Count Operator","text":"","category":"section"},{"location":"operators/mathematical/count/","page":"count","title":"count","text":"count","category":"page"},{"location":"operators/mathematical/count/#Base.count","page":"count","title":"Base.count","text":"count()\n\nCreates a count operator, which counts the number of emissions on the source and emits that number when the source completes.\n\nProducing\n\nStream of type <: Subscribable{Int}\n\nExamples\n\nusing Rocket\n\nsource = from([ i for i in 1:42 ])\nsubscribe!(source |> count(), logger())\n;\n\n# output\n\n[LogActor] Data: 42\n[LogActor] Completed\n\n\nSee also: AbstractOperator, RightTypedOperator, ProxyObservable, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/mathematical/count/#Description","page":"count","title":"Description","text":"","category":"section"},{"location":"operators/mathematical/count/","page":"count","title":"count","text":"count transforms an Observable that emits values into an Observable that emits a single value that represents the number of values emitted by the source Observable. If the source Observable terminates with an error, count will pass this error notification along without emitting a value first. If the source Observable does not terminate at all, count will neither emit a value nor terminate.","category":"page"},{"location":"operators/mathematical/count/#Example","page":"count","title":"Example","text":"","category":"section"},{"location":"operators/mathematical/count/","page":"count","title":"count","text":"Counts how many values source Observable have emitted before the complete event happened","category":"page"},{"location":"operators/mathematical/count/","page":"count","title":"count","text":"using Rocket\n\nsource = from([ i for i in 1:42 ])\nsubscribe!(source |> count(), logger())\n\n# output\n\n[LogActor] Data: 42\n[LogActor] Completed","category":"page"},{"location":"operators/mathematical/count/#See-also","page":"count","title":"See also","text":"","category":"section"},{"location":"operators/mathematical/count/","page":"count","title":"count","text":"Operators","category":"page"},{"location":"operators/transformation/map_to/#operator_map_to","page":"map_to","title":"MapTo Operator","text":"","category":"section"},{"location":"operators/transformation/map_to/","page":"map_to","title":"map_to","text":"map_to","category":"page"},{"location":"operators/transformation/map_to/#Rocket.map_to","page":"map_to","title":"Rocket.map_to","text":"map_to(value::T) where T\n\nCreates a map operator, which emits the given constant value on the output Observable every time the source Observable emits a value.\n\nArguments\n\nvalue::T: the constant value to map each source value to\n\nProducing\n\nStream of type <: Subscribable{T}\n\nExamples\n\nusing Rocket\n\nsource = from([ 1, 2, 3 ])\nsubscribe!(source |> map_to('a'), logger())\n;\n\n# output\n\n[LogActor] Data: a\n[LogActor] Data: a\n[LogActor] Data: a\n[LogActor] Completed\n\nSee also: map, AbstractOperator, RightTypedOperator, ProxyObservable, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/transformation/map_to/#Description","page":"map_to","title":"Description","text":"","category":"section"},{"location":"operators/transformation/map_to/","page":"map_to","title":"map_to","text":"Takes a constant value as argument, and emits that whenever the source Observable emits a value. In other words, ignores the actual source value, and simply uses the emission moment to know when to emit the given value.","category":"page"},{"location":"operators/transformation/map_to/#See-also","page":"map_to","title":"See also","text":"","category":"section"},{"location":"operators/transformation/map_to/","page":"map_to","title":"map_to","text":"Operators","category":"page"},{"location":"observables/types/merged/#observable_merged","page":"Merged","title":"Merged Observable","text":"","category":"section"},{"location":"observables/types/merged/","page":"Merged","title":"Merged","text":"merged","category":"page"},{"location":"observables/types/merged/#Rocket.merged","page":"Merged","title":"Rocket.merged","text":"merged(sources::T) where { T <: Tuple }\n\nCreation operator for the MergeObservable with a given sources collected in a tuple. merge subscribes to each given input Observable (as arguments), and simply forwards (without doing any transformation) all the values from all the input Observables to the output Observable. The output Observable only completes once all input Observables have completed. Any error delivered by an input Observable will be immediately emitted on the output Observable.\n\nExamples\n\nusing Rocket\n\nobservable = merged((from(1:4), of(2.0), from(\"Hello\")))\n\nsubscribe!(observable, logger())\n;\n\n# output\n[LogActor] Data: 1\n[LogActor] Data: 2\n[LogActor] Data: 3\n[LogActor] Data: 4\n[LogActor] Data: 2.0\n[LogActor] Data: H\n[LogActor] Data: e\n[LogActor] Data: l\n[LogActor] Data: l\n[LogActor] Data: o\n[LogActor] Completed\n\nusing Rocket\n\nsubject = Subject(Int, scheduler = AsyncScheduler())\n\nobservable = merged((subject, of(2.0), from(\"Hello\")))\n\nactor = sync(logger())\n\nsubscribe!(observable, actor)\n\nsetTimeout(200) do\n next!(subject, 1)\n complete!(subject)\nend\n\nwait(actor)\n;\n\n# output\n[LogActor] Data: 2.0\n[LogActor] Data: H\n[LogActor] Data: e\n[LogActor] Data: l\n[LogActor] Data: l\n[LogActor] Data: o\n[LogActor] Data: 1\n[LogActor] Completed\n\nSee also: Subscribable\n\n\n\n\n\n","category":"function"},{"location":"operators/transformation/uppercase/#operator_uppercase","page":"uppercase","title":"Uppercase Operator","text":"","category":"section"},{"location":"operators/transformation/uppercase/","page":"uppercase","title":"uppercase","text":"uppercase","category":"page"},{"location":"operators/transformation/uppercase/#Base.Unicode.uppercase","page":"uppercase","title":"Base.Unicode.uppercase","text":"uppercase()\n\nCreates an uppercase operator, which forces each value to be in upper case\n\nProducing\n\nStream of type <: Subscribable{L} where L referes to type of data of input Observable\n\nExamples\n\nusing Rocket\n\nsource = of(\"Hello, world!\")\nsubscribe!(source |> uppercase(), logger())\n;\n\n# output\n\n[LogActor] Data: HELLO, WORLD!\n[LogActor] Completed\n\nSee also: AbstractOperator, InferableOperator, ProxyObservable, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/transformation/uppercase/#See-also","page":"uppercase","title":"See also","text":"","category":"section"},{"location":"operators/transformation/uppercase/","page":"uppercase","title":"uppercase","text":"Operators, map, lowercase","category":"page"},{"location":"observables/types/file/#observable_file","page":"File","title":"File Observable","text":"","category":"section"},{"location":"observables/types/file/","page":"File","title":"File","text":"file","category":"page"},{"location":"observables/types/file/#Rocket.file","page":"File","title":"Rocket.file","text":"file(path::String)\n\nCreation operator for the SyncFileObservable with a given path.\n\nSee also: SyncFileObservable\n\n\n\n\n\n","category":"function"},{"location":"observables/types/file/","page":"File","title":"File","text":"SyncFileObservable","category":"page"},{"location":"observables/types/file/#Rocket.SyncFileObservable","page":"File","title":"Rocket.SyncFileObservable","text":"SyncFileObservable(path::String)\n\nFile observable, which synchronously emits content of the file line by line as a String objects on subscription.\n\nSee also: file, Subscribable\n\n\n\n\n\n","category":"type"},{"location":"operators/mathematical/reduce/#operator_reduce","page":"reduce","title":"Reduce Operator","text":"","category":"section"},{"location":"operators/mathematical/reduce/","page":"reduce","title":"reduce","text":"reduce","category":"page"},{"location":"operators/mathematical/reduce/#Base.reduce","page":"reduce","title":"Base.reduce","text":"reduce(::Type{R}, reduceFn::Function, seed::R) where R\nreduce(reduceFn::F) where { F <: Function }\n\nCreates a reduce operator, which applies a given accumulator reduceFn function over the source Observable, and returns the accumulated result when the source completes, given an optional seed value. If a seed value is specified, then that value will be used as the initial value for the accumulator. If no seed value is specified, the first item of the source is used as the seed.\n\nArguments\n\n::Type{R}: the type of data of transformed value\nreduceFn::Function: transformation function with (data::T, current::R) -> R signature\nseed::R: optional seed accumulation value\n\nProducing\n\nStream of type <: Subscribable{R}\n\nExamples\n\nusing Rocket\n\nsource = from([ i for i in 1:10 ])\nsubscribe!(source |> reduce(Vector{Int}, (d, c) -> [ c..., d ], Int[]), logger())\n;\n\n# output\n\n[LogActor] Data: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]\n[LogActor] Completed\n\n\nusing Rocket\n\nsource = from([ i for i in 1:42 ])\nsubscribe!(source |> reduce(+), logger())\n;\n\n# output\n\n[LogActor] Data: 903\n[LogActor] Completed\n\n\nSee also: AbstractOperator, RightTypedOperator, ProxyObservable, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/mathematical/reduce/#Description","page":"reduce","title":"Description","text":"","category":"section"},{"location":"operators/mathematical/reduce/","page":"reduce","title":"reduce","text":"reduce applies an accumulator function to each value of the source Observable (from the past) and reduces it to a single value that is emitted by the output Observable. Note that reduce will only emit one value, only when the source Observable completes. It is equivalent to applying scan followed by last.","category":"page"},{"location":"operators/mathematical/reduce/","page":"reduce","title":"reduce","text":"It returns an Observable that applies a specified accumulator function to each item emitted by the source Observable. If a seed value is specified, then that value will be used as the initial value of the accumulator. If no seed value is specified, the first item of the source is used as the seed.","category":"page"},{"location":"operators/mathematical/reduce/#See-also","page":"reduce","title":"See also","text":"","category":"section"},{"location":"operators/mathematical/reduce/","page":"reduce","title":"reduce","text":"Operators, scan, last","category":"page"},{"location":"operators/filtering/some/#operator_some","page":"some","title":"Some Operator","text":"","category":"section"},{"location":"operators/filtering/some/","page":"some","title":"some","text":"some","category":"page"},{"location":"operators/filtering/some/#Rocket.some","page":"some","title":"Rocket.some","text":"some()\n\nCreates a some operator, which filters out nothing items by the source Observable by emitting only those that not equal to nothing.\n\nProducing\n\nStream of type <: Subscribable{L} where L refers to type of source stream <: Subscribable{Union{L, Nothing}}\n\nExamples\n\nusing Rocket\n\nsource = from([ 1, nothing, 3 ])\nsubscribe!(source |> some(), logger())\n;\n\n# output\n\n[LogActor] Data: 1\n[LogActor] Data: 3\n[LogActor] Completed\n\n\nSee also: AbstractOperator, InferableOperator, ProxyObservable, max, min, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/filtering/some/#Description","page":"some","title":"Description","text":"","category":"section"},{"location":"operators/filtering/some/","page":"some","title":"some","text":"This operator takes values from the source Observable and only emits those values that are not nothing.","category":"page"},{"location":"operators/filtering/some/#See-also","page":"some","title":"See also","text":"","category":"section"},{"location":"operators/filtering/some/","page":"some","title":"some","text":"Operators, filter","category":"page"},{"location":"actors/types/storage/#actor_storage","page":"Storage","title":"Storage actor","text":"","category":"section"},{"location":"actors/types/storage/","page":"Storage","title":"Storage","text":"storage","category":"page"},{"location":"actors/types/storage/#Rocket.storage","page":"Storage","title":"Rocket.storage","text":"storage(::Type{T}) where T\n\nArguments\n\n::Type{T}: Type of storage data\n\nCreation operator for the StorageActor actor.\n\nExamples\n\nusing Rocket\n\nactor = storage(Int)\nactor isa StorageActor{Int}\n\n# output\ntrue\n\nSee also: StorageActor, AbstractActor\n\n\n\n\n\n","category":"function"},{"location":"actors/types/storage/","page":"Storage","title":"Storage","text":"StorageActor","category":"page"},{"location":"actors/types/storage/#Rocket.StorageActor","page":"Storage","title":"Rocket.StorageActor","text":"StorageActor{D}() where D\n\nStorage actor provides an actor that stores a single (last) value passed to the next! callback. It saves last incoming successful next event in the value field, throws an ErrorException on error! event and does nothing on completion event. Before any events value initialised with nothing.\n\nExamples\n\nusing Rocket\n\nsource = from(1:5)\nactor = storage(Int)\n\nsubscribe!(source, actor)\nshow(getvalues(actor))\n\n# output\n5\n\nSee also: Actor, storage\n\n\n\n\n\n","category":"type"},{"location":"operators/multicasting/publish/#operator_publish","page":"publish","title":"Publish Operators","text":"","category":"section"},{"location":"operators/multicasting/publish/","page":"publish","title":"publish","text":"publish\npublish_behavior\npublish_replay\npublish_recent","category":"page"},{"location":"operators/multicasting/publish/#Rocket.publish","page":"publish","title":"Rocket.publish","text":"publish(; scheduler::H = AsapScheduler()) where { H <: AbstractScheduler }\n\npublish() is a shortcut for multicast(SubjectFactory())\n\nSee also: AbstractOperator, multicast, SubjectFactory\n\n\n\n\n\n","category":"function"},{"location":"operators/multicasting/publish/#Rocket.publish_behavior","page":"publish","title":"Rocket.publish_behavior","text":"publish_behavior(default; scheduler::H = AsapScheduler()) where { H <: AbstractScheduler }\n\npublish_behavior(default) is a shortcut for multicast(BehaviorSubjectFactory(default))\n\nSee also: AbstractOperator, multicast, BehaviorSubjectFactory\n\n\n\n\n\n","category":"function"},{"location":"operators/multicasting/publish/#Rocket.publish_replay","page":"publish","title":"Rocket.publish_replay","text":"publish_replay(size::Int; scheduler::H = AsapScheduler()) where { H <: AbstractScheduler }\n\npublish_replay(size) is a shortcut for multicast(ReplaySubjectFactory(size))\n\nSee also: AbstractOperator, multicast, ReplaySubjectFactory\n\n\n\n\n\n","category":"function"},{"location":"operators/multicasting/publish/#Rocket.publish_recent","page":"publish","title":"Rocket.publish_recent","text":"publish_recent(; scheduler::H = AsapScheduler()) where { H <: AbstractScheduler }\n\npublish_recent(size) is a shortcut for multicast(RecentSubjectFactory())\n\nSee also: AbstractOperator, multicast, RecentSubjectFactory\n\n\n\n\n\n","category":"function"},{"location":"operators/multicasting/publish/#See-also","page":"publish","title":"See also","text":"","category":"section"},{"location":"operators/multicasting/publish/","page":"publish","title":"publish","text":"Operators","category":"page"},{"location":"#Rocket.jl-Documentation","page":"Home","title":"Rocket.jl Documentation","text":"","category":"section"},{"location":"","page":"Home","title":"Home","text":"Welcome to the documentation for Rocket.jl.","category":"page"},{"location":"","page":"Home","title":"Home","text":"This documentation is an adaptation of the RxJS library documentation.","category":"page"},{"location":"#Table-of-Contents","page":"Home","title":"Table of Contents","text":"","category":"section"},{"location":"","page":"Home","title":"Home","text":"Pages = [\n \"getting-started.md\",\n \"observables/about.md\",\n \"actors/about.md\",\n \"teardown/about.md\",\n \"operators/about.md\",\n \"operators/piping.md\",\n \"operators/create-new-operator.md\",\n \"operators/high-order.md\",\n \"todo.md\",\n \"contributing.md\",\n \"utils.md\"\n]\nDepth = 2","category":"page"},{"location":"#Index","page":"Home","title":"Index","text":"","category":"section"},{"location":"","page":"Home","title":"Home","text":"","category":"page"},{"location":"actors/types/logger/#actor_logger","page":"Logger","title":"Logger actor","text":"","category":"section"},{"location":"actors/types/logger/","page":"Logger","title":"Logger","text":"logger","category":"page"},{"location":"actors/types/logger/#Rocket.logger","page":"Logger","title":"Rocket.logger","text":"logger([ io::IO ], name::String = \"LogActor\")\nlogger(::Type{T}, [ io::IO ], name::String = \"LogActor\") where T\n\nCreation operator for the LoggerActor actor.\n\nExamples\n\nusing Rocket\n\nsource = from([ 0, 1, 2 ])\nsubscribe!(source, logger())\n;\n\n# output\n\n[LogActor] Data: 0\n[LogActor] Data: 1\n[LogActor] Data: 2\n[LogActor] Completed\n\nusing Rocket\n\nsource = from([ 0, 1, 2 ])\nsubscribe!(source, logger(\"CustomName\"))\n;\n\n# output\n\n[CustomName] Data: 0\n[CustomName] Data: 1\n[CustomName] Data: 2\n[CustomName] Completed\n\nusing Rocket\n\nbuffer = IOBuffer()\n\nsource = from([ 0, 1, 2 ])\nsubscribe!(source, logger(buffer, \"CustomBuffer\"))\n;\n\nprint(String(take!(buffer)))\n# output\n\n[CustomBuffer] Data: 0\n[CustomBuffer] Data: 1\n[CustomBuffer] Data: 2\n[CustomBuffer] Completed\n\nSee also: LoggerActor, AbstractActor\n\n\n\n\n\n","category":"function"},{"location":"actors/types/logger/","page":"Logger","title":"Logger","text":"LoggerActor","category":"page"},{"location":"actors/types/logger/#Rocket.LoggerActor","page":"Logger","title":"Rocket.LoggerActor","text":"LoggerActor{D}(name::String = \"LogActor\", io::O) where { D, O }\n\nThe LoggerActor logs all next!/error!/complete! events that are sent from an Observable.\n\nConstructor arguments\n\nname: name of the logger. Optional. Default is LogActor.\nio: io stream to log in, maybe nothing to write to stdout\n\nSee also: Actor, logger\n\n\n\n\n\n","category":"type"},{"location":"operators/multicasting/about/#Multicasting-category","page":"About multicasting operators","title":"Multicasting category","text":"","category":"section"},{"location":"operators/multicasting/about/","page":"About multicasting operators","title":"About multicasting operators","text":"There are operators for different purposes, and they may be categorized as: creation, transformation, filtering, joining, multicasting, error handling, utility, etc. In the following list you will find all the operators organized in multicasting category.","category":"page"},{"location":"operators/multicasting/about/","page":"About multicasting operators","title":"About multicasting operators","text":"multicast\npublish\npublish_behavior\npublish_replay\nshare\nshare_replay","category":"page"},{"location":"operators/multicasting/about/#See-also","page":"About multicasting operators","title":"See also","text":"","category":"section"},{"location":"operators/multicasting/about/","page":"About multicasting operators","title":"About multicasting operators","text":"Operators","category":"page"},{"location":"observables/types/zipped/#observable_zipped","page":"Zipped","title":"Zipped Observable","text":"","category":"section"},{"location":"observables/types/zipped/","page":"Zipped","title":"Zipped","text":"zipped","category":"page"},{"location":"observables/types/zipped/#Rocket.zipped","page":"Zipped","title":"Rocket.zipped","text":"zipped(sources...)\n\nCombines multiple Observables to create an Observable whose values are calculated from the values, in order, of each of its input Observables.\n\nArguments\n\nsources: input sources\n\nExamples\n\nusing Rocket\n\nsource = zipped(of(1), from(2:5))\n\nsubscribe!(source, logger())\n;\n\n# output\n\n[LogActor] Data: (1, 2)\n[LogActor] Completed\n\nusing Rocket\n\nsource = zipped(from(1:3), from(1:5))\n\nsubscribe!(source, logger())\n;\n\n# output\n\n[LogActor] Data: (1, 1)\n[LogActor] Data: (2, 2)\n[LogActor] Data: (3, 3)\n[LogActor] Completed\n\nusing Rocket\n\nsource = zipped(completed(), of(0.0))\n\nsubscribe!(source, logger())\n;\n\n# output\n\n[LogActor] Completed\n\nSee also: Subscribable, subscribe!\n\n\n\n\n\n","category":"function"},{"location":"contributing/#Contribution-guidelines","page":"Contributing","title":"Contribution guidelines","text":"","category":"section"},{"location":"contributing/","page":"Contributing","title":"Contributing","text":"We welcome all possible contributors. This page details the some of the guidelines that should be followed when contributing to this package.","category":"page"},{"location":"contributing/#Reporting-bugs","page":"Contributing","title":"Reporting bugs","text":"","category":"section"},{"location":"contributing/","page":"Contributing","title":"Contributing","text":"We track bugs using GitHub issues. We encourage you to write complete, specific, reproducible bug reports. Mention the versions of Julia and Rocket.jl for which you observe unexpected behavior. Please provide a concise description of the problem and complement it with code snippets, test cases, screenshots, tracebacks or any other information that you consider relevant. This will help us to replicate the problem and narrow the search space for solutions.","category":"page"},{"location":"contributing/#Suggesting-features","page":"Contributing","title":"Suggesting features","text":"","category":"section"},{"location":"contributing/","page":"Contributing","title":"Contributing","text":"We welcome new feature proposals. However, before submitting a feature request, consider a few things:","category":"page"},{"location":"contributing/","page":"Contributing","title":"Contributing","text":"Does the feature require changes in the core Rocket.jl code? If it doesn't (for example, you would like to add a operator for a particular application), consider making a separate repository for your extensions.\nIf you would like to add an implementation of a feature that changes a lot in the core Rocket.jl code, please open an issue on GitHub and describe your proposal first. This will allow us to discuss your proposal with you before you invest your time in implementing something that may be difficult to merge later on.","category":"page"},{"location":"contributing/#Contributing-code","page":"Contributing","title":"Contributing code","text":"","category":"section"},{"location":"contributing/#Installing-Rocket","page":"Contributing","title":"Installing Rocket","text":"","category":"section"},{"location":"contributing/","page":"Contributing","title":"Contributing","text":"We suggest that you use the dev command from the new Julia package manager to install Rocket.jl for development purposes. To work on your fork of Rocket.jl, use your fork's URL address in the dev command, for example:","category":"page"},{"location":"contributing/","page":"Contributing","title":"Contributing","text":"] dev git@github.com:your_username/Rocket.jl.git","category":"page"},{"location":"contributing/","page":"Contributing","title":"Contributing","text":"The dev command clones Rocket.jl to ~/.julia/dev/Rocket. All local changes to Rocket code will be reflected in imported code.","category":"page"},{"location":"contributing/","page":"Contributing","title":"Contributing","text":"note: Note\nIt is also might be useful to install Revise.jl package as it allows you to modify code and use the changes without restarting Julia.","category":"page"},{"location":"contributing/#Committing-code","page":"Contributing","title":"Committing code","text":"","category":"section"},{"location":"contributing/","page":"Contributing","title":"Contributing","text":"We use the standard GitHub Flow workflow where all contributions are added through pull requests. In order to contribute, first fork the repository, then commit your contributions to your fork, and then create a pull request on the master branch of the Rocket.jl repository.","category":"page"},{"location":"contributing/","page":"Contributing","title":"Contributing","text":"Before opening a pull request, please make sure that all tests pass without failing! All demos (can be found in /demo/ directory) have to run without errors as well.","category":"page"},{"location":"contributing/#Style-conventions","page":"Contributing","title":"Style conventions","text":"","category":"section"},{"location":"contributing/","page":"Contributing","title":"Contributing","text":"We use default Julia style guide. We list here a few important points and our modifications to the Julia style guide:","category":"page"},{"location":"contributing/","page":"Contributing","title":"Contributing","text":"Use 4 spaces for indentation\nType names use UpperCamelCase. For example: ArrayObservable, MapOperator, etc..\nFunction names are lowercase with underscores, when necessary. For example: next!, subscribe!, as_actor, etc..\nVariable names and function arguments use snake_case\nThe name of a method that modifies its argument(s) must end in !","category":"page"},{"location":"contributing/#Unit-tests","page":"Contributing","title":"Unit tests","text":"","category":"section"},{"location":"contributing/","page":"Contributing","title":"Contributing","text":"We use the test-driven development (TDD) methodology for Rocket.jl development. The test coverage should be as complete as possible. Please make sure that you write tests for each piece of code that you want to add.","category":"page"},{"location":"contributing/","page":"Contributing","title":"Contributing","text":"All unit tests are located in the /test/ directory. The /test/ directory follows the structure of the /src/ directory. Each test file should have following filename format: test_*.jl. Some tests are also present in jldoctest docs annotations directly in the source code. See Julia's documentation about doctests.","category":"page"},{"location":"contributing/","page":"Contributing","title":"Contributing","text":"The tests can be evaluated by running following command in the Julia REPL:","category":"page"},{"location":"contributing/","page":"Contributing","title":"Contributing","text":"] test Rocket","category":"page"},{"location":"operators/transformation/override/#operator_override","page":"override","title":"Override Operator","text":"","category":"section"},{"location":"operators/transformation/override/","page":"override","title":"override","text":"override\nOverrideHandler","category":"page"},{"location":"operators/transformation/override/#Rocket.override","page":"override","title":"Rocket.override","text":"override(handler::OverrideHandler)\n\nCreates an override operator that overrides each emission from source observable with value provided in handler. If handler contains nothing source observable emits as usual. For constant override see map_to. Use Rocket.setvalue! to set new value for handler.\n\nProducing\n\nStream of type <: Subscribable{Union{L, T}} where L refers to the type of source stream and T referes to the type of handler's value\n\nExamples\n\nusing Rocket \n\nsubject = Subject(Int)\nhandler = OverrideHandler(Int, -1)\n\nsource = subject |> override(handler)\n\nsubscription = subscribe!(source, logger())\n\nnext!(subject, 1)\nnext!(subject, 2)\n\nRocket.setvalue!(handler, nothing)\n\nnext!(subject, 3)\nnext!(subject, 4)\n\nRocket.setvalue!(handler, -2)\n\nnext!(subject, 5)\nnext!(subject, 6)\n\nunsubscribe!(subscription)\n\n# output\n[LogActor] Data: -1\n[LogActor] Data: -1\n[LogActor] Data: 3\n[LogActor] Data: 4\n[LogActor] Data: -2\n[LogActor] Data: -2\n\nSee also: OverrideHandler\n\n\n\n\n\n","category":"function"},{"location":"operators/transformation/override/#Rocket.OverrideHandler","page":"override","title":"Rocket.OverrideHandler","text":"OverrideHandler(::Type{T}, value::Union{Nothing, T}) where T\nOverrideHandler(::Type{T}) where T\n\nHandler used in substitute operator.\n\nSee also: substitute\n\n\n\n\n\n","category":"type"},{"location":"operators/transformation/override/#See-also","page":"override","title":"See also","text":"","category":"section"},{"location":"operators/transformation/override/","page":"override","title":"override","text":"Operators","category":"page"},{"location":"operators/filtering/find/#operator_find","page":"find","title":"Find operator","text":"","category":"section"},{"location":"operators/filtering/find/","page":"find","title":"find","text":"find","category":"page"},{"location":"operators/filtering/find/#Rocket.find","page":"find","title":"Rocket.find","text":"find(conditionFn::F) where { F <: Function }\n\nCreates a find operator, which emits only the first value emitted by the source Observable that meets some condition.\n\nProducing\n\nStream of type <: Subscribable{L} where L refers to type of source stream\n\nArguments\n\nconditionFn::F: condition function with (data::T) -> Bool signature\n\nExamples\n\nusing Rocket\n\nsource = from([ 1, 2, 3, 4, 5, 6, 7, 8 ])\nsubscribe!(source |> find((d) -> d % 2 == 0), logger())\n;\n\n# output\n\n[LogActor] Data: 2\n[LogActor] Completed\n\nSee also: AbstractOperator, InferableOperator, ProxyObservable, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/filtering/find/#Description","page":"find","title":"Description","text":"","category":"section"},{"location":"operators/filtering/find/","page":"find","title":"find","text":"find searches for the first item in the source Observable that matches the specified condition embodied by the predicate, and returns the first occurrence in the source. Does not emit an error if a valid value is not found.","category":"page"},{"location":"operators/filtering/find/#See-also","page":"find","title":"See also","text":"","category":"section"},{"location":"operators/filtering/find/","page":"find","title":"find","text":"Operators, take","category":"page"},{"location":"operators/utility/discontinue/#operator_discontinue","page":"discontinue","title":"Discontinue Operator","text":"","category":"section"},{"location":"operators/utility/discontinue/","page":"discontinue","title":"discontinue","text":"discontinue","category":"page"},{"location":"operators/utility/discontinue/#Rocket.discontinue","page":"discontinue","title":"Rocket.discontinue","text":"discontinue()\n\nCreates an operator, which prevents an emitting of self-depending messages and breaks a possible infinite loop. Does nothing if observable scheduled asynchronously.\n\nProducing\n\nStream of type <: Subscribable{L} where L refers to type of source stream\n\nExamples\n\nusing Rocket\n\ns = BehaviorSubject(0)\n\nsubscription1 = subscribe!(s, logger())\nsubscription2 = subscribe!(s |> map(Int, d -> d + 1) |> discontinue(), s)\n;\n\n# output\n\n[LogActor] Data: 0\n[LogActor] Data: 1\n\nSee also: AbstractOperator, RightTypedOperator, ProxyObservable, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/utility/discontinue/#See-also","page":"discontinue","title":"See also","text":"","category":"section"},{"location":"operators/utility/discontinue/","page":"discontinue","title":"discontinue","text":"Operators","category":"page"},{"location":"teardown/about/#section_subscription","page":"Subscription","title":"Subscription","text":"","category":"section"},{"location":"teardown/about/","page":"Subscription","title":"Subscription","text":"A Subscription represents a disposable resource, usually the execution of an Observable. A Subscription has one important method: unsubscribe!(teardown), which takes some teardown logic object as one argument and disposes the resource held by the subscription.","category":"page"},{"location":"teardown/about/","page":"Subscription","title":"Subscription","text":"using Rocket\n\nsource = Subject(Int)\n\nnext!(source, 0) # Logs nothing as there is no subscribers\n\nsubscription = subscribe!(source, logger())\n\nnext!(source, 1) # Logs [LogActor] Data: 1 into standard output\n\nunsubscribe!(subscription)\n\nnext!(source, 2) # Logs nothing as a single one actor has unsubscribed","category":"page"},{"location":"teardown/about/","page":"Subscription","title":"Subscription","text":"note: Note\nA Subscription essentially just has its own specific method for unsubscribe!() function which releases resources or cancel Observable executions. Any Observable has to return a valid Teardown object.","category":"page"},{"location":"teardown/about/","page":"Subscription","title":"Subscription","text":"The unsubscribe! function also supports multiple unsubscriptions at once. If the input argument to the unsubscribe! function is either a tuple or a vector, it will first check that all of the arguments are valid subscription objects and if this is true it will unsubscribe from each of them individually.","category":"page"},{"location":"teardown/about/","page":"Subscription","title":"Subscription","text":"\nsource = Subject(Int)\n\nsubscription1 = subscribe!(source, logger())\nsubscription2 = subscribe!(source, logger())\n\nunsubscribe!((subscription1, subscription2))\n\n# or similarly\n# unsubscribe!([ subscription1, subscription2 ])\n","category":"page"},{"location":"teardown/about/","page":"Subscription","title":"Subscription","text":"For more information about subscription and teardown logic see the API Section","category":"page"},{"location":"operators/transformation/switch_map_to/#operator_switch_map_to","page":"switch_map_to","title":"SwitchMapTo Operator","text":"","category":"section"},{"location":"operators/transformation/switch_map_to/","page":"switch_map_to","title":"switch_map_to","text":"switch_map_to","category":"page"},{"location":"operators/transformation/switch_map_to/#Rocket.switch_map_to","page":"switch_map_to","title":"Rocket.switch_map_to","text":"switch_map_to(inner_observable)\n\nCreates a switch_map_to operator, which projects each source value to the same Observable which is flattened multiple times with switch_map in the output Observable.\n\nArguments\n\ninner_observable: an Observable to replace each value from the source Observable.\n\nProducing\n\nStream of type <: Subscribable{R} where R refers to the eltype of inner_observable\n\nExamples\n\nusing Rocket\n\nsource = from([ 0, 0, 0 ])\nsubscribe!(source |> switch_map_to(from([ 1, 2, 3 ])), logger())\n;\n\n# output\n\n[LogActor] Data: 1\n[LogActor] Data: 2\n[LogActor] Data: 3\n[LogActor] Data: 1\n[LogActor] Data: 2\n[LogActor] Data: 3\n[LogActor] Data: 1\n[LogActor] Data: 2\n[LogActor] Data: 3\n[LogActor] Completed\n\nSee also: switch_map, AbstractOperator, RightTypedOperator, ProxyObservable, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/transformation/switch_map_to/","page":"switch_map_to","title":"switch_map_to","text":"note: Note\nswitch_map_to is equivalent to switch_map with mappingFn set to (_) -> inner_observable.","category":"page"},{"location":"operators/transformation/switch_map_to/#See-also","page":"switch_map_to","title":"See also","text":"","category":"section"},{"location":"operators/transformation/switch_map_to/","page":"switch_map_to","title":"switch_map_to","text":"Operators","category":"page"},{"location":"operators/errors/rerun/#operator_rerun","page":"rerun","title":"Rerun Operator","text":"","category":"section"},{"location":"operators/errors/rerun/","page":"rerun","title":"rerun","text":"rerun","category":"page"},{"location":"operators/errors/rerun/#Rocket.rerun","page":"rerun","title":"Rocket.rerun","text":"rerun(count::Int = -1)\n\nReturns an Observable that mirrors the source Observable with the exception of an error. If the source Observable calls error, this method will resubscribe to the source Observable for a maximum of count resubscriptions (given as a number parameter) rather than propagating the error call.\n\nArguments:\n\ncount::Int: Number of retry attempts before failing. Optional. Default is -1.\n\nProducing\n\nStream of type <: Subscribable{L} where L refers to type of source stream\n\nExamples\n\nusing Rocket\n\nsource = from(1:3) |> safe() |> map(Int, (d) -> d > 1 ? error(\"Error\") : d) |> rerun(3)\n\nsubscribe!(source, logger())\n;\n\n# output\n[LogActor] Data: 1\n[LogActor] Data: 1\n[LogActor] Data: 1\n[LogActor] Data: 1\n[LogActor] Error: ErrorException(\"Error\")\n\nSee also: AbstractOperator, InferableOperator, catch_error, logger, safe\n\n\n\n\n\n","category":"function"},{"location":"operators/errors/rerun/#Description","page":"rerun","title":"Description","text":"","category":"section"},{"location":"operators/errors/rerun/","page":"rerun","title":"rerun","text":"Any and all items emitted by the source Observable will be emitted by the resulting Observable, even those emitted during failed subscriptions. For example, if an Observable fails at first but emits [1, 2] then succeeds the second time and emits: [1, 2, 3, 4, 5] then the complete stream of emissions and notifications would be: [1, 2, 1, 2, 3, 4, 5, complete].","category":"page"},{"location":"operators/errors/rerun/#See-also","page":"rerun","title":"See also","text":"","category":"section"},{"location":"operators/errors/rerun/","page":"rerun","title":"rerun","text":"Operators","category":"page"},{"location":"observables/types/timer/#observable_timer","page":"Timer","title":"Timer Observable","text":"","category":"section"},{"location":"observables/types/timer/","page":"Timer","title":"Timer","text":"timer","category":"page"},{"location":"observables/types/timer/#Rocket.timer","page":"Timer","title":"Rocket.timer","text":"timer(delay::Int)\ntimer(delay::Int, period::Int)\n\nCreation operator for the TimerObservable. Its like interval(@ref), but you can specify when should the emissions start. timer returns an Observable that emits an infinite sequence of ascending integers, with a constant interval of time, period of your choosing between those emissions. The first emission happens after the specified delay. If period is not specified, the output Observable emits only one value, 0. Otherwise, it emits an infinite sequence.\n\nArguments\n\ndelay: the initial delay time specified as an integer denoting milliseconds to wait before emitting the first value of 0.\nperiod: the minimum period of time between emissions of the subsequent numbers (in milliseconds).\n\nExamples\n\nusing Rocket\n\nsource = timer(0, 50)\n\nsleep(0.075)\nsubscription = subscribe!(source, logger())\nsleep(0.105)\nunsubscribe!(subscription)\n\nclose(source)\n;\n\n# output\n\n[LogActor] Data: 2\n[LogActor] Data: 3\n\n\nSee also: interval, TimerObservable, subscribe!, logger\n\n\n\n\n\n","category":"function"},{"location":"observables/types/timer/","page":"Timer","title":"Timer","text":"TimerObservable","category":"page"},{"location":"observables/types/timer/#Rocket.TimerObservable","page":"Timer","title":"Rocket.TimerObservable","text":"TimerObservable\n\nAn Observable that starts emitting after an delay and emits ever increasing numbers after each period of time thereafter.\n\nParameters\n\ndelay: The initial delay time specified as an integer denoting milliseconds to wait before emitting the first value of 0`.\nperiod: The minimum period of time in milliseconds between emissions of the subsequent numbers.\n\nSee also: timer, Subscribable\n\n\n\n\n\n","category":"type"},{"location":"actors/about/#section_actors","page":"Actor","title":"Actors","text":"","category":"section"},{"location":"actors/about/","page":"Actor","title":"Actor","text":"An Actor is the most primitive unit of computation: it receives a message and performs a computation.","category":"page"},{"location":"actors/about/","page":"Actor","title":"Actor","text":"An actor is analogous to an object in an object-oriented languages. An object receives a message (a method call) and does something depending on which message it receives (the method we are calling). The main difference is that actors are completely isolated from each other, and they will never share memory. It’s also worth mentioning that an actor can maintain a private state that should never be changed directly by another actor.","category":"page"},{"location":"actors/about/","page":"Actor","title":"Actor","text":"For a quick introduction to Actor models, see this article.","category":"page"},{"location":"actors/about/","page":"Actor","title":"Actor","text":"The API of Rocket.jl's Actors is similar to RxJS subscribers.","category":"page"},{"location":"actors/about/#First-example","page":"Actor","title":"First example","text":"","category":"section"},{"location":"actors/about/","page":"Actor","title":"Actor","text":"The following example implements an Actor that retains each received value from an Observable.","category":"page"},{"location":"actors/about/","page":"Actor","title":"Actor","text":"using Rocket\n\nstruct CustomKeepActor <: Actor{Int}\n values::Vector{Int}\n\n CustomKeepActor() = new(Vector{Int}())\nend\n\nRocket.on_next!(actor::CustomKeepActor, data::Int) = push!(actor.values, data)\nRocket.on_error!(actor::CustomKeepActor, err) = error(err)\nRocket.on_complete!(actor::CustomKeepActor) = println(\"Completed!\")\n\nsource = from([ 1, 2, 3 ])\nkeep_actor = CustomKeepActor()\nsubscribe!(source, keep_actor)\n\n# Logs\n# Completed!\n\nprintln(keep_actor.values)\n\n# Logs\n# [1, 2, 3]","category":"page"},{"location":"actors/about/","page":"Actor","title":"Actor","text":"An actor may be not interested in the values itself, but merely the completion of an event. In this case, Rocket.jl provides a CompletionActor abstract type. See also NextActor and ErrorActor.","category":"page"},{"location":"actors/about/","page":"Actor","title":"Actor","text":"using Rocket\n\nstruct CompletionNotificationActor <: CompletionActor{Int} end\n\nRocket.on_complete!(::CompletionNotificationActor) = println(\"Completed!\")\n\nsource = from([ 1, 2, 3 ])\nsubscribe!(source, CompletionNotificationActor());\n\n# Logs\n# Completed","category":"page"},{"location":"actors/about/","page":"Actor","title":"Actor","text":"It is also possible to use Julia's multiple dispatch feature and dispatch on type of the event","category":"page"},{"location":"actors/about/","page":"Actor","title":"Actor","text":"using Rocket\n\nstruct MyCustomActor <: NextActor{Any} end\n\nRocket.on_next!(::MyCustomActor, data::Int) = println(\"Int: $data\")\nRocket.on_next!(::MyCustomActor, data::Float64) = println(\"Float64: $data\")\nRocket.on_next!(::MyCustomActor, data) = println(\"Something else: $data\")\n\nsource = from([ 1, 1.0, \"string\" ])\nsubscribe!(source, MyCustomActor());\n\n# Logs\n# Int: 1\n# Float64: 1.0\n# Something else: string\n","category":"page"},{"location":"actors/about/#Lambda-actor","page":"Actor","title":"Lambda actor","text":"","category":"section"},{"location":"actors/about/","page":"Actor","title":"Actor","text":"For debugging purposes it may be convenient to work with a LambdaActor. This provides an interface that defines callbacks for \"next\", \"error\" and \"complete\" events. But this generic actor does not allow to dispatch on the type of the event.","category":"page"},{"location":"actors/about/","page":"Actor","title":"Actor","text":"using Rocket\n\nsource = from([1, 2, 3])\n\nsubscribe!(source, lambda(\n on_next = (d) -> println(d),\n on_error = (e) -> error(e),\n on_complete = () -> println(\"Completed\")\n))\n\n# Logs\n# 1\n# 2\n# 3\n# Completed","category":"page"},{"location":"actors/about/#Function-actor","page":"Actor","title":"Function actor","text":"","category":"section"},{"location":"actors/about/","page":"Actor","title":"Actor","text":"Sometimes it is convenient to pass only on_next callback. Rocket.jl provides a FunctionActor which automatically converts any function object passed in the subscribe! function to a proper actor which listens only for data events, throws an exception on error event and ignores completion message.","category":"page"},{"location":"actors/about/","page":"Actor","title":"Actor","text":"using Rocket\n\nsource = from([1, 2, 3])\n\nsubscribe!(source, (d) -> println(d))\n\n# Logs\n# 1\n# 2\n# 3","category":"page"},{"location":"observables/types/single/#observable_single","page":"Single","title":"Single Observable","text":"","category":"section"},{"location":"observables/types/single/","page":"Single","title":"Single","text":"of","category":"page"},{"location":"observables/types/single/#Rocket.of","page":"Single","title":"Rocket.of","text":"of(x; scheduler::H = AsapScheduler()) where { H <: AbstractScheduler }\n\nCreation operator for the SingleObservable that emits a single value x and then completes.\n\nArguments\n\nx: value to be emmited before completion\n\nExamples\n\nusing Rocket\n\nsource = of(1)\nsubscribe!(source, logger())\n;\n\n# output\n\n[LogActor] Data: 1\n[LogActor] Completed\n\n\nSee also: SingleObservable, subscribe!, logger\n\n\n\n\n\n","category":"function"},{"location":"observables/types/single/","page":"Single","title":"Single","text":"SingleObservable","category":"page"},{"location":"observables/types/single/#Rocket.SingleObservable","page":"Single","title":"Rocket.SingleObservable","text":"SingleObservable{D, H}(value::D, scheduler::H)\n\nSingleObservable wraps single value of type D into a observable.\n\nConstructor arguments\n\nvalue: a single value to emit\nscheduler: scheduler-like object\n\nSee also: of, Subscribable\n\n\n\n\n\n","category":"type"},{"location":"observables/types/interval/#observable_interval","page":"Interval","title":"Interval Observable","text":"","category":"section"},{"location":"observables/types/interval/","page":"Interval","title":"Interval","text":"interval","category":"page"},{"location":"observables/types/interval/#Rocket.interval","page":"Interval","title":"Rocket.interval","text":"interval(period::Union{Int, Nothing} = nothing)\n\nCreation operator for the TimerObservable. interval returns an Observable that emits an infinite sequence of ascending integers, with a constant interval of time of your choosing between those emissions. The first emission is not sent immediately, but only after the first period has passed.\n\nArguments\n\ninterval: the interval size in milliseconds\n\nExamples\n\nusing Rocket\n\nsource = interval(50)\n\nsubscription = subscribe!(source, logger())\nsleep(0.215)\nunsubscribe!(subscription)\nsleep(0.215)\nsubscription = subscribe!(source, logger())\nsleep(0.185)\nunsubscribe!(subscription)\n\nclose(source)\n;\n\n# output\n\n[LogActor] Data: 0\n[LogActor] Data: 1\n[LogActor] Data: 2\n[LogActor] Data: 3\n[LogActor] Data: 8\n[LogActor] Data: 9\n[LogActor] Data: 10\n\nSee also: timer, TimerObservable, Subscribable\n\n\n\n\n\n","category":"function"},{"location":"operators/filtering/take_until/#operator_take_until","page":"take_until","title":"TakeUntil Operator","text":"","category":"section"},{"location":"operators/filtering/take_until/","page":"take_until","title":"take_until","text":"take_until","category":"page"},{"location":"operators/filtering/take_until/#Rocket.take_until","page":"take_until","title":"Rocket.take_until","text":"take_until(notifier::S)\n\nCreates a take operator, which returns an Observable that emits the values emitted by the source Observable until a notifier Observable emits a value or a completion event.\n\nArguments\n\nnotifier::S: The Observable whose first emitted value will cause the output Observable of take_until to stop emitting values from the source Observable.\n\nProducing\n\nStream of type <: Subscribable{L} where L refers to type of source stream\n\nExamples\n\nusing Rocket\n\nsource = interval(100) |> take_until(timer(1000))\n\nsubscribe!(source, logger())\n;\n\n# output\n\n[LogActor] Data: 0\n[LogActor] Data: 1\n[LogActor] Data: 2\n[LogActor] Data: 3\n[LogActor] Data: 4\n[LogActor] Data: 5\n[LogActor] Data: 6\n[LogActor] Data: 7\n[LogActor] Data: 8\n[LogActor] Completed\n\nusing Rocket \n\nsource = interval(100)\n\nsubscribe!(source |> take_until(source |> filter(i -> i == 3)), logger())\n;\n\n# output \n\n[LogActor] Data: 0\n[LogActor] Data: 1\n[LogActor] Data: 2\n[LogActor] Completed\n\nSee also: AbstractOperator, InferableOperator, ProxyObservable, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/filtering/take_until/#Description","page":"take_until","title":"Description","text":"","category":"section"},{"location":"operators/filtering/take_until/","page":"take_until","title":"take_until","text":"take_until subscribes and begins mirroring the source Observable. It also monitors a second Observable, notifier that you provide. If the notifier emits a value, the output Observable stops mirroring the source Observable and completes. If the notifier doesn't emit any value and completes then take_until also completes.","category":"page"},{"location":"operators/filtering/take_until/#See-also","page":"take_until","title":"See also","text":"","category":"section"},{"location":"operators/filtering/take_until/","page":"take_until","title":"take_until","text":"Operators","category":"page"},{"location":"operators/multicasting/share/#operator_share","page":"share","title":"Share Operators","text":"","category":"section"},{"location":"operators/multicasting/share/","page":"share","title":"share","text":"share\nshare_replay\nshare_recent","category":"page"},{"location":"operators/multicasting/share/#Rocket.share","page":"share","title":"Rocket.share","text":"share(; scheduler::H = AsapScheduler()) where { H <: AbstractScheduler }\n\nshare() is a shortcut for publish() + ref_count()\n\nSee also: AbstractOperator, multicast, publish, ref_count\n\n\n\n\n\n","category":"function"},{"location":"operators/multicasting/share/#Rocket.share_replay","page":"share","title":"Rocket.share_replay","text":"share_replay(size::Int; scheduler::H = AsapScheduler()) where { H <: AbstractScheduler }\n\nshare_replay(size) is a shortcut for publish_replay(size) + ref_count()\n\nSee also: AbstractOperator, multicast, publish, publish_replay, ref_count\n\n\n\n\n\n","category":"function"},{"location":"operators/multicasting/share/#Rocket.share_recent","page":"share","title":"Rocket.share_recent","text":"share_recent(; scheduler::H = AsapScheduler()) where { H <: AbstractScheduler }\n\nshare_recent() is a shortcut for publish_recent() + ref_count()\n\nSee also: AbstractOperator, multicast, publish, publish_recent, ref_count\n\n\n\n\n\n","category":"function"},{"location":"operators/multicasting/share/#See-also","page":"share","title":"See also","text":"","category":"section"},{"location":"operators/multicasting/share/","page":"share","title":"share","text":"Operators","category":"page"},{"location":"operators/transformation/concat_map/#operator_concat_map","page":"concat_map","title":"ConcatMap Operator","text":"","category":"section"},{"location":"operators/transformation/concat_map/","page":"concat_map","title":"concat_map","text":"concat_map","category":"page"},{"location":"operators/transformation/concat_map/#Rocket.concat_map","page":"concat_map","title":"Rocket.concat_map","text":"concat_map(::Type{R}, mappingFn::F = identity) where { R, F <: Function }\n\nCreates a concat_map operator, which returns an Observable that emits the result of applying the projection function to each item emitted by the source Observable and taking values from each projected inner Observable sequentially. Essentialy it projects each source value to an Observable which is merged in the output Observable, in a serialized fashion waiting for each one to complete before merging the next.\n\nArguments\n\n::Type{R}: the type of data of output Observables after projection with mappingFn\nmappingFn::F: projection function with (data) -> Observable{R} signature\n\nProducing\n\nStream of type <: Subscribable{R}\n\nExamples\n\nusing Rocket\n\nsource = from([ 0, 0 ]) |> concat_map(Int, d -> from([ 1, 2, 3 ], scheduler = AsyncScheduler(0)))\nsubscribe!(source, logger())\n;\n\n# output\n\n[LogActor] Data: 1\n[LogActor] Data: 2\n[LogActor] Data: 3\n[LogActor] Data: 1\n[LogActor] Data: 2\n[LogActor] Data: 3\n[LogActor] Completed\n\nSee also: AbstractOperator, RightTypedOperator, ProxyObservable, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/transformation/concat_map/#Description","page":"concat_map","title":"Description","text":"","category":"section"},{"location":"operators/transformation/concat_map/","page":"concat_map","title":"concat_map","text":"Returns an Observable that emits items based on applying a function that you supply to each item emitted by the source Observable, where that function returns an (so-called \"inner\") Observable. Each new inner Observable is concatenated with the previous inner Observable.","category":"page"},{"location":"operators/transformation/concat_map/","page":"concat_map","title":"concat_map","text":"warning: Warning\nIf source values arrive endlessly and faster than their corresponding inner Observables can complete, it will result in memory issues as inner Observables amass in an unbounded buffer waiting for their turn to be subscribed to.","category":"page"},{"location":"operators/transformation/concat_map/","page":"concat_map","title":"concat_map","text":"note: Note\nconcat_map is equivalent to merge_map with concurrency parameter set to 1.","category":"page"},{"location":"operators/transformation/concat_map/#See-also","page":"concat_map","title":"See also","text":"","category":"section"},{"location":"operators/transformation/concat_map/","page":"concat_map","title":"concat_map","text":"Operators, merge_map","category":"page"},{"location":"subjects/types/pending/#subject_pending","page":"Pending","title":"PendingSubject","text":"","category":"section"},{"location":"subjects/types/pending/","page":"Pending","title":"Pending","text":"PendingSubject\nPendingSubjectFactory","category":"page"},{"location":"subjects/types/pending/#Rocket.PendingSubject","page":"Pending","title":"Rocket.PendingSubject","text":"PendingSubject(::Type{D}) where D\nPendingSubject(::Type{D}, factory::F) where { D, F <: AbstractFactory }\nPendingSubject(::Type{D}, subject::S) where { D, S }\n\nA variant of Subject that emits its last value on completion. Reemits last value on further subscriptions and then completes.\n\nSee also: PendingSubjectFactory, Subject, SubjectFactory\n\n\n\n\n\n","category":"function"},{"location":"subjects/types/pending/#Rocket.PendingSubjectFactory","page":"Pending","title":"Rocket.PendingSubjectFactory","text":"PendingSubjectFactory(factory::F) where { F <: AbstractSubjectFactory }\nPendingSubjectFactory(; scheduler::H = AsapScheduler()) where { H <: AbstractScheduler }\n\nA variant of SubjectFactory that creates an instance of PendingSubject.\n\nSee also: SubjectFactory, AbstractSubjectFactory, PendingSubject, Subject\n\n\n\n\n\n","category":"function"},{"location":"subjects/types/pending/#Description","page":"Pending","title":"Description","text":"","category":"section"},{"location":"subjects/types/pending/","page":"Pending","title":"Pending","text":"A variant of Subject that only emits a value when it completes. It will emit its latest value to all its observers on completion. It will reemit its latest value to all new observers on further subscription and then complete. It is not possible to overwrite last value after completion.","category":"page"},{"location":"subjects/types/pending/#Examples","page":"Pending","title":"Examples","text":"","category":"section"},{"location":"subjects/types/pending/","page":"Pending","title":"Pending","text":"using Rocket\n\nsubject = PendingSubject(Int)\n\nsubscription1 = subscribe!(subject, logger(\"1\"))\n\nnext!(subject, 1) # Nothing is logged\nnext!(subject, 2) # Nothing is logged\n\nsubscription2 = subscribe!(subject, logger(\"2\"))\n\nnext!(subject, 3) # Nothing is logged\n\ncomplete!(subject)\n\nsubscription3 = subscribe!(subject, logger(\"3\"))\n\n[1] Data: 3\n[2] Data: 3\n[1] Completed\n[2] Completed\n[3] Data: 3\n[3] Completed","category":"page"},{"location":"operators/filtering/filter_type/#operator_filter_type","page":"filter_type","title":"FilterType Operator","text":"","category":"section"},{"location":"operators/filtering/filter_type/","page":"filter_type","title":"filter_type","text":"filter_type","category":"page"},{"location":"operators/filtering/filter_type/#Rocket.filter_type","page":"filter_type","title":"Rocket.filter_type","text":"filter_type(type::Type{ T }) where { T }\n\nCreates a filter_type operator, which filters items of the source Observable by emitting only those that match a specified T type with a <: operator. This operator is a more efficient version of filter(v -> v <: T) |> map(T, v -> v) operators chain.\n\nProducing\n\nStream of type <: Subscribable{ T } where T refers to type argument\n\nExamples\n\nusing Rocket\n\nsource = from(Real[ 1, 2.0, 3, 4.0, 5, 6.0 ])\nsubscribe!(source |> filter_type(Int), logger())\n;\n\n# output\n\n[LogActor] Data: 1\n[LogActor] Data: 3\n[LogActor] Data: 5\n[LogActor] Completed\n\nSee also: AbstractOperator, InferableOperator, ProxyObservable, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/filtering/filter_type/#See-also","page":"filter_type","title":"See also","text":"","category":"section"},{"location":"operators/filtering/filter_type/","page":"filter_type","title":"filter_type","text":"Operators","category":"page"},{"location":"operators/filtering/filter/#operator_filter","page":"filter","title":"Filter Operator","text":"","category":"section"},{"location":"operators/filtering/filter/","page":"filter","title":"filter","text":"filter","category":"page"},{"location":"operators/filtering/filter/#Base.filter","page":"filter","title":"Base.filter","text":"filter(filterFn::F) where { F <: Function }\n\nCreates a filter operator, which filters items of the source Observable by emitting only those that satisfy a specified filterFn predicate.\n\nProducing\n\nStream of type <: Subscribable{L} where L refers to type of source stream\n\nArguments\n\nfilterFn::F: predicate function with (data::T) -> Bool signature\n\nExamples\n\nusing Rocket\n\nsource = from([ 1, 2, 3, 4, 5, 6 ])\nsubscribe!(source |> filter((d) -> d % 2 == 0), logger())\n;\n\n# output\n\n[LogActor] Data: 2\n[LogActor] Data: 4\n[LogActor] Data: 6\n[LogActor] Completed\n\nSee also: AbstractOperator, InferableOperator, ProxyObservable, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/filtering/filter/#Description","page":"filter","title":"Description","text":"","category":"section"},{"location":"operators/filtering/filter/","page":"filter","title":"filter","text":"Like filter(f, array), this operator takes values from the source Observable, passes them through a predicate function and only emits those values that yielded true.","category":"page"},{"location":"operators/filtering/filter/#See-also","page":"filter","title":"See also","text":"","category":"section"},{"location":"operators/filtering/filter/","page":"filter","title":"filter","text":"Operators","category":"page"},{"location":"operators/join/with_latest/#operator_with_latest","page":"with_latest","title":"WithLatest Operator","text":"","category":"section"},{"location":"operators/join/with_latest/","page":"with_latest","title":"with_latest","text":"with_latest","category":"page"},{"location":"operators/join/with_latest/#Rocket.with_latest","page":"with_latest","title":"Rocket.with_latest","text":"with_latest(sources...)\n\nCreates a with_latest operator, which combines the source Observable with other Observables to create an Observable whose values are calculated from the latest values of each, only when the source emits.\n\nExamples\n\nusing Rocket\n\nsource = of(1)\nsubscribe!(source |> with_latest(from(1:5)), logger())\n;\n\n# output\n\n[LogActor] Data: (1, 5)\n[LogActor] Completed\n\nSee also: AbstractOperator, InferableOperator\n\n\n\n\n\n","category":"function"},{"location":"operators/join/with_latest/#See-also","page":"with_latest","title":"See also","text":"","category":"section"},{"location":"operators/join/with_latest/","page":"with_latest","title":"with_latest","text":"Operators","category":"page"},{"location":"operators/join/about/#Join-category","page":"Join category","title":"Join category","text":"","category":"section"},{"location":"operators/join/about/","page":"Join category","title":"Join category","text":"There are operators for different purposes, and they may be categorized as: creation, transformation, filtering, joining, multicasting, error handling, utility, etc. In the following list you will find all the operators organized in join category.","category":"page"},{"location":"operators/join/about/","page":"Join category","title":"Join category","text":"with_latest","category":"page"},{"location":"operators/join/about/#See-also","page":"Join category","title":"See also","text":"","category":"section"},{"location":"operators/join/about/","page":"Join category","title":"Join category","text":"Operators","category":"page"},{"location":"subjects/types/behavior/#subject_behavior","page":"Behavior","title":"BehaviorSubject","text":"","category":"section"},{"location":"subjects/types/behavior/","page":"Behavior","title":"Behavior","text":"BehaviorSubject\nBehaviorSubjectFactory","category":"page"},{"location":"subjects/types/behavior/#Rocket.BehaviorSubject","page":"Behavior","title":"Rocket.BehaviorSubject","text":"BehaviorSubject(value::D) where D\nBehaviorSubject(::Type{D}, value) where D\nBehaviorSubject(::Type{D}, value, factory::F) where { D, F <: AbstractSubjectFactory }\nBehaviorSubject(::Type{D}, value, subject::S) where { D, S }\n\nA variant of Subject that requires an initial value and emits its current value whenever it is subscribed to.\n\nSee also: BehaviorSubjectFactory, Subject, SubjectFactory\n\n\n\n\n\n","category":"function"},{"location":"subjects/types/behavior/#Rocket.BehaviorSubjectFactory","page":"Behavior","title":"Rocket.BehaviorSubjectFactory","text":"BehaviorSubjectFactory(default, factory::F) where { F <: AbstractSubjectFactory }\nBehaviorSubjectFactory(default; scheduler::H = AsapScheduler()) where { H <: AbstractScheduler }\n\nA variant of SubjectFactory that creates an instance of ReplaySubject.\n\nSee also: SubjectFactory, AbstractSubjectFactory, BehaviorSubject, Subject\n\n\n\n\n\n","category":"function"},{"location":"subjects/types/behavior/#Description","page":"Behavior","title":"Description","text":"","category":"section"},{"location":"subjects/types/behavior/","page":"Behavior","title":"Behavior","text":"One of the variants of Subjects is the BehaviorSubject, which has a notion of \"the current value\". It stores the latest value emitted to its consumers, and whenever a new Observer subscribes, it will immediately receive the \"current value\" from the BehaviorSubject.","category":"page"},{"location":"subjects/types/behavior/","page":"Behavior","title":"Behavior","text":"note: Note\nBehaviorSubjects are useful for representing \"values over time\". For instance, an event stream of birthdays is a Subject, but the stream of a person's age would be a BehaviorSubject.","category":"page"},{"location":"subjects/types/behavior/#Examples","page":"Behavior","title":"Examples","text":"","category":"section"},{"location":"subjects/types/behavior/","page":"Behavior","title":"Behavior","text":"In the following example, the BehaviorSubject is initialized with the value 0 which the first Observer receives when it subscribes. The second Observer receives the value 2 even though it subscribed after the value 2 was sent.","category":"page"},{"location":"subjects/types/behavior/","page":"Behavior","title":"Behavior","text":"using Rocket\n\nsubject = BehaviorSubject(Int, 0)\n\nsubscription1 = subscribe!(subject, logger(\"1\"))\n\nnext!(subject, 1)\nnext!(subject, 2)\n\nsubscription2 = subscribe!(subject, logger(\"2\"))\n\nnext!(subject, 3)\n\nunsubscribe!(subscription1)\nunsubscribe!(subscription2)\n\n// Logs\n// [1] Data: 0\n// [1] Data: 1\n// [1] Data: 2\n// [2] Data: 2\n// [1] Data: 3\n// [2] Data: 3","category":"page"},{"location":"api/operators/#operators_api","page":"Operators","title":"Operators API","text":"","category":"section"},{"location":"api/operators/#How-to-create-a-custom-operator","page":"Operators","title":"How to create a custom operator","text":"","category":"section"},{"location":"api/operators/","page":"Operators","title":"Operators","text":"If you need to write an operator that cannot be made from a combination of existing operators, then you can write a custom operator from scratch.","category":"page"},{"location":"api/operators/","page":"Operators","title":"Operators","text":"Each operator (e.g. MyFancyOperator) needs to either be (1) a subtype of one of abstract OperatorTrait trait types, or (2) define a","category":"page"},{"location":"api/operators/","page":"Operators","title":"Operators","text":"Rocket.as_operator(::Type{<:MyFancyOperator}) = TypedOperatorTrait{T, R}()\n# or\nRocket.as_operator(::Type{<:MyFancyOperator}) = InferableOperatorTrait()","category":"page"},{"location":"api/operators/","page":"Operators","title":"Operators","text":"trait behavior.","category":"page"},{"location":"api/operators/","page":"Operators","title":"Operators","text":"In addition, an operator must implement a specific method for on_call! function with custom logic which has to return another Observable as a result of applying MyFancyOperator to a source.","category":"page"},{"location":"api/operators/","page":"Operators","title":"Operators","text":"Rocket.on_call!(::Type{L}, ::Type{R}, operator::MyFancyOperator, source) where L = # some custom logic here\n\n# or\n# for inferable trait types you have to specify 'right' type with Rocket.operator_right which should specify a type of data of produced Observable\n\nRocket.on_call(::Type{L}, ::Type{R}, operator::MyFancyOperator, source) where L = # some custom logic here\nRocket.operator_right(::MyFancyOperator, ::Type{L}) where L = R # where R should be an actual type, Int or even L itself e.g.\n","category":"page"},{"location":"api/operators/","page":"Operators","title":"Operators","text":"note: Note\nIt is not allowed to modify the source Observable in any way; you have to return a new observable.","category":"page"},{"location":"api/operators/","page":"Operators","title":"Operators","text":"See more examples on custom operators in Traits API section","category":"page"},{"location":"api/operators/","page":"Operators","title":"Operators","text":"note: Note\nIt might be useful to return a ProxyObservable from an on_call! function. ProxyObservable is a special Observable which proxying actors with the source and/or source with actors.","category":"page"},{"location":"api/operators/#operators_api_traits","page":"Operators","title":"Traits","text":"","category":"section"},{"location":"api/operators/","page":"Operators","title":"Operators","text":"OperatorTrait\nas_operator\nTypedOperatorTrait\nLeftTypedOperatorTrait\nRightTypedOperatorTrait\nInferableOperatorTrait\nInvalidOperatorTrait","category":"page"},{"location":"api/operators/#Rocket.OperatorTrait","page":"Operators","title":"Rocket.OperatorTrait","text":"Abstract type for all possible operator traits\n\nSee also: TypedOperatorTrait, LeftTypedOperatorTrait, RightTypedOperatorTrait, InferableOperatorTrait, InvalidOperatorTrait,\n\n\n\n\n\n","category":"type"},{"location":"api/operators/#Rocket.as_operator","page":"Operators","title":"Rocket.as_operator","text":"as_operator(any)\n\nThis function checks operator trait behavior. May be used explicitly to specify operator trait behavior for any object.\n\nSee also: OperatorTrait, AbstractOperator\n\n\n\n\n\n","category":"function"},{"location":"api/operators/#Rocket.TypedOperatorTrait","page":"Operators","title":"Rocket.TypedOperatorTrait","text":"Typed operator trait specifies operator to be statically typed with input and output data types. Typed operator with input type L and output type R can only operate on input Observable with data type L and will always produce an Observable with data type R.\n\nExamples\n\nusing Rocket\n\nstruct MyTypedOperator <: TypedOperator{Int, Int} end\n\nfunction Rocket.on_call!(::Type{Int}, ::Type{Int}, op::MyTypedOperator, source)\n return proxy(Int, source, MyTypedOperatorProxy())\nend\n\nstruct MyTypedOperatorProxy <: ActorProxy end\n\nRocket.actor_proxy!(::Type{Int}, ::MyTypedOperatorProxy, actor::A) where A = MyTypedOperatorProxiedActor{A}(actor)\n\nstruct MyTypedOperatorProxiedActor{A} <: Actor{Int}\n actor :: A\nend\n\nfunction Rocket.on_next!(actor::MyTypedOperatorProxiedActor, data::Int)\n # Do something with a data and/or redirect it to actor.actor\n next!(actor.actor, data + 1)\nend\n\nRocket.on_error!(actor::MyTypedOperatorProxiedActor, err) = error!(actor.actor, err)\nRocket.on_complete!(actor::MyTypedOperatorProxiedActor) = complete!(actor.actor)\n\nsource = from([ 0, 1, 2 ])\nsubscribe!(source |> MyTypedOperator(), logger())\n;\n\n# output\n\n[LogActor] Data: 1\n[LogActor] Data: 2\n[LogActor] Data: 3\n[LogActor] Completed\n\nSee also: OperatorTrait, TypedOperator, OperatorTrait, ProxyObservable, ActorProxy, logger\n\n\n\n\n\n","category":"type"},{"location":"api/operators/#Rocket.LeftTypedOperatorTrait","page":"Operators","title":"Rocket.LeftTypedOperatorTrait","text":"Left typed operator trait specifies operator to be statically typed with input data type. To infer output data type this object should specify a special function operator_right(operator, ::Type{L}) where L which will be used to infer output data type. Left typed operator with input type L can only operate on input Observable with data type L and will always produce an Observable with data type inferred from operator_right(operator, ::Type{L}).\n\nExamples\n\nusing Rocket\n\nstruct CountIntegersOperator <: LeftTypedOperator{Int} end\n\nfunction Rocket.on_call!(::Type{Int}, ::Type{Tuple{Int, Int}}, op::CountIntegersOperator, source)\n return proxy(Tuple{Int, Int}, source, CountIntegersOperatorProxy())\nend\n\nRocket.operator_right(::CountIntegersOperator, ::Type{Int}) = Tuple{Int, Int}\n\nstruct CountIntegersOperatorProxy <: ActorProxy end\n\nRocket.actor_proxy!(::Type{Tuple{Int, Int}}, ::CountIntegersOperatorProxy, actor::A) where A = CountIntegersProxiedActor{A}(0, actor)\n\nmutable struct CountIntegersProxiedActor{A} <: Actor{Int}\n current :: Int\n actor :: A\nend\n\nfunction Rocket.on_next!(actor::CountIntegersProxiedActor, data::Int)\n current = actor.current\n actor.current += 1\n next!(actor.actor, (current, data)) # e.g.\nend\n\nRocket.on_error!(actor::CountIntegersProxiedActor, err) = error!(actor.actor, err)\nRocket.on_complete!(actor::CountIntegersProxiedActor) = complete!(actor.actor)\n\nsource = from([ 0, 0, 0 ])\nsubscribe!(source |> CountIntegersOperator(), logger())\n;\n\n# output\n\n[LogActor] Data: (0, 0)\n[LogActor] Data: (1, 0)\n[LogActor] Data: (2, 0)\n[LogActor] Completed\n\nSee also: OperatorTrait, LeftTypedOperator, operator_right, OperatorTrait, ProxyObservable, ActorProxy, enumerate, logger\n\n\n\n\n\n","category":"type"},{"location":"api/operators/#Rocket.RightTypedOperatorTrait","page":"Operators","title":"Rocket.RightTypedOperatorTrait","text":"Right typed operator trait specifies operator to be statically typed with output data type. It can operate on input Observable with any data type L but will always produce an Observable with data type R.\n\nExamples\n\nusing Rocket\n\nstruct ConvertToFloatOperator <: RightTypedOperator{Float64} end\n\nfunction Rocket.on_call!(::Type{L}, ::Type{Float64}, op::ConvertToFloatOperator, source) where L\n return proxy(Float64, source, ConvertToFloatProxy{L}())\nend\n\nstruct ConvertToFloatProxy{L} <: ActorProxy end\n\nfunction Rocket.actor_proxy!(::Type{Float64}, proxy::ConvertToFloatProxy{L}, actor::A) where { L, A }\n return ConvertToFloatProxyActor{L, A}(actor)\nend\n\nstruct ConvertToFloatProxyActor{L, A} <: Actor{L}\n actor :: A\nend\n\nfunction Rocket.on_next!(actor::ConvertToFloatProxyActor{L}, data::L) where L\n next!(actor.actor, convert(Float64, data)) # e.g.\nend\n\nRocket.on_error!(actor::ConvertToFloatProxyActor, err) = error!(actor.actor, err)\nRocket.on_complete!(actor::ConvertToFloatProxyActor) = complete!(actor.actor)\n\nsource = from([ 1, 2, 3 ])\nsubscribe!(source |> ConvertToFloatOperator(), logger())\n;\n\n# output\n\n[LogActor] Data: 1.0\n[LogActor] Data: 2.0\n[LogActor] Data: 3.0\n[LogActor] Completed\n\nSee also: OperatorTrait, RightTypedOperator, OperatorTrait, ProxyObservable, ActorProxy, logger\n\n\n\n\n\n","category":"type"},{"location":"api/operators/#Rocket.InferableOperatorTrait","page":"Operators","title":"Rocket.InferableOperatorTrait","text":"Inferable operator trait specifies operator to be statically typed neither with input data type nor with output data type. To infer output data type this object should specify a special function operator_right(operator, ::Type{L}) where L where L is input data type which will be used to infer output data type.\n\nusing Rocket\n\nstruct IdentityOperator <: InferableOperator end\n\nfunction Rocket.on_call!(::Type{L}, ::Type{L}, op::IdentityOperator, source) where L\n return proxy(L, source, IdentityProxy())\nend\n\nstruct IdentityProxy <: ActorProxy end\n\nRocket.operator_right(::IdentityOperator, ::Type{L}) where L = L\n\nRocket.actor_proxy!(::Type{L}, proxy::IdentityProxy, actor::A) where L where A = IdentityProxyActor{L, A}(actor)\n\nstruct IdentityProxyActor{L, A} <: Actor{L}\n actor :: A\nend\n\nfunction Rocket.on_next!(actor::IdentityProxyActor{L}, data::L) where L\n next!(actor.actor, data) # e.g.\nend\n\nRocket.on_error!(actor::IdentityProxyActor, err) = error!(actor.actor, err)\nRocket.on_complete!(actor::IdentityProxyActor) = complete!(actor.actor)\n\nsource = from([ 1, 2, 3 ])\nsubscribe!(source |> IdentityOperator(), logger())\n\nsource = from([ 1.0, 2.0, 3.0 ])\nsubscribe!(source |> IdentityOperator(), logger())\n;\n\n# output\n\n[LogActor] Data: 1\n[LogActor] Data: 2\n[LogActor] Data: 3\n[LogActor] Completed\n[LogActor] Data: 1.0\n[LogActor] Data: 2.0\n[LogActor] Data: 3.0\n[LogActor] Completed\n\n\nSee also: OperatorTrait, InferableOperator, operator_right, OperatorTrait, ProxyObservable, ActorProxy, logger\n\n\n\n\n\n","category":"type"},{"location":"api/operators/#Rocket.InvalidOperatorTrait","page":"Operators","title":"Rocket.InvalidOperatorTrait","text":"InvalidOperatorTrait trait specifies special 'invalid' behavior and types with such a trait specification cannot be used as an operator for an observable stream. By default any type has InvalidOperatorTrait trait specification\n\nSee also: OperatorTrait\n\n\n\n\n\n","category":"type"},{"location":"api/operators/#Types","page":"Operators","title":"Types","text":"","category":"section"},{"location":"api/operators/","page":"Operators","title":"Operators","text":"AbstractOperator\nTypedOperator\nLeftTypedOperator\nRightTypedOperator\nInferableOperator\non_call!\noperator_right\nOperatorsComposition","category":"page"},{"location":"api/operators/#Rocket.AbstractOperator","page":"Operators","title":"Rocket.AbstractOperator","text":"Supertype for all operators\n\nSee also: TypedOperator, LeftTypedOperator, RightTypedOperator, InferableOperator\n\n\n\n\n\n","category":"type"},{"location":"api/operators/#Rocket.TypedOperator","page":"Operators","title":"Rocket.TypedOperator","text":"Can be used as a supertype for any operator. Automatically specifies TypedOperatorTrait behavior.\n\nExamples\n\nusing Rocket\n\nstruct MyOperator <: TypedOperator{Float64,String} end\n\nas_operator(MyOperator) === TypedOperatorTrait{Float64,String}()\n\n# output\ntrue\n\nSee also: AbstractOperator, TypedOperatorTrait\n\n\n\n\n\n","category":"type"},{"location":"api/operators/#Rocket.LeftTypedOperator","page":"Operators","title":"Rocket.LeftTypedOperator","text":"Can be used as a supertype for any operator. Automatically specifies LeftTypedOperatorTrait behavior.\n\nExamples\n\nusing Rocket\n\nstruct MyOperator <: LeftTypedOperator{Float64} end\n\nas_operator(MyOperator) === LeftTypedOperatorTrait{Float64}()\n\n# output\ntrue\n\nSee also: AbstractOperator, LeftTypedOperatorTrait, operator_right\n\n\n\n\n\n","category":"type"},{"location":"api/operators/#Rocket.RightTypedOperator","page":"Operators","title":"Rocket.RightTypedOperator","text":"Can be used as a supertype for any operator. Automatically specifies RightTypedOperatorTrait behavior.\n\nExamples\n\nusing Rocket\n\nstruct MyOperator <: RightTypedOperator{Float64} end\n\nas_operator(MyOperator) === RightTypedOperatorTrait{Float64}()\n\n# output\ntrue\n\nSee also: AbstractOperator, RightTypedOperatorTrait\n\n\n\n\n\n","category":"type"},{"location":"api/operators/#Rocket.InferableOperator","page":"Operators","title":"Rocket.InferableOperator","text":"Can be used as a supertype for any operator. Automatically specifies InferableOperatorTrait behavior.\n\nExamples\n\nusing Rocket\n\nstruct MyOperator <: InferableOperator end\n\nas_operator(MyOperator) === InferableOperatorTrait()\n\n# output\ntrue\n\nSee also: AbstractOperator, InferableOperatorTrait, operator_right\n\n\n\n\n\n","category":"type"},{"location":"api/operators/#Rocket.on_call!","page":"Operators","title":"Rocket.on_call!","text":"on_call!(::Type, ::Type, operator, source)\n\nEach operator must implement its own method for on_call! function. This function is used to invoke operator on some Observable and to produce another Observable with new logic (operator specific).\n\nSee also: AbstractOperator\n\n\n\n\n\n","category":"function"},{"location":"api/operators/#Rocket.operator_right","page":"Operators","title":"Rocket.operator_right","text":"operator_right(operator, L)\n\nBoth LeftTypedOperator and InferableOperator must implement its own method for operator_right function. This function is used to infer type of data of output Observable given the type of data of input Observable.\n\nSee also: AbstractOperator, LeftTypedOperator, InferableOperator\n\n\n\n\n\n","category":"function"},{"location":"api/operators/#Rocket.OperatorsComposition","page":"Operators","title":"Rocket.OperatorsComposition","text":"OperatorsComposition(operators)\n\nOperatorsComposition is an object which helps to create a composition of multiple operators. To create a composition of two or more operators overloaded + or |> can be used.\n\nusing Rocket\n\ncomposition = map(Int, (d) -> d ^ 2) + filter(d -> d % 2 == 0)\n\nsource = from(1:5) |> composition\n\nsubscribe!(source, logger())\n;\n\n# output\n\n[LogActor] Data: 4\n[LogActor] Data: 16\n[LogActor] Completed\n\nusing Rocket\n\ncomposition = map(Int, (d) -> d ^ 2) |> filter(d -> d % 2 == 0)\n\nsource = from(1:5) |> composition\n\nsubscribe!(source, logger())\n;\n\n# output\n\n[LogActor] Data: 4\n[LogActor] Data: 16\n[LogActor] Completed\n\n\n\n\n\n","category":"type"},{"location":"api/operators/#Errors","page":"Operators","title":"Errors","text":"","category":"section"},{"location":"api/operators/","page":"Operators","title":"Operators","text":"InvalidOperatorTraitUsageError\nInconsistentSourceOperatorDataTypesError\nMissingOnCallImplementationError\nMissingOperatorRightImplementationError","category":"page"},{"location":"api/operators/#Rocket.InvalidOperatorTraitUsageError","page":"Operators","title":"Rocket.InvalidOperatorTraitUsageError","text":"This error will be thrown if |> pipe operator is called with invalid operator object\n\nSee also: on_call!\n\n\n\n\n\n","category":"type"},{"location":"api/operators/#Rocket.InconsistentSourceOperatorDataTypesError","page":"Operators","title":"Rocket.InconsistentSourceOperatorDataTypesError","text":"This error will be thrown if |> pipe operator is called with inconsistent data type\n\nSee also: on_call!\n\n\n\n\n\n","category":"type"},{"location":"api/operators/#Rocket.MissingOnCallImplementationError","page":"Operators","title":"Rocket.MissingOnCallImplementationError","text":"This error will be thrown if Julia cannot find specific method of on_call! function for a given operator.\n\nSee also: on_call!\n\n\n\n\n\n","category":"type"},{"location":"api/operators/#Rocket.MissingOperatorRightImplementationError","page":"Operators","title":"Rocket.MissingOperatorRightImplementationError","text":"This error will be thrown if Julia cannot find specific method of operator_right function for a given operator.\n\nSee also: operator_right\n\n\n\n\n\n","category":"type"},{"location":"observables/types/faulted/#observable_faulted","page":"Faulted","title":"Faulted Observable","text":"","category":"section"},{"location":"observables/types/faulted/","page":"Faulted","title":"Faulted","text":"faulted","category":"page"},{"location":"observables/types/faulted/#Rocket.faulted","page":"Faulted","title":"Rocket.faulted","text":"faulted(err; scheduler::H = AsapScheduler()) where { H <: AbstractScheduler }\nfaulted(::Type{T}, err; scheduler::H = AsapScheduler()) where { T, H <: AbstractScheduler }\n\nCreation operator for the FaultedObservable that emits no items to the Actor and immediately sends an error notification.\n\nArguments\n\nerr: the particular Error to pass to the error notification.\nT: type of output data source, optional, Any by default\nscheduler: optional, scheduler-like object\n\nExamples\n\nusing Rocket\n\nsource = faulted(\"Error!\")\nsubscribe!(source, logger())\n;\n\n# output\n\n[LogActor] Error: Error!\n\n\nSee also: FaultedObservable, subscribe!\n\n\n\n\n\n","category":"function"},{"location":"observables/types/faulted/","page":"Faulted","title":"Faulted","text":"FaultedObservable","category":"page"},{"location":"observables/types/faulted/#Rocket.FaultedObservable","page":"Faulted","title":"Rocket.FaultedObservable","text":"FaultedObservable{D, H}(err, scheduler::H)\n\nObservable that emits no items to the Actor and just sends an error notification on subscription.\n\nConstructor arguments\n\nerr: error to emit on subscription\nscheduler: scheduler-like object\n\nSee also: faulted\n\n\n\n\n\n","category":"type"},{"location":"operators/multicasting/multicast/#operator_multicast","page":"multicast","title":"Multicast Operator","text":"","category":"section"},{"location":"operators/multicasting/multicast/","page":"multicast","title":"multicast","text":"multicast","category":"page"},{"location":"operators/multicasting/multicast/#Rocket.multicast","page":"multicast","title":"Rocket.multicast","text":"multicast(subject::S) where S\nmulticast(factory::F) where { F <: AbstractSubjectFactory }\n\nThe multicast()operator takes a Subject and uses it to share the source execution. It returns what’s known as aConnectableObservable`, which has a connect() method. It has one simple job - subscribes to the source with the provided subject.\n\nExample\n\nusing Rocket\n\nsubject = Subject(Int)\nsource = from(1:5) |> multicast(subject)\n\nactor1 = logger(\"1\")\nactor2 = logger(\"2\")\n\nsubscription1 = subscribe!(source, actor1)\nsubscription2 = subscribe!(source, actor2)\n\nconnect(source)\n\nunsubscribe!(subscription1)\nunsubscribe!(subscription2)\n;\n\n# output\n\n[1] Data: 1\n[2] Data: 1\n[1] Data: 2\n[2] Data: 2\n[1] Data: 3\n[2] Data: 3\n[1] Data: 4\n[2] Data: 4\n[1] Data: 5\n[2] Data: 5\n[1] Completed\n[2] Completed\n\nSee also: ConnectableObservable, Subject, share, publish\n\n\n\n\n\n","category":"function"},{"location":"operators/multicasting/multicast/#See-also","page":"multicast","title":"See also","text":"","category":"section"},{"location":"operators/multicasting/multicast/","page":"multicast","title":"multicast","text":"Operators","category":"page"},{"location":"operators/transformation/map/#operator_map","page":"map","title":"Map Operator","text":"","category":"section"},{"location":"operators/transformation/map/","page":"map","title":"map","text":"map","category":"page"},{"location":"operators/transformation/map/#Base.map","page":"map","title":"Base.map","text":"map(::Type{R}, mappingFn::F) where { F <: Function }\n\nCreates a map operator, which applies a given mappingFn to each value emmited by the source Observable, and emits the resulting values as an Observable. You have to specify output R type after mappingFn projection.\n\nArguments\n\n::Type{R}: the type of data of transformed value, may be or may not be the same as source type\nmappingFn::Function: transformation function with (data::L) -> R signature, where L is type of data in input source\n\nProducing\n\nStream of type <: Subscribable{R}\n\nExamples\n\nusing Rocket\n\nsource = from([ 1, 2, 3 ])\nsubscribe!(source |> map(Int, (d) -> d ^ 2), logger())\n;\n\n# output\n\n[LogActor] Data: 1\n[LogActor] Data: 4\n[LogActor] Data: 9\n[LogActor] Completed\n\nSee also: AbstractOperator, RightTypedOperator, ProxyObservable, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/transformation/map/#Description","page":"map","title":"Description","text":"","category":"section"},{"location":"operators/transformation/map/","page":"map","title":"map","text":"The map operator, similar to map(f, array), applies a function to each value from the source. It's important to note that the function f is expected to be pure and without any side effects. The map operator is designed to create a copy of the original observable for each new subscriber. It independently executes the f function for each subscriber and doesn't share the resulting value. This might be inconvenient when f involves complex calculations or side effects.","category":"page"},{"location":"operators/transformation/map/","page":"map","title":"map","text":"using Rocket\n\nfunction f(x)\n println(\"Function `f` called\") # Assume heavy calculations or side-effects\n return x + 1\nend\n\nsubject = Subject(Int)\n\nmapped = subject |> map(Int, f)\n\nsubscription1 = subscribe!(mapped, logger())\nsubscription2 = subscribe!(mapped, logger())\n\nnext!(subject, 1)\n\nunsubscribe!(subscription1)\nunsubscribe!(subscription2)\nnothing #hide","category":"page"},{"location":"operators/transformation/map/","page":"map","title":"map","text":"In the example, you'll observe that \"Function f called\" is displayed twice. This happens because each subscriber receives their individual, distinct version of the modified data. To alter this behavior, one can utilize the share() operator. This operator creates only a single copy of the modified observable and shares the computed results.","category":"page"},{"location":"operators/transformation/map/","page":"map","title":"map","text":"mapped_and_shared = mapped |> share()\n\nsubscription1 = subscribe!(mapped_and_shared, logger())\nsubscription2 = subscribe!(mapped_and_shared, logger())\n\nnext!(subject, 1)\n\nunsubscribe!(subscription1)\nunsubscribe!(subscription2)\nnothing #hide","category":"page"},{"location":"operators/transformation/map/","page":"map","title":"map","text":"In this example, \"Function f called\" appears only once, and the computed value is shared between the two subscribers. Note, however, that this behaviour might be confusing in cases where the first subscribers completes the observable till its completion stage. For example:","category":"page"},{"location":"operators/transformation/map/","page":"map","title":"map","text":"mapped_and_shared = from([ 0, 1, 2 ]) |> map(Int, f) |> share()\n\nsubscription1 = subscribe!(mapped_and_shared, logger())\nsubscription2 = subscribe!(mapped_and_shared, logger())\n\nunsubscribe!(subscription1)\nunsubscribe!(subscription2)\nnothing #hide","category":"page"},{"location":"operators/transformation/map/","page":"map","title":"map","text":"In this scenario, the second subscriber doesn't receive any values because the first subscriber exhausts the single shared observable. Once the shared observable is used up, it doesn't produce any further values. This doesn't occur without the share() operator.","category":"page"},{"location":"operators/transformation/map/","page":"map","title":"map","text":"mapped = from([ 0, 1, 2 ]) |> map(Int, f)\n\nsubscription1 = subscribe!(mapped, logger())\nsubscription2 = subscribe!(mapped, logger())\n\nunsubscribe!(subscription1)\nunsubscribe!(subscription2)\nnothing #hide","category":"page"},{"location":"operators/transformation/map/#See-also","page":"map","title":"See also","text":"","category":"section"},{"location":"operators/transformation/map/","page":"map","title":"map","text":"Operators","category":"page"},{"location":"operators/utility/tap_on_complete/#operator_tap_on_complete","page":"tap_on_complete","title":"TapOnComplete Operator","text":"","category":"section"},{"location":"operators/utility/tap_on_complete/","page":"tap_on_complete","title":"tap_on_complete","text":"tap_on_complete","category":"page"},{"location":"operators/utility/tap_on_complete/#Rocket.tap_on_complete","page":"tap_on_complete","title":"Rocket.tap_on_complete","text":"tap_on_complete(tapFn::F) where { F <: Function }\n\nCreates a tap operator, which performs a side effect for only complete emission on the source Observable, but return an Observable that is identical to the source.\n\nArguments\n\ntapFn::Function: side-effect tap function with () -> Nothing signature\n\nProducing\n\nStream of type <: Subscribable{L} where L refers to type of source stream\n\nExamples\n\nusing Rocket\n\nsource = from([ 1, 2, 3 ])\nsubscribe!(source |> tap_on_complete(() -> println(\"Complete event received\")), logger())\n;\n\n# output\n\n[LogActor] Data: 1\n[LogActor] Data: 2\n[LogActor] Data: 3\n[LogActor] Completed\nComplete event received\n\n\nSee also: tap_on_subscribe, tap, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/utility/tap_on_complete/#Description","page":"tap_on_complete","title":"Description","text":"","category":"section"},{"location":"operators/utility/tap_on_complete/","page":"tap_on_complete","title":"tap_on_complete","text":"Returns an Observable that resembles the source Observable, but modifies it so that the provided Observer is called to perform a side effect on complete event emission by the source.","category":"page"},{"location":"operators/utility/tap_on_complete/","page":"tap_on_complete","title":"tap_on_complete","text":"This operator is useful for debugging your Observables, verifying correctness, or performing other side effects.","category":"page"},{"location":"operators/utility/tap_on_complete/","page":"tap_on_complete","title":"tap_on_complete","text":"Note: this operator differs from a subscribe on the Observable. If the Observable returned by tap_on_complete is not subscribed, the side effects specified by the Observer will never happen. tap_on_complete therefore simply spies on future execution, it does not trigger an execution to happen like subscribe does.","category":"page"},{"location":"operators/utility/tap_on_complete/#See-also","page":"tap_on_complete","title":"See also","text":"","category":"section"},{"location":"operators/utility/tap_on_complete/","page":"tap_on_complete","title":"tap_on_complete","text":"Operators","category":"page"},{"location":"observables/types/combined_updates/#observable_combined_updates","page":"Combined Updates","title":"CombinedUpdates Observable","text":"","category":"section"},{"location":"observables/types/combined_updates/","page":"Combined Updates","title":"Combined Updates","text":"combineLatestUpdates","category":"page"},{"location":"observables/types/combined_updates/#Rocket.combineLatestUpdates","page":"Combined Updates","title":"Rocket.combineLatestUpdates","text":"combineLatestUpdates(sources...; strategy = PushEach())\ncombineLatestUpdates(sources::S, strategy::G = PushEach()) where { S <: Tuple, U }\n\ncombineLatestUpdates is a more effiecient version of combineLatest(sources) + map_to(sources) operators chain.\n\nArguments\n\nsources: input sources\nstrategy: optional update strategy for batching new values together\n\nNote: combineLatestUpdates() completes immediately if sources are empty.\n\nSee also: Subscribable, subscribe!, PushEach, PushEachBut, PushNew, PushNewBut, PushStrategy\n\n\n\n\n\n","category":"function"},{"location":"observables/types/combined/#observable_combined","page":"Combined","title":"Combined Observable","text":"","category":"section"},{"location":"observables/types/combined/","page":"Combined","title":"Combined","text":"combineLatest\nPushEach\nPushEachBut\nPushNew\nPushNewBut\nPushStrategy","category":"page"},{"location":"observables/types/combined/#Rocket.combineLatest","page":"Combined","title":"Rocket.combineLatest","text":"combineLatest(sources...; strategy = PushEach())\ncombineLatest(sources::S, strategy::G = PushEach()) where { S <: Tuple, U }\n\nCombines multiple Observables to create an Observable whose values are calculated from the latest values of each of its input Observables. Accept optimal update strategy object.\n\nArguments\n\nsources: input sources\nstrategy: optional update strategy for batching new values together\n\nNote: combineLatest() completes immediately if sources are empty.\n\nExamples\n\nusing Rocket\n\nlatest = combineLatest(of(1), from(2:5))\n\nsubscribe!(latest, logger())\n;\n\n# output\n\n[LogActor] Data: (1, 2)\n[LogActor] Data: (1, 3)\n[LogActor] Data: (1, 4)\n[LogActor] Data: (1, 5)\n[LogActor] Completed\n\nusing Rocket\n\nlatest = combineLatest(of(1) |> async(0), from(2:5) |> async(0), strategy = PushNew())\n\nsubscribe!(latest, logger())\n;\n\n# output\n\n[LogActor] Data: (1, 2)\n[LogActor] Completed\n\nSee also: Subscribable, subscribe!, PushEach, PushEachBut, PushNew, PushNewBut, PushStrategy\n\n\n\n\n\n","category":"function"},{"location":"observables/types/combined/#Rocket.PushEach","page":"Combined","title":"Rocket.PushEach","text":"PushEach\n\nPushEach update strategy specifies the strategy to emit new value each time an inner observable emit a new value\n\nSee also: combineLatest, PushEachBut, PushNew, PushNewBut, PushStrategy\n\n\n\n\n\n","category":"type"},{"location":"observables/types/combined/#Rocket.PushEachBut","page":"Combined","title":"Rocket.PushEachBut","text":"PushEachBut{I}\n\nPushEachBut update strategy specifies the strategy to emit new value if and only if an inner observable with index I have a new value\n\nSee also: combineLatest, PushEach, PushNew, PushNewBut, PushStrategy\n\n\n\n\n\n","category":"type"},{"location":"observables/types/combined/#Rocket.PushNew","page":"Combined","title":"Rocket.PushNew","text":"PushNew\n\nPushNew update strategy specifies the strategy to emit new value if and only if all inner observables have a new value\n\nSee also: combineLatest, PushEach, PushEachBut, PushNewBut, PushStrategy\n\n\n\n\n\n","category":"type"},{"location":"observables/types/combined/#Rocket.PushNewBut","page":"Combined","title":"Rocket.PushNewBut","text":"PushNewBut{I}\n\nPushNewBut{I} update strategy specifies the strategy to emit new value if and only if all inner observables except with index I have a new value\n\nSee also: combineLatest, PushEach, PushEachBut, PushNew, PushStrategy\n\n\n\n\n\n","category":"type"},{"location":"observables/types/combined/#Rocket.PushStrategy","page":"Combined","title":"Rocket.PushStrategy","text":"PushStrategy(strategy::BitArray{1})\n\nPushStrategy update strategy specifies the strategy to emit new value if and only if all inner observables with index such that strategy[index] = false have a new value\n\nSee also: combineLatest, PushEach, PushEachBut, PushNew, PushNewBut, collectLatest\n\n\n\n\n\n","category":"type"},{"location":"observables/types/combined/#Description","page":"Combined","title":"Description","text":"","category":"section"},{"location":"observables/types/combined/","page":"Combined","title":"Combined","text":"combineLatest combines the values from all Observables in its arguments. This is done by subscribing to each Observable in order and, whenever an Observable emits, collecting a tuple of the most recent values from each Observable (in order). If you pass n Observables to combineLatest, the returned Observable will always emit an ordered tuple of n values.","category":"page"},{"location":"observables/types/combined/","page":"Combined","title":"Combined","text":"To ensure that the output tuple has a consistent length, combineLatest waits for all input Observables to emit at least once before it starts emitting results. This means that if some Observable emits values before other Observables started emitting, all these values but the last will be lost. On the other hand, if some Observable does not emit a value but completes, the resulting Observable will complete simultaneously without emitting anything. Furthermore, if some input Observable does not emit any value and never completes, combineLatest will also never emit and never complete.","category":"page"},{"location":"observables/types/combined/","page":"Combined","title":"Combined","text":"If at least one Observable was passed to combineLatest and all passed Observables emitted, then the resulting Observable will complete when all combined streams complete. So even if some Observable completes, the result of combineLatest will still emit values when the other Observables do. In case of a completed Observable, its value will now remain to be the last emitted value. On the other hand, if any Observable errors, combineLatest will also immediately error.","category":"page"},{"location":"observables/types/combined/","page":"Combined","title":"Combined","text":"It is possible to change default update/complete strategy behaviour with an optional strategy object.","category":"page"},{"location":"operators/filtering/about/#Filtering-category","page":"About filtering operators","title":"Filtering category","text":"","category":"section"},{"location":"operators/filtering/about/","page":"About filtering operators","title":"About filtering operators","text":"There are operators for different purposes, and they may be categorized as: creation, transformation, filtering, joining, multicasting, error handling, utility, etc. In the following list you will find all the operators organized in filtering category.","category":"page"},{"location":"operators/filtering/about/","page":"About filtering operators","title":"About filtering operators","text":"filter\nfilter_type\ntake\ntake_until\nfirst\nlast\nfind\nfind_index\nignore","category":"page"},{"location":"operators/filtering/about/#See-also","page":"About filtering operators","title":"See also","text":"","category":"section"},{"location":"operators/filtering/about/","page":"About filtering operators","title":"About filtering operators","text":"Operators","category":"page"},{"location":"observables/types/connectable/#observable_connectable","page":"Connectable","title":"Connectable Observable","text":"","category":"section"},{"location":"observables/types/connectable/","page":"Connectable","title":"Connectable","text":"connectable","category":"page"},{"location":"observables/types/connectable/#Rocket.connectable","page":"Connectable","title":"Rocket.connectable","text":"connectable(subject::J, source::S) where J where S\n\nCreates a ConnectableObservable with a given subject object and a source observable.\n\nExample\n\nusing Rocket\n\nc = connectable(Subject(Int; scheduler = AsapScheduler()), from(1:3))\n\nsubscribe!(c, logger());\n\nconnect(c);\n;\n\n# output\n\n[LogActor] Data: 1\n[LogActor] Data: 2\n[LogActor] Data: 3\n[LogActor] Completed\n\n\nSee also: ConnectableObservable, connect, subscribe!\n\n\n\n\n\n","category":"function"},{"location":"observables/types/connectable/","page":"Connectable","title":"Connectable","text":"connect","category":"page"},{"location":"observables/types/connectable/#Rocket.connect","page":"Connectable","title":"Rocket.connect","text":"connect(connectable::ConnectableObservable)\n\nWhen connect is called, the subject passed to the multicast operator is subscribed to the source and the subject’s observers receive the multicast notifications, which fits our basic mental model of stream multicasting. Returns a subscription.\n\nSee also: connectable, ConnectableObservable\n\n\n\n\n\n","category":"function"},{"location":"observables/types/connectable/","page":"Connectable","title":"Connectable","text":"ConnectableObservable","category":"page"},{"location":"observables/types/connectable/#Rocket.ConnectableObservable","page":"Connectable","title":"Rocket.ConnectableObservable","text":"ConnectableObservable{D}(subject, source)\n\nA connectable observable encapsulates the multicasting infrastructure with provided subject, but does not immediately subscribe to the source. It subscribes to the source when its connect method is called.\n\nSee also: connect, Subscribable\n\n\n\n\n\n","category":"type"},{"location":"operators/utility/tap_on_unsubscribe/#operator_tap_on_unsubscribe","page":"tap_on_unsubscribe","title":"TapOnUnsubscribe Operator","text":"","category":"section"},{"location":"operators/utility/tap_on_unsubscribe/","page":"tap_on_unsubscribe","title":"tap_on_unsubscribe","text":"TapBeforeUnsubscription\nTapAfterUnsubscription\ntap_on_unsubscribe","category":"page"},{"location":"operators/utility/tap_on_unsubscribe/#Rocket.TapBeforeUnsubscription","page":"tap_on_unsubscribe","title":"Rocket.TapBeforeUnsubscription","text":"TapBeforeUnsubscription\n\nOne of the strategies for tap_on_unsubscribe operator. With TapBeforeUnubscription tap callback will be called before actual unsubscription.\n\nSee also: tap_on_unsubscribe, TapAfterUnsubscription\n\n\n\n\n\n","category":"type"},{"location":"operators/utility/tap_on_unsubscribe/#Rocket.TapAfterUnsubscription","page":"tap_on_unsubscribe","title":"Rocket.TapAfterUnsubscription","text":"TapAfterUnsubscription\n\nOne of the strategies for tap_on_unsubscribe operator. With TapBeforeUnsubscription tap callback will be called after actual unsubscription.\n\nSee also: tap_on_unsubscribe, TapBeforeUnsubscription\n\n\n\n\n\n","category":"type"},{"location":"operators/utility/tap_on_unsubscribe/#Rocket.tap_on_unsubscribe","page":"tap_on_unsubscribe","title":"Rocket.tap_on_unsubscribe","text":"tap_on_unsubscribe(tapFn::F, strategy::S = TapBeforeUnsubscription()) where { F <: Function }\n\nCreates a tap operator, which performs a side effect on the unsubscription on the source Observable, but return an Observable that is identical to the source. Tap callback triggers only once.\n\nArguments\n\ntapFn::Function: side-effect tap function with () -> Nothing signature\nstrategy: (optional), specifies the order of a side-effect and an actual unsubscription, uses TapBeforeUnsubscription by default\n\nProducing\n\nStream of type <: Subscribable{L} where L refers to type of source stream\n\nExamples\n\nusing Rocket\n\nsource = from([ 1, 2, 3 ])\nsubscription = subscribe!(source |> tap_on_unsubscribe(() -> println(\"Someone unsubscribed\")), logger())\nunsubscribe!(subscription)\n;\n\n# output\n\n[LogActor] Data: 1\n[LogActor] Data: 2\n[LogActor] Data: 3\n[LogActor] Completed\nSomeone unsubscribed\n\nSee also: TapBeforeUnsubscription, TapAfterUnsubscription, tap, tap_on_subscribe, tap_on_complete, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/utility/tap_on_unsubscribe/#Description","page":"tap_on_unsubscribe","title":"Description","text":"","category":"section"},{"location":"operators/utility/tap_on_unsubscribe/","page":"tap_on_unsubscribe","title":"tap_on_unsubscribe","text":"Returns an Observable that resembles the source Observable, but modifies it so that the provided Observer is called to perform a side effect on unsubscription from the source.","category":"page"},{"location":"operators/utility/tap_on_unsubscribe/","page":"tap_on_unsubscribe","title":"tap_on_unsubscribe","text":"This operator is useful for debugging your Observables, verifying correctness, or performing other side effects.","category":"page"},{"location":"operators/utility/tap_on_unsubscribe/#See-also","page":"tap_on_unsubscribe","title":"See also","text":"","category":"section"},{"location":"operators/utility/tap_on_unsubscribe/","page":"tap_on_unsubscribe","title":"tap_on_unsubscribe","text":"Operators","category":"page"},{"location":"operators/errors/about/#Error-handling-category","page":"About error handling operators","title":"Error handling category","text":"","category":"section"},{"location":"operators/errors/about/","page":"About error handling operators","title":"About error handling operators","text":"There are operators for different purposes, and they may be categorized as: creation, transformation, filtering, joining, multicasting, error handling, utility, etc. In the following list you will find all the operators organized in error handling category.","category":"page"},{"location":"operators/errors/about/","page":"About error handling operators","title":"About error handling operators","text":"catch_error\nrerun\nerror_if\nerror_if_not","category":"page"},{"location":"operators/errors/about/#See-also","page":"About error handling operators","title":"See also","text":"","category":"section"},{"location":"operators/errors/about/","page":"About error handling operators","title":"About error handling operators","text":"Operators","category":"page"},{"location":"operators/utility/delay/#operator_delay","page":"delay","title":"Delay Operator","text":"","category":"section"},{"location":"operators/utility/delay/","page":"delay","title":"delay","text":"delay","category":"page"},{"location":"operators/utility/delay/#Rocket.delay","page":"delay","title":"Rocket.delay","text":"delay(delay::Int)\n\nCreates a delay operator, which delays the emission of items from the source Observable by a given timeout.\n\nArguments:\n\ndelay::Int: the delay duration in milliseconds (a number) until which the emission of the source items is delayed.\n\nProducing\n\nStream of type <: Subscribable{L} where L refers to type of source stream\n\nSee also: AbstractOperator, InferableOperator, ProxyObservable\n\n\n\n\n\n","category":"function"},{"location":"operators/utility/delay/#Description","page":"delay","title":"Description","text":"","category":"section"},{"location":"operators/utility/delay/","page":"delay","title":"delay","text":"Delays the emission of items from the source Observable by a given timeout","category":"page"},{"location":"operators/utility/delay/#Example","page":"delay","title":"Example","text":"","category":"section"},{"location":"operators/utility/delay/","page":"delay","title":"delay","text":"Delay every value with 1 second to the output","category":"page"},{"location":"operators/utility/delay/","page":"delay","title":"delay","text":"using Rocket\nusing Dates\n\nsource = from([ 1, 2, 3 ])\nprintln(Dates.format(now(), \"MM:SS\"))\nsubscription = subscribe!(source |> delay(2000), lambda(\n on_next = (d) -> println(\"$(Dates.format(now(), \"MM:SS\")): $d\")\n));\n\n# output\n\n03:41\n03:43: 1\n03:43: 2\n03:43: 3\n","category":"page"},{"location":"operators/utility/delay/#See-also","page":"delay","title":"See also","text":"","category":"section"},{"location":"operators/utility/delay/","page":"delay","title":"delay","text":"Operators","category":"page"},{"location":"operators/filtering/take/#operator_take","page":"take","title":"Take Operator","text":"","category":"section"},{"location":"operators/filtering/take/","page":"take","title":"take","text":"take","category":"page"},{"location":"operators/filtering/take/#Rocket.take","page":"take","title":"Rocket.take","text":"take(maxcount::Int)\n\nCreates a take operator, which returns an Observable that emits only the first maxcount values emitted by the source Observable.\n\nArguments\n\nmaxcount::Int: the maximum number of next values to emit.\n\nProducing\n\nStream of type <: Subscribable{L} where L refers to type of source stream\n\nExamples\n\nusing Rocket\n\nsource = from([ i for i in 1:100 ])\n\nsubscribe!(source |> take(5), logger())\n;\n\n# output\n\n[LogActor] Data: 1\n[LogActor] Data: 2\n[LogActor] Data: 3\n[LogActor] Data: 4\n[LogActor] Data: 5\n[LogActor] Completed\n\nSee also: AbstractOperator, InferableOperator, ProxyObservable, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/filtering/take/#Description","page":"take","title":"Description","text":"","category":"section"},{"location":"operators/filtering/take/","page":"take","title":"take","text":"take returns an Observable that emits only the first count values emitted by the source Observable. If the source emits fewer than count values, then all of its values are emitted. Afterwards, the Observable completes regardless of whether the source completed.","category":"page"},{"location":"operators/filtering/take/#See-also","page":"take","title":"See also","text":"","category":"section"},{"location":"operators/filtering/take/","page":"take","title":"take","text":"Operators","category":"page"},{"location":"operators/transformation/scan/#operator_scan","page":"scan","title":"Scan Operator","text":"","category":"section"},{"location":"operators/transformation/scan/","page":"scan","title":"scan","text":"scan","category":"page"},{"location":"operators/transformation/scan/#Rocket.scan","page":"scan","title":"Rocket.scan","text":"scan(::Type{R}, scanFn::F, seed::R) where { R, F <: Function }\nscan(scanFn::F) where { F <: Function }\n\nCreates a scan operator, which applies a given accumulator scanFn function to each value emmited by the source Observable, and returns each intermediate result with an optional seed value. If a seed value is specified, then that value will be used as the initial value for the accumulator. If no seed value is specified, the first item of the source is used as the seed.\n\nArguments\n\n::Type{R}: the type of data of transformed value, may be or may not be the same as type of input source\nscanFn::Function: accumulator function with (data::T, current::R) -> R signature\nseed::R: optional initial value for accumulator function\n\nProducing\n\nStream of type <: Subscribable{R}\n\nExamples\n\nusing Rocket\n\nsource = from([ 1, 2, 3 ])\nsubscribe!(source |> scan(+), logger())\n;\n\n# output\n\n[LogActor] Data: 1\n[LogActor] Data: 3\n[LogActor] Data: 6\n[LogActor] Completed\n\n\nusing Rocket\n\nsource = from([ 1, 2, 3 ])\nsubscribe!(source |> scan(Vector{Int}, (d, c) -> [ c..., d ], Int[]), logger())\n;\n\n# output\n\n[LogActor] Data: [1]\n[LogActor] Data: [1, 2]\n[LogActor] Data: [1, 2, 3]\n[LogActor] Completed\n\n\nSee also: AbstractOperator, RightTypedOperator, ProxyObservable, reduce, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/transformation/scan/#Description","page":"scan","title":"Description","text":"","category":"section"},{"location":"operators/transformation/scan/","page":"scan","title":"scan","text":"Combines all values emitted by the source, using an accumulator function that joins a new source value with the past accumulation. This is similar to reduce, but emits the intermediate accumulations.","category":"page"},{"location":"operators/transformation/scan/","page":"scan","title":"scan","text":"Returns an Observable that applies a specified accumulator function to each item emitted by the source Observable. If a seed value is specified, then that value will be used as the initial value for the accumulator. If no seed value is specified, the first item of the source is used as the seed.","category":"page"},{"location":"operators/transformation/scan/#See-also","page":"scan","title":"See also","text":"","category":"section"},{"location":"operators/transformation/scan/","page":"scan","title":"scan","text":"Operators","category":"page"},{"location":"actors/types/buffer/#actor_buffer","page":"Buffer","title":"Buffer actor","text":"","category":"section"},{"location":"actors/types/buffer/","page":"Buffer","title":"Buffer","text":"buffer","category":"page"},{"location":"actors/types/buffer/#Rocket.buffer","page":"Buffer","title":"Rocket.buffer","text":"buffer(::Type{T}, size::Int) where T\n\nArguments\n\n::Type{T}: Type of data in buffer\nsize::Int: size of buffer\n\nCreation operator for the BufferActor actor.\n\nExamples\n\nusing Rocket\n\nactor = buffer(Int, 3)\nactor isa BufferActor{Int}\n\n# output\ntrue\n\nSee also: BufferActor, AbstractActor\n\n\n\n\n\n","category":"function"},{"location":"actors/types/buffer/","page":"Buffer","title":"Buffer","text":"BufferActor","category":"page"},{"location":"actors/types/buffer/#Rocket.BufferActor","page":"Buffer","title":"Rocket.BufferActor","text":"BufferActor{D}() where D\n\nBuffer actor provides a storage actor. It copies last incoming successful next events in a values array, throws an ErrorException on error! event and does nothing on completion event. Note: Actor does not check the size of incoming data.\n\nExamples\n\nusing Rocket\n\nsource = of([ 1, 2, 3 ])\nactor = buffer(Int, 3)\n\nsubscribe!(source, actor)\nshow(getvalues(actor))\n\n# output\n[1, 2, 3]\n\nSee also: Actor, buffer\n\n\n\n\n\n","category":"type"},{"location":"operators/creation/about/#Creation-category","page":"Creation","title":"Creation category","text":"","category":"section"},{"location":"operators/creation/about/","page":"Creation","title":"Creation","text":"There are operators for different purposes, and they may be categorized as: creation, transformation, filtering, joining, multicasting, error handling, utility, etc. In the following list you will find all the operators organized in creation category.","category":"page"},{"location":"operators/creation/about/","page":"Creation","title":"Creation","text":"make\nof\nfrom\niterable\nfaulted\nnever\ncompleted\ntimer\ninterval\nproxy\nfile\ncombined\nrace\nconnectable\nmerged\nconcat\ngenerate\nnetwork\ndefer\nzipped","category":"page"},{"location":"operators/creation/about/#See-also","page":"Creation","title":"See also","text":"","category":"section"},{"location":"operators/creation/about/","page":"Creation","title":"Creation","text":"Operators","category":"page"},{"location":"subjects/types/recent/#subject_recent","page":"Recent","title":"RecentSubject","text":"","category":"section"},{"location":"subjects/types/recent/","page":"Recent","title":"Recent","text":"RecentSubject\nRecentSubjectFactory","category":"page"},{"location":"subjects/types/recent/#Rocket.RecentSubject","page":"Recent","title":"Rocket.RecentSubject","text":"RecentSubject(::Type{D}) where D\nRecentSubject(::Type{D}, factory::F) where { D, F <: AbstractSubjectFactory }\nRecentSubject(::Type{D}, subject::S) where { D, S }\n\nA variant of Subject that emits its recent value whenever it is subscribed to.\n\nSee also: RecentSubjectFactory, Subject, SubjectFactory\n\n\n\n\n\n","category":"function"},{"location":"subjects/types/recent/#Rocket.RecentSubjectFactory","page":"Recent","title":"Rocket.RecentSubjectFactory","text":"RecentSubjectFactory(factory::F) where { F <: AbstractSubjectFactory }\nRecentSubjectFactory(; scheduler::H = AsapScheduler()) where { H <: AbstractScheduler }\n\nA variant of SubjectFactory that creates an instance of RecentSubject.\n\nSee also: SubjectFactory, AbstractSubjectFactory, RecentSubject, Subject\n\n\n\n\n\n","category":"function"},{"location":"subjects/types/recent/#Description","page":"Recent","title":"Description","text":"","category":"section"},{"location":"subjects/types/recent/","page":"Recent","title":"Recent","text":"One of the variants of Subjects is the RecentSubject, which has a notion of \"the recent value\". It stores the latest value emitted to its consumers, and whenever a new Observer subscribes, it will immediately receive the \"recent value\" from the RecentSubject.","category":"page"},{"location":"subjects/types/recent/","page":"Recent","title":"Recent","text":"note: Note\nRecentSubjects is a more efficient version of ReplaySubjects with replay size equal to one.","category":"page"},{"location":"subjects/types/recent/#Examples","page":"Recent","title":"Examples","text":"","category":"section"},{"location":"subjects/types/recent/","page":"Recent","title":"Recent","text":"In the following example, after RecentSubject is initialized the first Observer receives nothing when it subscribes. The second Observer receives the value 2 even though it subscribed after the value 2 was sent.","category":"page"},{"location":"subjects/types/recent/","page":"Recent","title":"Recent","text":"using Rocket\n\nsubject = RecentSubject(Int)\n\nsubscription1 = subscribe!(subject, logger(\"1\"))\n\nnext!(subject, 1)\nnext!(subject, 2)\n\nsubscription2 = subscribe!(subject, logger(\"2\"))\n\nnext!(subject, 3)\n\nunsubscribe!(subscription1)\nunsubscribe!(subscription2)\n\n// Logs\n// [1] Data: 1\n// [1] Data: 2\n// [2] Data: 2\n// [1] Data: 3\n// [2] Data: 3","category":"page"},{"location":"operators/utility/noop/#operator_noop","page":"noop","title":"Noop Operator","text":"","category":"section"},{"location":"operators/utility/noop/","page":"noop","title":"noop","text":"noop","category":"page"},{"location":"operators/utility/noop/#Rocket.noop","page":"noop","title":"Rocket.noop","text":"noop()\n\nCreates a noop operator, which does nothing, but breaks operator composition type inference checking procedure for Julia's compiler. It might be useful for very long chain of operators, because Julia tries to statically infer data types at compile-time for the whole chain and can run into StackOverflow issues.\n\nusing Rocket\n\n# foo() block to enforce local scope for scope variable\nfunction foo()\n source = from(1:5)\n\n for i in 1:1000\n source = source |> map(Int, d -> d + 1) |> noop()\n end\n\n subscribe!(source, logger())\nend\n\nfoo()\n;\n\n# output\n\n[LogActor] Data: 1001\n[LogActor] Data: 1002\n[LogActor] Data: 1003\n[LogActor] Data: 1004\n[LogActor] Data: 1005\n[LogActor] Completed\n\nSee also: AbstractOperator, InferableOperator, logger, map\n\n\n\n\n\n","category":"function"},{"location":"operators/utility/noop/#See-also","page":"noop","title":"See also","text":"","category":"section"},{"location":"operators/utility/noop/","page":"noop","title":"noop","text":"Operators","category":"page"},{"location":"getting-started/#Getting-started","page":"Getting started","title":"Getting started","text":"","category":"section"},{"location":"getting-started/","page":"Getting started","title":"Getting started","text":"Rocket.jl is a Julia package for reactive programming that makes it easier to work with asynchronous data. It is inspired by the RxJS and ReactiveX communities.","category":"page"},{"location":"getting-started/","page":"Getting started","title":"Getting started","text":"In order to combine good performance with a convenient API, Rocket.jl employs Observer patterns, Actor models and Functional programming.","category":"page"},{"location":"getting-started/#Installation","page":"Getting started","title":"Installation","text":"","category":"section"},{"location":"getting-started/","page":"Getting started","title":"Getting started","text":"Install Rocket.jl through the Julia package manager:","category":"page"},{"location":"getting-started/","page":"Getting started","title":"Getting started","text":"] add Rocket","category":"page"},{"location":"getting-started/#Concepts","page":"Getting started","title":"Concepts","text":"","category":"section"},{"location":"getting-started/","page":"Getting started","title":"Getting started","text":"Rocket.jl has been designed with a focus on performance and modularity.","category":"page"},{"location":"getting-started/","page":"Getting started","title":"Getting started","text":"The essential concepts in Rocket.jl are:","category":"page"},{"location":"getting-started/","page":"Getting started","title":"Getting started","text":"Observable: represents a collection of future messages (data or/and events).\nActor: is an object that knows how to react on incoming messages delivered by the Observable.\nSubscription: represents a teardown logic that is useful for cancelling the execution of an Observable.\nOperator: an object that deals with collection operations, such as map, filter, reduce, etc.\nSubject: the way of multicasting a message to multiple Observers.","category":"page"},{"location":"getting-started/#First-example","page":"Getting started","title":"First example","text":"","category":"section"},{"location":"getting-started/","page":"Getting started","title":"Getting started","text":"Conventionally, arrays are used for processing data.","category":"page"},{"location":"getting-started/","page":"Getting started","title":"Getting started","text":"for value in array_of_values\n doSomethingWithMyData(value)\nend","category":"page"},{"location":"getting-started/","page":"Getting started","title":"Getting started","text":"In contrast, Rocket.jl uses observables.","category":"page"},{"location":"getting-started/","page":"Getting started","title":"Getting started","text":"subscription = subscribe!(source_of_values, lambda(\n on_next = (data) -> doSomethingWithMyData(data),\n on_error = (error) -> doSomethingWithAnError(error),\n on_complete = () -> println(\"Completed!\")\n))","category":"page"},{"location":"getting-started/","page":"Getting started","title":"Getting started","text":"At some point in time you may decide to stop listening for new messages.","category":"page"},{"location":"getting-started/","page":"Getting started","title":"Getting started","text":"unsubscribe!(subscription)","category":"page"},{"location":"getting-started/#Actors","page":"Getting started","title":"Actors","text":"","category":"section"},{"location":"getting-started/","page":"Getting started","title":"Getting started","text":"In order to process messages from an observable you will need to define an Actor that knows how to react to incoming messages.","category":"page"},{"location":"getting-started/","page":"Getting started","title":"Getting started","text":"struct MyActor <: Rocket.Actor{Int} end\n\nRocket.on_next!(actor::MyActor, data::Int) = doSomethingWithMyData(data)\nRocket.on_error!(actor::MyActor, error) = doSomethingWithAnError(error)\nRocket.on_complete!(actor::MyActor) = println(\"Completed!\")","category":"page"},{"location":"getting-started/","page":"Getting started","title":"Getting started","text":"An actor can also have its own local state.","category":"page"},{"location":"getting-started/","page":"Getting started","title":"Getting started","text":"struct StoreActor{D} <: Rocket.Actor{D}\n values :: Vector{D}\n\n StoreActor{D}() where D = new(Vector{D}())\nend\n\nRocket.on_next!(actor::StoreActor{D}, data::D) where D = push!(actor.values, data)\nRocket.on_error!(actor::StoreActor, error) = doSomethingWithAnError(error)\nRocket.on_complete!(actor::StoreActor) = println(\"Completed: $(actor.values)\")","category":"page"},{"location":"getting-started/","page":"Getting started","title":"Getting started","text":"For debugging purposes you can use a general LambdaActor actor or just pass a function object as an actor in subscribe! function..","category":"page"},{"location":"getting-started/#Operators","page":"Getting started","title":"Operators","text":"","category":"section"},{"location":"getting-started/","page":"Getting started","title":"Getting started","text":"What makes Rocket.jl powerful is its ability to help you process, transform and modify the messages that flow through your observables, using Operators.","category":"page"},{"location":"getting-started/","page":"Getting started","title":"Getting started","text":"subscribe!(squared_int_values |> map(Int, (d) -> d ^ 2), lambda(\n on_next = (data) -> println(data)\n))","category":"page"},{"location":"operators/transformation/pairwise/#operator_pairwise","page":"pairwise","title":"Pairwise Operator","text":"","category":"section"},{"location":"operators/transformation/pairwise/","page":"pairwise","title":"pairwise","text":"pairwise","category":"page"},{"location":"operators/transformation/pairwise/#Rocket.pairwise","page":"pairwise","title":"Rocket.pairwise","text":"pairwise([ initial ])\n\nCreates a pairwise operator, which groups pairs of consecutive emissions together and emits them as a tuple of two values. Accepts optional initial seed value to start pairing from.\n\nusing Rocket\n\nsource = from(1:5) |> pairwise()\n\nsubscribe!(source, logger())\n;\n\n# output\n\n[LogActor] Data: (1, 2)\n[LogActor] Data: (2, 3)\n[LogActor] Data: (3, 4)\n[LogActor] Data: (4, 5)\n[LogActor] Completed\n\nusing Rocket\n\nsource = from(1:5) |> pairwise(0)\n\nsubscribe!(source, logger())\n;\n\n# output\n\n[LogActor] Data: (0, 1)\n[LogActor] Data: (1, 2)\n[LogActor] Data: (2, 3)\n[LogActor] Data: (3, 4)\n[LogActor] Data: (4, 5)\n[LogActor] Completed\n\nSee also: AbstractOperator, InferableOperator, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/transformation/pairwise/#See-also","page":"pairwise","title":"See also","text":"","category":"section"},{"location":"operators/transformation/pairwise/","page":"pairwise","title":"pairwise","text":"Operators","category":"page"},{"location":"operators/filtering/first/#operator_first","page":"first","title":"First operator","text":"","category":"section"},{"location":"operators/filtering/first/","page":"first","title":"first","text":"first","category":"page"},{"location":"operators/filtering/first/#Base.first","page":"first","title":"Base.first","text":"first(; default = nothing)\n\nCreates a first operator, which returns an Observable that emits only the first value emitted by the source Observable. Sends FirstNotFoundException error message if a given source completes without emitting a single value.\n\nArguments\n\ndefault: an optional default value to provide if no values were emitted\n\nProducing\n\nStream of type <: Subscribable{L} where L refers to type of source stream\n\nExamples\n\nusing Rocket\n\nsource = from(1:100)\nsubscription = subscribe!(source |> first(), logger())\n;\n\n# output\n\n[LogActor] Data: 1\n[LogActor] Completed\n\nSee also: take, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/filtering/first/#Description","page":"first","title":"Description","text":"","category":"section"},{"location":"operators/filtering/first/","page":"first","title":"first","text":"An alias for take(1) operator.","category":"page"},{"location":"operators/filtering/first/#See-also","page":"first","title":"See also","text":"","category":"section"},{"location":"operators/filtering/first/","page":"first","title":"first","text":"Operators, take","category":"page"},{"location":"actors/types/function/#actor_function","page":"Function","title":"Function actor","text":"","category":"section"},{"location":"actors/types/function/","page":"Function","title":"Function","text":"FunctionActor","category":"page"},{"location":"actors/types/function/#Rocket.FunctionActor","page":"Function","title":"Rocket.FunctionActor","text":"FunctionActor{D} <: Actor{D}\n\nFunctionActor provides a simple interface to use a single function as a next! callback, error! callback throws an ErrorException and complete! callback does nothing. Should not be used explicitly because it will be created automatically when passing a Function object as an actor in subscribe! function.\n\nExamples\n\nusing Rocket\n\nsource = from(1:5)\nsubscribe!(source, (t) -> println(t))\n;\n\n# output\n1\n2\n3\n4\n5\n\nSee also: Actor, subscribe!\n\n\n\n\n\n","category":"type"},{"location":"operators/mathematical/min/#operator_min","page":"min","title":"Min Operator","text":"","category":"section"},{"location":"operators/mathematical/min/","page":"min","title":"min","text":"min","category":"page"},{"location":"operators/mathematical/min/#Base.min","page":"min","title":"Base.min","text":"min(; from = nothing)\n\nCreates a min operator, which emits a single item: the item with the smallest value.\n\nArguments\n\nfrom: optional initial minimal value, if nothing first item from the source will be used as initial instead\n\nProducing\n\nStream of type <: Subscribable{Union{L, Nothing}} where L refers to type of source stream\n\nExamples\n\nusing Rocket\n\nsource = from([ i for i in 1:42 ])\nsubscribe!(source |> min(), logger())\n;\n\n# output\n\n[LogActor] Data: 1\n[LogActor] Completed\n\n\nSee also: AbstractOperator, InferableOperator, ProxyObservable, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/mathematical/min/#Description","page":"min","title":"Description","text":"","category":"section"},{"location":"operators/mathematical/min/","page":"min","title":"min","text":"The min operator operates on an Observable of similar objects. When source Observable completes, it emits the item with the smallest value.","category":"page"},{"location":"operators/mathematical/min/#See-also","page":"min","title":"See also","text":"","category":"section"},{"location":"operators/mathematical/min/","page":"min","title":"min","text":"Operators","category":"page"},{"location":"operators/errors/error_if/#operator_error_if","page":"error_if","title":"Error If Operator","text":"","category":"section"},{"location":"operators/errors/error_if/","page":"error_if","title":"error_if","text":"error_if","category":"page"},{"location":"operators/errors/error_if/#Rocket.error_if","page":"error_if","title":"Rocket.error_if","text":"error_if(checkFn, errorFn)\n\nCreates an error_if operator, which performs a check for every emission on the source Observable with checkFn. If checkFn returns true, the operator sends an error event and unsubscribes from the observable.\n\nArguments\n\ncheckFn: check function with (data) -> Bool signature\nerrorFn: error object generating function with (data) -> Any signature, optional\n\nProducing\n\nStream of type <: Subscribable{L} where L refers to type of source stream\n\nExamples\n\nusing Rocket\n\nsource = from([1, 2, 3]) |> error_if((data) -> data > 2, (data) -> \"CustomError\")\n\nsubscription = subscribe!(source, lambda(\n on_next = (d) -> println(\"Next: \", d),\n on_error = (e) -> println(\"Error: \", e),\n on_complete = () -> println(\"Completed\")\n))\n;\n\n# output\nNext: 1\nNext: 2\nError: CustomError\n\nSee also: error_if_not, error_if_empty, default_if_empty, lambda\n\n\n\n\n\n","category":"function"},{"location":"operators/errors/error_if/#See-also","page":"error_if","title":"See also","text":"","category":"section"},{"location":"operators/errors/error_if/","page":"error_if","title":"error_if","text":"Operators","category":"page"},{"location":"subjects/about/#section_subjects","page":"Subject","title":"About subjects","text":"","category":"section"},{"location":"subjects/about/","page":"Subject","title":"Subject","text":"A Rocket.jl Subject is a special type of Observable that allows values to be multicasted to many Actors. While plain Observables are unicast (each subscribed Actor owns an independent execution of the Observable), Subjects are multicast.","category":"page"},{"location":"subjects/about/","page":"Subject","title":"Subject","text":"note: Note\nA Subject is like an Observable, but can multicast to many Actors. Subjects are like event emitters: they maintain a registry of many listeners.","category":"page"},{"location":"subjects/about/","page":"Subject","title":"Subject","text":"Every Subject is an Observable. Given a Subject, you can subscribe to it, providing an Actor, which will start receiving values normally. From the perspective of the Actor, it cannot tell whether the Observable execution is coming from a plain unicast Observable or a Subject.","category":"page"},{"location":"subjects/about/","page":"Subject","title":"Subject","text":"Internally to the Subject, subscribe! does not invoke a new execution that delivers values. Instead, it simply registers the given Actor in a list of Actors.","category":"page"},{"location":"subjects/about/","page":"Subject","title":"Subject","text":"Every Subject is an Actor itself. It is an object with the methods next!, error!, and complete!. Call next!(subject, theValue) to feed a new value to the Subject, and it will be multicasted to the Actors that listen to the Subject.","category":"page"},{"location":"subjects/about/","page":"Subject","title":"Subject","text":"In the example below, we have two Observers attached to a Subject, and we feed some values to the Subject:","category":"page"},{"location":"subjects/about/","page":"Subject","title":"Subject","text":"using Rocket\n\nsource = Subject(Int)\n\nsubscription1 = subscribe!(source, lambda(\n on_next = (d) -> println(\"Actor 1: $d\")\n))\n\nsubscription2 = subscribe!(source, lambda(\n on_next = (d) -> println(\"Actor 2: $d\")\n))\n\nnext!(source, 0)\n\n# Logs\n# Actor 1: 0\n# Actor 2: 0\n\nunsubscribe!(subscription1)\nunsubscribe!(subscription2)\n","category":"page"},{"location":"subjects/about/","page":"Subject","title":"Subject","text":"Since a Subject is an actor, this also means you may provide a Subject as the argument to the subscribe of any Observable:","category":"page"},{"location":"subjects/about/","page":"Subject","title":"Subject","text":"using Rocket\n\nsource = Subject(Int)\n\nsubscription1 = subscribe!(source, lambda(\n on_next = (d) -> println(\"Actor 1: $d\")\n))\n\nsubscription2 = subscribe!(source, lambda(\n on_next = (d) -> println(\"Actor 2: $d\")\n))\n\nother_source = from([ 1, 2, 3 ])\nsubscribe!(other_source, source);\n\n# Logs\n# Actor 1: 1\n# Actor 2: 1\n# Actor 1: 2\n# Actor 2: 2\n# Actor 1: 3\n# Actor 2: 3","category":"page"},{"location":"subjects/about/","page":"Subject","title":"Subject","text":"Here, we essentially convert a unicast Observable execution to multicast, through the Subject. This demonstrates how Subjects offer a unique way to share Observable execution with multiple Observers.","category":"page"},{"location":"subjects/about/#Schedulers","page":"Subject","title":"Schedulers","text":"","category":"section"},{"location":"subjects/about/","page":"Subject","title":"Subject","text":"A Subject (and some other observables) uses scheduler objects to schedule message delivery to their listeners.","category":"page"},{"location":"subjects/about/#Synchronous-scheduler","page":"Subject","title":"Synchronous scheduler","text":"","category":"section"},{"location":"subjects/about/","page":"Subject","title":"Subject","text":"One of the variants of schedulers is the AsapScheduler, which delivers every message synchronously. AsapScheduler is a default scheduler for all Subject objects.","category":"page"},{"location":"subjects/about/","page":"Subject","title":"Subject","text":"AsapScheduler","category":"page"},{"location":"subjects/about/#Rocket.AsapScheduler","page":"Subject","title":"Rocket.AsapScheduler","text":"AsapScheduler\n\nAsapScheduler executes scheduled actions as soon as possible and does not introduce any additional logic. AsapScheduler is a default scheduler for almost all observables.\n\n\n\n\n\n","category":"type"},{"location":"subjects/about/","page":"Subject","title":"Subject","text":"using Rocket\n\nsubject = Subject(Int, scheduler = AsapScheduler())\n\nsubscription1 = subscribe!(subject, logger(\"Actor 1\"))\n\nprintln(\"Before next\")\nnext!(subject, 1)\nnext!(subject, 2)\nprintln(\"After next\")\n\nsubscription2 = subscribe!(subject, logger(\"Actor 2\"))\n\nnext!(subject, 3)\n\n# Logs\n# Before next\n# [Actor 1] Data: 1\n# [Actor 1] Data: 2\n# After next\n# [Actor 1] Data: 3\n# [Actor 2] Data: 3","category":"page"},{"location":"subjects/about/#Asynchronous-Scheduler","page":"Subject","title":"Asynchronous Scheduler","text":"","category":"section"},{"location":"subjects/about/","page":"Subject","title":"Subject","text":"An AsyncScheduler is similar to a AsapScheduler. Both allows for Subject to scheduler their messages for multiple listeners, but a AsyncScheduler delivers all messages asynchronously (but still ordered) using a Julia's built-in Task object.","category":"page"},{"location":"subjects/about/","page":"Subject","title":"Subject","text":"AsyncScheduler","category":"page"},{"location":"subjects/about/#Rocket.AsyncScheduler","page":"Subject","title":"Rocket.AsyncScheduler","text":"AsyncScheduler\n\nAsyncScheduler executes scheduled actions asynchronously and uses Channel object to order different actions on a single asynchronous task\n\n\n\n\n\n","category":"type"},{"location":"subjects/about/","page":"Subject","title":"Subject","text":"using Rocket\n\nsubject = Subject(Int, scheduler = AsyncScheduler())\n\nsubscription1 = subscribe!(subject, logger(\"Actor 1\"))\n\nprintln(\"Before next\")\nnext!(subject, 1)\nnext!(subject, 2)\nprintln(\"After next\")\n\nsubscription2 = subscribe!(subject, logger(\"Actor 2\"))\n\nnext!(subject, 3)\n\n# Logs\n# Before next\n# After next\n# [Actor 1] Data: 1\n# [Actor 1] Data: 2\n# [Actor 1] Data: 3\n# [Actor 2] Data: 3\n","category":"page"},{"location":"operators/filtering/find_index/#operator_find_index","page":"find_index","title":"Find Index operator","text":"","category":"section"},{"location":"operators/filtering/find_index/","page":"find_index","title":"find_index","text":"find_index","category":"page"},{"location":"operators/filtering/find_index/#Rocket.find_index","page":"find_index","title":"Rocket.find_index","text":"find_index(conditionFn::F) where { F <: Function }\n\nCreates a find operator, which emits only the index of the first value emitted by the source Observable that meets some condition. Indices are 1-based.\n\nProducing\n\nStream of type <: Subscribable{L} where L refers to type of source stream\n\nArguments\n\nconditionFn::F: condition function with (data::T) -> Bool signature\n\nExamples\n\nusing Rocket\n\nsource = from([ 0, 1, 2, 3, 4, 5, 6, 7, 8 ])\nsubscribe!(source |> find_index((d) -> d !== 0 && d % 2 == 0), logger())\n;\n\n# output\n\n[LogActor] Data: 3\n[LogActor] Completed\n\nSee also: find, AbstractOperator, InferableOperator, ProxyObservable, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/filtering/find_index/#Description","page":"find_index","title":"Description","text":"","category":"section"},{"location":"operators/filtering/find_index/","page":"find_index","title":"find_index","text":"It's like find, but emits the index of the found value, not the value itself.","category":"page"},{"location":"operators/filtering/find_index/#See-also","page":"find_index","title":"See also","text":"","category":"section"},{"location":"operators/filtering/find_index/","page":"find_index","title":"find_index","text":"Operators, take","category":"page"},{"location":"api/subjects/#subjects_api","page":"Subjects","title":"Subjects API","text":"","category":"section"},{"location":"api/subjects/#Traits","page":"Subjects","title":"Traits","text":"","category":"section"},{"location":"api/subjects/","page":"Subjects","title":"Subjects","text":"SubjectTrait\nas_subject \nValidSubjectTrait\nInvalidSubjectTrait\nAbstractSubject","category":"page"},{"location":"api/subjects/#Rocket.SubjectTrait","page":"Subjects","title":"Rocket.SubjectTrait","text":"Abstract type for all possible subject traits\n\nSee also: ValidSubjectTrait, InvalidSubjectTrait, as_subject\n\n\n\n\n\n","category":"type"},{"location":"api/subjects/#Rocket.as_subject","page":"Subjects","title":"Rocket.as_subject","text":"as_subject(::Type)\n\nThis function checks subject trait behavior specification. Should be used explicitly to specify subject trait behavior for any object type.\n\nSee also: SubjectTrait\n\n\n\n\n\n","category":"function"},{"location":"api/subjects/#Rocket.ValidSubjectTrait","page":"Subjects","title":"Rocket.ValidSubjectTrait","text":"Valid subject trait behavior\n\nSee also: SubjectTrait\n\n\n\n\n\n","category":"type"},{"location":"api/subjects/#Rocket.InvalidSubjectTrait","page":"Subjects","title":"Rocket.InvalidSubjectTrait","text":"Default subject trait behavior for all types.\n\nSee also: SubjectTrait\n\n\n\n\n\n","category":"type"},{"location":"api/subjects/#Rocket.AbstractSubject","page":"Subjects","title":"Rocket.AbstractSubject","text":"Supertype for Subject types. Automatically specifies ValidSubject, SimpleSubscribableTrait and BaseActorTrait traits.\n\nSee also: Subject, ValidSubjectTrait, SimpleSubscribableTrait, BaseActorTrait\n\n\n\n\n\n","category":"type"},{"location":"api/subjects/#Factory","page":"Subjects","title":"Factory","text":"","category":"section"},{"location":"api/subjects/","page":"Subjects","title":"Subjects","text":"AbstractSubjectFactory\ncreate_subject","category":"page"},{"location":"api/subjects/#Rocket.AbstractSubjectFactory","page":"Subjects","title":"Rocket.AbstractSubjectFactory","text":"Abstract type for all possible subject factories\n\nSee also: SubjectTrait, ValidSubjectTrait, InvalidSubjectTrait\n\n\n\n\n\n","category":"type"},{"location":"api/subjects/#Rocket.create_subject","page":"Subjects","title":"Rocket.create_subject","text":"create_subject(::Type{L}, factory::F) where L where { F <: AbstractSubjectFactory }\n\nActor creator function for a given factory F. Should be implemented explicitly for any AbstractActorFactory object\n\nSee also: AbstractSubjectFactory, MissingCreateActorFactoryImplementationError\n\n\n\n\n\n","category":"function"},{"location":"api/subjects/#Errors","page":"Subjects","title":"Errors","text":"","category":"section"},{"location":"api/subjects/","page":"Subjects","title":"Subjects","text":"InvalidSubjectTraitUsageError\nInconsistentSubjectDataTypesError","category":"page"},{"location":"api/subjects/#Rocket.InvalidSubjectTraitUsageError","page":"Subjects","title":"Rocket.InvalidSubjectTraitUsageError","text":"InvalidSubject usage error\n\nSee also: as_subject\n\n\n\n\n\n","category":"type"},{"location":"api/subjects/#Rocket.InconsistentSubjectDataTypesError","page":"Subjects","title":"Rocket.InconsistentSubjectDataTypesError","text":"InconsistentSubjectDataTypesError\n\nSee also: as_subject\n\n\n\n\n\n","category":"type"},{"location":"operators/transformation/lowercase/#operator_lowercase","page":"lowercase","title":"Lowercase Operator","text":"","category":"section"},{"location":"operators/transformation/lowercase/","page":"lowercase","title":"lowercase","text":"lowercase","category":"page"},{"location":"operators/transformation/lowercase/#Base.Unicode.lowercase","page":"lowercase","title":"Base.Unicode.lowercase","text":"lowercase()\n\nCreates an lowercase operator, which forces each value to be in lower case\n\nProducing\n\nStream of type <: Subscribable{L} where L referes to type of data of input Observable\n\nExamples\n\nusing Rocket\n\nsource = of(\"Hello, world!\")\nsubscribe!(source |> lowercase(), logger())\n;\n\n# output\n\n[LogActor] Data: hello, world!\n[LogActor] Completed\n\nSee also: AbstractOperator, InferableOperator, ProxyObservable, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/transformation/lowercase/#See-also","page":"lowercase","title":"See also","text":"","category":"section"},{"location":"operators/transformation/lowercase/","page":"lowercase","title":"lowercase","text":"Operators, map, uppercase","category":"page"},{"location":"operators/transformation/merge_map/#operator_merge_map","page":"merge_map","title":"MergeMap Operator","text":"","category":"section"},{"location":"operators/transformation/merge_map/","page":"merge_map","title":"merge_map","text":"merge_map","category":"page"},{"location":"operators/transformation/merge_map/#Rocket.merge_map","page":"merge_map","title":"Rocket.merge_map","text":"merge_map(::Type{R}, mappingFn::F = identity; concurrent::Int = typemax(Int)) where { R, F <: Function }\n\nCreates a merge_map operator, which returns an Observable that emits the result of applying the projection function mappingFn to each item emitted by the source Observable and merging the results of the Observables obtained from this transformation.\n\nArguments\n\n::Type{R}: the type of data of output Observables after projection with mappingFn\nmappingFn::F: projection function with (data) -> Observable{R} signature\nconcurrent::Int: optional, default is typemax(Int), maximum number of input Observables being subscribed to concurrently\n\nProducing\n\nStream of type <: Subscribable{R}\n\nExamples\n\nusing Rocket\n\nsource = from([ 0, 0 ]) |> merge_map(Int, d -> from([ 1, 2, 3 ], scheduler = AsyncScheduler(0)))\nsubscribe!(source, logger())\n;\n\n# output\n\n[LogActor] Data: 1\n[LogActor] Data: 1\n[LogActor] Data: 2\n[LogActor] Data: 2\n[LogActor] Data: 3\n[LogActor] Data: 3\n[LogActor] Completed\n\nSee also: AbstractOperator, RightTypedOperator, ProxyObservable, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/transformation/merge_map/#See-also","page":"merge_map","title":"See also","text":"","category":"section"},{"location":"operators/transformation/merge_map/","page":"merge_map","title":"merge_map","text":"Operators","category":"page"},{"location":"teardown/types/void/#teardown_void","page":"Void","title":"Void Teardown","text":"","category":"section"},{"location":"teardown/types/void/","page":"Void","title":"Void","text":"VoidTeardown\nvoidTeardown","category":"page"},{"location":"teardown/types/void/#Rocket.VoidTeardown","page":"Void","title":"Rocket.VoidTeardown","text":"VoidTeardown()\n\nVoidTeardown object does nothing on unsubscription. It is usefull for synchronous observables and observables which cannot be cancelled after execution.\n\nSee also: Teardown, VoidTeardownLogic\n\n\n\n\n\n","category":"type"},{"location":"teardown/types/void/#Rocket.voidTeardown","page":"Void","title":"Rocket.voidTeardown","text":"voidTeardown\n\nAn instance of VoidTeardown singleton object.\n\nSee also: VoidTeardown\n\n\n\n\n\n","category":"constant"},{"location":"operators/transformation/substitute/#operator_substitute","page":"substitute","title":"Substitute Operator","text":"","category":"section"},{"location":"operators/transformation/substitute/","page":"substitute","title":"substitute","text":"substitute\nSubstituteHandler","category":"page"},{"location":"operators/transformation/substitute/#Rocket.substitute","page":"substitute","title":"Rocket.substitute","text":"substitute(::Type{T}, mapFn::F, handler::SubstituteHandler) where { T, F <: Function }\n\nThis operator forces observable to substitute each emmited value with the latest computed value with the corresponding handler and release! function. After release! on handler substitute operator computes new value with mapFn but does not emit it until next emission from source observable. Always calls mapFn on first value from source observable.\n\nProducing\n\nStream of type <: Subscribable{T} \n\nExamples\n\nusing Rocket\n\nsubject = Subject(Int)\n\nhandler = SubstituteHandler()\nsource = subject |> substitute(String, i -> string(\"i = \", i), handler)\n\nsubscription = subscribe!(source, logger())\n\nnext!(subject, 1)\nnext!(subject, 2)\nnext!(subject, 3)\n\nrelease!(handler)\n\nnext!(subject, 4)\nnext!(subject, 5)\nnext!(subject, 6)\n\nunsubscribe!(subscription)\n;\n\n# output\n\n[LogActor] Data: i = 1\n[LogActor] Data: i = 1\n[LogActor] Data: i = 1\n[LogActor] Data: i = 3\n[LogActor] Data: i = 3\n[LogActor] Data: i = 3\n\nSee also: SubstituteHandler\n\n\n\n\n\n","category":"function"},{"location":"operators/transformation/substitute/#Rocket.SubstituteHandler","page":"substitute","title":"Rocket.SubstituteHandler","text":"SubstituteHandler()\n\nhandler used to release! new values in substitute operator.\n\nSee also: substitute\n\n\n\n\n\n","category":"type"},{"location":"operators/transformation/substitute/#See-also","page":"substitute","title":"See also","text":"","category":"section"},{"location":"operators/transformation/substitute/","page":"substitute","title":"substitute","text":"Operators","category":"page"},{"location":"operators/mathematical/about/#Mathematical-and-Aggregate-category","page":"About mathematical operators","title":"Mathematical and Aggregate category","text":"","category":"section"},{"location":"operators/mathematical/about/","page":"About mathematical operators","title":"About mathematical operators","text":"There are operators for different purposes, and they may be categorized as: creation, transformation, filtering, joining, multicasting, error handling, utility, etc. In the following list you will find all the operators organized in mathematical and aggregate category.","category":"page"},{"location":"operators/mathematical/about/","page":"About mathematical operators","title":"About mathematical operators","text":"count\nmax\nmin\nreduce\nsum","category":"page"},{"location":"operators/mathematical/about/#See-also","page":"About mathematical operators","title":"See also","text":"","category":"section"},{"location":"operators/mathematical/about/","page":"About mathematical operators","title":"About mathematical operators","text":"Operators","category":"page"},{"location":"operators/utility/async/#operator_ref_async","page":"async","title":"Async Operator","text":"","category":"section"},{"location":"operators/utility/async/","page":"async","title":"async","text":"async","category":"page"},{"location":"operators/utility/async/#Rocket.async","page":"async","title":"Rocket.async","text":"async(size::Int = typemax(Int))\n\nCreates an async operator, which sends items from the source Observable asynchronously.\n\nArguments\n\nsize: Asynchronous messages buffer size, default is a typemax(Int)\n\nProducing\n\nStream of type <: Subscribable{L} where L refers to type of source stream\n\nSee also: AbstractOperator, InferableOperator, ProxyObservable\n\n\n\n\n\n","category":"function"},{"location":"operators/utility/async/#See-also","page":"async","title":"See also","text":"","category":"section"},{"location":"operators/utility/async/","page":"async","title":"async","text":"Operators","category":"page"},{"location":"operators/transformation/enumerate/#operator_enumerate","page":"enumerate","title":"Enumerate Operator","text":"","category":"section"},{"location":"operators/transformation/enumerate/","page":"enumerate","title":"enumerate","text":"enumerate","category":"page"},{"location":"operators/transformation/enumerate/#Base.Iterators.enumerate","page":"enumerate","title":"Base.Iterators.enumerate","text":"enumerate()\n\nCreates an enumerate operator, which converts each value emitted by the source Observable into a tuple of its order number and the value itself.\n\nThe enumerate operator is similar to scan(Tuple{Int, Int}, (d, c) -> (d, c[2] + 1), (0, 0)) (see scan).\n\nProducing\n\nStream of type <: Subscribable{Tuple{Int, L}} where L refers to type of source stream\n\nExamples\n\nusing Rocket\n\nsource = from([ 0 for _ in 1:3 ])\nsubscribe!(source |> enumerate(), logger())\n;\n\n# output\n\n[LogActor] Data: (1, 0)\n[LogActor] Data: (2, 0)\n[LogActor] Data: (3, 0)\n[LogActor] Completed\n\n\nSee also: AbstractOperator, InferableOperator, ProxyObservable, scan, map, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/transformation/enumerate/#Description","page":"enumerate","title":"Description","text":"","category":"section"},{"location":"operators/transformation/enumerate/","page":"enumerate","title":"enumerate","text":"enumerate returns an Observable that converts each value emitted by the source Observable into a tuple of its order number and the value itself.","category":"page"},{"location":"operators/transformation/enumerate/#Example","page":"enumerate","title":"Example","text":"","category":"section"},{"location":"operators/transformation/enumerate/","page":"enumerate","title":"enumerate","text":"Get a value from the source with its order number","category":"page"},{"location":"operators/transformation/enumerate/","page":"enumerate","title":"enumerate","text":"using Rocket\n\nsource = from([ 0.0, 0.2, 0.4, 0.6, 0.8, 1.0 ])\nsubscribe!(source |> enumerate(), logger())\n\n# output\n\n[LogActor] Data: (0.0, 1)\n[LogActor] Data: (0.2, 2)\n[LogActor] Data: (0.4, 3)\n[LogActor] Data: (0.6, 4)\n[LogActor] Data: (0.8, 5)\n[LogActor] Data: (1.0, 6)\n[LogActor] Completed","category":"page"},{"location":"operators/transformation/enumerate/#See-also","page":"enumerate","title":"See also","text":"","category":"section"},{"location":"operators/transformation/enumerate/","page":"enumerate","title":"enumerate","text":"Operators, scan","category":"page"},{"location":"actors/types/sync/#actor_sync","page":"Sync","title":"Sync actor","text":"","category":"section"},{"location":"actors/types/sync/","page":"Sync","title":"Sync","text":"sync","category":"page"},{"location":"actors/types/sync/#Rocket.sync","page":"Sync","title":"Rocket.sync","text":"sync(actor::A; withlock::Bool = true, timeout::Int = -1) where A\nsync(factory::F; withlock::Bool = true, timeout::Int = -1) where { F <: AbstractActorFactory }\n\nCreation operator for the SyncActor actor. Accepts optional named timeout argument which specifies maximum number of milliseconds to wait (throws SyncActorTimedOutException() on timeout). Also accepts optional withlock boolean flag indicating that every next!, error! and complete! event should be guarded with ReentrantLock.\n\nExamples\n\nusing Rocket\n\nactor = keep(Int)\nsynced = sync(actor)\n\nsubscribe!(from(0:5, scheduler = AsyncScheduler()), synced)\n\nyield()\n\nwait(synced)\nshow(synced.actor.values)\n\n# output\n[0, 1, 2, 3, 4, 5]\n\nCan also be used with an <: AbstractActorFactory as an argument. In this case sync function will return a special actor factory object, which will store all created actors in array and wrap them with a sync function. wait(sync_factory) method will wait for all of the created actors to be completed in the order of creation (but only once for each of them).\n\nusing Rocket\n\nvalues = Int[]\n\nfactory = lambda(on_next = (d) -> push!(values, d))\nsynced = sync(factory)\n\nsubscribe!(from(0:5, scheduler = AsyncScheduler()), synced)\n\nyield()\n\nwait(synced)\nshow(values)\n\n# output\n[0, 1, 2, 3, 4, 5]\n\nSee also: SyncActor, AbstractActor\n\n\n\n\n\n","category":"function"},{"location":"actors/types/sync/","page":"Sync","title":"Sync","text":"SyncActor","category":"page"},{"location":"actors/types/sync/#Rocket.SyncActor","page":"Sync","title":"Rocket.SyncActor","text":"SyncActor{T, A}(actor::A; withlock::Bool = true, timeout::Int = -1) where { T, A }\n\nSync actor provides a synchronized interface to wait for an actor to be notified with a complete event. By default creates a re-entrant lock for synchronizing next!, error! and complete! events.\n\nSee also: Actor, sync\n\n\n\n\n\n","category":"type"},{"location":"operators/utility/limit_subscribers/#operator_limit_subscribers","page":"limit_subscribers","title":"LimitSubscribers Operator","text":"","category":"section"},{"location":"operators/utility/limit_subscribers/","page":"limit_subscribers","title":"limit_subscribers","text":"LimitSubscribersGuard\nlimit_subscribers","category":"page"},{"location":"operators/utility/limit_subscribers/#Rocket.LimitSubscribersGuard","page":"limit_subscribers","title":"Rocket.LimitSubscribersGuard","text":"LimitSubscribersGuard(limit::Int = 1, exclusive = true)\n\nGuard structure used in limit_subscribers operator.\n\nArguments\n\nlimit: number of concurrent subscribers\nexclusive: boolean flag, which indicates whenever this guard can be shared with other observables in other limit_subscribers operator. If set to true, reusing this guard in a different limit_subscribers operator for other observable will result in automatic unsubscription of all present actors.\n\nNote\n\nThis structure is useful in Pluto.jl notebooks in particular, allowing for automatic subscription/unsubscription of observables.\n\nExample\n\n\n# Cell 1\nguard = LimitSubscribersGuard()\n\n# Cell 2\nsubscription = subscribe!(some_stream |> limit_subscribers(guard), logger())\n\nSee also: limit_subscribers, subscribe!\n\n\n\n\n\n","category":"type"},{"location":"operators/utility/limit_subscribers/#Rocket.limit_subscribers","page":"limit_subscribers","title":"Rocket.limit_subscribers","text":"limit_subscribers(limit::Int = 1, exclusive::Bool = true)\nlimit_subscribers(guard::LimitSubscribersGuard)\n\nCreates an operator that limits number of concurrent actors to the given observable. On new subscription, if limit is exceeded, oldest actor is automatically unsubscribed and receives a completion event.\n\nArguments\n\nlimit: number of concurrent subscribers\nexclusive: boolean flag, which indicates whenever this guard can be shared with other observables in other limit_subscribers operator. If set to true, reusing this guard in a different limit_subscribers operator for other observable will result in automatic unsubscription of all present actors.\n\nNote\n\nThis structure is useful in Pluto.jl notebooks in particular, allowing for automatic subscription/unsubscription of observables.\n\nExample\n\n\n# Cell 1\nguard = LimitSubscribersGuard()\n\n# Cell 2\nsubscription = subscribe!(some_stream |> limit_subscribers(guard), logger())\n\nSee also: LimitSubscribersGuard\n\n\n\n\n\n","category":"function"},{"location":"operators/utility/limit_subscribers/#See-also","page":"limit_subscribers","title":"See also","text":"","category":"section"},{"location":"operators/utility/limit_subscribers/","page":"limit_subscribers","title":"limit_subscribers","text":"Operators","category":"page"},{"location":"operators/utility/skip_error/#operator_skip_error","page":"skip_error","title":"SkipError Operator","text":"","category":"section"},{"location":"operators/utility/skip_error/","page":"skip_error","title":"skip_error","text":"skip_error","category":"page"},{"location":"operators/utility/skip_error/#Rocket.skip_error","page":"skip_error","title":"Rocket.skip_error","text":"skip_error()\n\nCreates a skip_error operator, which filters out error event by the source Observable by emitting only next and complete messages.\n\nProducing\n\nStream of type <: Subscribable{L} where L refers to type of source stream\n\nExamples\n\nusing Rocket\n\nsource = faulted(\"error\")\nsubscribe!(source |> skip_error(), logger())\n;\n\n# output\n\n\nSee also: AbstractOperator, InferableOperator, ProxyObservable, skip_error, skip_complete, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/utility/skip_error/#See-also","page":"skip_error","title":"See also","text":"","category":"section"},{"location":"operators/utility/skip_error/","page":"skip_error","title":"skip_error","text":"Operators","category":"page"},{"location":"api/observables/#observables_api","page":"Observables","title":"Observables API","text":"","category":"section"},{"location":"api/observables/","page":"Observables","title":"Observables","text":"Any observable-like should implement a valid subscribable logic.","category":"page"},{"location":"api/observables/#Traits","page":"Observables","title":"Traits","text":"","category":"section"},{"location":"api/observables/","page":"Observables","title":"Observables","text":"as_subscribable\nSubscribableTrait\nSimpleSubscribableTrait\nScheduledSubscribableTrait\nInvalidSubscribableTrait","category":"page"},{"location":"api/observables/#Rocket.as_subscribable","page":"Observables","title":"Rocket.as_subscribable","text":"as_subscribable(any)\n\nThis function checks subscribable trait behavior specification. Can be used explicitly to specify subscribable trait behavior for any object.\n\nSee also: SubscribableTrait\n\n\n\n\n\n","category":"function"},{"location":"api/observables/#Rocket.SubscribableTrait","page":"Observables","title":"Rocket.SubscribableTrait","text":"Abstract type for all possible subscribable traits\n\nSee also: SimpleSubscribableTrait, ScheduledSubscribableTrait, InvalidSubscribableTrait\n\n\n\n\n\n","category":"type"},{"location":"api/observables/#Rocket.SimpleSubscribableTrait","page":"Observables","title":"Rocket.SimpleSubscribableTrait","text":"Simple subscribable trait behavior. Simple subscribable can be used in subscribe! function and just executes on_subscribe! method for provided subscribable. SimpleSubscribableTrait is a subtype of SubscribableTrait.\n\nSee also: SubscribableTrait, Subscribable, subscribe!, on_subscribe!\n\n\n\n\n\n","category":"type"},{"location":"api/observables/#Rocket.ScheduledSubscribableTrait","page":"Observables","title":"Rocket.ScheduledSubscribableTrait","text":"Scheduled subscribable trait behavior. Scheduled subscribable can be used in subscribe! function and executes on_subscribe! method for provided subscribable with custom scheduling. ScheduledSubscribableTrait is a subtype of SubscribableTrait.\n\nSee also: SubscribableTrait, ScheduledSubscribable, subscribe!, on_subscribe!\n\n\n\n\n\n","category":"type"},{"location":"api/observables/#Rocket.InvalidSubscribableTrait","page":"Observables","title":"Rocket.InvalidSubscribableTrait","text":"Default subscribable trait behavior for all types. Invalid subscribable cannot be used in subscribe! function, doing so will throw an error. InvalidSubscribableTrait is a subtype of SubscribableTrait.\n\nSee also: SubscribableTrait, subscribe!\n\n\n\n\n\n","category":"type"},{"location":"api/observables/#Types","page":"Observables","title":"Types","text":"","category":"section"},{"location":"api/observables/","page":"Observables","title":"Observables","text":"AbstractSubscribable\nSubscribable\nScheduledSubscribable\nsubscribe!\non_subscribe!","category":"page"},{"location":"api/observables/#Rocket.AbstractSubscribable","page":"Observables","title":"Rocket.AbstractSubscribable","text":"Supertype type for Subscribable and ScheduledSubscribable types.\n\nSee also: Subscribable, ScheduledSubscribable\n\n\n\n\n\n","category":"type"},{"location":"api/observables/#Rocket.Subscribable","page":"Observables","title":"Rocket.Subscribable","text":"Super type for any simple subscribable object. Automatically specifies a SimpleSubscribableTrait trait behavior. Objects with specified SimpleSubscribableTrait subscribable trait must implement: on_subscribe!(subscribable, actor) method. Subscribable is a subtype of AbstractSubscribable type.\n\nExamples\n\nusing Rocket\n\nstruct MySubscribable <: Subscribable{String} end\n\nRocket.as_subscribable(MySubscribable)\n\n# output\n\nSimpleSubscribableTrait{String}()\n\nSee also: SubscribableTrait, SimpleSubscribableTrait\n\n\n\n\n\n","category":"type"},{"location":"api/observables/#Rocket.ScheduledSubscribable","page":"Observables","title":"Rocket.ScheduledSubscribable","text":"Super type for any scheduled subscribable object. Automatically specifies a ScheduledSubscribableTrait trait behavior. Objects with specified ScheduledSubscribableTrait subscribable trait must implement: on_subscribe!(subscribable, actor, scheduler) method. ScheduledSubscribable is a subtype of AbstractSubscribable type.\n\nExamples\n\nusing Rocket\n\nstruct MyScheduledSubscribable <: ScheduledSubscribable{String} end\n\nRocket.as_subscribable(MyScheduledSubscribable)\n\n# output\n\nScheduledSubscribableTrait{String}()\n\nSee also: SubscribableTrait, ScheduledSubscribableTrait\n\n\n\n\n\n","category":"type"},{"location":"api/observables/#Rocket.subscribe!","page":"Observables","title":"Rocket.subscribe!","text":"subscribe!(subscribable::T, actor::S) where { T, S }\nsubscribe!(subscribable::T, factory::F) where { T, F <: AbstractActorFactory }\nsubscribe!(subscriptions::Tuple)\nsubscribe!(subscriptions::AbstractVector)\n\nsubscribe! function is used to attach an actor to subscribable. It also checks types of subscribable and actors to be a valid Subscribable and Actor objects respectively. Passing not valid subscribable or/and actor object will throw an error. If the input argument to the subscribe! function is either a tuple or a vector, it will first check that all of the arguments are valid source and actor objects and if its true will subscribe for each of them individually. \n\nArguments\n\nsubscribable: valid subscribable object\nactor: valid actor object\n\nExamples\n\nusing Rocket\n\nsource = from((1, 2, 3))\nsubscribe!(source, logger())\n;\n\n# output\n\n[LogActor] Data: 1\n[LogActor] Data: 2\n[LogActor] Data: 3\n[LogActor] Completed\n\nusing Rocket\n\nsource = from((1, 2, 3))\nsubscribe!(source, 1)\n;\n\n# output\n\nERROR: Type Int64 is not a valid actor type.\n[...]\n\nusing Rocket\n\nsource = from((1, 2, 3))\nsubscribe!(1, logger())\n;\n\n# output\n\nERROR: Type Int64 is not a valid subscribable type.\n[...]\n\nSee also: on_subscribe!, as_subscribable\n\n\n\n\n\n","category":"function"},{"location":"api/observables/#Rocket.on_subscribe!","page":"Observables","title":"Rocket.on_subscribe!","text":"on_subscribe!(subscribable, actor)\non_subscribe!(subscribable, actor, scheduler)\n\nEvery valid subscribable object have to define its own method for on_subscribe! function which specifies subscription logic and has return a valid Teardown object.\n\nObjects with specified SimpleSubscribableTrait subscribable trait must implement: on_subscribe!(subscribable, actor) method. Objects with specified ScheduledSubscribableTrait subscribable trait must implement: on_subscribe!(subscribable, actor, scheduler) method.\n\nArguments\n\nsubscribable: Subscribable object\nactor: Actor object\nscheduler: Scheduler object (only for scheduled subscribables)\n\nExamples\n\nusing Rocket\n\nstruct MySubscribable <: Subscribable{Int} end\n\nfunction Rocket.on_subscribe!(subscribable::MySubscribable, actor)\n next!(actor, 0)\n complete!(actor)\n return voidTeardown\nend\n\nsubscribe!(MySubscribable(), logger())\n;\n\n# output\n\n[LogActor] Data: 0\n[LogActor] Completed\n\nusing Rocket\n\nstruct MyScheduledSubscribable <: ScheduledSubscribable{Int} end\n\nRocket.getscheduler(::MyScheduledSubscribable) = AsapScheduler()\n\nfunction Rocket.on_subscribe!(subscribable::MyScheduledSubscribable, actor, scheduler)\n next!(actor, 0, scheduler)\n complete!(actor, scheduler)\n return voidTeardown\nend\n\nsubscribe!(MyScheduledSubscribable(), logger())\n;\n\n# output\n\n[LogActor] Data: 0\n[LogActor] Completed\n\nSee also: Subscribable, ScheduledSubscribable, SimpleSubscribableTrait, ScheduledSubscribableTrait, Teardown, logger\n\n\n\n\n\n","category":"function"},{"location":"api/observables/#Errors","page":"Observables","title":"Errors","text":"","category":"section"},{"location":"api/observables/","page":"Observables","title":"Observables","text":"InvalidSubscribableTraitUsageError\nInconsistentActorWithSubscribableDataTypesError\nMissingOnSubscribeImplementationError\nMissingOnScheduledSubscribeImplementationError","category":"page"},{"location":"api/observables/#Rocket.InvalidSubscribableTraitUsageError","page":"Observables","title":"Rocket.InvalidSubscribableTraitUsageError","text":"This error will be thrown if subscribe! function is called with invalid subscribable object\n\nSee also: subscribe!\n\n\n\n\n\n","category":"type"},{"location":"api/observables/#Rocket.InconsistentActorWithSubscribableDataTypesError","page":"Observables","title":"Rocket.InconsistentActorWithSubscribableDataTypesError","text":"This error will be thrown if subscribe! function is called with inconsistent subscribable and actor objects\n\nSee also: subscribe!\n\n\n\n\n\n","category":"type"},{"location":"api/observables/#Rocket.MissingOnSubscribeImplementationError","page":"Observables","title":"Rocket.MissingOnSubscribeImplementationError","text":"This error will be thrown if Julia cannot find specific method of 'on_subscribe!()' function for given subscribable and actor\n\nSee also: on_subscribe!\n\n\n\n\n\n","category":"type"},{"location":"api/observables/#Rocket.MissingOnScheduledSubscribeImplementationError","page":"Observables","title":"Rocket.MissingOnScheduledSubscribeImplementationError","text":"This error will be thrown if Julia cannot find specific method of 'on_subscribe!()' function for given subscribable, actor and scheduler\n\nSee also: on_subscribe!\n\n\n\n\n\n","category":"type"},{"location":"operators/mathematical/sum/#operator_sum","page":"sum","title":"Sum Operator","text":"","category":"section"},{"location":"operators/mathematical/sum/","page":"sum","title":"sum","text":"sum","category":"page"},{"location":"operators/mathematical/sum/#Base.sum","page":"sum","title":"Base.sum","text":"sum(; from = nothing)\n\nCreates a sum operator, which applies a sum accumulator function over the source Observable, and returns the accumulated result when the source completes, given an optional initial value.\n\nThe sum operator is similar to reduce(T, T, +) (see reduce).\n\nArguments\n\nfrom: optional initial accumulation value, if nothing first value will be used instead\n\nProducing\n\nStream of type <: Subscribable{L} where L refers to type of source stream\n\nExamples\n\nusing Rocket\n\nsource = from([ i for i in 1:42 ])\nsubscribe!(source |> sum(), logger())\n;\n\n# output\n\n[LogActor] Data: 903\n[LogActor] Completed\n\n\nusing Rocket\n\nsource = from([ i for i in 1:42 ])\nsubscribe!(source |> sum(from = 97), logger())\n;\n\n# output\n\n[LogActor] Data: 1000\n[LogActor] Completed\n\n\nSee also: AbstractOperator, InferableOperator, ProxyObservable, reduce, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/mathematical/sum/#Description","page":"sum","title":"Description","text":"","category":"section"},{"location":"operators/mathematical/sum/","page":"sum","title":"sum","text":"sum operates on an Observable of objects on which + is defined. When the source Observable completes, it emits the sum of all previous items. The sum operator is similar to reduce(T, T, +) (see reduce).","category":"page"},{"location":"operators/mathematical/sum/#See-also","page":"sum","title":"See also","text":"","category":"section"},{"location":"operators/mathematical/sum/","page":"sum","title":"sum","text":"Operators, reduce","category":"page"},{"location":"actors/types/void/#actor_void","page":"Void","title":"Void actor","text":"","category":"section"},{"location":"actors/types/void/","page":"Void","title":"Void","text":"void","category":"page"},{"location":"actors/types/void/#Rocket.void","page":"Void","title":"Rocket.void","text":"void()\nvoid(::Type{T}) where T\n\nCreation operator for the VoidActor actor.\n\nExamples\n\nusing Rocket\n\nactor = void(Int)\nactor isa VoidActor{Int}\n\n# output\ntrue\n\n\nSee also: VoidActor, AbstractActor\n\n\n\n\n\n","category":"function"},{"location":"actors/types/void/","page":"Void","title":"Void","text":"VoidActor","category":"page"},{"location":"actors/types/void/#Rocket.VoidActor","page":"Void","title":"Rocket.VoidActor","text":"VoidActor{D}() where D\n\nVoid actor does nothing with input data, error and complete events, can be useful for debugging (e.g. to start side-effects with tap operator)\n\nExamples\n\nusing Rocket\n\nsource = from([ 0, 1, 2 ])\nactor = VoidActor{Int}()\n\nsubscribe!(source, actor)\n;\n\n# output\n\n\nSee also: Actor, void, tap\n\n\n\n\n\n","category":"type"},{"location":"observables/types/proxy/#observable_proxy","page":"Proxy","title":"Proxy Observable","text":"","category":"section"},{"location":"observables/types/proxy/","page":"Proxy","title":"Proxy","text":"ProxyObservable might help to create a custom operator. It wraps either source and/or actor with their proxied versions providing additional custom logic for on_subscribe! and/or for on_next!, on_error!, on_complete! methods.","category":"page"},{"location":"observables/types/proxy/","page":"Proxy","title":"Proxy","text":"proxy\nProxyObservable","category":"page"},{"location":"observables/types/proxy/#Rocket.proxy","page":"Proxy","title":"Rocket.proxy","text":"proxy(::Type{L}, source, proxy) where L\n\nCreation operator for the ProxyObservable with a given source and proxy objects.\n\nExample\n\nusing Rocket\n\nsource = from(1:5)\n\nstruct MyCustomProxy <: ActorProxy end\n\nstruct MyCustomActor{A} <: Actor{Int}\n actor :: A\nend\n\nRocket.on_next!(actor::MyCustomActor, data::Int) = next!(actor.actor, data ^ 2)\nRocket.on_error!(actor::MyCustomActor, err) = error!(actor.actor, err)\nRocket.on_complete!(actor::MyCustomActor) = complete!(actor.actor)\n\nRocket.actor_proxy!(::Type{Int}, proxy::MyCustomProxy, actor::A) where A = MyCustomActor{A}(actor)\n\nproxied = proxy(Int, source, MyCustomProxy())\n\nsubscribe!(proxied, logger())\n;\n\n# output\n\n[LogActor] Data: 1\n[LogActor] Data: 4\n[LogActor] Data: 9\n[LogActor] Data: 16\n[LogActor] Data: 25\n[LogActor] Completed\n\nSee also: ProxyObservable, ActorProxy, SourceProxy, ActorSourceProxy\n\n\n\n\n\n","category":"function"},{"location":"observables/types/proxy/#Rocket.ProxyObservable","page":"Proxy","title":"Rocket.ProxyObservable","text":"ProxyObservable{L, S, P}(proxied_source::S, proxy::P)\n\nAn interface for proxied Observables.\n\nSee also: proxy\n\n\n\n\n\n","category":"type"},{"location":"observables/types/proxy/","page":"Proxy","title":"Proxy","text":"ActorProxy\nSourceProxy\nActorSourceProxy","category":"page"},{"location":"observables/types/proxy/#Rocket.ActorProxy","page":"Proxy","title":"Rocket.ActorProxy","text":"ActorProxy\n\nCan be used as a super type for common proxy object. Automatically specifies ValidActorProxy trait behavior. Each ActorProxy must implement its own method for actor_proxy!(::Type, proxy, actor) function which have to return a valid actor object.\n\nSee also: proxy, actor_proxy!\n\n\n\n\n\n","category":"type"},{"location":"observables/types/proxy/#Rocket.SourceProxy","page":"Proxy","title":"Rocket.SourceProxy","text":"SourceProxy\n\nCan be used as a super type for common proxy object. Automatically specifies ValidSourceProxy trait behavior. Each SourceProxy must implement its own method for source_proxy!(::Type, proxy, source) function which have to return a valid subscribable object.\n\nSee also: proxy, source_proxy!\n\n\n\n\n\n","category":"type"},{"location":"observables/types/proxy/#Rocket.ActorSourceProxy","page":"Proxy","title":"Rocket.ActorSourceProxy","text":"ActorSourceProxy\n\nCan be used as a super type for common proxy object. Automatically specifies ValidActorSourceProxy trait behavior. Each ActorSourceProxy must implement its own method for source_proxy!(::Type, proxy, source) function which have to return a valid subscribable object and also for actor_proxy!(::Type, proxy, actor) function which have to return a valid actor object..\n\nSee also: proxy, actor_proxy!, source_proxy!\n\n\n\n\n\n","category":"type"},{"location":"observables/types/proxy/","page":"Proxy","title":"Proxy","text":"actor_proxy!\nsource_proxy!","category":"page"},{"location":"observables/types/proxy/#Rocket.actor_proxy!","page":"Proxy","title":"Rocket.actor_proxy!","text":"actor_proxy!(::Type, proxy, actor)\n\nThis is function is used to wrap an actor with its proxied version given a particular proxy object. Must return another actor. Each valid ActorProxy and ActorSourceProxy must implement its own method for actor_proxy! function. The first argument is the same as the type of data of the connected proxy observable.\n\nSee also: proxy, ActorProxy, ActorSourceProxy\n\n\n\n\n\n","category":"function"},{"location":"observables/types/proxy/#Rocket.source_proxy!","page":"Proxy","title":"Rocket.source_proxy!","text":"source_proxy!(::Type, proxy, source)\n\nThis is function is used to wrap a source with its proxied version given a particular proxy object. Must return another Observable. Each valid SourceProxy and ActorSourceProxy must implement its own method for source_proxy! function. The first argument is the same as the type of data of the connected proxy observable.\n\nSee also: proxy, SourceProxy, ActorSourceProxy\n\n\n\n\n\n","category":"function"},{"location":"operators/transformation/to_array/#operator_to_array","page":"to_array","title":"Uppercase Operator","text":"","category":"section"},{"location":"operators/transformation/to_array/","page":"to_array","title":"to_array","text":"to_array","category":"page"},{"location":"operators/transformation/to_array/#Rocket.to_array","page":"to_array","title":"Rocket.to_array","text":"to_array()\n\nCreates a to_array operator, which reduces all values into a single array and returns this result when the source completes.\n\nProducing\n\nStream of type <: Subscribable{Vector{L}} where L refers to type of source stream\n\nExamples\n\nusing Rocket\n\nsource = from([ 1, 2, 3 ])\nsubscribe!(source |> to_array(), logger())\n;\n\n# output\n\n[LogActor] Data: [1, 2, 3]\n[LogActor] Completed\n\n\nSee also: AbstractOperator, InferableOperator, ProxyObservable, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/transformation/to_array/#See-also","page":"to_array","title":"See also","text":"","category":"section"},{"location":"operators/transformation/to_array/","page":"to_array","title":"to_array","text":"Operators, map, lowercase","category":"page"},{"location":"operators/transformation/about/#Transformation-category","page":"About transformation operators","title":"Transformation category","text":"","category":"section"},{"location":"operators/transformation/about/","page":"About transformation operators","title":"About transformation operators","text":"There are operators for different purposes, and they may be categorized as: creation, transformation, filtering, joining, multicasting, error handling, utility, etc. In the following list you will find all the operators organized in transformation category.","category":"page"},{"location":"operators/transformation/about/","page":"About transformation operators","title":"About transformation operators","text":"map\nmap_to\nscan\naccumulated\nenumerate\nuppercase\nlowercase\nto_array\nswitch_map\nswitch_map_to\nmerge_map\nconcat_map\nconcat_map_to\nexhaust_map\nstart_with\npairwise\nsubstitute\noverride","category":"page"},{"location":"operators/transformation/about/#See-also","page":"About transformation operators","title":"See also","text":"","category":"section"},{"location":"operators/transformation/about/","page":"About transformation operators","title":"About transformation operators","text":"Operators","category":"page"}] +[{"location":"operators/utility/skip_complete/#operator_skip_complete","page":"skip_complete","title":"SkipComplete Operator","text":"","category":"section"},{"location":"operators/utility/skip_complete/","page":"skip_complete","title":"skip_complete","text":"skip_complete","category":"page"},{"location":"operators/utility/skip_complete/#Rocket.skip_complete","page":"skip_complete","title":"Rocket.skip_complete","text":"skip_complete()\n\nCreates a skip_complete operator, which filters out complete event by the source Observable by emitting only next and error messages.\n\nProducing\n\nStream of type <: Subscribable{L} where L refers to type of source stream\n\nExamples\n\nusing Rocket\n\nsource = from([ 1, 2, 3 ])\nsubscribe!(source |> skip_complete(), logger())\n;\n\n# output\n[LogActor] Data: 1\n[LogActor] Data: 2\n[LogActor] Data: 3\n\n\nSee also: AbstractOperator, InferableOperator, ProxyObservable, skip_error, skip_next, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/utility/skip_complete/#See-also","page":"skip_complete","title":"See also","text":"","category":"section"},{"location":"operators/utility/skip_complete/","page":"skip_complete","title":"skip_complete","text":"Operators","category":"page"},{"location":"operators/transformation/start_with/#operator_start_with","page":"start_with","title":"StartWith Operator","text":"","category":"section"},{"location":"operators/transformation/start_with/","page":"start_with","title":"start_with","text":"start_with","category":"page"},{"location":"operators/transformation/start_with/#Rocket.start_with","page":"start_with","title":"Rocket.start_with","text":"start_with(object::O) where O\n\nCreates a start_with operator, which forces an observable to emit given object as a first value.\n\nProducing\n\nStream of type <: Subscribable{Union{L, O}} where L refers to type of source stream <: Subscribable{L}\n\nExamples\n\nusing Rocket\n\nsource = from(1:3) |> start_with(0)\nsubscribe!(source, logger())\n;\n\n# output\n\n[LogActor] Data: 0\n[LogActor] Data: 1\n[LogActor] Data: 2\n[LogActor] Data: 3\n[LogActor] Completed\n\nSee also: AbstractOperator, InferableOperator, ProxyObservable, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/transformation/start_with/#See-also","page":"start_with","title":"See also","text":"","category":"section"},{"location":"operators/transformation/start_with/","page":"start_with","title":"start_with","text":"Operators","category":"page"},{"location":"actors/types/server/#actor_server","page":"Server","title":"Server actor","text":"","category":"section"},{"location":"actors/types/server/","page":"Server","title":"Server","text":"server","category":"page"},{"location":"actors/types/server/#Rocket.server","page":"Server","title":"Rocket.server","text":"server(port::Int)\nserver(address::A, port::Int) where { A <: IPAddr }\nserver(::Type{D}, port::Int)\nserver(::Type{D}, address::A, port::Int) where { A <: IPAddr }\n\nCreation operator for the ServerActor actor.\n\nSee also: AbstractActor\n\n\n\n\n\n","category":"function"},{"location":"actors/types/server/","page":"Server","title":"Server","text":"ServerActor","category":"page"},{"location":"actors/types/server/#Rocket.ServerActor","page":"Server","title":"Rocket.ServerActor","text":"ServerActor{D, Address, Port}() where D\n\nThe ServerActor sends all next!/error!/complete! events to the local network listeners with specified Address and Port parameters via TCPSocket.\n\nSee also: Actor, server\n\n\n\n\n\n","category":"type"},{"location":"operators/transformation/exhaust_map/#operator_exhaust_map","page":"exhaust_map","title":"ExhaustMap Operator","text":"","category":"section"},{"location":"operators/transformation/exhaust_map/","page":"exhaust_map","title":"exhaust_map","text":"exhaust_map","category":"page"},{"location":"operators/transformation/exhaust_map/#Rocket.exhaust_map","page":"exhaust_map","title":"Rocket.exhaust_map","text":"exhaust_map(::Type{R}, mappingFn::F = identity) where { R, F <: Function }\n\nCreates a exhaust_map operator, which returns an Observable containing projected Observables of each item of the source, ignoring projected Observables that start before their preceding Observable has completed. Essentially it projects each source value to an Observable which is merged in the output Observable only if the previous projected Observable has completed.\n\nArguments\n\n::Type{R}: the type of data of output Observables after projection with mappingFn\nmappingFn::F: projection function with (data) -> Observable{R} signature\n\nProducing\n\nStream of type <: Subscribable{R}\n\nExamples\n\nusing Rocket\n\nsource = from([ 0, 0 ]) |> async() |> exhaust_map(Int, d -> from([ 1, 2 ]) |> async())\nsubscribe!(source, logger())\n;\n\n# output\n\n[LogActor] Data: 1\n[LogActor] Data: 2\n[LogActor] Completed\n\nSee also: AbstractOperator, RightTypedOperator, ProxyObservable, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/transformation/exhaust_map/#See-also","page":"exhaust_map","title":"See also","text":"","category":"section"},{"location":"operators/transformation/exhaust_map/","page":"exhaust_map","title":"exhaust_map","text":"Operators","category":"page"},{"location":"operators/utility/ref_count/#operator_ref_count","page":"ref_count","title":"Ref Count Operator","text":"","category":"section"},{"location":"operators/utility/ref_count/","page":"ref_count","title":"ref_count","text":"ref_count","category":"page"},{"location":"operators/utility/ref_count/#Rocket.ref_count","page":"ref_count","title":"Rocket.ref_count","text":"ref_count()\n\nMake a ConnectableObservable behave like a ordinary observable and automates the way you can connect to it. Internally it counts the subscriptions to the observable and subscribes (only once) to the source if the number of subscriptions is larger than 0. If the number of subscriptions is smaller than 1, it unsubscribes from the source. This way you can make sure that everything before the published refCount has only a single subscription independently of the number of subscribers to the target observable.\n\nNote that using the share operator is exactly the same as using the publish operator (making the observable hot) and the ref_count() operator in a sequence.\n\nExample\n\nusing Rocket\n\nsubject = Subject(Int, scheduler = AsapScheduler())\nsource = from(1:5) |> multicast(subject) |> ref_count()\n\nactor1 = logger(\"1\")\nactor2 = logger(\"2\")\n\nsubscription1 = subscribe!(source, actor1)\nsubscription2 = subscribe!(source, actor2)\n\nunsubscribe!(subscription1)\nunsubscribe!(subscription2)\n;\n\n# output\n[1] Data: 1\n[1] Data: 2\n[1] Data: 3\n[1] Data: 4\n[1] Data: 5\n[1] Completed\n[2] Completed\n\nSee also: AbstractOperator, publish, multicast, share\n\n\n\n\n\n","category":"function"},{"location":"operators/utility/ref_count/#See-also","page":"ref_count","title":"See also","text":"","category":"section"},{"location":"operators/utility/ref_count/","page":"ref_count","title":"ref_count","text":"Operators","category":"page"},{"location":"actors/types/keep/#actor_keep","page":"Keep","title":"Keep actor","text":"","category":"section"},{"location":"actors/types/keep/","page":"Keep","title":"Keep","text":"keep","category":"page"},{"location":"actors/types/keep/#Rocket.keep","page":"Keep","title":"Rocket.keep","text":"keep(::Type{T}) where T\n\nArguments\n\n::Type{T}: Type of keep data\n\nCreation operator for the KeepActor actor.\n\nExamples\n\nusing Rocket\n\nactor = keep(Int)\nactor isa KeepActor{Int}\n\n# output\ntrue\n\nSee also: KeepActor, AbstractActor\n\n\n\n\n\n","category":"function"},{"location":"actors/types/keep/","page":"Keep","title":"Keep","text":"KeepActor","category":"page"},{"location":"actors/types/keep/#Rocket.KeepActor","page":"Keep","title":"Rocket.KeepActor","text":"KeepActor{D}() where D\n\nKeep actor provides a storage actor. It saves all incoming successful next events in a values array, throws an ErrorException on error! event and does nothing on completion event.\n\nExamples\n\nusing Rocket\n\nsource = from(1:5)\nactor = keep(Int)\n\nsubscribe!(source, actor)\nshow(getvalues(actor))\n\n# output\n[1, 2, 3, 4, 5]\n\nSee also: Actor, keep\n\n\n\n\n\n","category":"type"},{"location":"observables/types/collected/#observable_collected","page":"Collected","title":"Collected Observable","text":"","category":"section"},{"location":"observables/types/collected/","page":"Collected","title":"Collected","text":"collectLatest","category":"page"},{"location":"observables/types/collected/#Rocket.collectLatest","page":"Collected","title":"Rocket.collectLatest","text":"collectLatest(sources::S, mappingFn::F = copy, callbackFn::C = nothing)\ncollectLatest(::Type{T}, ::Type{R}, sources::S, mappingFn::F = copy, callbackFn::C = nothing)\n\nCollects values from multible Observables and emits it in one single array every time each inner Observable has a new value. Reemits errors from inner observables. Completes when all inner observables completes.\n\nArguments\n\nsources: input sources\nmappingFn: optional mappingFn applied to an array of emited values, copy by default, should return a Vector\ncallbackFn: optional callback function, which is called right after mappingFn has been evaluated, accepts the state of the inner actor and the computed value, nothing by default\n\nNote: collectLatest completes immediately if sources are empty.\n\nOptional arguments\n\n::Type{T}: optional type of emmiting values of inner observables\n::Type{R}: optional return type after applying mappingFn to a vector of values\n\nExamples\n\nusing Rocket\n\ncollected = collectLatest([ of(1), from([ 1, 2 ]) ])\n\nsubscribe!(collected, logger())\n;\n\n# output\n\n[LogActor] Data: [1, 1]\n[LogActor] Data: [1, 2]\n[LogActor] Completed\n\nSee also: Subscribable, subscribe!, combineLatest\n\n\n\n\n\n","category":"function"},{"location":"observables/types/collected/#Description","page":"Collected","title":"Description","text":"","category":"section"},{"location":"observables/types/collected/","page":"Collected","title":"Collected","text":"collectLatest collects the values from all Observables in its vector argument. This is done by subscribing to each Observable in order and, whenever an Observable emits, collecting a vector of the most recent values from each Observable (in order). If you pass n Observables to collectLatest, the returned Observable will always emit an ordered vector of n values.","category":"page"},{"location":"observables/types/collected/","page":"Collected","title":"Collected","text":"To ensure that the output vector has a consistent length, collectLatest waits for all input Observables to emit at least once before it starts emitting results. This means that if some Observable emits values before other Observables started emitting, all these values but the last will be lost. On the other hand, if some Observable does not emit a value but completes, the resulting Observable will complete simultaneously without emitting anything. Furthermore, if some input Observable does not emit any value and never completes, collectLatest will also never emit and never complete.","category":"page"},{"location":"observables/types/collected/","page":"Collected","title":"Collected","text":"If at least one Observable was passed to collectLatest and all passed Observables emitted, then the resulting Observable will complete when all combined streams complete. So even if some Observable completes, the result of collectLatest will still emit values when the other Observables do. In case of a completed Observable, its value will now remain to be the last emitted value. On the other hand, if any Observable errors, collectLatest will also immediately error.","category":"page"},{"location":"observables/types/defer/#observable_defer","page":"Defer","title":"Defer Observable","text":"","category":"section"},{"location":"observables/types/defer/","page":"Defer","title":"Defer","text":"defer","category":"page"},{"location":"observables/types/defer/#Rocket.defer","page":"Defer","title":"Rocket.defer","text":"defer(::Type{D}, factoryFn::F) where { D, F <: Function }\n\nCreates an Observable that, on subscribe, calls an Observable factory to make an Observable for each new Observer.\n\nArguments\n\nT: type of output data source, created by the factoryFn\nfactoryFn: the Observable factory function to invoke for each Observer that subscribes to the output Observable\n\nExamples\n\nusing Rocket\n\nsource = defer(Int, () -> from([ 1, 2, 3 ]))\n\nsubscribe!(source, logger())\n;\n\n# output\n[LogActor] Data: 1\n[LogActor] Data: 2\n[LogActor] Data: 3\n[LogActor] Completed\n\nSee also: Subscribable, subscribe!, logger\n\n\n\n\n\n","category":"function"},{"location":"observables/types/defer/#Description","page":"Defer","title":"Description","text":"","category":"section"},{"location":"observables/types/defer/","page":"Defer","title":"Defer","text":"defer allows you to create the Observable only when the Actor subscribes, and create a fresh Observable for each Actor. It waits until an Actor subscribes to it, and then it generates an Observable, typically with an Observable factory function. It does this afresh for each subscriber, so although each subscriber may think it is subscribing to the same Observable, in fact each subscriber gets its own individual Observable.","category":"page"},{"location":"operators/filtering/last/#operator_last","page":"last","title":"Last Operator","text":"","category":"section"},{"location":"operators/filtering/last/","page":"last","title":"last","text":"last","category":"page"},{"location":"operators/filtering/last/#Base.last","page":"last","title":"Base.last","text":"last(; default = nothing)\n\nCreates a last operator, which returns an Observable that emits only the last item emitted by the source Observable. Sends LastNotFoundException error message if a given source completes without emitting a single value.\n\nArguments\n\ndefault: an optional default value to provide if no values were emitted\n\nProducing\n\nStream of type <: Subscribable{L} where L refers to type of source stream\n\nExamples\n\nusing Rocket\n\nsource = from([ 1, 2, 3 ])\nsubscribe!(source |> last(), logger())\n;\n\n# output\n\n[LogActor] Data: 3\n[LogActor] Completed\n\n\nusing Rocket\n\nsource = from(Int[])\nsubscribe!(source |> last() |> catch_error((err, obs) -> of(1)), logger())\n;\n\n# output\n\n[LogActor] Data: 1\n[LogActor] Completed\n\nusing Rocket\n\nsource = from(Int[])\nsubscribe!(source |> last(default = 1), logger())\n;\n\n# output\n\n[LogActor] Data: 1\n[LogActor] Completed\n\nSee also: AbstractOperator, InferableOperator, ProxyObservable, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/filtering/last/#Description","page":"last","title":"Description","text":"","category":"section"},{"location":"operators/filtering/last/","page":"last","title":"last","text":"last operator returns an Observable that emits only the last item emitted by the source Observable.","category":"page"},{"location":"operators/filtering/last/#See-also","page":"last","title":"See also","text":"","category":"section"},{"location":"operators/filtering/last/","page":"last","title":"last","text":"Operators","category":"page"},{"location":"operators/utility/tap_on_subscribe/#operator_tap_on_subscribe","page":"tap_on_subscribe","title":"TapOnSubscribe Operator","text":"","category":"section"},{"location":"operators/utility/tap_on_subscribe/","page":"tap_on_subscribe","title":"tap_on_subscribe","text":"TapBeforeSubscription\nTapAfterSubscription\ntap_on_subscribe","category":"page"},{"location":"operators/utility/tap_on_subscribe/#Rocket.TapBeforeSubscription","page":"tap_on_subscribe","title":"Rocket.TapBeforeSubscription","text":"TapBeforeSubscription\n\nOne of the strategies for tap_on_subscribe operator. With TapBeforeSubscription tap callback will be called before actual subscription.\n\nSee also: tap_on_subscribe, TapAfterSubscription\n\n\n\n\n\n","category":"type"},{"location":"operators/utility/tap_on_subscribe/#Rocket.TapAfterSubscription","page":"tap_on_subscribe","title":"Rocket.TapAfterSubscription","text":"TapAfterSubscription\n\nOne of the strategies for tap_on_subscribe operator. With TapBeforeSubscription tap callback will be called after actual subscription.\n\nSee also: tap_on_subscribe, TapBeforeSubscription\n\n\n\n\n\n","category":"type"},{"location":"operators/utility/tap_on_subscribe/#Rocket.tap_on_subscribe","page":"tap_on_subscribe","title":"Rocket.tap_on_subscribe","text":"tap_on_subscribe(tapFn::F, strategy::S = TapBeforeSubscription()) where { F <: Function }\n\nCreates a tap operator, which performs a side effect on the subscription on the source Observable, but return an Observable that is identical to the source.\n\nArguments\n\ntapFn::Function: side-effect tap function with () -> Nothing signature\nstrategy: (optional), specifies the order of a side-effect and an actual subscription, uses TapBeforeSubscription by default\n\nProducing\n\nStream of type <: Subscribable{L} where L refers to type of source stream\n\nExamples\n\nusing Rocket\n\nsource = from([ 1, 2, 3 ])\nsubscribe!(source |> tap_on_subscribe(() -> println(\"Someone subscribed\")), logger())\n;\n\n# output\n\nSomeone subscribed\n[LogActor] Data: 1\n[LogActor] Data: 2\n[LogActor] Data: 3\n[LogActor] Completed\n\nusing Rocket\n\nsource = from([ 1, 2, 3 ])\nsubscribe!(source |> tap_on_subscribe(() -> println(\"Someone subscribed\"), TapAfterSubscription()), logger())\n;\n\n# output\n\n[LogActor] Data: 1\n[LogActor] Data: 2\n[LogActor] Data: 3\n[LogActor] Completed\nSomeone subscribed\n\nSee also: TapBeforeSubscription, TapAfterSubscription, tap, tap_on_unsubscribe, tap_on_complete, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/utility/tap_on_subscribe/#Description","page":"tap_on_subscribe","title":"Description","text":"","category":"section"},{"location":"operators/utility/tap_on_subscribe/","page":"tap_on_subscribe","title":"tap_on_subscribe","text":"Returns an Observable that resembles the source Observable, but modifies it so that the provided Observer is called to perform a side effect on subscription to the source.","category":"page"},{"location":"operators/utility/tap_on_subscribe/","page":"tap_on_subscribe","title":"tap_on_subscribe","text":"This operator is useful for debugging your Observables, verifying correctness, or performing other side effects.","category":"page"},{"location":"operators/utility/tap_on_subscribe/","page":"tap_on_subscribe","title":"tap_on_subscribe","text":"Note: this operator differs from a subscribe on the Observable. If the Observable returned by tap_on_subscribe is not subscribed, the side effects specified by the Observer will never happen. tap_on_subscribe therefore simply spies on future execution, it does not trigger an execution to happen like subscribe does.","category":"page"},{"location":"operators/utility/tap_on_subscribe/#See-also","page":"tap_on_subscribe","title":"See also","text":"","category":"section"},{"location":"operators/utility/tap_on_subscribe/","page":"tap_on_subscribe","title":"tap_on_subscribe","text":"Operators","category":"page"},{"location":"operators/utility/safe/#operator_safe","page":"safe","title":"Safe Operator","text":"","category":"section"},{"location":"operators/utility/safe/","page":"safe","title":"safe","text":"safe","category":"page"},{"location":"operators/utility/safe/#Rocket.safe","page":"safe","title":"Rocket.safe","text":"safe()\n\nCreates a SafeOperator, which wraps on_subscribe! and each next!, error! and complete! callbacks into try-catch block.\n\nProducing\n\nStream of type <: Subscribable{L} where L refers to type of source stream\n\nSee also: AbstractOperator, InferableOperator, ProxyObservable, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/utility/safe/#See-also","page":"safe","title":"See also","text":"","category":"section"},{"location":"operators/utility/safe/","page":"safe","title":"safe","text":"Operators","category":"page"},{"location":"operators/utility/skip_next/#operator_skip_next","page":"skip_next","title":"SkipNext Operator","text":"","category":"section"},{"location":"operators/utility/skip_next/","page":"skip_next","title":"skip_next","text":"skip_next","category":"page"},{"location":"operators/utility/skip_next/#Rocket.skip_next","page":"skip_next","title":"Rocket.skip_next","text":"skip_next()\n\nCreates a skip_next operator, which filters out all next messages by the source Observable by emitting only error and complete messages.\n\nProducing\n\nStream of type <: Subscribable{L} where L refers to type of source stream\n\nExamples\n\nusing Rocket\n\nsource = from([ 1, 2, 3 ])\nsubscribe!(source |> skip_next(), logger())\n;\n\n# output\n[LogActor] Completed\n\n\nSee also: AbstractOperator, InferableOperator, ProxyObservable, skip_error, skip_complete, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/utility/skip_next/#See-also","page":"skip_next","title":"See also","text":"","category":"section"},{"location":"operators/utility/skip_next/","page":"skip_next","title":"skip_next","text":"Operators","category":"page"},{"location":"operators/transformation/switch_map/#operator_switch_map","page":"switch_map","title":"SwitchMap Operator","text":"","category":"section"},{"location":"operators/transformation/switch_map/","page":"switch_map","title":"switch_map","text":"switch_map","category":"page"},{"location":"operators/transformation/switch_map/#Rocket.switch_map","page":"switch_map","title":"Rocket.switch_map","text":"switch_map(::Type{R}, mappingFn::F = identity) where { R, F <: Function }\n\nCreates a switch_map operator, which returns an Observable that emits items based on applying a function mappingFn that you supply to each item emitted by the source Observable, where that function returns an (so-called \"inner\") Observable. Each time it observes one of these inner Observables, the output Observable begins emitting the items emitted by that inner Observable. When a new inner Observable is emitted, switch_map stops emitting items from the earlier-emitted inner Observable and begins emitting items from the new one. It continues to behave like this for subsequent inner Observables.\n\nArguments\n\n::Type{R}: the type of data of output Observables after projection with mappingFn\nmappingFn::F: projection function with (data) -> Observable{R} signature\n\nProducing\n\nStream of type <: Subscribable{R}\n\nExamples\n\nusing Rocket\n\nsource = from([ of(1), of(2), of(3) ])\nsubscribe!(source |> switch_map(Int), logger())\n;\n\n# output\n\n[LogActor] Data: 1\n[LogActor] Data: 2\n[LogActor] Data: 3\n[LogActor] Completed\n\nusing Rocket\n\nsource = from([ 1, 2, 3 ])\nsubscribe!(source |> switch_map(Float64, (d) -> of(convert(Float64, d ^ 2))), logger())\n;\n\n# output\n\n[LogActor] Data: 1.0\n[LogActor] Data: 4.0\n[LogActor] Data: 9.0\n[LogActor] Completed\n\nSee also: AbstractOperator, RightTypedOperator, ProxyObservable, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/transformation/switch_map/#See-also","page":"switch_map","title":"See also","text":"","category":"section"},{"location":"operators/transformation/switch_map/","page":"switch_map","title":"switch_map","text":"Operators","category":"page"},{"location":"api/actors/#actors_api","page":"Actors","title":"Actors API","text":"","category":"section"},{"location":"api/actors/#How-to-create-a-custom-Actor","page":"Actors","title":"How to create a custom Actor","text":"","category":"section"},{"location":"api/actors/","page":"Actors","title":"Actors","text":"At first custom actor should implement a custom method for the as_actor function. Rocket.jl also provides a number of helper actor abstract types with predefined as_actor method behavior (see Traits API section).","category":"page"},{"location":"api/actors/","page":"Actors","title":"Actors","text":"using Rocket\n\nstruct MyCustomActor end\n\nas_actor(::Type{<:MyCustomActor}) = Rocket.BaseActorTrait{Int}()\n","category":"page"},{"location":"api/actors/","page":"Actors","title":"Actors","text":"or","category":"page"},{"location":"api/actors/","page":"Actors","title":"Actors","text":"using Rocket\n\nstruct MyCustomActor <: Actor{Int} end # Automatically specifies BaseActorTrait{Int} behavior.","category":"page"},{"location":"api/actors/","page":"Actors","title":"Actors","text":"Additionally custom actor must provide a custom methods for on_next!, on_error! and/or on_complete! functions. Depending on specified actor trait behavior some methods may or may not be optional.","category":"page"},{"location":"api/actors/","page":"Actors","title":"Actors","text":"using Rocket\n\nstruct MyCustomActor <: Actor{Int} end\n\nRocket.on_next!(actor::MyCustomActor, data::Int) = # custom logic here\nRocket.on_error!(actor::MyCustomActor, err) = # custom logic here\nRocket.on_complete!(actor::MyCustomActor) = # custom logic here","category":"page"},{"location":"api/actors/","page":"Actors","title":"Actors","text":"or","category":"page"},{"location":"api/actors/","page":"Actors","title":"Actors","text":"using Rocket\n\nstruct MyCustomCompletionActor <: CompletionActor{Int} end\n\nRocket.on_complete!(actor::MyCustomCompletionActor) = # custom logic here","category":"page"},{"location":"api/actors/#actors_api_traits","page":"Actors","title":"Traits","text":"","category":"section"},{"location":"api/actors/","page":"Actors","title":"Actors","text":"as_actor\nActorTrait\nBaseActorTrait\nNextActorTrait\nErrorActorTrait\nCompletionActorTrait\nInvalidActorTrait","category":"page"},{"location":"api/actors/#Rocket.as_actor","page":"Actors","title":"Rocket.as_actor","text":"as_actor(any)\n\nThis function checks actor trait behavior specification. May be used explicitly to specify actor trait behavior for any object.\n\nSee also: ActorTrait\n\n\n\n\n\n","category":"function"},{"location":"api/actors/#Rocket.ActorTrait","page":"Actors","title":"Rocket.ActorTrait","text":"Abstract type for all possible actor traits\n\nSee also: BaseActorTrait, NextActorTrait, ErrorActorTrait, CompletionActorTrait, InvalidActorTrait\n\n\n\n\n\n","category":"type"},{"location":"api/actors/#Rocket.BaseActorTrait","page":"Actors","title":"Rocket.BaseActorTrait","text":"Base actor trait specifies actor to listen for all next!, error! and complete! events. BaseActorTrait is a subtype of ActorTrait.\n\nSee also: Actor\n\n\n\n\n\n","category":"type"},{"location":"api/actors/#Rocket.NextActorTrait","page":"Actors","title":"Rocket.NextActorTrait","text":"Next actor trait specifies actor to listen for next! events only. NextActorTrait is a subtype of ActorTrait.\n\nSee also: NextActor\n\n\n\n\n\n","category":"type"},{"location":"api/actors/#Rocket.ErrorActorTrait","page":"Actors","title":"Rocket.ErrorActorTrait","text":"Error actor trait specifies actor to listen for error! events only. ErrorActorTrait is a subtype of ActorTrait.\n\nSee also: ErrorActor\n\n\n\n\n\n","category":"type"},{"location":"api/actors/#Rocket.CompletionActorTrait","page":"Actors","title":"Rocket.CompletionActorTrait","text":"Completion actor trait specifies actor to listen for complete! events only. CompletionActorTrait is a subtype of ActorTrait.\n\nSee also: CompletionActor\n\n\n\n\n\n","category":"type"},{"location":"api/actors/#Rocket.InvalidActorTrait","page":"Actors","title":"Rocket.InvalidActorTrait","text":"Default actor trait behavior for any object. Actor with such a trait specificaion cannot be used as a valid actor in subscribe! function. Doing so will raise an error. InvalidActorTrait is a subtype of ActorTrait.\n\nSee also: ActorTrait\n\n\n\n\n\n","category":"type"},{"location":"api/actors/#Types","page":"Actors","title":"Types","text":"","category":"section"},{"location":"api/actors/","page":"Actors","title":"Actors","text":"AbstractActor\nActor\nNextActor\nErrorActor\nCompletionActor","category":"page"},{"location":"api/actors/#Rocket.AbstractActor","page":"Actors","title":"Rocket.AbstractActor","text":"Supertype type for Actor, NextActor, ErrorActor and CompletionActor types.\n\nSee also: Actor, NextActor, ErrorActor, CompletionActor\n\n\n\n\n\n","category":"type"},{"location":"api/actors/#Rocket.Actor","page":"Actors","title":"Rocket.Actor","text":"Can be used as a super type for common actor. Automatically specifies a BaseActorTrait trait behavior. Every Actor must implement its own methods for on_next!(actor, data), on_error!(actor, err) and on_complete!(actor) functions. Actor is a subtype of AbstractActor type.\n\nExamples\n\nusing Rocket\n\nstruct MyActor <: Actor{String} end\n\nRocket.as_actor(MyActor)\n\n# output\n\nBaseActorTrait{String}()\n\nSee also: AbstractActor, as_actor, BaseActorTrait, ActorTrait, on_next!, on_error!, on_complete!\n\n\n\n\n\n","category":"type"},{"location":"api/actors/#Rocket.NextActor","page":"Actors","title":"Rocket.NextActor","text":"Can be used as a super type for \"next-only\" actor. Automatically specifies a NextActorTrait trait behavior. Every NextActor must implement its own methods for on_next!(actor, data) function only. NextActor is a subtype of AbstractActor type.\n\nExamples\n\nusing Rocket\n\nstruct MyNextActor <: NextActor{String} end\n\nRocket.as_actor(MyNextActor)\n\n# output\n\nNextActorTrait{String}()\n\nSee also: AbstractActor, as_actor, NextActorTrait, ActorTrait, on_next!\n\n\n\n\n\n","category":"type"},{"location":"api/actors/#Rocket.ErrorActor","page":"Actors","title":"Rocket.ErrorActor","text":"Can be used as a super type for \"error-only\" actor. Automatically specifies a ErrorActorTrait trait behavior. Every ErrorActor must implement its own methods for on_error!(actor, err) function only. ErrorActor is a subtype of AbstractActor type.\n\nExamples\n\nusing Rocket\n\nstruct MyErrorActor <: ErrorActor{String} end\n\nRocket.as_actor(MyErrorActor)\n\n# output\n\nErrorActorTrait{String}()\n\nSee also: AbstractActor, as_actor, ErrorActorTrait, ActorTrait, on_error!\n\n\n\n\n\n","category":"type"},{"location":"api/actors/#Rocket.CompletionActor","page":"Actors","title":"Rocket.CompletionActor","text":"Can be used as a super type for \"completion-only\" actor. Automatically specifies a CompletionActorTrait trait behavior. Every CompletionActor must implement its own methods for on_complete!(actor) function only. CompletionActor is a subtype of AbstractActor type.\n\nExamples\n\nusing Rocket\n\nstruct MyCompletionActor <: CompletionActor{String} end\n\nRocket.as_actor(MyCompletionActor)\n\n# output\n\nCompletionActorTrait{String}()\n\nSee also: AbstractActor, as_actor, CompletionActorTrait, ActorTrait, on_complete!\n\n\n\n\n\n","category":"type"},{"location":"api/actors/#Events","page":"Actors","title":"Events","text":"","category":"section"},{"location":"api/actors/","page":"Actors","title":"Actors","text":"next!\nerror!\ncomplete!","category":"page"},{"location":"api/actors/#Rocket.next!","page":"Actors","title":"Rocket.next!","text":"next!(actor, data)\nnext!(actor, data, scheduler)\n\nThis function is used to deliver a \"next\" event to an actor with some data. Takes optional scheduler object to schedule execution of data delivery.\n\nSee also: AbstractActor, on_next!\n\n\n\n\n\n","category":"function"},{"location":"api/actors/#Rocket.error!","page":"Actors","title":"Rocket.error!","text":"error!(actor, err)\nerror!(actor, err, scheduler)\n\nThis function is used to deliver a \"error\" event to an actor with some err. Takes optional scheduler object to schedule execution of error delivery.\n\nSee also: AbstractActor, on_error!\n\n\n\n\n\n","category":"function"},{"location":"api/actors/#Rocket.complete!","page":"Actors","title":"Rocket.complete!","text":"complete!(actor)\ncomplete!(actor, scheduler)\n\nThis function is used to deliver a \"complete\" event to an actor. Takes optional scheduler object to schedule execution of complete event delivery.\n\nSee also: AbstractActor, on_complete!\n\n\n\n\n\n","category":"function"},{"location":"api/actors/","page":"Actors","title":"Actors","text":"on_next!\non_error!\non_complete!","category":"page"},{"location":"api/actors/#Rocket.on_next!","page":"Actors","title":"Rocket.on_next!","text":"on_next!(actor, data)\n\nBoth Actor and NextActor objects must implement its own method for on_next! function which will be called on \"next\" event.\n\nSee also: Actor, NextActor\n\n\n\n\n\n","category":"function"},{"location":"api/actors/#Rocket.on_error!","page":"Actors","title":"Rocket.on_error!","text":"on_error!(actor, err)\n\nBoth Actor and ErrorActor objects must implement its own method for on_error! function which will be called on \"error\" event.\n\nSee also: Actor, ErrorActor\n\n\n\n\n\n","category":"function"},{"location":"api/actors/#Rocket.on_complete!","page":"Actors","title":"Rocket.on_complete!","text":"on_complete!(actor)\n\nBoth Actor and CompletionActor objects must implement its own method for on_complete! function which will be called on \"complete\" event.\n\nSee also: Actor, CompletionActor\n\n\n\n\n\n","category":"function"},{"location":"api/actors/#Factory","page":"Actors","title":"Factory","text":"","category":"section"},{"location":"api/actors/","page":"Actors","title":"Actors","text":"AbstractActorFactory\ncreate_actor\nMissingCreateActorFactoryImplementationError","category":"page"},{"location":"api/actors/#Rocket.AbstractActorFactory","page":"Actors","title":"Rocket.AbstractActorFactory","text":"Abstract type for all possible actor factories\n\nSee also: Actor\n\n\n\n\n\n","category":"type"},{"location":"api/actors/#Rocket.create_actor","page":"Actors","title":"Rocket.create_actor","text":"create_actor(::Type{L}, factory::F) where { L, F <: AbstractActorFactory }\n\nActor creator function for a given factory F. Should be implemented explicitly for any AbstractActorFactory object\n\nSee also: AbstractActorFactory, MissingCreateActorFactoryImplementationError\n\n\n\n\n\n","category":"function"},{"location":"api/actors/#Rocket.MissingCreateActorFactoryImplementationError","page":"Actors","title":"Rocket.MissingCreateActorFactoryImplementationError","text":"This error will be throw if Julia cannot find specific method of 'create_actor()' function for given actor factory\n\nSee also: AbstractActorFactory, create_actor\n\n\n\n\n\n","category":"type"},{"location":"api/actors/#Errors","page":"Actors","title":"Errors","text":"","category":"section"},{"location":"api/actors/","page":"Actors","title":"Actors","text":"InvalidActorTraitUsageError\nInconsistentSourceActorDataTypesError\nMissingDataArgumentInNextCall\nMissingErrorArgumentInErrorCall\nExtraArgumentInCompleteCall\nMissingOnNextImplementationError\nMissingOnErrorImplementationError\nMissingOnCompleteImplementationError","category":"page"},{"location":"api/actors/#Rocket.InvalidActorTraitUsageError","page":"Actors","title":"Rocket.InvalidActorTraitUsageError","text":"This error will be thrown if next!, error! or complete! functions are called with invalid actor object\n\nSee also: next!, error!, complete!, InvalidActorTrait\n\n\n\n\n\n","category":"type"},{"location":"api/actors/#Rocket.InconsistentSourceActorDataTypesError","page":"Actors","title":"Rocket.InconsistentSourceActorDataTypesError","text":"This error will be thrown if next! function is called with inconsistent data type\n\nSee also: AbstractActor, Subscribable, next!\n\n\n\n\n\n","category":"type"},{"location":"api/actors/#Rocket.MissingDataArgumentInNextCall","page":"Actors","title":"Rocket.MissingDataArgumentInNextCall","text":"This error will be thrown if next! function is called without data argument\n\nSee also: next!\n\n\n\n\n\n","category":"type"},{"location":"api/actors/#Rocket.MissingErrorArgumentInErrorCall","page":"Actors","title":"Rocket.MissingErrorArgumentInErrorCall","text":"This error will be thrown if error! function is called without err argument\n\nSee also: error!\n\n\n\n\n\n","category":"type"},{"location":"api/actors/#Rocket.ExtraArgumentInCompleteCall","page":"Actors","title":"Rocket.ExtraArgumentInCompleteCall","text":"This error will be thrown if complete! function is called with extra data/err argument\n\nSee also: complete!\n\n\n\n\n\n","category":"type"},{"location":"api/actors/#Rocket.MissingOnNextImplementationError","page":"Actors","title":"Rocket.MissingOnNextImplementationError","text":"This error will be thrown if Julia cannot find specific method of 'on_next!()' function for given actor and data\n\nSee also: on_next!\n\n\n\n\n\n","category":"type"},{"location":"api/actors/#Rocket.MissingOnErrorImplementationError","page":"Actors","title":"Rocket.MissingOnErrorImplementationError","text":"This error will be thrown if Julia cannot find specific method of 'on_error!()' function for given actor\n\nSee also: on_error!\n\n\n\n\n\n","category":"type"},{"location":"api/actors/#Rocket.MissingOnCompleteImplementationError","page":"Actors","title":"Rocket.MissingOnCompleteImplementationError","text":"This error will be thrown if Julia cannot find specific method of 'on_complete!()' function for given actor and data\n\nSee also: on_next!\n\n\n\n\n\n","category":"type"},{"location":"observables/types/array/#observable_array","page":"Array","title":"Array Observable","text":"","category":"section"},{"location":"observables/types/array/","page":"Array","title":"Array","text":"from","category":"page"},{"location":"observables/types/array/#Rocket.from","page":"Array","title":"Rocket.from","text":"from(x; scheduler::H = AsapScheduler()) where { H <: AbstractScheduler }\nfrom(a::Vector{D}; scheduler::H = AsapScheduler()) where { D, H <: AbstractScheduler }\n\nCreation operator for the ArrayObservable that emits either a single value if x has a Scalar trait specification or a collection of values if x has a NonScalar trait specification. Throws an ErrorException if x has UndefinedScalarness trait type. To specify scalarness for arbitrary type T some can implement an additional method for scalarness(::Type{<:MyType}) function and to specify scalarness behavior. Optionally accepts custom scheduler-like object to schedule messages delivery.\n\nArguments\n\nx: an object to be wrapped into array of values\nscheduler: optional, scheduler-like object\n\nFor an object x to be a valid input for a from operator it must implement Rocket.scalarness(::Type{ <: T }) method which should return either Rocket.Scalar or Rocket.NonScalar objects. In first case from operator will treat x as a single scalar value and will wrap it into a vector while in the second case from operator will convert x object into an array using collect function.\n\nFor arbitrary iterable objects consider using iterable creation operator.\n\nNote\n\nfrom operators creates a copy of x using collect on a given object.\n\nExamples\n\nusing Rocket\n\nsource = from([ 0, 1, 2 ])\nsubscribe!(source, logger())\n;\n\n# output\n\n[LogActor] Data: 0\n[LogActor] Data: 1\n[LogActor] Data: 2\n[LogActor] Completed\n\n\nusing Rocket\n\nsource = from(( 0, 1, 2 ))\nsubscribe!(source, logger())\n;\n\n# output\n\n[LogActor] Data: 0\n[LogActor] Data: 1\n[LogActor] Data: 2\n[LogActor] Completed\n\n\nusing Rocket\n\nsource = from(0)\nsubscribe!(source, logger())\n;\n\n# output\n\n[LogActor] Data: 0\n[LogActor] Completed\n\n\nusing Rocket\n\nsource = from(\"Hello, world!\")\nsubscribe!(source, logger())\n;\n\n# output\n\n[LogActor] Data: H\n[LogActor] Data: e\n[LogActor] Data: l\n[LogActor] Data: l\n[LogActor] Data: o\n[LogActor] Data: ,\n[LogActor] Data:\n[LogActor] Data: w\n[LogActor] Data: o\n[LogActor] Data: r\n[LogActor] Data: l\n[LogActor] Data: d\n[LogActor] Data: !\n[LogActor] Completed\n\n\nSee also: ArrayObservable, subscribe!, logger, iterable\n\n\n\n\n\n","category":"function"},{"location":"observables/types/array/","page":"Array","title":"Array","text":"ArrayObservable","category":"page"},{"location":"observables/types/array/#Rocket.ArrayObservable","page":"Array","title":"Rocket.ArrayObservable","text":"ArrayObservable{D, H}(values::Vector{D}, scheduler::H) where { D, H }\n\nArrayObservable wraps a regular Julia array into an observable. Uses scheduler object to schedule messages delivery.\n\nConstructor arguments\n\nvalues: array of values to be wrapped\nscheduler: Scheduler-like object\n\nSee also: Subscribable, from\n\n\n\n\n\n","category":"type"},{"location":"api/teardown/#teardown_api","page":"Teardown","title":"Teardown API","text":"","category":"section"},{"location":"api/teardown/","page":"Teardown","title":"Teardown","text":"Any subscription-like object should implement a valid teardown logic.","category":"page"},{"location":"api/teardown/#Example","page":"Teardown","title":"Example","text":"","category":"section"},{"location":"api/teardown/","page":"Teardown","title":"Teardown","text":"using Rocket\n\nstruct MuCustomSubscription <: Teardown\n # some fields here\nend\n\nRocket.as_teardown(::Type{<:MuCustomSubscription}) = UnsubscribableTeardownLogic()\n\nfunction on_unsubscribe!(subscription::MyCustomSubscription)\n # dispose resources here\nend","category":"page"},{"location":"api/teardown/#Traits","page":"Teardown","title":"Traits","text":"","category":"section"},{"location":"api/teardown/","page":"Teardown","title":"Teardown","text":"TeardownLogic\nas_teardown\nUnsubscribableTeardownLogic\non_unsubscribe!\nCallableTeardownLogic\nVoidTeardownLogic\nInvalidTeardownLogic","category":"page"},{"location":"api/teardown/#Rocket.TeardownLogic","page":"Teardown","title":"Rocket.TeardownLogic","text":"Abstract type for all possible teardown logic traits.\n\nSee also: UnsubscribableTeardownLogic, CallableTeardownLogic, VoidTeardownLogic, InvalidTeardownLogic\n\n\n\n\n\n","category":"type"},{"location":"api/teardown/#Rocket.as_teardown","page":"Teardown","title":"Rocket.as_teardown","text":"as_teardown(::Type)\n\nThis function checks teardown trait behavior specification. Should be used explicitly to specify teardown logic trait behavior for any object.\n\nExamples\n\nusing Rocket\n\nstruct MySubscription <: Teardown end\n\nRocket.as_teardown(::Type{<:MySubscription}) = UnsubscribableTeardownLogic()\nRocket.on_unsubscribe!(s::MySubscription) = println(\"Unsubscribed!\")\n\nsubscription = MySubscription()\nunsubscribe!(subscription)\n;\n\n# output\n\nUnsubscribed!\n\nSee also: Teardown, TeardownLogic\n\n\n\n\n\n","category":"function"},{"location":"api/teardown/#Rocket.UnsubscribableTeardownLogic","page":"Teardown","title":"Rocket.UnsubscribableTeardownLogic","text":"Unsubscribable teardown logic trait behavior. Unsubscribable teardown object must define its own method for on_unsubscribe!() function which will be invoked when actor decides to unsubscribe! from Observable.\n\nSee also: TeardownLogic, on_unsubscribe!, unsubscribe!\n\n\n\n\n\n","category":"type"},{"location":"api/teardown/#Rocket.on_unsubscribe!","page":"Teardown","title":"Rocket.on_unsubscribe!","text":"on_unsubscribe!(teardown)\n\nEach valid teardown object with UnsubscribableTeardownLogic trait behavior must implement its own method for on_unsubscribe!() function which will be invoked when actor decides to unsubscribe! from Observable.\n\nSee also: Teardown, TeardownLogic, UnsubscribableTeardownLogic\n\n\n\n\n\n","category":"function"},{"location":"api/teardown/#Rocket.CallableTeardownLogic","page":"Teardown","title":"Rocket.CallableTeardownLogic","text":"Callable teardown logic trait behavior. Callable teardown object must be callable (insert meme with a surprised Pikachu here).\n\nSee also: TeardownLogic, on_unsubscribe!, unsubscribe!\n\n\n\n\n\n","category":"type"},{"location":"api/teardown/#Rocket.VoidTeardownLogic","page":"Teardown","title":"Rocket.VoidTeardownLogic","text":"Void teardown logic trait behavior. Void teardown object does nothing in unsubscribe! and may not define any additional methods.\n\nSee also: TeardownLogic, on_unsubscribe!, unsubscribe!\n\n\n\n\n\n","category":"type"},{"location":"api/teardown/#Rocket.InvalidTeardownLogic","page":"Teardown","title":"Rocket.InvalidTeardownLogic","text":"Default teardown logic trait behavour. Invalid teardwon object cannot be used in unsubscribe! function. Doing so will raise an error.\n\nSee also: TeardownLogic, on_unsubscribe!, unsubscribe!\n\n\n\n\n\n","category":"type"},{"location":"api/teardown/#Types","page":"Teardown","title":"Types","text":"","category":"section"},{"location":"api/teardown/","page":"Teardown","title":"Teardown","text":"Teardown\nunsubscribe!","category":"page"},{"location":"api/teardown/#Rocket.Teardown","page":"Teardown","title":"Rocket.Teardown","text":"Abstract type for any teardown object. Each teardown object must be a subtype of Teardown.\n\nSee also: TeardownLogic\n\n\n\n\n\n","category":"type"},{"location":"api/teardown/#Rocket.unsubscribe!","page":"Teardown","title":"Rocket.unsubscribe!","text":"unsubscribe!(subscription)\nunsubscribe!(subscriptions::Tuple)\nunsubscribe!(subscriptions::AbstractVector)\n\nunsubscribe! function is used to cancel Observable execution and to dispose any kind of resources used during an Observable execution. If the input argument to the unsubscribe! function is either a tuple or a vector, it will first check that all of the arguments are valid subscription objects and if its true will unsubscribe from each of them individually. \n\nSee also: Teardown, TeardownLogic, on_unsubscribe!\n\n\n\n\n\n","category":"function"},{"location":"api/teardown/#Errors","page":"Teardown","title":"Errors","text":"","category":"section"},{"location":"api/teardown/","page":"Teardown","title":"Teardown","text":"InvalidTeardownLogicTraitUsageError\nInvalidMultipleTeardownLogicTraitUsageError\nMissingOnUnsubscribeImplementationError","category":"page"},{"location":"api/teardown/#Rocket.InvalidTeardownLogicTraitUsageError","page":"Teardown","title":"Rocket.InvalidTeardownLogicTraitUsageError","text":"This error will be thrown if unsubscribe! function is called with invalid teardown object.\n\nSee also: unsubscribe!\n\n\n\n\n\n","category":"type"},{"location":"api/teardown/#Rocket.InvalidMultipleTeardownLogicTraitUsageError","page":"Teardown","title":"Rocket.InvalidMultipleTeardownLogicTraitUsageError","text":"This error will be thrown if unsubscribe! function is called with a tuple with invalid teardown object in it.\n\nSee also: unsubscribe!\n\n\n\n\n\n","category":"type"},{"location":"api/teardown/#Rocket.MissingOnUnsubscribeImplementationError","page":"Teardown","title":"Rocket.MissingOnUnsubscribeImplementationError","text":"This error will be thrown if Julia cannot find specific method of on_unsubscribe!() function for given teardown object.\n\nSee also: on_unsubscribe!\n\n\n\n\n\n","category":"type"},{"location":"operators/transformation/accumulated/#operator_accumulated","page":"accumulated","title":"Accumulated Operator","text":"","category":"section"},{"location":"operators/transformation/accumulated/","page":"accumulated","title":"accumulated","text":"accumulated","category":"page"},{"location":"operators/transformation/accumulated/#Rocket.accumulated","page":"accumulated","title":"Rocket.accumulated","text":"accumulated()\n\nCreates an accumulated operator, which returns an Observable that emits the current item with all of the previous items emitted by the source Observable in one single ordered array.\n\nProducing\n\nStream of type <: Subscribable{Vector{L}} where L refers to type of source stream\n\nExamples\n\nusing Rocket\n\nsource = from([ 1, 2, 3 ])\nsubscribe!(source |> accumulated(), logger())\n;\n\n# output\n\n[LogActor] Data: [1]\n[LogActor] Data: [1, 2]\n[LogActor] Data: [1, 2, 3]\n[LogActor] Completed\n\n\nusing Rocket\n\nsource = of(1)\nsubscribe!(source |> accumulated(), logger())\n;\n\n# output\n\n[LogActor] Data: [1]\n[LogActor] Completed\n\nSee also: AbstractOperator, InferableOperator, ProxyObservable, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/transformation/accumulated/#Description","page":"accumulated","title":"Description","text":"","category":"section"},{"location":"operators/transformation/accumulated/","page":"accumulated","title":"accumulated","text":"Combines all values emitted by the source, using an accumulator function that joins a new source value with the all past values emmited into one single array. This is similar to scan with vcat accumulation function.","category":"page"},{"location":"operators/transformation/accumulated/#See-also","page":"accumulated","title":"See also","text":"","category":"section"},{"location":"operators/transformation/accumulated/","page":"accumulated","title":"accumulated","text":"Operators","category":"page"},{"location":"operators/mathematical/max/#operator_max","page":"max","title":"Max Operator","text":"","category":"section"},{"location":"operators/mathematical/max/","page":"max","title":"max","text":"max","category":"page"},{"location":"operators/mathematical/max/#Base.max","page":"max","title":"Base.max","text":"max(; from = nothing)\n\nCreates a max operator, which emits a single item: the item with the largest value.\n\nArguments\n\nfrom: optional initial maximum value, if nothing first item from the source will be used as initial instead\n\nProducing\n\nStream of type <: Subscribable{Union{L, Nothing}} where L refers to type of source stream\n\nExamples\n\nusing Rocket\n\nsource = from([ i for i in 1:42 ])\nsubscribe!(source |> max(), logger())\n;\n\n# output\n\n[LogActor] Data: 42\n[LogActor] Completed\n\n\nSee also: AbstractOperator, InferableOperator, ProxyObservable, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/mathematical/max/#Description","page":"max","title":"Description","text":"","category":"section"},{"location":"operators/mathematical/max/","page":"max","title":"max","text":"The max operator operates on an Observable of similar objects. When the source Observable completes, it emits the item with the largest value.","category":"page"},{"location":"operators/mathematical/max/#See-also","page":"max","title":"See also","text":"","category":"section"},{"location":"operators/mathematical/max/","page":"max","title":"max","text":"Operators","category":"page"},{"location":"operators/errors/catch_error/#operator_catch_error","page":"catch_error","title":"Catch Error Operator","text":"","category":"section"},{"location":"operators/errors/catch_error/","page":"catch_error","title":"catch_error","text":"catch_error","category":"page"},{"location":"operators/errors/catch_error/#Rocket.catch_error","page":"catch_error","title":"Rocket.catch_error","text":"catch_error(selectorFn::F) where F\n\nCreates a CatchErrorOperator, which catches errors on the observable to be handled by returning a new observable or throwing an error.\n\nArguments:\n\nselectorFn::F: a callable object that takes as arguments err, which is the error, and caught, which is the source observable, in case you'd like to \"retry\" that observable by returning it again. Whatever observable is returned by the selector will be used to continue the observable chain.\n\nProducing\n\nStream of type <: Subscribable{L} where L refers to type of source stream\n\nExamples\n\nusing Rocket\n\nsource = from(1:5) |> safe() |> map(Int, (d) -> d == 4 ? error(4) : d) |> catch_error((err, obs) -> of(1))\n\nsubscribe!(source, logger())\n;\n\n# output\n[LogActor] Data: 1\n[LogActor] Data: 2\n[LogActor] Data: 3\n[LogActor] Data: 1\n[LogActor] Completed\n\nSee also: AbstractOperator, InferableOperator, rerun, logger, safe\n\n\n\n\n\n","category":"function"},{"location":"operators/errors/catch_error/#See-also","page":"catch_error","title":"See also","text":"","category":"section"},{"location":"operators/errors/catch_error/","page":"catch_error","title":"catch_error","text":"Operators","category":"page"},{"location":"operators/about/#section_operators","page":"Operator","title":"Operators","text":"","category":"section"},{"location":"operators/about/","page":"Operator","title":"Operator","text":"Even though the Observable is the foundation, reactive extensions are mostly useful because of their operators. Operators are the essential pieces that allow complex asynchronous code to be easily composed in a declarative manner.","category":"page"},{"location":"operators/about/#what_are_operators","page":"Operator","title":"What are operators?","text":"","category":"section"},{"location":"operators/about/","page":"Operator","title":"Operator","text":"There are two kinds of operators:","category":"page"},{"location":"operators/about/#Pipeable-operators","page":"Operator","title":"Pipeable operators","text":"","category":"section"},{"location":"operators/about/","page":"Operator","title":"Operator","text":"Pipeable Operators are the kind that can be piped to Observables using the syntax source |> operator(). These include the filter() and map() operators. When called, operators do not change the existing Observable instance. Instead, they return a new Observable, whose subscription logic is based on the first Observable.","category":"page"},{"location":"operators/about/","page":"Operator","title":"Operator","text":"note: Note\nA Pipeable Operator is a function that takes an Observable as its input and returns another Observable. It is a pure operation: the previous Observable remains unmodified.","category":"page"},{"location":"operators/about/","page":"Operator","title":"Operator","text":"A Pipeable Operator is essentially a pure callable object that accepts one Observable as input and returns another Observable as output. Subscribing to the output Observable will also subscribe to the input Observable.","category":"page"},{"location":"operators/about/","page":"Operator","title":"Operator","text":"For example, the operator called map() is analogous to the Array method of the same name. Just like the array method map((d) -> d ^ 2, [ 1, 2, 3 ]) yields [ 1, 4, 9 ], the Observable emits 1, 4, 9:","category":"page"},{"location":"operators/about/","page":"Operator","title":"Operator","text":"source = from([ 1, 2, 3 ])\nsubscribe!(source |> map(Int, (d) -> d ^ 2), lambda(\n on_next = (d) -> println(d)\n))\n\n// Logs:\n// 1\n// 4\n// 9","category":"page"},{"location":"operators/about/","page":"Operator","title":"Operator","text":"Another useful operator is first():","category":"page"},{"location":"operators/about/","page":"Operator","title":"Operator","text":"source = from([ 1, 2, 3 ])\nsubscribe!(source |> first(), lambda(\n on_next = (d) -> println(d),\n on_complete = () -> \"Completed\"\n))\n\n// Logs:\n// 1\n// Completed","category":"page"},{"location":"operators/about/#Creation-operators","page":"Operator","title":"Creation operators","text":"","category":"section"},{"location":"operators/about/","page":"Operator","title":"Operator","text":"Distinct from pipeable operators, creation operators are functions that can be used to create an Observable with some common predefined behavior or by joining other Observables. For example: from([ 1, 2, 3 ]) creates an observable that will sequentially emit 1, 2, and 3.","category":"page"},{"location":"operators/about/","page":"Operator","title":"Operator","text":"source = from([ 1, 2, 3 ])\nsubscribe!(source, lambda(\n on_next = (d) -> println(\"Value: $d\"),\n on_error = (e) -> println(\"Oh no, error: $e\")\n on_complete = () -> println(\"Completed\")\n))\n\n// Logs:\n// Value: 1\n// Value: 2\n// Value: 3\n// Completed","category":"page"},{"location":"operators/about/#Operators-piping","page":"Operator","title":"Operators piping","text":"","category":"section"},{"location":"operators/about/","page":"Operator","title":"Operator","text":"Pipeable operators are special objects that can be used like ordinary functions with on_call!(operator, source). In practice however they tend to accumulate and quickly grow unreadable: on_call!(operator1, on_call!(operator2, on_call!(operator3, source))). Therefore, Rocket.jl overloads |> for operators and Observables:","category":"page"},{"location":"operators/about/","page":"Operator","title":"Operator","text":"using Rocket\n\nsource = from(1:100) |> filter((d) -> d % 2 === 0) |> map(Int, (d) -> d ^ 2) |> sum()\n\nsubscribe!(source, logger())\n\n// Logs\n// [LogActor] Data: 171700\n// [LogActor] Completed","category":"page"},{"location":"operators/about/","page":"Operator","title":"Operator","text":"It is also possible to create an operator composition with + or |>. It might be useful to create an alias for some often used operator chain","category":"page"},{"location":"operators/about/","page":"Operator","title":"Operator","text":"using Rocket\n\nmapAndFilter = map(Int, d -> d ^ 2) + filter(d -> d % 2 == 0) \n\nsource = from(1:5) |> mapAndFilter\n\nsubscribe!(source, logger())\n\n// Logs\n// [LogActor] Data: 4\n// [LogActor] Data: 16\n// [LogActor] Completed\n\nmapAndFilterAndSum = mapAndFilter + sum()\n\nsource = from(1:5) |> mapAndFilterAndSum\n\nsubscribe!(source, logger())\n\n// Logs\n// [LogActor] Data: 20\n// [LogActor] Completed","category":"page"},{"location":"operators/about/","page":"Operator","title":"Operator","text":"For stylistic reasons, on_call!(operator, source) is never used in practice - even if there is only one operator. Instead, source |> operator() is generally preferred.","category":"page"},{"location":"observables/types/iterable/#observable_iterable","page":"Iterable","title":"Iterable Observable","text":"","category":"section"},{"location":"observables/types/iterable/","page":"Iterable","title":"Iterable","text":"iterable","category":"page"},{"location":"observables/types/iterable/#Rocket.iterable","page":"Iterable","title":"Rocket.iterable","text":"iterable(iterator; scheduler::H = AsapScheduler()) where { H <: AbstractScheduler }\n\nCreation operator for the IterableObservable that wraps given iterator into an observable object.\n\nArguments\n\niterator: an iterator object to be wrapped an observable\nscheduler: optional, scheduler-like object\n\nNote\n\niterable operators does not create a copy of iterator. Any changes in the iterator object might be visible in the created observable. For side-effects free behavior consider using from creation operator which creates a copy of a given object with a collect function.\n\nExamples\n\nusing Rocket\n\nsource = iterable([ 0, 1, 2 ])\nsubscribe!(source, logger())\n;\n\n# output\n\n[LogActor] Data: 0\n[LogActor] Data: 1\n[LogActor] Data: 2\n[LogActor] Completed\n\nusing Rocket\n\nsource = iterable(\"Hello\")\nsubscribe!(source, logger())\n;\n\n# output\n\n[LogActor] Data: H\n[LogActor] Data: e\n[LogActor] Data: l\n[LogActor] Data: l\n[LogActor] Data: o\n[LogActor] Completed\n\nSee also: ScheduledSubscribable, subscribe!, from\n\n\n\n\n\n","category":"function"},{"location":"observables/types/generate/#observable_generate","page":"Generate","title":"Generate Observable","text":"","category":"section"},{"location":"observables/types/generate/","page":"Generate","title":"Generate","text":"generate","category":"page"},{"location":"observables/types/generate/#Rocket.generate","page":"Generate","title":"Rocket.generate","text":"generate(initial::D, condition::C, iterator::I; scheduler::H = AsapScheduler()) where { D, C, I, H <: AbstractScheduler }\n\nGenerates an observable sequence by running a state-driven loop producing the sequence's elements, using the specified scheduler to send out observer messages.\n\nArguments\n\ninitial: initial state\ncondition: condition to terminate generation (upon returning false)\niterator: iteration step function\nscheduler: optional, scheduler-like object\n\nNote\n\niterator object should return objects of the same type as initial.\n\nExamples\n\nusing Rocket\n\nsource = generate(1, x -> x < 3, x -> x + 1)\nsubscribe!(source, logger())\n;\n\n# output\n[LogActor] Data: 1\n[LogActor] Data: 2\n[LogActor] Completed\n\nSee also: ScheduledSubscribable, subscribe!\n\n\n\n\n\n","category":"function"},{"location":"operators/filtering/ignore/#operator_ignore","page":"ignore","title":"Ignore operator","text":"","category":"section"},{"location":"operators/filtering/ignore/","page":"ignore","title":"ignore","text":"ignore","category":"page"},{"location":"operators/filtering/ignore/#Rocket.ignore","page":"ignore","title":"Rocket.ignore","text":"ignore(count::Int)\n\nCreates a ignore operator, which returns an Observable that skips the first count items emitted by the source Observable.\n\nArguments\n\ncount::Int: the number of times, items emitted by source Observable should be skipped.\n\nProducing\n\nStream of type <: Subscribable{L} where L refers to type of source stream\n\nExamples\n\nusing Rocket\n\nsource = from(1:5)\n\nsubscribe!(source |> ignore(2), logger())\n;\n\n# output\n\n[LogActor] Data: 3\n[LogActor] Data: 4\n[LogActor] Data: 5\n[LogActor] Completed\n\nSee also: AbstractOperator, InferableOperator, ProxyObservable, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/filtering/ignore/#See-also","page":"ignore","title":"See also","text":"","category":"section"},{"location":"operators/filtering/ignore/","page":"ignore","title":"ignore","text":"Operators","category":"page"},{"location":"subjects/types/replay/#subject_replay","page":"Replay","title":"ReplaySubject","text":"","category":"section"},{"location":"subjects/types/replay/","page":"Replay","title":"Replay","text":"ReplaySubject\nReplaySubjectFactory","category":"page"},{"location":"subjects/types/replay/#Rocket.ReplaySubject","page":"Replay","title":"Rocket.ReplaySubject","text":"ReplaySubject(::Type{D}, size::Int) where D\nReplaySubject(::Type{D}, size::Int, factory::F) where { D, F <: AbstractSubjectFactory }\nReplaySubject(::Type{D}, size::Int, subject::S) where { D, S }\n\nA variant of Subject that \"replays\" or emits old values to new subscribers. It buffers a set number of values and will emit those values immediately to any new subscribers in addition to emitting new values to existing subscribers.\n\nSee also: ReplaySubjectFactory, Subject, SubjectFactory\n\n\n\n\n\n","category":"function"},{"location":"subjects/types/replay/#Rocket.ReplaySubjectFactory","page":"Replay","title":"Rocket.ReplaySubjectFactory","text":"ReplaySubjectFactory(size::Int, factory::F) where { F <: AbstractSubjectFactory }\nReplaySubjectFactory(size::Int; scheduler::H = AsapScheduler()) where { H <: AbstractScheduler }\n\nA variant of SubjectFactory that creates an instance of ReplaySubject.\n\nSee also: SubjectFactory, AbstractSubjectFactory, ReplaySubject, Subject\n\n\n\n\n\n","category":"function"},{"location":"subjects/types/replay/#Description","page":"Replay","title":"Description","text":"","category":"section"},{"location":"subjects/types/replay/","page":"Replay","title":"Replay","text":"A ReplaySubject is similar to a BehaviorSubject in that it can send old values to new subscribers, but it can also record a part of the Observable execution.","category":"page"},{"location":"subjects/types/replay/","page":"Replay","title":"Replay","text":"note: Note\nA ReplaySubject records multiple values from the Observable execution and replays them to new subscribers.","category":"page"},{"location":"subjects/types/replay/#Examples","page":"Replay","title":"Examples","text":"","category":"section"},{"location":"subjects/types/replay/","page":"Replay","title":"Replay","text":"When creating a ReplaySubject, you can specify how many values to replay:","category":"page"},{"location":"subjects/types/replay/","page":"Replay","title":"Replay","text":"using Rocket\n\nsubject = ReplaySubject(Int, 3) # buffer 3 values for new subscribers\n\nsubscription1 = subscribe!(subject, logger(\"1\"))\n\nnext!(subject, 1)\nnext!(subject, 2)\nnext!(subject, 3)\nnext!(subject, 4)\n\nsubscription2 = subscribe!(subject, logger(\"2\"))\n\nnext!(subject, 5)\n\nunsubscribe!(subscription1)\nunsubscribe!(subscription2)\n\n// Logs\n// [1] Data: 1\n// [1] Data: 2\n// [1] Data: 3\n// [1] Data: 4\n// [2] Data: 2\n// [2] Data: 3\n// [2] Data: 4\n// [1] Data: 5\n// [2] Data: 5","category":"page"},{"location":"observables/about/#section_observables","page":"Observable","title":"Observables","text":"","category":"section"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"Observables are lazy Push collections of multiple values. They fill the missing spot in the following table:","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"Type Single Multiple\nPull Function Iterator\nPush Promise Observable","category":"page"},{"location":"observables/about/#First-example","page":"Observable","title":"First example","text":"","category":"section"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"For example, the following code specifies an Observable that pushes the values 1, 2, 3 immediately (synchronously) when subscribed to, and the value 4 after one second has passed since subscription.","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"using Rocket\n\nsource = make(Int) do actor\n next!(actor, 1)\n next!(actor, 2)\n next!(actor, 3)\n setTimeout(1000) do\n next!(actor, 4)\n complete!(actor)\n end\nend","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"To invoke the Observable and inspect these values, we need to subscribe to it. It is important to note that observables are lazy collections which means they don't emit anything until someone subscribes to it. Every subscription spawns its own independent execution of observable. There are some exceptions to this rule, e.g. Subjects and some operators (share(), etc..) which may change this behaviour","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"using Rocket\n\nsource = make(Int) do actor\n next!(actor, 1)\n next!(actor, 2)\n next!(actor, 3)\n setTimeout(1000) do\n next!(actor, 4)\n complete!(actor)\n end\nend\n\nprintln(\"Just before subscribe\")\nsubscribe!(source, lambda(\n on_next = (d) -> println(d),\n on_complete = () -> println(\"Completed\")\n))\nprintln(\"Just after subscribe\")\n\n# Logs\n# Just before subscribe\n# 1\n# 2\n# 3\n# Just after subscribe\n# 4\n# Completed","category":"page"},{"location":"observables/about/#Pull-vs-Push","page":"Observable","title":"Pull vs Push","text":"","category":"section"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"Pull and Push are two different protocols that describe how a data Producer communicates with a data Consumer.","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"In a Pull system, the Consumer determines when it receives data from the Producer. The Producer itself is unaware of when the data are delivered to the Consumer.","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"Every Julia Function is a Pull system. The function is a Producer of data, and the code that calls the function is consuming data by \"pulling\" a return value from the call.","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"Type PRODUCER CONSUMER\nPull Passive: produces data when requested. Active: decides when data is requested.\nPush Active: produces data at its own pace. Passive: reacts to received data.","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"In Push systems, the Producer determines when to send data to the Consumer. The Consumer is unaware of when it will receive that data.","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"Futures and promises are the most common type of Push systems today. A Promise (the Producer) delivers a resolved value to registered callbacks (the Consumers). Unlike functions, it is the Promise that determines precisely when a value is \"pushed\" to the callbacks.","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"Rocket.jl introduces Observables, a new Push system for Julia. An Observable is a Producer of multiple values, \"pushing\" them to Observers (Consumers or Actors).","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"A Function is a lazily evaluated computation that synchronously returns a single value on invocation.\nA Generator is a lazily evaluated computation that synchronously returns zero to (potentially) infinite values on iteration.\nA Promise is a computation that may (or may not) eventually return a single value.\nAn Observable is a lazily evaluated computation that can synchronously or asynchronously return zero to (potentially) infinite values from the time it's invoked.","category":"page"},{"location":"observables/about/#Observables-as-generalizations-of-functions","page":"Observable","title":"Observables as generalizations of functions","text":"","category":"section"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"In contrast to functions, Observables can \"return\" multiple values over time. For example, functions can't do this:","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"function foo()\n println(\"Hello!\")\n return 0\n return 1 # Dead code, will never happen\nend","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"Observables, however, can do this:","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"using Rocket\n\nfoo = make(Int) do actor\n next!(actor, 0)\n next!(actor, 1)\n complete!(actor)\nend\n","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"Observables can also \"return\" values asynchronously after some time:","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"using Rocket\n\nfoo = make(Int) do actor\n setTimeout(1000) do\n next!(actor, 0)\n complete!(actor)\n end\nend","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"Assume we have a function foo and some observable:","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"Function call foo(args...) means \"give me one value synchronously\" (pull strategy)\nIn contrast subscription to an observable with subscribe(observable, ...) means \"notify me about any amount of values, either synchronously or asynchronously\" (push strategy)","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"When a new value is available in an observable we say that the observable emits or generates an update. Values that are generated by an observable are sometimes also called future values, because there is no principled way to predict when an observable will generate a new value. In some programming languages, observables are referred to as generators or streams and we will use all three terms interchangeably.","category":"page"},{"location":"observables/about/#Anatomy-of-an-Observable","page":"Observable","title":"Anatomy of an Observable","text":"","category":"section"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"Observables are (1) created using creation operators (it is also possible to build an Observable from scratch with custom logic); (2) subscribed to with an Actor; (3) execute to deliver next! / error! / complete! notifications to the Actor, and (4) their execution may be disposed. These four aspects are all encoded in an Observable instance, but some of these aspects are related to other types, such as Subscribable and Subscription.","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"The core responsibilities of an Observable are:","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"Creating Observables\nSubscribing to Observables\nExecuting the Observable\nDisposing Observables","category":"page"},{"location":"observables/about/#Creating-Observables","page":"Observable","title":"Creating Observables","text":"","category":"section"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"You can create an Observable in various ways using Creation operators. You can also build an Observable from scratch. To see how you can build an Observable with custom logic, consult the API Section.","category":"page"},{"location":"observables/about/#Subscribing-to-Observables","page":"Observable","title":"Subscribing to Observables","text":"","category":"section"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"The Observable source in the example can be subscribed to.","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"using Rocket\n\nsubscribe!(source, lambda(\n on_next = (d) -> println(d)\n))","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"This example shows how subscribe calls are not shared among multiple Actors of the same Observable. When calling subscribe! with an Actor, the function on_subscribe! that is attached to this particular Observable is executed for that given actor. Each call to subscribe! triggers its own independent setup for that given actor.","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"note: Note\nSubscribing to an Observable is like calling a function, providing callbacks where the data will be delivered to.","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"The subscribe! function also supports multiple subscriptions at once. If the input argument to the subscribe! function is a tuple or a vector, it will first check that all of the arguments are valid source objects and actors and if its true will subscribe from each of them individually.","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"\nsource1 = Subject(Int)\nsource2 = Subject(Int)\n\nsubscriptions = subscribe!([\n (source1, logger()),\n (source2, logger()),\n])\n\n# Later on\n# unsubscribe!(subscriptions)\n","category":"page"},{"location":"observables/about/#Executing-Observables","page":"Observable","title":"Executing Observables","text":"","category":"section"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"The execution produces multiple values over time, either synchronously or asynchronously.","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"An Observable Execution can deliver three types of notifications:","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"Next: sends a value, such as an Int, String, Dict, etc.;\nError: sends any error as a value;\nComplete: does not send a value.","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"\"Next\" notifications are the most important and most common type: they represent actual data being delivered to an subscriber. \"Error\" and \"Complete\" notifications terminate the Observable Execution.","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"note: Note\nIn an Observable Execution, any number of Next notifications may be delivered. However, once a single Error or Complete notification is delivered, nothing else can be delivered afterwards.","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"The following is an example of an Observable execution that delivers three Next notifications and subsequently completes:","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"using Rocket\n\nsource = make(Int) do actor\n next!(actor, 1)\n next!(actor, 2)\n next!(actor, 3)\n complete!(actor)\nend\n\n# or the same with creation operator\n\nsource = from([ 1, 2, 3 ])","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"It is advised to wrap any code in subscribe by a try/catch block that delivers an Error notification upon an exception:","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"using Rocket\n\nsource = make(Int) do actor\n try\n next!(actor, 1)\n next!(actor, 2)\n next!(actor, 3)\n complete!(actor)\n catch e\n error!(actor, e)\n end\nend\n","category":"page"},{"location":"observables/about/#Disposing-Observable-Executions","page":"Observable","title":"Disposing Observable Executions","text":"","category":"section"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"It is common for an Actor to abort execution of an Observable Execution. Once the Actor is done receiving values, it may stop the execution in order to free computation power or memory resources.","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"When subscribe! is called, the Actor gets attached to the newly created Observable execution. This call also returns an object, the Subscription:","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"subscription = subscribe!(source, actor)","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"The Subscription represents the ongoing execution, and has a minimal API that allows you to cancel the execution. Read more about Subscription type here.","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"With","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"unsubscribe!(subscription)","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"you can cancel the ongoing execution.","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"note: Note\nsubscribe! returns a Subscription that represents the ongoing execution. Simply call unsubscribe! on the Subscription to cancel the execution.","category":"page"},{"location":"actors/types/circularkeep/#actor_circularkeep","page":"CircularKeep","title":"CircularKeep actor","text":"","category":"section"},{"location":"actors/types/circularkeep/","page":"CircularKeep","title":"CircularKeep","text":"circularkeep","category":"page"},{"location":"actors/types/circularkeep/#Rocket.circularkeep","page":"CircularKeep","title":"Rocket.circularkeep","text":"circularkeep(::Type{T}, capacity::Int) where T\n\nArguments\n\n::Type{T}: Type of keep data\ncapacity::Int: circular buffer capacity\n\nCreation operator for the CircularKeepActor actor.\n\nExamples\n\nusing Rocket\n\nactor = circularkeep(Int, 3)\nactor isa CircularKeepActor{Int}\n\n# output\ntrue\n\nSee also: CircularKeepActor, AbstractActor\n\n\n\n\n\n","category":"function"},{"location":"actors/types/circularkeep/","page":"CircularKeep","title":"CircularKeep","text":"CircularKeepActor","category":"page"},{"location":"actors/types/circularkeep/#Rocket.CircularKeepActor","page":"CircularKeep","title":"Rocket.CircularKeepActor","text":"CirucalKeepActor{D}() where D\n\nCircual keep actor is similar to keep actor, but uses CircularBuffer as a storage. It saves all incoming successful next events in a values circular buffer, throws an ErrorException on error! event and does nothing on completion event.\n\nExamples\n\nusing Rocket\n\nsource = from(1:5)\nactor = circularkeep(Int, 3)\n\nsubscribe!(source, actor)\nshow(getvalues(actor))\n\n# output\n[3, 4, 5]\n\nSee also: Actor, keep, circularkeep\n\n\n\n\n\n","category":"type"},{"location":"operators/utility/default_if_empty/#operator_ref_default_if_empty","page":"default_if_empty","title":"DefaultIfEmpty Operator","text":"","category":"section"},{"location":"operators/utility/default_if_empty/","page":"default_if_empty","title":"default_if_empty","text":"default_if_empty","category":"page"},{"location":"operators/utility/default_if_empty/#Rocket.default_if_empty","page":"default_if_empty","title":"Rocket.default_if_empty","text":"default_if_empty(value::T)\ndefault_if_empty(callback::Function)\n\nCreates a default_if_empty operator, which emits a given value if the source Observable completes without emitting any next value, otherwise mirrors the source Observable. Optionally accepts a zero-argument callback that will be executed to generate default value. Note: Callback function's output is always converted to the eltype of the original observable.\n\nusing Rocket\n\nsource = completed(Int) |> default_if_empty(0)\n\nsubscribe!(source, logger())\n;\n\n# output\n[LogActor] Data: 0\n[LogActor] Completed\n\nusing Rocket\n\nsource = completed(Int) |> default_if_empty(() -> 42)\n\nsubscribe!(source, logger())\n;\n\n# output\n[LogActor] Data: 42\n[LogActor] Completed\n\nSee also: AbstractOperator, InferableOperator, logger, map\n\n\n\n\n\n","category":"function"},{"location":"operators/utility/default_if_empty/#Description","page":"default_if_empty","title":"Description","text":"","category":"section"},{"location":"operators/utility/default_if_empty/","page":"default_if_empty","title":"default_if_empty","text":"default_if_empty emits the values emitted by the source Observable or a specified default value if the source Observable is empty (completes without having emitted any next value).","category":"page"},{"location":"operators/utility/default_if_empty/#See-also","page":"default_if_empty","title":"See also","text":"","category":"section"},{"location":"operators/utility/default_if_empty/","page":"default_if_empty","title":"default_if_empty","text":"Operators","category":"page"},{"location":"observables/types/never/#observable_never","page":"Never","title":"Never Observable","text":"","category":"section"},{"location":"observables/types/never/","page":"Never","title":"Never","text":"never","category":"page"},{"location":"observables/types/never/#Rocket.never","page":"Never","title":"Rocket.never","text":"never(T = Any)\n\nCreation operator for the NeverObservable that emits neither values nor errors nor the completion notification. It can be used for testing purposes or for composing with other Observables. Please note that by never emitting a complete notification, this Observable keeps the subscription from being disposed automatically. Subscriptions need to be manually disposed.\n\nArguments\n\nT: Type of Observable data, optional, Any is the default\n\nExamples\n\nusing Rocket\n\nsource = never()\nsubscribe!(source, logger())\n;\n\n# output\n\n\nSee also: NeverObservable, subscribe!, logger\n\n\n\n\n\n","category":"function"},{"location":"observables/types/never/","page":"Never","title":"Never","text":"NeverObservable","category":"page"},{"location":"observables/types/never/#Rocket.NeverObservable","page":"Never","title":"Rocket.NeverObservable","text":"NeverObservable{D}()\n\nAn Observable that emits no items to the Observer and never completes.\n\nType parameters\n\nD: Type of Observable data\n\nSee also: Subscribable, never\n\n\n\n\n\n","category":"type"},{"location":"operators/utility/about/#Utility-category","page":"About utility operators","title":"Utility category","text":"","category":"section"},{"location":"operators/utility/about/","page":"About utility operators","title":"About utility operators","text":"There are operators for different purposes, and they may be categorized as: creation, transformation, filtering, joining, multicasting, error handling, utility, etc. In the following list you will find all the operators organized in utility category.","category":"page"},{"location":"operators/utility/about/","page":"About utility operators","title":"About utility operators","text":"tap\ntap_on_subscribe\ntap_on_unsubscribe\ntap_on_complete\ndelay\nsafe\nnoop\nref_count\nasync\ndefault_if_empty\nerror_if_empty\nskip_next\nskip_error\nskip_complete\ndiscontinue\nlimit_subscribers","category":"page"},{"location":"operators/utility/about/#See-also","page":"About utility operators","title":"See also","text":"","category":"section"},{"location":"operators/utility/about/","page":"About utility operators","title":"About utility operators","text":"Operators","category":"page"},{"location":"operators/all/#operators_list","page":"All","title":"List of all available operators","text":"","category":"section"},{"location":"operators/all/","page":"All","title":"All","text":"There are operators for different purposes, and they may be categorized as: creation, transformation, filtering, joining, multicasting, error handling, utility, etc.","category":"page"},{"location":"operators/all/#Creation-operators","page":"All","title":"Creation operators","text":"","category":"section"},{"location":"operators/all/","page":"All","title":"All","text":"make\nof\nfrom\niterable\nfaulted\nnever\ncompleted\ntimer\ninterval\nproxy\nfile\ncombined\nrace\nconnectable\nmerged\nconcat\ngenerate\nnetwork\ndefer\nzipped","category":"page"},{"location":"operators/all/#Transformation-operators","page":"All","title":"Transformation operators","text":"","category":"section"},{"location":"operators/all/","page":"All","title":"All","text":"map\nmap_to\nscan\naccumulated\nenumerate\nuppercase\nlowercase\nto_array\nswitch_map\nswitch_map_to\nmerge_map\nconcat_map\nconcat_map_to\nexhaust_map\nstart_with\npairwise\nsubstitute\noverride","category":"page"},{"location":"operators/all/#Filtering-operators","page":"All","title":"Filtering operators","text":"","category":"section"},{"location":"operators/all/","page":"All","title":"All","text":"filter\nfilter_type\nsome\ntake\ntake_until\nfirst\nlast\nfind\nfind_index\nignore","category":"page"},{"location":"operators/all/#Mathematical-and-Aggregate-operators","page":"All","title":"Mathematical and Aggregate operators","text":"","category":"section"},{"location":"operators/all/","page":"All","title":"All","text":"count\nmax\nmin\nreduce\nsum","category":"page"},{"location":"operators/all/#Error-handling-operators","page":"All","title":"Error handling operators","text":"","category":"section"},{"location":"operators/all/","page":"All","title":"All","text":"catch_error\nrerun\nerror_if\nerror_if_not","category":"page"},{"location":"operators/all/#Join-operator","page":"All","title":"Join operator","text":"","category":"section"},{"location":"operators/all/","page":"All","title":"All","text":"with_latest","category":"page"},{"location":"operators/all/#Multicasting-operators","page":"All","title":"Multicasting operators","text":"","category":"section"},{"location":"operators/all/","page":"All","title":"All","text":"multicast\npublish\npublish_behavior\npublish_replay\nshare\nshare_replay","category":"page"},{"location":"operators/all/#Utility-operators","page":"All","title":"Utility operators","text":"","category":"section"},{"location":"operators/all/","page":"All","title":"All","text":"tap\ntap_on_subscribe\ntap_on_unsubscribe\ntap_on_complete\ndelay\nsafe\nnoop\nref_count\nasync\ndefault_if_empty\nerror_if_empty\nskip_next\nskip_error\nskip_complete\ndiscontinue\nlimit_subscribers","category":"page"},{"location":"observables/types/concat/#observable_concat","page":"Concat","title":"Concat Observable","text":"","category":"section"},{"location":"observables/types/concat/","page":"Concat","title":"Concat","text":"concat","category":"page"},{"location":"observables/types/concat/#Rocket.concat","page":"Concat","title":"Rocket.concat","text":"concat(sources...)\nconcat(sources::S) where { S <: Tuple }\n\nCombines multiple Observables to create an Observable which sequentially emits all values from given Observable and then moves on to the next. All values of each passed Observable merged into a single Observable, in order, in serial fashion.\n\nArguments\n\nsources: input sources\n\nExamples\n\nusing Rocket\n\nsource1 = of(1)\nsource2 = of(2)\n\nsubscribe!(concat(source1, source2), logger())\n;\n\n# output\n[LogActor] Data: 1\n[LogActor] Data: 2\n[LogActor] Completed\n\nusing Rocket\n\nsource1 = of(1) |> async()\nsource2 = of(2)\n\nsubscribe!(concat(source1, source2), logger())\n;\n\n# output\n[LogActor] Data: 1\n[LogActor] Data: 2\n[LogActor] Completed\n\nSee also: Subscribable, subscribe!\n\n\n\n\n\n","category":"function"},{"location":"observables/types/labeled/#observable_labeled","page":"Labeled","title":"Labeled Observable","text":"","category":"section"},{"location":"observables/types/labeled/","page":"Labeled","title":"Labeled","text":"labeled","category":"page"},{"location":"observables/types/labeled/#Rocket.labeled","page":"Labeled","title":"Rocket.labeled","text":"labeled(names::Val, stream)\n\nCreation operator for the LabeledObservable that wraps given stream, that produces Tuple values into a NamedTuple with given names.\n\nArguments\n\nnames: a Val object that contains a tuple of symbols\nstream: an observable that emits a Tuple, length of the Tuple events must be equal to the length of the names argument\n\nExamples\n\nusing Rocket\n\nsource = labeled(Val((:x, :y)), from([ (1, 2), (2, 3), (3, 4) ]))\nsubscribe!(source, logger())\n;\n\n# output\n\n[LogActor] Data: (x = 1, y = 2)\n[LogActor] Data: (x = 2, y = 3)\n[LogActor] Data: (x = 3, y = 4)\n[LogActor] Completed\n\nSee also: ScheduledSubscribable, subscribe!, from\n\n\n\n\n\n","category":"function"},{"location":"observables/types/labeled/","page":"Labeled","title":"Labeled","text":"LabeledObservable","category":"page"},{"location":"observables/types/labeled/#Rocket.LabeledObservable","page":"Labeled","title":"Rocket.LabeledObservable","text":"LabeledObservable{D, S}()\n\nAn Observable that emits NamesTuple items from a source Observable that emits Tuple items.\n\nSee also: Subscribable, labeled\n\n\n\n\n\n","category":"type"},{"location":"actors/types/lambda/#actor_lambda","page":"Lambda","title":"Lambda actor","text":"","category":"section"},{"location":"actors/types/lambda/","page":"Lambda","title":"Lambda","text":"lambda","category":"page"},{"location":"actors/types/lambda/#Rocket.lambda","page":"Lambda","title":"Rocket.lambda","text":"lambda(; on_next = nothing, on_error = nothing, on_complete = nothing)\nlambda(::Type{T}; on_next = nothing, on_error = nothing, on_complete = nothing) where T\n\nCreation operator for the 'LambdaActor' actor.\n\nExamples\n\nusing Rocket\n\nactor = lambda(Int; on_next = (d) -> println(d))\nactor isa LambdaActor{Int}\n\n# output\ntrue\n\nSee also: LambdaActor, AbstractActor\n\n\n\n\n\n","category":"function"},{"location":"actors/types/lambda/","page":"Lambda","title":"Lambda","text":"LambdaActor","category":"page"},{"location":"actors/types/lambda/#Rocket.LambdaActor","page":"Lambda","title":"Rocket.LambdaActor","text":"LambdaActor{D, N, E, C}(on_next::N, on_error::E, on_complete::C) where D\n\nLambda actor wraps on_next, on_error, on_complete callbacks for data, error and complete events. Should not be used explicitly, use lambda creation operator instead.\n\nConstructor arguments\n\non_next: Callback for data event. Optional. Default is nothing.\non_error: Callback for error event. Optional. Default is nothing.\non_complete: Callback for complete event. Optional. Default is nothing.\n\nSee also: Actor, lambda\n\n\n\n\n\n","category":"type"},{"location":"operators/utility/error_if_empty/#operator_ref_error_if_empty","page":"error_if_empty","title":"ErrorIfEmpty Operator","text":"","category":"section"},{"location":"operators/utility/error_if_empty/","page":"error_if_empty","title":"error_if_empty","text":"error_if_empty","category":"page"},{"location":"operators/utility/error_if_empty/#Rocket.error_if_empty","page":"error_if_empty","title":"Rocket.error_if_empty","text":"error_if_empty(err)\n\nCreates a error_if_empty operator, which emits a given error if the source Observable completes without emitting any next value, otherwise mirrors the source Observable.\n\nusing Rocket\n\nsource = completed(Int) |> error_if_empty(\"Empty\")\n\nsubscribe!(source, logger())\n;\n\n# output\n[LogActor] Error: Empty\n\nSee also: AbstractOperator, InferableOperator, logger, map\n\n\n\n\n\n","category":"function"},{"location":"operators/utility/error_if_empty/#Description","page":"error_if_empty","title":"Description","text":"","category":"section"},{"location":"operators/utility/error_if_empty/","page":"error_if_empty","title":"error_if_empty","text":"error_if_empty emits the values emitted by the source Observable or a specified error message if the source Observable is empty (completes without having emitted any next value).","category":"page"},{"location":"operators/utility/error_if_empty/#See-also","page":"error_if_empty","title":"See also","text":"","category":"section"},{"location":"operators/utility/error_if_empty/","page":"error_if_empty","title":"error_if_empty","text":"Operators","category":"page"},{"location":"subjects/types/subject/#subject","page":"Subject","title":"Subject","text":"","category":"section"},{"location":"subjects/types/subject/","page":"Subject","title":"Subject","text":"Subject\nSubjectFactory","category":"page"},{"location":"subjects/types/subject/#Rocket.Subject","page":"Subject","title":"Rocket.Subject","text":"Subject(::Type{D}; scheduler::H = AsapScheduler())\n\nA Subject is a special type of Observable that allows values to be multicasted to many Observers. Subjects are like EventEmitters. Every Subject is an Observable and an Actor. You can subscribe to a Subject, and you can call next! to feed values as well as error! and complete!.\n\nNote: By convention, every actor subscribed to a Subject observable is not allowed to throw exceptions during next!, error! and complete! calls. Doing so would lead to undefined behaviour. Use safe() operator to bypass this rule. \n\nSee also: SubjectFactory, ReplaySubject, BehaviorSubject, safe\n\n\n\n\n\n","category":"type"},{"location":"subjects/types/subject/#Rocket.SubjectFactory","page":"Subject","title":"Rocket.SubjectFactory","text":"SubjectFactory(scheduler::H) where { H <: AbstractScheduler }\n\nA base subject factory that creates an instance of Subject with specified scheduler.\n\nSee also: AbstractSubjectFactory, Subject\n\n\n\n\n\n","category":"type"},{"location":"subjects/types/subject/#Description","page":"Subject","title":"Description","text":"","category":"section"},{"location":"subjects/types/subject/","page":"Subject","title":"Subject","text":"Every Subject is an Observable. Given a Subject, you can subscribe to it, providing an Actor, which will start receiving values normally. From the perspective of the Observer, it cannot tell whether the Observable execution is coming from a plain unicast Observable or a Subject.","category":"page"},{"location":"subjects/types/subject/","page":"Subject","title":"Subject","text":"Internally to the Subject, subscribe does not invoke a new execution that delivers values. It simply registers the given Observer in a list of Observers.","category":"page"},{"location":"subjects/types/subject/","page":"Subject","title":"Subject","text":"Every Subject is an Actor. It is an object with the methods next!, error!, and complete!. To feed a new value to the Subject, just call next!(subject, theValue), and it will be multicasted to the Actors registered to listen to the Subject.","category":"page"},{"location":"subjects/types/subject/","page":"Subject","title":"Subject","text":"note: Note\nBy convention, every actor subscribed to a Subject observable is not allowed to throw exceptions during next!, error! and complete! calls. Doing so would lead to undefined behaviour. Use safe() operator to bypass this rule. ","category":"page"},{"location":"subjects/types/subject/#Examples","page":"Subject","title":"Examples","text":"","category":"section"},{"location":"subjects/types/subject/","page":"Subject","title":"Subject","text":"In the following example, the BehaviorSubject is initialized with the value 0 which the first Observer receives when it subscribes. The second Observer receives the value 2 even though it subscribed after the value 2 was sent.","category":"page"},{"location":"subjects/types/subject/","page":"Subject","title":"Subject","text":"using Rocket\n\nsubject = Subject(Int)\n\nsubscription1 = subscribe!(subject, logger(\"1\"))\n\nnext!(subject, 1)\nnext!(subject, 2)\n\nsubscription2 = subscribe!(subject, logger(\"2\"))\n\nnext!(subject, 3)\n\nunsubscribe!(subscription1)\nunsubscribe!(subscription2)\n\n// Logs\n// [1] Data: 1\n// [1] Data: 2\n// [1] Data: 3\n// [2] Data: 3","category":"page"},{"location":"utils/#Utils","page":"Utils","title":"Utils","text":"","category":"section"},{"location":"utils/","page":"Utils","title":"Utils","text":"setTimeout\nRocket.combined_type\nRocket.union_type","category":"page"},{"location":"utils/#Rocket.setTimeout","page":"Utils","title":"Rocket.setTimeout","text":"setTimeout(f::Function, timeout::Int)\n\nCreates a Task which will asynchornously invoke fucntion f after specified timeout time in milliseconds.\n\nArguments\n\nf::Function, function to be invoked asynchronously\ntimeout::Int, timeout in milliseconds\n\nExamples\n\nusing Rocket\nusing Dates\n\nprintln(\"Before: \", Dates.format(now(), \"MM:SS\"))\nsetTimeout(1000) do\n println(\"Inside: \", Dates.format(now(), \"MM:SS\"))\nend\nprintln(\"Right after: \", Dates.format(now(), \"MM:SS\"))\n;\n\n# Logs\n# Before: 20:59\n# Right after: 20:59\n# Inside: 21:00\n\n\n\n\n\n","category":"function"},{"location":"utils/#Rocket.combined_type","page":"Utils","title":"Rocket.combined_type","text":"combined_type(sources)\n\nReturns a Tuple el-type of observable el-types in sources argument in the same order\n\n\n\n\n\n","category":"function"},{"location":"utils/#Rocket.union_type","page":"Utils","title":"Rocket.union_type","text":"union_type(sources)\n\nReturns a Union el-type of observable el-types in sources argument\n\n\n\n\n\n","category":"function"},{"location":"utils/#Helpers","page":"Utils","title":"Helpers","text":"","category":"section"},{"location":"utils/","page":"Utils","title":"Utils","text":"Rocket.@MStorage\nRocket.setstorage!","category":"page"},{"location":"utils/#Rocket.@MStorage","page":"Utils","title":"Rocket.@MStorage","text":"@MStorage(n::Int)\n\nHelper function to generate tuple-like structure MStorageN, but with mutable fields and empty constructor. It is possible then to take a snapshot(::MStorage) which returns a tuple with the same types and values from storage. Some operators and observables use pregenerated MStorage to instatiate uninitialized mutable storage in case when stream is allowed to not emit any values before completion.\n\nGenerated structure layout\n\nstruct MStorageN{V1, V2, ..., VN}\n v1 :: V1\n v2 :: V2\n ...\n vn :: VN\nend\n\nSee also: setstorage!\n\n\n\n\n\n","category":"macro"},{"location":"utils/#Rocket.setstorage!","page":"Utils","title":"Rocket.setstorage!","text":"setstorage!(s, v, ::Val{I}) where I\n\nThis function can be used to set a new value v for storage s with a given value v and index I. Using parametrized Val{I} for indexing ensures for index to be resolved at compile-time and if-else branch optimization.\n\nSee also: @MStorage\n\n\n\n\n\n","category":"function"},{"location":"observables/types/completed/#observable_completed","page":"Completed","title":"Completed Observable","text":"","category":"section"},{"location":"observables/types/completed/","page":"Completed","title":"Completed","text":"completed","category":"page"},{"location":"observables/types/completed/#Rocket.completed","page":"Completed","title":"Rocket.completed","text":"completed(::Type{T} = Any; scheduler::H = AsapScheduler()) where { T, H <: AbstractScheduler }\n\nCreation operator for the CompletedObservable that emits no items to the Actor and immediately sends a complete notification on subscription.\n\nArguments\n\nT: type of output data source, optional, Any is the default\nscheduler: optional, scheduler-like object\n\nExamples\n\nusing Rocket\n\nsource = completed(Int)\nsubscribe!(source, logger())\n;\n\n# output\n\n[LogActor] Completed\n\n\nSee also: CompletedObservable, subscribe!, logger\n\n\n\n\n\n","category":"function"},{"location":"observables/types/completed/","page":"Completed","title":"Completed","text":"CompletedObservable","category":"page"},{"location":"observables/types/completed/#Rocket.CompletedObservable","page":"Completed","title":"Rocket.CompletedObservable","text":"CompletedObservable{D, H}(scheduler::H)\n\nObservable that emits no items to the Actor and just sends a complete notification on subscription.\n\nConstructor arguments\n\nscheduler: Scheduler-like object\n\nSee also: Subscribable, completed\n\n\n\n\n\n","category":"type"},{"location":"operators/utility/tap/#operator_tap","page":"tap","title":"Tap Operator","text":"","category":"section"},{"location":"operators/utility/tap/","page":"tap","title":"tap","text":"tap","category":"page"},{"location":"operators/utility/tap/#Rocket.tap","page":"tap","title":"Rocket.tap","text":"tap(tapFn::F) where { F <: Function }\n\nCreates a tap operator, which performs a side effect for every emission on the source Observable, but return an Observable that is identical to the source.\n\nArguments\n\ntapFn::Function: side-effect tap function with (data) -> Nothing signature\n\nProducing\n\nStream of type <: Subscribable{L} where L refers to type of source stream\n\nExamples\n\nusing Rocket\n\nsource = from([ 1, 2, 3 ])\nsubscribe!(source |> tap((d) -> println(\"In tap: $d\")), logger())\n;\n\n# output\n\nIn tap: 1\n[LogActor] Data: 1\nIn tap: 2\n[LogActor] Data: 2\nIn tap: 3\n[LogActor] Data: 3\n[LogActor] Completed\n\n\nSee also: tap_on_subscribe, tap_on_complete, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/utility/tap/#Description","page":"tap","title":"Description","text":"","category":"section"},{"location":"operators/utility/tap/","page":"tap","title":"tap","text":"Returns an Observable that resembles the source Observable, but modifies it so that the provided Observer is called to perform a side effect for every value emitted by the source.","category":"page"},{"location":"operators/utility/tap/","page":"tap","title":"tap","text":"This operator is useful for debugging your Observables, verifying correct values, or performing other side effects.","category":"page"},{"location":"operators/utility/tap/","page":"tap","title":"tap","text":"Note: this operator differs from a subscribe on the Observable. If the Observable returned by tap is not subscribed, the side effects specified by the Observer will never happen. tap therefore simply spies on existing execution, it does not trigger an execution to happen like subscribe does.","category":"page"},{"location":"operators/utility/tap/#See-also","page":"tap","title":"See also","text":"","category":"section"},{"location":"operators/utility/tap/","page":"tap","title":"tap","text":"Operators","category":"page"},{"location":"observables/types/network/#observable_network","page":"Network","title":"Network Observable","text":"","category":"section"},{"location":"observables/types/network/","page":"Network","title":"Network","text":"network","category":"page"},{"location":"observables/types/network/#Rocket.network","page":"Network","title":"Rocket.network","text":"network(::Type{D}, port::Int) where D\nnetwork(::Type{D}, address::A, port::Int) where { D, A <: IPAddr }\n\nnetwork(::Type{Vector{D}}, port::Int, buffer_size::Int) where D\nnetwork(::Type{Vector{D}}, address::A, port::Int, buffer_size::Int) where { D, A <: IPAddr }\n\nCreation operator for the NetworkObservable that emits messages from the server with specified address and port arguments.\n\nSee also: NetworkObservable, subscribe!\n\n\n\n\n\n","category":"function"},{"location":"observables/types/network/","page":"Network","title":"Network","text":"NetworkObservable","category":"page"},{"location":"observables/types/network/#Rocket.NetworkObservable","page":"Network","title":"Rocket.NetworkObservable","text":"NetworkObservable{D, Address, Port, S}()\n\nNetworkObservable listens for the messages of type D from remote server with specified Address and Port parameters.\n\nSee also: network, Subscribable\n\n\n\n\n\n","category":"type"},{"location":"observables/types/function/#observable_function","page":"Function","title":"Function Observable","text":"","category":"section"},{"location":"observables/types/function/","page":"Function","title":"Function","text":"make","category":"page"},{"location":"observables/types/function/#Rocket.make","page":"Function","title":"Rocket.make","text":"make(f::Function, type::Type{D})\n\nCreation operator for the FunctionObservable.\n\nArguments\n\nf: function to be invoked on subscription\ntype: type of data in observable\n\nExamples\n\nusing Rocket\n\nsource = make(Int) do actor\n next!(actor, 0)\n complete!(actor)\nend\n\nsubscription = subscribe!(source, logger());\nunsubscribe!(subscription)\n;\n\n# output\n\n[LogActor] Data: 0\n[LogActor] Completed\n\n\nusing Rocket\n\nsource = make(Int) do actor\n next!(actor, 0)\n setTimeout(100) do\n next!(actor, 1)\n complete!(actor)\n end\nend\n\nsubscription = subscribe!(source, logger())\nunsubscribe!(subscription)\n;\n\n# output\n\n[LogActor] Data: 0\n\nSee also: FunctionObservable, subscribe!, logger\n\n\n\n\n\n","category":"function"},{"location":"observables/types/function/","page":"Function","title":"Function","text":"FunctionObservable","category":"page"},{"location":"observables/types/function/#Rocket.FunctionObservable","page":"Function","title":"Rocket.FunctionObservable","text":"FunctionObservable{D}(f::F)\n\nFunctionObservable wraps a callback f, which is called when the Observable is initially subscribed to. This function is given an Actor, to which new values can be nexted (with next!(actor, data)), or an error! method can be called to raise an error, or complete! can be called to notify of a successful completion.\n\nArguments\n\nf::F: function to be invoked on subscription\n\nSee also: Subscribable, make\n\n\n\n\n\n","category":"type"},{"location":"observables/types/race/#observable_race","page":"Race","title":"Race Observable","text":"","category":"section"},{"location":"observables/types/race/","page":"Race","title":"Race","text":"race","category":"page"},{"location":"observables/types/race/#Rocket.race","page":"Race","title":"Rocket.race","text":"race(sources...)\nrace(sources::S) where { S <: Tuple }\n\nCombines multiple Observables to create an Observable that mirrors the output of the first Observable to emit an item. Essentially it subscribes to the observable that was the first to start emitting.\n\nArguments\n\nsources: input sources\n\nExamples\n\nusing Rocket\n\nsource1 = of(1)\nsource2 = of(2)\n\nsubscribe!(race(source1, source2), logger())\n;\n\n# output\n[LogActor] Data: 1\n[LogActor] Completed\n\nusing Rocket\n\nsource1 = of(1) |> async()\nsource2 = of(2)\n\nsubscribe!(race(source1, source2), logger())\n;\n\n# output\n[LogActor] Data: 2\n[LogActor] Completed\n\nSee also: Subscribable, subscribe!\n\n\n\n\n\n","category":"function"},{"location":"operators/transformation/concat_map_to/#operator_concat_map_to","page":"concat_map_to","title":"ConcatMapTo Operator","text":"","category":"section"},{"location":"operators/transformation/concat_map_to/","page":"concat_map_to","title":"concat_map_to","text":"concat_map_to","category":"page"},{"location":"operators/transformation/concat_map_to/#Rocket.concat_map_to","page":"concat_map_to","title":"Rocket.concat_map_to","text":"switch_map_to(inner_observable)\n\nCreates a switch_map_to operator, which returns an observable of values merged together by joining the passed observable with itself, one after the other, for each value emitted from the source. Essentially it projects each source value to the same Observable which is merged multiple times in a serialized fashion on the output Observable.\n\nArguments\n\ninner_observable: an Observable to replace each value from the source Observable.\n\nProducing\n\nStream of type <: Subscribable{R} where R refers to the eltype of inner_observable\n\nExamples\n\nusing Rocket\n\nsource = from([ 0, 0, 0 ])\nsubscribe!(source |> concat_map_to(from([ 1, 2, 3 ])), logger())\n;\n\n# output\n\n[LogActor] Data: 1\n[LogActor] Data: 2\n[LogActor] Data: 3\n[LogActor] Data: 1\n[LogActor] Data: 2\n[LogActor] Data: 3\n[LogActor] Data: 1\n[LogActor] Data: 2\n[LogActor] Data: 3\n[LogActor] Completed\n\nSee also: concat_map, AbstractOperator, RightTypedOperator, ProxyObservable, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/transformation/concat_map_to/","page":"concat_map_to","title":"concat_map_to","text":"note: Note\nconcat_map_to is equivalent to concat_map with mappingFn set to (_) -> inner_observable.","category":"page"},{"location":"operators/transformation/concat_map_to/#See-also","page":"concat_map_to","title":"See also","text":"","category":"section"},{"location":"operators/transformation/concat_map_to/","page":"concat_map_to","title":"concat_map_to","text":"Operators, concat_map","category":"page"},{"location":"operators/errors/error_if_not/#operator_error_if_not","page":"error_if_not","title":"Error If Not Operator","text":"","category":"section"},{"location":"operators/errors/error_if_not/","page":"error_if_not","title":"error_if_not","text":"Note: error_if_not is an alias for error_if operator with inverted checkFn.","category":"page"},{"location":"operators/errors/error_if_not/","page":"error_if_not","title":"error_if_not","text":"error_if_not","category":"page"},{"location":"operators/errors/error_if_not/#Rocket.error_if_not","page":"error_if_not","title":"Rocket.error_if_not","text":"error_if_not(checkFn, errorFn)\n\nCreates an error_if_not operator, which performs a check for every emission on the source Observable with checkFn. If checkFn returns false, the operator sends an error event and unsubscribes from the observable.\n\nNote: error_if_not is an alias for error_if operator with inverted checkFn.\n\nArguments\n\ncheckFn: check function with (data) -> Bool signature\nerrorFn: error object generating function with (data) -> Any signature, optional\n\nProducing\n\nStream of type <: Subscribable{L} where L refers to type of source stream\n\nExamples\n\nusing Rocket\n\nsource = from([1, 2, 3]) |> error_if_not((data) -> data < 2, (data) -> \"CustomError\")\n\nsubscription = subscribe!(source, lambda(\n on_next = (d) -> println(\"Next: \", d),\n on_error = (e) -> println(\"Error: \", e),\n on_complete = () -> println(\"Completed\")\n))\n;\n\n# output\nNext: 1\nError: CustomError\n\nSee also: error_if, error_if_empty, default_if_empty, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/errors/error_if_not/#See-also","page":"error_if_not","title":"See also","text":"","category":"section"},{"location":"operators/errors/error_if_not/","page":"error_if_not","title":"error_if_not","text":"Operators","category":"page"},{"location":"todo/#TODO","page":"TODO","title":"TODO","text":"","category":"section"},{"location":"todo/","page":"TODO","title":"TODO","text":"This package in under development and some features of the reactive framework not yet implemented.","category":"page"},{"location":"operators/mathematical/count/#operator_count","page":"count","title":"Count Operator","text":"","category":"section"},{"location":"operators/mathematical/count/","page":"count","title":"count","text":"count","category":"page"},{"location":"operators/mathematical/count/#Base.count","page":"count","title":"Base.count","text":"count()\n\nCreates a count operator, which counts the number of emissions on the source and emits that number when the source completes.\n\nProducing\n\nStream of type <: Subscribable{Int}\n\nExamples\n\nusing Rocket\n\nsource = from([ i for i in 1:42 ])\nsubscribe!(source |> count(), logger())\n;\n\n# output\n\n[LogActor] Data: 42\n[LogActor] Completed\n\n\nSee also: AbstractOperator, RightTypedOperator, ProxyObservable, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/mathematical/count/#Description","page":"count","title":"Description","text":"","category":"section"},{"location":"operators/mathematical/count/","page":"count","title":"count","text":"count transforms an Observable that emits values into an Observable that emits a single value that represents the number of values emitted by the source Observable. If the source Observable terminates with an error, count will pass this error notification along without emitting a value first. If the source Observable does not terminate at all, count will neither emit a value nor terminate.","category":"page"},{"location":"operators/mathematical/count/#Example","page":"count","title":"Example","text":"","category":"section"},{"location":"operators/mathematical/count/","page":"count","title":"count","text":"Counts how many values source Observable have emitted before the complete event happened","category":"page"},{"location":"operators/mathematical/count/","page":"count","title":"count","text":"using Rocket\n\nsource = from([ i for i in 1:42 ])\nsubscribe!(source |> count(), logger())\n\n# output\n\n[LogActor] Data: 42\n[LogActor] Completed","category":"page"},{"location":"operators/mathematical/count/#See-also","page":"count","title":"See also","text":"","category":"section"},{"location":"operators/mathematical/count/","page":"count","title":"count","text":"Operators","category":"page"},{"location":"operators/transformation/map_to/#operator_map_to","page":"map_to","title":"MapTo Operator","text":"","category":"section"},{"location":"operators/transformation/map_to/","page":"map_to","title":"map_to","text":"map_to","category":"page"},{"location":"operators/transformation/map_to/#Rocket.map_to","page":"map_to","title":"Rocket.map_to","text":"map_to(value::T) where T\n\nCreates a map operator, which emits the given constant value on the output Observable every time the source Observable emits a value.\n\nArguments\n\nvalue::T: the constant value to map each source value to\n\nProducing\n\nStream of type <: Subscribable{T}\n\nExamples\n\nusing Rocket\n\nsource = from([ 1, 2, 3 ])\nsubscribe!(source |> map_to('a'), logger())\n;\n\n# output\n\n[LogActor] Data: a\n[LogActor] Data: a\n[LogActor] Data: a\n[LogActor] Completed\n\nSee also: map, AbstractOperator, RightTypedOperator, ProxyObservable, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/transformation/map_to/#Description","page":"map_to","title":"Description","text":"","category":"section"},{"location":"operators/transformation/map_to/","page":"map_to","title":"map_to","text":"Takes a constant value as argument, and emits that whenever the source Observable emits a value. In other words, ignores the actual source value, and simply uses the emission moment to know when to emit the given value.","category":"page"},{"location":"operators/transformation/map_to/#See-also","page":"map_to","title":"See also","text":"","category":"section"},{"location":"operators/transformation/map_to/","page":"map_to","title":"map_to","text":"Operators","category":"page"},{"location":"observables/types/merged/#observable_merged","page":"Merged","title":"Merged Observable","text":"","category":"section"},{"location":"observables/types/merged/","page":"Merged","title":"Merged","text":"merged","category":"page"},{"location":"observables/types/merged/#Rocket.merged","page":"Merged","title":"Rocket.merged","text":"merged(sources::T) where { T <: Tuple }\n\nCreation operator for the MergeObservable with a given sources collected in a tuple. merge subscribes to each given input Observable (as arguments), and simply forwards (without doing any transformation) all the values from all the input Observables to the output Observable. The output Observable only completes once all input Observables have completed. Any error delivered by an input Observable will be immediately emitted on the output Observable.\n\nExamples\n\nusing Rocket\n\nobservable = merged((from(1:4), of(2.0), from(\"Hello\")))\n\nsubscribe!(observable, logger())\n;\n\n# output\n[LogActor] Data: 1\n[LogActor] Data: 2\n[LogActor] Data: 3\n[LogActor] Data: 4\n[LogActor] Data: 2.0\n[LogActor] Data: H\n[LogActor] Data: e\n[LogActor] Data: l\n[LogActor] Data: l\n[LogActor] Data: o\n[LogActor] Completed\n\nusing Rocket\n\nsubject = Subject(Int, scheduler = AsyncScheduler())\n\nobservable = merged((subject, of(2.0), from(\"Hello\")))\n\nactor = sync(logger())\n\nsubscribe!(observable, actor)\n\nsetTimeout(200) do\n next!(subject, 1)\n complete!(subject)\nend\n\nwait(actor)\n;\n\n# output\n[LogActor] Data: 2.0\n[LogActor] Data: H\n[LogActor] Data: e\n[LogActor] Data: l\n[LogActor] Data: l\n[LogActor] Data: o\n[LogActor] Data: 1\n[LogActor] Completed\n\nSee also: Subscribable\n\n\n\n\n\n","category":"function"},{"location":"operators/transformation/uppercase/#operator_uppercase","page":"uppercase","title":"Uppercase Operator","text":"","category":"section"},{"location":"operators/transformation/uppercase/","page":"uppercase","title":"uppercase","text":"uppercase","category":"page"},{"location":"operators/transformation/uppercase/#Base.Unicode.uppercase","page":"uppercase","title":"Base.Unicode.uppercase","text":"uppercase()\n\nCreates an uppercase operator, which forces each value to be in upper case\n\nProducing\n\nStream of type <: Subscribable{L} where L referes to type of data of input Observable\n\nExamples\n\nusing Rocket\n\nsource = of(\"Hello, world!\")\nsubscribe!(source |> uppercase(), logger())\n;\n\n# output\n\n[LogActor] Data: HELLO, WORLD!\n[LogActor] Completed\n\nSee also: AbstractOperator, InferableOperator, ProxyObservable, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/transformation/uppercase/#See-also","page":"uppercase","title":"See also","text":"","category":"section"},{"location":"operators/transformation/uppercase/","page":"uppercase","title":"uppercase","text":"Operators, map, lowercase","category":"page"},{"location":"observables/types/file/#observable_file","page":"File","title":"File Observable","text":"","category":"section"},{"location":"observables/types/file/","page":"File","title":"File","text":"file","category":"page"},{"location":"observables/types/file/#Rocket.file","page":"File","title":"Rocket.file","text":"file(path::String)\n\nCreation operator for the SyncFileObservable with a given path.\n\nSee also: SyncFileObservable\n\n\n\n\n\n","category":"function"},{"location":"observables/types/file/","page":"File","title":"File","text":"SyncFileObservable","category":"page"},{"location":"observables/types/file/#Rocket.SyncFileObservable","page":"File","title":"Rocket.SyncFileObservable","text":"SyncFileObservable(path::String)\n\nFile observable, which synchronously emits content of the file line by line as a String objects on subscription.\n\nSee also: file, Subscribable\n\n\n\n\n\n","category":"type"},{"location":"operators/mathematical/reduce/#operator_reduce","page":"reduce","title":"Reduce Operator","text":"","category":"section"},{"location":"operators/mathematical/reduce/","page":"reduce","title":"reduce","text":"reduce","category":"page"},{"location":"operators/mathematical/reduce/#Base.reduce","page":"reduce","title":"Base.reduce","text":"reduce(::Type{R}, reduceFn::Function, seed::R) where R\nreduce(reduceFn::F) where { F <: Function }\n\nCreates a reduce operator, which applies a given accumulator reduceFn function over the source Observable, and returns the accumulated result when the source completes, given an optional seed value. If a seed value is specified, then that value will be used as the initial value for the accumulator. If no seed value is specified, the first item of the source is used as the seed.\n\nArguments\n\n::Type{R}: the type of data of transformed value\nreduceFn::Function: transformation function with (data::T, current::R) -> R signature\nseed::R: optional seed accumulation value\n\nProducing\n\nStream of type <: Subscribable{R}\n\nExamples\n\nusing Rocket\n\nsource = from([ i for i in 1:10 ])\nsubscribe!(source |> reduce(Vector{Int}, (d, c) -> [ c..., d ], Int[]), logger())\n;\n\n# output\n\n[LogActor] Data: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]\n[LogActor] Completed\n\n\nusing Rocket\n\nsource = from([ i for i in 1:42 ])\nsubscribe!(source |> reduce(+), logger())\n;\n\n# output\n\n[LogActor] Data: 903\n[LogActor] Completed\n\n\nSee also: AbstractOperator, RightTypedOperator, ProxyObservable, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/mathematical/reduce/#Description","page":"reduce","title":"Description","text":"","category":"section"},{"location":"operators/mathematical/reduce/","page":"reduce","title":"reduce","text":"reduce applies an accumulator function to each value of the source Observable (from the past) and reduces it to a single value that is emitted by the output Observable. Note that reduce will only emit one value, only when the source Observable completes. It is equivalent to applying scan followed by last.","category":"page"},{"location":"operators/mathematical/reduce/","page":"reduce","title":"reduce","text":"It returns an Observable that applies a specified accumulator function to each item emitted by the source Observable. If a seed value is specified, then that value will be used as the initial value of the accumulator. If no seed value is specified, the first item of the source is used as the seed.","category":"page"},{"location":"operators/mathematical/reduce/#See-also","page":"reduce","title":"See also","text":"","category":"section"},{"location":"operators/mathematical/reduce/","page":"reduce","title":"reduce","text":"Operators, scan, last","category":"page"},{"location":"operators/filtering/some/#operator_some","page":"some","title":"Some Operator","text":"","category":"section"},{"location":"operators/filtering/some/","page":"some","title":"some","text":"some","category":"page"},{"location":"operators/filtering/some/#Rocket.some","page":"some","title":"Rocket.some","text":"some()\n\nCreates a some operator, which filters out nothing items by the source Observable by emitting only those that not equal to nothing.\n\nProducing\n\nStream of type <: Subscribable{L} where L refers to type of source stream <: Subscribable{Union{L, Nothing}}\n\nExamples\n\nusing Rocket\n\nsource = from([ 1, nothing, 3 ])\nsubscribe!(source |> some(), logger())\n;\n\n# output\n\n[LogActor] Data: 1\n[LogActor] Data: 3\n[LogActor] Completed\n\n\nSee also: AbstractOperator, InferableOperator, ProxyObservable, max, min, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/filtering/some/#Description","page":"some","title":"Description","text":"","category":"section"},{"location":"operators/filtering/some/","page":"some","title":"some","text":"This operator takes values from the source Observable and only emits those values that are not nothing.","category":"page"},{"location":"operators/filtering/some/#See-also","page":"some","title":"See also","text":"","category":"section"},{"location":"operators/filtering/some/","page":"some","title":"some","text":"Operators, filter","category":"page"},{"location":"actors/types/storage/#actor_storage","page":"Storage","title":"Storage actor","text":"","category":"section"},{"location":"actors/types/storage/","page":"Storage","title":"Storage","text":"storage","category":"page"},{"location":"actors/types/storage/#Rocket.storage","page":"Storage","title":"Rocket.storage","text":"storage(::Type{T}) where T\n\nArguments\n\n::Type{T}: Type of storage data\n\nCreation operator for the StorageActor actor.\n\nExamples\n\nusing Rocket\n\nactor = storage(Int)\nactor isa StorageActor{Int}\n\n# output\ntrue\n\nSee also: StorageActor, AbstractActor\n\n\n\n\n\n","category":"function"},{"location":"actors/types/storage/","page":"Storage","title":"Storage","text":"StorageActor","category":"page"},{"location":"actors/types/storage/#Rocket.StorageActor","page":"Storage","title":"Rocket.StorageActor","text":"StorageActor{D}() where D\n\nStorage actor provides an actor that stores a single (last) value passed to the next! callback. It saves last incoming successful next event in the value field, throws an ErrorException on error! event and does nothing on completion event. Before any events value initialised with nothing.\n\nExamples\n\nusing Rocket\n\nsource = from(1:5)\nactor = storage(Int)\n\nsubscribe!(source, actor)\nshow(getvalues(actor))\n\n# output\n5\n\nSee also: Actor, storage\n\n\n\n\n\n","category":"type"},{"location":"operators/multicasting/publish/#operator_publish","page":"publish","title":"Publish Operators","text":"","category":"section"},{"location":"operators/multicasting/publish/","page":"publish","title":"publish","text":"publish\npublish_behavior\npublish_replay\npublish_recent","category":"page"},{"location":"operators/multicasting/publish/#Rocket.publish","page":"publish","title":"Rocket.publish","text":"publish(; scheduler::H = AsapScheduler()) where { H <: AbstractScheduler }\n\npublish() is a shortcut for multicast(SubjectFactory())\n\nSee also: AbstractOperator, multicast, SubjectFactory\n\n\n\n\n\n","category":"function"},{"location":"operators/multicasting/publish/#Rocket.publish_behavior","page":"publish","title":"Rocket.publish_behavior","text":"publish_behavior(default; scheduler::H = AsapScheduler()) where { H <: AbstractScheduler }\n\npublish_behavior(default) is a shortcut for multicast(BehaviorSubjectFactory(default))\n\nSee also: AbstractOperator, multicast, BehaviorSubjectFactory\n\n\n\n\n\n","category":"function"},{"location":"operators/multicasting/publish/#Rocket.publish_replay","page":"publish","title":"Rocket.publish_replay","text":"publish_replay(size::Int; scheduler::H = AsapScheduler()) where { H <: AbstractScheduler }\n\npublish_replay(size) is a shortcut for multicast(ReplaySubjectFactory(size))\n\nSee also: AbstractOperator, multicast, ReplaySubjectFactory\n\n\n\n\n\n","category":"function"},{"location":"operators/multicasting/publish/#Rocket.publish_recent","page":"publish","title":"Rocket.publish_recent","text":"publish_recent(; scheduler::H = AsapScheduler()) where { H <: AbstractScheduler }\n\npublish_recent(size) is a shortcut for multicast(RecentSubjectFactory())\n\nSee also: AbstractOperator, multicast, RecentSubjectFactory\n\n\n\n\n\n","category":"function"},{"location":"operators/multicasting/publish/#See-also","page":"publish","title":"See also","text":"","category":"section"},{"location":"operators/multicasting/publish/","page":"publish","title":"publish","text":"Operators","category":"page"},{"location":"#Rocket.jl-Documentation","page":"Home","title":"Rocket.jl Documentation","text":"","category":"section"},{"location":"","page":"Home","title":"Home","text":"Welcome to the documentation for Rocket.jl.","category":"page"},{"location":"","page":"Home","title":"Home","text":"This documentation is an adaptation of the RxJS library documentation.","category":"page"},{"location":"#Table-of-Contents","page":"Home","title":"Table of Contents","text":"","category":"section"},{"location":"","page":"Home","title":"Home","text":"Pages = [\n \"getting-started.md\",\n \"observables/about.md\",\n \"actors/about.md\",\n \"teardown/about.md\",\n \"operators/about.md\",\n \"operators/piping.md\",\n \"operators/create-new-operator.md\",\n \"operators/high-order.md\",\n \"todo.md\",\n \"contributing.md\",\n \"utils.md\"\n]\nDepth = 2","category":"page"},{"location":"#Index","page":"Home","title":"Index","text":"","category":"section"},{"location":"","page":"Home","title":"Home","text":"","category":"page"},{"location":"actors/types/logger/#actor_logger","page":"Logger","title":"Logger actor","text":"","category":"section"},{"location":"actors/types/logger/","page":"Logger","title":"Logger","text":"logger","category":"page"},{"location":"actors/types/logger/#Rocket.logger","page":"Logger","title":"Rocket.logger","text":"logger([ io::IO ], name::String = \"LogActor\")\nlogger(::Type{T}, [ io::IO ], name::String = \"LogActor\") where T\n\nCreation operator for the LoggerActor actor.\n\nExamples\n\nusing Rocket\n\nsource = from([ 0, 1, 2 ])\nsubscribe!(source, logger())\n;\n\n# output\n\n[LogActor] Data: 0\n[LogActor] Data: 1\n[LogActor] Data: 2\n[LogActor] Completed\n\nusing Rocket\n\nsource = from([ 0, 1, 2 ])\nsubscribe!(source, logger(\"CustomName\"))\n;\n\n# output\n\n[CustomName] Data: 0\n[CustomName] Data: 1\n[CustomName] Data: 2\n[CustomName] Completed\n\nusing Rocket\n\nbuffer = IOBuffer()\n\nsource = from([ 0, 1, 2 ])\nsubscribe!(source, logger(buffer, \"CustomBuffer\"))\n;\n\nprint(String(take!(buffer)))\n# output\n\n[CustomBuffer] Data: 0\n[CustomBuffer] Data: 1\n[CustomBuffer] Data: 2\n[CustomBuffer] Completed\n\nSee also: LoggerActor, AbstractActor\n\n\n\n\n\n","category":"function"},{"location":"actors/types/logger/","page":"Logger","title":"Logger","text":"LoggerActor","category":"page"},{"location":"actors/types/logger/#Rocket.LoggerActor","page":"Logger","title":"Rocket.LoggerActor","text":"LoggerActor{D}(name::String = \"LogActor\", io::O) where { D, O }\n\nThe LoggerActor logs all next!/error!/complete! events that are sent from an Observable.\n\nConstructor arguments\n\nname: name of the logger. Optional. Default is LogActor.\nio: io stream to log in, maybe nothing to write to stdout\n\nSee also: Actor, logger\n\n\n\n\n\n","category":"type"},{"location":"operators/multicasting/about/#Multicasting-category","page":"About multicasting operators","title":"Multicasting category","text":"","category":"section"},{"location":"operators/multicasting/about/","page":"About multicasting operators","title":"About multicasting operators","text":"There are operators for different purposes, and they may be categorized as: creation, transformation, filtering, joining, multicasting, error handling, utility, etc. In the following list you will find all the operators organized in multicasting category.","category":"page"},{"location":"operators/multicasting/about/","page":"About multicasting operators","title":"About multicasting operators","text":"multicast\npublish\npublish_behavior\npublish_replay\nshare\nshare_replay","category":"page"},{"location":"operators/multicasting/about/#See-also","page":"About multicasting operators","title":"See also","text":"","category":"section"},{"location":"operators/multicasting/about/","page":"About multicasting operators","title":"About multicasting operators","text":"Operators","category":"page"},{"location":"observables/types/zipped/#observable_zipped","page":"Zipped","title":"Zipped Observable","text":"","category":"section"},{"location":"observables/types/zipped/","page":"Zipped","title":"Zipped","text":"zipped","category":"page"},{"location":"observables/types/zipped/#Rocket.zipped","page":"Zipped","title":"Rocket.zipped","text":"zipped(sources...)\n\nCombines multiple Observables to create an Observable whose values are calculated from the values, in order, of each of its input Observables.\n\nArguments\n\nsources: input sources\n\nExamples\n\nusing Rocket\n\nsource = zipped(of(1), from(2:5))\n\nsubscribe!(source, logger())\n;\n\n# output\n\n[LogActor] Data: (1, 2)\n[LogActor] Completed\n\nusing Rocket\n\nsource = zipped(from(1:3), from(1:5))\n\nsubscribe!(source, logger())\n;\n\n# output\n\n[LogActor] Data: (1, 1)\n[LogActor] Data: (2, 2)\n[LogActor] Data: (3, 3)\n[LogActor] Completed\n\nusing Rocket\n\nsource = zipped(completed(), of(0.0))\n\nsubscribe!(source, logger())\n;\n\n# output\n\n[LogActor] Completed\n\nSee also: Subscribable, subscribe!\n\n\n\n\n\n","category":"function"},{"location":"contributing/#Contribution-guidelines","page":"Contributing","title":"Contribution guidelines","text":"","category":"section"},{"location":"contributing/","page":"Contributing","title":"Contributing","text":"We welcome all possible contributors. This page details the some of the guidelines that should be followed when contributing to this package.","category":"page"},{"location":"contributing/#Reporting-bugs","page":"Contributing","title":"Reporting bugs","text":"","category":"section"},{"location":"contributing/","page":"Contributing","title":"Contributing","text":"We track bugs using GitHub issues. We encourage you to write complete, specific, reproducible bug reports. Mention the versions of Julia and Rocket.jl for which you observe unexpected behavior. Please provide a concise description of the problem and complement it with code snippets, test cases, screenshots, tracebacks or any other information that you consider relevant. This will help us to replicate the problem and narrow the search space for solutions.","category":"page"},{"location":"contributing/#Suggesting-features","page":"Contributing","title":"Suggesting features","text":"","category":"section"},{"location":"contributing/","page":"Contributing","title":"Contributing","text":"We welcome new feature proposals. However, before submitting a feature request, consider a few things:","category":"page"},{"location":"contributing/","page":"Contributing","title":"Contributing","text":"Does the feature require changes in the core Rocket.jl code? If it doesn't (for example, you would like to add a operator for a particular application), consider making a separate repository for your extensions.\nIf you would like to add an implementation of a feature that changes a lot in the core Rocket.jl code, please open an issue on GitHub and describe your proposal first. This will allow us to discuss your proposal with you before you invest your time in implementing something that may be difficult to merge later on.","category":"page"},{"location":"contributing/#Contributing-code","page":"Contributing","title":"Contributing code","text":"","category":"section"},{"location":"contributing/#Installing-Rocket","page":"Contributing","title":"Installing Rocket","text":"","category":"section"},{"location":"contributing/","page":"Contributing","title":"Contributing","text":"We suggest that you use the dev command from the new Julia package manager to install Rocket.jl for development purposes. To work on your fork of Rocket.jl, use your fork's URL address in the dev command, for example:","category":"page"},{"location":"contributing/","page":"Contributing","title":"Contributing","text":"] dev git@github.com:your_username/Rocket.jl.git","category":"page"},{"location":"contributing/","page":"Contributing","title":"Contributing","text":"The dev command clones Rocket.jl to ~/.julia/dev/Rocket. All local changes to Rocket code will be reflected in imported code.","category":"page"},{"location":"contributing/","page":"Contributing","title":"Contributing","text":"note: Note\nIt is also might be useful to install Revise.jl package as it allows you to modify code and use the changes without restarting Julia.","category":"page"},{"location":"contributing/#Committing-code","page":"Contributing","title":"Committing code","text":"","category":"section"},{"location":"contributing/","page":"Contributing","title":"Contributing","text":"We use the standard GitHub Flow workflow where all contributions are added through pull requests. In order to contribute, first fork the repository, then commit your contributions to your fork, and then create a pull request on the master branch of the Rocket.jl repository.","category":"page"},{"location":"contributing/","page":"Contributing","title":"Contributing","text":"Before opening a pull request, please make sure that all tests pass without failing! All demos (can be found in /demo/ directory) have to run without errors as well.","category":"page"},{"location":"contributing/#Style-conventions","page":"Contributing","title":"Style conventions","text":"","category":"section"},{"location":"contributing/","page":"Contributing","title":"Contributing","text":"We use default Julia style guide. We list here a few important points and our modifications to the Julia style guide:","category":"page"},{"location":"contributing/","page":"Contributing","title":"Contributing","text":"Use 4 spaces for indentation\nType names use UpperCamelCase. For example: ArrayObservable, MapOperator, etc..\nFunction names are lowercase with underscores, when necessary. For example: next!, subscribe!, as_actor, etc..\nVariable names and function arguments use snake_case\nThe name of a method that modifies its argument(s) must end in !","category":"page"},{"location":"contributing/#Unit-tests","page":"Contributing","title":"Unit tests","text":"","category":"section"},{"location":"contributing/","page":"Contributing","title":"Contributing","text":"We use the test-driven development (TDD) methodology for Rocket.jl development. The test coverage should be as complete as possible. Please make sure that you write tests for each piece of code that you want to add.","category":"page"},{"location":"contributing/","page":"Contributing","title":"Contributing","text":"All unit tests are located in the /test/ directory. The /test/ directory follows the structure of the /src/ directory. Each test file should have following filename format: test_*.jl. Some tests are also present in jldoctest docs annotations directly in the source code. See Julia's documentation about doctests.","category":"page"},{"location":"contributing/","page":"Contributing","title":"Contributing","text":"The tests can be evaluated by running following command in the Julia REPL:","category":"page"},{"location":"contributing/","page":"Contributing","title":"Contributing","text":"] test Rocket","category":"page"},{"location":"operators/transformation/override/#operator_override","page":"override","title":"Override Operator","text":"","category":"section"},{"location":"operators/transformation/override/","page":"override","title":"override","text":"override\nOverrideHandler","category":"page"},{"location":"operators/transformation/override/#Rocket.override","page":"override","title":"Rocket.override","text":"override(handler::OverrideHandler)\n\nCreates an override operator that overrides each emission from source observable with value provided in handler. If handler contains nothing source observable emits as usual. For constant override see map_to. Use Rocket.setvalue! to set new value for handler.\n\nProducing\n\nStream of type <: Subscribable{Union{L, T}} where L refers to the type of source stream and T referes to the type of handler's value\n\nExamples\n\nusing Rocket \n\nsubject = Subject(Int)\nhandler = OverrideHandler(Int, -1)\n\nsource = subject |> override(handler)\n\nsubscription = subscribe!(source, logger())\n\nnext!(subject, 1)\nnext!(subject, 2)\n\nRocket.setvalue!(handler, nothing)\n\nnext!(subject, 3)\nnext!(subject, 4)\n\nRocket.setvalue!(handler, -2)\n\nnext!(subject, 5)\nnext!(subject, 6)\n\nunsubscribe!(subscription)\n\n# output\n[LogActor] Data: -1\n[LogActor] Data: -1\n[LogActor] Data: 3\n[LogActor] Data: 4\n[LogActor] Data: -2\n[LogActor] Data: -2\n\nSee also: OverrideHandler\n\n\n\n\n\n","category":"function"},{"location":"operators/transformation/override/#Rocket.OverrideHandler","page":"override","title":"Rocket.OverrideHandler","text":"OverrideHandler(::Type{T}, value::Union{Nothing, T}) where T\nOverrideHandler(::Type{T}) where T\n\nHandler used in substitute operator.\n\nSee also: substitute\n\n\n\n\n\n","category":"type"},{"location":"operators/transformation/override/#See-also","page":"override","title":"See also","text":"","category":"section"},{"location":"operators/transformation/override/","page":"override","title":"override","text":"Operators","category":"page"},{"location":"operators/filtering/find/#operator_find","page":"find","title":"Find operator","text":"","category":"section"},{"location":"operators/filtering/find/","page":"find","title":"find","text":"find","category":"page"},{"location":"operators/filtering/find/#Rocket.find","page":"find","title":"Rocket.find","text":"find(conditionFn::F) where { F <: Function }\n\nCreates a find operator, which emits only the first value emitted by the source Observable that meets some condition.\n\nProducing\n\nStream of type <: Subscribable{L} where L refers to type of source stream\n\nArguments\n\nconditionFn::F: condition function with (data::T) -> Bool signature\n\nExamples\n\nusing Rocket\n\nsource = from([ 1, 2, 3, 4, 5, 6, 7, 8 ])\nsubscribe!(source |> find((d) -> d % 2 == 0), logger())\n;\n\n# output\n\n[LogActor] Data: 2\n[LogActor] Completed\n\nSee also: AbstractOperator, InferableOperator, ProxyObservable, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/filtering/find/#Description","page":"find","title":"Description","text":"","category":"section"},{"location":"operators/filtering/find/","page":"find","title":"find","text":"find searches for the first item in the source Observable that matches the specified condition embodied by the predicate, and returns the first occurrence in the source. Does not emit an error if a valid value is not found.","category":"page"},{"location":"operators/filtering/find/#See-also","page":"find","title":"See also","text":"","category":"section"},{"location":"operators/filtering/find/","page":"find","title":"find","text":"Operators, take","category":"page"},{"location":"operators/utility/discontinue/#operator_discontinue","page":"discontinue","title":"Discontinue Operator","text":"","category":"section"},{"location":"operators/utility/discontinue/","page":"discontinue","title":"discontinue","text":"discontinue","category":"page"},{"location":"operators/utility/discontinue/#Rocket.discontinue","page":"discontinue","title":"Rocket.discontinue","text":"discontinue()\n\nCreates an operator, which prevents an emitting of self-depending messages and breaks a possible infinite loop. Does nothing if observable scheduled asynchronously.\n\nProducing\n\nStream of type <: Subscribable{L} where L refers to type of source stream\n\nExamples\n\nusing Rocket\n\ns = BehaviorSubject(0)\n\nsubscription1 = subscribe!(s, logger())\nsubscription2 = subscribe!(s |> map(Int, d -> d + 1) |> discontinue(), s)\n;\n\n# output\n\n[LogActor] Data: 0\n[LogActor] Data: 1\n\nSee also: AbstractOperator, RightTypedOperator, ProxyObservable, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/utility/discontinue/#See-also","page":"discontinue","title":"See also","text":"","category":"section"},{"location":"operators/utility/discontinue/","page":"discontinue","title":"discontinue","text":"Operators","category":"page"},{"location":"teardown/about/#section_subscription","page":"Subscription","title":"Subscription","text":"","category":"section"},{"location":"teardown/about/","page":"Subscription","title":"Subscription","text":"A Subscription represents a disposable resource, usually the execution of an Observable. A Subscription has one important method: unsubscribe!(teardown), which takes some teardown logic object as one argument and disposes the resource held by the subscription.","category":"page"},{"location":"teardown/about/","page":"Subscription","title":"Subscription","text":"using Rocket\n\nsource = Subject(Int)\n\nnext!(source, 0) # Logs nothing as there is no subscribers\n\nsubscription = subscribe!(source, logger())\n\nnext!(source, 1) # Logs [LogActor] Data: 1 into standard output\n\nunsubscribe!(subscription)\n\nnext!(source, 2) # Logs nothing as a single one actor has unsubscribed","category":"page"},{"location":"teardown/about/","page":"Subscription","title":"Subscription","text":"note: Note\nA Subscription essentially just has its own specific method for unsubscribe!() function which releases resources or cancel Observable executions. Any Observable has to return a valid Teardown object.","category":"page"},{"location":"teardown/about/","page":"Subscription","title":"Subscription","text":"The unsubscribe! function also supports multiple unsubscriptions at once. If the input argument to the unsubscribe! function is either a tuple or a vector, it will first check that all of the arguments are valid subscription objects and if this is true it will unsubscribe from each of them individually.","category":"page"},{"location":"teardown/about/","page":"Subscription","title":"Subscription","text":"\nsource = Subject(Int)\n\nsubscription1 = subscribe!(source, logger())\nsubscription2 = subscribe!(source, logger())\n\nunsubscribe!((subscription1, subscription2))\n\n# or similarly\n# unsubscribe!([ subscription1, subscription2 ])\n","category":"page"},{"location":"teardown/about/","page":"Subscription","title":"Subscription","text":"For more information about subscription and teardown logic see the API Section","category":"page"},{"location":"operators/transformation/switch_map_to/#operator_switch_map_to","page":"switch_map_to","title":"SwitchMapTo Operator","text":"","category":"section"},{"location":"operators/transformation/switch_map_to/","page":"switch_map_to","title":"switch_map_to","text":"switch_map_to","category":"page"},{"location":"operators/transformation/switch_map_to/#Rocket.switch_map_to","page":"switch_map_to","title":"Rocket.switch_map_to","text":"switch_map_to(inner_observable)\n\nCreates a switch_map_to operator, which projects each source value to the same Observable which is flattened multiple times with switch_map in the output Observable.\n\nArguments\n\ninner_observable: an Observable to replace each value from the source Observable.\n\nProducing\n\nStream of type <: Subscribable{R} where R refers to the eltype of inner_observable\n\nExamples\n\nusing Rocket\n\nsource = from([ 0, 0, 0 ])\nsubscribe!(source |> switch_map_to(from([ 1, 2, 3 ])), logger())\n;\n\n# output\n\n[LogActor] Data: 1\n[LogActor] Data: 2\n[LogActor] Data: 3\n[LogActor] Data: 1\n[LogActor] Data: 2\n[LogActor] Data: 3\n[LogActor] Data: 1\n[LogActor] Data: 2\n[LogActor] Data: 3\n[LogActor] Completed\n\nSee also: switch_map, AbstractOperator, RightTypedOperator, ProxyObservable, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/transformation/switch_map_to/","page":"switch_map_to","title":"switch_map_to","text":"note: Note\nswitch_map_to is equivalent to switch_map with mappingFn set to (_) -> inner_observable.","category":"page"},{"location":"operators/transformation/switch_map_to/#See-also","page":"switch_map_to","title":"See also","text":"","category":"section"},{"location":"operators/transformation/switch_map_to/","page":"switch_map_to","title":"switch_map_to","text":"Operators","category":"page"},{"location":"operators/errors/rerun/#operator_rerun","page":"rerun","title":"Rerun Operator","text":"","category":"section"},{"location":"operators/errors/rerun/","page":"rerun","title":"rerun","text":"rerun","category":"page"},{"location":"operators/errors/rerun/#Rocket.rerun","page":"rerun","title":"Rocket.rerun","text":"rerun(count::Int = -1)\n\nReturns an Observable that mirrors the source Observable with the exception of an error. If the source Observable calls error, this method will resubscribe to the source Observable for a maximum of count resubscriptions (given as a number parameter) rather than propagating the error call.\n\nArguments:\n\ncount::Int: Number of retry attempts before failing. Optional. Default is -1.\n\nProducing\n\nStream of type <: Subscribable{L} where L refers to type of source stream\n\nExamples\n\nusing Rocket\n\nsource = from(1:3) |> safe() |> map(Int, (d) -> d > 1 ? error(\"Error\") : d) |> rerun(3)\n\nsubscribe!(source, logger())\n;\n\n# output\n[LogActor] Data: 1\n[LogActor] Data: 1\n[LogActor] Data: 1\n[LogActor] Data: 1\n[LogActor] Error: ErrorException(\"Error\")\n\nSee also: AbstractOperator, InferableOperator, catch_error, logger, safe\n\n\n\n\n\n","category":"function"},{"location":"operators/errors/rerun/#Description","page":"rerun","title":"Description","text":"","category":"section"},{"location":"operators/errors/rerun/","page":"rerun","title":"rerun","text":"Any and all items emitted by the source Observable will be emitted by the resulting Observable, even those emitted during failed subscriptions. For example, if an Observable fails at first but emits [1, 2] then succeeds the second time and emits: [1, 2, 3, 4, 5] then the complete stream of emissions and notifications would be: [1, 2, 1, 2, 3, 4, 5, complete].","category":"page"},{"location":"operators/errors/rerun/#See-also","page":"rerun","title":"See also","text":"","category":"section"},{"location":"operators/errors/rerun/","page":"rerun","title":"rerun","text":"Operators","category":"page"},{"location":"observables/types/timer/#observable_timer","page":"Timer","title":"Timer Observable","text":"","category":"section"},{"location":"observables/types/timer/","page":"Timer","title":"Timer","text":"timer","category":"page"},{"location":"observables/types/timer/#Rocket.timer","page":"Timer","title":"Rocket.timer","text":"timer(delay::Int)\ntimer(delay::Int, period::Int)\n\nCreation operator for the TimerObservable. Its like interval(@ref), but you can specify when should the emissions start. timer returns an Observable that emits an infinite sequence of ascending integers, with a constant interval of time, period of your choosing between those emissions. The first emission happens after the specified delay. If period is not specified, the output Observable emits only one value, 0. Otherwise, it emits an infinite sequence. The timer closes automatically when the unsubscription happens.\n\nArguments\n\ndelay: the initial delay time specified as an integer denoting milliseconds to wait before emitting the first value of 0.\nperiod: the minimum period of time between emissions of the subsequent numbers (in milliseconds).\n\nExamples\n\nusing Rocket\n\nsource = timer(0, 50)\n\nsleep(0.075)\nsubscription = subscribe!(source, logger())\nsleep(0.105)\nunsubscribe!(subscription)\n\n;\n\n# output\n\n[LogActor] Data: 2\n[LogActor] Data: 3\n\n\nSee also: interval, TimerObservable, subscribe!, logger\n\n\n\n\n\n","category":"function"},{"location":"observables/types/timer/","page":"Timer","title":"Timer","text":"TimerObservable","category":"page"},{"location":"observables/types/timer/#Rocket.TimerObservable","page":"Timer","title":"Rocket.TimerObservable","text":"TimerObservable\n\nAn Observable that starts emitting after an delay and emits ever increasing numbers after each period of time thereafter.\n\nParameters\n\ndelay: The initial delay time specified as an integer denoting milliseconds to wait before emitting the first value of 0`.\nperiod: The minimum period of time in milliseconds between emissions of the subsequent numbers.\n\nSee also: timer, Subscribable\n\n\n\n\n\n","category":"type"},{"location":"actors/about/#section_actors","page":"Actor","title":"Actors","text":"","category":"section"},{"location":"actors/about/","page":"Actor","title":"Actor","text":"An Actor is the most primitive unit of computation: it receives a message and performs a computation.","category":"page"},{"location":"actors/about/","page":"Actor","title":"Actor","text":"An actor is analogous to an object in an object-oriented languages. An object receives a message (a method call) and does something depending on which message it receives (the method we are calling). The main difference is that actors are completely isolated from each other, and they will never share memory. It’s also worth mentioning that an actor can maintain a private state that should never be changed directly by another actor.","category":"page"},{"location":"actors/about/","page":"Actor","title":"Actor","text":"For a quick introduction to Actor models, see this article.","category":"page"},{"location":"actors/about/","page":"Actor","title":"Actor","text":"The API of Rocket.jl's Actors is similar to RxJS subscribers.","category":"page"},{"location":"actors/about/#First-example","page":"Actor","title":"First example","text":"","category":"section"},{"location":"actors/about/","page":"Actor","title":"Actor","text":"The following example implements an Actor that retains each received value from an Observable.","category":"page"},{"location":"actors/about/","page":"Actor","title":"Actor","text":"using Rocket\n\nstruct CustomKeepActor <: Actor{Int}\n values::Vector{Int}\n\n CustomKeepActor() = new(Vector{Int}())\nend\n\nRocket.on_next!(actor::CustomKeepActor, data::Int) = push!(actor.values, data)\nRocket.on_error!(actor::CustomKeepActor, err) = error(err)\nRocket.on_complete!(actor::CustomKeepActor) = println(\"Completed!\")\n\nsource = from([ 1, 2, 3 ])\nkeep_actor = CustomKeepActor()\nsubscribe!(source, keep_actor)\n\n# Logs\n# Completed!\n\nprintln(keep_actor.values)\n\n# Logs\n# [1, 2, 3]","category":"page"},{"location":"actors/about/","page":"Actor","title":"Actor","text":"An actor may be not interested in the values itself, but merely the completion of an event. In this case, Rocket.jl provides a CompletionActor abstract type. See also NextActor and ErrorActor.","category":"page"},{"location":"actors/about/","page":"Actor","title":"Actor","text":"using Rocket\n\nstruct CompletionNotificationActor <: CompletionActor{Int} end\n\nRocket.on_complete!(::CompletionNotificationActor) = println(\"Completed!\")\n\nsource = from([ 1, 2, 3 ])\nsubscribe!(source, CompletionNotificationActor());\n\n# Logs\n# Completed","category":"page"},{"location":"actors/about/","page":"Actor","title":"Actor","text":"It is also possible to use Julia's multiple dispatch feature and dispatch on type of the event","category":"page"},{"location":"actors/about/","page":"Actor","title":"Actor","text":"using Rocket\n\nstruct MyCustomActor <: NextActor{Any} end\n\nRocket.on_next!(::MyCustomActor, data::Int) = println(\"Int: $data\")\nRocket.on_next!(::MyCustomActor, data::Float64) = println(\"Float64: $data\")\nRocket.on_next!(::MyCustomActor, data) = println(\"Something else: $data\")\n\nsource = from([ 1, 1.0, \"string\" ])\nsubscribe!(source, MyCustomActor());\n\n# Logs\n# Int: 1\n# Float64: 1.0\n# Something else: string\n","category":"page"},{"location":"actors/about/#Lambda-actor","page":"Actor","title":"Lambda actor","text":"","category":"section"},{"location":"actors/about/","page":"Actor","title":"Actor","text":"For debugging purposes it may be convenient to work with a LambdaActor. This provides an interface that defines callbacks for \"next\", \"error\" and \"complete\" events. But this generic actor does not allow to dispatch on the type of the event.","category":"page"},{"location":"actors/about/","page":"Actor","title":"Actor","text":"using Rocket\n\nsource = from([1, 2, 3])\n\nsubscribe!(source, lambda(\n on_next = (d) -> println(d),\n on_error = (e) -> error(e),\n on_complete = () -> println(\"Completed\")\n))\n\n# Logs\n# 1\n# 2\n# 3\n# Completed","category":"page"},{"location":"actors/about/#Function-actor","page":"Actor","title":"Function actor","text":"","category":"section"},{"location":"actors/about/","page":"Actor","title":"Actor","text":"Sometimes it is convenient to pass only on_next callback. Rocket.jl provides a FunctionActor which automatically converts any function object passed in the subscribe! function to a proper actor which listens only for data events, throws an exception on error event and ignores completion message.","category":"page"},{"location":"actors/about/","page":"Actor","title":"Actor","text":"using Rocket\n\nsource = from([1, 2, 3])\n\nsubscribe!(source, (d) -> println(d))\n\n# Logs\n# 1\n# 2\n# 3","category":"page"},{"location":"observables/types/single/#observable_single","page":"Single","title":"Single Observable","text":"","category":"section"},{"location":"observables/types/single/","page":"Single","title":"Single","text":"of","category":"page"},{"location":"observables/types/single/#Rocket.of","page":"Single","title":"Rocket.of","text":"of(x; scheduler::H = AsapScheduler()) where { H <: AbstractScheduler }\n\nCreation operator for the SingleObservable that emits a single value x and then completes.\n\nArguments\n\nx: value to be emmited before completion\n\nExamples\n\nusing Rocket\n\nsource = of(1)\nsubscribe!(source, logger())\n;\n\n# output\n\n[LogActor] Data: 1\n[LogActor] Completed\n\n\nSee also: SingleObservable, subscribe!, logger\n\n\n\n\n\n","category":"function"},{"location":"observables/types/single/","page":"Single","title":"Single","text":"SingleObservable","category":"page"},{"location":"observables/types/single/#Rocket.SingleObservable","page":"Single","title":"Rocket.SingleObservable","text":"SingleObservable{D, H}(value::D, scheduler::H)\n\nSingleObservable wraps single value of type D into a observable.\n\nConstructor arguments\n\nvalue: a single value to emit\nscheduler: scheduler-like object\n\nSee also: of, Subscribable\n\n\n\n\n\n","category":"type"},{"location":"observables/types/interval/#observable_interval","page":"Interval","title":"Interval Observable","text":"","category":"section"},{"location":"observables/types/interval/","page":"Interval","title":"Interval","text":"interval","category":"page"},{"location":"observables/types/interval/#Rocket.interval","page":"Interval","title":"Rocket.interval","text":"interval(period::Union{Int, Nothing} = nothing)\n\nCreation operator for the TimerObservable. interval returns an Observable that emits an infinite sequence of ascending integers, with a constant interval of time of your choosing between those emissions. The first emission is not sent immediately, but only after the first period has passed.\n\nArguments\n\ninterval: the interval size in milliseconds\n\nExamples\n\nusing Rocket\n\nsource = interval(50)\n\nsubscription = subscribe!(source, logger())\nsleep(0.215)\nunsubscribe!(subscription)\nsleep(0.215)\nsubscription = subscribe!(source, logger())\nsleep(0.185)\nunsubscribe!(subscription)\n\nclose(source)\n;\n\n# output\n\n[LogActor] Data: 0\n[LogActor] Data: 1\n[LogActor] Data: 2\n[LogActor] Data: 3\n[LogActor] Data: 8\n[LogActor] Data: 9\n[LogActor] Data: 10\n\nSee also: timer, TimerObservable, Subscribable\n\n\n\n\n\n","category":"function"},{"location":"operators/filtering/take_until/#operator_take_until","page":"take_until","title":"TakeUntil Operator","text":"","category":"section"},{"location":"operators/filtering/take_until/","page":"take_until","title":"take_until","text":"take_until","category":"page"},{"location":"operators/filtering/take_until/#Rocket.take_until","page":"take_until","title":"Rocket.take_until","text":"take_until(notifier::S)\n\nCreates a take operator, which returns an Observable that emits the values emitted by the source Observable until a notifier Observable emits a value or a completion event.\n\nArguments\n\nnotifier::S: The Observable whose first emitted value will cause the output Observable of take_until to stop emitting values from the source Observable.\n\nProducing\n\nStream of type <: Subscribable{L} where L refers to type of source stream\n\nExamples\n\nusing Rocket\n\nsource = interval(100) |> take_until(timer(1000))\n\nsubscribe!(source, logger())\n;\n\n# output\n\n[LogActor] Data: 0\n[LogActor] Data: 1\n[LogActor] Data: 2\n[LogActor] Data: 3\n[LogActor] Data: 4\n[LogActor] Data: 5\n[LogActor] Data: 6\n[LogActor] Data: 7\n[LogActor] Data: 8\n[LogActor] Completed\n\nusing Rocket \n\nsource = interval(100)\n\nsubscribe!(source |> take_until(source |> filter(i -> i == 3)), logger())\n;\n\n# output \n\n[LogActor] Data: 0\n[LogActor] Data: 1\n[LogActor] Data: 2\n[LogActor] Completed\n\nSee also: AbstractOperator, InferableOperator, ProxyObservable, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/filtering/take_until/#Description","page":"take_until","title":"Description","text":"","category":"section"},{"location":"operators/filtering/take_until/","page":"take_until","title":"take_until","text":"take_until subscribes and begins mirroring the source Observable. It also monitors a second Observable, notifier that you provide. If the notifier emits a value, the output Observable stops mirroring the source Observable and completes. If the notifier doesn't emit any value and completes then take_until also completes.","category":"page"},{"location":"operators/filtering/take_until/#See-also","page":"take_until","title":"See also","text":"","category":"section"},{"location":"operators/filtering/take_until/","page":"take_until","title":"take_until","text":"Operators","category":"page"},{"location":"operators/multicasting/share/#operator_share","page":"share","title":"Share Operators","text":"","category":"section"},{"location":"operators/multicasting/share/","page":"share","title":"share","text":"share\nshare_replay\nshare_recent","category":"page"},{"location":"operators/multicasting/share/#Rocket.share","page":"share","title":"Rocket.share","text":"share(; scheduler::H = AsapScheduler()) where { H <: AbstractScheduler }\n\nshare() is a shortcut for publish() + ref_count()\n\nSee also: AbstractOperator, multicast, publish, ref_count\n\n\n\n\n\n","category":"function"},{"location":"operators/multicasting/share/#Rocket.share_replay","page":"share","title":"Rocket.share_replay","text":"share_replay(size::Int; scheduler::H = AsapScheduler()) where { H <: AbstractScheduler }\n\nshare_replay(size) is a shortcut for publish_replay(size) + ref_count()\n\nSee also: AbstractOperator, multicast, publish, publish_replay, ref_count\n\n\n\n\n\n","category":"function"},{"location":"operators/multicasting/share/#Rocket.share_recent","page":"share","title":"Rocket.share_recent","text":"share_recent(; scheduler::H = AsapScheduler()) where { H <: AbstractScheduler }\n\nshare_recent() is a shortcut for publish_recent() + ref_count()\n\nSee also: AbstractOperator, multicast, publish, publish_recent, ref_count\n\n\n\n\n\n","category":"function"},{"location":"operators/multicasting/share/#See-also","page":"share","title":"See also","text":"","category":"section"},{"location":"operators/multicasting/share/","page":"share","title":"share","text":"Operators","category":"page"},{"location":"operators/transformation/concat_map/#operator_concat_map","page":"concat_map","title":"ConcatMap Operator","text":"","category":"section"},{"location":"operators/transformation/concat_map/","page":"concat_map","title":"concat_map","text":"concat_map","category":"page"},{"location":"operators/transformation/concat_map/#Rocket.concat_map","page":"concat_map","title":"Rocket.concat_map","text":"concat_map(::Type{R}, mappingFn::F = identity) where { R, F <: Function }\n\nCreates a concat_map operator, which returns an Observable that emits the result of applying the projection function to each item emitted by the source Observable and taking values from each projected inner Observable sequentially. Essentialy it projects each source value to an Observable which is merged in the output Observable, in a serialized fashion waiting for each one to complete before merging the next.\n\nArguments\n\n::Type{R}: the type of data of output Observables after projection with mappingFn\nmappingFn::F: projection function with (data) -> Observable{R} signature\n\nProducing\n\nStream of type <: Subscribable{R}\n\nExamples\n\nusing Rocket\n\nsource = from([ 0, 0 ]) |> concat_map(Int, d -> from([ 1, 2, 3 ], scheduler = AsyncScheduler(0)))\nsubscribe!(source, logger())\n;\n\n# output\n\n[LogActor] Data: 1\n[LogActor] Data: 2\n[LogActor] Data: 3\n[LogActor] Data: 1\n[LogActor] Data: 2\n[LogActor] Data: 3\n[LogActor] Completed\n\nSee also: AbstractOperator, RightTypedOperator, ProxyObservable, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/transformation/concat_map/#Description","page":"concat_map","title":"Description","text":"","category":"section"},{"location":"operators/transformation/concat_map/","page":"concat_map","title":"concat_map","text":"Returns an Observable that emits items based on applying a function that you supply to each item emitted by the source Observable, where that function returns an (so-called \"inner\") Observable. Each new inner Observable is concatenated with the previous inner Observable.","category":"page"},{"location":"operators/transformation/concat_map/","page":"concat_map","title":"concat_map","text":"warning: Warning\nIf source values arrive endlessly and faster than their corresponding inner Observables can complete, it will result in memory issues as inner Observables amass in an unbounded buffer waiting for their turn to be subscribed to.","category":"page"},{"location":"operators/transformation/concat_map/","page":"concat_map","title":"concat_map","text":"note: Note\nconcat_map is equivalent to merge_map with concurrency parameter set to 1.","category":"page"},{"location":"operators/transformation/concat_map/#See-also","page":"concat_map","title":"See also","text":"","category":"section"},{"location":"operators/transformation/concat_map/","page":"concat_map","title":"concat_map","text":"Operators, merge_map","category":"page"},{"location":"subjects/types/pending/#subject_pending","page":"Pending","title":"PendingSubject","text":"","category":"section"},{"location":"subjects/types/pending/","page":"Pending","title":"Pending","text":"PendingSubject\nPendingSubjectFactory","category":"page"},{"location":"subjects/types/pending/#Rocket.PendingSubject","page":"Pending","title":"Rocket.PendingSubject","text":"PendingSubject(::Type{D}) where D\nPendingSubject(::Type{D}, factory::F) where { D, F <: AbstractFactory }\nPendingSubject(::Type{D}, subject::S) where { D, S }\n\nA variant of Subject that emits its last value on completion. Reemits last value on further subscriptions and then completes.\n\nSee also: PendingSubjectFactory, Subject, SubjectFactory\n\n\n\n\n\n","category":"function"},{"location":"subjects/types/pending/#Rocket.PendingSubjectFactory","page":"Pending","title":"Rocket.PendingSubjectFactory","text":"PendingSubjectFactory(factory::F) where { F <: AbstractSubjectFactory }\nPendingSubjectFactory(; scheduler::H = AsapScheduler()) where { H <: AbstractScheduler }\n\nA variant of SubjectFactory that creates an instance of PendingSubject.\n\nSee also: SubjectFactory, AbstractSubjectFactory, PendingSubject, Subject\n\n\n\n\n\n","category":"function"},{"location":"subjects/types/pending/#Description","page":"Pending","title":"Description","text":"","category":"section"},{"location":"subjects/types/pending/","page":"Pending","title":"Pending","text":"A variant of Subject that only emits a value when it completes. It will emit its latest value to all its observers on completion. It will reemit its latest value to all new observers on further subscription and then complete. It is not possible to overwrite last value after completion.","category":"page"},{"location":"subjects/types/pending/#Examples","page":"Pending","title":"Examples","text":"","category":"section"},{"location":"subjects/types/pending/","page":"Pending","title":"Pending","text":"using Rocket\n\nsubject = PendingSubject(Int)\n\nsubscription1 = subscribe!(subject, logger(\"1\"))\n\nnext!(subject, 1) # Nothing is logged\nnext!(subject, 2) # Nothing is logged\n\nsubscription2 = subscribe!(subject, logger(\"2\"))\n\nnext!(subject, 3) # Nothing is logged\n\ncomplete!(subject)\n\nsubscription3 = subscribe!(subject, logger(\"3\"))\n\n[1] Data: 3\n[2] Data: 3\n[1] Completed\n[2] Completed\n[3] Data: 3\n[3] Completed","category":"page"},{"location":"operators/filtering/filter_type/#operator_filter_type","page":"filter_type","title":"FilterType Operator","text":"","category":"section"},{"location":"operators/filtering/filter_type/","page":"filter_type","title":"filter_type","text":"filter_type","category":"page"},{"location":"operators/filtering/filter_type/#Rocket.filter_type","page":"filter_type","title":"Rocket.filter_type","text":"filter_type(type::Type{ T }) where { T }\n\nCreates a filter_type operator, which filters items of the source Observable by emitting only those that match a specified T type with a <: operator. This operator is a more efficient version of filter(v -> v <: T) |> map(T, v -> v) operators chain.\n\nProducing\n\nStream of type <: Subscribable{ T } where T refers to type argument\n\nExamples\n\nusing Rocket\n\nsource = from(Real[ 1, 2.0, 3, 4.0, 5, 6.0 ])\nsubscribe!(source |> filter_type(Int), logger())\n;\n\n# output\n\n[LogActor] Data: 1\n[LogActor] Data: 3\n[LogActor] Data: 5\n[LogActor] Completed\n\nSee also: AbstractOperator, InferableOperator, ProxyObservable, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/filtering/filter_type/#See-also","page":"filter_type","title":"See also","text":"","category":"section"},{"location":"operators/filtering/filter_type/","page":"filter_type","title":"filter_type","text":"Operators","category":"page"},{"location":"operators/filtering/filter/#operator_filter","page":"filter","title":"Filter Operator","text":"","category":"section"},{"location":"operators/filtering/filter/","page":"filter","title":"filter","text":"filter","category":"page"},{"location":"operators/filtering/filter/#Base.filter","page":"filter","title":"Base.filter","text":"filter(filterFn::F) where { F <: Function }\n\nCreates a filter operator, which filters items of the source Observable by emitting only those that satisfy a specified filterFn predicate.\n\nProducing\n\nStream of type <: Subscribable{L} where L refers to type of source stream\n\nArguments\n\nfilterFn::F: predicate function with (data::T) -> Bool signature\n\nExamples\n\nusing Rocket\n\nsource = from([ 1, 2, 3, 4, 5, 6 ])\nsubscribe!(source |> filter((d) -> d % 2 == 0), logger())\n;\n\n# output\n\n[LogActor] Data: 2\n[LogActor] Data: 4\n[LogActor] Data: 6\n[LogActor] Completed\n\nSee also: AbstractOperator, InferableOperator, ProxyObservable, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/filtering/filter/#Description","page":"filter","title":"Description","text":"","category":"section"},{"location":"operators/filtering/filter/","page":"filter","title":"filter","text":"Like filter(f, array), this operator takes values from the source Observable, passes them through a predicate function and only emits those values that yielded true.","category":"page"},{"location":"operators/filtering/filter/#See-also","page":"filter","title":"See also","text":"","category":"section"},{"location":"operators/filtering/filter/","page":"filter","title":"filter","text":"Operators","category":"page"},{"location":"operators/join/with_latest/#operator_with_latest","page":"with_latest","title":"WithLatest Operator","text":"","category":"section"},{"location":"operators/join/with_latest/","page":"with_latest","title":"with_latest","text":"with_latest","category":"page"},{"location":"operators/join/with_latest/#Rocket.with_latest","page":"with_latest","title":"Rocket.with_latest","text":"with_latest(sources...)\n\nCreates a with_latest operator, which combines the source Observable with other Observables to create an Observable whose values are calculated from the latest values of each, only when the source emits.\n\nExamples\n\nusing Rocket\n\nsource = of(1)\nsubscribe!(source |> with_latest(from(1:5)), logger())\n;\n\n# output\n\n[LogActor] Data: (1, 5)\n[LogActor] Completed\n\nSee also: AbstractOperator, InferableOperator\n\n\n\n\n\n","category":"function"},{"location":"operators/join/with_latest/#See-also","page":"with_latest","title":"See also","text":"","category":"section"},{"location":"operators/join/with_latest/","page":"with_latest","title":"with_latest","text":"Operators","category":"page"},{"location":"operators/join/about/#Join-category","page":"Join category","title":"Join category","text":"","category":"section"},{"location":"operators/join/about/","page":"Join category","title":"Join category","text":"There are operators for different purposes, and they may be categorized as: creation, transformation, filtering, joining, multicasting, error handling, utility, etc. In the following list you will find all the operators organized in join category.","category":"page"},{"location":"operators/join/about/","page":"Join category","title":"Join category","text":"with_latest","category":"page"},{"location":"operators/join/about/#See-also","page":"Join category","title":"See also","text":"","category":"section"},{"location":"operators/join/about/","page":"Join category","title":"Join category","text":"Operators","category":"page"},{"location":"subjects/types/behavior/#subject_behavior","page":"Behavior","title":"BehaviorSubject","text":"","category":"section"},{"location":"subjects/types/behavior/","page":"Behavior","title":"Behavior","text":"BehaviorSubject\nBehaviorSubjectFactory","category":"page"},{"location":"subjects/types/behavior/#Rocket.BehaviorSubject","page":"Behavior","title":"Rocket.BehaviorSubject","text":"BehaviorSubject(value::D) where D\nBehaviorSubject(::Type{D}, value) where D\nBehaviorSubject(::Type{D}, value, factory::F) where { D, F <: AbstractSubjectFactory }\nBehaviorSubject(::Type{D}, value, subject::S) where { D, S }\n\nA variant of Subject that requires an initial value and emits its current value whenever it is subscribed to.\n\nSee also: BehaviorSubjectFactory, Subject, SubjectFactory\n\n\n\n\n\n","category":"function"},{"location":"subjects/types/behavior/#Rocket.BehaviorSubjectFactory","page":"Behavior","title":"Rocket.BehaviorSubjectFactory","text":"BehaviorSubjectFactory(default, factory::F) where { F <: AbstractSubjectFactory }\nBehaviorSubjectFactory(default; scheduler::H = AsapScheduler()) where { H <: AbstractScheduler }\n\nA variant of SubjectFactory that creates an instance of ReplaySubject.\n\nSee also: SubjectFactory, AbstractSubjectFactory, BehaviorSubject, Subject\n\n\n\n\n\n","category":"function"},{"location":"subjects/types/behavior/#Description","page":"Behavior","title":"Description","text":"","category":"section"},{"location":"subjects/types/behavior/","page":"Behavior","title":"Behavior","text":"One of the variants of Subjects is the BehaviorSubject, which has a notion of \"the current value\". It stores the latest value emitted to its consumers, and whenever a new Observer subscribes, it will immediately receive the \"current value\" from the BehaviorSubject.","category":"page"},{"location":"subjects/types/behavior/","page":"Behavior","title":"Behavior","text":"note: Note\nBehaviorSubjects are useful for representing \"values over time\". For instance, an event stream of birthdays is a Subject, but the stream of a person's age would be a BehaviorSubject.","category":"page"},{"location":"subjects/types/behavior/#Examples","page":"Behavior","title":"Examples","text":"","category":"section"},{"location":"subjects/types/behavior/","page":"Behavior","title":"Behavior","text":"In the following example, the BehaviorSubject is initialized with the value 0 which the first Observer receives when it subscribes. The second Observer receives the value 2 even though it subscribed after the value 2 was sent.","category":"page"},{"location":"subjects/types/behavior/","page":"Behavior","title":"Behavior","text":"using Rocket\n\nsubject = BehaviorSubject(Int, 0)\n\nsubscription1 = subscribe!(subject, logger(\"1\"))\n\nnext!(subject, 1)\nnext!(subject, 2)\n\nsubscription2 = subscribe!(subject, logger(\"2\"))\n\nnext!(subject, 3)\n\nunsubscribe!(subscription1)\nunsubscribe!(subscription2)\n\n// Logs\n// [1] Data: 0\n// [1] Data: 1\n// [1] Data: 2\n// [2] Data: 2\n// [1] Data: 3\n// [2] Data: 3","category":"page"},{"location":"api/operators/#operators_api","page":"Operators","title":"Operators API","text":"","category":"section"},{"location":"api/operators/#How-to-create-a-custom-operator","page":"Operators","title":"How to create a custom operator","text":"","category":"section"},{"location":"api/operators/","page":"Operators","title":"Operators","text":"If you need to write an operator that cannot be made from a combination of existing operators, then you can write a custom operator from scratch.","category":"page"},{"location":"api/operators/","page":"Operators","title":"Operators","text":"Each operator (e.g. MyFancyOperator) needs to either be (1) a subtype of one of abstract OperatorTrait trait types, or (2) define a","category":"page"},{"location":"api/operators/","page":"Operators","title":"Operators","text":"Rocket.as_operator(::Type{<:MyFancyOperator}) = TypedOperatorTrait{T, R}()\n# or\nRocket.as_operator(::Type{<:MyFancyOperator}) = InferableOperatorTrait()","category":"page"},{"location":"api/operators/","page":"Operators","title":"Operators","text":"trait behavior.","category":"page"},{"location":"api/operators/","page":"Operators","title":"Operators","text":"In addition, an operator must implement a specific method for on_call! function with custom logic which has to return another Observable as a result of applying MyFancyOperator to a source.","category":"page"},{"location":"api/operators/","page":"Operators","title":"Operators","text":"Rocket.on_call!(::Type{L}, ::Type{R}, operator::MyFancyOperator, source) where L = # some custom logic here\n\n# or\n# for inferable trait types you have to specify 'right' type with Rocket.operator_right which should specify a type of data of produced Observable\n\nRocket.on_call(::Type{L}, ::Type{R}, operator::MyFancyOperator, source) where L = # some custom logic here\nRocket.operator_right(::MyFancyOperator, ::Type{L}) where L = R # where R should be an actual type, Int or even L itself e.g.\n","category":"page"},{"location":"api/operators/","page":"Operators","title":"Operators","text":"note: Note\nIt is not allowed to modify the source Observable in any way; you have to return a new observable.","category":"page"},{"location":"api/operators/","page":"Operators","title":"Operators","text":"See more examples on custom operators in Traits API section","category":"page"},{"location":"api/operators/","page":"Operators","title":"Operators","text":"note: Note\nIt might be useful to return a ProxyObservable from an on_call! function. ProxyObservable is a special Observable which proxying actors with the source and/or source with actors.","category":"page"},{"location":"api/operators/#operators_api_traits","page":"Operators","title":"Traits","text":"","category":"section"},{"location":"api/operators/","page":"Operators","title":"Operators","text":"OperatorTrait\nas_operator\nTypedOperatorTrait\nLeftTypedOperatorTrait\nRightTypedOperatorTrait\nInferableOperatorTrait\nInvalidOperatorTrait","category":"page"},{"location":"api/operators/#Rocket.OperatorTrait","page":"Operators","title":"Rocket.OperatorTrait","text":"Abstract type for all possible operator traits\n\nSee also: TypedOperatorTrait, LeftTypedOperatorTrait, RightTypedOperatorTrait, InferableOperatorTrait, InvalidOperatorTrait,\n\n\n\n\n\n","category":"type"},{"location":"api/operators/#Rocket.as_operator","page":"Operators","title":"Rocket.as_operator","text":"as_operator(any)\n\nThis function checks operator trait behavior. May be used explicitly to specify operator trait behavior for any object.\n\nSee also: OperatorTrait, AbstractOperator\n\n\n\n\n\n","category":"function"},{"location":"api/operators/#Rocket.TypedOperatorTrait","page":"Operators","title":"Rocket.TypedOperatorTrait","text":"Typed operator trait specifies operator to be statically typed with input and output data types. Typed operator with input type L and output type R can only operate on input Observable with data type L and will always produce an Observable with data type R.\n\nExamples\n\nusing Rocket\n\nstruct MyTypedOperator <: TypedOperator{Int, Int} end\n\nfunction Rocket.on_call!(::Type{Int}, ::Type{Int}, op::MyTypedOperator, source)\n return proxy(Int, source, MyTypedOperatorProxy())\nend\n\nstruct MyTypedOperatorProxy <: ActorProxy end\n\nRocket.actor_proxy!(::Type{Int}, ::MyTypedOperatorProxy, actor::A) where A = MyTypedOperatorProxiedActor{A}(actor)\n\nstruct MyTypedOperatorProxiedActor{A} <: Actor{Int}\n actor :: A\nend\n\nfunction Rocket.on_next!(actor::MyTypedOperatorProxiedActor, data::Int)\n # Do something with a data and/or redirect it to actor.actor\n next!(actor.actor, data + 1)\nend\n\nRocket.on_error!(actor::MyTypedOperatorProxiedActor, err) = error!(actor.actor, err)\nRocket.on_complete!(actor::MyTypedOperatorProxiedActor) = complete!(actor.actor)\n\nsource = from([ 0, 1, 2 ])\nsubscribe!(source |> MyTypedOperator(), logger())\n;\n\n# output\n\n[LogActor] Data: 1\n[LogActor] Data: 2\n[LogActor] Data: 3\n[LogActor] Completed\n\nSee also: OperatorTrait, TypedOperator, OperatorTrait, ProxyObservable, ActorProxy, logger\n\n\n\n\n\n","category":"type"},{"location":"api/operators/#Rocket.LeftTypedOperatorTrait","page":"Operators","title":"Rocket.LeftTypedOperatorTrait","text":"Left typed operator trait specifies operator to be statically typed with input data type. To infer output data type this object should specify a special function operator_right(operator, ::Type{L}) where L which will be used to infer output data type. Left typed operator with input type L can only operate on input Observable with data type L and will always produce an Observable with data type inferred from operator_right(operator, ::Type{L}).\n\nExamples\n\nusing Rocket\n\nstruct CountIntegersOperator <: LeftTypedOperator{Int} end\n\nfunction Rocket.on_call!(::Type{Int}, ::Type{Tuple{Int, Int}}, op::CountIntegersOperator, source)\n return proxy(Tuple{Int, Int}, source, CountIntegersOperatorProxy())\nend\n\nRocket.operator_right(::CountIntegersOperator, ::Type{Int}) = Tuple{Int, Int}\n\nstruct CountIntegersOperatorProxy <: ActorProxy end\n\nRocket.actor_proxy!(::Type{Tuple{Int, Int}}, ::CountIntegersOperatorProxy, actor::A) where A = CountIntegersProxiedActor{A}(0, actor)\n\nmutable struct CountIntegersProxiedActor{A} <: Actor{Int}\n current :: Int\n actor :: A\nend\n\nfunction Rocket.on_next!(actor::CountIntegersProxiedActor, data::Int)\n current = actor.current\n actor.current += 1\n next!(actor.actor, (current, data)) # e.g.\nend\n\nRocket.on_error!(actor::CountIntegersProxiedActor, err) = error!(actor.actor, err)\nRocket.on_complete!(actor::CountIntegersProxiedActor) = complete!(actor.actor)\n\nsource = from([ 0, 0, 0 ])\nsubscribe!(source |> CountIntegersOperator(), logger())\n;\n\n# output\n\n[LogActor] Data: (0, 0)\n[LogActor] Data: (1, 0)\n[LogActor] Data: (2, 0)\n[LogActor] Completed\n\nSee also: OperatorTrait, LeftTypedOperator, operator_right, OperatorTrait, ProxyObservable, ActorProxy, enumerate, logger\n\n\n\n\n\n","category":"type"},{"location":"api/operators/#Rocket.RightTypedOperatorTrait","page":"Operators","title":"Rocket.RightTypedOperatorTrait","text":"Right typed operator trait specifies operator to be statically typed with output data type. It can operate on input Observable with any data type L but will always produce an Observable with data type R.\n\nExamples\n\nusing Rocket\n\nstruct ConvertToFloatOperator <: RightTypedOperator{Float64} end\n\nfunction Rocket.on_call!(::Type{L}, ::Type{Float64}, op::ConvertToFloatOperator, source) where L\n return proxy(Float64, source, ConvertToFloatProxy{L}())\nend\n\nstruct ConvertToFloatProxy{L} <: ActorProxy end\n\nfunction Rocket.actor_proxy!(::Type{Float64}, proxy::ConvertToFloatProxy{L}, actor::A) where { L, A }\n return ConvertToFloatProxyActor{L, A}(actor)\nend\n\nstruct ConvertToFloatProxyActor{L, A} <: Actor{L}\n actor :: A\nend\n\nfunction Rocket.on_next!(actor::ConvertToFloatProxyActor{L}, data::L) where L\n next!(actor.actor, convert(Float64, data)) # e.g.\nend\n\nRocket.on_error!(actor::ConvertToFloatProxyActor, err) = error!(actor.actor, err)\nRocket.on_complete!(actor::ConvertToFloatProxyActor) = complete!(actor.actor)\n\nsource = from([ 1, 2, 3 ])\nsubscribe!(source |> ConvertToFloatOperator(), logger())\n;\n\n# output\n\n[LogActor] Data: 1.0\n[LogActor] Data: 2.0\n[LogActor] Data: 3.0\n[LogActor] Completed\n\nSee also: OperatorTrait, RightTypedOperator, OperatorTrait, ProxyObservable, ActorProxy, logger\n\n\n\n\n\n","category":"type"},{"location":"api/operators/#Rocket.InferableOperatorTrait","page":"Operators","title":"Rocket.InferableOperatorTrait","text":"Inferable operator trait specifies operator to be statically typed neither with input data type nor with output data type. To infer output data type this object should specify a special function operator_right(operator, ::Type{L}) where L where L is input data type which will be used to infer output data type.\n\nusing Rocket\n\nstruct IdentityOperator <: InferableOperator end\n\nfunction Rocket.on_call!(::Type{L}, ::Type{L}, op::IdentityOperator, source) where L\n return proxy(L, source, IdentityProxy())\nend\n\nstruct IdentityProxy <: ActorProxy end\n\nRocket.operator_right(::IdentityOperator, ::Type{L}) where L = L\n\nRocket.actor_proxy!(::Type{L}, proxy::IdentityProxy, actor::A) where L where A = IdentityProxyActor{L, A}(actor)\n\nstruct IdentityProxyActor{L, A} <: Actor{L}\n actor :: A\nend\n\nfunction Rocket.on_next!(actor::IdentityProxyActor{L}, data::L) where L\n next!(actor.actor, data) # e.g.\nend\n\nRocket.on_error!(actor::IdentityProxyActor, err) = error!(actor.actor, err)\nRocket.on_complete!(actor::IdentityProxyActor) = complete!(actor.actor)\n\nsource = from([ 1, 2, 3 ])\nsubscribe!(source |> IdentityOperator(), logger())\n\nsource = from([ 1.0, 2.0, 3.0 ])\nsubscribe!(source |> IdentityOperator(), logger())\n;\n\n# output\n\n[LogActor] Data: 1\n[LogActor] Data: 2\n[LogActor] Data: 3\n[LogActor] Completed\n[LogActor] Data: 1.0\n[LogActor] Data: 2.0\n[LogActor] Data: 3.0\n[LogActor] Completed\n\n\nSee also: OperatorTrait, InferableOperator, operator_right, OperatorTrait, ProxyObservable, ActorProxy, logger\n\n\n\n\n\n","category":"type"},{"location":"api/operators/#Rocket.InvalidOperatorTrait","page":"Operators","title":"Rocket.InvalidOperatorTrait","text":"InvalidOperatorTrait trait specifies special 'invalid' behavior and types with such a trait specification cannot be used as an operator for an observable stream. By default any type has InvalidOperatorTrait trait specification\n\nSee also: OperatorTrait\n\n\n\n\n\n","category":"type"},{"location":"api/operators/#Types","page":"Operators","title":"Types","text":"","category":"section"},{"location":"api/operators/","page":"Operators","title":"Operators","text":"AbstractOperator\nTypedOperator\nLeftTypedOperator\nRightTypedOperator\nInferableOperator\non_call!\noperator_right\nOperatorsComposition","category":"page"},{"location":"api/operators/#Rocket.AbstractOperator","page":"Operators","title":"Rocket.AbstractOperator","text":"Supertype for all operators\n\nSee also: TypedOperator, LeftTypedOperator, RightTypedOperator, InferableOperator\n\n\n\n\n\n","category":"type"},{"location":"api/operators/#Rocket.TypedOperator","page":"Operators","title":"Rocket.TypedOperator","text":"Can be used as a supertype for any operator. Automatically specifies TypedOperatorTrait behavior.\n\nExamples\n\nusing Rocket\n\nstruct MyOperator <: TypedOperator{Float64,String} end\n\nas_operator(MyOperator) === TypedOperatorTrait{Float64,String}()\n\n# output\ntrue\n\nSee also: AbstractOperator, TypedOperatorTrait\n\n\n\n\n\n","category":"type"},{"location":"api/operators/#Rocket.LeftTypedOperator","page":"Operators","title":"Rocket.LeftTypedOperator","text":"Can be used as a supertype for any operator. Automatically specifies LeftTypedOperatorTrait behavior.\n\nExamples\n\nusing Rocket\n\nstruct MyOperator <: LeftTypedOperator{Float64} end\n\nas_operator(MyOperator) === LeftTypedOperatorTrait{Float64}()\n\n# output\ntrue\n\nSee also: AbstractOperator, LeftTypedOperatorTrait, operator_right\n\n\n\n\n\n","category":"type"},{"location":"api/operators/#Rocket.RightTypedOperator","page":"Operators","title":"Rocket.RightTypedOperator","text":"Can be used as a supertype for any operator. Automatically specifies RightTypedOperatorTrait behavior.\n\nExamples\n\nusing Rocket\n\nstruct MyOperator <: RightTypedOperator{Float64} end\n\nas_operator(MyOperator) === RightTypedOperatorTrait{Float64}()\n\n# output\ntrue\n\nSee also: AbstractOperator, RightTypedOperatorTrait\n\n\n\n\n\n","category":"type"},{"location":"api/operators/#Rocket.InferableOperator","page":"Operators","title":"Rocket.InferableOperator","text":"Can be used as a supertype for any operator. Automatically specifies InferableOperatorTrait behavior.\n\nExamples\n\nusing Rocket\n\nstruct MyOperator <: InferableOperator end\n\nas_operator(MyOperator) === InferableOperatorTrait()\n\n# output\ntrue\n\nSee also: AbstractOperator, InferableOperatorTrait, operator_right\n\n\n\n\n\n","category":"type"},{"location":"api/operators/#Rocket.on_call!","page":"Operators","title":"Rocket.on_call!","text":"on_call!(::Type, ::Type, operator, source)\n\nEach operator must implement its own method for on_call! function. This function is used to invoke operator on some Observable and to produce another Observable with new logic (operator specific).\n\nSee also: AbstractOperator\n\n\n\n\n\n","category":"function"},{"location":"api/operators/#Rocket.operator_right","page":"Operators","title":"Rocket.operator_right","text":"operator_right(operator, L)\n\nBoth LeftTypedOperator and InferableOperator must implement its own method for operator_right function. This function is used to infer type of data of output Observable given the type of data of input Observable.\n\nSee also: AbstractOperator, LeftTypedOperator, InferableOperator\n\n\n\n\n\n","category":"function"},{"location":"api/operators/#Rocket.OperatorsComposition","page":"Operators","title":"Rocket.OperatorsComposition","text":"OperatorsComposition(operators)\n\nOperatorsComposition is an object which helps to create a composition of multiple operators. To create a composition of two or more operators overloaded + or |> can be used.\n\nusing Rocket\n\ncomposition = map(Int, (d) -> d ^ 2) + filter(d -> d % 2 == 0)\n\nsource = from(1:5) |> composition\n\nsubscribe!(source, logger())\n;\n\n# output\n\n[LogActor] Data: 4\n[LogActor] Data: 16\n[LogActor] Completed\n\nusing Rocket\n\ncomposition = map(Int, (d) -> d ^ 2) |> filter(d -> d % 2 == 0)\n\nsource = from(1:5) |> composition\n\nsubscribe!(source, logger())\n;\n\n# output\n\n[LogActor] Data: 4\n[LogActor] Data: 16\n[LogActor] Completed\n\n\n\n\n\n","category":"type"},{"location":"api/operators/#Errors","page":"Operators","title":"Errors","text":"","category":"section"},{"location":"api/operators/","page":"Operators","title":"Operators","text":"InvalidOperatorTraitUsageError\nInconsistentSourceOperatorDataTypesError\nMissingOnCallImplementationError\nMissingOperatorRightImplementationError","category":"page"},{"location":"api/operators/#Rocket.InvalidOperatorTraitUsageError","page":"Operators","title":"Rocket.InvalidOperatorTraitUsageError","text":"This error will be thrown if |> pipe operator is called with invalid operator object\n\nSee also: on_call!\n\n\n\n\n\n","category":"type"},{"location":"api/operators/#Rocket.InconsistentSourceOperatorDataTypesError","page":"Operators","title":"Rocket.InconsistentSourceOperatorDataTypesError","text":"This error will be thrown if |> pipe operator is called with inconsistent data type\n\nSee also: on_call!\n\n\n\n\n\n","category":"type"},{"location":"api/operators/#Rocket.MissingOnCallImplementationError","page":"Operators","title":"Rocket.MissingOnCallImplementationError","text":"This error will be thrown if Julia cannot find specific method of on_call! function for a given operator.\n\nSee also: on_call!\n\n\n\n\n\n","category":"type"},{"location":"api/operators/#Rocket.MissingOperatorRightImplementationError","page":"Operators","title":"Rocket.MissingOperatorRightImplementationError","text":"This error will be thrown if Julia cannot find specific method of operator_right function for a given operator.\n\nSee also: operator_right\n\n\n\n\n\n","category":"type"},{"location":"observables/types/faulted/#observable_faulted","page":"Faulted","title":"Faulted Observable","text":"","category":"section"},{"location":"observables/types/faulted/","page":"Faulted","title":"Faulted","text":"faulted","category":"page"},{"location":"observables/types/faulted/#Rocket.faulted","page":"Faulted","title":"Rocket.faulted","text":"faulted(err; scheduler::H = AsapScheduler()) where { H <: AbstractScheduler }\nfaulted(::Type{T}, err; scheduler::H = AsapScheduler()) where { T, H <: AbstractScheduler }\n\nCreation operator for the FaultedObservable that emits no items to the Actor and immediately sends an error notification.\n\nArguments\n\nerr: the particular Error to pass to the error notification.\nT: type of output data source, optional, Any by default\nscheduler: optional, scheduler-like object\n\nExamples\n\nusing Rocket\n\nsource = faulted(\"Error!\")\nsubscribe!(source, logger())\n;\n\n# output\n\n[LogActor] Error: Error!\n\n\nSee also: FaultedObservable, subscribe!\n\n\n\n\n\n","category":"function"},{"location":"observables/types/faulted/","page":"Faulted","title":"Faulted","text":"FaultedObservable","category":"page"},{"location":"observables/types/faulted/#Rocket.FaultedObservable","page":"Faulted","title":"Rocket.FaultedObservable","text":"FaultedObservable{D, H}(err, scheduler::H)\n\nObservable that emits no items to the Actor and just sends an error notification on subscription.\n\nConstructor arguments\n\nerr: error to emit on subscription\nscheduler: scheduler-like object\n\nSee also: faulted\n\n\n\n\n\n","category":"type"},{"location":"operators/multicasting/multicast/#operator_multicast","page":"multicast","title":"Multicast Operator","text":"","category":"section"},{"location":"operators/multicasting/multicast/","page":"multicast","title":"multicast","text":"multicast","category":"page"},{"location":"operators/multicasting/multicast/#Rocket.multicast","page":"multicast","title":"Rocket.multicast","text":"multicast(subject::S) where S\nmulticast(factory::F) where { F <: AbstractSubjectFactory }\n\nThe multicast()operator takes a Subject and uses it to share the source execution. It returns what’s known as aConnectableObservable`, which has a connect() method. It has one simple job - subscribes to the source with the provided subject.\n\nExample\n\nusing Rocket\n\nsubject = Subject(Int)\nsource = from(1:5) |> multicast(subject)\n\nactor1 = logger(\"1\")\nactor2 = logger(\"2\")\n\nsubscription1 = subscribe!(source, actor1)\nsubscription2 = subscribe!(source, actor2)\n\nconnect(source)\n\nunsubscribe!(subscription1)\nunsubscribe!(subscription2)\n;\n\n# output\n\n[1] Data: 1\n[2] Data: 1\n[1] Data: 2\n[2] Data: 2\n[1] Data: 3\n[2] Data: 3\n[1] Data: 4\n[2] Data: 4\n[1] Data: 5\n[2] Data: 5\n[1] Completed\n[2] Completed\n\nSee also: ConnectableObservable, Subject, share, publish\n\n\n\n\n\n","category":"function"},{"location":"operators/multicasting/multicast/#See-also","page":"multicast","title":"See also","text":"","category":"section"},{"location":"operators/multicasting/multicast/","page":"multicast","title":"multicast","text":"Operators","category":"page"},{"location":"operators/transformation/map/#operator_map","page":"map","title":"Map Operator","text":"","category":"section"},{"location":"operators/transformation/map/","page":"map","title":"map","text":"map","category":"page"},{"location":"operators/transformation/map/#Base.map","page":"map","title":"Base.map","text":"map(::Type{R}, mappingFn::F) where { F <: Function }\n\nCreates a map operator, which applies a given mappingFn to each value emmited by the source Observable, and emits the resulting values as an Observable. You have to specify output R type after mappingFn projection.\n\nArguments\n\n::Type{R}: the type of data of transformed value, may be or may not be the same as source type\nmappingFn::Function: transformation function with (data::L) -> R signature, where L is type of data in input source\n\nProducing\n\nStream of type <: Subscribable{R}\n\nExamples\n\nusing Rocket\n\nsource = from([ 1, 2, 3 ])\nsubscribe!(source |> map(Int, (d) -> d ^ 2), logger())\n;\n\n# output\n\n[LogActor] Data: 1\n[LogActor] Data: 4\n[LogActor] Data: 9\n[LogActor] Completed\n\nSee also: AbstractOperator, RightTypedOperator, ProxyObservable, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/transformation/map/#Description","page":"map","title":"Description","text":"","category":"section"},{"location":"operators/transformation/map/","page":"map","title":"map","text":"The map operator, similar to map(f, array), applies a function to each value from the source. It's important to note that the function f is expected to be pure and without any side effects. The map operator is designed to create a copy of the original observable for each new subscriber. It independently executes the f function for each subscriber and doesn't share the resulting value. This might be inconvenient when f involves complex calculations or side effects.","category":"page"},{"location":"operators/transformation/map/","page":"map","title":"map","text":"using Rocket\n\nfunction f(x)\n println(\"Function `f` called\") # Assume heavy calculations or side-effects\n return x + 1\nend\n\nsubject = Subject(Int)\n\nmapped = subject |> map(Int, f)\n\nsubscription1 = subscribe!(mapped, logger())\nsubscription2 = subscribe!(mapped, logger())\n\nnext!(subject, 1)\n\nunsubscribe!(subscription1)\nunsubscribe!(subscription2)\nnothing #hide","category":"page"},{"location":"operators/transformation/map/","page":"map","title":"map","text":"In the example, you'll observe that \"Function f called\" is displayed twice. This happens because each subscriber receives their individual, distinct version of the modified data. To alter this behavior, one can utilize the share() operator. This operator creates only a single copy of the modified observable and shares the computed results.","category":"page"},{"location":"operators/transformation/map/","page":"map","title":"map","text":"mapped_and_shared = mapped |> share()\n\nsubscription1 = subscribe!(mapped_and_shared, logger())\nsubscription2 = subscribe!(mapped_and_shared, logger())\n\nnext!(subject, 1)\n\nunsubscribe!(subscription1)\nunsubscribe!(subscription2)\nnothing #hide","category":"page"},{"location":"operators/transformation/map/","page":"map","title":"map","text":"In this example, \"Function f called\" appears only once, and the computed value is shared between the two subscribers. Note, however, that this behaviour might be confusing in cases where the first subscribers completes the observable till its completion stage. For example:","category":"page"},{"location":"operators/transformation/map/","page":"map","title":"map","text":"mapped_and_shared = from([ 0, 1, 2 ]) |> map(Int, f) |> share()\n\nsubscription1 = subscribe!(mapped_and_shared, logger())\nsubscription2 = subscribe!(mapped_and_shared, logger())\n\nunsubscribe!(subscription1)\nunsubscribe!(subscription2)\nnothing #hide","category":"page"},{"location":"operators/transformation/map/","page":"map","title":"map","text":"In this scenario, the second subscriber doesn't receive any values because the first subscriber exhausts the single shared observable. Once the shared observable is used up, it doesn't produce any further values. This doesn't occur without the share() operator.","category":"page"},{"location":"operators/transformation/map/","page":"map","title":"map","text":"mapped = from([ 0, 1, 2 ]) |> map(Int, f)\n\nsubscription1 = subscribe!(mapped, logger())\nsubscription2 = subscribe!(mapped, logger())\n\nunsubscribe!(subscription1)\nunsubscribe!(subscription2)\nnothing #hide","category":"page"},{"location":"operators/transformation/map/#See-also","page":"map","title":"See also","text":"","category":"section"},{"location":"operators/transformation/map/","page":"map","title":"map","text":"Operators","category":"page"},{"location":"operators/utility/tap_on_complete/#operator_tap_on_complete","page":"tap_on_complete","title":"TapOnComplete Operator","text":"","category":"section"},{"location":"operators/utility/tap_on_complete/","page":"tap_on_complete","title":"tap_on_complete","text":"tap_on_complete","category":"page"},{"location":"operators/utility/tap_on_complete/#Rocket.tap_on_complete","page":"tap_on_complete","title":"Rocket.tap_on_complete","text":"tap_on_complete(tapFn::F) where { F <: Function }\n\nCreates a tap operator, which performs a side effect for only complete emission on the source Observable, but return an Observable that is identical to the source.\n\nArguments\n\ntapFn::Function: side-effect tap function with () -> Nothing signature\n\nProducing\n\nStream of type <: Subscribable{L} where L refers to type of source stream\n\nExamples\n\nusing Rocket\n\nsource = from([ 1, 2, 3 ])\nsubscribe!(source |> tap_on_complete(() -> println(\"Complete event received\")), logger())\n;\n\n# output\n\n[LogActor] Data: 1\n[LogActor] Data: 2\n[LogActor] Data: 3\n[LogActor] Completed\nComplete event received\n\n\nSee also: tap_on_subscribe, tap, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/utility/tap_on_complete/#Description","page":"tap_on_complete","title":"Description","text":"","category":"section"},{"location":"operators/utility/tap_on_complete/","page":"tap_on_complete","title":"tap_on_complete","text":"Returns an Observable that resembles the source Observable, but modifies it so that the provided Observer is called to perform a side effect on complete event emission by the source.","category":"page"},{"location":"operators/utility/tap_on_complete/","page":"tap_on_complete","title":"tap_on_complete","text":"This operator is useful for debugging your Observables, verifying correctness, or performing other side effects.","category":"page"},{"location":"operators/utility/tap_on_complete/","page":"tap_on_complete","title":"tap_on_complete","text":"Note: this operator differs from a subscribe on the Observable. If the Observable returned by tap_on_complete is not subscribed, the side effects specified by the Observer will never happen. tap_on_complete therefore simply spies on future execution, it does not trigger an execution to happen like subscribe does.","category":"page"},{"location":"operators/utility/tap_on_complete/#See-also","page":"tap_on_complete","title":"See also","text":"","category":"section"},{"location":"operators/utility/tap_on_complete/","page":"tap_on_complete","title":"tap_on_complete","text":"Operators","category":"page"},{"location":"observables/types/combined_updates/#observable_combined_updates","page":"Combined Updates","title":"CombinedUpdates Observable","text":"","category":"section"},{"location":"observables/types/combined_updates/","page":"Combined Updates","title":"Combined Updates","text":"combineLatestUpdates","category":"page"},{"location":"observables/types/combined_updates/#Rocket.combineLatestUpdates","page":"Combined Updates","title":"Rocket.combineLatestUpdates","text":"combineLatestUpdates(sources...; strategy = PushEach())\ncombineLatestUpdates(sources::S, strategy::G = PushEach()) where { S <: Tuple, U }\n\ncombineLatestUpdates is a more effiecient version of combineLatest(sources) + map_to(sources) operators chain.\n\nArguments\n\nsources: input sources\nstrategy: optional update strategy for batching new values together\n\nNote: combineLatestUpdates() completes immediately if sources are empty.\n\nSee also: Subscribable, subscribe!, PushEach, PushEachBut, PushNew, PushNewBut, PushStrategy\n\n\n\n\n\n","category":"function"},{"location":"observables/types/combined/#observable_combined","page":"Combined","title":"Combined Observable","text":"","category":"section"},{"location":"observables/types/combined/","page":"Combined","title":"Combined","text":"combineLatest\nPushEach\nPushEachBut\nPushNew\nPushNewBut\nPushStrategy","category":"page"},{"location":"observables/types/combined/#Rocket.combineLatest","page":"Combined","title":"Rocket.combineLatest","text":"combineLatest(sources...; strategy = PushEach())\ncombineLatest(sources::S, strategy::G = PushEach()) where { S <: Tuple, U }\n\nCombines multiple Observables to create an Observable whose values are calculated from the latest values of each of its input Observables. Accept optimal update strategy object.\n\nArguments\n\nsources: input sources\nstrategy: optional update strategy for batching new values together\n\nNote: combineLatest() completes immediately if sources are empty.\n\nExamples\n\nusing Rocket\n\nlatest = combineLatest(of(1), from(2:5))\n\nsubscribe!(latest, logger())\n;\n\n# output\n\n[LogActor] Data: (1, 2)\n[LogActor] Data: (1, 3)\n[LogActor] Data: (1, 4)\n[LogActor] Data: (1, 5)\n[LogActor] Completed\n\nusing Rocket\n\nlatest = combineLatest(of(1) |> async(0), from(2:5) |> async(0), strategy = PushNew())\n\nsubscribe!(latest, logger())\n;\n\n# output\n\n[LogActor] Data: (1, 2)\n[LogActor] Completed\n\nSee also: Subscribable, subscribe!, PushEach, PushEachBut, PushNew, PushNewBut, PushStrategy\n\n\n\n\n\n","category":"function"},{"location":"observables/types/combined/#Rocket.PushEach","page":"Combined","title":"Rocket.PushEach","text":"PushEach\n\nPushEach update strategy specifies the strategy to emit new value each time an inner observable emit a new value\n\nSee also: combineLatest, PushEachBut, PushNew, PushNewBut, PushStrategy\n\n\n\n\n\n","category":"type"},{"location":"observables/types/combined/#Rocket.PushEachBut","page":"Combined","title":"Rocket.PushEachBut","text":"PushEachBut{I}\n\nPushEachBut update strategy specifies the strategy to emit new value if and only if an inner observable with index I have a new value\n\nSee also: combineLatest, PushEach, PushNew, PushNewBut, PushStrategy\n\n\n\n\n\n","category":"type"},{"location":"observables/types/combined/#Rocket.PushNew","page":"Combined","title":"Rocket.PushNew","text":"PushNew\n\nPushNew update strategy specifies the strategy to emit new value if and only if all inner observables have a new value\n\nSee also: combineLatest, PushEach, PushEachBut, PushNewBut, PushStrategy\n\n\n\n\n\n","category":"type"},{"location":"observables/types/combined/#Rocket.PushNewBut","page":"Combined","title":"Rocket.PushNewBut","text":"PushNewBut{I}\n\nPushNewBut{I} update strategy specifies the strategy to emit new value if and only if all inner observables except with index I have a new value\n\nSee also: combineLatest, PushEach, PushEachBut, PushNew, PushStrategy\n\n\n\n\n\n","category":"type"},{"location":"observables/types/combined/#Rocket.PushStrategy","page":"Combined","title":"Rocket.PushStrategy","text":"PushStrategy(strategy::BitArray{1})\n\nPushStrategy update strategy specifies the strategy to emit new value if and only if all inner observables with index such that strategy[index] = false have a new value\n\nSee also: combineLatest, PushEach, PushEachBut, PushNew, PushNewBut, collectLatest\n\n\n\n\n\n","category":"type"},{"location":"observables/types/combined/#Description","page":"Combined","title":"Description","text":"","category":"section"},{"location":"observables/types/combined/","page":"Combined","title":"Combined","text":"combineLatest combines the values from all Observables in its arguments. This is done by subscribing to each Observable in order and, whenever an Observable emits, collecting a tuple of the most recent values from each Observable (in order). If you pass n Observables to combineLatest, the returned Observable will always emit an ordered tuple of n values.","category":"page"},{"location":"observables/types/combined/","page":"Combined","title":"Combined","text":"To ensure that the output tuple has a consistent length, combineLatest waits for all input Observables to emit at least once before it starts emitting results. This means that if some Observable emits values before other Observables started emitting, all these values but the last will be lost. On the other hand, if some Observable does not emit a value but completes, the resulting Observable will complete simultaneously without emitting anything. Furthermore, if some input Observable does not emit any value and never completes, combineLatest will also never emit and never complete.","category":"page"},{"location":"observables/types/combined/","page":"Combined","title":"Combined","text":"If at least one Observable was passed to combineLatest and all passed Observables emitted, then the resulting Observable will complete when all combined streams complete. So even if some Observable completes, the result of combineLatest will still emit values when the other Observables do. In case of a completed Observable, its value will now remain to be the last emitted value. On the other hand, if any Observable errors, combineLatest will also immediately error.","category":"page"},{"location":"observables/types/combined/","page":"Combined","title":"Combined","text":"It is possible to change default update/complete strategy behaviour with an optional strategy object.","category":"page"},{"location":"operators/filtering/about/#Filtering-category","page":"About filtering operators","title":"Filtering category","text":"","category":"section"},{"location":"operators/filtering/about/","page":"About filtering operators","title":"About filtering operators","text":"There are operators for different purposes, and they may be categorized as: creation, transformation, filtering, joining, multicasting, error handling, utility, etc. In the following list you will find all the operators organized in filtering category.","category":"page"},{"location":"operators/filtering/about/","page":"About filtering operators","title":"About filtering operators","text":"filter\nfilter_type\ntake\ntake_until\nfirst\nlast\nfind\nfind_index\nignore","category":"page"},{"location":"operators/filtering/about/#See-also","page":"About filtering operators","title":"See also","text":"","category":"section"},{"location":"operators/filtering/about/","page":"About filtering operators","title":"About filtering operators","text":"Operators","category":"page"},{"location":"observables/types/connectable/#observable_connectable","page":"Connectable","title":"Connectable Observable","text":"","category":"section"},{"location":"observables/types/connectable/","page":"Connectable","title":"Connectable","text":"connectable","category":"page"},{"location":"observables/types/connectable/#Rocket.connectable","page":"Connectable","title":"Rocket.connectable","text":"connectable(subject::J, source::S) where J where S\n\nCreates a ConnectableObservable with a given subject object and a source observable.\n\nExample\n\nusing Rocket\n\nc = connectable(Subject(Int; scheduler = AsapScheduler()), from(1:3))\n\nsubscribe!(c, logger());\n\nconnect(c);\n;\n\n# output\n\n[LogActor] Data: 1\n[LogActor] Data: 2\n[LogActor] Data: 3\n[LogActor] Completed\n\n\nSee also: ConnectableObservable, connect, subscribe!\n\n\n\n\n\n","category":"function"},{"location":"observables/types/connectable/","page":"Connectable","title":"Connectable","text":"connect","category":"page"},{"location":"observables/types/connectable/#Rocket.connect","page":"Connectable","title":"Rocket.connect","text":"connect(connectable::ConnectableObservable)\n\nWhen connect is called, the subject passed to the multicast operator is subscribed to the source and the subject’s observers receive the multicast notifications, which fits our basic mental model of stream multicasting. Returns a subscription.\n\nSee also: connectable, ConnectableObservable\n\n\n\n\n\n","category":"function"},{"location":"observables/types/connectable/","page":"Connectable","title":"Connectable","text":"ConnectableObservable","category":"page"},{"location":"observables/types/connectable/#Rocket.ConnectableObservable","page":"Connectable","title":"Rocket.ConnectableObservable","text":"ConnectableObservable{D}(subject, source)\n\nA connectable observable encapsulates the multicasting infrastructure with provided subject, but does not immediately subscribe to the source. It subscribes to the source when its connect method is called.\n\nSee also: connect, Subscribable\n\n\n\n\n\n","category":"type"},{"location":"operators/utility/tap_on_unsubscribe/#operator_tap_on_unsubscribe","page":"tap_on_unsubscribe","title":"TapOnUnsubscribe Operator","text":"","category":"section"},{"location":"operators/utility/tap_on_unsubscribe/","page":"tap_on_unsubscribe","title":"tap_on_unsubscribe","text":"TapBeforeUnsubscription\nTapAfterUnsubscription\ntap_on_unsubscribe","category":"page"},{"location":"operators/utility/tap_on_unsubscribe/#Rocket.TapBeforeUnsubscription","page":"tap_on_unsubscribe","title":"Rocket.TapBeforeUnsubscription","text":"TapBeforeUnsubscription\n\nOne of the strategies for tap_on_unsubscribe operator. With TapBeforeUnubscription tap callback will be called before actual unsubscription.\n\nSee also: tap_on_unsubscribe, TapAfterUnsubscription\n\n\n\n\n\n","category":"type"},{"location":"operators/utility/tap_on_unsubscribe/#Rocket.TapAfterUnsubscription","page":"tap_on_unsubscribe","title":"Rocket.TapAfterUnsubscription","text":"TapAfterUnsubscription\n\nOne of the strategies for tap_on_unsubscribe operator. With TapBeforeUnsubscription tap callback will be called after actual unsubscription.\n\nSee also: tap_on_unsubscribe, TapBeforeUnsubscription\n\n\n\n\n\n","category":"type"},{"location":"operators/utility/tap_on_unsubscribe/#Rocket.tap_on_unsubscribe","page":"tap_on_unsubscribe","title":"Rocket.tap_on_unsubscribe","text":"tap_on_unsubscribe(tapFn::F, strategy::S = TapBeforeUnsubscription()) where { F <: Function }\n\nCreates a tap operator, which performs a side effect on the unsubscription on the source Observable, but return an Observable that is identical to the source. Tap callback triggers only once.\n\nArguments\n\ntapFn::Function: side-effect tap function with () -> Nothing signature\nstrategy: (optional), specifies the order of a side-effect and an actual unsubscription, uses TapBeforeUnsubscription by default\n\nProducing\n\nStream of type <: Subscribable{L} where L refers to type of source stream\n\nExamples\n\nusing Rocket\n\nsource = from([ 1, 2, 3 ])\nsubscription = subscribe!(source |> tap_on_unsubscribe(() -> println(\"Someone unsubscribed\")), logger())\nunsubscribe!(subscription)\n;\n\n# output\n\n[LogActor] Data: 1\n[LogActor] Data: 2\n[LogActor] Data: 3\n[LogActor] Completed\nSomeone unsubscribed\n\nSee also: TapBeforeUnsubscription, TapAfterUnsubscription, tap, tap_on_subscribe, tap_on_complete, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/utility/tap_on_unsubscribe/#Description","page":"tap_on_unsubscribe","title":"Description","text":"","category":"section"},{"location":"operators/utility/tap_on_unsubscribe/","page":"tap_on_unsubscribe","title":"tap_on_unsubscribe","text":"Returns an Observable that resembles the source Observable, but modifies it so that the provided Observer is called to perform a side effect on unsubscription from the source.","category":"page"},{"location":"operators/utility/tap_on_unsubscribe/","page":"tap_on_unsubscribe","title":"tap_on_unsubscribe","text":"This operator is useful for debugging your Observables, verifying correctness, or performing other side effects.","category":"page"},{"location":"operators/utility/tap_on_unsubscribe/#See-also","page":"tap_on_unsubscribe","title":"See also","text":"","category":"section"},{"location":"operators/utility/tap_on_unsubscribe/","page":"tap_on_unsubscribe","title":"tap_on_unsubscribe","text":"Operators","category":"page"},{"location":"operators/errors/about/#Error-handling-category","page":"About error handling operators","title":"Error handling category","text":"","category":"section"},{"location":"operators/errors/about/","page":"About error handling operators","title":"About error handling operators","text":"There are operators for different purposes, and they may be categorized as: creation, transformation, filtering, joining, multicasting, error handling, utility, etc. In the following list you will find all the operators organized in error handling category.","category":"page"},{"location":"operators/errors/about/","page":"About error handling operators","title":"About error handling operators","text":"catch_error\nrerun\nerror_if\nerror_if_not","category":"page"},{"location":"operators/errors/about/#See-also","page":"About error handling operators","title":"See also","text":"","category":"section"},{"location":"operators/errors/about/","page":"About error handling operators","title":"About error handling operators","text":"Operators","category":"page"},{"location":"operators/utility/delay/#operator_delay","page":"delay","title":"Delay Operator","text":"","category":"section"},{"location":"operators/utility/delay/","page":"delay","title":"delay","text":"delay","category":"page"},{"location":"operators/utility/delay/#Rocket.delay","page":"delay","title":"Rocket.delay","text":"delay(delay::Int)\n\nCreates a delay operator, which delays the emission of items from the source Observable by a given timeout.\n\nArguments:\n\ndelay::Int: the delay duration in milliseconds (a number) until which the emission of the source items is delayed.\n\nProducing\n\nStream of type <: Subscribable{L} where L refers to type of source stream\n\nSee also: AbstractOperator, InferableOperator, ProxyObservable\n\n\n\n\n\n","category":"function"},{"location":"operators/utility/delay/#Description","page":"delay","title":"Description","text":"","category":"section"},{"location":"operators/utility/delay/","page":"delay","title":"delay","text":"Delays the emission of items from the source Observable by a given timeout","category":"page"},{"location":"operators/utility/delay/#Example","page":"delay","title":"Example","text":"","category":"section"},{"location":"operators/utility/delay/","page":"delay","title":"delay","text":"Delay every value with 1 second to the output","category":"page"},{"location":"operators/utility/delay/","page":"delay","title":"delay","text":"using Rocket\nusing Dates\n\nsource = from([ 1, 2, 3 ])\nprintln(Dates.format(now(), \"MM:SS\"))\nsubscription = subscribe!(source |> delay(2000), lambda(\n on_next = (d) -> println(\"$(Dates.format(now(), \"MM:SS\")): $d\")\n));\n\n# output\n\n03:41\n03:43: 1\n03:43: 2\n03:43: 3\n","category":"page"},{"location":"operators/utility/delay/#See-also","page":"delay","title":"See also","text":"","category":"section"},{"location":"operators/utility/delay/","page":"delay","title":"delay","text":"Operators","category":"page"},{"location":"operators/filtering/take/#operator_take","page":"take","title":"Take Operator","text":"","category":"section"},{"location":"operators/filtering/take/","page":"take","title":"take","text":"take","category":"page"},{"location":"operators/filtering/take/#Rocket.take","page":"take","title":"Rocket.take","text":"take(maxcount::Int)\n\nCreates a take operator, which returns an Observable that emits only the first maxcount values emitted by the source Observable.\n\nArguments\n\nmaxcount::Int: the maximum number of next values to emit.\n\nProducing\n\nStream of type <: Subscribable{L} where L refers to type of source stream\n\nExamples\n\nusing Rocket\n\nsource = from([ i for i in 1:100 ])\n\nsubscribe!(source |> take(5), logger())\n;\n\n# output\n\n[LogActor] Data: 1\n[LogActor] Data: 2\n[LogActor] Data: 3\n[LogActor] Data: 4\n[LogActor] Data: 5\n[LogActor] Completed\n\nSee also: AbstractOperator, InferableOperator, ProxyObservable, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/filtering/take/#Description","page":"take","title":"Description","text":"","category":"section"},{"location":"operators/filtering/take/","page":"take","title":"take","text":"take returns an Observable that emits only the first count values emitted by the source Observable. If the source emits fewer than count values, then all of its values are emitted. Afterwards, the Observable completes regardless of whether the source completed.","category":"page"},{"location":"operators/filtering/take/#See-also","page":"take","title":"See also","text":"","category":"section"},{"location":"operators/filtering/take/","page":"take","title":"take","text":"Operators","category":"page"},{"location":"operators/transformation/scan/#operator_scan","page":"scan","title":"Scan Operator","text":"","category":"section"},{"location":"operators/transformation/scan/","page":"scan","title":"scan","text":"scan","category":"page"},{"location":"operators/transformation/scan/#Rocket.scan","page":"scan","title":"Rocket.scan","text":"scan(::Type{R}, scanFn::F, seed::R) where { R, F <: Function }\nscan(scanFn::F) where { F <: Function }\n\nCreates a scan operator, which applies a given accumulator scanFn function to each value emmited by the source Observable, and returns each intermediate result with an optional seed value. If a seed value is specified, then that value will be used as the initial value for the accumulator. If no seed value is specified, the first item of the source is used as the seed.\n\nArguments\n\n::Type{R}: the type of data of transformed value, may be or may not be the same as type of input source\nscanFn::Function: accumulator function with (data::T, current::R) -> R signature\nseed::R: optional initial value for accumulator function\n\nProducing\n\nStream of type <: Subscribable{R}\n\nExamples\n\nusing Rocket\n\nsource = from([ 1, 2, 3 ])\nsubscribe!(source |> scan(+), logger())\n;\n\n# output\n\n[LogActor] Data: 1\n[LogActor] Data: 3\n[LogActor] Data: 6\n[LogActor] Completed\n\n\nusing Rocket\n\nsource = from([ 1, 2, 3 ])\nsubscribe!(source |> scan(Vector{Int}, (d, c) -> [ c..., d ], Int[]), logger())\n;\n\n# output\n\n[LogActor] Data: [1]\n[LogActor] Data: [1, 2]\n[LogActor] Data: [1, 2, 3]\n[LogActor] Completed\n\n\nSee also: AbstractOperator, RightTypedOperator, ProxyObservable, reduce, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/transformation/scan/#Description","page":"scan","title":"Description","text":"","category":"section"},{"location":"operators/transformation/scan/","page":"scan","title":"scan","text":"Combines all values emitted by the source, using an accumulator function that joins a new source value with the past accumulation. This is similar to reduce, but emits the intermediate accumulations.","category":"page"},{"location":"operators/transformation/scan/","page":"scan","title":"scan","text":"Returns an Observable that applies a specified accumulator function to each item emitted by the source Observable. If a seed value is specified, then that value will be used as the initial value for the accumulator. If no seed value is specified, the first item of the source is used as the seed.","category":"page"},{"location":"operators/transformation/scan/#See-also","page":"scan","title":"See also","text":"","category":"section"},{"location":"operators/transformation/scan/","page":"scan","title":"scan","text":"Operators","category":"page"},{"location":"actors/types/buffer/#actor_buffer","page":"Buffer","title":"Buffer actor","text":"","category":"section"},{"location":"actors/types/buffer/","page":"Buffer","title":"Buffer","text":"buffer","category":"page"},{"location":"actors/types/buffer/#Rocket.buffer","page":"Buffer","title":"Rocket.buffer","text":"buffer(::Type{T}, size::Int) where T\n\nArguments\n\n::Type{T}: Type of data in buffer\nsize::Int: size of buffer\n\nCreation operator for the BufferActor actor.\n\nExamples\n\nusing Rocket\n\nactor = buffer(Int, 3)\nactor isa BufferActor{Int}\n\n# output\ntrue\n\nSee also: BufferActor, AbstractActor\n\n\n\n\n\n","category":"function"},{"location":"actors/types/buffer/","page":"Buffer","title":"Buffer","text":"BufferActor","category":"page"},{"location":"actors/types/buffer/#Rocket.BufferActor","page":"Buffer","title":"Rocket.BufferActor","text":"BufferActor{D}() where D\n\nBuffer actor provides a storage actor. It copies last incoming successful next events in a values array, throws an ErrorException on error! event and does nothing on completion event. Note: Actor does not check the size of incoming data.\n\nExamples\n\nusing Rocket\n\nsource = of([ 1, 2, 3 ])\nactor = buffer(Int, 3)\n\nsubscribe!(source, actor)\nshow(getvalues(actor))\n\n# output\n[1, 2, 3]\n\nSee also: Actor, buffer\n\n\n\n\n\n","category":"type"},{"location":"operators/creation/about/#Creation-category","page":"Creation","title":"Creation category","text":"","category":"section"},{"location":"operators/creation/about/","page":"Creation","title":"Creation","text":"There are operators for different purposes, and they may be categorized as: creation, transformation, filtering, joining, multicasting, error handling, utility, etc. In the following list you will find all the operators organized in creation category.","category":"page"},{"location":"operators/creation/about/","page":"Creation","title":"Creation","text":"make\nof\nfrom\niterable\nfaulted\nnever\ncompleted\ntimer\ninterval\nproxy\nfile\ncombined\nrace\nconnectable\nmerged\nconcat\ngenerate\nnetwork\ndefer\nzipped","category":"page"},{"location":"operators/creation/about/#See-also","page":"Creation","title":"See also","text":"","category":"section"},{"location":"operators/creation/about/","page":"Creation","title":"Creation","text":"Operators","category":"page"},{"location":"subjects/types/recent/#subject_recent","page":"Recent","title":"RecentSubject","text":"","category":"section"},{"location":"subjects/types/recent/","page":"Recent","title":"Recent","text":"RecentSubject\nRecentSubjectFactory","category":"page"},{"location":"subjects/types/recent/#Rocket.RecentSubject","page":"Recent","title":"Rocket.RecentSubject","text":"RecentSubject(::Type{D}) where D\nRecentSubject(::Type{D}, factory::F) where { D, F <: AbstractSubjectFactory }\nRecentSubject(::Type{D}, subject::S) where { D, S }\n\nA variant of Subject that emits its recent value whenever it is subscribed to.\n\nSee also: RecentSubjectFactory, Subject, SubjectFactory\n\n\n\n\n\n","category":"function"},{"location":"subjects/types/recent/#Rocket.RecentSubjectFactory","page":"Recent","title":"Rocket.RecentSubjectFactory","text":"RecentSubjectFactory(factory::F) where { F <: AbstractSubjectFactory }\nRecentSubjectFactory(; scheduler::H = AsapScheduler()) where { H <: AbstractScheduler }\n\nA variant of SubjectFactory that creates an instance of RecentSubject.\n\nSee also: SubjectFactory, AbstractSubjectFactory, RecentSubject, Subject\n\n\n\n\n\n","category":"function"},{"location":"subjects/types/recent/#Description","page":"Recent","title":"Description","text":"","category":"section"},{"location":"subjects/types/recent/","page":"Recent","title":"Recent","text":"One of the variants of Subjects is the RecentSubject, which has a notion of \"the recent value\". It stores the latest value emitted to its consumers, and whenever a new Observer subscribes, it will immediately receive the \"recent value\" from the RecentSubject.","category":"page"},{"location":"subjects/types/recent/","page":"Recent","title":"Recent","text":"note: Note\nRecentSubjects is a more efficient version of ReplaySubjects with replay size equal to one.","category":"page"},{"location":"subjects/types/recent/#Examples","page":"Recent","title":"Examples","text":"","category":"section"},{"location":"subjects/types/recent/","page":"Recent","title":"Recent","text":"In the following example, after RecentSubject is initialized the first Observer receives nothing when it subscribes. The second Observer receives the value 2 even though it subscribed after the value 2 was sent.","category":"page"},{"location":"subjects/types/recent/","page":"Recent","title":"Recent","text":"using Rocket\n\nsubject = RecentSubject(Int)\n\nsubscription1 = subscribe!(subject, logger(\"1\"))\n\nnext!(subject, 1)\nnext!(subject, 2)\n\nsubscription2 = subscribe!(subject, logger(\"2\"))\n\nnext!(subject, 3)\n\nunsubscribe!(subscription1)\nunsubscribe!(subscription2)\n\n// Logs\n// [1] Data: 1\n// [1] Data: 2\n// [2] Data: 2\n// [1] Data: 3\n// [2] Data: 3","category":"page"},{"location":"operators/utility/noop/#operator_noop","page":"noop","title":"Noop Operator","text":"","category":"section"},{"location":"operators/utility/noop/","page":"noop","title":"noop","text":"noop","category":"page"},{"location":"operators/utility/noop/#Rocket.noop","page":"noop","title":"Rocket.noop","text":"noop()\n\nCreates a noop operator, which does nothing, but breaks operator composition type inference checking procedure for Julia's compiler. It might be useful for very long chain of operators, because Julia tries to statically infer data types at compile-time for the whole chain and can run into StackOverflow issues.\n\nusing Rocket\n\n# foo() block to enforce local scope for scope variable\nfunction foo()\n source = from(1:5)\n\n for i in 1:1000\n source = source |> map(Int, d -> d + 1) |> noop()\n end\n\n subscribe!(source, logger())\nend\n\nfoo()\n;\n\n# output\n\n[LogActor] Data: 1001\n[LogActor] Data: 1002\n[LogActor] Data: 1003\n[LogActor] Data: 1004\n[LogActor] Data: 1005\n[LogActor] Completed\n\nSee also: AbstractOperator, InferableOperator, logger, map\n\n\n\n\n\n","category":"function"},{"location":"operators/utility/noop/#See-also","page":"noop","title":"See also","text":"","category":"section"},{"location":"operators/utility/noop/","page":"noop","title":"noop","text":"Operators","category":"page"},{"location":"getting-started/#Getting-started","page":"Getting started","title":"Getting started","text":"","category":"section"},{"location":"getting-started/","page":"Getting started","title":"Getting started","text":"Rocket.jl is a Julia package for reactive programming that makes it easier to work with asynchronous data. It is inspired by the RxJS and ReactiveX communities.","category":"page"},{"location":"getting-started/","page":"Getting started","title":"Getting started","text":"In order to combine good performance with a convenient API, Rocket.jl employs Observer patterns, Actor models and Functional programming.","category":"page"},{"location":"getting-started/#Installation","page":"Getting started","title":"Installation","text":"","category":"section"},{"location":"getting-started/","page":"Getting started","title":"Getting started","text":"Install Rocket.jl through the Julia package manager:","category":"page"},{"location":"getting-started/","page":"Getting started","title":"Getting started","text":"] add Rocket","category":"page"},{"location":"getting-started/#Concepts","page":"Getting started","title":"Concepts","text":"","category":"section"},{"location":"getting-started/","page":"Getting started","title":"Getting started","text":"Rocket.jl has been designed with a focus on performance and modularity.","category":"page"},{"location":"getting-started/","page":"Getting started","title":"Getting started","text":"The essential concepts in Rocket.jl are:","category":"page"},{"location":"getting-started/","page":"Getting started","title":"Getting started","text":"Observable: represents a collection of future messages (data or/and events).\nActor: is an object that knows how to react on incoming messages delivered by the Observable.\nSubscription: represents a teardown logic that is useful for cancelling the execution of an Observable.\nOperator: an object that deals with collection operations, such as map, filter, reduce, etc.\nSubject: the way of multicasting a message to multiple Observers.","category":"page"},{"location":"getting-started/#First-example","page":"Getting started","title":"First example","text":"","category":"section"},{"location":"getting-started/","page":"Getting started","title":"Getting started","text":"Conventionally, arrays are used for processing data.","category":"page"},{"location":"getting-started/","page":"Getting started","title":"Getting started","text":"for value in array_of_values\n doSomethingWithMyData(value)\nend","category":"page"},{"location":"getting-started/","page":"Getting started","title":"Getting started","text":"In contrast, Rocket.jl uses observables.","category":"page"},{"location":"getting-started/","page":"Getting started","title":"Getting started","text":"subscription = subscribe!(source_of_values, lambda(\n on_next = (data) -> doSomethingWithMyData(data),\n on_error = (error) -> doSomethingWithAnError(error),\n on_complete = () -> println(\"Completed!\")\n))","category":"page"},{"location":"getting-started/","page":"Getting started","title":"Getting started","text":"At some point in time you may decide to stop listening for new messages.","category":"page"},{"location":"getting-started/","page":"Getting started","title":"Getting started","text":"unsubscribe!(subscription)","category":"page"},{"location":"getting-started/#Actors","page":"Getting started","title":"Actors","text":"","category":"section"},{"location":"getting-started/","page":"Getting started","title":"Getting started","text":"In order to process messages from an observable you will need to define an Actor that knows how to react to incoming messages.","category":"page"},{"location":"getting-started/","page":"Getting started","title":"Getting started","text":"struct MyActor <: Rocket.Actor{Int} end\n\nRocket.on_next!(actor::MyActor, data::Int) = doSomethingWithMyData(data)\nRocket.on_error!(actor::MyActor, error) = doSomethingWithAnError(error)\nRocket.on_complete!(actor::MyActor) = println(\"Completed!\")","category":"page"},{"location":"getting-started/","page":"Getting started","title":"Getting started","text":"An actor can also have its own local state.","category":"page"},{"location":"getting-started/","page":"Getting started","title":"Getting started","text":"struct StoreActor{D} <: Rocket.Actor{D}\n values :: Vector{D}\n\n StoreActor{D}() where D = new(Vector{D}())\nend\n\nRocket.on_next!(actor::StoreActor{D}, data::D) where D = push!(actor.values, data)\nRocket.on_error!(actor::StoreActor, error) = doSomethingWithAnError(error)\nRocket.on_complete!(actor::StoreActor) = println(\"Completed: $(actor.values)\")","category":"page"},{"location":"getting-started/","page":"Getting started","title":"Getting started","text":"For debugging purposes you can use a general LambdaActor actor or just pass a function object as an actor in subscribe! function..","category":"page"},{"location":"getting-started/#Operators","page":"Getting started","title":"Operators","text":"","category":"section"},{"location":"getting-started/","page":"Getting started","title":"Getting started","text":"What makes Rocket.jl powerful is its ability to help you process, transform and modify the messages that flow through your observables, using Operators.","category":"page"},{"location":"getting-started/","page":"Getting started","title":"Getting started","text":"subscribe!(squared_int_values |> map(Int, (d) -> d ^ 2), lambda(\n on_next = (data) -> println(data)\n))","category":"page"},{"location":"operators/transformation/pairwise/#operator_pairwise","page":"pairwise","title":"Pairwise Operator","text":"","category":"section"},{"location":"operators/transformation/pairwise/","page":"pairwise","title":"pairwise","text":"pairwise","category":"page"},{"location":"operators/transformation/pairwise/#Rocket.pairwise","page":"pairwise","title":"Rocket.pairwise","text":"pairwise([ initial ])\n\nCreates a pairwise operator, which groups pairs of consecutive emissions together and emits them as a tuple of two values. Accepts optional initial seed value to start pairing from.\n\nusing Rocket\n\nsource = from(1:5) |> pairwise()\n\nsubscribe!(source, logger())\n;\n\n# output\n\n[LogActor] Data: (1, 2)\n[LogActor] Data: (2, 3)\n[LogActor] Data: (3, 4)\n[LogActor] Data: (4, 5)\n[LogActor] Completed\n\nusing Rocket\n\nsource = from(1:5) |> pairwise(0)\n\nsubscribe!(source, logger())\n;\n\n# output\n\n[LogActor] Data: (0, 1)\n[LogActor] Data: (1, 2)\n[LogActor] Data: (2, 3)\n[LogActor] Data: (3, 4)\n[LogActor] Data: (4, 5)\n[LogActor] Completed\n\nSee also: AbstractOperator, InferableOperator, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/transformation/pairwise/#See-also","page":"pairwise","title":"See also","text":"","category":"section"},{"location":"operators/transformation/pairwise/","page":"pairwise","title":"pairwise","text":"Operators","category":"page"},{"location":"operators/filtering/first/#operator_first","page":"first","title":"First operator","text":"","category":"section"},{"location":"operators/filtering/first/","page":"first","title":"first","text":"first","category":"page"},{"location":"operators/filtering/first/#Base.first","page":"first","title":"Base.first","text":"first(; default = nothing)\n\nCreates a first operator, which returns an Observable that emits only the first value emitted by the source Observable. Sends FirstNotFoundException error message if a given source completes without emitting a single value.\n\nArguments\n\ndefault: an optional default value to provide if no values were emitted\n\nProducing\n\nStream of type <: Subscribable{L} where L refers to type of source stream\n\nExamples\n\nusing Rocket\n\nsource = from(1:100)\nsubscription = subscribe!(source |> first(), logger())\n;\n\n# output\n\n[LogActor] Data: 1\n[LogActor] Completed\n\nSee also: take, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/filtering/first/#Description","page":"first","title":"Description","text":"","category":"section"},{"location":"operators/filtering/first/","page":"first","title":"first","text":"An alias for take(1) operator.","category":"page"},{"location":"operators/filtering/first/#See-also","page":"first","title":"See also","text":"","category":"section"},{"location":"operators/filtering/first/","page":"first","title":"first","text":"Operators, take","category":"page"},{"location":"actors/types/function/#actor_function","page":"Function","title":"Function actor","text":"","category":"section"},{"location":"actors/types/function/","page":"Function","title":"Function","text":"FunctionActor","category":"page"},{"location":"actors/types/function/#Rocket.FunctionActor","page":"Function","title":"Rocket.FunctionActor","text":"FunctionActor{D} <: Actor{D}\n\nFunctionActor provides a simple interface to use a single function as a next! callback, error! callback throws an ErrorException and complete! callback does nothing. Should not be used explicitly because it will be created automatically when passing a Function object as an actor in subscribe! function.\n\nExamples\n\nusing Rocket\n\nsource = from(1:5)\nsubscribe!(source, (t) -> println(t))\n;\n\n# output\n1\n2\n3\n4\n5\n\nSee also: Actor, subscribe!\n\n\n\n\n\n","category":"type"},{"location":"operators/mathematical/min/#operator_min","page":"min","title":"Min Operator","text":"","category":"section"},{"location":"operators/mathematical/min/","page":"min","title":"min","text":"min","category":"page"},{"location":"operators/mathematical/min/#Base.min","page":"min","title":"Base.min","text":"min(; from = nothing)\n\nCreates a min operator, which emits a single item: the item with the smallest value.\n\nArguments\n\nfrom: optional initial minimal value, if nothing first item from the source will be used as initial instead\n\nProducing\n\nStream of type <: Subscribable{Union{L, Nothing}} where L refers to type of source stream\n\nExamples\n\nusing Rocket\n\nsource = from([ i for i in 1:42 ])\nsubscribe!(source |> min(), logger())\n;\n\n# output\n\n[LogActor] Data: 1\n[LogActor] Completed\n\n\nSee also: AbstractOperator, InferableOperator, ProxyObservable, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/mathematical/min/#Description","page":"min","title":"Description","text":"","category":"section"},{"location":"operators/mathematical/min/","page":"min","title":"min","text":"The min operator operates on an Observable of similar objects. When source Observable completes, it emits the item with the smallest value.","category":"page"},{"location":"operators/mathematical/min/#See-also","page":"min","title":"See also","text":"","category":"section"},{"location":"operators/mathematical/min/","page":"min","title":"min","text":"Operators","category":"page"},{"location":"operators/errors/error_if/#operator_error_if","page":"error_if","title":"Error If Operator","text":"","category":"section"},{"location":"operators/errors/error_if/","page":"error_if","title":"error_if","text":"error_if","category":"page"},{"location":"operators/errors/error_if/#Rocket.error_if","page":"error_if","title":"Rocket.error_if","text":"error_if(checkFn, errorFn)\n\nCreates an error_if operator, which performs a check for every emission on the source Observable with checkFn. If checkFn returns true, the operator sends an error event and unsubscribes from the observable.\n\nArguments\n\ncheckFn: check function with (data) -> Bool signature\nerrorFn: error object generating function with (data) -> Any signature, optional\n\nProducing\n\nStream of type <: Subscribable{L} where L refers to type of source stream\n\nExamples\n\nusing Rocket\n\nsource = from([1, 2, 3]) |> error_if((data) -> data > 2, (data) -> \"CustomError\")\n\nsubscription = subscribe!(source, lambda(\n on_next = (d) -> println(\"Next: \", d),\n on_error = (e) -> println(\"Error: \", e),\n on_complete = () -> println(\"Completed\")\n))\n;\n\n# output\nNext: 1\nNext: 2\nError: CustomError\n\nSee also: error_if_not, error_if_empty, default_if_empty, lambda\n\n\n\n\n\n","category":"function"},{"location":"operators/errors/error_if/#See-also","page":"error_if","title":"See also","text":"","category":"section"},{"location":"operators/errors/error_if/","page":"error_if","title":"error_if","text":"Operators","category":"page"},{"location":"subjects/about/#section_subjects","page":"Subject","title":"About subjects","text":"","category":"section"},{"location":"subjects/about/","page":"Subject","title":"Subject","text":"A Rocket.jl Subject is a special type of Observable that allows values to be multicasted to many Actors. While plain Observables are unicast (each subscribed Actor owns an independent execution of the Observable), Subjects are multicast.","category":"page"},{"location":"subjects/about/","page":"Subject","title":"Subject","text":"note: Note\nA Subject is like an Observable, but can multicast to many Actors. Subjects are like event emitters: they maintain a registry of many listeners.","category":"page"},{"location":"subjects/about/","page":"Subject","title":"Subject","text":"Every Subject is an Observable. Given a Subject, you can subscribe to it, providing an Actor, which will start receiving values normally. From the perspective of the Actor, it cannot tell whether the Observable execution is coming from a plain unicast Observable or a Subject.","category":"page"},{"location":"subjects/about/","page":"Subject","title":"Subject","text":"Internally to the Subject, subscribe! does not invoke a new execution that delivers values. Instead, it simply registers the given Actor in a list of Actors.","category":"page"},{"location":"subjects/about/","page":"Subject","title":"Subject","text":"Every Subject is an Actor itself. It is an object with the methods next!, error!, and complete!. Call next!(subject, theValue) to feed a new value to the Subject, and it will be multicasted to the Actors that listen to the Subject.","category":"page"},{"location":"subjects/about/","page":"Subject","title":"Subject","text":"In the example below, we have two Observers attached to a Subject, and we feed some values to the Subject:","category":"page"},{"location":"subjects/about/","page":"Subject","title":"Subject","text":"using Rocket\n\nsource = Subject(Int)\n\nsubscription1 = subscribe!(source, lambda(\n on_next = (d) -> println(\"Actor 1: $d\")\n))\n\nsubscription2 = subscribe!(source, lambda(\n on_next = (d) -> println(\"Actor 2: $d\")\n))\n\nnext!(source, 0)\n\n# Logs\n# Actor 1: 0\n# Actor 2: 0\n\nunsubscribe!(subscription1)\nunsubscribe!(subscription2)\n","category":"page"},{"location":"subjects/about/","page":"Subject","title":"Subject","text":"Since a Subject is an actor, this also means you may provide a Subject as the argument to the subscribe of any Observable:","category":"page"},{"location":"subjects/about/","page":"Subject","title":"Subject","text":"using Rocket\n\nsource = Subject(Int)\n\nsubscription1 = subscribe!(source, lambda(\n on_next = (d) -> println(\"Actor 1: $d\")\n))\n\nsubscription2 = subscribe!(source, lambda(\n on_next = (d) -> println(\"Actor 2: $d\")\n))\n\nother_source = from([ 1, 2, 3 ])\nsubscribe!(other_source, source);\n\n# Logs\n# Actor 1: 1\n# Actor 2: 1\n# Actor 1: 2\n# Actor 2: 2\n# Actor 1: 3\n# Actor 2: 3","category":"page"},{"location":"subjects/about/","page":"Subject","title":"Subject","text":"Here, we essentially convert a unicast Observable execution to multicast, through the Subject. This demonstrates how Subjects offer a unique way to share Observable execution with multiple Observers.","category":"page"},{"location":"subjects/about/#Schedulers","page":"Subject","title":"Schedulers","text":"","category":"section"},{"location":"subjects/about/","page":"Subject","title":"Subject","text":"A Subject (and some other observables) uses scheduler objects to schedule message delivery to their listeners.","category":"page"},{"location":"subjects/about/#Synchronous-scheduler","page":"Subject","title":"Synchronous scheduler","text":"","category":"section"},{"location":"subjects/about/","page":"Subject","title":"Subject","text":"One of the variants of schedulers is the AsapScheduler, which delivers every message synchronously. AsapScheduler is a default scheduler for all Subject objects.","category":"page"},{"location":"subjects/about/","page":"Subject","title":"Subject","text":"AsapScheduler","category":"page"},{"location":"subjects/about/#Rocket.AsapScheduler","page":"Subject","title":"Rocket.AsapScheduler","text":"AsapScheduler\n\nAsapScheduler executes scheduled actions as soon as possible and does not introduce any additional logic. AsapScheduler is a default scheduler for almost all observables.\n\n\n\n\n\n","category":"type"},{"location":"subjects/about/","page":"Subject","title":"Subject","text":"using Rocket\n\nsubject = Subject(Int, scheduler = AsapScheduler())\n\nsubscription1 = subscribe!(subject, logger(\"Actor 1\"))\n\nprintln(\"Before next\")\nnext!(subject, 1)\nnext!(subject, 2)\nprintln(\"After next\")\n\nsubscription2 = subscribe!(subject, logger(\"Actor 2\"))\n\nnext!(subject, 3)\n\n# Logs\n# Before next\n# [Actor 1] Data: 1\n# [Actor 1] Data: 2\n# After next\n# [Actor 1] Data: 3\n# [Actor 2] Data: 3","category":"page"},{"location":"subjects/about/#Asynchronous-Scheduler","page":"Subject","title":"Asynchronous Scheduler","text":"","category":"section"},{"location":"subjects/about/","page":"Subject","title":"Subject","text":"An AsyncScheduler is similar to a AsapScheduler. Both allows for Subject to scheduler their messages for multiple listeners, but a AsyncScheduler delivers all messages asynchronously (but still ordered) using a Julia's built-in Task object.","category":"page"},{"location":"subjects/about/","page":"Subject","title":"Subject","text":"AsyncScheduler","category":"page"},{"location":"subjects/about/#Rocket.AsyncScheduler","page":"Subject","title":"Rocket.AsyncScheduler","text":"AsyncScheduler\n\nAsyncScheduler executes scheduled actions asynchronously and uses Channel object to order different actions on a single asynchronous task\n\n\n\n\n\n","category":"type"},{"location":"subjects/about/","page":"Subject","title":"Subject","text":"using Rocket\n\nsubject = Subject(Int, scheduler = AsyncScheduler())\n\nsubscription1 = subscribe!(subject, logger(\"Actor 1\"))\n\nprintln(\"Before next\")\nnext!(subject, 1)\nnext!(subject, 2)\nprintln(\"After next\")\n\nsubscription2 = subscribe!(subject, logger(\"Actor 2\"))\n\nnext!(subject, 3)\n\n# Logs\n# Before next\n# After next\n# [Actor 1] Data: 1\n# [Actor 1] Data: 2\n# [Actor 1] Data: 3\n# [Actor 2] Data: 3\n","category":"page"},{"location":"operators/filtering/find_index/#operator_find_index","page":"find_index","title":"Find Index operator","text":"","category":"section"},{"location":"operators/filtering/find_index/","page":"find_index","title":"find_index","text":"find_index","category":"page"},{"location":"operators/filtering/find_index/#Rocket.find_index","page":"find_index","title":"Rocket.find_index","text":"find_index(conditionFn::F) where { F <: Function }\n\nCreates a find operator, which emits only the index of the first value emitted by the source Observable that meets some condition. Indices are 1-based.\n\nProducing\n\nStream of type <: Subscribable{L} where L refers to type of source stream\n\nArguments\n\nconditionFn::F: condition function with (data::T) -> Bool signature\n\nExamples\n\nusing Rocket\n\nsource = from([ 0, 1, 2, 3, 4, 5, 6, 7, 8 ])\nsubscribe!(source |> find_index((d) -> d !== 0 && d % 2 == 0), logger())\n;\n\n# output\n\n[LogActor] Data: 3\n[LogActor] Completed\n\nSee also: find, AbstractOperator, InferableOperator, ProxyObservable, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/filtering/find_index/#Description","page":"find_index","title":"Description","text":"","category":"section"},{"location":"operators/filtering/find_index/","page":"find_index","title":"find_index","text":"It's like find, but emits the index of the found value, not the value itself.","category":"page"},{"location":"operators/filtering/find_index/#See-also","page":"find_index","title":"See also","text":"","category":"section"},{"location":"operators/filtering/find_index/","page":"find_index","title":"find_index","text":"Operators, take","category":"page"},{"location":"api/subjects/#subjects_api","page":"Subjects","title":"Subjects API","text":"","category":"section"},{"location":"api/subjects/#Traits","page":"Subjects","title":"Traits","text":"","category":"section"},{"location":"api/subjects/","page":"Subjects","title":"Subjects","text":"SubjectTrait\nas_subject \nValidSubjectTrait\nInvalidSubjectTrait\nAbstractSubject","category":"page"},{"location":"api/subjects/#Rocket.SubjectTrait","page":"Subjects","title":"Rocket.SubjectTrait","text":"Abstract type for all possible subject traits\n\nSee also: ValidSubjectTrait, InvalidSubjectTrait, as_subject\n\n\n\n\n\n","category":"type"},{"location":"api/subjects/#Rocket.as_subject","page":"Subjects","title":"Rocket.as_subject","text":"as_subject(::Type)\n\nThis function checks subject trait behavior specification. Should be used explicitly to specify subject trait behavior for any object type.\n\nSee also: SubjectTrait\n\n\n\n\n\n","category":"function"},{"location":"api/subjects/#Rocket.ValidSubjectTrait","page":"Subjects","title":"Rocket.ValidSubjectTrait","text":"Valid subject trait behavior\n\nSee also: SubjectTrait\n\n\n\n\n\n","category":"type"},{"location":"api/subjects/#Rocket.InvalidSubjectTrait","page":"Subjects","title":"Rocket.InvalidSubjectTrait","text":"Default subject trait behavior for all types.\n\nSee also: SubjectTrait\n\n\n\n\n\n","category":"type"},{"location":"api/subjects/#Rocket.AbstractSubject","page":"Subjects","title":"Rocket.AbstractSubject","text":"Supertype for Subject types. Automatically specifies ValidSubject, SimpleSubscribableTrait and BaseActorTrait traits.\n\nSee also: Subject, ValidSubjectTrait, SimpleSubscribableTrait, BaseActorTrait\n\n\n\n\n\n","category":"type"},{"location":"api/subjects/#Factory","page":"Subjects","title":"Factory","text":"","category":"section"},{"location":"api/subjects/","page":"Subjects","title":"Subjects","text":"AbstractSubjectFactory\ncreate_subject","category":"page"},{"location":"api/subjects/#Rocket.AbstractSubjectFactory","page":"Subjects","title":"Rocket.AbstractSubjectFactory","text":"Abstract type for all possible subject factories\n\nSee also: SubjectTrait, ValidSubjectTrait, InvalidSubjectTrait\n\n\n\n\n\n","category":"type"},{"location":"api/subjects/#Rocket.create_subject","page":"Subjects","title":"Rocket.create_subject","text":"create_subject(::Type{L}, factory::F) where L where { F <: AbstractSubjectFactory }\n\nActor creator function for a given factory F. Should be implemented explicitly for any AbstractActorFactory object\n\nSee also: AbstractSubjectFactory, MissingCreateActorFactoryImplementationError\n\n\n\n\n\n","category":"function"},{"location":"api/subjects/#Errors","page":"Subjects","title":"Errors","text":"","category":"section"},{"location":"api/subjects/","page":"Subjects","title":"Subjects","text":"InvalidSubjectTraitUsageError\nInconsistentSubjectDataTypesError","category":"page"},{"location":"api/subjects/#Rocket.InvalidSubjectTraitUsageError","page":"Subjects","title":"Rocket.InvalidSubjectTraitUsageError","text":"InvalidSubject usage error\n\nSee also: as_subject\n\n\n\n\n\n","category":"type"},{"location":"api/subjects/#Rocket.InconsistentSubjectDataTypesError","page":"Subjects","title":"Rocket.InconsistentSubjectDataTypesError","text":"InconsistentSubjectDataTypesError\n\nSee also: as_subject\n\n\n\n\n\n","category":"type"},{"location":"operators/transformation/lowercase/#operator_lowercase","page":"lowercase","title":"Lowercase Operator","text":"","category":"section"},{"location":"operators/transformation/lowercase/","page":"lowercase","title":"lowercase","text":"lowercase","category":"page"},{"location":"operators/transformation/lowercase/#Base.Unicode.lowercase","page":"lowercase","title":"Base.Unicode.lowercase","text":"lowercase()\n\nCreates an lowercase operator, which forces each value to be in lower case\n\nProducing\n\nStream of type <: Subscribable{L} where L referes to type of data of input Observable\n\nExamples\n\nusing Rocket\n\nsource = of(\"Hello, world!\")\nsubscribe!(source |> lowercase(), logger())\n;\n\n# output\n\n[LogActor] Data: hello, world!\n[LogActor] Completed\n\nSee also: AbstractOperator, InferableOperator, ProxyObservable, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/transformation/lowercase/#See-also","page":"lowercase","title":"See also","text":"","category":"section"},{"location":"operators/transformation/lowercase/","page":"lowercase","title":"lowercase","text":"Operators, map, uppercase","category":"page"},{"location":"operators/transformation/merge_map/#operator_merge_map","page":"merge_map","title":"MergeMap Operator","text":"","category":"section"},{"location":"operators/transformation/merge_map/","page":"merge_map","title":"merge_map","text":"merge_map","category":"page"},{"location":"operators/transformation/merge_map/#Rocket.merge_map","page":"merge_map","title":"Rocket.merge_map","text":"merge_map(::Type{R}, mappingFn::F = identity; concurrent::Int = typemax(Int)) where { R, F <: Function }\n\nCreates a merge_map operator, which returns an Observable that emits the result of applying the projection function mappingFn to each item emitted by the source Observable and merging the results of the Observables obtained from this transformation.\n\nArguments\n\n::Type{R}: the type of data of output Observables after projection with mappingFn\nmappingFn::F: projection function with (data) -> Observable{R} signature\nconcurrent::Int: optional, default is typemax(Int), maximum number of input Observables being subscribed to concurrently\n\nProducing\n\nStream of type <: Subscribable{R}\n\nExamples\n\nusing Rocket\n\nsource = from([ 0, 0 ]) |> merge_map(Int, d -> from([ 1, 2, 3 ], scheduler = AsyncScheduler(0)))\nsubscribe!(source, logger())\n;\n\n# output\n\n[LogActor] Data: 1\n[LogActor] Data: 1\n[LogActor] Data: 2\n[LogActor] Data: 2\n[LogActor] Data: 3\n[LogActor] Data: 3\n[LogActor] Completed\n\nSee also: AbstractOperator, RightTypedOperator, ProxyObservable, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/transformation/merge_map/#See-also","page":"merge_map","title":"See also","text":"","category":"section"},{"location":"operators/transformation/merge_map/","page":"merge_map","title":"merge_map","text":"Operators","category":"page"},{"location":"teardown/types/void/#teardown_void","page":"Void","title":"Void Teardown","text":"","category":"section"},{"location":"teardown/types/void/","page":"Void","title":"Void","text":"VoidTeardown\nvoidTeardown","category":"page"},{"location":"teardown/types/void/#Rocket.VoidTeardown","page":"Void","title":"Rocket.VoidTeardown","text":"VoidTeardown()\n\nVoidTeardown object does nothing on unsubscription. It is usefull for synchronous observables and observables which cannot be cancelled after execution.\n\nSee also: Teardown, VoidTeardownLogic\n\n\n\n\n\n","category":"type"},{"location":"teardown/types/void/#Rocket.voidTeardown","page":"Void","title":"Rocket.voidTeardown","text":"voidTeardown\n\nAn instance of VoidTeardown singleton object.\n\nSee also: VoidTeardown\n\n\n\n\n\n","category":"constant"},{"location":"operators/transformation/substitute/#operator_substitute","page":"substitute","title":"Substitute Operator","text":"","category":"section"},{"location":"operators/transformation/substitute/","page":"substitute","title":"substitute","text":"substitute\nSubstituteHandler","category":"page"},{"location":"operators/transformation/substitute/#Rocket.substitute","page":"substitute","title":"Rocket.substitute","text":"substitute(::Type{T}, mapFn::F, handler::SubstituteHandler) where { T, F <: Function }\n\nThis operator forces observable to substitute each emmited value with the latest computed value with the corresponding handler and release! function. After release! on handler substitute operator computes new value with mapFn but does not emit it until next emission from source observable. Always calls mapFn on first value from source observable.\n\nProducing\n\nStream of type <: Subscribable{T} \n\nExamples\n\nusing Rocket\n\nsubject = Subject(Int)\n\nhandler = SubstituteHandler()\nsource = subject |> substitute(String, i -> string(\"i = \", i), handler)\n\nsubscription = subscribe!(source, logger())\n\nnext!(subject, 1)\nnext!(subject, 2)\nnext!(subject, 3)\n\nrelease!(handler)\n\nnext!(subject, 4)\nnext!(subject, 5)\nnext!(subject, 6)\n\nunsubscribe!(subscription)\n;\n\n# output\n\n[LogActor] Data: i = 1\n[LogActor] Data: i = 1\n[LogActor] Data: i = 1\n[LogActor] Data: i = 3\n[LogActor] Data: i = 3\n[LogActor] Data: i = 3\n\nSee also: SubstituteHandler\n\n\n\n\n\n","category":"function"},{"location":"operators/transformation/substitute/#Rocket.SubstituteHandler","page":"substitute","title":"Rocket.SubstituteHandler","text":"SubstituteHandler()\n\nhandler used to release! new values in substitute operator.\n\nSee also: substitute\n\n\n\n\n\n","category":"type"},{"location":"operators/transformation/substitute/#See-also","page":"substitute","title":"See also","text":"","category":"section"},{"location":"operators/transformation/substitute/","page":"substitute","title":"substitute","text":"Operators","category":"page"},{"location":"operators/mathematical/about/#Mathematical-and-Aggregate-category","page":"About mathematical operators","title":"Mathematical and Aggregate category","text":"","category":"section"},{"location":"operators/mathematical/about/","page":"About mathematical operators","title":"About mathematical operators","text":"There are operators for different purposes, and they may be categorized as: creation, transformation, filtering, joining, multicasting, error handling, utility, etc. In the following list you will find all the operators organized in mathematical and aggregate category.","category":"page"},{"location":"operators/mathematical/about/","page":"About mathematical operators","title":"About mathematical operators","text":"count\nmax\nmin\nreduce\nsum","category":"page"},{"location":"operators/mathematical/about/#See-also","page":"About mathematical operators","title":"See also","text":"","category":"section"},{"location":"operators/mathematical/about/","page":"About mathematical operators","title":"About mathematical operators","text":"Operators","category":"page"},{"location":"operators/utility/async/#operator_ref_async","page":"async","title":"Async Operator","text":"","category":"section"},{"location":"operators/utility/async/","page":"async","title":"async","text":"async","category":"page"},{"location":"operators/utility/async/#Rocket.async","page":"async","title":"Rocket.async","text":"async(size::Int = typemax(Int))\n\nCreates an async operator, which sends items from the source Observable asynchronously.\n\nArguments\n\nsize: Asynchronous messages buffer size, default is a typemax(Int)\n\nProducing\n\nStream of type <: Subscribable{L} where L refers to type of source stream\n\nSee also: AbstractOperator, InferableOperator, ProxyObservable\n\n\n\n\n\n","category":"function"},{"location":"operators/utility/async/#See-also","page":"async","title":"See also","text":"","category":"section"},{"location":"operators/utility/async/","page":"async","title":"async","text":"Operators","category":"page"},{"location":"operators/transformation/enumerate/#operator_enumerate","page":"enumerate","title":"Enumerate Operator","text":"","category":"section"},{"location":"operators/transformation/enumerate/","page":"enumerate","title":"enumerate","text":"enumerate","category":"page"},{"location":"operators/transformation/enumerate/#Base.Iterators.enumerate","page":"enumerate","title":"Base.Iterators.enumerate","text":"enumerate()\n\nCreates an enumerate operator, which converts each value emitted by the source Observable into a tuple of its order number and the value itself.\n\nThe enumerate operator is similar to scan(Tuple{Int, Int}, (d, c) -> (d, c[2] + 1), (0, 0)) (see scan).\n\nProducing\n\nStream of type <: Subscribable{Tuple{Int, L}} where L refers to type of source stream\n\nExamples\n\nusing Rocket\n\nsource = from([ 0 for _ in 1:3 ])\nsubscribe!(source |> enumerate(), logger())\n;\n\n# output\n\n[LogActor] Data: (1, 0)\n[LogActor] Data: (2, 0)\n[LogActor] Data: (3, 0)\n[LogActor] Completed\n\n\nSee also: AbstractOperator, InferableOperator, ProxyObservable, scan, map, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/transformation/enumerate/#Description","page":"enumerate","title":"Description","text":"","category":"section"},{"location":"operators/transformation/enumerate/","page":"enumerate","title":"enumerate","text":"enumerate returns an Observable that converts each value emitted by the source Observable into a tuple of its order number and the value itself.","category":"page"},{"location":"operators/transformation/enumerate/#Example","page":"enumerate","title":"Example","text":"","category":"section"},{"location":"operators/transformation/enumerate/","page":"enumerate","title":"enumerate","text":"Get a value from the source with its order number","category":"page"},{"location":"operators/transformation/enumerate/","page":"enumerate","title":"enumerate","text":"using Rocket\n\nsource = from([ 0.0, 0.2, 0.4, 0.6, 0.8, 1.0 ])\nsubscribe!(source |> enumerate(), logger())\n\n# output\n\n[LogActor] Data: (0.0, 1)\n[LogActor] Data: (0.2, 2)\n[LogActor] Data: (0.4, 3)\n[LogActor] Data: (0.6, 4)\n[LogActor] Data: (0.8, 5)\n[LogActor] Data: (1.0, 6)\n[LogActor] Completed","category":"page"},{"location":"operators/transformation/enumerate/#See-also","page":"enumerate","title":"See also","text":"","category":"section"},{"location":"operators/transformation/enumerate/","page":"enumerate","title":"enumerate","text":"Operators, scan","category":"page"},{"location":"actors/types/sync/#actor_sync","page":"Sync","title":"Sync actor","text":"","category":"section"},{"location":"actors/types/sync/","page":"Sync","title":"Sync","text":"sync","category":"page"},{"location":"actors/types/sync/#Rocket.sync","page":"Sync","title":"Rocket.sync","text":"sync(actor::A; withlock::Bool = true, timeout::Int = -1) where A\nsync(factory::F; withlock::Bool = true, timeout::Int = -1) where { F <: AbstractActorFactory }\n\nCreation operator for the SyncActor actor. Accepts optional named timeout argument which specifies maximum number of milliseconds to wait (throws SyncActorTimedOutException() on timeout). Also accepts optional withlock boolean flag indicating that every next!, error! and complete! event should be guarded with ReentrantLock.\n\nExamples\n\nusing Rocket\n\nactor = keep(Int)\nsynced = sync(actor)\n\nsubscribe!(from(0:5, scheduler = AsyncScheduler()), synced)\n\nyield()\n\nwait(synced)\nshow(synced.actor.values)\n\n# output\n[0, 1, 2, 3, 4, 5]\n\nCan also be used with an <: AbstractActorFactory as an argument. In this case sync function will return a special actor factory object, which will store all created actors in array and wrap them with a sync function. wait(sync_factory) method will wait for all of the created actors to be completed in the order of creation (but only once for each of them).\n\nusing Rocket\n\nvalues = Int[]\n\nfactory = lambda(on_next = (d) -> push!(values, d))\nsynced = sync(factory)\n\nsubscribe!(from(0:5, scheduler = AsyncScheduler()), synced)\n\nyield()\n\nwait(synced)\nshow(values)\n\n# output\n[0, 1, 2, 3, 4, 5]\n\nSee also: SyncActor, AbstractActor\n\n\n\n\n\n","category":"function"},{"location":"actors/types/sync/","page":"Sync","title":"Sync","text":"SyncActor","category":"page"},{"location":"actors/types/sync/#Rocket.SyncActor","page":"Sync","title":"Rocket.SyncActor","text":"SyncActor{T, A}(actor::A; withlock::Bool = true, timeout::Int = -1) where { T, A }\n\nSync actor provides a synchronized interface to wait for an actor to be notified with a complete event. By default creates a re-entrant lock for synchronizing next!, error! and complete! events.\n\nSee also: Actor, sync\n\n\n\n\n\n","category":"type"},{"location":"operators/utility/limit_subscribers/#operator_limit_subscribers","page":"limit_subscribers","title":"LimitSubscribers Operator","text":"","category":"section"},{"location":"operators/utility/limit_subscribers/","page":"limit_subscribers","title":"limit_subscribers","text":"LimitSubscribersGuard\nlimit_subscribers","category":"page"},{"location":"operators/utility/limit_subscribers/#Rocket.LimitSubscribersGuard","page":"limit_subscribers","title":"Rocket.LimitSubscribersGuard","text":"LimitSubscribersGuard(limit::Int = 1, exclusive = true)\n\nGuard structure used in limit_subscribers operator.\n\nArguments\n\nlimit: number of concurrent subscribers\nexclusive: boolean flag, which indicates whenever this guard can be shared with other observables in other limit_subscribers operator. If set to true, reusing this guard in a different limit_subscribers operator for other observable will result in automatic unsubscription of all present actors.\n\nNote\n\nThis structure is useful in Pluto.jl notebooks in particular, allowing for automatic subscription/unsubscription of observables.\n\nExample\n\n\n# Cell 1\nguard = LimitSubscribersGuard()\n\n# Cell 2\nsubscription = subscribe!(some_stream |> limit_subscribers(guard), logger())\n\nSee also: limit_subscribers, subscribe!\n\n\n\n\n\n","category":"type"},{"location":"operators/utility/limit_subscribers/#Rocket.limit_subscribers","page":"limit_subscribers","title":"Rocket.limit_subscribers","text":"limit_subscribers(limit::Int = 1, exclusive::Bool = true)\nlimit_subscribers(guard::LimitSubscribersGuard)\n\nCreates an operator that limits number of concurrent actors to the given observable. On new subscription, if limit is exceeded, oldest actor is automatically unsubscribed and receives a completion event.\n\nArguments\n\nlimit: number of concurrent subscribers\nexclusive: boolean flag, which indicates whenever this guard can be shared with other observables in other limit_subscribers operator. If set to true, reusing this guard in a different limit_subscribers operator for other observable will result in automatic unsubscription of all present actors.\n\nNote\n\nThis structure is useful in Pluto.jl notebooks in particular, allowing for automatic subscription/unsubscription of observables.\n\nExample\n\n\n# Cell 1\nguard = LimitSubscribersGuard()\n\n# Cell 2\nsubscription = subscribe!(some_stream |> limit_subscribers(guard), logger())\n\nSee also: LimitSubscribersGuard\n\n\n\n\n\n","category":"function"},{"location":"operators/utility/limit_subscribers/#See-also","page":"limit_subscribers","title":"See also","text":"","category":"section"},{"location":"operators/utility/limit_subscribers/","page":"limit_subscribers","title":"limit_subscribers","text":"Operators","category":"page"},{"location":"operators/utility/skip_error/#operator_skip_error","page":"skip_error","title":"SkipError Operator","text":"","category":"section"},{"location":"operators/utility/skip_error/","page":"skip_error","title":"skip_error","text":"skip_error","category":"page"},{"location":"operators/utility/skip_error/#Rocket.skip_error","page":"skip_error","title":"Rocket.skip_error","text":"skip_error()\n\nCreates a skip_error operator, which filters out error event by the source Observable by emitting only next and complete messages.\n\nProducing\n\nStream of type <: Subscribable{L} where L refers to type of source stream\n\nExamples\n\nusing Rocket\n\nsource = faulted(\"error\")\nsubscribe!(source |> skip_error(), logger())\n;\n\n# output\n\n\nSee also: AbstractOperator, InferableOperator, ProxyObservable, skip_error, skip_complete, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/utility/skip_error/#See-also","page":"skip_error","title":"See also","text":"","category":"section"},{"location":"operators/utility/skip_error/","page":"skip_error","title":"skip_error","text":"Operators","category":"page"},{"location":"api/observables/#observables_api","page":"Observables","title":"Observables API","text":"","category":"section"},{"location":"api/observables/","page":"Observables","title":"Observables","text":"Any observable-like should implement a valid subscribable logic.","category":"page"},{"location":"api/observables/#Traits","page":"Observables","title":"Traits","text":"","category":"section"},{"location":"api/observables/","page":"Observables","title":"Observables","text":"as_subscribable\nSubscribableTrait\nSimpleSubscribableTrait\nScheduledSubscribableTrait\nInvalidSubscribableTrait","category":"page"},{"location":"api/observables/#Rocket.as_subscribable","page":"Observables","title":"Rocket.as_subscribable","text":"as_subscribable(any)\n\nThis function checks subscribable trait behavior specification. Can be used explicitly to specify subscribable trait behavior for any object.\n\nSee also: SubscribableTrait\n\n\n\n\n\n","category":"function"},{"location":"api/observables/#Rocket.SubscribableTrait","page":"Observables","title":"Rocket.SubscribableTrait","text":"Abstract type for all possible subscribable traits\n\nSee also: SimpleSubscribableTrait, ScheduledSubscribableTrait, InvalidSubscribableTrait\n\n\n\n\n\n","category":"type"},{"location":"api/observables/#Rocket.SimpleSubscribableTrait","page":"Observables","title":"Rocket.SimpleSubscribableTrait","text":"Simple subscribable trait behavior. Simple subscribable can be used in subscribe! function and just executes on_subscribe! method for provided subscribable. SimpleSubscribableTrait is a subtype of SubscribableTrait.\n\nSee also: SubscribableTrait, Subscribable, subscribe!, on_subscribe!\n\n\n\n\n\n","category":"type"},{"location":"api/observables/#Rocket.ScheduledSubscribableTrait","page":"Observables","title":"Rocket.ScheduledSubscribableTrait","text":"Scheduled subscribable trait behavior. Scheduled subscribable can be used in subscribe! function and executes on_subscribe! method for provided subscribable with custom scheduling. ScheduledSubscribableTrait is a subtype of SubscribableTrait.\n\nSee also: SubscribableTrait, ScheduledSubscribable, subscribe!, on_subscribe!\n\n\n\n\n\n","category":"type"},{"location":"api/observables/#Rocket.InvalidSubscribableTrait","page":"Observables","title":"Rocket.InvalidSubscribableTrait","text":"Default subscribable trait behavior for all types. Invalid subscribable cannot be used in subscribe! function, doing so will throw an error. InvalidSubscribableTrait is a subtype of SubscribableTrait.\n\nSee also: SubscribableTrait, subscribe!\n\n\n\n\n\n","category":"type"},{"location":"api/observables/#Types","page":"Observables","title":"Types","text":"","category":"section"},{"location":"api/observables/","page":"Observables","title":"Observables","text":"AbstractSubscribable\nSubscribable\nScheduledSubscribable\nsubscribe!\non_subscribe!","category":"page"},{"location":"api/observables/#Rocket.AbstractSubscribable","page":"Observables","title":"Rocket.AbstractSubscribable","text":"Supertype type for Subscribable and ScheduledSubscribable types.\n\nSee also: Subscribable, ScheduledSubscribable\n\n\n\n\n\n","category":"type"},{"location":"api/observables/#Rocket.Subscribable","page":"Observables","title":"Rocket.Subscribable","text":"Super type for any simple subscribable object. Automatically specifies a SimpleSubscribableTrait trait behavior. Objects with specified SimpleSubscribableTrait subscribable trait must implement: on_subscribe!(subscribable, actor) method. Subscribable is a subtype of AbstractSubscribable type.\n\nExamples\n\nusing Rocket\n\nstruct MySubscribable <: Subscribable{String} end\n\nRocket.as_subscribable(MySubscribable)\n\n# output\n\nSimpleSubscribableTrait{String}()\n\nSee also: SubscribableTrait, SimpleSubscribableTrait\n\n\n\n\n\n","category":"type"},{"location":"api/observables/#Rocket.ScheduledSubscribable","page":"Observables","title":"Rocket.ScheduledSubscribable","text":"Super type for any scheduled subscribable object. Automatically specifies a ScheduledSubscribableTrait trait behavior. Objects with specified ScheduledSubscribableTrait subscribable trait must implement: on_subscribe!(subscribable, actor, scheduler) method. ScheduledSubscribable is a subtype of AbstractSubscribable type.\n\nExamples\n\nusing Rocket\n\nstruct MyScheduledSubscribable <: ScheduledSubscribable{String} end\n\nRocket.as_subscribable(MyScheduledSubscribable)\n\n# output\n\nScheduledSubscribableTrait{String}()\n\nSee also: SubscribableTrait, ScheduledSubscribableTrait\n\n\n\n\n\n","category":"type"},{"location":"api/observables/#Rocket.subscribe!","page":"Observables","title":"Rocket.subscribe!","text":"subscribe!(subscribable::T, actor::S) where { T, S }\nsubscribe!(subscribable::T, factory::F) where { T, F <: AbstractActorFactory }\nsubscribe!(subscriptions::Tuple)\nsubscribe!(subscriptions::AbstractVector)\n\nsubscribe! function is used to attach an actor to subscribable. It also checks types of subscribable and actors to be a valid Subscribable and Actor objects respectively. Passing not valid subscribable or/and actor object will throw an error. If the input argument to the subscribe! function is either a tuple or a vector, it will first check that all of the arguments are valid source and actor objects and if its true will subscribe for each of them individually. \n\nArguments\n\nsubscribable: valid subscribable object\nactor: valid actor object\n\nExamples\n\nusing Rocket\n\nsource = from((1, 2, 3))\nsubscribe!(source, logger())\n;\n\n# output\n\n[LogActor] Data: 1\n[LogActor] Data: 2\n[LogActor] Data: 3\n[LogActor] Completed\n\nusing Rocket\n\nsource = from((1, 2, 3))\nsubscribe!(source, 1)\n;\n\n# output\n\nERROR: Type Int64 is not a valid actor type.\n[...]\n\nusing Rocket\n\nsource = from((1, 2, 3))\nsubscribe!(1, logger())\n;\n\n# output\n\nERROR: Type Int64 is not a valid subscribable type.\n[...]\n\nSee also: on_subscribe!, as_subscribable\n\n\n\n\n\n","category":"function"},{"location":"api/observables/#Rocket.on_subscribe!","page":"Observables","title":"Rocket.on_subscribe!","text":"on_subscribe!(subscribable, actor)\non_subscribe!(subscribable, actor, scheduler)\n\nEvery valid subscribable object have to define its own method for on_subscribe! function which specifies subscription logic and has return a valid Teardown object.\n\nObjects with specified SimpleSubscribableTrait subscribable trait must implement: on_subscribe!(subscribable, actor) method. Objects with specified ScheduledSubscribableTrait subscribable trait must implement: on_subscribe!(subscribable, actor, scheduler) method.\n\nArguments\n\nsubscribable: Subscribable object\nactor: Actor object\nscheduler: Scheduler object (only for scheduled subscribables)\n\nExamples\n\nusing Rocket\n\nstruct MySubscribable <: Subscribable{Int} end\n\nfunction Rocket.on_subscribe!(subscribable::MySubscribable, actor)\n next!(actor, 0)\n complete!(actor)\n return voidTeardown\nend\n\nsubscribe!(MySubscribable(), logger())\n;\n\n# output\n\n[LogActor] Data: 0\n[LogActor] Completed\n\nusing Rocket\n\nstruct MyScheduledSubscribable <: ScheduledSubscribable{Int} end\n\nRocket.getscheduler(::MyScheduledSubscribable) = AsapScheduler()\n\nfunction Rocket.on_subscribe!(subscribable::MyScheduledSubscribable, actor, scheduler)\n next!(actor, 0, scheduler)\n complete!(actor, scheduler)\n return voidTeardown\nend\n\nsubscribe!(MyScheduledSubscribable(), logger())\n;\n\n# output\n\n[LogActor] Data: 0\n[LogActor] Completed\n\nSee also: Subscribable, ScheduledSubscribable, SimpleSubscribableTrait, ScheduledSubscribableTrait, Teardown, logger\n\n\n\n\n\n","category":"function"},{"location":"api/observables/#Errors","page":"Observables","title":"Errors","text":"","category":"section"},{"location":"api/observables/","page":"Observables","title":"Observables","text":"InvalidSubscribableTraitUsageError\nInconsistentActorWithSubscribableDataTypesError\nMissingOnSubscribeImplementationError\nMissingOnScheduledSubscribeImplementationError","category":"page"},{"location":"api/observables/#Rocket.InvalidSubscribableTraitUsageError","page":"Observables","title":"Rocket.InvalidSubscribableTraitUsageError","text":"This error will be thrown if subscribe! function is called with invalid subscribable object\n\nSee also: subscribe!\n\n\n\n\n\n","category":"type"},{"location":"api/observables/#Rocket.InconsistentActorWithSubscribableDataTypesError","page":"Observables","title":"Rocket.InconsistentActorWithSubscribableDataTypesError","text":"This error will be thrown if subscribe! function is called with inconsistent subscribable and actor objects\n\nSee also: subscribe!\n\n\n\n\n\n","category":"type"},{"location":"api/observables/#Rocket.MissingOnSubscribeImplementationError","page":"Observables","title":"Rocket.MissingOnSubscribeImplementationError","text":"This error will be thrown if Julia cannot find specific method of 'on_subscribe!()' function for given subscribable and actor\n\nSee also: on_subscribe!\n\n\n\n\n\n","category":"type"},{"location":"api/observables/#Rocket.MissingOnScheduledSubscribeImplementationError","page":"Observables","title":"Rocket.MissingOnScheduledSubscribeImplementationError","text":"This error will be thrown if Julia cannot find specific method of 'on_subscribe!()' function for given subscribable, actor and scheduler\n\nSee also: on_subscribe!\n\n\n\n\n\n","category":"type"},{"location":"operators/mathematical/sum/#operator_sum","page":"sum","title":"Sum Operator","text":"","category":"section"},{"location":"operators/mathematical/sum/","page":"sum","title":"sum","text":"sum","category":"page"},{"location":"operators/mathematical/sum/#Base.sum","page":"sum","title":"Base.sum","text":"sum(; from = nothing)\n\nCreates a sum operator, which applies a sum accumulator function over the source Observable, and returns the accumulated result when the source completes, given an optional initial value.\n\nThe sum operator is similar to reduce(T, T, +) (see reduce).\n\nArguments\n\nfrom: optional initial accumulation value, if nothing first value will be used instead\n\nProducing\n\nStream of type <: Subscribable{L} where L refers to type of source stream\n\nExamples\n\nusing Rocket\n\nsource = from([ i for i in 1:42 ])\nsubscribe!(source |> sum(), logger())\n;\n\n# output\n\n[LogActor] Data: 903\n[LogActor] Completed\n\n\nusing Rocket\n\nsource = from([ i for i in 1:42 ])\nsubscribe!(source |> sum(from = 97), logger())\n;\n\n# output\n\n[LogActor] Data: 1000\n[LogActor] Completed\n\n\nSee also: AbstractOperator, InferableOperator, ProxyObservable, reduce, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/mathematical/sum/#Description","page":"sum","title":"Description","text":"","category":"section"},{"location":"operators/mathematical/sum/","page":"sum","title":"sum","text":"sum operates on an Observable of objects on which + is defined. When the source Observable completes, it emits the sum of all previous items. The sum operator is similar to reduce(T, T, +) (see reduce).","category":"page"},{"location":"operators/mathematical/sum/#See-also","page":"sum","title":"See also","text":"","category":"section"},{"location":"operators/mathematical/sum/","page":"sum","title":"sum","text":"Operators, reduce","category":"page"},{"location":"actors/types/void/#actor_void","page":"Void","title":"Void actor","text":"","category":"section"},{"location":"actors/types/void/","page":"Void","title":"Void","text":"void","category":"page"},{"location":"actors/types/void/#Rocket.void","page":"Void","title":"Rocket.void","text":"void()\nvoid(::Type{T}) where T\n\nCreation operator for the VoidActor actor.\n\nExamples\n\nusing Rocket\n\nactor = void(Int)\nactor isa VoidActor{Int}\n\n# output\ntrue\n\n\nSee also: VoidActor, AbstractActor\n\n\n\n\n\n","category":"function"},{"location":"actors/types/void/","page":"Void","title":"Void","text":"VoidActor","category":"page"},{"location":"actors/types/void/#Rocket.VoidActor","page":"Void","title":"Rocket.VoidActor","text":"VoidActor{D}() where D\n\nVoid actor does nothing with input data, error and complete events, can be useful for debugging (e.g. to start side-effects with tap operator)\n\nExamples\n\nusing Rocket\n\nsource = from([ 0, 1, 2 ])\nactor = VoidActor{Int}()\n\nsubscribe!(source, actor)\n;\n\n# output\n\n\nSee also: Actor, void, tap\n\n\n\n\n\n","category":"type"},{"location":"observables/types/proxy/#observable_proxy","page":"Proxy","title":"Proxy Observable","text":"","category":"section"},{"location":"observables/types/proxy/","page":"Proxy","title":"Proxy","text":"ProxyObservable might help to create a custom operator. It wraps either source and/or actor with their proxied versions providing additional custom logic for on_subscribe! and/or for on_next!, on_error!, on_complete! methods.","category":"page"},{"location":"observables/types/proxy/","page":"Proxy","title":"Proxy","text":"proxy\nProxyObservable","category":"page"},{"location":"observables/types/proxy/#Rocket.proxy","page":"Proxy","title":"Rocket.proxy","text":"proxy(::Type{L}, source, proxy) where L\n\nCreation operator for the ProxyObservable with a given source and proxy objects.\n\nExample\n\nusing Rocket\n\nsource = from(1:5)\n\nstruct MyCustomProxy <: ActorProxy end\n\nstruct MyCustomActor{A} <: Actor{Int}\n actor :: A\nend\n\nRocket.on_next!(actor::MyCustomActor, data::Int) = next!(actor.actor, data ^ 2)\nRocket.on_error!(actor::MyCustomActor, err) = error!(actor.actor, err)\nRocket.on_complete!(actor::MyCustomActor) = complete!(actor.actor)\n\nRocket.actor_proxy!(::Type{Int}, proxy::MyCustomProxy, actor::A) where A = MyCustomActor{A}(actor)\n\nproxied = proxy(Int, source, MyCustomProxy())\n\nsubscribe!(proxied, logger())\n;\n\n# output\n\n[LogActor] Data: 1\n[LogActor] Data: 4\n[LogActor] Data: 9\n[LogActor] Data: 16\n[LogActor] Data: 25\n[LogActor] Completed\n\nSee also: ProxyObservable, ActorProxy, SourceProxy, ActorSourceProxy\n\n\n\n\n\n","category":"function"},{"location":"observables/types/proxy/#Rocket.ProxyObservable","page":"Proxy","title":"Rocket.ProxyObservable","text":"ProxyObservable{L, S, P}(proxied_source::S, proxy::P)\n\nAn interface for proxied Observables.\n\nSee also: proxy\n\n\n\n\n\n","category":"type"},{"location":"observables/types/proxy/","page":"Proxy","title":"Proxy","text":"ActorProxy\nSourceProxy\nActorSourceProxy","category":"page"},{"location":"observables/types/proxy/#Rocket.ActorProxy","page":"Proxy","title":"Rocket.ActorProxy","text":"ActorProxy\n\nCan be used as a super type for common proxy object. Automatically specifies ValidActorProxy trait behavior. Each ActorProxy must implement its own method for actor_proxy!(::Type, proxy, actor) function which have to return a valid actor object.\n\nSee also: proxy, actor_proxy!\n\n\n\n\n\n","category":"type"},{"location":"observables/types/proxy/#Rocket.SourceProxy","page":"Proxy","title":"Rocket.SourceProxy","text":"SourceProxy\n\nCan be used as a super type for common proxy object. Automatically specifies ValidSourceProxy trait behavior. Each SourceProxy must implement its own method for source_proxy!(::Type, proxy, source) function which have to return a valid subscribable object.\n\nSee also: proxy, source_proxy!\n\n\n\n\n\n","category":"type"},{"location":"observables/types/proxy/#Rocket.ActorSourceProxy","page":"Proxy","title":"Rocket.ActorSourceProxy","text":"ActorSourceProxy\n\nCan be used as a super type for common proxy object. Automatically specifies ValidActorSourceProxy trait behavior. Each ActorSourceProxy must implement its own method for source_proxy!(::Type, proxy, source) function which have to return a valid subscribable object and also for actor_proxy!(::Type, proxy, actor) function which have to return a valid actor object..\n\nSee also: proxy, actor_proxy!, source_proxy!\n\n\n\n\n\n","category":"type"},{"location":"observables/types/proxy/","page":"Proxy","title":"Proxy","text":"actor_proxy!\nsource_proxy!","category":"page"},{"location":"observables/types/proxy/#Rocket.actor_proxy!","page":"Proxy","title":"Rocket.actor_proxy!","text":"actor_proxy!(::Type, proxy, actor)\n\nThis is function is used to wrap an actor with its proxied version given a particular proxy object. Must return another actor. Each valid ActorProxy and ActorSourceProxy must implement its own method for actor_proxy! function. The first argument is the same as the type of data of the connected proxy observable.\n\nSee also: proxy, ActorProxy, ActorSourceProxy\n\n\n\n\n\n","category":"function"},{"location":"observables/types/proxy/#Rocket.source_proxy!","page":"Proxy","title":"Rocket.source_proxy!","text":"source_proxy!(::Type, proxy, source)\n\nThis is function is used to wrap a source with its proxied version given a particular proxy object. Must return another Observable. Each valid SourceProxy and ActorSourceProxy must implement its own method for source_proxy! function. The first argument is the same as the type of data of the connected proxy observable.\n\nSee also: proxy, SourceProxy, ActorSourceProxy\n\n\n\n\n\n","category":"function"},{"location":"operators/transformation/to_array/#operator_to_array","page":"to_array","title":"Uppercase Operator","text":"","category":"section"},{"location":"operators/transformation/to_array/","page":"to_array","title":"to_array","text":"to_array","category":"page"},{"location":"operators/transformation/to_array/#Rocket.to_array","page":"to_array","title":"Rocket.to_array","text":"to_array()\n\nCreates a to_array operator, which reduces all values into a single array and returns this result when the source completes.\n\nProducing\n\nStream of type <: Subscribable{Vector{L}} where L refers to type of source stream\n\nExamples\n\nusing Rocket\n\nsource = from([ 1, 2, 3 ])\nsubscribe!(source |> to_array(), logger())\n;\n\n# output\n\n[LogActor] Data: [1, 2, 3]\n[LogActor] Completed\n\n\nSee also: AbstractOperator, InferableOperator, ProxyObservable, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/transformation/to_array/#See-also","page":"to_array","title":"See also","text":"","category":"section"},{"location":"operators/transformation/to_array/","page":"to_array","title":"to_array","text":"Operators, map, lowercase","category":"page"},{"location":"operators/transformation/about/#Transformation-category","page":"About transformation operators","title":"Transformation category","text":"","category":"section"},{"location":"operators/transformation/about/","page":"About transformation operators","title":"About transformation operators","text":"There are operators for different purposes, and they may be categorized as: creation, transformation, filtering, joining, multicasting, error handling, utility, etc. In the following list you will find all the operators organized in transformation category.","category":"page"},{"location":"operators/transformation/about/","page":"About transformation operators","title":"About transformation operators","text":"map\nmap_to\nscan\naccumulated\nenumerate\nuppercase\nlowercase\nto_array\nswitch_map\nswitch_map_to\nmerge_map\nconcat_map\nconcat_map_to\nexhaust_map\nstart_with\npairwise\nsubstitute\noverride","category":"page"},{"location":"operators/transformation/about/#See-also","page":"About transformation operators","title":"See also","text":"","category":"section"},{"location":"operators/transformation/about/","page":"About transformation operators","title":"About transformation operators","text":"Operators","category":"page"}] } diff --git a/dev/subjects/about/index.html b/dev/subjects/about/index.html index 1da54136c..016ba1e89 100644 --- a/dev/subjects/about/index.html +++ b/dev/subjects/about/index.html @@ -1,5 +1,5 @@ -Subject · Rocket.jl

About subjects

A Rocket.jl Subject is a special type of Observable that allows values to be multicasted to many Actors. While plain Observables are unicast (each subscribed Actor owns an independent execution of the Observable), Subjects are multicast.

Note

A Subject is like an Observable, but can multicast to many Actors. Subjects are like event emitters: they maintain a registry of many listeners.

Every Subject is an Observable. Given a Subject, you can subscribe to it, providing an Actor, which will start receiving values normally. From the perspective of the Actor, it cannot tell whether the Observable execution is coming from a plain unicast Observable or a Subject.

Internally to the Subject, subscribe! does not invoke a new execution that delivers values. Instead, it simply registers the given Actor in a list of Actors.

Every Subject is an Actor itself. It is an object with the methods next!, error!, and complete!. Call next!(subject, theValue) to feed a new value to the Subject, and it will be multicasted to the Actors that listen to the Subject.

In the example below, we have two Observers attached to a Subject, and we feed some values to the Subject:

using Rocket
+Subject · Rocket.jl

About subjects

A Rocket.jl Subject is a special type of Observable that allows values to be multicasted to many Actors. While plain Observables are unicast (each subscribed Actor owns an independent execution of the Observable), Subjects are multicast.

Note

A Subject is like an Observable, but can multicast to many Actors. Subjects are like event emitters: they maintain a registry of many listeners.

Every Subject is an Observable. Given a Subject, you can subscribe to it, providing an Actor, which will start receiving values normally. From the perspective of the Actor, it cannot tell whether the Observable execution is coming from a plain unicast Observable or a Subject.

Internally to the Subject, subscribe! does not invoke a new execution that delivers values. Instead, it simply registers the given Actor in a list of Actors.

Every Subject is an Actor itself. It is an object with the methods next!, error!, and complete!. Call next!(subject, theValue) to feed a new value to the Subject, and it will be multicasted to the Actors that listen to the Subject.

In the example below, we have two Observers attached to a Subject, and we feed some values to the Subject:

using Rocket
 
 source = Subject(Int)
 
@@ -40,7 +40,7 @@
 # Actor 1: 2
 # Actor 2: 2
 # Actor 1: 3
-# Actor 2: 3

Here, we essentially convert a unicast Observable execution to multicast, through the Subject. This demonstrates how Subjects offer a unique way to share Observable execution with multiple Observers.

Schedulers

A Subject (and some other observables) uses scheduler objects to schedule message delivery to their listeners.

Synchronous scheduler

One of the variants of schedulers is the AsapScheduler, which delivers every message synchronously. AsapScheduler is a default scheduler for all Subject objects.

Rocket.AsapSchedulerType
AsapScheduler

AsapScheduler executes scheduled actions as soon as possible and does not introduce any additional logic. AsapScheduler is a default scheduler for almost all observables.

source
using Rocket
+# Actor 2: 3

Here, we essentially convert a unicast Observable execution to multicast, through the Subject. This demonstrates how Subjects offer a unique way to share Observable execution with multiple Observers.

Schedulers

A Subject (and some other observables) uses scheduler objects to schedule message delivery to their listeners.

Synchronous scheduler

One of the variants of schedulers is the AsapScheduler, which delivers every message synchronously. AsapScheduler is a default scheduler for all Subject objects.

Rocket.AsapSchedulerType
AsapScheduler

AsapScheduler executes scheduled actions as soon as possible and does not introduce any additional logic. AsapScheduler is a default scheduler for almost all observables.

source
using Rocket
 
 subject = Subject(Int, scheduler = AsapScheduler())
 
@@ -61,7 +61,7 @@
 # [Actor 1] Data: 2
 # After next
 # [Actor 1] Data: 3
-# [Actor 2] Data: 3

Asynchronous Scheduler

An AsyncScheduler is similar to a AsapScheduler. Both allows for Subject to scheduler their messages for multiple listeners, but a AsyncScheduler delivers all messages asynchronously (but still ordered) using a Julia's built-in Task object.

Rocket.AsyncSchedulerType
AsyncScheduler

AsyncScheduler executes scheduled actions asynchronously and uses Channel object to order different actions on a single asynchronous task

source
using Rocket
+# [Actor 2] Data: 3

Asynchronous Scheduler

An AsyncScheduler is similar to a AsapScheduler. Both allows for Subject to scheduler their messages for multiple listeners, but a AsyncScheduler delivers all messages asynchronously (but still ordered) using a Julia's built-in Task object.

Rocket.AsyncSchedulerType
AsyncScheduler

AsyncScheduler executes scheduled actions asynchronously and uses Channel object to order different actions on a single asynchronous task

source
using Rocket
 
 subject = Subject(Int, scheduler = AsyncScheduler())
 
@@ -83,4 +83,4 @@
 # [Actor 1] Data: 2
 # [Actor 1] Data: 3
 # [Actor 2] Data: 3
-
+
diff --git a/dev/subjects/types/behavior/index.html b/dev/subjects/types/behavior/index.html index 10a3ba0b4..cc76e1c6d 100644 --- a/dev/subjects/types/behavior/index.html +++ b/dev/subjects/types/behavior/index.html @@ -1,9 +1,9 @@ -Behavior · Rocket.jl

BehaviorSubject

Rocket.BehaviorSubjectFunction
BehaviorSubject(value::D) where D
+Behavior · Rocket.jl

BehaviorSubject

Rocket.BehaviorSubjectFunction
BehaviorSubject(value::D) where D
 BehaviorSubject(::Type{D}, value) where D
 BehaviorSubject(::Type{D}, value, factory::F) where { D, F <: AbstractSubjectFactory }
-BehaviorSubject(::Type{D}, value, subject::S) where { D, S }

A variant of Subject that requires an initial value and emits its current value whenever it is subscribed to.

See also: BehaviorSubjectFactory, Subject, SubjectFactory

source

Description

One of the variants of Subjects is the BehaviorSubject, which has a notion of "the current value". It stores the latest value emitted to its consumers, and whenever a new Observer subscribes, it will immediately receive the "current value" from the BehaviorSubject.

Note

BehaviorSubjects are useful for representing "values over time". For instance, an event stream of birthdays is a Subject, but the stream of a person's age would be a BehaviorSubject.

Examples

In the following example, the BehaviorSubject is initialized with the value 0 which the first Observer receives when it subscribes. The second Observer receives the value 2 even though it subscribed after the value 2 was sent.

using Rocket
+BehaviorSubject(::Type{D}, value, subject::S) where { D, S }

A variant of Subject that requires an initial value and emits its current value whenever it is subscribed to.

See also: BehaviorSubjectFactory, Subject, SubjectFactory

source

Description

One of the variants of Subjects is the BehaviorSubject, which has a notion of "the current value". It stores the latest value emitted to its consumers, and whenever a new Observer subscribes, it will immediately receive the "current value" from the BehaviorSubject.

Note

BehaviorSubjects are useful for representing "values over time". For instance, an event stream of birthdays is a Subject, but the stream of a person's age would be a BehaviorSubject.

Examples

In the following example, the BehaviorSubject is initialized with the value 0 which the first Observer receives when it subscribes. The second Observer receives the value 2 even though it subscribed after the value 2 was sent.

using Rocket
 
 subject = BehaviorSubject(Int, 0)
 
@@ -25,4 +25,4 @@
 // [1] Data: 2
 // [2] Data: 2
 // [1] Data: 3
-// [2] Data: 3
+// [2] Data: 3 diff --git a/dev/subjects/types/pending/index.html b/dev/subjects/types/pending/index.html index 18d0dd3f3..7c3d36bfe 100644 --- a/dev/subjects/types/pending/index.html +++ b/dev/subjects/types/pending/index.html @@ -1,8 +1,8 @@ -Pending · Rocket.jl

PendingSubject

Rocket.PendingSubjectFunction
PendingSubject(::Type{D}) where D
+Pending · Rocket.jl

PendingSubject

Rocket.PendingSubjectFunction
PendingSubject(::Type{D}) where D
 PendingSubject(::Type{D}, factory::F) where { D, F <: AbstractFactory }
-PendingSubject(::Type{D}, subject::S) where { D, S }

A variant of Subject that emits its last value on completion. Reemits last value on further subscriptions and then completes.

See also: PendingSubjectFactory, Subject, SubjectFactory

source

Description

A variant of Subject that only emits a value when it completes. It will emit its latest value to all its observers on completion. It will reemit its latest value to all new observers on further subscription and then complete. It is not possible to overwrite last value after completion.

Examples

using Rocket
+PendingSubject(::Type{D}, subject::S) where { D, S }

A variant of Subject that emits its last value on completion. Reemits last value on further subscriptions and then completes.

See also: PendingSubjectFactory, Subject, SubjectFactory

source

Description

A variant of Subject that only emits a value when it completes. It will emit its latest value to all its observers on completion. It will reemit its latest value to all new observers on further subscription and then complete. It is not possible to overwrite last value after completion.

Examples

using Rocket
 
 subject = PendingSubject(Int)
 
@@ -24,4 +24,4 @@
 [1] Completed
 [2] Completed
 [3] Data: 3
-[3] Completed
+[3] Completed diff --git a/dev/subjects/types/recent/index.html b/dev/subjects/types/recent/index.html index 5944d142a..b74d782b8 100644 --- a/dev/subjects/types/recent/index.html +++ b/dev/subjects/types/recent/index.html @@ -1,8 +1,8 @@ -Recent · Rocket.jl

RecentSubject

Rocket.RecentSubjectFunction
RecentSubject(::Type{D}) where D
+Recent · Rocket.jl

RecentSubject

Rocket.RecentSubjectFunction
RecentSubject(::Type{D}) where D
 RecentSubject(::Type{D}, factory::F) where { D, F <: AbstractSubjectFactory }
-RecentSubject(::Type{D}, subject::S) where { D, S }

A variant of Subject that emits its recent value whenever it is subscribed to.

See also: RecentSubjectFactory, Subject, SubjectFactory

source

Description

One of the variants of Subjects is the RecentSubject, which has a notion of "the recent value". It stores the latest value emitted to its consumers, and whenever a new Observer subscribes, it will immediately receive the "recent value" from the RecentSubject.

Note

RecentSubjects is a more efficient version of ReplaySubjects with replay size equal to one.

Examples

In the following example, after RecentSubject is initialized the first Observer receives nothing when it subscribes. The second Observer receives the value 2 even though it subscribed after the value 2 was sent.

using Rocket
+RecentSubject(::Type{D}, subject::S) where { D, S }

A variant of Subject that emits its recent value whenever it is subscribed to.

See also: RecentSubjectFactory, Subject, SubjectFactory

source

Description

One of the variants of Subjects is the RecentSubject, which has a notion of "the recent value". It stores the latest value emitted to its consumers, and whenever a new Observer subscribes, it will immediately receive the "recent value" from the RecentSubject.

Note

RecentSubjects is a more efficient version of ReplaySubjects with replay size equal to one.

Examples

In the following example, after RecentSubject is initialized the first Observer receives nothing when it subscribes. The second Observer receives the value 2 even though it subscribed after the value 2 was sent.

using Rocket
 
 subject = RecentSubject(Int)
 
@@ -23,4 +23,4 @@
 // [1] Data: 2
 // [2] Data: 2
 // [1] Data: 3
-// [2] Data: 3
+// [2] Data: 3 diff --git a/dev/subjects/types/replay/index.html b/dev/subjects/types/replay/index.html index 550930093..873699a35 100644 --- a/dev/subjects/types/replay/index.html +++ b/dev/subjects/types/replay/index.html @@ -1,8 +1,8 @@ -Replay · Rocket.jl

ReplaySubject

Rocket.ReplaySubjectFunction
ReplaySubject(::Type{D}, size::Int) where D
+Replay · Rocket.jl

ReplaySubject

Rocket.ReplaySubjectFunction
ReplaySubject(::Type{D}, size::Int) where D
 ReplaySubject(::Type{D}, size::Int, factory::F) where { D, F <: AbstractSubjectFactory }
-ReplaySubject(::Type{D}, size::Int, subject::S) where { D, S }

A variant of Subject that "replays" or emits old values to new subscribers. It buffers a set number of values and will emit those values immediately to any new subscribers in addition to emitting new values to existing subscribers.

See also: ReplaySubjectFactory, Subject, SubjectFactory

source

Description

A ReplaySubject is similar to a BehaviorSubject in that it can send old values to new subscribers, but it can also record a part of the Observable execution.

Note

A ReplaySubject records multiple values from the Observable execution and replays them to new subscribers.

Examples

When creating a ReplaySubject, you can specify how many values to replay:

using Rocket
+ReplaySubject(::Type{D}, size::Int, subject::S) where { D, S }

A variant of Subject that "replays" or emits old values to new subscribers. It buffers a set number of values and will emit those values immediately to any new subscribers in addition to emitting new values to existing subscribers.

See also: ReplaySubjectFactory, Subject, SubjectFactory

source

Description

A ReplaySubject is similar to a BehaviorSubject in that it can send old values to new subscribers, but it can also record a part of the Observable execution.

Note

A ReplaySubject records multiple values from the Observable execution and replays them to new subscribers.

Examples

When creating a ReplaySubject, you can specify how many values to replay:

using Rocket
 
 subject = ReplaySubject(Int, 3) # buffer 3 values for new subscribers
 
@@ -29,4 +29,4 @@
 // [2] Data: 3
 // [2] Data: 4
 // [1] Data: 5
-// [2] Data: 5
+// [2] Data: 5 diff --git a/dev/subjects/types/subject/index.html b/dev/subjects/types/subject/index.html index 0a79dba73..e992b93c9 100644 --- a/dev/subjects/types/subject/index.html +++ b/dev/subjects/types/subject/index.html @@ -1,5 +1,5 @@ -Subject · Rocket.jl

Subject

Rocket.SubjectType
Subject(::Type{D}; scheduler::H = AsapScheduler())

A Subject is a special type of Observable that allows values to be multicasted to many Observers. Subjects are like EventEmitters. Every Subject is an Observable and an Actor. You can subscribe to a Subject, and you can call next! to feed values as well as error! and complete!.

Note: By convention, every actor subscribed to a Subject observable is not allowed to throw exceptions during next!, error! and complete! calls. Doing so would lead to undefined behaviour. Use safe() operator to bypass this rule.

See also: SubjectFactory, ReplaySubject, BehaviorSubject, safe

source

Description

Every Subject is an Observable. Given a Subject, you can subscribe to it, providing an Actor, which will start receiving values normally. From the perspective of the Observer, it cannot tell whether the Observable execution is coming from a plain unicast Observable or a Subject.

Internally to the Subject, subscribe does not invoke a new execution that delivers values. It simply registers the given Observer in a list of Observers.

Every Subject is an Actor. It is an object with the methods next!, error!, and complete!. To feed a new value to the Subject, just call next!(subject, theValue), and it will be multicasted to the Actors registered to listen to the Subject.

Note

By convention, every actor subscribed to a Subject observable is not allowed to throw exceptions during next!, error! and complete! calls. Doing so would lead to undefined behaviour. Use safe() operator to bypass this rule.

Examples

In the following example, the BehaviorSubject is initialized with the value 0 which the first Observer receives when it subscribes. The second Observer receives the value 2 even though it subscribed after the value 2 was sent.

using Rocket
+Subject · Rocket.jl

Subject

Rocket.SubjectType
Subject(::Type{D}; scheduler::H = AsapScheduler())

A Subject is a special type of Observable that allows values to be multicasted to many Observers. Subjects are like EventEmitters. Every Subject is an Observable and an Actor. You can subscribe to a Subject, and you can call next! to feed values as well as error! and complete!.

Note: By convention, every actor subscribed to a Subject observable is not allowed to throw exceptions during next!, error! and complete! calls. Doing so would lead to undefined behaviour. Use safe() operator to bypass this rule.

See also: SubjectFactory, ReplaySubject, BehaviorSubject, safe

source

Description

Every Subject is an Observable. Given a Subject, you can subscribe to it, providing an Actor, which will start receiving values normally. From the perspective of the Observer, it cannot tell whether the Observable execution is coming from a plain unicast Observable or a Subject.

Internally to the Subject, subscribe does not invoke a new execution that delivers values. It simply registers the given Observer in a list of Observers.

Every Subject is an Actor. It is an object with the methods next!, error!, and complete!. To feed a new value to the Subject, just call next!(subject, theValue), and it will be multicasted to the Actors registered to listen to the Subject.

Note

By convention, every actor subscribed to a Subject observable is not allowed to throw exceptions during next!, error! and complete! calls. Doing so would lead to undefined behaviour. Use safe() operator to bypass this rule.

Examples

In the following example, the BehaviorSubject is initialized with the value 0 which the first Observer receives when it subscribes. The second Observer receives the value 2 even though it subscribed after the value 2 was sent.

using Rocket
 
 subject = Subject(Int)
 
@@ -19,4 +19,4 @@
 // [1] Data: 1
 // [1] Data: 2
 // [1] Data: 3
-// [2] Data: 3
+// [2] Data: 3
diff --git a/dev/teardown/about/index.html b/dev/teardown/about/index.html index 97c017f28..64e77263e 100644 --- a/dev/teardown/about/index.html +++ b/dev/teardown/about/index.html @@ -1,5 +1,5 @@ -Subscription · Rocket.jl

Subscription

A Subscription represents a disposable resource, usually the execution of an Observable. A Subscription has one important method: unsubscribe!(teardown), which takes some teardown logic object as one argument and disposes the resource held by the subscription.

using Rocket
+Subscription · Rocket.jl

Subscription

A Subscription represents a disposable resource, usually the execution of an Observable. A Subscription has one important method: unsubscribe!(teardown), which takes some teardown logic object as one argument and disposes the resource held by the subscription.

using Rocket
 
 source = Subject(Int)
 
@@ -21,4 +21,4 @@
 
 # or similarly
 # unsubscribe!([ subscription1, subscription2 ])
-

For more information about subscription and teardown logic see the API Section

+

For more information about subscription and teardown logic see the API Section

diff --git a/dev/teardown/types/void/index.html b/dev/teardown/types/void/index.html index a664b4c3f..1c1a1d136 100644 --- a/dev/teardown/types/void/index.html +++ b/dev/teardown/types/void/index.html @@ -1,2 +1,2 @@ -Void · Rocket.jl
+Void · Rocket.jl
diff --git a/dev/todo/index.html b/dev/todo/index.html index 31e3c477b..af2f469b0 100644 --- a/dev/todo/index.html +++ b/dev/todo/index.html @@ -1,2 +1,2 @@ -TODO · Rocket.jl

TODO

This package in under development and some features of the reactive framework not yet implemented.

+TODO · Rocket.jl

TODO

This package in under development and some features of the reactive framework not yet implemented.

diff --git a/dev/utils/index.html b/dev/utils/index.html index fa86cb2ac..64beef0a8 100644 --- a/dev/utils/index.html +++ b/dev/utils/index.html @@ -1,5 +1,5 @@ -Utils · Rocket.jl

Utils

Rocket.setTimeoutFunction
setTimeout(f::Function, timeout::Int)

Creates a Task which will asynchornously invoke fucntion f after specified timeout time in milliseconds.

Arguments

  • f::Function, function to be invoked asynchronously
  • timeout::Int, timeout in milliseconds

Examples

using Rocket
+Utils · Rocket.jl

Utils

Rocket.setTimeoutFunction
setTimeout(f::Function, timeout::Int)

Creates a Task which will asynchornously invoke fucntion f after specified timeout time in milliseconds.

Arguments

  • f::Function, function to be invoked asynchronously
  • timeout::Int, timeout in milliseconds

Examples

using Rocket
 using Dates
 
 println("Before: ", Dates.format(now(), "MM:SS"))
@@ -12,9 +12,9 @@
 # Logs
 # Before: 20:59
 # Right after: 20:59
-# Inside: 21:00
source
Rocket.combined_typeFunction
combined_type(sources)

Returns a Tuple el-type of observable el-types in sources argument in the same order

source
Rocket.union_typeFunction
union_type(sources)

Returns a Union el-type of observable el-types in sources argument

source

Helpers

Rocket.@MStorageMacro
@MStorage(n::Int)

Helper function to generate tuple-like structure MStorageN, but with mutable fields and empty constructor. It is possible then to take a snapshot(::MStorage) which returns a tuple with the same types and values from storage. Some operators and observables use pregenerated MStorage to instatiate uninitialized mutable storage in case when stream is allowed to not emit any values before completion.

Generated structure layout

struct MStorageN{V1, V2, ..., VN}
+# Inside: 21:00
source
Rocket.combined_typeFunction
combined_type(sources)

Returns a Tuple el-type of observable el-types in sources argument in the same order

source
Rocket.union_typeFunction
union_type(sources)

Returns a Union el-type of observable el-types in sources argument

source

Helpers

Rocket.@MStorageMacro
@MStorage(n::Int)

Helper function to generate tuple-like structure MStorageN, but with mutable fields and empty constructor. It is possible then to take a snapshot(::MStorage) which returns a tuple with the same types and values from storage. Some operators and observables use pregenerated MStorage to instatiate uninitialized mutable storage in case when stream is allowed to not emit any values before completion.

Generated structure layout

struct MStorageN{V1, V2, ..., VN}
     v1 :: V1
     v2 :: V2
     ...
     vn :: VN
-end

See also: setstorage!

source
Rocket.setstorage!Function
setstorage!(s, v, ::Val{I}) where I

This function can be used to set a new value v for storage s with a given value v and index I. Using parametrized Val{I} for indexing ensures for index to be resolved at compile-time and if-else branch optimization.

See also: @MStorage

source
+end

See also: setstorage!

source
Rocket.setstorage!Function
setstorage!(s, v, ::Val{I}) where I

This function can be used to set a new value v for storage s with a given value v and index I. Using parametrized Val{I} for indexing ensures for index to be resolved at compile-time and if-else branch optimization.

See also: @MStorage

source
diff --git a/stable b/stable index 75e47606b..4e2cea3bb 120000 --- a/stable +++ b/stable @@ -1 +1 @@ -v1.7.2 \ No newline at end of file +v1.8.0 \ No newline at end of file diff --git a/v1 b/v1 index 75e47606b..4e2cea3bb 120000 --- a/v1 +++ b/v1 @@ -1 +1 @@ -v1.7.2 \ No newline at end of file +v1.8.0 \ No newline at end of file diff --git a/v1.7 b/v1.7 index 75e47606b..1de48e4cd 120000 --- a/v1.7 +++ b/v1.7 @@ -1 +1 @@ -v1.7.2 \ No newline at end of file +v1.7.4 \ No newline at end of file diff --git a/v1.7.2/.documenter-siteinfo.json b/v1.7.2/.documenter-siteinfo.json new file mode 100644 index 000000000..4ece58693 --- /dev/null +++ b/v1.7.2/.documenter-siteinfo.json @@ -0,0 +1 @@ +{"documenter":{"julia_version":"1.9.4","generation_timestamp":"2024-01-12T14:41:39","documenter_version":"1.2.1"}} \ No newline at end of file diff --git a/v1.7.2/actors/about/index.html b/v1.7.2/actors/about/index.html index 6d2a42558..fb670216b 100644 --- a/v1.7.2/actors/about/index.html +++ b/v1.7.2/actors/about/index.html @@ -1,5 +1,5 @@ -Actor · Rocket.jl

Actors

An Actor is the most primitive unit of computation: it receives a message and performs a computation.

An actor is analogous to an object in an object-oriented languages. An object receives a message (a method call) and does something depending on which message it receives (the method we are calling). The main difference is that actors are completely isolated from each other, and they will never share memory. It’s also worth mentioning that an actor can maintain a private state that should never be changed directly by another actor.

For a quick introduction to Actor models, see this article.

The API of Rocket.jl's Actors is similar to RxJS subscribers.

First example

The following example implements an Actor that retains each received value from an Observable.

using Rocket
+Actor · Rocket.jl

Actors

An Actor is the most primitive unit of computation: it receives a message and performs a computation.

An actor is analogous to an object in an object-oriented languages. An object receives a message (a method call) and does something depending on which message it receives (the method we are calling). The main difference is that actors are completely isolated from each other, and they will never share memory. It’s also worth mentioning that an actor can maintain a private state that should never be changed directly by another actor.

For a quick introduction to Actor models, see this article.

The API of Rocket.jl's Actors is similar to RxJS subscribers.

First example

The following example implements an Actor that retains each received value from an Observable.

using Rocket
 
 struct CustomKeepActor <: Actor{Int}
     values::Vector{Int}
@@ -46,7 +46,7 @@
 # Int: 1
 # Float64: 1.0
 # Something else: string
-

Lambda actor

For debugging purposes it may be convenient to work with a LambdaActor. This provides an interface that defines callbacks for "next", "error" and "complete" events. But this generic actor does not allow to dispatch on type of the event.

using Rocket
+

Lambda actor

For debugging purposes it may be convenient to work with a LambdaActor. This provides an interface that defines callbacks for "next", "error" and "complete" events. But this generic actor does not allow to dispatch on the type of the event.

using Rocket
 
 source = from([1, 2, 3])
 
@@ -69,4 +69,4 @@
 # Logs
 # 1
 # 2
-# 3
+# 3
diff --git a/v1.7.2/actors/types/buffer/index.html b/v1.7.2/actors/types/buffer/index.html index 101aec8c4..9b7bb726c 100644 --- a/v1.7.2/actors/types/buffer/index.html +++ b/v1.7.2/actors/types/buffer/index.html @@ -1,11 +1,11 @@ -Buffer · Rocket.jl

Buffer actor

Rocket.bufferFunction
buffer(::Type{T}, size::Int) where T

Arguments

  • ::Type{T}: Type of data in buffer
  • size::Int: size of buffer

Creation operator for the BufferActor actor.

Examples

using Rocket
+Buffer · Rocket.jl

Buffer actor

Rocket.bufferFunction
buffer(::Type{T}, size::Int) where T

Arguments

  • ::Type{T}: Type of data in buffer
  • size::Int: size of buffer

Creation operator for the BufferActor actor.

Examples

using Rocket
 
 actor = buffer(Int, 3)
 actor isa BufferActor{Int}
 
 # output
-true

See also: BufferActor, AbstractActor

source
Rocket.BufferActorType
BufferActor{D}() where D

Buffer actor provides a storage actor. It copies last incoming successful next events in a values array, throws an ErrorException on error! event and does nothing on completion event. Note: Actor does not check the size of incoming data.

Examples

using Rocket
+true

See also: BufferActor, AbstractActor

source
Rocket.BufferActorType
BufferActor{D}() where D

Buffer actor provides a storage actor. It copies last incoming successful next events in a values array, throws an ErrorException on error! event and does nothing on completion event. Note: Actor does not check the size of incoming data.

Examples

using Rocket
 
 source = of([ 1, 2, 3 ])
 actor  = buffer(Int, 3)
@@ -14,4 +14,4 @@
 show(getvalues(actor))
 
 # output
-[1, 2, 3]

See also: Actor, buffer

source
+[1, 2, 3]

See also: Actor, buffer

source
diff --git a/v1.7.2/actors/types/circularkeep/index.html b/v1.7.2/actors/types/circularkeep/index.html index 2de2aa1f7..9ac27bead 100644 --- a/v1.7.2/actors/types/circularkeep/index.html +++ b/v1.7.2/actors/types/circularkeep/index.html @@ -1,11 +1,11 @@ -CircularKeep · Rocket.jl

CircularKeep actor

Rocket.circularkeepFunction
circularkeep(::Type{T}, capacity::Int) where T

Arguments

  • ::Type{T}: Type of keep data
  • capacity::Int: circular buffer capacity

Creation operator for the CircularKeepActor actor.

Examples

using Rocket
+CircularKeep · Rocket.jl

CircularKeep actor

Rocket.circularkeepFunction
circularkeep(::Type{T}, capacity::Int) where T

Arguments

  • ::Type{T}: Type of keep data
  • capacity::Int: circular buffer capacity

Creation operator for the CircularKeepActor actor.

Examples

using Rocket
 
 actor = circularkeep(Int, 3)
 actor isa CircularKeepActor{Int}
 
 # output
-true

See also: CircularKeepActor, AbstractActor

source
Rocket.CircularKeepActorType
CirucalKeepActor{D}() where D

Circual keep actor is similar to keep actor, but uses CircularBuffer as a storage. It saves all incoming successful next events in a values circular buffer, throws an ErrorException on error! event and does nothing on completion event.

Examples

using Rocket
+true

See also: CircularKeepActor, AbstractActor

source
Rocket.CircularKeepActorType
CirucalKeepActor{D}() where D

Circual keep actor is similar to keep actor, but uses CircularBuffer as a storage. It saves all incoming successful next events in a values circular buffer, throws an ErrorException on error! event and does nothing on completion event.

Examples

using Rocket
 
 source = from(1:5)
 actor  = circularkeep(Int, 3)
@@ -14,4 +14,4 @@
 show(getvalues(actor))
 
 # output
-[3, 4, 5]

See also: Actor, keep, circularkeep

source
+[3, 4, 5]

See also: Actor, keep, circularkeep

source
diff --git a/v1.7.2/actors/types/function/index.html b/v1.7.2/actors/types/function/index.html index 3da132ae4..baa99d1da 100644 --- a/v1.7.2/actors/types/function/index.html +++ b/v1.7.2/actors/types/function/index.html @@ -1,5 +1,5 @@ -Function · Rocket.jl

Function actor

Rocket.FunctionActorType
FunctionActor{D} <: Actor{D}

FunctionActor provides a simple interface to use a single function as a next! callback, error! callback throws an ErrorException and complete! callback does nothing. Should not be used explicitly because it will be created automatically when passing a Function object as an actor in subscribe! function.

Examples

using Rocket
+Function · Rocket.jl

Function actor

Rocket.FunctionActorType
FunctionActor{D} <: Actor{D}

FunctionActor provides a simple interface to use a single function as a next! callback, error! callback throws an ErrorException and complete! callback does nothing. Should not be used explicitly because it will be created automatically when passing a Function object as an actor in subscribe! function.

Examples

using Rocket
 
 source = from(1:5)
 subscribe!(source, (t) -> println(t))
@@ -10,4 +10,4 @@
 2
 3
 4
-5

See also: Actor, subscribe!

source
+5

See also: Actor, subscribe!

source
diff --git a/v1.7.2/actors/types/keep/index.html b/v1.7.2/actors/types/keep/index.html index 166466851..2b9513320 100644 --- a/v1.7.2/actors/types/keep/index.html +++ b/v1.7.2/actors/types/keep/index.html @@ -1,11 +1,11 @@ -Keep · Rocket.jl

Keep actor

Rocket.keepFunction
keep(::Type{T}) where T

Arguments

  • ::Type{T}: Type of keep data

Creation operator for the KeepActor actor.

Examples

using Rocket
+Keep · Rocket.jl

Keep actor

Rocket.keepFunction
keep(::Type{T}) where T

Arguments

  • ::Type{T}: Type of keep data

Creation operator for the KeepActor actor.

Examples

using Rocket
 
 actor = keep(Int)
 actor isa KeepActor{Int}
 
 # output
-true

See also: KeepActor, AbstractActor

source
Rocket.KeepActorType
KeepActor{D}() where D

Keep actor provides a storage actor. It saves all incoming successful next events in a values array, throws an ErrorException on error! event and does nothing on completion event.

Examples

using Rocket
+true

See also: KeepActor, AbstractActor

source
Rocket.KeepActorType
KeepActor{D}() where D

Keep actor provides a storage actor. It saves all incoming successful next events in a values array, throws an ErrorException on error! event and does nothing on completion event.

Examples

using Rocket
 
 source = from(1:5)
 actor  = keep(Int)
@@ -14,4 +14,4 @@
 show(getvalues(actor))
 
 # output
-[1, 2, 3, 4, 5]

See also: Actor, keep

source
+[1, 2, 3, 4, 5]

See also: Actor, keep

source
diff --git a/v1.7.2/actors/types/lambda/index.html b/v1.7.2/actors/types/lambda/index.html index b45dd6d81..b4f708586 100644 --- a/v1.7.2/actors/types/lambda/index.html +++ b/v1.7.2/actors/types/lambda/index.html @@ -1,9 +1,9 @@ -Lambda · Rocket.jl

Lambda actor

Rocket.lambdaFunction
lambda(; on_next = nothing, on_error = nothing, on_complete = nothing)
+Lambda · Rocket.jl

Lambda actor

Rocket.lambdaFunction
lambda(; on_next = nothing, on_error = nothing, on_complete = nothing)
 lambda(::Type{T}; on_next = nothing, on_error = nothing, on_complete = nothing) where T

Creation operator for the 'LambdaActor' actor.

Examples

using Rocket
 
 actor = lambda(Int; on_next = (d) -> println(d))
 actor isa LambdaActor{Int}
 
 # output
-true

See also: LambdaActor, AbstractActor

source
Rocket.LambdaActorType
LambdaActor{D, N, E, C}(on_next::N, on_error::E, on_complete::C) where D

Lambda actor wraps on_next, on_error, on_complete callbacks for data, error and complete events. Should not be used explicitly, use lambda creation operator instead.

Constructor arguments

  • on_next: Callback for data event. Optional. Default is nothing.
  • on_error: Callback for error event. Optional. Default is nothing.
  • on_complete: Callback for complete event. Optional. Default is nothing.

See also: Actor, lambda

source
+true

See also: LambdaActor, AbstractActor

source
Rocket.LambdaActorType
LambdaActor{D, N, E, C}(on_next::N, on_error::E, on_complete::C) where D

Lambda actor wraps on_next, on_error, on_complete callbacks for data, error and complete events. Should not be used explicitly, use lambda creation operator instead.

Constructor arguments

  • on_next: Callback for data event. Optional. Default is nothing.
  • on_error: Callback for error event. Optional. Default is nothing.
  • on_complete: Callback for complete event. Optional. Default is nothing.

See also: Actor, lambda

source
diff --git a/v1.7.2/actors/types/logger/index.html b/v1.7.2/actors/types/logger/index.html index e63c638d0..1d1ccff87 100644 --- a/v1.7.2/actors/types/logger/index.html +++ b/v1.7.2/actors/types/logger/index.html @@ -1,5 +1,5 @@ -Logger · Rocket.jl

Logger actor

Rocket.loggerFunction
logger([ io::IO ], name::String = "LogActor")
+Logger · Rocket.jl

Logger actor

Rocket.loggerFunction
logger([ io::IO ], name::String = "LogActor")
 logger(::Type{T}, [ io::IO ], name::String = "LogActor") where T

Creation operator for the LoggerActor actor.

Examples

using Rocket
 
 source = from([ 0, 1, 2 ])
@@ -36,4 +36,4 @@
 [CustomBuffer] Data: 0
 [CustomBuffer] Data: 1
 [CustomBuffer] Data: 2
-[CustomBuffer] Completed

See also: LoggerActor, AbstractActor

source
Rocket.LoggerActorType
LoggerActor{D}(name::String = "LogActor", io::O) where { D, O }

The LoggerActor logs all next!/error!/complete! events that are sent from an Observable.

Constructor arguments

  • name: name of the logger. Optional. Default is LogActor.
  • io: io stream to log in, maybe nothing to write to stdout

See also: Actor, logger

source
+[CustomBuffer] Completed

See also: LoggerActor, AbstractActor

source
Rocket.LoggerActorType
LoggerActor{D}(name::String = "LogActor", io::O) where { D, O }

The LoggerActor logs all next!/error!/complete! events that are sent from an Observable.

Constructor arguments

  • name: name of the logger. Optional. Default is LogActor.
  • io: io stream to log in, maybe nothing to write to stdout

See also: Actor, logger

source
diff --git a/v1.7.2/actors/types/server/index.html b/v1.7.2/actors/types/server/index.html index e28114eb7..1e359ec81 100644 --- a/v1.7.2/actors/types/server/index.html +++ b/v1.7.2/actors/types/server/index.html @@ -1,5 +1,5 @@ -Server · Rocket.jl

Server actor

Rocket.serverFunction
server(port::Int)
+Server · Rocket.jl

Server actor

Rocket.serverFunction
server(port::Int)
 server(address::A, port::Int) where { A <: IPAddr }
 server(::Type{D}, port::Int)
-server(::Type{D}, address::A, port::Int) where { A <: IPAddr }

Creation operator for the ServerActor actor.

See also: AbstractActor

source
Rocket.ServerActorType
ServerActor{D, Address, Port}() where D

The ServerActor sends all next!/error!/complete! events to the local network listeners with specified Address and Port parameters via TCPSocket.

See also: Actor, server

source
+server(::Type{D}, address::A, port::Int) where { A <: IPAddr }

Creation operator for the ServerActor actor.

See also: AbstractActor

source
Rocket.ServerActorType
ServerActor{D, Address, Port}() where D

The ServerActor sends all next!/error!/complete! events to the local network listeners with specified Address and Port parameters via TCPSocket.

See also: Actor, server

source
diff --git a/v1.7.2/actors/types/storage/index.html b/v1.7.2/actors/types/storage/index.html index 22f07dc1f..a99910570 100644 --- a/v1.7.2/actors/types/storage/index.html +++ b/v1.7.2/actors/types/storage/index.html @@ -1,11 +1,11 @@ -Storage · Rocket.jl

Storage actor

Rocket.storageFunction
storage(::Type{T}) where T

Arguments

  • ::Type{T}: Type of storage data

Creation operator for the StorageActor actor.

Examples

using Rocket
+Storage · Rocket.jl

Storage actor

Rocket.storageFunction
storage(::Type{T}) where T

Arguments

  • ::Type{T}: Type of storage data

Creation operator for the StorageActor actor.

Examples

using Rocket
 
 actor = storage(Int)
 actor isa StorageActor{Int}
 
 # output
-true

See also: StorageActor, AbstractActor

source
Rocket.StorageActorType
StorageActor{D}() where D

Storage actor provides an actor that stores a single (last) value passed to the next! callback. It saves last incoming successful next event in the value field, throws an ErrorException on error! event and does nothing on completion event. Before any events value initialised with nothing.

Examples

using Rocket
+true

See also: StorageActor, AbstractActor

source
Rocket.StorageActorType
StorageActor{D}() where D

Storage actor provides an actor that stores a single (last) value passed to the next! callback. It saves last incoming successful next event in the value field, throws an ErrorException on error! event and does nothing on completion event. Before any events value initialised with nothing.

Examples

using Rocket
 
 source = from(1:5)
 actor  = storage(Int)
@@ -14,4 +14,4 @@
 show(getvalues(actor))
 
 # output
-5

See also: Actor, storage

source
+5

See also: Actor, storage

source
diff --git a/v1.7.2/actors/types/sync/index.html b/v1.7.2/actors/types/sync/index.html index 9f7a2d104..59c61aecc 100644 --- a/v1.7.2/actors/types/sync/index.html +++ b/v1.7.2/actors/types/sync/index.html @@ -1,5 +1,5 @@ -Sync · Rocket.jl

Sync actor

Rocket.syncFunction
sync(actor::A; withlock::Bool = true, timeout::Int = -1) where A
+Sync · Rocket.jl

Sync actor

Rocket.syncFunction
sync(actor::A; withlock::Bool = true, timeout::Int = -1) where A
 sync(factory::F; withlock::Bool = true, timeout::Int = -1) where { F <: AbstractActorFactory }

Creation operator for the SyncActor actor. Accepts optional named timeout argument which specifies maximum number of milliseconds to wait (throws SyncActorTimedOutException() on timeout). Also accepts optional withlock boolean flag indicating that every next!, error! and complete! event should be guarded with ReentrantLock.

Examples

using Rocket
 
 actor  = keep(Int)
@@ -28,4 +28,4 @@
 show(values)
 
 # output
-[0, 1, 2, 3, 4, 5]

See also: SyncActor, AbstractActor

source
Rocket.SyncActorType
SyncActor{T, A}(actor::A; withlock::Bool = true, timeout::Int = -1) where { T, A }

Sync actor provides a synchronized interface to wait for an actor to be notified with a complete event. By default creates a re-entrant lock for synchronizing next!, error! and complete! events.

See also: Actor, sync

source
+[0, 1, 2, 3, 4, 5]

See also: SyncActor, AbstractActor

source
Rocket.SyncActorType
SyncActor{T, A}(actor::A; withlock::Bool = true, timeout::Int = -1) where { T, A }

Sync actor provides a synchronized interface to wait for an actor to be notified with a complete event. By default creates a re-entrant lock for synchronizing next!, error! and complete! events.

See also: Actor, sync

source
diff --git a/v1.7.2/actors/types/void/index.html b/v1.7.2/actors/types/void/index.html index c88599994..86f7ea7e9 100644 --- a/v1.7.2/actors/types/void/index.html +++ b/v1.7.2/actors/types/void/index.html @@ -1,5 +1,5 @@ -Void · Rocket.jl

Void actor

Rocket.voidFunction
void()
+Void · Rocket.jl

Void actor

Rocket.voidFunction
void()
 void(::Type{T}) where T

Creation operator for the VoidActor actor.

Examples

using Rocket
 
 actor = void(Int)
@@ -7,7 +7,7 @@
 
 # output
 true
-

See also: VoidActor, AbstractActor

source
Rocket.VoidActorType
VoidActor{D}() where D

Void actor does nothing with input data, error and complete events, can be useful for debugging (e.g. to start side-effects with tap operator)

Examples

using Rocket
+

See also: VoidActor, AbstractActor

source
Rocket.VoidActorType
VoidActor{D}() where D

Void actor does nothing with input data, error and complete events, can be useful for debugging (e.g. to start side-effects with tap operator)

Examples

using Rocket
 
 source = from([ 0, 1, 2 ])
 actor  = VoidActor{Int}()
@@ -16,4 +16,4 @@
 ;
 
 # output
-

See also: Actor, void, tap

source
+

See also: Actor, void, tap

source
diff --git a/v1.7.2/api/actors/index.html b/v1.7.2/api/actors/index.html index 912ea6faa..f04975a99 100644 --- a/v1.7.2/api/actors/index.html +++ b/v1.7.2/api/actors/index.html @@ -1,5 +1,5 @@ -Actors · Rocket.jl

Actors API

How to create a custom Actor

At first custom actor should implement a custom method for the as_actor function. Rocket.jl also provides a number of helper actor abstract types with predefined as_actor method behavior (see Traits API section).

using Rocket
+Actors · Rocket.jl

Actors API

How to create a custom Actor

At first custom actor should implement a custom method for the as_actor function. Rocket.jl also provides a number of helper actor abstract types with predefined as_actor method behavior (see Traits API section).

using Rocket
 
 struct MyCustomActor end
 
@@ -16,7 +16,7 @@
 
 struct MyCustomCompletionActor <: CompletionActor{Int} end
 
-Rocket.on_complete!(actor::MyCustomCompletionActor) = # custom logic here

Traits

Rocket.as_actorFunction
as_actor(any)

This function checks actor trait behavior specification. May be used explicitly to specify actor trait behavior for any object.

See also: ActorTrait

source
Rocket.BaseActorTraitType

Base actor trait specifies actor to listen for all next!, error! and complete! events. BaseActorTrait is a subtype of ActorTrait.

See also: Actor

source
Rocket.InvalidActorTraitType

Default actor trait behavior for any object. Actor with such a trait specificaion cannot be used as a valid actor in subscribe! function. Doing so will raise an error. InvalidActorTrait is a subtype of ActorTrait.

See also: ActorTrait

source

Types

Rocket.ActorType

Can be used as a super type for common actor. Automatically specifies a BaseActorTrait trait behavior. Every Actor must implement its own methods for on_next!(actor, data), on_error!(actor, err) and on_complete!(actor) functions. Actor is a subtype of AbstractActor type.

Examples

using Rocket
+Rocket.on_complete!(actor::MyCustomCompletionActor) = # custom logic here

Traits

Rocket.as_actorFunction
as_actor(any)

This function checks actor trait behavior specification. May be used explicitly to specify actor trait behavior for any object.

See also: ActorTrait

source
Rocket.BaseActorTraitType

Base actor trait specifies actor to listen for all next!, error! and complete! events. BaseActorTrait is a subtype of ActorTrait.

See also: Actor

source
Rocket.InvalidActorTraitType

Default actor trait behavior for any object. Actor with such a trait specificaion cannot be used as a valid actor in subscribe! function. Doing so will raise an error. InvalidActorTrait is a subtype of ActorTrait.

See also: ActorTrait

source

Types

Rocket.ActorType

Can be used as a super type for common actor. Automatically specifies a BaseActorTrait trait behavior. Every Actor must implement its own methods for on_next!(actor, data), on_error!(actor, err) and on_complete!(actor) functions. Actor is a subtype of AbstractActor type.

Examples

using Rocket
 
 struct MyActor <: Actor{String} end
 
@@ -24,7 +24,7 @@
 
 # output
 
-BaseActorTrait{String}()

See also: AbstractActor, as_actor, BaseActorTrait, ActorTrait, on_next!, on_error!, on_complete!

source
Rocket.NextActorType

Can be used as a super type for "next-only" actor. Automatically specifies a NextActorTrait trait behavior. Every NextActor must implement its own methods for on_next!(actor, data) function only. NextActor is a subtype of AbstractActor type.

Examples

using Rocket
 
 struct MyNextActor <: NextActor{String} end
 
@@ -32,7 +32,7 @@
 
 # output
 
-NextActorTrait{String}()

See also: AbstractActor, as_actor, NextActorTrait, ActorTrait, on_next!

source
Rocket.ErrorActorType

Can be used as a super type for "error-only" actor. Automatically specifies a ErrorActorTrait trait behavior. Every ErrorActor must implement its own methods for on_error!(actor, err) function only. ErrorActor is a subtype of AbstractActor type.

Examples

using Rocket
+NextActorTrait{String}()

See also: AbstractActor, as_actor, NextActorTrait, ActorTrait, on_next!

source
Rocket.ErrorActorType

Can be used as a super type for "error-only" actor. Automatically specifies a ErrorActorTrait trait behavior. Every ErrorActor must implement its own methods for on_error!(actor, err) function only. ErrorActor is a subtype of AbstractActor type.

Examples

using Rocket
 
 struct MyErrorActor <: ErrorActor{String} end
 
@@ -40,7 +40,7 @@
 
 # output
 
-ErrorActorTrait{String}()

See also: AbstractActor, as_actor, ErrorActorTrait, ActorTrait, on_error!

source
Rocket.CompletionActorType

Can be used as a super type for "completion-only" actor. Automatically specifies a CompletionActorTrait trait behavior. Every CompletionActor must implement its own methods for on_complete!(actor) function only. CompletionActor is a subtype of AbstractActor type.

Examples

using Rocket
+ErrorActorTrait{String}()

See also: AbstractActor, as_actor, ErrorActorTrait, ActorTrait, on_error!

source
Rocket.CompletionActorType

Can be used as a super type for "completion-only" actor. Automatically specifies a CompletionActorTrait trait behavior. Every CompletionActor must implement its own methods for on_complete!(actor) function only. CompletionActor is a subtype of AbstractActor type.

Examples

using Rocket
 
 struct MyCompletionActor <: CompletionActor{String} end
 
@@ -48,7 +48,7 @@
 
 # output
 
-CompletionActorTrait{String}()

See also: AbstractActor, as_actor, CompletionActorTrait, ActorTrait, on_complete!

source

Events

Rocket.next!Function
next!(actor, data)
-next!(actor, data, scheduler)

This function is used to deliver a "next" event to an actor with some data. Takes optional scheduler object to schedule execution of data delivery.

See also: AbstractActor, on_next!

source
Rocket.error!Function
error!(actor, err)
-error!(actor, err, scheduler)

This function is used to deliver a "error" event to an actor with some err. Takes optional scheduler object to schedule execution of error delivery.

See also: AbstractActor, on_error!

source
Rocket.complete!Function
complete!(actor)
-complete!(actor, scheduler)

This function is used to deliver a "complete" event to an actor. Takes optional scheduler object to schedule execution of complete event delivery.

See also: AbstractActor, on_complete!

source
Rocket.on_next!Function
on_next!(actor, data)

Both Actor and NextActor objects must implement its own method for on_next! function which will be called on "next" event.

See also: Actor, NextActor

source
Rocket.on_error!Function
on_error!(actor, err)

Both Actor and ErrorActor objects must implement its own method for on_error! function which will be called on "error" event.

See also: Actor, ErrorActor

source
Rocket.on_complete!Function
on_complete!(actor)

Both Actor and CompletionActor objects must implement its own method for on_complete! function which will be called on "complete" event.

See also: Actor, CompletionActor

source

Factory

Errors

+CompletionActorTrait{String}()

See also: AbstractActor, as_actor, CompletionActorTrait, ActorTrait, on_complete!

source

Events

Rocket.next!Function
next!(actor, data)
+next!(actor, data, scheduler)

This function is used to deliver a "next" event to an actor with some data. Takes optional scheduler object to schedule execution of data delivery.

See also: AbstractActor, on_next!

source
Rocket.error!Function
error!(actor, err)
+error!(actor, err, scheduler)

This function is used to deliver a "error" event to an actor with some err. Takes optional scheduler object to schedule execution of error delivery.

See also: AbstractActor, on_error!

source
Rocket.complete!Function
complete!(actor)
+complete!(actor, scheduler)

This function is used to deliver a "complete" event to an actor. Takes optional scheduler object to schedule execution of complete event delivery.

See also: AbstractActor, on_complete!

source
Rocket.on_next!Function
on_next!(actor, data)

Both Actor and NextActor objects must implement its own method for on_next! function which will be called on "next" event.

See also: Actor, NextActor

source
Rocket.on_error!Function
on_error!(actor, err)

Both Actor and ErrorActor objects must implement its own method for on_error! function which will be called on "error" event.

See also: Actor, ErrorActor

source
Rocket.on_complete!Function
on_complete!(actor)

Both Actor and CompletionActor objects must implement its own method for on_complete! function which will be called on "complete" event.

See also: Actor, CompletionActor

source

Factory

Rocket.AbstractActorFactoryType

Abstract type for all possible actor factories

See also: Actor

source
Rocket.create_actorFunction
create_actor(::Type{L}, factory::F) where { L, F <: AbstractActorFactory }

Actor creator function for a given factory F. Should be implemented explicitly for any AbstractActorFactory object

See also: AbstractActorFactory, MissingCreateActorFactoryImplementationError

source
Rocket.MissingCreateActorFactoryImplementationErrorType

This error will be throw if Julia cannot find specific method of 'create_actor()' function for given actor factory

See also: AbstractActorFactory, create_actor

source

Errors

Rocket.InvalidActorTraitUsageErrorType

This error will be thrown if next!, error! or complete! functions are called with invalid actor object

See also: next!, error!, complete!, InvalidActorTrait

source
Rocket.InconsistentSourceActorDataTypesErrorType

This error will be thrown if next! function is called with inconsistent data type

See also: AbstractActor, Subscribable, next!

source
Rocket.MissingDataArgumentInNextCallType

This error will be thrown if next! function is called without data argument

See also: next!

source
Rocket.MissingErrorArgumentInErrorCallType

This error will be thrown if error! function is called without err argument

See also: error!

source
Rocket.ExtraArgumentInCompleteCallType

This error will be thrown if complete! function is called with extra data/err argument

See also: complete!

source
Rocket.MissingOnNextImplementationErrorType

This error will be thrown if Julia cannot find specific method of 'on_next!()' function for given actor and data

See also: on_next!

source
Rocket.MissingOnErrorImplementationErrorType

This error will be thrown if Julia cannot find specific method of 'on_error!()' function for given actor

See also: on_error!

source
Rocket.MissingOnCompleteImplementationErrorType

This error will be thrown if Julia cannot find specific method of 'on_complete!()' function for given actor and data

See also: on_next!

source
diff --git a/v1.7.2/api/observables/index.html b/v1.7.2/api/observables/index.html index 6e3a408b7..84bb32313 100644 --- a/v1.7.2/api/observables/index.html +++ b/v1.7.2/api/observables/index.html @@ -1,5 +1,5 @@ -Observables · Rocket.jl

Observables API

Any observable-like should implement a valid subscribable logic.

Traits

Rocket.as_subscribableFunction
as_subscribable(any)

This function checks subscribable trait behavior specification. Can be used explicitly to specify subscribable trait behavior for any object.

See also: SubscribableTrait

source

Types

Rocket.SubscribableType

Super type for any simple subscribable object. Automatically specifies a SimpleSubscribableTrait trait behavior. Objects with specified SimpleSubscribableTrait subscribable trait must implement: on_subscribe!(subscribable, actor) method. Subscribable is a subtype of AbstractSubscribable type.

Examples

using Rocket
+Observables · Rocket.jl

Observables API

Any observable-like should implement a valid subscribable logic.

Traits

Rocket.as_subscribableFunction
as_subscribable(any)

This function checks subscribable trait behavior specification. Can be used explicitly to specify subscribable trait behavior for any object.

See also: SubscribableTrait

source

Types

Rocket.SubscribableType

Super type for any simple subscribable object. Automatically specifies a SimpleSubscribableTrait trait behavior. Objects with specified SimpleSubscribableTrait subscribable trait must implement: on_subscribe!(subscribable, actor) method. Subscribable is a subtype of AbstractSubscribable type.

Examples

using Rocket
 
 struct MySubscribable <: Subscribable{String} end
 
@@ -7,7 +7,7 @@
 
 # output
 
-SimpleSubscribableTrait{String}()

See also: SubscribableTrait, SimpleSubscribableTrait

source
Rocket.ScheduledSubscribableType

Super type for any scheduled subscribable object. Automatically specifies a ScheduledSubscribableTrait trait behavior. Objects with specified ScheduledSubscribableTrait subscribable trait must implement: on_subscribe!(subscribable, actor, scheduler) method. ScheduledSubscribable is a subtype of AbstractSubscribable type.

Examples

using Rocket
+SimpleSubscribableTrait{String}()

See also: SubscribableTrait, SimpleSubscribableTrait

source
Rocket.ScheduledSubscribableType

Super type for any scheduled subscribable object. Automatically specifies a ScheduledSubscribableTrait trait behavior. Objects with specified ScheduledSubscribableTrait subscribable trait must implement: on_subscribe!(subscribable, actor, scheduler) method. ScheduledSubscribable is a subtype of AbstractSubscribable type.

Examples

using Rocket
 
 struct MyScheduledSubscribable <: ScheduledSubscribable{String} end
 
@@ -15,7 +15,7 @@
 
 # output
 
-ScheduledSubscribableTrait{String}()

See also: SubscribableTrait, ScheduledSubscribableTrait

source
Rocket.subscribe!Function
subscribe!(subscribable::T, actor::S)   where { T, S }
 subscribe!(subscribable::T, factory::F) where { T, F <: AbstractActorFactory }
 subscribe!(subscriptions::Tuple)
 subscribe!(subscriptions::AbstractVector)

subscribe! function is used to attach an actor to subscribable. It also checks types of subscribable and actors to be a valid Subscribable and Actor objects respectively. Passing not valid subscribable or/and actor object will throw an error. If the input argument to the subscribe! function is either a tuple or a vector, it will first check that all of the arguments are valid source and actor objects and if its true will subscribe for each of them individually.

Arguments

  • subscribable: valid subscribable object
  • actor: valid actor object

Examples

using Rocket
@@ -47,7 +47,7 @@
 # output
 
 ERROR: Type Int64 is not a valid subscribable type.
-[...]

See also: on_subscribe!, as_subscribable

source
Rocket.on_subscribe!Function
on_subscribe!(subscribable, actor)
 on_subscribe!(subscribable, actor, scheduler)

Every valid subscribable object have to define its own method for on_subscribe! function which specifies subscription logic and has return a valid Teardown object.

Objects with specified SimpleSubscribableTrait subscribable trait must implement: on_subscribe!(subscribable, actor) method. Objects with specified ScheduledSubscribableTrait subscribable trait must implement: on_subscribe!(subscribable, actor, scheduler) method.

Arguments

  • subscribable: Subscribable object
  • actor: Actor object
  • scheduler: Scheduler object (only for scheduled subscribables)

Examples

using Rocket
 
 struct MySubscribable <: Subscribable{Int} end
@@ -82,4 +82,4 @@
 # output
 
 [LogActor] Data: 0
-[LogActor] Completed

See also: Subscribable, ScheduledSubscribable, SimpleSubscribableTrait, ScheduledSubscribableTrait, Teardown, logger

source

Errors

+[LogActor] Completed

See also: Subscribable, ScheduledSubscribable, SimpleSubscribableTrait, ScheduledSubscribableTrait, Teardown, logger

source

Errors

diff --git a/v1.7.2/api/operators/index.html b/v1.7.2/api/operators/index.html index 922fc2cab..2ebb9a6e9 100644 --- a/v1.7.2/api/operators/index.html +++ b/v1.7.2/api/operators/index.html @@ -1,5 +1,5 @@ -Operators · Rocket.jl

Operators API

How to create a custom operator

If you need to write an operator that cannot be made from a combination of existing operators, then you can write a custom operator from scratch.

Each operator (e.g. MyFancyOperator) needs to either be (1) a subtype of one of abstract OperatorTrait trait types, or (2) define a

Rocket.as_operator(::Type{<:MyFancyOperator}) = TypedOperatorTrait{T, R}()
+Operators · Rocket.jl

Operators API

How to create a custom operator

If you need to write an operator that cannot be made from a combination of existing operators, then you can write a custom operator from scratch.

Each operator (e.g. MyFancyOperator) needs to either be (1) a subtype of one of abstract OperatorTrait trait types, or (2) define a

Rocket.as_operator(::Type{<:MyFancyOperator}) = TypedOperatorTrait{T, R}()
 # or
 Rocket.as_operator(::Type{<:MyFancyOperator}) = InferableOperatorTrait()

trait behavior.

In addition, an operator must implement a specific method for on_call! function with custom logic which has to return another Observable as a result of applying MyFancyOperator to a source.

Rocket.on_call!(::Type{L}, ::Type{R}, operator::MyFancyOperator, source) where L = # some custom logic here
 
@@ -8,7 +8,7 @@
 
 Rocket.on_call(::Type{L}, ::Type{R}, operator::MyFancyOperator, source) where L = # some custom logic here
 Rocket.operator_right(::MyFancyOperator, ::Type{L}) where L = R # where R should be an actual type, Int or even L itself e.g.
-
Note

It is not allowed to modify the source Observable in any way; you have to return a new observable.

See more examples on custom operators in Traits API section

Note

It might be useful to return a ProxyObservable from an on_call! function. ProxyObservable is a special Observable which proxying actors with the source and/or source with actors.

Traits

Rocket.TypedOperatorTraitType

Typed operator trait specifies operator to be statically typed with input and output data types. Typed operator with input type L and output type R can only operate on input Observable with data type L and will always produce an Observable with data type R.

Examples

using Rocket
+
Note

It is not allowed to modify the source Observable in any way; you have to return a new observable.

See more examples on custom operators in Traits API section

Note

It might be useful to return a ProxyObservable from an on_call! function. ProxyObservable is a special Observable which proxying actors with the source and/or source with actors.

Traits

Rocket.TypedOperatorTraitType

Typed operator trait specifies operator to be statically typed with input and output data types. Typed operator with input type L and output type R can only operate on input Observable with data type L and will always produce an Observable with data type R.

Examples

using Rocket
 
 struct MyTypedOperator <: TypedOperator{Int, Int} end
 
@@ -41,7 +41,7 @@
 [LogActor] Data: 1
 [LogActor] Data: 2
 [LogActor] Data: 3
-[LogActor] Completed

See also: OperatorTrait, TypedOperator, OperatorTrait, ProxyObservable, ActorProxy, logger

source
Rocket.LeftTypedOperatorTraitType

Left typed operator trait specifies operator to be statically typed with input data type. To infer output data type this object should specify a special function operator_right(operator, ::Type{L}) where L which will be used to infer output data type. Left typed operator with input type L can only operate on input Observable with data type L and will always produce an Observable with data type inferred from operator_right(operator, ::Type{L}).

Examples

using Rocket
+[LogActor] Completed

See also: OperatorTrait, TypedOperator, OperatorTrait, ProxyObservable, ActorProxy, logger

source
Rocket.LeftTypedOperatorTraitType

Left typed operator trait specifies operator to be statically typed with input data type. To infer output data type this object should specify a special function operator_right(operator, ::Type{L}) where L which will be used to infer output data type. Left typed operator with input type L can only operate on input Observable with data type L and will always produce an Observable with data type inferred from operator_right(operator, ::Type{L}).

Examples

using Rocket
 
 struct CountIntegersOperator <: LeftTypedOperator{Int} end
 
@@ -78,7 +78,7 @@
 [LogActor] Data: (0, 0)
 [LogActor] Data: (1, 0)
 [LogActor] Data: (2, 0)
-[LogActor] Completed

See also: OperatorTrait, LeftTypedOperator, operator_right, OperatorTrait, ProxyObservable, ActorProxy, enumerate, logger

source
Rocket.RightTypedOperatorTraitType

Right typed operator trait specifies operator to be statically typed with output data type. It can operate on input Observable with any data type L but will always produce an Observable with data type R.

Examples

using Rocket
 
 struct ConvertToFloatOperator <: RightTypedOperator{Float64} end
 
@@ -112,7 +112,7 @@
 [LogActor] Data: 1.0
 [LogActor] Data: 2.0
 [LogActor] Data: 3.0
-[LogActor] Completed

See also: OperatorTrait, RightTypedOperator, OperatorTrait, ProxyObservable, ActorProxy, logger

source
Rocket.InferableOperatorTraitType

Inferable operator trait specifies operator to be statically typed neither with input data type nor with output data type. To infer output data type this object should specify a special function operator_right(operator, ::Type{L}) where L where L is input data type which will be used to infer output data type.

using Rocket
 
 struct IdentityOperator <: InferableOperator end
 
@@ -154,35 +154,35 @@
 [LogActor] Data: 2.0
 [LogActor] Data: 3.0
 [LogActor] Completed
-

See also: OperatorTrait, InferableOperator, operator_right, OperatorTrait, ProxyObservable, ActorProxy, logger

source
Rocket.InvalidOperatorTraitType

InvalidOperatorTrait trait specifies special 'invalid' behavior and types with such a trait specification cannot be used as an operator for an observable stream. By default any type has InvalidOperatorTrait trait specification

See also: OperatorTrait

source

Types

Rocket.InvalidOperatorTraitType

InvalidOperatorTrait trait specifies special 'invalid' behavior and types with such a trait specification cannot be used as an operator for an observable stream. By default any type has InvalidOperatorTrait trait specification

See also: OperatorTrait

source

Types

Rocket.TypedOperatorType

Can be used as a supertype for any operator. Automatically specifies TypedOperatorTrait behavior.

Examples

using Rocket
 
 struct MyOperator <: TypedOperator{Float64,String} end
 
 as_operator(MyOperator) === TypedOperatorTrait{Float64,String}()
 
 # output
-true

See also: AbstractOperator, TypedOperatorTrait

source
Rocket.on_call!Function
on_call!(::Type, ::Type, operator, source)

Each operator must implement its own method for on_call! function. This function is used to invoke operator on some Observable and to produce another Observable with new logic (operator specific).

See also: AbstractOperator

source
Rocket.on_call!Function
on_call!(::Type, ::Type, operator, source)

Each operator must implement its own method for on_call! function. This function is used to invoke operator on some Observable and to produce another Observable with new logic (operator specific).

See also: AbstractOperator

source
Rocket.OperatorsCompositionType
OperatorsComposition(operators)

OperatorsComposition is an object which helps to create a composition of multiple operators. To create a composition of two or more operators overloaded + or |> can be used.

using Rocket
 
 composition = map(Int, (d) -> d ^ 2) + filter(d -> d % 2 == 0)
 
@@ -208,4 +208,4 @@
 
 [LogActor] Data: 4
 [LogActor] Data: 16
-[LogActor] Completed
source

Errors

+[LogActor] Completed
source

Errors

Rocket.InvalidOperatorTraitUsageErrorType

This error will be thrown if |> pipe operator is called with invalid operator object

See also: on_call!

source
Rocket.InconsistentSourceOperatorDataTypesErrorType

This error will be thrown if |> pipe operator is called with inconsistent data type

See also: on_call!

source
Rocket.MissingOnCallImplementationErrorType

This error will be thrown if Julia cannot find specific method of on_call! function for a given operator.

See also: on_call!

source
Rocket.MissingOperatorRightImplementationErrorType

This error will be thrown if Julia cannot find specific method of operator_right function for a given operator.

See also: operator_right

source
diff --git a/v1.7.2/api/subjects/index.html b/v1.7.2/api/subjects/index.html index 8d7713075..97721c3c7 100644 --- a/v1.7.2/api/subjects/index.html +++ b/v1.7.2/api/subjects/index.html @@ -1,2 +1,2 @@ -Subjects · Rocket.jl

Subjects API

Traits

Rocket.as_subjectFunction
as_subject(::Type)

This function checks subject trait behavior specification. Should be used explicitly to specify subject trait behavior for any object type.

See also: SubjectTrait

source

Factory

Errors

+Subjects · Rocket.jl

Subjects API

Traits

Rocket.as_subjectFunction
as_subject(::Type)

This function checks subject trait behavior specification. Should be used explicitly to specify subject trait behavior for any object type.

See also: SubjectTrait

source

Factory

Errors

diff --git a/v1.7.2/api/teardown/index.html b/v1.7.2/api/teardown/index.html index 841ceacb8..dce888c73 100644 --- a/v1.7.2/api/teardown/index.html +++ b/v1.7.2/api/teardown/index.html @@ -1,5 +1,5 @@ -Teardown · Rocket.jl

Teardown API

Any subscription-like object should implement a valid teardown logic.

Example

using Rocket
+Teardown · Rocket.jl

Teardown API

Any subscription-like object should implement a valid teardown logic.

Example

using Rocket
 
 struct MuCustomSubscription <: Teardown
     # some fields here
@@ -9,7 +9,7 @@
 
 function on_unsubscribe!(subscription::MyCustomSubscription)
     # dispose resources here
-end

Traits

Rocket.as_teardownFunction
as_teardown(::Type)

This function checks teardown trait behavior specification. Should be used explicitly to specify teardown logic trait behavior for any object.

Examples

using Rocket
+end

Traits

Rocket.as_teardownFunction
as_teardown(::Type)

This function checks teardown trait behavior specification. Should be used explicitly to specify teardown logic trait behavior for any object.

Examples

using Rocket
 
 struct MySubscription <: Teardown end
 
@@ -22,6 +22,6 @@
 
 # output
 
-Unsubscribed!

See also: Teardown, TeardownLogic

source

Types

Types

Rocket.unsubscribe!Function
unsubscribe!(subscription)
 unsubscribe!(subscriptions::Tuple)
-unsubscribe!(subscriptions::AbstractVector)

unsubscribe! function is used to cancel Observable execution and to dispose any kind of resources used during an Observable execution. If the input argument to the unsubscribe! function is either a tuple or a vector, it will first check that all of the arguments are valid subscription objects and if its true will unsubscribe from each of them individually.

See also: Teardown, TeardownLogic, on_unsubscribe!

source

Errors

+unsubscribe!(subscriptions::AbstractVector)

unsubscribe! function is used to cancel Observable execution and to dispose any kind of resources used during an Observable execution. If the input argument to the unsubscribe! function is either a tuple or a vector, it will first check that all of the arguments are valid subscription objects and if its true will unsubscribe from each of them individually.

See also: Teardown, TeardownLogic, on_unsubscribe!

source

Errors

Rocket.InvalidTeardownLogicTraitUsageErrorType

This error will be thrown if unsubscribe! function is called with invalid teardown object.

See also: unsubscribe!

source
Rocket.InvalidMultipleTeardownLogicTraitUsageErrorType

This error will be thrown if unsubscribe! function is called with a tuple with invalid teardown object in it.

See also: unsubscribe!

source
Rocket.MissingOnUnsubscribeImplementationErrorType

This error will be thrown if Julia cannot find specific method of on_unsubscribe!() function for given teardown object.

See also: on_unsubscribe!

source
diff --git a/v1.7.2/assets/documenter.js b/v1.7.2/assets/documenter.js index 6adfbbbf4..f5311607b 100644 --- a/v1.7.2/assets/documenter.js +++ b/v1.7.2/assets/documenter.js @@ -1,15 +1,16 @@ // Generated by Documenter.jl requirejs.config({ paths: { - 'highlight-julia': 'https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.5.1/languages/julia.min', + 'highlight-julia': 'https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.8.0/languages/julia.min', 'headroom': 'https://cdnjs.cloudflare.com/ajax/libs/headroom/0.12.0/headroom.min', - 'jqueryui': 'https://cdnjs.cloudflare.com/ajax/libs/jqueryui/1.12.1/jquery-ui.min', - 'katex-auto-render': 'https://cdnjs.cloudflare.com/ajax/libs/KaTeX/0.13.24/contrib/auto-render.min', - 'jquery': 'https://cdnjs.cloudflare.com/ajax/libs/jquery/3.6.0/jquery.min', + 'jqueryui': 'https://cdnjs.cloudflare.com/ajax/libs/jqueryui/1.13.2/jquery-ui.min', + 'minisearch': 'https://cdn.jsdelivr.net/npm/minisearch@6.1.0/dist/umd/index.min', + 'katex-auto-render': 'https://cdnjs.cloudflare.com/ajax/libs/KaTeX/0.16.8/contrib/auto-render.min', + 'jquery': 'https://cdnjs.cloudflare.com/ajax/libs/jquery/3.7.0/jquery.min', 'headroom-jquery': 'https://cdnjs.cloudflare.com/ajax/libs/headroom/0.12.0/jQuery.headroom.min', - 'katex': 'https://cdnjs.cloudflare.com/ajax/libs/KaTeX/0.13.24/katex.min', - 'highlight': 'https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.5.1/highlight.min', - 'highlight-julia-repl': 'https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.5.1/languages/julia-repl.min', + 'katex': 'https://cdnjs.cloudflare.com/ajax/libs/KaTeX/0.16.8/katex.min', + 'highlight': 'https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.8.0/highlight.min', + 'highlight-julia-repl': 'https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.8.0/languages/julia-repl.min', }, shim: { "highlight-julia": { @@ -70,13 +71,90 @@ $(document).ready(function() { hljs.highlightAll(); }) +}) +//////////////////////////////////////////////////////////////////////////////// +require(['jquery'], function($) { + +let timer = 0; +var isExpanded = true; + +$(document).on("click", ".docstring header", function () { + let articleToggleTitle = "Expand docstring"; + + debounce(() => { + if ($(this).siblings("section").is(":visible")) { + $(this) + .find(".docstring-article-toggle-button") + .removeClass("fa-chevron-down") + .addClass("fa-chevron-right"); + } else { + $(this) + .find(".docstring-article-toggle-button") + .removeClass("fa-chevron-right") + .addClass("fa-chevron-down"); + + articleToggleTitle = "Collapse docstring"; + } + + $(this) + .find(".docstring-article-toggle-button") + .prop("title", articleToggleTitle); + $(this).siblings("section").slideToggle(); + }); +}); + +$(document).on("click", ".docs-article-toggle-button", function () { + let articleToggleTitle = "Expand docstring"; + let navArticleToggleTitle = "Expand all docstrings"; + + debounce(() => { + if (isExpanded) { + $(this).removeClass("fa-chevron-up").addClass("fa-chevron-down"); + $(".docstring-article-toggle-button") + .removeClass("fa-chevron-down") + .addClass("fa-chevron-right"); + + isExpanded = false; + + $(".docstring section").slideUp(); + } else { + $(this).removeClass("fa-chevron-down").addClass("fa-chevron-up"); + $(".docstring-article-toggle-button") + .removeClass("fa-chevron-right") + .addClass("fa-chevron-down"); + + isExpanded = true; + articleToggleTitle = "Collapse docstring"; + navArticleToggleTitle = "Collapse all docstrings"; + + $(".docstring section").slideDown(); + } + + $(this).prop("title", navArticleToggleTitle); + $(".docstring-article-toggle-button").prop("title", articleToggleTitle); + }); +}); + +function debounce(callback, timeout = 300) { + if (Date.now() - timer > timeout) { + callback(); + } + + clearTimeout(timer); + + timer = Date.now(); +} + }) //////////////////////////////////////////////////////////////////////////////// require([], function() { function addCopyButtonCallbacks() { for (const el of document.getElementsByTagName("pre")) { const button = document.createElement("button"); - button.classList.add("copy-button", "fas", "fa-copy"); + button.classList.add("copy-button", "fa-solid", "fa-copy"); + button.setAttribute("aria-label", "Copy this code block"); + button.setAttribute("title", "Copy"); + el.appendChild(button); const success = function () { @@ -85,7 +163,7 @@ function addCopyButtonCallbacks() { }; const failure = function () { - button.classList.add("error", "fa-times"); + button.classList.add("error", "fa-xmark"); button.classList.remove("fa-copy"); }; @@ -94,7 +172,7 @@ function addCopyButtonCallbacks() { setTimeout(function () { button.classList.add("fa-copy"); - button.classList.remove("success", "fa-check", "fa-times"); + button.classList.remove("success", "fa-check", "fa-xmark"); }, 5000); }); } @@ -138,29 +216,418 @@ require(['jquery', 'headroom', 'headroom-jquery'], function($, Headroom) { // Manages the top navigation bar (hides it when the user starts scrolling down on the // mobile). window.Headroom = Headroom; // work around buggy module loading? -$(document).ready(function() { - $('#documenter .docs-navbar').headroom({ - "tolerance": {"up": 10, "down": 10}, +$(document).ready(function () { + $("#documenter .docs-navbar").headroom({ + tolerance: { up: 10, down: 10 }, }); +}); + }) +//////////////////////////////////////////////////////////////////////////////// +require(['jquery', 'minisearch'], function($, minisearch) { + +// In general, most search related things will have "search" as a prefix. +// To get an in-depth about the thought process you can refer: https://hetarth02.hashnode.dev/series/gsoc + +let results = []; +let timer = undefined; + +let data = documenterSearchIndex["docs"].map((x, key) => { + x["id"] = key; // minisearch requires a unique for each object + return x; +}); + +// list below is the lunr 2.1.3 list minus the intersect with names(Base) +// (all, any, get, in, is, only, which) and (do, else, for, let, where, while, with) +// ideally we'd just filter the original list but it's not available as a variable +const stopWords = new Set([ + "a", + "able", + "about", + "across", + "after", + "almost", + "also", + "am", + "among", + "an", + "and", + "are", + "as", + "at", + "be", + "because", + "been", + "but", + "by", + "can", + "cannot", + "could", + "dear", + "did", + "does", + "either", + "ever", + "every", + "from", + "got", + "had", + "has", + "have", + "he", + "her", + "hers", + "him", + "his", + "how", + "however", + "i", + "if", + "into", + "it", + "its", + "just", + "least", + "like", + "likely", + "may", + "me", + "might", + "most", + "must", + "my", + "neither", + "no", + "nor", + "not", + "of", + "off", + "often", + "on", + "or", + "other", + "our", + "own", + "rather", + "said", + "say", + "says", + "she", + "should", + "since", + "so", + "some", + "than", + "that", + "the", + "their", + "them", + "then", + "there", + "these", + "they", + "this", + "tis", + "to", + "too", + "twas", + "us", + "wants", + "was", + "we", + "were", + "what", + "when", + "who", + "whom", + "why", + "will", + "would", + "yet", + "you", + "your", +]); + +let index = new minisearch({ + fields: ["title", "text"], // fields to index for full-text search + storeFields: ["location", "title", "text", "category", "page"], // fields to return with search results + processTerm: (term) => { + let word = stopWords.has(term) ? null : term; + if (word) { + // custom trimmer that doesn't strip @ and !, which are used in julia macro and function names + word = word + .replace(/^[^a-zA-Z0-9@!]+/, "") + .replace(/[^a-zA-Z0-9@!]+$/, ""); + } + + return word ?? null; + }, + // add . as a separator, because otherwise "title": "Documenter.Anchors.add!", would not find anything if searching for "add!", only for the entire qualification + tokenize: (string) => string.split(/[\s\-\.]+/), + // options which will be applied during the search + searchOptions: { + boost: { title: 100 }, + fuzzy: 2, + processTerm: (term) => { + let word = stopWords.has(term) ? null : term; + if (word) { + word = word + .replace(/^[^a-zA-Z0-9@!]+/, "") + .replace(/[^a-zA-Z0-9@!]+$/, ""); + } + + return word ?? null; + }, + tokenize: (string) => string.split(/[\s\-\.]+/), + }, +}); + +index.addAll(data); + +let filters = [...new Set(data.map((x) => x.category))]; +var modal_filters = make_modal_body_filters(filters); +var filter_results = []; + +$(document).on("keyup", ".documenter-search-input", function (event) { + // Adding a debounce to prevent disruptions from super-speed typing! + debounce(() => update_search(filter_results), 300); +}); + +$(document).on("click", ".search-filter", function () { + if ($(this).hasClass("search-filter-selected")) { + $(this).removeClass("search-filter-selected"); + } else { + $(this).addClass("search-filter-selected"); + } + + // Adding a debounce to prevent disruptions from crazy clicking! + debounce(() => get_filters(), 300); +}); + +/** + * A debounce function, takes a function and an optional timeout in milliseconds + * + * @function callback + * @param {number} timeout + */ +function debounce(callback, timeout = 300) { + clearTimeout(timer); + timer = setTimeout(callback, timeout); +} + +/** + * Make/Update the search component + * + * @param {string[]} selected_filters + */ +function update_search(selected_filters = []) { + let initial_search_body = ` +
Type something to get started!
+ `; + + let querystring = $(".documenter-search-input").val(); + + if (querystring.trim()) { + results = index.search(querystring, { + filter: (result) => { + // Filtering results + if (selected_filters.length === 0) { + return result.score >= 1; + } else { + return ( + result.score >= 1 && selected_filters.includes(result.category) + ); + } + }, + }); + + let search_result_container = ``; + let search_divider = `
`; + + if (results.length) { + let links = []; + let count = 0; + let search_results = ""; + + results.forEach(function (result) { + if (result.location) { + // Checking for duplication of results for the same page + if (!links.includes(result.location)) { + search_results += make_search_result(result, querystring); + count++; + } + + links.push(result.location); + } + }); + + let result_count = `
${count} result(s)
`; + + search_result_container = ` +
+ ${modal_filters} + ${search_divider} + ${result_count} +
+ ${search_results} +
+
+ `; + } else { + search_result_container = ` +
+ ${modal_filters} + ${search_divider} +
0 result(s)
+
+
No result found!
+ `; + } + + if ($(".search-modal-card-body").hasClass("is-justify-content-center")) { + $(".search-modal-card-body").removeClass("is-justify-content-center"); + } + + $(".search-modal-card-body").html(search_result_container); + } else { + filter_results = []; + modal_filters = make_modal_body_filters(filters, filter_results); + + if (!$(".search-modal-card-body").hasClass("is-justify-content-center")) { + $(".search-modal-card-body").addClass("is-justify-content-center"); + } + + $(".search-modal-card-body").html(initial_search_body); + } +} + +/** + * Make the modal filter html + * + * @param {string[]} filters + * @param {string[]} selected_filters + * @returns string + */ +function make_modal_body_filters(filters, selected_filters = []) { + let str = ``; + + filters.forEach((val) => { + if (selected_filters.includes(val)) { + str += `${val}`; + } else { + str += `${val}`; + } + }); + + let filter_html = ` +
+ Filters: + ${str} +
+ `; + + return filter_html; +} + +/** + * Make the result component given a minisearch result data object and the value of the search input as queryString. + * To view the result object structure, refer: https://lucaong.github.io/minisearch/modules/_minisearch_.html#searchresult + * + * @param {object} result + * @param {string} querystring + * @returns string + */ +function make_search_result(result, querystring) { + let search_divider = `
`; + let display_link = + result.location.slice(Math.max(0), Math.min(50, result.location.length)) + + (result.location.length > 30 ? "..." : ""); // To cut-off the link because it messes with the overflow of the whole div + + if (result.page !== "") { + display_link += ` (${result.page})`; + } + + let textindex = new RegExp(`\\b${querystring}\\b`, "i").exec(result.text); + let text = + textindex !== null + ? result.text.slice( + Math.max(textindex.index - 100, 0), + Math.min( + textindex.index + querystring.length + 100, + result.text.length + ) + ) + : ""; // cut-off text before and after from the match + + let display_result = text.length + ? "..." + + text.replace( + new RegExp(`\\b${querystring}\\b`, "i"), // For first occurrence + '$&' + ) + + "..." + : ""; // highlights the match + + let in_code = false; + if (!["page", "section"].includes(result.category.toLowerCase())) { + in_code = true; + } + + // We encode the full url to escape some special characters which can lead to broken links + let result_div = ` + +
+
${result.title}
+
${result.category}
+
+

+ ${display_result} +

+
+ ${display_link} +
+
+ ${search_divider} + `; + + return result_div; +} + +/** + * Get selected filters, remake the filter html and lastly update the search modal + */ +function get_filters() { + let ele = $(".search-filters .search-filter-selected").get(); + filter_results = ele.map((x) => $(x).text().toLowerCase()); + modal_filters = make_modal_body_filters(filters, filter_results); + update_search(filter_results); +} }) //////////////////////////////////////////////////////////////////////////////// require(['jquery'], function($) { // Modal settings dialog -$(document).ready(function() { - var settings = $('#documenter-settings'); - $('#documenter-settings-button').click(function(){ - settings.toggleClass('is-active'); +$(document).ready(function () { + var settings = $("#documenter-settings"); + $("#documenter-settings-button").click(function () { + settings.toggleClass("is-active"); }); // Close the dialog if X is clicked - $('#documenter-settings button.delete').click(function(){ - settings.removeClass('is-active'); + $("#documenter-settings button.delete").click(function () { + settings.removeClass("is-active"); }); // Close dialog if ESC is pressed - $(document).keyup(function(e) { - if (e.keyCode == 27) settings.removeClass('is-active'); + $(document).keyup(function (e) { + if (e.keyCode == 27) settings.removeClass("is-active"); }); }); @@ -168,151 +635,242 @@ $(document).ready(function() { //////////////////////////////////////////////////////////////////////////////// require(['jquery'], function($) { +let search_modal_header = ` + +`; + +let initial_search_body = ` +
Type something to get started!
+`; + +let search_modal_footer = ` + +`; + +$(document.body).append( + ` + + ` +); + +document.querySelector(".docs-search-query").addEventListener("click", () => { + openModal(); +}); + +document.querySelector(".close-search-modal").addEventListener("click", () => { + closeModal(); +}); + +$(document).on("click", ".search-result-link", function () { + closeModal(); +}); + +document.addEventListener("keydown", (event) => { + if ((event.ctrlKey || event.metaKey) && event.key === "/") { + openModal(); + } else if (event.key === "Escape") { + closeModal(); + } + + return false; +}); + +// Functions to open and close a modal +function openModal() { + let searchModal = document.querySelector("#search-modal"); + + searchModal.classList.add("is-active"); + document.querySelector(".documenter-search-input").focus(); +} + +function closeModal() { + let searchModal = document.querySelector("#search-modal"); + let initial_search_body = ` +
Type something to get started!
+ `; + + searchModal.classList.remove("is-active"); + document.querySelector(".documenter-search-input").blur(); + + if (!$(".search-modal-card-body").hasClass("is-justify-content-center")) { + $(".search-modal-card-body").addClass("is-justify-content-center"); + } + + $(".documenter-search-input").val(""); + $(".search-modal-card-body").html(initial_search_body); +} + +document + .querySelector("#search-modal .modal-background") + .addEventListener("click", () => { + closeModal(); + }); + +}) +//////////////////////////////////////////////////////////////////////////////// +require(['jquery'], function($) { + // Manages the showing and hiding of the sidebar. -$(document).ready(function() { +$(document).ready(function () { var sidebar = $("#documenter > .docs-sidebar"); - var sidebar_button = $("#documenter-sidebar-button") - sidebar_button.click(function(ev) { + var sidebar_button = $("#documenter-sidebar-button"); + sidebar_button.click(function (ev) { ev.preventDefault(); - sidebar.toggleClass('visible'); - if (sidebar.hasClass('visible')) { + sidebar.toggleClass("visible"); + if (sidebar.hasClass("visible")) { // Makes sure that the current menu item is visible in the sidebar. $("#documenter .docs-menu a.is-active").focus(); } }); - $("#documenter > .docs-main").bind('click', function(ev) { + $("#documenter > .docs-main").bind("click", function (ev) { if ($(ev.target).is(sidebar_button)) { return; } - if (sidebar.hasClass('visible')) { - sidebar.removeClass('visible'); + if (sidebar.hasClass("visible")) { + sidebar.removeClass("visible"); } }); -}) +}); // Resizes the package name / sitename in the sidebar if it is too wide. // Inspired by: https://github.com/davatron5000/FitText.js -$(document).ready(function() { +$(document).ready(function () { e = $("#documenter .docs-autofit"); function resize() { - var L = parseInt(e.css('max-width'), 10); + var L = parseInt(e.css("max-width"), 10); var L0 = e.width(); - if(L0 > L) { - var h0 = parseInt(e.css('font-size'), 10); - e.css('font-size', L * h0 / L0); + if (L0 > L) { + var h0 = parseInt(e.css("font-size"), 10); + e.css("font-size", (L * h0) / L0); // TODO: make sure it survives resizes? } } // call once and then register events resize(); $(window).resize(resize); - $(window).on('orientationchange', resize); + $(window).on("orientationchange", resize); }); // Scroll the navigation bar to the currently selected menu item -$(document).ready(function() { +$(document).ready(function () { var sidebar = $("#documenter .docs-menu").get(0); var active = $("#documenter .docs-menu .is-active").get(0); - if(typeof active !== 'undefined') { + if (typeof active !== "undefined") { sidebar.scrollTop = active.offsetTop - sidebar.offsetTop - 15; } -}) +}); }) //////////////////////////////////////////////////////////////////////////////// require(['jquery'], function($) { -function set_theme(theme) { - var active = null; - var disabled = []; - for (var i = 0; i < document.styleSheets.length; i++) { - var ss = document.styleSheets[i]; - var themename = ss.ownerNode.getAttribute("data-theme-name"); - if(themename === null) continue; // ignore non-theme stylesheets - // Find the active theme - if(themename === theme) active = ss; - else disabled.push(ss); - } - if(active !== null) { - active.disabled = false; - if(active.ownerNode.getAttribute("data-theme-primary") === null) { - document.getElementsByTagName('html')[0].className = "theme--" + theme; - } else { - document.getElementsByTagName('html')[0].className = ""; - } - disabled.forEach(function(ss){ - ss.disabled = true; - }); - } - - // Store the theme in localStorage - if(typeof(window.localStorage) !== "undefined") { - window.localStorage.setItem("documenter-theme", theme); - } else { - console.error("Browser does not support window.localStorage"); - } -} - // Theme picker setup -$(document).ready(function() { +$(document).ready(function () { // onchange callback - $('#documenter-themepicker').change(function themepick_callback(ev){ - var themename = $('#documenter-themepicker option:selected').attr('value'); - set_theme(themename); + $("#documenter-themepicker").change(function themepick_callback(ev) { + var themename = $("#documenter-themepicker option:selected").attr("value"); + if (themename === "auto") { + // set_theme(window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light'); + window.localStorage.removeItem("documenter-theme"); + } else { + // set_theme(themename); + window.localStorage.setItem("documenter-theme", themename); + } + // We re-use the global function from themeswap.js to actually do the swapping. + set_theme_from_local_storage(); }); // Make sure that the themepicker displays the correct theme when the theme is retrieved // from localStorage - if(typeof(window.localStorage) !== "undefined") { - var theme = window.localStorage.getItem("documenter-theme"); - if(theme !== null) { - $('#documenter-themepicker option').each(function(i,e) { - e.selected = (e.value === theme); - }) - } else { - $('#documenter-themepicker option').each(function(i,e) { - e.selected = $("html").hasClass(`theme--${e.value}`); - }) + if (typeof window.localStorage !== "undefined") { + var theme = window.localStorage.getItem("documenter-theme"); + if (theme !== null) { + $("#documenter-themepicker option").each(function (i, e) { + e.selected = e.value === theme; + }); } } -}) +}); }) //////////////////////////////////////////////////////////////////////////////// require(['jquery'], function($) { // update the version selector with info from the siteinfo.js and ../versions.js files -$(document).ready(function() { +$(document).ready(function () { // If the version selector is disabled with DOCUMENTER_VERSION_SELECTOR_DISABLED in the // siteinfo.js file, we just return immediately and not display the version selector. - if (typeof DOCUMENTER_VERSION_SELECTOR_DISABLED === 'boolean' && DOCUMENTER_VERSION_SELECTOR_DISABLED) { + if ( + typeof DOCUMENTER_VERSION_SELECTOR_DISABLED === "boolean" && + DOCUMENTER_VERSION_SELECTOR_DISABLED + ) { return; } var version_selector = $("#documenter .docs-version-selector"); var version_selector_select = $("#documenter .docs-version-selector select"); - version_selector_select.change(function(x) { - target_href = version_selector_select.children("option:selected").get(0).value; + version_selector_select.change(function (x) { + target_href = version_selector_select + .children("option:selected") + .get(0).value; window.location.href = target_href; }); // add the current version to the selector based on siteinfo.js, but only if the selector is empty - if (typeof DOCUMENTER_CURRENT_VERSION !== 'undefined' && $('#version-selector > option').length == 0) { - var option = $(""); + if ( + typeof DOCUMENTER_CURRENT_VERSION !== "undefined" && + $("#version-selector > option").length == 0 + ) { + var option = $( + "" + ); version_selector_select.append(option); } - if (typeof DOC_VERSIONS !== 'undefined') { + if (typeof DOC_VERSIONS !== "undefined") { var existing_versions = version_selector_select.children("option"); - var existing_versions_texts = existing_versions.map(function(i,x){return x.text}); - DOC_VERSIONS.forEach(function(each) { - var version_url = documenterBaseURL + "/../" + each; + var existing_versions_texts = existing_versions.map(function (i, x) { + return x.text; + }); + DOC_VERSIONS.forEach(function (each) { + var version_url = documenterBaseURL + "/../" + each + "/"; var existing_id = $.inArray(each, existing_versions_texts); // if not already in the version selector, add it as a new option, // otherwise update the old option with the URL and enable it if (existing_id == -1) { - var option = $(""); + var option = $( + "" + ); version_selector_select.append(option); } else { var option = existing_versions[existing_id]; @@ -326,6 +884,6 @@ $(document).ready(function() { if (version_selector_select.children("option").length > 0) { version_selector.toggleClass("visible"); } -}) +}); }) diff --git a/v1.7.2/assets/search.js b/v1.7.2/assets/search.js deleted file mode 100644 index c133f7410..000000000 --- a/v1.7.2/assets/search.js +++ /dev/null @@ -1,267 +0,0 @@ -// Generated by Documenter.jl -requirejs.config({ - paths: { - 'lunr': 'https://cdnjs.cloudflare.com/ajax/libs/lunr.js/2.3.9/lunr.min', - 'lodash': 'https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.21/lodash.min', - 'jquery': 'https://cdnjs.cloudflare.com/ajax/libs/jquery/3.6.0/jquery.min', - } -}); -//////////////////////////////////////////////////////////////////////////////// -require(['jquery', 'lunr', 'lodash'], function($, lunr, _) { - -$(document).ready(function() { - // parseUri 1.2.2 - // (c) Steven Levithan - // MIT License - function parseUri (str) { - var o = parseUri.options, - m = o.parser[o.strictMode ? "strict" : "loose"].exec(str), - uri = {}, - i = 14; - - while (i--) uri[o.key[i]] = m[i] || ""; - - uri[o.q.name] = {}; - uri[o.key[12]].replace(o.q.parser, function ($0, $1, $2) { - if ($1) uri[o.q.name][$1] = $2; - }); - - return uri; - }; - parseUri.options = { - strictMode: false, - key: ["source","protocol","authority","userInfo","user","password","host","port","relative","path","directory","file","query","anchor"], - q: { - name: "queryKey", - parser: /(?:^|&)([^&=]*)=?([^&]*)/g - }, - parser: { - strict: /^(?:([^:\/?#]+):)?(?:\/\/((?:(([^:@]*)(?::([^:@]*))?)?@)?([^:\/?#]*)(?::(\d*))?))?((((?:[^?#\/]*\/)*)([^?#]*))(?:\?([^#]*))?(?:#(.*))?)/, - loose: /^(?:(?![^:@]+:[^:@\/]*@)([^:\/?#.]+):)?(?:\/\/)?((?:(([^:@]*)(?::([^:@]*))?)?@)?([^:\/?#]*)(?::(\d*))?)(((\/(?:[^?#](?![^?#\/]*\.[^?#\/.]+(?:[?#]|$)))*\/?)?([^?#\/]*))(?:\?([^#]*))?(?:#(.*))?)/ - } - }; - - $("#search-form").submit(function(e) { - e.preventDefault() - }) - - // list below is the lunr 2.1.3 list minus the intersect with names(Base) - // (all, any, get, in, is, only, which) and (do, else, for, let, where, while, with) - // ideally we'd just filter the original list but it's not available as a variable - lunr.stopWordFilter = lunr.generateStopWordFilter([ - 'a', - 'able', - 'about', - 'across', - 'after', - 'almost', - 'also', - 'am', - 'among', - 'an', - 'and', - 'are', - 'as', - 'at', - 'be', - 'because', - 'been', - 'but', - 'by', - 'can', - 'cannot', - 'could', - 'dear', - 'did', - 'does', - 'either', - 'ever', - 'every', - 'from', - 'got', - 'had', - 'has', - 'have', - 'he', - 'her', - 'hers', - 'him', - 'his', - 'how', - 'however', - 'i', - 'if', - 'into', - 'it', - 'its', - 'just', - 'least', - 'like', - 'likely', - 'may', - 'me', - 'might', - 'most', - 'must', - 'my', - 'neither', - 'no', - 'nor', - 'not', - 'of', - 'off', - 'often', - 'on', - 'or', - 'other', - 'our', - 'own', - 'rather', - 'said', - 'say', - 'says', - 'she', - 'should', - 'since', - 'so', - 'some', - 'than', - 'that', - 'the', - 'their', - 'them', - 'then', - 'there', - 'these', - 'they', - 'this', - 'tis', - 'to', - 'too', - 'twas', - 'us', - 'wants', - 'was', - 'we', - 'were', - 'what', - 'when', - 'who', - 'whom', - 'why', - 'will', - 'would', - 'yet', - 'you', - 'your' - ]) - - // add . as a separator, because otherwise "title": "Documenter.Anchors.add!" - // would not find anything if searching for "add!", only for the entire qualification - lunr.tokenizer.separator = /[\s\-\.]+/ - - // custom trimmer that doesn't strip @ and !, which are used in julia macro and function names - lunr.trimmer = function (token) { - return token.update(function (s) { - return s.replace(/^[^a-zA-Z0-9@!]+/, '').replace(/[^a-zA-Z0-9@!]+$/, '') - }) - } - - lunr.Pipeline.registerFunction(lunr.stopWordFilter, 'juliaStopWordFilter') - lunr.Pipeline.registerFunction(lunr.trimmer, 'juliaTrimmer') - - var index = lunr(function () { - this.ref('location') - this.field('title',{boost: 100}) - this.field('text') - documenterSearchIndex['docs'].forEach(function(e) { - this.add(e) - }, this) - }) - var store = {} - - documenterSearchIndex['docs'].forEach(function(e) { - store[e.location] = {title: e.title, category: e.category, page: e.page} - }) - - $(function(){ - searchresults = $('#documenter-search-results'); - searchinfo = $('#documenter-search-info'); - searchbox = $('#documenter-search-query'); - searchform = $('.docs-search'); - sidebar = $('.docs-sidebar'); - function update_search(querystring) { - tokens = lunr.tokenizer(querystring) - results = index.query(function (q) { - tokens.forEach(function (t) { - q.term(t.toString(), { - fields: ["title"], - boost: 100, - usePipeline: true, - editDistance: 0, - wildcard: lunr.Query.wildcard.NONE - }) - q.term(t.toString(), { - fields: ["title"], - boost: 10, - usePipeline: true, - editDistance: 2, - wildcard: lunr.Query.wildcard.NONE - }) - q.term(t.toString(), { - fields: ["text"], - boost: 1, - usePipeline: true, - editDistance: 0, - wildcard: lunr.Query.wildcard.NONE - }) - }) - }) - searchinfo.text("Number of results: " + results.length) - searchresults.empty() - results.forEach(function(result) { - data = store[result.ref] - link = $(''+data.title+'') - link.attr('href', documenterBaseURL+'/'+result.ref) - if (data.category != "page"){ - cat = $('('+data.category+', '+data.page+')') - } else { - cat = $('('+data.category+')') - } - li = $('
  • ').append(link).append(" ").append(cat) - searchresults.append(li) - }) - } - - function update_search_box() { - querystring = searchbox.val() - update_search(querystring) - } - - searchbox.keyup(_.debounce(update_search_box, 250)) - searchbox.change(update_search_box) - - // Disable enter-key form submission for the searchbox on the search page - // and just re-run search rather than refresh the whole page. - searchform.keypress( - function(event){ - if (event.which == '13') { - if (sidebar.hasClass('visible')) { - sidebar.removeClass('visible'); - } - update_search_box(); - event.preventDefault(); - } - } - ); - - search_query_uri = parseUri(window.location).queryKey["q"] - if(search_query_uri !== undefined) { - search_query = decodeURIComponent(search_query_uri.replace(/\+/g, '%20')) - searchbox.val(search_query) - } - update_search_box(); - }) -}) - -}) diff --git a/v1.7.2/assets/themes/documenter-dark.css b/v1.7.2/assets/themes/documenter-dark.css index c94a294dc..9f5449f4b 100644 --- a/v1.7.2/assets/themes/documenter-dark.css +++ b/v1.7.2/assets/themes/documenter-dark.css @@ -1,7 +1,7 @@ -@keyframes spinAround{from{transform:rotate(0deg)}to{transform:rotate(359deg)}}html.theme--documenter-dark .tabs,html.theme--documenter-dark .pagination-previous,html.theme--documenter-dark .pagination-next,html.theme--documenter-dark .pagination-link,html.theme--documenter-dark .pagination-ellipsis,html.theme--documenter-dark .breadcrumb,html.theme--documenter-dark .file,html.theme--documenter-dark .button,.is-unselectable,html.theme--documenter-dark .modal-close,html.theme--documenter-dark .delete{-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}html.theme--documenter-dark .navbar-link:not(.is-arrowless)::after,html.theme--documenter-dark .select:not(.is-multiple):not(.is-loading)::after{border:3px solid rgba(0,0,0,0);border-radius:2px;border-right:0;border-top:0;content:" ";display:block;height:0.625em;margin-top:-0.4375em;pointer-events:none;position:absolute;top:50%;transform:rotate(-45deg);transform-origin:center;width:0.625em}html.theme--documenter-dark .admonition:not(:last-child),html.theme--documenter-dark .tabs:not(:last-child),html.theme--documenter-dark .message:not(:last-child),html.theme--documenter-dark .list:not(:last-child),html.theme--documenter-dark .level:not(:last-child),html.theme--documenter-dark .breadcrumb:not(:last-child),html.theme--documenter-dark .highlight:not(:last-child),html.theme--documenter-dark .block:not(:last-child),html.theme--documenter-dark .title:not(:last-child),html.theme--documenter-dark .subtitle:not(:last-child),html.theme--documenter-dark .table-container:not(:last-child),html.theme--documenter-dark .table:not(:last-child),html.theme--documenter-dark .progress:not(:last-child),html.theme--documenter-dark .notification:not(:last-child),html.theme--documenter-dark .content:not(:last-child),html.theme--documenter-dark .box:not(:last-child){margin-bottom:1.5rem}html.theme--documenter-dark .modal-close,html.theme--documenter-dark .delete{-moz-appearance:none;-webkit-appearance:none;background-color:rgba(10,10,10,0.2);border:none;border-radius:290486px;cursor:pointer;pointer-events:auto;display:inline-block;flex-grow:0;flex-shrink:0;font-size:0;height:20px;max-height:20px;max-width:20px;min-height:20px;min-width:20px;outline:none;position:relative;vertical-align:top;width:20px}html.theme--documenter-dark .modal-close::before,html.theme--documenter-dark .delete::before,html.theme--documenter-dark .modal-close::after,html.theme--documenter-dark .delete::after{background-color:#fff;content:"";display:block;left:50%;position:absolute;top:50%;transform:translateX(-50%) translateY(-50%) rotate(45deg);transform-origin:center center}html.theme--documenter-dark .modal-close::before,html.theme--documenter-dark .delete::before{height:2px;width:50%}html.theme--documenter-dark .modal-close::after,html.theme--documenter-dark .delete::after{height:50%;width:2px}html.theme--documenter-dark .modal-close:hover,html.theme--documenter-dark .delete:hover,html.theme--documenter-dark .modal-close:focus,html.theme--documenter-dark .delete:focus{background-color:rgba(10,10,10,0.3)}html.theme--documenter-dark .modal-close:active,html.theme--documenter-dark .delete:active{background-color:rgba(10,10,10,0.4)}html.theme--documenter-dark .is-small.modal-close,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.modal-close,html.theme--documenter-dark .is-small.delete,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.delete{height:16px;max-height:16px;max-width:16px;min-height:16px;min-width:16px;width:16px}html.theme--documenter-dark .is-medium.modal-close,html.theme--documenter-dark .is-medium.delete{height:24px;max-height:24px;max-width:24px;min-height:24px;min-width:24px;width:24px}html.theme--documenter-dark .is-large.modal-close,html.theme--documenter-dark .is-large.delete{height:32px;max-height:32px;max-width:32px;min-height:32px;min-width:32px;width:32px}html.theme--documenter-dark .control.is-loading::after,html.theme--documenter-dark .select.is-loading::after,html.theme--documenter-dark .loader,html.theme--documenter-dark .button.is-loading::after{animation:spinAround 500ms infinite linear;border:2px solid #dbdee0;border-radius:290486px;border-right-color:transparent;border-top-color:transparent;content:"";display:block;height:1em;position:relative;width:1em}html.theme--documenter-dark .hero-video,html.theme--documenter-dark .modal-background,html.theme--documenter-dark .modal,html.theme--documenter-dark .image.is-square img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-square img,html.theme--documenter-dark .image.is-square .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-square .has-ratio,html.theme--documenter-dark .image.is-1by1 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-1by1 img,html.theme--documenter-dark .image.is-1by1 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-1by1 .has-ratio,html.theme--documenter-dark .image.is-5by4 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-5by4 img,html.theme--documenter-dark .image.is-5by4 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-5by4 .has-ratio,html.theme--documenter-dark .image.is-4by3 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-4by3 img,html.theme--documenter-dark .image.is-4by3 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-4by3 .has-ratio,html.theme--documenter-dark .image.is-3by2 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by2 img,html.theme--documenter-dark .image.is-3by2 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by2 .has-ratio,html.theme--documenter-dark .image.is-5by3 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-5by3 img,html.theme--documenter-dark .image.is-5by3 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-5by3 .has-ratio,html.theme--documenter-dark .image.is-16by9 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-16by9 img,html.theme--documenter-dark .image.is-16by9 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-16by9 .has-ratio,html.theme--documenter-dark .image.is-2by1 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-2by1 img,html.theme--documenter-dark .image.is-2by1 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-2by1 .has-ratio,html.theme--documenter-dark .image.is-3by1 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by1 img,html.theme--documenter-dark .image.is-3by1 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by1 .has-ratio,html.theme--documenter-dark .image.is-4by5 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-4by5 img,html.theme--documenter-dark .image.is-4by5 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-4by5 .has-ratio,html.theme--documenter-dark .image.is-3by4 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by4 img,html.theme--documenter-dark .image.is-3by4 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by4 .has-ratio,html.theme--documenter-dark .image.is-2by3 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-2by3 img,html.theme--documenter-dark .image.is-2by3 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-2by3 .has-ratio,html.theme--documenter-dark .image.is-3by5 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by5 img,html.theme--documenter-dark .image.is-3by5 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by5 .has-ratio,html.theme--documenter-dark .image.is-9by16 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-9by16 img,html.theme--documenter-dark .image.is-9by16 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-9by16 .has-ratio,html.theme--documenter-dark .image.is-1by2 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-1by2 img,html.theme--documenter-dark .image.is-1by2 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-1by2 .has-ratio,html.theme--documenter-dark .image.is-1by3 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-1by3 img,html.theme--documenter-dark .image.is-1by3 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-1by3 .has-ratio,.is-overlay{bottom:0;left:0;position:absolute;right:0;top:0}html.theme--documenter-dark .pagination-previous,html.theme--documenter-dark .pagination-next,html.theme--documenter-dark .pagination-link,html.theme--documenter-dark .pagination-ellipsis,html.theme--documenter-dark .file-cta,html.theme--documenter-dark .file-name,html.theme--documenter-dark .select select,html.theme--documenter-dark .textarea,html.theme--documenter-dark .input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input,html.theme--documenter-dark .button{-moz-appearance:none;-webkit-appearance:none;align-items:center;border:1px solid transparent;border-radius:.4em;box-shadow:none;display:inline-flex;font-size:15px;height:2.25em;justify-content:flex-start;line-height:1.5;padding-bottom:calc(0.375em - 1px);padding-left:calc(0.625em - 1px);padding-right:calc(0.625em - 1px);padding-top:calc(0.375em - 1px);position:relative;vertical-align:top}html.theme--documenter-dark .pagination-previous:focus,html.theme--documenter-dark .pagination-next:focus,html.theme--documenter-dark .pagination-link:focus,html.theme--documenter-dark .pagination-ellipsis:focus,html.theme--documenter-dark .file-cta:focus,html.theme--documenter-dark .file-name:focus,html.theme--documenter-dark .select select:focus,html.theme--documenter-dark .textarea:focus,html.theme--documenter-dark .input:focus,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input:focus,html.theme--documenter-dark .button:focus,html.theme--documenter-dark .is-focused.pagination-previous,html.theme--documenter-dark .is-focused.pagination-next,html.theme--documenter-dark .is-focused.pagination-link,html.theme--documenter-dark .is-focused.pagination-ellipsis,html.theme--documenter-dark .is-focused.file-cta,html.theme--documenter-dark .is-focused.file-name,html.theme--documenter-dark .select select.is-focused,html.theme--documenter-dark .is-focused.textarea,html.theme--documenter-dark .is-focused.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-focused,html.theme--documenter-dark .is-focused.button,html.theme--documenter-dark .pagination-previous:active,html.theme--documenter-dark .pagination-next:active,html.theme--documenter-dark .pagination-link:active,html.theme--documenter-dark .pagination-ellipsis:active,html.theme--documenter-dark .file-cta:active,html.theme--documenter-dark .file-name:active,html.theme--documenter-dark .select select:active,html.theme--documenter-dark .textarea:active,html.theme--documenter-dark .input:active,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input:active,html.theme--documenter-dark .button:active,html.theme--documenter-dark .is-active.pagination-previous,html.theme--documenter-dark .is-active.pagination-next,html.theme--documenter-dark .is-active.pagination-link,html.theme--documenter-dark .is-active.pagination-ellipsis,html.theme--documenter-dark .is-active.file-cta,html.theme--documenter-dark .is-active.file-name,html.theme--documenter-dark .select select.is-active,html.theme--documenter-dark .is-active.textarea,html.theme--documenter-dark .is-active.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-active,html.theme--documenter-dark .is-active.button{outline:none}html.theme--documenter-dark .pagination-previous[disabled],html.theme--documenter-dark .pagination-next[disabled],html.theme--documenter-dark .pagination-link[disabled],html.theme--documenter-dark .pagination-ellipsis[disabled],html.theme--documenter-dark .file-cta[disabled],html.theme--documenter-dark .file-name[disabled],html.theme--documenter-dark .select select[disabled],html.theme--documenter-dark .textarea[disabled],html.theme--documenter-dark .input[disabled],html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input[disabled],html.theme--documenter-dark .button[disabled],fieldset[disabled] html.theme--documenter-dark .pagination-previous,html.theme--documenter-dark fieldset[disabled] .pagination-previous,fieldset[disabled] html.theme--documenter-dark .pagination-next,html.theme--documenter-dark fieldset[disabled] .pagination-next,fieldset[disabled] html.theme--documenter-dark .pagination-link,html.theme--documenter-dark fieldset[disabled] .pagination-link,fieldset[disabled] html.theme--documenter-dark .pagination-ellipsis,html.theme--documenter-dark fieldset[disabled] .pagination-ellipsis,fieldset[disabled] html.theme--documenter-dark .file-cta,html.theme--documenter-dark fieldset[disabled] .file-cta,fieldset[disabled] html.theme--documenter-dark .file-name,html.theme--documenter-dark fieldset[disabled] .file-name,fieldset[disabled] html.theme--documenter-dark .select select,fieldset[disabled] html.theme--documenter-dark .textarea,fieldset[disabled] html.theme--documenter-dark .input,fieldset[disabled] html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input,html.theme--documenter-dark fieldset[disabled] .select select,html.theme--documenter-dark .select fieldset[disabled] select,html.theme--documenter-dark fieldset[disabled] .textarea,html.theme--documenter-dark fieldset[disabled] .input,html.theme--documenter-dark fieldset[disabled] #documenter .docs-sidebar form.docs-search>input,html.theme--documenter-dark #documenter .docs-sidebar fieldset[disabled] form.docs-search>input,fieldset[disabled] html.theme--documenter-dark .button,html.theme--documenter-dark fieldset[disabled] .button{cursor:not-allowed}/*! minireset.css v0.0.4 | MIT License | github.com/jgthms/minireset.css */html,body,p,ol,ul,li,dl,dt,dd,blockquote,figure,fieldset,legend,textarea,pre,iframe,hr,h1,h2,h3,h4,h5,h6{margin:0;padding:0}h1,h2,h3,h4,h5,h6{font-size:100%;font-weight:normal}ul{list-style:none}button,input,select,textarea{margin:0}html{box-sizing:border-box}*,*::before,*::after{box-sizing:inherit}img,embed,iframe,object,video{height:auto;max-width:100%}audio{max-width:100%}iframe{border:0}table{border-collapse:collapse;border-spacing:0}td,th{padding:0}td:not([align]),th:not([align]){text-align:left}.is-clearfix::after{clear:both;content:" ";display:table}.is-pulled-left{float:left !important}.is-pulled-right{float:right !important}.is-clipped{overflow:hidden !important}.is-size-1{font-size:3rem !important}.is-size-2{font-size:2.5rem !important}.is-size-3{font-size:2rem !important}.is-size-4{font-size:1.5rem !important}.is-size-5{font-size:1.25rem !important}.is-size-6{font-size:15px !important}.is-size-7,html.theme--documenter-dark .docstring>section>a.docs-sourcelink{font-size:.85em !important}@media screen and (max-width: 768px){.is-size-1-mobile{font-size:3rem !important}.is-size-2-mobile{font-size:2.5rem !important}.is-size-3-mobile{font-size:2rem !important}.is-size-4-mobile{font-size:1.5rem !important}.is-size-5-mobile{font-size:1.25rem !important}.is-size-6-mobile{font-size:15px !important}.is-size-7-mobile{font-size:.85em !important}}@media screen and (min-width: 769px),print{.is-size-1-tablet{font-size:3rem !important}.is-size-2-tablet{font-size:2.5rem !important}.is-size-3-tablet{font-size:2rem !important}.is-size-4-tablet{font-size:1.5rem !important}.is-size-5-tablet{font-size:1.25rem !important}.is-size-6-tablet{font-size:15px !important}.is-size-7-tablet{font-size:.85em !important}}@media screen and (max-width: 1055px){.is-size-1-touch{font-size:3rem !important}.is-size-2-touch{font-size:2.5rem !important}.is-size-3-touch{font-size:2rem !important}.is-size-4-touch{font-size:1.5rem !important}.is-size-5-touch{font-size:1.25rem !important}.is-size-6-touch{font-size:15px !important}.is-size-7-touch{font-size:.85em !important}}@media screen and (min-width: 1056px){.is-size-1-desktop{font-size:3rem !important}.is-size-2-desktop{font-size:2.5rem !important}.is-size-3-desktop{font-size:2rem !important}.is-size-4-desktop{font-size:1.5rem !important}.is-size-5-desktop{font-size:1.25rem !important}.is-size-6-desktop{font-size:15px !important}.is-size-7-desktop{font-size:.85em !important}}@media screen and (min-width: 1216px){.is-size-1-widescreen{font-size:3rem !important}.is-size-2-widescreen{font-size:2.5rem !important}.is-size-3-widescreen{font-size:2rem !important}.is-size-4-widescreen{font-size:1.5rem !important}.is-size-5-widescreen{font-size:1.25rem !important}.is-size-6-widescreen{font-size:15px !important}.is-size-7-widescreen{font-size:.85em !important}}@media screen and (min-width: 1408px){.is-size-1-fullhd{font-size:3rem !important}.is-size-2-fullhd{font-size:2.5rem !important}.is-size-3-fullhd{font-size:2rem !important}.is-size-4-fullhd{font-size:1.5rem !important}.is-size-5-fullhd{font-size:1.25rem !important}.is-size-6-fullhd{font-size:15px !important}.is-size-7-fullhd{font-size:.85em !important}}.has-text-centered{text-align:center !important}.has-text-justified{text-align:justify !important}.has-text-left{text-align:left !important}.has-text-right{text-align:right !important}@media screen and (max-width: 768px){.has-text-centered-mobile{text-align:center !important}}@media screen and (min-width: 769px),print{.has-text-centered-tablet{text-align:center !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.has-text-centered-tablet-only{text-align:center !important}}@media screen and (max-width: 1055px){.has-text-centered-touch{text-align:center !important}}@media screen and (min-width: 1056px){.has-text-centered-desktop{text-align:center !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.has-text-centered-desktop-only{text-align:center !important}}@media screen and (min-width: 1216px){.has-text-centered-widescreen{text-align:center !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.has-text-centered-widescreen-only{text-align:center !important}}@media screen and (min-width: 1408px){.has-text-centered-fullhd{text-align:center !important}}@media screen and (max-width: 768px){.has-text-justified-mobile{text-align:justify !important}}@media screen and (min-width: 769px),print{.has-text-justified-tablet{text-align:justify !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.has-text-justified-tablet-only{text-align:justify !important}}@media screen and (max-width: 1055px){.has-text-justified-touch{text-align:justify !important}}@media screen and (min-width: 1056px){.has-text-justified-desktop{text-align:justify !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.has-text-justified-desktop-only{text-align:justify !important}}@media screen and (min-width: 1216px){.has-text-justified-widescreen{text-align:justify !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.has-text-justified-widescreen-only{text-align:justify !important}}@media screen and (min-width: 1408px){.has-text-justified-fullhd{text-align:justify !important}}@media screen and (max-width: 768px){.has-text-left-mobile{text-align:left !important}}@media screen and (min-width: 769px),print{.has-text-left-tablet{text-align:left !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.has-text-left-tablet-only{text-align:left !important}}@media screen and (max-width: 1055px){.has-text-left-touch{text-align:left !important}}@media screen and (min-width: 1056px){.has-text-left-desktop{text-align:left !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.has-text-left-desktop-only{text-align:left !important}}@media screen and (min-width: 1216px){.has-text-left-widescreen{text-align:left !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.has-text-left-widescreen-only{text-align:left !important}}@media screen and (min-width: 1408px){.has-text-left-fullhd{text-align:left !important}}@media screen and (max-width: 768px){.has-text-right-mobile{text-align:right !important}}@media screen and (min-width: 769px),print{.has-text-right-tablet{text-align:right !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.has-text-right-tablet-only{text-align:right !important}}@media screen and (max-width: 1055px){.has-text-right-touch{text-align:right !important}}@media screen and (min-width: 1056px){.has-text-right-desktop{text-align:right !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.has-text-right-desktop-only{text-align:right !important}}@media screen and (min-width: 1216px){.has-text-right-widescreen{text-align:right !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.has-text-right-widescreen-only{text-align:right !important}}@media screen and (min-width: 1408px){.has-text-right-fullhd{text-align:right !important}}.is-capitalized{text-transform:capitalize !important}.is-lowercase{text-transform:lowercase !important}.is-uppercase{text-transform:uppercase !important}.is-italic{font-style:italic !important}.has-text-white{color:#fff !important}a.has-text-white:hover,a.has-text-white:focus{color:#e6e6e6 !important}.has-background-white{background-color:#fff !important}.has-text-black{color:#0a0a0a !important}a.has-text-black:hover,a.has-text-black:focus{color:#000 !important}.has-background-black{background-color:#0a0a0a !important}.has-text-light{color:#ecf0f1 !important}a.has-text-light:hover,a.has-text-light:focus{color:#cfd9db !important}.has-background-light{background-color:#ecf0f1 !important}.has-text-dark{color:#282f2f !important}a.has-text-dark:hover,a.has-text-dark:focus{color:#111414 !important}.has-background-dark{background-color:#282f2f !important}.has-text-primary{color:#375a7f !important}a.has-text-primary:hover,a.has-text-primary:focus{color:#28415b !important}.has-background-primary{background-color:#375a7f !important}.has-text-link{color:#1abc9c !important}a.has-text-link:hover,a.has-text-link:focus{color:#148f77 !important}.has-background-link{background-color:#1abc9c !important}.has-text-info{color:#024c7d !important}a.has-text-info:hover,a.has-text-info:focus{color:#012d4b !important}.has-background-info{background-color:#024c7d !important}.has-text-success{color:#008438 !important}a.has-text-success:hover,a.has-text-success:focus{color:#005122 !important}.has-background-success{background-color:#008438 !important}.has-text-warning{color:#ad8100 !important}a.has-text-warning:hover,a.has-text-warning:focus{color:#7a5b00 !important}.has-background-warning{background-color:#ad8100 !important}.has-text-danger{color:#9e1b0d !important}a.has-text-danger:hover,a.has-text-danger:focus{color:#6f1309 !important}.has-background-danger{background-color:#9e1b0d !important}.has-text-black-bis{color:#121212 !important}.has-background-black-bis{background-color:#121212 !important}.has-text-black-ter{color:#242424 !important}.has-background-black-ter{background-color:#242424 !important}.has-text-grey-darker{color:#282f2f !important}.has-background-grey-darker{background-color:#282f2f !important}.has-text-grey-dark{color:#343c3d !important}.has-background-grey-dark{background-color:#343c3d !important}.has-text-grey{color:#5e6d6f !important}.has-background-grey{background-color:#5e6d6f !important}.has-text-grey-light{color:#8c9b9d !important}.has-background-grey-light{background-color:#8c9b9d !important}.has-text-grey-lighter{color:#dbdee0 !important}.has-background-grey-lighter{background-color:#dbdee0 !important}.has-text-white-ter{color:#ecf0f1 !important}.has-background-white-ter{background-color:#ecf0f1 !important}.has-text-white-bis{color:#fafafa !important}.has-background-white-bis{background-color:#fafafa !important}.has-text-weight-light{font-weight:300 !important}.has-text-weight-normal{font-weight:400 !important}.has-text-weight-medium{font-weight:500 !important}.has-text-weight-semibold{font-weight:600 !important}.has-text-weight-bold{font-weight:700 !important}.is-family-primary{font-family:"Lato Medium",-apple-system,BlinkMacSystemFont,"Segoe UI","Helvetica Neue","Helvetica","Arial",sans-serif !important}.is-family-secondary{font-family:"Lato Medium",-apple-system,BlinkMacSystemFont,"Segoe UI","Helvetica Neue","Helvetica","Arial",sans-serif !important}.is-family-sans-serif{font-family:"Lato Medium",-apple-system,BlinkMacSystemFont,"Segoe UI","Helvetica Neue","Helvetica","Arial",sans-serif !important}.is-family-monospace{font-family:"JuliaMono","SFMono-Regular","Menlo","Consolas","Liberation Mono","DejaVu Sans Mono",monospace !important}.is-family-code{font-family:"JuliaMono","SFMono-Regular","Menlo","Consolas","Liberation Mono","DejaVu Sans Mono",monospace !important}.is-block{display:block !important}@media screen and (max-width: 768px){.is-block-mobile{display:block !important}}@media screen and (min-width: 769px),print{.is-block-tablet{display:block !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.is-block-tablet-only{display:block !important}}@media screen and (max-width: 1055px){.is-block-touch{display:block !important}}@media screen and (min-width: 1056px){.is-block-desktop{display:block !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.is-block-desktop-only{display:block !important}}@media screen and (min-width: 1216px){.is-block-widescreen{display:block !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.is-block-widescreen-only{display:block !important}}@media screen and (min-width: 1408px){.is-block-fullhd{display:block !important}}.is-flex{display:flex !important}@media screen and (max-width: 768px){.is-flex-mobile{display:flex !important}}@media screen and (min-width: 769px),print{.is-flex-tablet{display:flex !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.is-flex-tablet-only{display:flex !important}}@media screen and (max-width: 1055px){.is-flex-touch{display:flex !important}}@media screen and (min-width: 1056px){.is-flex-desktop{display:flex !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.is-flex-desktop-only{display:flex !important}}@media screen and (min-width: 1216px){.is-flex-widescreen{display:flex !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.is-flex-widescreen-only{display:flex !important}}@media screen and (min-width: 1408px){.is-flex-fullhd{display:flex !important}}.is-inline{display:inline !important}@media screen and (max-width: 768px){.is-inline-mobile{display:inline !important}}@media screen and (min-width: 769px),print{.is-inline-tablet{display:inline !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.is-inline-tablet-only{display:inline !important}}@media screen and (max-width: 1055px){.is-inline-touch{display:inline !important}}@media screen and (min-width: 1056px){.is-inline-desktop{display:inline !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.is-inline-desktop-only{display:inline !important}}@media screen and (min-width: 1216px){.is-inline-widescreen{display:inline !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.is-inline-widescreen-only{display:inline !important}}@media screen and (min-width: 1408px){.is-inline-fullhd{display:inline !important}}.is-inline-block{display:inline-block !important}@media screen and (max-width: 768px){.is-inline-block-mobile{display:inline-block !important}}@media screen and (min-width: 769px),print{.is-inline-block-tablet{display:inline-block !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.is-inline-block-tablet-only{display:inline-block !important}}@media screen and (max-width: 1055px){.is-inline-block-touch{display:inline-block !important}}@media screen and (min-width: 1056px){.is-inline-block-desktop{display:inline-block !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.is-inline-block-desktop-only{display:inline-block !important}}@media screen and (min-width: 1216px){.is-inline-block-widescreen{display:inline-block !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.is-inline-block-widescreen-only{display:inline-block !important}}@media screen and (min-width: 1408px){.is-inline-block-fullhd{display:inline-block !important}}.is-inline-flex{display:inline-flex !important}@media screen and (max-width: 768px){.is-inline-flex-mobile{display:inline-flex !important}}@media screen and (min-width: 769px),print{.is-inline-flex-tablet{display:inline-flex !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.is-inline-flex-tablet-only{display:inline-flex !important}}@media screen and (max-width: 1055px){.is-inline-flex-touch{display:inline-flex !important}}@media screen and (min-width: 1056px){.is-inline-flex-desktop{display:inline-flex !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.is-inline-flex-desktop-only{display:inline-flex !important}}@media screen and (min-width: 1216px){.is-inline-flex-widescreen{display:inline-flex !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.is-inline-flex-widescreen-only{display:inline-flex !important}}@media screen and (min-width: 1408px){.is-inline-flex-fullhd{display:inline-flex !important}}.is-hidden{display:none !important}.is-sr-only{border:none !important;clip:rect(0, 0, 0, 0) !important;height:0.01em !important;overflow:hidden !important;padding:0 !important;position:absolute !important;white-space:nowrap !important;width:0.01em !important}@media screen and (max-width: 768px){.is-hidden-mobile{display:none !important}}@media screen and (min-width: 769px),print{.is-hidden-tablet{display:none !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.is-hidden-tablet-only{display:none !important}}@media screen and (max-width: 1055px){.is-hidden-touch{display:none !important}}@media screen and (min-width: 1056px){.is-hidden-desktop{display:none !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.is-hidden-desktop-only{display:none !important}}@media screen and (min-width: 1216px){.is-hidden-widescreen{display:none !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.is-hidden-widescreen-only{display:none !important}}@media screen and (min-width: 1408px){.is-hidden-fullhd{display:none !important}}.is-invisible{visibility:hidden !important}@media screen and (max-width: 768px){.is-invisible-mobile{visibility:hidden !important}}@media screen and (min-width: 769px),print{.is-invisible-tablet{visibility:hidden !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.is-invisible-tablet-only{visibility:hidden !important}}@media screen and (max-width: 1055px){.is-invisible-touch{visibility:hidden !important}}@media screen and (min-width: 1056px){.is-invisible-desktop{visibility:hidden !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.is-invisible-desktop-only{visibility:hidden !important}}@media screen and (min-width: 1216px){.is-invisible-widescreen{visibility:hidden !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.is-invisible-widescreen-only{visibility:hidden !important}}@media screen and (min-width: 1408px){.is-invisible-fullhd{visibility:hidden !important}}.is-marginless{margin:0 !important}.is-paddingless{padding:0 !important}.is-radiusless{border-radius:0 !important}.is-shadowless{box-shadow:none !important}.is-relative{position:relative !important}html.theme--documenter-dark{/*! +html.theme--documenter-dark .pagination-previous,html.theme--documenter-dark .pagination-next,html.theme--documenter-dark .pagination-link,html.theme--documenter-dark .pagination-ellipsis,html.theme--documenter-dark .file-cta,html.theme--documenter-dark .file-name,html.theme--documenter-dark .select select,html.theme--documenter-dark .textarea,html.theme--documenter-dark .input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input,html.theme--documenter-dark .button{-moz-appearance:none;-webkit-appearance:none;align-items:center;border:1px solid transparent;border-radius:.4em;box-shadow:none;display:inline-flex;font-size:1rem;height:2.5em;justify-content:flex-start;line-height:1.5;padding-bottom:calc(0.5em - 1px);padding-left:calc(0.75em - 1px);padding-right:calc(0.75em - 1px);padding-top:calc(0.5em - 1px);position:relative;vertical-align:top}html.theme--documenter-dark .pagination-previous:focus,html.theme--documenter-dark .pagination-next:focus,html.theme--documenter-dark .pagination-link:focus,html.theme--documenter-dark .pagination-ellipsis:focus,html.theme--documenter-dark .file-cta:focus,html.theme--documenter-dark .file-name:focus,html.theme--documenter-dark .select select:focus,html.theme--documenter-dark .textarea:focus,html.theme--documenter-dark .input:focus,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input:focus,html.theme--documenter-dark .button:focus,html.theme--documenter-dark .is-focused.pagination-previous,html.theme--documenter-dark .is-focused.pagination-next,html.theme--documenter-dark .is-focused.pagination-link,html.theme--documenter-dark .is-focused.pagination-ellipsis,html.theme--documenter-dark .is-focused.file-cta,html.theme--documenter-dark .is-focused.file-name,html.theme--documenter-dark .select select.is-focused,html.theme--documenter-dark .is-focused.textarea,html.theme--documenter-dark .is-focused.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-focused,html.theme--documenter-dark .is-focused.button,html.theme--documenter-dark .pagination-previous:active,html.theme--documenter-dark .pagination-next:active,html.theme--documenter-dark .pagination-link:active,html.theme--documenter-dark .pagination-ellipsis:active,html.theme--documenter-dark .file-cta:active,html.theme--documenter-dark .file-name:active,html.theme--documenter-dark .select select:active,html.theme--documenter-dark .textarea:active,html.theme--documenter-dark .input:active,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input:active,html.theme--documenter-dark .button:active,html.theme--documenter-dark .is-active.pagination-previous,html.theme--documenter-dark .is-active.pagination-next,html.theme--documenter-dark .is-active.pagination-link,html.theme--documenter-dark .is-active.pagination-ellipsis,html.theme--documenter-dark .is-active.file-cta,html.theme--documenter-dark .is-active.file-name,html.theme--documenter-dark .select select.is-active,html.theme--documenter-dark .is-active.textarea,html.theme--documenter-dark .is-active.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-active,html.theme--documenter-dark .is-active.button{outline:none}html.theme--documenter-dark .pagination-previous[disabled],html.theme--documenter-dark .pagination-next[disabled],html.theme--documenter-dark .pagination-link[disabled],html.theme--documenter-dark .pagination-ellipsis[disabled],html.theme--documenter-dark .file-cta[disabled],html.theme--documenter-dark .file-name[disabled],html.theme--documenter-dark .select select[disabled],html.theme--documenter-dark .textarea[disabled],html.theme--documenter-dark .input[disabled],html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input[disabled],html.theme--documenter-dark .button[disabled],fieldset[disabled] html.theme--documenter-dark .pagination-previous,html.theme--documenter-dark fieldset[disabled] .pagination-previous,fieldset[disabled] html.theme--documenter-dark .pagination-next,html.theme--documenter-dark fieldset[disabled] .pagination-next,fieldset[disabled] html.theme--documenter-dark .pagination-link,html.theme--documenter-dark fieldset[disabled] .pagination-link,fieldset[disabled] html.theme--documenter-dark .pagination-ellipsis,html.theme--documenter-dark fieldset[disabled] .pagination-ellipsis,fieldset[disabled] html.theme--documenter-dark .file-cta,html.theme--documenter-dark fieldset[disabled] .file-cta,fieldset[disabled] html.theme--documenter-dark .file-name,html.theme--documenter-dark fieldset[disabled] .file-name,fieldset[disabled] html.theme--documenter-dark .select select,fieldset[disabled] html.theme--documenter-dark .textarea,fieldset[disabled] html.theme--documenter-dark .input,fieldset[disabled] html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input,html.theme--documenter-dark fieldset[disabled] .select select,html.theme--documenter-dark .select fieldset[disabled] select,html.theme--documenter-dark fieldset[disabled] .textarea,html.theme--documenter-dark fieldset[disabled] .input,html.theme--documenter-dark fieldset[disabled] #documenter .docs-sidebar form.docs-search>input,html.theme--documenter-dark #documenter .docs-sidebar fieldset[disabled] form.docs-search>input,fieldset[disabled] html.theme--documenter-dark .button,html.theme--documenter-dark fieldset[disabled] .button{cursor:not-allowed}html.theme--documenter-dark .tabs,html.theme--documenter-dark .pagination-previous,html.theme--documenter-dark .pagination-next,html.theme--documenter-dark .pagination-link,html.theme--documenter-dark .pagination-ellipsis,html.theme--documenter-dark .breadcrumb,html.theme--documenter-dark .file,html.theme--documenter-dark .button,.is-unselectable{-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}html.theme--documenter-dark .navbar-link:not(.is-arrowless)::after,html.theme--documenter-dark .select:not(.is-multiple):not(.is-loading)::after{border:3px solid rgba(0,0,0,0);border-radius:2px;border-right:0;border-top:0;content:" ";display:block;height:0.625em;margin-top:-0.4375em;pointer-events:none;position:absolute;top:50%;transform:rotate(-45deg);transform-origin:center;width:0.625em}html.theme--documenter-dark .admonition:not(:last-child),html.theme--documenter-dark .tabs:not(:last-child),html.theme--documenter-dark .pagination:not(:last-child),html.theme--documenter-dark .message:not(:last-child),html.theme--documenter-dark .level:not(:last-child),html.theme--documenter-dark .breadcrumb:not(:last-child),html.theme--documenter-dark .block:not(:last-child),html.theme--documenter-dark .title:not(:last-child),html.theme--documenter-dark .subtitle:not(:last-child),html.theme--documenter-dark .table-container:not(:last-child),html.theme--documenter-dark .table:not(:last-child),html.theme--documenter-dark .progress:not(:last-child),html.theme--documenter-dark .notification:not(:last-child),html.theme--documenter-dark .content:not(:last-child),html.theme--documenter-dark .box:not(:last-child){margin-bottom:1.5rem}html.theme--documenter-dark .modal-close,html.theme--documenter-dark .delete{-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-moz-appearance:none;-webkit-appearance:none;background-color:rgba(10,10,10,0.2);border:none;border-radius:9999px;cursor:pointer;pointer-events:auto;display:inline-block;flex-grow:0;flex-shrink:0;font-size:0;height:20px;max-height:20px;max-width:20px;min-height:20px;min-width:20px;outline:none;position:relative;vertical-align:top;width:20px}html.theme--documenter-dark .modal-close::before,html.theme--documenter-dark .delete::before,html.theme--documenter-dark .modal-close::after,html.theme--documenter-dark .delete::after{background-color:#fff;content:"";display:block;left:50%;position:absolute;top:50%;transform:translateX(-50%) translateY(-50%) rotate(45deg);transform-origin:center center}html.theme--documenter-dark .modal-close::before,html.theme--documenter-dark .delete::before{height:2px;width:50%}html.theme--documenter-dark .modal-close::after,html.theme--documenter-dark .delete::after{height:50%;width:2px}html.theme--documenter-dark .modal-close:hover,html.theme--documenter-dark .delete:hover,html.theme--documenter-dark .modal-close:focus,html.theme--documenter-dark .delete:focus{background-color:rgba(10,10,10,0.3)}html.theme--documenter-dark .modal-close:active,html.theme--documenter-dark .delete:active{background-color:rgba(10,10,10,0.4)}html.theme--documenter-dark .is-small.modal-close,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.modal-close,html.theme--documenter-dark .is-small.delete,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.delete{height:16px;max-height:16px;max-width:16px;min-height:16px;min-width:16px;width:16px}html.theme--documenter-dark .is-medium.modal-close,html.theme--documenter-dark .is-medium.delete{height:24px;max-height:24px;max-width:24px;min-height:24px;min-width:24px;width:24px}html.theme--documenter-dark .is-large.modal-close,html.theme--documenter-dark .is-large.delete{height:32px;max-height:32px;max-width:32px;min-height:32px;min-width:32px;width:32px}html.theme--documenter-dark .control.is-loading::after,html.theme--documenter-dark .select.is-loading::after,html.theme--documenter-dark .loader,html.theme--documenter-dark .button.is-loading::after{animation:spinAround 500ms infinite linear;border:2px solid #dbdee0;border-radius:9999px;border-right-color:transparent;border-top-color:transparent;content:"";display:block;height:1em;position:relative;width:1em}html.theme--documenter-dark .hero-video,html.theme--documenter-dark .modal-background,html.theme--documenter-dark .modal,html.theme--documenter-dark .image.is-square img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-square img,html.theme--documenter-dark .image.is-square .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-square .has-ratio,html.theme--documenter-dark .image.is-1by1 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-1by1 img,html.theme--documenter-dark .image.is-1by1 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-1by1 .has-ratio,html.theme--documenter-dark .image.is-5by4 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-5by4 img,html.theme--documenter-dark .image.is-5by4 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-5by4 .has-ratio,html.theme--documenter-dark .image.is-4by3 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-4by3 img,html.theme--documenter-dark .image.is-4by3 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-4by3 .has-ratio,html.theme--documenter-dark .image.is-3by2 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by2 img,html.theme--documenter-dark .image.is-3by2 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by2 .has-ratio,html.theme--documenter-dark .image.is-5by3 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-5by3 img,html.theme--documenter-dark .image.is-5by3 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-5by3 .has-ratio,html.theme--documenter-dark .image.is-16by9 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-16by9 img,html.theme--documenter-dark .image.is-16by9 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-16by9 .has-ratio,html.theme--documenter-dark .image.is-2by1 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-2by1 img,html.theme--documenter-dark .image.is-2by1 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-2by1 .has-ratio,html.theme--documenter-dark .image.is-3by1 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by1 img,html.theme--documenter-dark .image.is-3by1 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by1 .has-ratio,html.theme--documenter-dark .image.is-4by5 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-4by5 img,html.theme--documenter-dark .image.is-4by5 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-4by5 .has-ratio,html.theme--documenter-dark .image.is-3by4 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by4 img,html.theme--documenter-dark .image.is-3by4 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by4 .has-ratio,html.theme--documenter-dark .image.is-2by3 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-2by3 img,html.theme--documenter-dark .image.is-2by3 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-2by3 .has-ratio,html.theme--documenter-dark .image.is-3by5 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by5 img,html.theme--documenter-dark .image.is-3by5 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by5 .has-ratio,html.theme--documenter-dark .image.is-9by16 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-9by16 img,html.theme--documenter-dark .image.is-9by16 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-9by16 .has-ratio,html.theme--documenter-dark .image.is-1by2 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-1by2 img,html.theme--documenter-dark .image.is-1by2 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-1by2 .has-ratio,html.theme--documenter-dark .image.is-1by3 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-1by3 img,html.theme--documenter-dark .image.is-1by3 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-1by3 .has-ratio,.is-overlay{bottom:0;left:0;position:absolute;right:0;top:0}html.theme--documenter-dark .navbar-burger{-moz-appearance:none;-webkit-appearance:none;appearance:none;background:none;border:none;color:currentColor;font-family:inherit;font-size:1em;margin:0;padding:0}/*! minireset.css v0.0.6 | MIT License | github.com/jgthms/minireset.css */html,body,p,ol,ul,li,dl,dt,dd,blockquote,figure,fieldset,legend,textarea,pre,iframe,hr,h1,h2,h3,h4,h5,h6{margin:0;padding:0}h1,h2,h3,h4,h5,h6{font-size:100%;font-weight:normal}ul{list-style:none}button,input,select,textarea{margin:0}html{box-sizing:border-box}*,*::before,*::after{box-sizing:inherit}img,video{height:auto;max-width:100%}iframe{border:0}table{border-collapse:collapse;border-spacing:0}td,th{padding:0}td:not([align]),th:not([align]){text-align:inherit}.has-text-white{color:#fff !important}a.has-text-white:hover,a.has-text-white:focus{color:#e6e6e6 !important}.has-background-white{background-color:#fff !important}.has-text-black{color:#0a0a0a !important}a.has-text-black:hover,a.has-text-black:focus{color:#000 !important}.has-background-black{background-color:#0a0a0a !important}.has-text-light{color:#ecf0f1 !important}a.has-text-light:hover,a.has-text-light:focus{color:#cfd9db !important}.has-background-light{background-color:#ecf0f1 !important}.has-text-dark{color:#282f2f !important}a.has-text-dark:hover,a.has-text-dark:focus{color:#111414 !important}.has-background-dark{background-color:#282f2f !important}.has-text-primary{color:#375a7f !important}a.has-text-primary:hover,a.has-text-primary:focus{color:#28415b !important}.has-background-primary{background-color:#375a7f !important}.has-text-primary-light{color:#f1f5f9 !important}a.has-text-primary-light:hover,a.has-text-primary-light:focus{color:#cddbe9 !important}.has-background-primary-light{background-color:#f1f5f9 !important}.has-text-primary-dark{color:#4d7eb2 !important}a.has-text-primary-dark:hover,a.has-text-primary-dark:focus{color:#7198c1 !important}.has-background-primary-dark{background-color:#4d7eb2 !important}.has-text-link{color:#1abc9c !important}a.has-text-link:hover,a.has-text-link:focus{color:#148f77 !important}.has-background-link{background-color:#1abc9c !important}.has-text-link-light{color:#edfdf9 !important}a.has-text-link-light:hover,a.has-text-link-light:focus{color:#c0f6ec !important}.has-background-link-light{background-color:#edfdf9 !important}.has-text-link-dark{color:#15987e !important}a.has-text-link-dark:hover,a.has-text-link-dark:focus{color:#1bc5a4 !important}.has-background-link-dark{background-color:#15987e !important}.has-text-info{color:#024c7d !important}a.has-text-info:hover,a.has-text-info:focus{color:#012d4b !important}.has-background-info{background-color:#024c7d !important}.has-text-info-light{color:#ebf7ff !important}a.has-text-info-light:hover,a.has-text-info-light:focus{color:#b9e2fe !important}.has-background-info-light{background-color:#ebf7ff !important}.has-text-info-dark{color:#0e9dfb !important}a.has-text-info-dark:hover,a.has-text-info-dark:focus{color:#40b1fc !important}.has-background-info-dark{background-color:#0e9dfb !important}.has-text-success{color:#008438 !important}a.has-text-success:hover,a.has-text-success:focus{color:#005122 !important}.has-background-success{background-color:#008438 !important}.has-text-success-light{color:#ebfff3 !important}a.has-text-success-light:hover,a.has-text-success-light:focus{color:#b8ffd6 !important}.has-background-success-light{background-color:#ebfff3 !important}.has-text-success-dark{color:#00eb64 !important}a.has-text-success-dark:hover,a.has-text-success-dark:focus{color:#1fff7e !important}.has-background-success-dark{background-color:#00eb64 !important}.has-text-warning{color:#ad8100 !important}a.has-text-warning:hover,a.has-text-warning:focus{color:#7a5b00 !important}.has-background-warning{background-color:#ad8100 !important}.has-text-warning-light{color:#fffaeb !important}a.has-text-warning-light:hover,a.has-text-warning-light:focus{color:#ffedb8 !important}.has-background-warning-light{background-color:#fffaeb !important}.has-text-warning-dark{color:#d19c00 !important}a.has-text-warning-dark:hover,a.has-text-warning-dark:focus{color:#ffbf05 !important}.has-background-warning-dark{background-color:#d19c00 !important}.has-text-danger{color:#9e1b0d !important}a.has-text-danger:hover,a.has-text-danger:focus{color:#6f1309 !important}.has-background-danger{background-color:#9e1b0d !important}.has-text-danger-light{color:#fdeeec !important}a.has-text-danger-light:hover,a.has-text-danger-light:focus{color:#fac3bd !important}.has-background-danger-light{background-color:#fdeeec !important}.has-text-danger-dark{color:#ec311d !important}a.has-text-danger-dark:hover,a.has-text-danger-dark:focus{color:#f05c4c !important}.has-background-danger-dark{background-color:#ec311d !important}.has-text-black-bis{color:#121212 !important}.has-background-black-bis{background-color:#121212 !important}.has-text-black-ter{color:#242424 !important}.has-background-black-ter{background-color:#242424 !important}.has-text-grey-darker{color:#282f2f !important}.has-background-grey-darker{background-color:#282f2f !important}.has-text-grey-dark{color:#343c3d !important}.has-background-grey-dark{background-color:#343c3d !important}.has-text-grey{color:#5e6d6f !important}.has-background-grey{background-color:#5e6d6f !important}.has-text-grey-light{color:#8c9b9d !important}.has-background-grey-light{background-color:#8c9b9d !important}.has-text-grey-lighter{color:#dbdee0 !important}.has-background-grey-lighter{background-color:#dbdee0 !important}.has-text-white-ter{color:#ecf0f1 !important}.has-background-white-ter{background-color:#ecf0f1 !important}.has-text-white-bis{color:#fafafa !important}.has-background-white-bis{background-color:#fafafa !important}.is-flex-direction-row{flex-direction:row !important}.is-flex-direction-row-reverse{flex-direction:row-reverse !important}.is-flex-direction-column{flex-direction:column !important}.is-flex-direction-column-reverse{flex-direction:column-reverse !important}.is-flex-wrap-nowrap{flex-wrap:nowrap !important}.is-flex-wrap-wrap{flex-wrap:wrap !important}.is-flex-wrap-wrap-reverse{flex-wrap:wrap-reverse !important}.is-justify-content-flex-start{justify-content:flex-start !important}.is-justify-content-flex-end{justify-content:flex-end !important}.is-justify-content-center{justify-content:center !important}.is-justify-content-space-between{justify-content:space-between !important}.is-justify-content-space-around{justify-content:space-around !important}.is-justify-content-space-evenly{justify-content:space-evenly !important}.is-justify-content-start{justify-content:start !important}.is-justify-content-end{justify-content:end !important}.is-justify-content-left{justify-content:left !important}.is-justify-content-right{justify-content:right !important}.is-align-content-flex-start{align-content:flex-start !important}.is-align-content-flex-end{align-content:flex-end !important}.is-align-content-center{align-content:center !important}.is-align-content-space-between{align-content:space-between !important}.is-align-content-space-around{align-content:space-around !important}.is-align-content-space-evenly{align-content:space-evenly !important}.is-align-content-stretch{align-content:stretch !important}.is-align-content-start{align-content:start !important}.is-align-content-end{align-content:end !important}.is-align-content-baseline{align-content:baseline !important}.is-align-items-stretch{align-items:stretch !important}.is-align-items-flex-start{align-items:flex-start !important}.is-align-items-flex-end{align-items:flex-end !important}.is-align-items-center{align-items:center !important}.is-align-items-baseline{align-items:baseline !important}.is-align-items-start{align-items:start !important}.is-align-items-end{align-items:end !important}.is-align-items-self-start{align-items:self-start !important}.is-align-items-self-end{align-items:self-end !important}.is-align-self-auto{align-self:auto !important}.is-align-self-flex-start{align-self:flex-start !important}.is-align-self-flex-end{align-self:flex-end !important}.is-align-self-center{align-self:center !important}.is-align-self-baseline{align-self:baseline !important}.is-align-self-stretch{align-self:stretch !important}.is-flex-grow-0{flex-grow:0 !important}.is-flex-grow-1{flex-grow:1 !important}.is-flex-grow-2{flex-grow:2 !important}.is-flex-grow-3{flex-grow:3 !important}.is-flex-grow-4{flex-grow:4 !important}.is-flex-grow-5{flex-grow:5 !important}.is-flex-shrink-0{flex-shrink:0 !important}.is-flex-shrink-1{flex-shrink:1 !important}.is-flex-shrink-2{flex-shrink:2 !important}.is-flex-shrink-3{flex-shrink:3 !important}.is-flex-shrink-4{flex-shrink:4 !important}.is-flex-shrink-5{flex-shrink:5 !important}.is-clearfix::after{clear:both;content:" ";display:table}.is-pulled-left{float:left !important}.is-pulled-right{float:right !important}.is-radiusless{border-radius:0 !important}.is-shadowless{box-shadow:none !important}.is-clickable{cursor:pointer !important;pointer-events:all !important}.is-clipped{overflow:hidden !important}.is-relative{position:relative !important}.is-marginless{margin:0 !important}.is-paddingless{padding:0 !important}.m-0{margin:0 !important}.mt-0{margin-top:0 !important}.mr-0{margin-right:0 !important}.mb-0{margin-bottom:0 !important}.ml-0{margin-left:0 !important}.mx-0{margin-left:0 !important;margin-right:0 !important}.my-0{margin-top:0 !important;margin-bottom:0 !important}.m-1{margin:.25rem !important}.mt-1{margin-top:.25rem !important}.mr-1{margin-right:.25rem !important}.mb-1{margin-bottom:.25rem !important}.ml-1{margin-left:.25rem !important}.mx-1{margin-left:.25rem !important;margin-right:.25rem !important}.my-1{margin-top:.25rem !important;margin-bottom:.25rem !important}.m-2{margin:.5rem !important}.mt-2{margin-top:.5rem !important}.mr-2{margin-right:.5rem !important}.mb-2{margin-bottom:.5rem !important}.ml-2{margin-left:.5rem !important}.mx-2{margin-left:.5rem !important;margin-right:.5rem !important}.my-2{margin-top:.5rem !important;margin-bottom:.5rem !important}.m-3{margin:.75rem !important}.mt-3{margin-top:.75rem !important}.mr-3{margin-right:.75rem !important}.mb-3{margin-bottom:.75rem !important}.ml-3{margin-left:.75rem !important}.mx-3{margin-left:.75rem !important;margin-right:.75rem !important}.my-3{margin-top:.75rem !important;margin-bottom:.75rem !important}.m-4{margin:1rem !important}.mt-4{margin-top:1rem !important}.mr-4{margin-right:1rem !important}.mb-4{margin-bottom:1rem !important}.ml-4{margin-left:1rem !important}.mx-4{margin-left:1rem !important;margin-right:1rem !important}.my-4{margin-top:1rem !important;margin-bottom:1rem !important}.m-5{margin:1.5rem !important}.mt-5{margin-top:1.5rem !important}.mr-5{margin-right:1.5rem !important}.mb-5{margin-bottom:1.5rem !important}.ml-5{margin-left:1.5rem !important}.mx-5{margin-left:1.5rem !important;margin-right:1.5rem !important}.my-5{margin-top:1.5rem !important;margin-bottom:1.5rem !important}.m-6{margin:3rem !important}.mt-6{margin-top:3rem !important}.mr-6{margin-right:3rem !important}.mb-6{margin-bottom:3rem !important}.ml-6{margin-left:3rem !important}.mx-6{margin-left:3rem !important;margin-right:3rem !important}.my-6{margin-top:3rem !important;margin-bottom:3rem !important}.m-auto{margin:auto !important}.mt-auto{margin-top:auto !important}.mr-auto{margin-right:auto !important}.mb-auto{margin-bottom:auto !important}.ml-auto{margin-left:auto !important}.mx-auto{margin-left:auto !important;margin-right:auto !important}.my-auto{margin-top:auto !important;margin-bottom:auto !important}.p-0{padding:0 !important}.pt-0{padding-top:0 !important}.pr-0{padding-right:0 !important}.pb-0{padding-bottom:0 !important}.pl-0{padding-left:0 !important}.px-0{padding-left:0 !important;padding-right:0 !important}.py-0{padding-top:0 !important;padding-bottom:0 !important}.p-1{padding:.25rem !important}.pt-1{padding-top:.25rem !important}.pr-1{padding-right:.25rem !important}.pb-1{padding-bottom:.25rem !important}.pl-1{padding-left:.25rem !important}.px-1{padding-left:.25rem !important;padding-right:.25rem !important}.py-1{padding-top:.25rem !important;padding-bottom:.25rem !important}.p-2{padding:.5rem !important}.pt-2{padding-top:.5rem !important}.pr-2{padding-right:.5rem !important}.pb-2{padding-bottom:.5rem !important}.pl-2{padding-left:.5rem !important}.px-2{padding-left:.5rem !important;padding-right:.5rem !important}.py-2{padding-top:.5rem !important;padding-bottom:.5rem !important}.p-3{padding:.75rem !important}.pt-3{padding-top:.75rem !important}.pr-3{padding-right:.75rem !important}.pb-3{padding-bottom:.75rem !important}.pl-3{padding-left:.75rem !important}.px-3{padding-left:.75rem !important;padding-right:.75rem !important}.py-3{padding-top:.75rem !important;padding-bottom:.75rem !important}.p-4{padding:1rem !important}.pt-4{padding-top:1rem !important}.pr-4{padding-right:1rem !important}.pb-4{padding-bottom:1rem !important}.pl-4{padding-left:1rem !important}.px-4{padding-left:1rem !important;padding-right:1rem !important}.py-4{padding-top:1rem !important;padding-bottom:1rem !important}.p-5{padding:1.5rem !important}.pt-5{padding-top:1.5rem !important}.pr-5{padding-right:1.5rem !important}.pb-5{padding-bottom:1.5rem !important}.pl-5{padding-left:1.5rem !important}.px-5{padding-left:1.5rem !important;padding-right:1.5rem !important}.py-5{padding-top:1.5rem !important;padding-bottom:1.5rem !important}.p-6{padding:3rem !important}.pt-6{padding-top:3rem !important}.pr-6{padding-right:3rem !important}.pb-6{padding-bottom:3rem !important}.pl-6{padding-left:3rem !important}.px-6{padding-left:3rem !important;padding-right:3rem !important}.py-6{padding-top:3rem !important;padding-bottom:3rem !important}.p-auto{padding:auto !important}.pt-auto{padding-top:auto !important}.pr-auto{padding-right:auto !important}.pb-auto{padding-bottom:auto !important}.pl-auto{padding-left:auto !important}.px-auto{padding-left:auto !important;padding-right:auto !important}.py-auto{padding-top:auto !important;padding-bottom:auto !important}.is-size-1{font-size:3rem !important}.is-size-2{font-size:2.5rem !important}.is-size-3{font-size:2rem !important}.is-size-4{font-size:1.5rem !important}.is-size-5{font-size:1.25rem !important}.is-size-6{font-size:1rem !important}.is-size-7,html.theme--documenter-dark .docstring>section>a.docs-sourcelink{font-size:.75rem !important}@media screen and (max-width: 768px){.is-size-1-mobile{font-size:3rem !important}.is-size-2-mobile{font-size:2.5rem !important}.is-size-3-mobile{font-size:2rem !important}.is-size-4-mobile{font-size:1.5rem !important}.is-size-5-mobile{font-size:1.25rem !important}.is-size-6-mobile{font-size:1rem !important}.is-size-7-mobile{font-size:.75rem !important}}@media screen and (min-width: 769px),print{.is-size-1-tablet{font-size:3rem !important}.is-size-2-tablet{font-size:2.5rem !important}.is-size-3-tablet{font-size:2rem !important}.is-size-4-tablet{font-size:1.5rem !important}.is-size-5-tablet{font-size:1.25rem !important}.is-size-6-tablet{font-size:1rem !important}.is-size-7-tablet{font-size:.75rem !important}}@media screen and (max-width: 1055px){.is-size-1-touch{font-size:3rem !important}.is-size-2-touch{font-size:2.5rem !important}.is-size-3-touch{font-size:2rem !important}.is-size-4-touch{font-size:1.5rem !important}.is-size-5-touch{font-size:1.25rem !important}.is-size-6-touch{font-size:1rem !important}.is-size-7-touch{font-size:.75rem !important}}@media screen and (min-width: 1056px){.is-size-1-desktop{font-size:3rem !important}.is-size-2-desktop{font-size:2.5rem !important}.is-size-3-desktop{font-size:2rem !important}.is-size-4-desktop{font-size:1.5rem !important}.is-size-5-desktop{font-size:1.25rem !important}.is-size-6-desktop{font-size:1rem !important}.is-size-7-desktop{font-size:.75rem !important}}@media screen and (min-width: 1216px){.is-size-1-widescreen{font-size:3rem !important}.is-size-2-widescreen{font-size:2.5rem !important}.is-size-3-widescreen{font-size:2rem !important}.is-size-4-widescreen{font-size:1.5rem !important}.is-size-5-widescreen{font-size:1.25rem !important}.is-size-6-widescreen{font-size:1rem !important}.is-size-7-widescreen{font-size:.75rem !important}}@media screen and (min-width: 1408px){.is-size-1-fullhd{font-size:3rem !important}.is-size-2-fullhd{font-size:2.5rem !important}.is-size-3-fullhd{font-size:2rem !important}.is-size-4-fullhd{font-size:1.5rem !important}.is-size-5-fullhd{font-size:1.25rem !important}.is-size-6-fullhd{font-size:1rem !important}.is-size-7-fullhd{font-size:.75rem !important}}.has-text-centered{text-align:center !important}.has-text-justified{text-align:justify !important}.has-text-left{text-align:left !important}.has-text-right{text-align:right !important}@media screen and (max-width: 768px){.has-text-centered-mobile{text-align:center !important}}@media screen and (min-width: 769px),print{.has-text-centered-tablet{text-align:center !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.has-text-centered-tablet-only{text-align:center !important}}@media screen and (max-width: 1055px){.has-text-centered-touch{text-align:center !important}}@media screen and (min-width: 1056px){.has-text-centered-desktop{text-align:center !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.has-text-centered-desktop-only{text-align:center !important}}@media screen and (min-width: 1216px){.has-text-centered-widescreen{text-align:center !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.has-text-centered-widescreen-only{text-align:center !important}}@media screen and (min-width: 1408px){.has-text-centered-fullhd{text-align:center !important}}@media screen and (max-width: 768px){.has-text-justified-mobile{text-align:justify !important}}@media screen and (min-width: 769px),print{.has-text-justified-tablet{text-align:justify !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.has-text-justified-tablet-only{text-align:justify !important}}@media screen and (max-width: 1055px){.has-text-justified-touch{text-align:justify !important}}@media screen and (min-width: 1056px){.has-text-justified-desktop{text-align:justify !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.has-text-justified-desktop-only{text-align:justify !important}}@media screen and (min-width: 1216px){.has-text-justified-widescreen{text-align:justify !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.has-text-justified-widescreen-only{text-align:justify !important}}@media screen and (min-width: 1408px){.has-text-justified-fullhd{text-align:justify !important}}@media screen and (max-width: 768px){.has-text-left-mobile{text-align:left !important}}@media screen and (min-width: 769px),print{.has-text-left-tablet{text-align:left !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.has-text-left-tablet-only{text-align:left !important}}@media screen and (max-width: 1055px){.has-text-left-touch{text-align:left !important}}@media screen and (min-width: 1056px){.has-text-left-desktop{text-align:left !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.has-text-left-desktop-only{text-align:left !important}}@media screen and (min-width: 1216px){.has-text-left-widescreen{text-align:left !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.has-text-left-widescreen-only{text-align:left !important}}@media screen and (min-width: 1408px){.has-text-left-fullhd{text-align:left !important}}@media screen and (max-width: 768px){.has-text-right-mobile{text-align:right !important}}@media screen and (min-width: 769px),print{.has-text-right-tablet{text-align:right !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.has-text-right-tablet-only{text-align:right !important}}@media screen and (max-width: 1055px){.has-text-right-touch{text-align:right !important}}@media screen and (min-width: 1056px){.has-text-right-desktop{text-align:right !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.has-text-right-desktop-only{text-align:right !important}}@media screen and (min-width: 1216px){.has-text-right-widescreen{text-align:right !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.has-text-right-widescreen-only{text-align:right !important}}@media screen and (min-width: 1408px){.has-text-right-fullhd{text-align:right !important}}.is-capitalized{text-transform:capitalize !important}.is-lowercase{text-transform:lowercase !important}.is-uppercase{text-transform:uppercase !important}.is-italic{font-style:italic !important}.is-underlined{text-decoration:underline !important}.has-text-weight-light{font-weight:300 !important}.has-text-weight-normal{font-weight:400 !important}.has-text-weight-medium{font-weight:500 !important}.has-text-weight-semibold{font-weight:600 !important}.has-text-weight-bold{font-weight:700 !important}.is-family-primary{font-family:"Lato Medium",-apple-system,BlinkMacSystemFont,"Segoe UI","Helvetica Neue","Helvetica","Arial",sans-serif !important}.is-family-secondary{font-family:"Lato Medium",-apple-system,BlinkMacSystemFont,"Segoe UI","Helvetica Neue","Helvetica","Arial",sans-serif !important}.is-family-sans-serif{font-family:"Lato Medium",-apple-system,BlinkMacSystemFont,"Segoe UI","Helvetica Neue","Helvetica","Arial",sans-serif !important}.is-family-monospace{font-family:"JuliaMono","SFMono-Regular","Menlo","Consolas","Liberation Mono","DejaVu Sans Mono",monospace !important}.is-family-code{font-family:"JuliaMono","SFMono-Regular","Menlo","Consolas","Liberation Mono","DejaVu Sans Mono",monospace !important}.is-block{display:block !important}@media screen and (max-width: 768px){.is-block-mobile{display:block !important}}@media screen and (min-width: 769px),print{.is-block-tablet{display:block !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.is-block-tablet-only{display:block !important}}@media screen and (max-width: 1055px){.is-block-touch{display:block !important}}@media screen and (min-width: 1056px){.is-block-desktop{display:block !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.is-block-desktop-only{display:block !important}}@media screen and (min-width: 1216px){.is-block-widescreen{display:block !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.is-block-widescreen-only{display:block !important}}@media screen and (min-width: 1408px){.is-block-fullhd{display:block !important}}.is-flex{display:flex !important}@media screen and (max-width: 768px){.is-flex-mobile{display:flex !important}}@media screen and (min-width: 769px),print{.is-flex-tablet{display:flex !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.is-flex-tablet-only{display:flex !important}}@media screen and (max-width: 1055px){.is-flex-touch{display:flex !important}}@media screen and (min-width: 1056px){.is-flex-desktop{display:flex !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.is-flex-desktop-only{display:flex !important}}@media screen and (min-width: 1216px){.is-flex-widescreen{display:flex !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.is-flex-widescreen-only{display:flex !important}}@media screen and (min-width: 1408px){.is-flex-fullhd{display:flex !important}}.is-inline{display:inline !important}@media screen and (max-width: 768px){.is-inline-mobile{display:inline !important}}@media screen and (min-width: 769px),print{.is-inline-tablet{display:inline !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.is-inline-tablet-only{display:inline !important}}@media screen and (max-width: 1055px){.is-inline-touch{display:inline !important}}@media screen and (min-width: 1056px){.is-inline-desktop{display:inline !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.is-inline-desktop-only{display:inline !important}}@media screen and (min-width: 1216px){.is-inline-widescreen{display:inline !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.is-inline-widescreen-only{display:inline !important}}@media screen and (min-width: 1408px){.is-inline-fullhd{display:inline !important}}.is-inline-block{display:inline-block !important}@media screen and (max-width: 768px){.is-inline-block-mobile{display:inline-block !important}}@media screen and (min-width: 769px),print{.is-inline-block-tablet{display:inline-block !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.is-inline-block-tablet-only{display:inline-block !important}}@media screen and (max-width: 1055px){.is-inline-block-touch{display:inline-block !important}}@media screen and (min-width: 1056px){.is-inline-block-desktop{display:inline-block !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.is-inline-block-desktop-only{display:inline-block !important}}@media screen and (min-width: 1216px){.is-inline-block-widescreen{display:inline-block !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.is-inline-block-widescreen-only{display:inline-block !important}}@media screen and (min-width: 1408px){.is-inline-block-fullhd{display:inline-block !important}}.is-inline-flex{display:inline-flex !important}@media screen and (max-width: 768px){.is-inline-flex-mobile{display:inline-flex !important}}@media screen and (min-width: 769px),print{.is-inline-flex-tablet{display:inline-flex !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.is-inline-flex-tablet-only{display:inline-flex !important}}@media screen and (max-width: 1055px){.is-inline-flex-touch{display:inline-flex !important}}@media screen and (min-width: 1056px){.is-inline-flex-desktop{display:inline-flex !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.is-inline-flex-desktop-only{display:inline-flex !important}}@media screen and (min-width: 1216px){.is-inline-flex-widescreen{display:inline-flex !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.is-inline-flex-widescreen-only{display:inline-flex !important}}@media screen and (min-width: 1408px){.is-inline-flex-fullhd{display:inline-flex !important}}.is-hidden{display:none !important}.is-sr-only{border:none !important;clip:rect(0, 0, 0, 0) !important;height:0.01em !important;overflow:hidden !important;padding:0 !important;position:absolute !important;white-space:nowrap !important;width:0.01em !important}@media screen and (max-width: 768px){.is-hidden-mobile{display:none !important}}@media screen and (min-width: 769px),print{.is-hidden-tablet{display:none !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.is-hidden-tablet-only{display:none !important}}@media screen and (max-width: 1055px){.is-hidden-touch{display:none !important}}@media screen and (min-width: 1056px){.is-hidden-desktop{display:none !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.is-hidden-desktop-only{display:none !important}}@media screen and (min-width: 1216px){.is-hidden-widescreen{display:none !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.is-hidden-widescreen-only{display:none !important}}@media screen and (min-width: 1408px){.is-hidden-fullhd{display:none !important}}.is-invisible{visibility:hidden !important}@media screen and (max-width: 768px){.is-invisible-mobile{visibility:hidden !important}}@media screen and (min-width: 769px),print{.is-invisible-tablet{visibility:hidden !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.is-invisible-tablet-only{visibility:hidden !important}}@media screen and (max-width: 1055px){.is-invisible-touch{visibility:hidden !important}}@media screen and (min-width: 1056px){.is-invisible-desktop{visibility:hidden !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.is-invisible-desktop-only{visibility:hidden !important}}@media screen and (min-width: 1216px){.is-invisible-widescreen{visibility:hidden !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.is-invisible-widescreen-only{visibility:hidden !important}}@media screen and (min-width: 1408px){.is-invisible-fullhd{visibility:hidden !important}}html.theme--documenter-dark{/*! Theme: a11y-dark Author: @ericwbailey Maintainer: @ericwbailey Based on the Tomorrow Night Eighties theme: https://github.com/isagalaev/highlight.js/blob/master/src/styles/tomorrow-night-eighties.css -*/}html.theme--documenter-dark html{background-color:#1f2424;font-size:16px;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;min-width:300px;overflow-x:auto;overflow-y:scroll;text-rendering:optimizeLegibility;text-size-adjust:100%}html.theme--documenter-dark article,html.theme--documenter-dark aside,html.theme--documenter-dark figure,html.theme--documenter-dark footer,html.theme--documenter-dark header,html.theme--documenter-dark hgroup,html.theme--documenter-dark section{display:block}html.theme--documenter-dark body,html.theme--documenter-dark button,html.theme--documenter-dark input,html.theme--documenter-dark select,html.theme--documenter-dark textarea{font-family:"Lato Medium",-apple-system,BlinkMacSystemFont,"Segoe UI","Helvetica Neue","Helvetica","Arial",sans-serif}html.theme--documenter-dark code,html.theme--documenter-dark pre{-moz-osx-font-smoothing:auto;-webkit-font-smoothing:auto;font-family:"JuliaMono","SFMono-Regular","Menlo","Consolas","Liberation Mono","DejaVu Sans Mono",monospace}html.theme--documenter-dark body{color:#fff;font-size:1em;font-weight:400;line-height:1.5}html.theme--documenter-dark a{color:#1abc9c;cursor:pointer;text-decoration:none}html.theme--documenter-dark a strong{color:currentColor}html.theme--documenter-dark a:hover{color:#1dd2af}html.theme--documenter-dark code{background-color:rgba(255,255,255,0.05);color:#ececec;font-size:.875em;font-weight:normal;padding:.1em}html.theme--documenter-dark hr{background-color:#282f2f;border:none;display:block;height:2px;margin:1.5rem 0}html.theme--documenter-dark img{height:auto;max-width:100%}html.theme--documenter-dark input[type="checkbox"],html.theme--documenter-dark input[type="radio"]{vertical-align:baseline}html.theme--documenter-dark small{font-size:.875em}html.theme--documenter-dark span{font-style:inherit;font-weight:inherit}html.theme--documenter-dark strong{color:#f2f2f2;font-weight:700}html.theme--documenter-dark fieldset{border:none}html.theme--documenter-dark pre{-webkit-overflow-scrolling:touch;background-color:#282f2f;color:#fff;font-size:.875em;overflow-x:auto;padding:1.25rem 1.5rem;white-space:pre;word-wrap:normal}html.theme--documenter-dark pre code{background-color:transparent;color:currentColor;font-size:1em;padding:0}html.theme--documenter-dark table td,html.theme--documenter-dark table th{vertical-align:top}html.theme--documenter-dark table td:not([align]),html.theme--documenter-dark table th:not([align]){text-align:left}html.theme--documenter-dark table th{color:#f2f2f2}html.theme--documenter-dark .box{background-color:#343c3d;border-radius:8px;box-shadow:none;color:#fff;display:block;padding:1.25rem}html.theme--documenter-dark a.box:hover,html.theme--documenter-dark a.box:focus{box-shadow:0 2px 3px rgba(10,10,10,0.1),0 0 0 1px #1abc9c}html.theme--documenter-dark a.box:active{box-shadow:inset 0 1px 2px rgba(10,10,10,0.2),0 0 0 1px #1abc9c}html.theme--documenter-dark .button{background-color:#282f2f;border-color:#4c5759;border-width:1px;color:#375a7f;cursor:pointer;justify-content:center;padding-bottom:calc(0.375em - 1px);padding-left:.75em;padding-right:.75em;padding-top:calc(0.375em - 1px);text-align:center;white-space:nowrap}html.theme--documenter-dark .button strong{color:inherit}html.theme--documenter-dark .button .icon,html.theme--documenter-dark .button .icon.is-small,html.theme--documenter-dark .button #documenter .docs-sidebar form.docs-search>input.icon,html.theme--documenter-dark #documenter .docs-sidebar .button form.docs-search>input.icon,html.theme--documenter-dark .button .icon.is-medium,html.theme--documenter-dark .button .icon.is-large{height:1.5em;width:1.5em}html.theme--documenter-dark .button .icon:first-child:not(:last-child){margin-left:calc(-0.375em - 1px);margin-right:0.1875em}html.theme--documenter-dark .button .icon:last-child:not(:first-child){margin-left:0.1875em;margin-right:calc(-0.375em - 1px)}html.theme--documenter-dark .button .icon:first-child:last-child{margin-left:calc(-0.375em - 1px);margin-right:calc(-0.375em - 1px)}html.theme--documenter-dark .button:hover,html.theme--documenter-dark .button.is-hovered{border-color:#8c9b9d;color:#f2f2f2}html.theme--documenter-dark .button:focus,html.theme--documenter-dark .button.is-focused{border-color:#8c9b9d;color:#17a689}html.theme--documenter-dark .button:focus:not(:active),html.theme--documenter-dark .button.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(26,188,156,0.25)}html.theme--documenter-dark .button:active,html.theme--documenter-dark .button.is-active{border-color:#343c3d;color:#f2f2f2}html.theme--documenter-dark .button.is-text{background-color:transparent;border-color:transparent;color:#fff;text-decoration:underline}html.theme--documenter-dark .button.is-text:hover,html.theme--documenter-dark .button.is-text.is-hovered,html.theme--documenter-dark .button.is-text:focus,html.theme--documenter-dark .button.is-text.is-focused{background-color:#282f2f;color:#f2f2f2}html.theme--documenter-dark .button.is-text:active,html.theme--documenter-dark .button.is-text.is-active{background-color:#1d2122;color:#f2f2f2}html.theme--documenter-dark .button.is-text[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-text{background-color:transparent;border-color:transparent;box-shadow:none}html.theme--documenter-dark .button.is-white{background-color:#fff;border-color:transparent;color:#0a0a0a}html.theme--documenter-dark .button.is-white:hover,html.theme--documenter-dark .button.is-white.is-hovered{background-color:#f9f9f9;border-color:transparent;color:#0a0a0a}html.theme--documenter-dark .button.is-white:focus,html.theme--documenter-dark .button.is-white.is-focused{border-color:transparent;color:#0a0a0a}html.theme--documenter-dark .button.is-white:focus:not(:active),html.theme--documenter-dark .button.is-white.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(255,255,255,0.25)}html.theme--documenter-dark .button.is-white:active,html.theme--documenter-dark .button.is-white.is-active{background-color:#f2f2f2;border-color:transparent;color:#0a0a0a}html.theme--documenter-dark .button.is-white[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-white{background-color:#fff;border-color:transparent;box-shadow:none}html.theme--documenter-dark .button.is-white.is-inverted{background-color:#0a0a0a;color:#fff}html.theme--documenter-dark .button.is-white.is-inverted:hover,html.theme--documenter-dark .button.is-white.is-inverted.is-hovered{background-color:#000}html.theme--documenter-dark .button.is-white.is-inverted[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-white.is-inverted{background-color:#0a0a0a;border-color:transparent;box-shadow:none;color:#fff}html.theme--documenter-dark .button.is-white.is-loading::after{border-color:transparent transparent #0a0a0a #0a0a0a !important}html.theme--documenter-dark .button.is-white.is-outlined{background-color:transparent;border-color:#fff;color:#fff}html.theme--documenter-dark .button.is-white.is-outlined:hover,html.theme--documenter-dark .button.is-white.is-outlined.is-hovered,html.theme--documenter-dark .button.is-white.is-outlined:focus,html.theme--documenter-dark .button.is-white.is-outlined.is-focused{background-color:#fff;border-color:#fff;color:#0a0a0a}html.theme--documenter-dark .button.is-white.is-outlined.is-loading::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-white.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-white.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-white.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-white.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #0a0a0a #0a0a0a !important}html.theme--documenter-dark .button.is-white.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-white.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}html.theme--documenter-dark .button.is-white.is-inverted.is-outlined{background-color:transparent;border-color:#0a0a0a;color:#0a0a0a}html.theme--documenter-dark .button.is-white.is-inverted.is-outlined:hover,html.theme--documenter-dark .button.is-white.is-inverted.is-outlined.is-hovered,html.theme--documenter-dark .button.is-white.is-inverted.is-outlined:focus,html.theme--documenter-dark .button.is-white.is-inverted.is-outlined.is-focused{background-color:#0a0a0a;color:#fff}html.theme--documenter-dark .button.is-white.is-inverted.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-white.is-inverted.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-white.is-inverted.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-white.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-white.is-inverted.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-white.is-inverted.is-outlined{background-color:transparent;border-color:#0a0a0a;box-shadow:none;color:#0a0a0a}html.theme--documenter-dark .button.is-black{background-color:#0a0a0a;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-black:hover,html.theme--documenter-dark .button.is-black.is-hovered{background-color:#040404;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-black:focus,html.theme--documenter-dark .button.is-black.is-focused{border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-black:focus:not(:active),html.theme--documenter-dark .button.is-black.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(10,10,10,0.25)}html.theme--documenter-dark .button.is-black:active,html.theme--documenter-dark .button.is-black.is-active{background-color:#000;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-black[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-black{background-color:#0a0a0a;border-color:transparent;box-shadow:none}html.theme--documenter-dark .button.is-black.is-inverted{background-color:#fff;color:#0a0a0a}html.theme--documenter-dark .button.is-black.is-inverted:hover,html.theme--documenter-dark .button.is-black.is-inverted.is-hovered{background-color:#f2f2f2}html.theme--documenter-dark .button.is-black.is-inverted[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-black.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#0a0a0a}html.theme--documenter-dark .button.is-black.is-loading::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-black.is-outlined{background-color:transparent;border-color:#0a0a0a;color:#0a0a0a}html.theme--documenter-dark .button.is-black.is-outlined:hover,html.theme--documenter-dark .button.is-black.is-outlined.is-hovered,html.theme--documenter-dark .button.is-black.is-outlined:focus,html.theme--documenter-dark .button.is-black.is-outlined.is-focused{background-color:#0a0a0a;border-color:#0a0a0a;color:#fff}html.theme--documenter-dark .button.is-black.is-outlined.is-loading::after{border-color:transparent transparent #0a0a0a #0a0a0a !important}html.theme--documenter-dark .button.is-black.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-black.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-black.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-black.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-black.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-black.is-outlined{background-color:transparent;border-color:#0a0a0a;box-shadow:none;color:#0a0a0a}html.theme--documenter-dark .button.is-black.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}html.theme--documenter-dark .button.is-black.is-inverted.is-outlined:hover,html.theme--documenter-dark .button.is-black.is-inverted.is-outlined.is-hovered,html.theme--documenter-dark .button.is-black.is-inverted.is-outlined:focus,html.theme--documenter-dark .button.is-black.is-inverted.is-outlined.is-focused{background-color:#fff;color:#0a0a0a}html.theme--documenter-dark .button.is-black.is-inverted.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-black.is-inverted.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-black.is-inverted.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-black.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #0a0a0a #0a0a0a !important}html.theme--documenter-dark .button.is-black.is-inverted.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-black.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}html.theme--documenter-dark .button.is-light{background-color:#ecf0f1;border-color:transparent;color:#282f2f}html.theme--documenter-dark .button.is-light:hover,html.theme--documenter-dark .button.is-light.is-hovered{background-color:#e5eaec;border-color:transparent;color:#282f2f}html.theme--documenter-dark .button.is-light:focus,html.theme--documenter-dark .button.is-light.is-focused{border-color:transparent;color:#282f2f}html.theme--documenter-dark .button.is-light:focus:not(:active),html.theme--documenter-dark .button.is-light.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(236,240,241,0.25)}html.theme--documenter-dark .button.is-light:active,html.theme--documenter-dark .button.is-light.is-active{background-color:#dde4e6;border-color:transparent;color:#282f2f}html.theme--documenter-dark .button.is-light[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-light{background-color:#ecf0f1;border-color:transparent;box-shadow:none}html.theme--documenter-dark .button.is-light.is-inverted{background-color:#282f2f;color:#ecf0f1}html.theme--documenter-dark .button.is-light.is-inverted:hover,html.theme--documenter-dark .button.is-light.is-inverted.is-hovered{background-color:#1d2122}html.theme--documenter-dark .button.is-light.is-inverted[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-light.is-inverted{background-color:#282f2f;border-color:transparent;box-shadow:none;color:#ecf0f1}html.theme--documenter-dark .button.is-light.is-loading::after{border-color:transparent transparent #282f2f #282f2f !important}html.theme--documenter-dark .button.is-light.is-outlined{background-color:transparent;border-color:#ecf0f1;color:#ecf0f1}html.theme--documenter-dark .button.is-light.is-outlined:hover,html.theme--documenter-dark .button.is-light.is-outlined.is-hovered,html.theme--documenter-dark .button.is-light.is-outlined:focus,html.theme--documenter-dark .button.is-light.is-outlined.is-focused{background-color:#ecf0f1;border-color:#ecf0f1;color:#282f2f}html.theme--documenter-dark .button.is-light.is-outlined.is-loading::after{border-color:transparent transparent #ecf0f1 #ecf0f1 !important}html.theme--documenter-dark .button.is-light.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-light.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-light.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-light.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #282f2f #282f2f !important}html.theme--documenter-dark .button.is-light.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-light.is-outlined{background-color:transparent;border-color:#ecf0f1;box-shadow:none;color:#ecf0f1}html.theme--documenter-dark .button.is-light.is-inverted.is-outlined{background-color:transparent;border-color:#282f2f;color:#282f2f}html.theme--documenter-dark .button.is-light.is-inverted.is-outlined:hover,html.theme--documenter-dark .button.is-light.is-inverted.is-outlined.is-hovered,html.theme--documenter-dark .button.is-light.is-inverted.is-outlined:focus,html.theme--documenter-dark .button.is-light.is-inverted.is-outlined.is-focused{background-color:#282f2f;color:#ecf0f1}html.theme--documenter-dark .button.is-light.is-inverted.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-light.is-inverted.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-light.is-inverted.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-light.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #ecf0f1 #ecf0f1 !important}html.theme--documenter-dark .button.is-light.is-inverted.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-light.is-inverted.is-outlined{background-color:transparent;border-color:#282f2f;box-shadow:none;color:#282f2f}html.theme--documenter-dark .button.is-dark,html.theme--documenter-dark .content kbd.button{background-color:#282f2f;border-color:transparent;color:#ecf0f1}html.theme--documenter-dark .button.is-dark:hover,html.theme--documenter-dark .content kbd.button:hover,html.theme--documenter-dark .button.is-dark.is-hovered,html.theme--documenter-dark .content kbd.button.is-hovered{background-color:#232829;border-color:transparent;color:#ecf0f1}html.theme--documenter-dark .button.is-dark:focus,html.theme--documenter-dark .content kbd.button:focus,html.theme--documenter-dark .button.is-dark.is-focused,html.theme--documenter-dark .content kbd.button.is-focused{border-color:transparent;color:#ecf0f1}html.theme--documenter-dark .button.is-dark:focus:not(:active),html.theme--documenter-dark .content kbd.button:focus:not(:active),html.theme--documenter-dark .button.is-dark.is-focused:not(:active),html.theme--documenter-dark .content kbd.button.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(40,47,47,0.25)}html.theme--documenter-dark .button.is-dark:active,html.theme--documenter-dark .content kbd.button:active,html.theme--documenter-dark .button.is-dark.is-active,html.theme--documenter-dark .content kbd.button.is-active{background-color:#1d2122;border-color:transparent;color:#ecf0f1}html.theme--documenter-dark .button.is-dark[disabled],html.theme--documenter-dark .content kbd.button[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-dark,fieldset[disabled] html.theme--documenter-dark .content kbd.button{background-color:#282f2f;border-color:transparent;box-shadow:none}html.theme--documenter-dark .button.is-dark.is-inverted,html.theme--documenter-dark .content kbd.button.is-inverted{background-color:#ecf0f1;color:#282f2f}html.theme--documenter-dark .button.is-dark.is-inverted:hover,html.theme--documenter-dark .content kbd.button.is-inverted:hover,html.theme--documenter-dark .button.is-dark.is-inverted.is-hovered,html.theme--documenter-dark .content kbd.button.is-inverted.is-hovered{background-color:#dde4e6}html.theme--documenter-dark .button.is-dark.is-inverted[disabled],html.theme--documenter-dark .content kbd.button.is-inverted[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-dark.is-inverted,fieldset[disabled] html.theme--documenter-dark .content kbd.button.is-inverted{background-color:#ecf0f1;border-color:transparent;box-shadow:none;color:#282f2f}html.theme--documenter-dark .button.is-dark.is-loading::after,html.theme--documenter-dark .content kbd.button.is-loading::after{border-color:transparent transparent #ecf0f1 #ecf0f1 !important}html.theme--documenter-dark .button.is-dark.is-outlined,html.theme--documenter-dark .content kbd.button.is-outlined{background-color:transparent;border-color:#282f2f;color:#282f2f}html.theme--documenter-dark .button.is-dark.is-outlined:hover,html.theme--documenter-dark .content kbd.button.is-outlined:hover,html.theme--documenter-dark .button.is-dark.is-outlined.is-hovered,html.theme--documenter-dark .content kbd.button.is-outlined.is-hovered,html.theme--documenter-dark .button.is-dark.is-outlined:focus,html.theme--documenter-dark .content kbd.button.is-outlined:focus,html.theme--documenter-dark .button.is-dark.is-outlined.is-focused,html.theme--documenter-dark .content kbd.button.is-outlined.is-focused{background-color:#282f2f;border-color:#282f2f;color:#ecf0f1}html.theme--documenter-dark .button.is-dark.is-outlined.is-loading::after,html.theme--documenter-dark .content kbd.button.is-outlined.is-loading::after{border-color:transparent transparent #282f2f #282f2f !important}html.theme--documenter-dark .button.is-dark.is-outlined.is-loading:hover::after,html.theme--documenter-dark .content kbd.button.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-dark.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .content kbd.button.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-dark.is-outlined.is-loading:focus::after,html.theme--documenter-dark .content kbd.button.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-dark.is-outlined.is-loading.is-focused::after,html.theme--documenter-dark .content kbd.button.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #ecf0f1 #ecf0f1 !important}html.theme--documenter-dark .button.is-dark.is-outlined[disabled],html.theme--documenter-dark .content kbd.button.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-dark.is-outlined,fieldset[disabled] html.theme--documenter-dark .content kbd.button.is-outlined{background-color:transparent;border-color:#282f2f;box-shadow:none;color:#282f2f}html.theme--documenter-dark .button.is-dark.is-inverted.is-outlined,html.theme--documenter-dark .content kbd.button.is-inverted.is-outlined{background-color:transparent;border-color:#ecf0f1;color:#ecf0f1}html.theme--documenter-dark .button.is-dark.is-inverted.is-outlined:hover,html.theme--documenter-dark .content kbd.button.is-inverted.is-outlined:hover,html.theme--documenter-dark .button.is-dark.is-inverted.is-outlined.is-hovered,html.theme--documenter-dark .content kbd.button.is-inverted.is-outlined.is-hovered,html.theme--documenter-dark .button.is-dark.is-inverted.is-outlined:focus,html.theme--documenter-dark .content kbd.button.is-inverted.is-outlined:focus,html.theme--documenter-dark .button.is-dark.is-inverted.is-outlined.is-focused,html.theme--documenter-dark .content kbd.button.is-inverted.is-outlined.is-focused{background-color:#ecf0f1;color:#282f2f}html.theme--documenter-dark .button.is-dark.is-inverted.is-outlined.is-loading:hover::after,html.theme--documenter-dark .content kbd.button.is-inverted.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-dark.is-inverted.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .content kbd.button.is-inverted.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-dark.is-inverted.is-outlined.is-loading:focus::after,html.theme--documenter-dark .content kbd.button.is-inverted.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-dark.is-inverted.is-outlined.is-loading.is-focused::after,html.theme--documenter-dark .content kbd.button.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #282f2f #282f2f !important}html.theme--documenter-dark .button.is-dark.is-inverted.is-outlined[disabled],html.theme--documenter-dark .content kbd.button.is-inverted.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-dark.is-inverted.is-outlined,fieldset[disabled] html.theme--documenter-dark .content kbd.button.is-inverted.is-outlined{background-color:transparent;border-color:#ecf0f1;box-shadow:none;color:#ecf0f1}html.theme--documenter-dark .button.is-primary,html.theme--documenter-dark .docstring>section>a.button.docs-sourcelink{background-color:#375a7f;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-primary:hover,html.theme--documenter-dark .docstring>section>a.button.docs-sourcelink:hover,html.theme--documenter-dark .button.is-primary.is-hovered,html.theme--documenter-dark .docstring>section>a.button.is-hovered.docs-sourcelink{background-color:#335476;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-primary:focus,html.theme--documenter-dark .docstring>section>a.button.docs-sourcelink:focus,html.theme--documenter-dark .button.is-primary.is-focused,html.theme--documenter-dark .docstring>section>a.button.is-focused.docs-sourcelink{border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-primary:focus:not(:active),html.theme--documenter-dark .docstring>section>a.button.docs-sourcelink:focus:not(:active),html.theme--documenter-dark .button.is-primary.is-focused:not(:active),html.theme--documenter-dark .docstring>section>a.button.is-focused.docs-sourcelink:not(:active){box-shadow:0 0 0 0.125em rgba(55,90,127,0.25)}html.theme--documenter-dark .button.is-primary:active,html.theme--documenter-dark .docstring>section>a.button.docs-sourcelink:active,html.theme--documenter-dark .button.is-primary.is-active,html.theme--documenter-dark .docstring>section>a.button.is-active.docs-sourcelink{background-color:#2f4d6d;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-primary[disabled],html.theme--documenter-dark .docstring>section>a.button.docs-sourcelink[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-primary,fieldset[disabled] html.theme--documenter-dark .docstring>section>a.button.docs-sourcelink{background-color:#375a7f;border-color:transparent;box-shadow:none}html.theme--documenter-dark .button.is-primary.is-inverted,html.theme--documenter-dark .docstring>section>a.button.is-inverted.docs-sourcelink{background-color:#fff;color:#375a7f}html.theme--documenter-dark .button.is-primary.is-inverted:hover,html.theme--documenter-dark .docstring>section>a.button.is-inverted.docs-sourcelink:hover,html.theme--documenter-dark .button.is-primary.is-inverted.is-hovered,html.theme--documenter-dark .docstring>section>a.button.is-inverted.is-hovered.docs-sourcelink{background-color:#f2f2f2}html.theme--documenter-dark .button.is-primary.is-inverted[disabled],html.theme--documenter-dark .docstring>section>a.button.is-inverted.docs-sourcelink[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-primary.is-inverted,fieldset[disabled] html.theme--documenter-dark .docstring>section>a.button.is-inverted.docs-sourcelink{background-color:#fff;border-color:transparent;box-shadow:none;color:#375a7f}html.theme--documenter-dark .button.is-primary.is-loading::after,html.theme--documenter-dark .docstring>section>a.button.is-loading.docs-sourcelink::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-primary.is-outlined,html.theme--documenter-dark .docstring>section>a.button.is-outlined.docs-sourcelink{background-color:transparent;border-color:#375a7f;color:#375a7f}html.theme--documenter-dark .button.is-primary.is-outlined:hover,html.theme--documenter-dark .docstring>section>a.button.is-outlined.docs-sourcelink:hover,html.theme--documenter-dark .button.is-primary.is-outlined.is-hovered,html.theme--documenter-dark .docstring>section>a.button.is-outlined.is-hovered.docs-sourcelink,html.theme--documenter-dark .button.is-primary.is-outlined:focus,html.theme--documenter-dark .docstring>section>a.button.is-outlined.docs-sourcelink:focus,html.theme--documenter-dark .button.is-primary.is-outlined.is-focused,html.theme--documenter-dark .docstring>section>a.button.is-outlined.is-focused.docs-sourcelink{background-color:#375a7f;border-color:#375a7f;color:#fff}html.theme--documenter-dark .button.is-primary.is-outlined.is-loading::after,html.theme--documenter-dark .docstring>section>a.button.is-outlined.is-loading.docs-sourcelink::after{border-color:transparent transparent #375a7f #375a7f !important}html.theme--documenter-dark .button.is-primary.is-outlined.is-loading:hover::after,html.theme--documenter-dark .docstring>section>a.button.is-outlined.is-loading.docs-sourcelink:hover::after,html.theme--documenter-dark .button.is-primary.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .docstring>section>a.button.is-outlined.is-loading.is-hovered.docs-sourcelink::after,html.theme--documenter-dark .button.is-primary.is-outlined.is-loading:focus::after,html.theme--documenter-dark .docstring>section>a.button.is-outlined.is-loading.docs-sourcelink:focus::after,html.theme--documenter-dark .button.is-primary.is-outlined.is-loading.is-focused::after,html.theme--documenter-dark .docstring>section>a.button.is-outlined.is-loading.is-focused.docs-sourcelink::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-primary.is-outlined[disabled],html.theme--documenter-dark .docstring>section>a.button.is-outlined.docs-sourcelink[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-primary.is-outlined,fieldset[disabled] html.theme--documenter-dark .docstring>section>a.button.is-outlined.docs-sourcelink{background-color:transparent;border-color:#375a7f;box-shadow:none;color:#375a7f}html.theme--documenter-dark .button.is-primary.is-inverted.is-outlined,html.theme--documenter-dark .docstring>section>a.button.is-inverted.is-outlined.docs-sourcelink{background-color:transparent;border-color:#fff;color:#fff}html.theme--documenter-dark .button.is-primary.is-inverted.is-outlined:hover,html.theme--documenter-dark .docstring>section>a.button.is-inverted.is-outlined.docs-sourcelink:hover,html.theme--documenter-dark .button.is-primary.is-inverted.is-outlined.is-hovered,html.theme--documenter-dark .docstring>section>a.button.is-inverted.is-outlined.is-hovered.docs-sourcelink,html.theme--documenter-dark .button.is-primary.is-inverted.is-outlined:focus,html.theme--documenter-dark .docstring>section>a.button.is-inverted.is-outlined.docs-sourcelink:focus,html.theme--documenter-dark .button.is-primary.is-inverted.is-outlined.is-focused,html.theme--documenter-dark .docstring>section>a.button.is-inverted.is-outlined.is-focused.docs-sourcelink{background-color:#fff;color:#375a7f}html.theme--documenter-dark .button.is-primary.is-inverted.is-outlined.is-loading:hover::after,html.theme--documenter-dark .docstring>section>a.button.is-inverted.is-outlined.is-loading.docs-sourcelink:hover::after,html.theme--documenter-dark .button.is-primary.is-inverted.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .docstring>section>a.button.is-inverted.is-outlined.is-loading.is-hovered.docs-sourcelink::after,html.theme--documenter-dark .button.is-primary.is-inverted.is-outlined.is-loading:focus::after,html.theme--documenter-dark .docstring>section>a.button.is-inverted.is-outlined.is-loading.docs-sourcelink:focus::after,html.theme--documenter-dark .button.is-primary.is-inverted.is-outlined.is-loading.is-focused::after,html.theme--documenter-dark .docstring>section>a.button.is-inverted.is-outlined.is-loading.is-focused.docs-sourcelink::after{border-color:transparent transparent #375a7f #375a7f !important}html.theme--documenter-dark .button.is-primary.is-inverted.is-outlined[disabled],html.theme--documenter-dark .docstring>section>a.button.is-inverted.is-outlined.docs-sourcelink[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-primary.is-inverted.is-outlined,fieldset[disabled] html.theme--documenter-dark .docstring>section>a.button.is-inverted.is-outlined.docs-sourcelink{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}html.theme--documenter-dark .button.is-link{background-color:#1abc9c;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-link:hover,html.theme--documenter-dark .button.is-link.is-hovered{background-color:#18b193;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-link:focus,html.theme--documenter-dark .button.is-link.is-focused{border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-link:focus:not(:active),html.theme--documenter-dark .button.is-link.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(26,188,156,0.25)}html.theme--documenter-dark .button.is-link:active,html.theme--documenter-dark .button.is-link.is-active{background-color:#17a689;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-link[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-link{background-color:#1abc9c;border-color:transparent;box-shadow:none}html.theme--documenter-dark .button.is-link.is-inverted{background-color:#fff;color:#1abc9c}html.theme--documenter-dark .button.is-link.is-inverted:hover,html.theme--documenter-dark .button.is-link.is-inverted.is-hovered{background-color:#f2f2f2}html.theme--documenter-dark .button.is-link.is-inverted[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-link.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#1abc9c}html.theme--documenter-dark .button.is-link.is-loading::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-link.is-outlined{background-color:transparent;border-color:#1abc9c;color:#1abc9c}html.theme--documenter-dark .button.is-link.is-outlined:hover,html.theme--documenter-dark .button.is-link.is-outlined.is-hovered,html.theme--documenter-dark .button.is-link.is-outlined:focus,html.theme--documenter-dark .button.is-link.is-outlined.is-focused{background-color:#1abc9c;border-color:#1abc9c;color:#fff}html.theme--documenter-dark .button.is-link.is-outlined.is-loading::after{border-color:transparent transparent #1abc9c #1abc9c !important}html.theme--documenter-dark .button.is-link.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-link.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-link.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-link.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-link.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-link.is-outlined{background-color:transparent;border-color:#1abc9c;box-shadow:none;color:#1abc9c}html.theme--documenter-dark .button.is-link.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}html.theme--documenter-dark .button.is-link.is-inverted.is-outlined:hover,html.theme--documenter-dark .button.is-link.is-inverted.is-outlined.is-hovered,html.theme--documenter-dark .button.is-link.is-inverted.is-outlined:focus,html.theme--documenter-dark .button.is-link.is-inverted.is-outlined.is-focused{background-color:#fff;color:#1abc9c}html.theme--documenter-dark .button.is-link.is-inverted.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-link.is-inverted.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-link.is-inverted.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-link.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #1abc9c #1abc9c !important}html.theme--documenter-dark .button.is-link.is-inverted.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-link.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}html.theme--documenter-dark .button.is-info{background-color:#024c7d;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-info:hover,html.theme--documenter-dark .button.is-info.is-hovered{background-color:#024470;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-info:focus,html.theme--documenter-dark .button.is-info.is-focused{border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-info:focus:not(:active),html.theme--documenter-dark .button.is-info.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(2,76,125,0.25)}html.theme--documenter-dark .button.is-info:active,html.theme--documenter-dark .button.is-info.is-active{background-color:#023d64;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-info[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-info{background-color:#024c7d;border-color:transparent;box-shadow:none}html.theme--documenter-dark .button.is-info.is-inverted{background-color:#fff;color:#024c7d}html.theme--documenter-dark .button.is-info.is-inverted:hover,html.theme--documenter-dark .button.is-info.is-inverted.is-hovered{background-color:#f2f2f2}html.theme--documenter-dark .button.is-info.is-inverted[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-info.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#024c7d}html.theme--documenter-dark .button.is-info.is-loading::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-info.is-outlined{background-color:transparent;border-color:#024c7d;color:#024c7d}html.theme--documenter-dark .button.is-info.is-outlined:hover,html.theme--documenter-dark .button.is-info.is-outlined.is-hovered,html.theme--documenter-dark .button.is-info.is-outlined:focus,html.theme--documenter-dark .button.is-info.is-outlined.is-focused{background-color:#024c7d;border-color:#024c7d;color:#fff}html.theme--documenter-dark .button.is-info.is-outlined.is-loading::after{border-color:transparent transparent #024c7d #024c7d !important}html.theme--documenter-dark .button.is-info.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-info.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-info.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-info.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-info.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-info.is-outlined{background-color:transparent;border-color:#024c7d;box-shadow:none;color:#024c7d}html.theme--documenter-dark .button.is-info.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}html.theme--documenter-dark .button.is-info.is-inverted.is-outlined:hover,html.theme--documenter-dark .button.is-info.is-inverted.is-outlined.is-hovered,html.theme--documenter-dark .button.is-info.is-inverted.is-outlined:focus,html.theme--documenter-dark .button.is-info.is-inverted.is-outlined.is-focused{background-color:#fff;color:#024c7d}html.theme--documenter-dark .button.is-info.is-inverted.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-info.is-inverted.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-info.is-inverted.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-info.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #024c7d #024c7d !important}html.theme--documenter-dark .button.is-info.is-inverted.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-info.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}html.theme--documenter-dark .button.is-success{background-color:#008438;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-success:hover,html.theme--documenter-dark .button.is-success.is-hovered{background-color:#073;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-success:focus,html.theme--documenter-dark .button.is-success.is-focused{border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-success:focus:not(:active),html.theme--documenter-dark .button.is-success.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(0,132,56,0.25)}html.theme--documenter-dark .button.is-success:active,html.theme--documenter-dark .button.is-success.is-active{background-color:#006b2d;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-success[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-success{background-color:#008438;border-color:transparent;box-shadow:none}html.theme--documenter-dark .button.is-success.is-inverted{background-color:#fff;color:#008438}html.theme--documenter-dark .button.is-success.is-inverted:hover,html.theme--documenter-dark .button.is-success.is-inverted.is-hovered{background-color:#f2f2f2}html.theme--documenter-dark .button.is-success.is-inverted[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-success.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#008438}html.theme--documenter-dark .button.is-success.is-loading::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-success.is-outlined{background-color:transparent;border-color:#008438;color:#008438}html.theme--documenter-dark .button.is-success.is-outlined:hover,html.theme--documenter-dark .button.is-success.is-outlined.is-hovered,html.theme--documenter-dark .button.is-success.is-outlined:focus,html.theme--documenter-dark .button.is-success.is-outlined.is-focused{background-color:#008438;border-color:#008438;color:#fff}html.theme--documenter-dark .button.is-success.is-outlined.is-loading::after{border-color:transparent transparent #008438 #008438 !important}html.theme--documenter-dark .button.is-success.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-success.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-success.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-success.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-success.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-success.is-outlined{background-color:transparent;border-color:#008438;box-shadow:none;color:#008438}html.theme--documenter-dark .button.is-success.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}html.theme--documenter-dark .button.is-success.is-inverted.is-outlined:hover,html.theme--documenter-dark .button.is-success.is-inverted.is-outlined.is-hovered,html.theme--documenter-dark .button.is-success.is-inverted.is-outlined:focus,html.theme--documenter-dark .button.is-success.is-inverted.is-outlined.is-focused{background-color:#fff;color:#008438}html.theme--documenter-dark .button.is-success.is-inverted.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-success.is-inverted.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-success.is-inverted.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-success.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #008438 #008438 !important}html.theme--documenter-dark .button.is-success.is-inverted.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-success.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}html.theme--documenter-dark .button.is-warning{background-color:#ad8100;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-warning:hover,html.theme--documenter-dark .button.is-warning.is-hovered{background-color:#a07700;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-warning:focus,html.theme--documenter-dark .button.is-warning.is-focused{border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-warning:focus:not(:active),html.theme--documenter-dark .button.is-warning.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(173,129,0,0.25)}html.theme--documenter-dark .button.is-warning:active,html.theme--documenter-dark .button.is-warning.is-active{background-color:#946e00;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-warning[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-warning{background-color:#ad8100;border-color:transparent;box-shadow:none}html.theme--documenter-dark .button.is-warning.is-inverted{background-color:#fff;color:#ad8100}html.theme--documenter-dark .button.is-warning.is-inverted:hover,html.theme--documenter-dark .button.is-warning.is-inverted.is-hovered{background-color:#f2f2f2}html.theme--documenter-dark .button.is-warning.is-inverted[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-warning.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#ad8100}html.theme--documenter-dark .button.is-warning.is-loading::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-warning.is-outlined{background-color:transparent;border-color:#ad8100;color:#ad8100}html.theme--documenter-dark .button.is-warning.is-outlined:hover,html.theme--documenter-dark .button.is-warning.is-outlined.is-hovered,html.theme--documenter-dark .button.is-warning.is-outlined:focus,html.theme--documenter-dark .button.is-warning.is-outlined.is-focused{background-color:#ad8100;border-color:#ad8100;color:#fff}html.theme--documenter-dark .button.is-warning.is-outlined.is-loading::after{border-color:transparent transparent #ad8100 #ad8100 !important}html.theme--documenter-dark .button.is-warning.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-warning.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-warning.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-warning.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-warning.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-warning.is-outlined{background-color:transparent;border-color:#ad8100;box-shadow:none;color:#ad8100}html.theme--documenter-dark .button.is-warning.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}html.theme--documenter-dark .button.is-warning.is-inverted.is-outlined:hover,html.theme--documenter-dark .button.is-warning.is-inverted.is-outlined.is-hovered,html.theme--documenter-dark .button.is-warning.is-inverted.is-outlined:focus,html.theme--documenter-dark .button.is-warning.is-inverted.is-outlined.is-focused{background-color:#fff;color:#ad8100}html.theme--documenter-dark .button.is-warning.is-inverted.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-warning.is-inverted.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-warning.is-inverted.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-warning.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #ad8100 #ad8100 !important}html.theme--documenter-dark .button.is-warning.is-inverted.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-warning.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}html.theme--documenter-dark .button.is-danger{background-color:#9e1b0d;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-danger:hover,html.theme--documenter-dark .button.is-danger.is-hovered{background-color:#92190c;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-danger:focus,html.theme--documenter-dark .button.is-danger.is-focused{border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-danger:focus:not(:active),html.theme--documenter-dark .button.is-danger.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(158,27,13,0.25)}html.theme--documenter-dark .button.is-danger:active,html.theme--documenter-dark .button.is-danger.is-active{background-color:#86170b;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-danger[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-danger{background-color:#9e1b0d;border-color:transparent;box-shadow:none}html.theme--documenter-dark .button.is-danger.is-inverted{background-color:#fff;color:#9e1b0d}html.theme--documenter-dark .button.is-danger.is-inverted:hover,html.theme--documenter-dark .button.is-danger.is-inverted.is-hovered{background-color:#f2f2f2}html.theme--documenter-dark .button.is-danger.is-inverted[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-danger.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#9e1b0d}html.theme--documenter-dark .button.is-danger.is-loading::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-danger.is-outlined{background-color:transparent;border-color:#9e1b0d;color:#9e1b0d}html.theme--documenter-dark .button.is-danger.is-outlined:hover,html.theme--documenter-dark .button.is-danger.is-outlined.is-hovered,html.theme--documenter-dark .button.is-danger.is-outlined:focus,html.theme--documenter-dark .button.is-danger.is-outlined.is-focused{background-color:#9e1b0d;border-color:#9e1b0d;color:#fff}html.theme--documenter-dark .button.is-danger.is-outlined.is-loading::after{border-color:transparent transparent #9e1b0d #9e1b0d !important}html.theme--documenter-dark .button.is-danger.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-danger.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-danger.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-danger.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-danger.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-danger.is-outlined{background-color:transparent;border-color:#9e1b0d;box-shadow:none;color:#9e1b0d}html.theme--documenter-dark .button.is-danger.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}html.theme--documenter-dark .button.is-danger.is-inverted.is-outlined:hover,html.theme--documenter-dark .button.is-danger.is-inverted.is-outlined.is-hovered,html.theme--documenter-dark .button.is-danger.is-inverted.is-outlined:focus,html.theme--documenter-dark .button.is-danger.is-inverted.is-outlined.is-focused{background-color:#fff;color:#9e1b0d}html.theme--documenter-dark .button.is-danger.is-inverted.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-danger.is-inverted.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-danger.is-inverted.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-danger.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #9e1b0d #9e1b0d !important}html.theme--documenter-dark .button.is-danger.is-inverted.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-danger.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}html.theme--documenter-dark .button.is-small,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.button{border-radius:3px;font-size:.85em}html.theme--documenter-dark .button.is-normal{font-size:15px}html.theme--documenter-dark .button.is-medium{font-size:1.25rem}html.theme--documenter-dark .button.is-large{font-size:1.5rem}html.theme--documenter-dark .button[disabled],fieldset[disabled] html.theme--documenter-dark .button{background-color:#8c9b9d;border-color:#dbdee0;box-shadow:none;opacity:.5}html.theme--documenter-dark .button.is-fullwidth{display:flex;width:100%}html.theme--documenter-dark .button.is-loading{color:transparent !important;pointer-events:none}html.theme--documenter-dark .button.is-loading::after{position:absolute;left:calc(50% - (1em / 2));top:calc(50% - (1em / 2));position:absolute !important}html.theme--documenter-dark .button.is-static{background-color:#282f2f;border-color:#5e6d6f;color:#dbdee0;box-shadow:none;pointer-events:none}html.theme--documenter-dark .button.is-rounded,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.button{border-radius:290486px;padding-left:1em;padding-right:1em}html.theme--documenter-dark .buttons{align-items:center;display:flex;flex-wrap:wrap;justify-content:flex-start}html.theme--documenter-dark .buttons .button{margin-bottom:0.5rem}html.theme--documenter-dark .buttons .button:not(:last-child):not(.is-fullwidth){margin-right:0.5rem}html.theme--documenter-dark .buttons:last-child{margin-bottom:-0.5rem}html.theme--documenter-dark .buttons:not(:last-child){margin-bottom:1rem}html.theme--documenter-dark .buttons.are-small .button:not(.is-normal):not(.is-medium):not(.is-large){border-radius:3px;font-size:.85em}html.theme--documenter-dark .buttons.are-medium .button:not(.is-small):not(.is-normal):not(.is-large){font-size:1.25rem}html.theme--documenter-dark .buttons.are-large .button:not(.is-small):not(.is-normal):not(.is-medium){font-size:1.5rem}html.theme--documenter-dark .buttons.has-addons .button:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}html.theme--documenter-dark .buttons.has-addons .button:not(:last-child){border-bottom-right-radius:0;border-top-right-radius:0;margin-right:-1px}html.theme--documenter-dark .buttons.has-addons .button:last-child{margin-right:0}html.theme--documenter-dark .buttons.has-addons .button:hover,html.theme--documenter-dark .buttons.has-addons .button.is-hovered{z-index:2}html.theme--documenter-dark .buttons.has-addons .button:focus,html.theme--documenter-dark .buttons.has-addons .button.is-focused,html.theme--documenter-dark .buttons.has-addons .button:active,html.theme--documenter-dark .buttons.has-addons .button.is-active,html.theme--documenter-dark .buttons.has-addons .button.is-selected{z-index:3}html.theme--documenter-dark .buttons.has-addons .button:focus:hover,html.theme--documenter-dark .buttons.has-addons .button.is-focused:hover,html.theme--documenter-dark .buttons.has-addons .button:active:hover,html.theme--documenter-dark .buttons.has-addons .button.is-active:hover,html.theme--documenter-dark .buttons.has-addons .button.is-selected:hover{z-index:4}html.theme--documenter-dark .buttons.has-addons .button.is-expanded{flex-grow:1;flex-shrink:1}html.theme--documenter-dark .buttons.is-centered{justify-content:center}html.theme--documenter-dark .buttons.is-centered:not(.has-addons) .button:not(.is-fullwidth){margin-left:0.25rem;margin-right:0.25rem}html.theme--documenter-dark .buttons.is-right{justify-content:flex-end}html.theme--documenter-dark .buttons.is-right:not(.has-addons) .button:not(.is-fullwidth){margin-left:0.25rem;margin-right:0.25rem}html.theme--documenter-dark .container{flex-grow:1;margin:0 auto;position:relative;width:auto}@media screen and (min-width: 1056px){html.theme--documenter-dark .container{max-width:992px}html.theme--documenter-dark .container.is-fluid{margin-left:32px;margin-right:32px;max-width:none}}@media screen and (max-width: 1215px){html.theme--documenter-dark .container.is-widescreen{max-width:1152px}}@media screen and (max-width: 1407px){html.theme--documenter-dark .container.is-fullhd{max-width:1344px}}@media screen and (min-width: 1216px){html.theme--documenter-dark .container{max-width:1152px}}@media screen and (min-width: 1408px){html.theme--documenter-dark .container{max-width:1344px}}html.theme--documenter-dark .content li+li{margin-top:0.25em}html.theme--documenter-dark .content p:not(:last-child),html.theme--documenter-dark .content dl:not(:last-child),html.theme--documenter-dark .content ol:not(:last-child),html.theme--documenter-dark .content ul:not(:last-child),html.theme--documenter-dark .content blockquote:not(:last-child),html.theme--documenter-dark .content pre:not(:last-child),html.theme--documenter-dark .content table:not(:last-child){margin-bottom:1em}html.theme--documenter-dark .content h1,html.theme--documenter-dark .content h2,html.theme--documenter-dark .content h3,html.theme--documenter-dark .content h4,html.theme--documenter-dark .content h5,html.theme--documenter-dark .content h6{color:#f2f2f2;font-weight:600;line-height:1.125}html.theme--documenter-dark .content h1{font-size:2em;margin-bottom:0.5em}html.theme--documenter-dark .content h1:not(:first-child){margin-top:1em}html.theme--documenter-dark .content h2{font-size:1.75em;margin-bottom:0.5714em}html.theme--documenter-dark .content h2:not(:first-child){margin-top:1.1428em}html.theme--documenter-dark .content h3{font-size:1.5em;margin-bottom:0.6666em}html.theme--documenter-dark .content h3:not(:first-child){margin-top:1.3333em}html.theme--documenter-dark .content h4{font-size:1.25em;margin-bottom:0.8em}html.theme--documenter-dark .content h5{font-size:1.125em;margin-bottom:0.8888em}html.theme--documenter-dark .content h6{font-size:1em;margin-bottom:1em}html.theme--documenter-dark .content blockquote{background-color:#282f2f;border-left:5px solid #5e6d6f;padding:1.25em 1.5em}html.theme--documenter-dark .content ol{list-style-position:outside;margin-left:2em;margin-top:1em}html.theme--documenter-dark .content ol:not([type]){list-style-type:decimal}html.theme--documenter-dark .content ol.is-lower-alpha:not([type]){list-style-type:lower-alpha}html.theme--documenter-dark .content ol.is-lower-roman:not([type]){list-style-type:lower-roman}html.theme--documenter-dark .content ol.is-upper-alpha:not([type]){list-style-type:upper-alpha}html.theme--documenter-dark .content ol.is-upper-roman:not([type]){list-style-type:upper-roman}html.theme--documenter-dark .content ul{list-style:disc outside;margin-left:2em;margin-top:1em}html.theme--documenter-dark .content ul ul{list-style-type:circle;margin-top:0.5em}html.theme--documenter-dark .content ul ul ul{list-style-type:square}html.theme--documenter-dark .content dd{margin-left:2em}html.theme--documenter-dark .content figure{margin-left:2em;margin-right:2em;text-align:center}html.theme--documenter-dark .content figure:not(:first-child){margin-top:2em}html.theme--documenter-dark .content figure:not(:last-child){margin-bottom:2em}html.theme--documenter-dark .content figure img{display:inline-block}html.theme--documenter-dark .content figure figcaption{font-style:italic}html.theme--documenter-dark .content pre{-webkit-overflow-scrolling:touch;overflow-x:auto;padding:0;white-space:pre;word-wrap:normal}html.theme--documenter-dark .content sup,html.theme--documenter-dark .content sub{font-size:75%}html.theme--documenter-dark .content table{width:100%}html.theme--documenter-dark .content table td,html.theme--documenter-dark .content table th{border:1px solid #5e6d6f;border-width:0 0 1px;padding:0.5em 0.75em;vertical-align:top}html.theme--documenter-dark .content table th{color:#f2f2f2}html.theme--documenter-dark .content table th:not([align]){text-align:left}html.theme--documenter-dark .content table thead td,html.theme--documenter-dark .content table thead th{border-width:0 0 2px;color:#f2f2f2}html.theme--documenter-dark .content table tfoot td,html.theme--documenter-dark .content table tfoot th{border-width:2px 0 0;color:#f2f2f2}html.theme--documenter-dark .content table tbody tr:last-child td,html.theme--documenter-dark .content table tbody tr:last-child th{border-bottom-width:0}html.theme--documenter-dark .content .tabs li+li{margin-top:0}html.theme--documenter-dark .content.is-small,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.content{font-size:.85em}html.theme--documenter-dark .content.is-medium{font-size:1.25rem}html.theme--documenter-dark .content.is-large{font-size:1.5rem}html.theme--documenter-dark .icon{align-items:center;display:inline-flex;justify-content:center;height:1.5rem;width:1.5rem}html.theme--documenter-dark .icon.is-small,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.icon{height:1rem;width:1rem}html.theme--documenter-dark .icon.is-medium{height:2rem;width:2rem}html.theme--documenter-dark .icon.is-large{height:3rem;width:3rem}html.theme--documenter-dark .image,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img{display:block;position:relative}html.theme--documenter-dark .image img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img img{display:block;height:auto;width:100%}html.theme--documenter-dark .image img.is-rounded,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img img.is-rounded{border-radius:290486px}html.theme--documenter-dark .image.is-square img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-square img,html.theme--documenter-dark .image.is-square .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-square .has-ratio,html.theme--documenter-dark .image.is-1by1 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-1by1 img,html.theme--documenter-dark .image.is-1by1 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-1by1 .has-ratio,html.theme--documenter-dark .image.is-5by4 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-5by4 img,html.theme--documenter-dark .image.is-5by4 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-5by4 .has-ratio,html.theme--documenter-dark .image.is-4by3 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-4by3 img,html.theme--documenter-dark .image.is-4by3 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-4by3 .has-ratio,html.theme--documenter-dark .image.is-3by2 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by2 img,html.theme--documenter-dark .image.is-3by2 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by2 .has-ratio,html.theme--documenter-dark .image.is-5by3 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-5by3 img,html.theme--documenter-dark .image.is-5by3 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-5by3 .has-ratio,html.theme--documenter-dark .image.is-16by9 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-16by9 img,html.theme--documenter-dark .image.is-16by9 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-16by9 .has-ratio,html.theme--documenter-dark .image.is-2by1 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-2by1 img,html.theme--documenter-dark .image.is-2by1 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-2by1 .has-ratio,html.theme--documenter-dark .image.is-3by1 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by1 img,html.theme--documenter-dark .image.is-3by1 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by1 .has-ratio,html.theme--documenter-dark .image.is-4by5 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-4by5 img,html.theme--documenter-dark .image.is-4by5 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-4by5 .has-ratio,html.theme--documenter-dark .image.is-3by4 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by4 img,html.theme--documenter-dark .image.is-3by4 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by4 .has-ratio,html.theme--documenter-dark .image.is-2by3 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-2by3 img,html.theme--documenter-dark .image.is-2by3 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-2by3 .has-ratio,html.theme--documenter-dark .image.is-3by5 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by5 img,html.theme--documenter-dark .image.is-3by5 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by5 .has-ratio,html.theme--documenter-dark .image.is-9by16 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-9by16 img,html.theme--documenter-dark .image.is-9by16 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-9by16 .has-ratio,html.theme--documenter-dark .image.is-1by2 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-1by2 img,html.theme--documenter-dark .image.is-1by2 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-1by2 .has-ratio,html.theme--documenter-dark .image.is-1by3 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-1by3 img,html.theme--documenter-dark .image.is-1by3 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-1by3 .has-ratio{height:100%;width:100%}html.theme--documenter-dark .image.is-square,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-square,html.theme--documenter-dark .image.is-1by1,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-1by1{padding-top:100%}html.theme--documenter-dark .image.is-5by4,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-5by4{padding-top:80%}html.theme--documenter-dark .image.is-4by3,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-4by3{padding-top:75%}html.theme--documenter-dark .image.is-3by2,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by2{padding-top:66.6666%}html.theme--documenter-dark .image.is-5by3,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-5by3{padding-top:60%}html.theme--documenter-dark .image.is-16by9,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-16by9{padding-top:56.25%}html.theme--documenter-dark .image.is-2by1,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-2by1{padding-top:50%}html.theme--documenter-dark .image.is-3by1,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by1{padding-top:33.3333%}html.theme--documenter-dark .image.is-4by5,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-4by5{padding-top:125%}html.theme--documenter-dark .image.is-3by4,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by4{padding-top:133.3333%}html.theme--documenter-dark .image.is-2by3,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-2by3{padding-top:150%}html.theme--documenter-dark .image.is-3by5,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by5{padding-top:166.6666%}html.theme--documenter-dark .image.is-9by16,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-9by16{padding-top:177.7777%}html.theme--documenter-dark .image.is-1by2,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-1by2{padding-top:200%}html.theme--documenter-dark .image.is-1by3,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-1by3{padding-top:300%}html.theme--documenter-dark .image.is-16x16,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-16x16{height:16px;width:16px}html.theme--documenter-dark .image.is-24x24,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-24x24{height:24px;width:24px}html.theme--documenter-dark .image.is-32x32,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-32x32{height:32px;width:32px}html.theme--documenter-dark .image.is-48x48,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-48x48{height:48px;width:48px}html.theme--documenter-dark .image.is-64x64,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-64x64{height:64px;width:64px}html.theme--documenter-dark .image.is-96x96,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-96x96{height:96px;width:96px}html.theme--documenter-dark .image.is-128x128,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-128x128{height:128px;width:128px}html.theme--documenter-dark .notification{background-color:#282f2f;border-radius:.4em;padding:1.25rem 2.5rem 1.25rem 1.5rem;position:relative}html.theme--documenter-dark .notification a:not(.button):not(.dropdown-item){color:currentColor;text-decoration:underline}html.theme--documenter-dark .notification strong{color:currentColor}html.theme--documenter-dark .notification code,html.theme--documenter-dark .notification pre{background:#fff}html.theme--documenter-dark .notification pre code{background:transparent}html.theme--documenter-dark .notification>.delete{position:absolute;right:0.5rem;top:0.5rem}html.theme--documenter-dark .notification .title,html.theme--documenter-dark .notification .subtitle,html.theme--documenter-dark .notification .content{color:currentColor}html.theme--documenter-dark .notification.is-white{background-color:#fff;color:#0a0a0a}html.theme--documenter-dark .notification.is-black{background-color:#0a0a0a;color:#fff}html.theme--documenter-dark .notification.is-light{background-color:#ecf0f1;color:#282f2f}html.theme--documenter-dark .notification.is-dark,html.theme--documenter-dark .content kbd.notification{background-color:#282f2f;color:#ecf0f1}html.theme--documenter-dark .notification.is-primary,html.theme--documenter-dark .docstring>section>a.notification.docs-sourcelink{background-color:#375a7f;color:#fff}html.theme--documenter-dark .notification.is-link{background-color:#1abc9c;color:#fff}html.theme--documenter-dark .notification.is-info{background-color:#024c7d;color:#fff}html.theme--documenter-dark .notification.is-success{background-color:#008438;color:#fff}html.theme--documenter-dark .notification.is-warning{background-color:#ad8100;color:#fff}html.theme--documenter-dark .notification.is-danger{background-color:#9e1b0d;color:#fff}html.theme--documenter-dark .progress{-moz-appearance:none;-webkit-appearance:none;border:none;border-radius:290486px;display:block;height:15px;overflow:hidden;padding:0;width:100%}html.theme--documenter-dark .progress::-webkit-progress-bar{background-color:#5e6d6f}html.theme--documenter-dark .progress::-webkit-progress-value{background-color:#dbdee0}html.theme--documenter-dark .progress::-moz-progress-bar{background-color:#dbdee0}html.theme--documenter-dark .progress::-ms-fill{background-color:#dbdee0;border:none}html.theme--documenter-dark .progress.is-white::-webkit-progress-value{background-color:#fff}html.theme--documenter-dark .progress.is-white::-moz-progress-bar{background-color:#fff}html.theme--documenter-dark .progress.is-white::-ms-fill{background-color:#fff}html.theme--documenter-dark .progress.is-white:indeterminate{background-image:linear-gradient(to right, #fff 30%, #5e6d6f 30%)}html.theme--documenter-dark .progress.is-black::-webkit-progress-value{background-color:#0a0a0a}html.theme--documenter-dark .progress.is-black::-moz-progress-bar{background-color:#0a0a0a}html.theme--documenter-dark .progress.is-black::-ms-fill{background-color:#0a0a0a}html.theme--documenter-dark .progress.is-black:indeterminate{background-image:linear-gradient(to right, #0a0a0a 30%, #5e6d6f 30%)}html.theme--documenter-dark .progress.is-light::-webkit-progress-value{background-color:#ecf0f1}html.theme--documenter-dark .progress.is-light::-moz-progress-bar{background-color:#ecf0f1}html.theme--documenter-dark .progress.is-light::-ms-fill{background-color:#ecf0f1}html.theme--documenter-dark .progress.is-light:indeterminate{background-image:linear-gradient(to right, #ecf0f1 30%, #5e6d6f 30%)}html.theme--documenter-dark .progress.is-dark::-webkit-progress-value,html.theme--documenter-dark .content kbd.progress::-webkit-progress-value{background-color:#282f2f}html.theme--documenter-dark .progress.is-dark::-moz-progress-bar,html.theme--documenter-dark .content kbd.progress::-moz-progress-bar{background-color:#282f2f}html.theme--documenter-dark .progress.is-dark::-ms-fill,html.theme--documenter-dark .content kbd.progress::-ms-fill{background-color:#282f2f}html.theme--documenter-dark .progress.is-dark:indeterminate,html.theme--documenter-dark .content kbd.progress:indeterminate{background-image:linear-gradient(to right, #282f2f 30%, #5e6d6f 30%)}html.theme--documenter-dark .progress.is-primary::-webkit-progress-value,html.theme--documenter-dark .docstring>section>a.progress.docs-sourcelink::-webkit-progress-value{background-color:#375a7f}html.theme--documenter-dark .progress.is-primary::-moz-progress-bar,html.theme--documenter-dark .docstring>section>a.progress.docs-sourcelink::-moz-progress-bar{background-color:#375a7f}html.theme--documenter-dark .progress.is-primary::-ms-fill,html.theme--documenter-dark .docstring>section>a.progress.docs-sourcelink::-ms-fill{background-color:#375a7f}html.theme--documenter-dark .progress.is-primary:indeterminate,html.theme--documenter-dark .docstring>section>a.progress.docs-sourcelink:indeterminate{background-image:linear-gradient(to right, #375a7f 30%, #5e6d6f 30%)}html.theme--documenter-dark .progress.is-link::-webkit-progress-value{background-color:#1abc9c}html.theme--documenter-dark .progress.is-link::-moz-progress-bar{background-color:#1abc9c}html.theme--documenter-dark .progress.is-link::-ms-fill{background-color:#1abc9c}html.theme--documenter-dark .progress.is-link:indeterminate{background-image:linear-gradient(to right, #1abc9c 30%, #5e6d6f 30%)}html.theme--documenter-dark .progress.is-info::-webkit-progress-value{background-color:#024c7d}html.theme--documenter-dark .progress.is-info::-moz-progress-bar{background-color:#024c7d}html.theme--documenter-dark .progress.is-info::-ms-fill{background-color:#024c7d}html.theme--documenter-dark .progress.is-info:indeterminate{background-image:linear-gradient(to right, #024c7d 30%, #5e6d6f 30%)}html.theme--documenter-dark .progress.is-success::-webkit-progress-value{background-color:#008438}html.theme--documenter-dark .progress.is-success::-moz-progress-bar{background-color:#008438}html.theme--documenter-dark .progress.is-success::-ms-fill{background-color:#008438}html.theme--documenter-dark .progress.is-success:indeterminate{background-image:linear-gradient(to right, #008438 30%, #5e6d6f 30%)}html.theme--documenter-dark .progress.is-warning::-webkit-progress-value{background-color:#ad8100}html.theme--documenter-dark .progress.is-warning::-moz-progress-bar{background-color:#ad8100}html.theme--documenter-dark .progress.is-warning::-ms-fill{background-color:#ad8100}html.theme--documenter-dark .progress.is-warning:indeterminate{background-image:linear-gradient(to right, #ad8100 30%, #5e6d6f 30%)}html.theme--documenter-dark .progress.is-danger::-webkit-progress-value{background-color:#9e1b0d}html.theme--documenter-dark .progress.is-danger::-moz-progress-bar{background-color:#9e1b0d}html.theme--documenter-dark .progress.is-danger::-ms-fill{background-color:#9e1b0d}html.theme--documenter-dark .progress.is-danger:indeterminate{background-image:linear-gradient(to right, #9e1b0d 30%, #5e6d6f 30%)}html.theme--documenter-dark .progress:indeterminate{animation-duration:1.5s;animation-iteration-count:infinite;animation-name:moveIndeterminate;animation-timing-function:linear;background-color:#5e6d6f;background-image:linear-gradient(to right, #fff 30%, #5e6d6f 30%);background-position:top left;background-repeat:no-repeat;background-size:150% 150%}html.theme--documenter-dark .progress:indeterminate::-webkit-progress-bar{background-color:transparent}html.theme--documenter-dark .progress:indeterminate::-moz-progress-bar{background-color:transparent}html.theme--documenter-dark .progress.is-small,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.progress{height:.85em}html.theme--documenter-dark .progress.is-medium{height:1.25rem}html.theme--documenter-dark .progress.is-large{height:1.5rem}@keyframes moveIndeterminate{from{background-position:200% 0}to{background-position:-200% 0}}html.theme--documenter-dark .table{background-color:#343c3d;color:#fff}html.theme--documenter-dark .table td,html.theme--documenter-dark .table th{border:1px solid #5e6d6f;border-width:0 0 1px;padding:0.5em 0.75em;vertical-align:top}html.theme--documenter-dark .table td.is-white,html.theme--documenter-dark .table th.is-white{background-color:#fff;border-color:#fff;color:#0a0a0a}html.theme--documenter-dark .table td.is-black,html.theme--documenter-dark .table th.is-black{background-color:#0a0a0a;border-color:#0a0a0a;color:#fff}html.theme--documenter-dark .table td.is-light,html.theme--documenter-dark .table th.is-light{background-color:#ecf0f1;border-color:#ecf0f1;color:#282f2f}html.theme--documenter-dark .table td.is-dark,html.theme--documenter-dark .table th.is-dark{background-color:#282f2f;border-color:#282f2f;color:#ecf0f1}html.theme--documenter-dark .table td.is-primary,html.theme--documenter-dark .table th.is-primary{background-color:#375a7f;border-color:#375a7f;color:#fff}html.theme--documenter-dark .table td.is-link,html.theme--documenter-dark .table th.is-link{background-color:#1abc9c;border-color:#1abc9c;color:#fff}html.theme--documenter-dark .table td.is-info,html.theme--documenter-dark .table th.is-info{background-color:#024c7d;border-color:#024c7d;color:#fff}html.theme--documenter-dark .table td.is-success,html.theme--documenter-dark .table th.is-success{background-color:#008438;border-color:#008438;color:#fff}html.theme--documenter-dark .table td.is-warning,html.theme--documenter-dark .table th.is-warning{background-color:#ad8100;border-color:#ad8100;color:#fff}html.theme--documenter-dark .table td.is-danger,html.theme--documenter-dark .table th.is-danger{background-color:#9e1b0d;border-color:#9e1b0d;color:#fff}html.theme--documenter-dark .table td.is-narrow,html.theme--documenter-dark .table th.is-narrow{white-space:nowrap;width:1%}html.theme--documenter-dark .table td.is-selected,html.theme--documenter-dark .table th.is-selected{background-color:#375a7f;color:#fff}html.theme--documenter-dark .table td.is-selected a,html.theme--documenter-dark .table td.is-selected strong,html.theme--documenter-dark .table th.is-selected a,html.theme--documenter-dark .table th.is-selected strong{color:currentColor}html.theme--documenter-dark .table th{color:#f2f2f2}html.theme--documenter-dark .table th:not([align]){text-align:left}html.theme--documenter-dark .table tr.is-selected{background-color:#375a7f;color:#fff}html.theme--documenter-dark .table tr.is-selected a,html.theme--documenter-dark .table tr.is-selected strong{color:currentColor}html.theme--documenter-dark .table tr.is-selected td,html.theme--documenter-dark .table tr.is-selected th{border-color:#fff;color:currentColor}html.theme--documenter-dark .table thead{background-color:rgba(0,0,0,0)}html.theme--documenter-dark .table thead td,html.theme--documenter-dark .table thead th{border-width:0 0 2px;color:#f2f2f2}html.theme--documenter-dark .table tfoot{background-color:rgba(0,0,0,0)}html.theme--documenter-dark .table tfoot td,html.theme--documenter-dark .table tfoot th{border-width:2px 0 0;color:#f2f2f2}html.theme--documenter-dark .table tbody{background-color:rgba(0,0,0,0)}html.theme--documenter-dark .table tbody tr:last-child td,html.theme--documenter-dark .table tbody tr:last-child th{border-bottom-width:0}html.theme--documenter-dark .table.is-bordered td,html.theme--documenter-dark .table.is-bordered th{border-width:1px}html.theme--documenter-dark .table.is-bordered tr:last-child td,html.theme--documenter-dark .table.is-bordered tr:last-child th{border-bottom-width:1px}html.theme--documenter-dark .table.is-fullwidth{width:100%}html.theme--documenter-dark .table.is-hoverable tbody tr:not(.is-selected):hover{background-color:#282f2f}html.theme--documenter-dark .table.is-hoverable.is-striped tbody tr:not(.is-selected):hover{background-color:#282f2f}html.theme--documenter-dark .table.is-hoverable.is-striped tbody tr:not(.is-selected):hover:nth-child(even){background-color:#2d3435}html.theme--documenter-dark .table.is-narrow td,html.theme--documenter-dark .table.is-narrow th{padding:0.25em 0.5em}html.theme--documenter-dark .table.is-striped tbody tr:not(.is-selected):nth-child(even){background-color:#282f2f}html.theme--documenter-dark .table-container{-webkit-overflow-scrolling:touch;overflow:auto;overflow-y:hidden;max-width:100%}html.theme--documenter-dark .tags{align-items:center;display:flex;flex-wrap:wrap;justify-content:flex-start}html.theme--documenter-dark .tags .tag,html.theme--documenter-dark .tags .content kbd,html.theme--documenter-dark .content .tags kbd,html.theme--documenter-dark .tags .docstring>section>a.docs-sourcelink{margin-bottom:0.5rem}html.theme--documenter-dark .tags .tag:not(:last-child),html.theme--documenter-dark .tags .content kbd:not(:last-child),html.theme--documenter-dark .content .tags kbd:not(:last-child),html.theme--documenter-dark .tags .docstring>section>a.docs-sourcelink:not(:last-child){margin-right:0.5rem}html.theme--documenter-dark .tags:last-child{margin-bottom:-0.5rem}html.theme--documenter-dark .tags:not(:last-child){margin-bottom:1rem}html.theme--documenter-dark .tags.are-medium .tag:not(.is-normal):not(.is-large),html.theme--documenter-dark .tags.are-medium .content kbd:not(.is-normal):not(.is-large),html.theme--documenter-dark .content .tags.are-medium kbd:not(.is-normal):not(.is-large),html.theme--documenter-dark .tags.are-medium .docstring>section>a.docs-sourcelink:not(.is-normal):not(.is-large){font-size:15px}html.theme--documenter-dark .tags.are-large .tag:not(.is-normal):not(.is-medium),html.theme--documenter-dark .tags.are-large .content kbd:not(.is-normal):not(.is-medium),html.theme--documenter-dark .content .tags.are-large kbd:not(.is-normal):not(.is-medium),html.theme--documenter-dark .tags.are-large .docstring>section>a.docs-sourcelink:not(.is-normal):not(.is-medium){font-size:1.25rem}html.theme--documenter-dark .tags.is-centered{justify-content:center}html.theme--documenter-dark .tags.is-centered .tag,html.theme--documenter-dark .tags.is-centered .content kbd,html.theme--documenter-dark .content .tags.is-centered kbd,html.theme--documenter-dark .tags.is-centered .docstring>section>a.docs-sourcelink{margin-right:0.25rem;margin-left:0.25rem}html.theme--documenter-dark .tags.is-right{justify-content:flex-end}html.theme--documenter-dark .tags.is-right .tag:not(:first-child),html.theme--documenter-dark .tags.is-right .content kbd:not(:first-child),html.theme--documenter-dark .content .tags.is-right kbd:not(:first-child),html.theme--documenter-dark .tags.is-right .docstring>section>a.docs-sourcelink:not(:first-child){margin-left:0.5rem}html.theme--documenter-dark .tags.is-right .tag:not(:last-child),html.theme--documenter-dark .tags.is-right .content kbd:not(:last-child),html.theme--documenter-dark .content .tags.is-right kbd:not(:last-child),html.theme--documenter-dark .tags.is-right .docstring>section>a.docs-sourcelink:not(:last-child){margin-right:0}html.theme--documenter-dark .tags.has-addons .tag,html.theme--documenter-dark .tags.has-addons .content kbd,html.theme--documenter-dark .content .tags.has-addons kbd,html.theme--documenter-dark .tags.has-addons .docstring>section>a.docs-sourcelink{margin-right:0}html.theme--documenter-dark .tags.has-addons .tag:not(:first-child),html.theme--documenter-dark .tags.has-addons .content kbd:not(:first-child),html.theme--documenter-dark .content .tags.has-addons kbd:not(:first-child),html.theme--documenter-dark .tags.has-addons .docstring>section>a.docs-sourcelink:not(:first-child){margin-left:0;border-bottom-left-radius:0;border-top-left-radius:0}html.theme--documenter-dark .tags.has-addons .tag:not(:last-child),html.theme--documenter-dark .tags.has-addons .content kbd:not(:last-child),html.theme--documenter-dark .content .tags.has-addons kbd:not(:last-child),html.theme--documenter-dark .tags.has-addons .docstring>section>a.docs-sourcelink:not(:last-child){border-bottom-right-radius:0;border-top-right-radius:0}html.theme--documenter-dark .tag:not(body),html.theme--documenter-dark .content kbd:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink:not(body){align-items:center;background-color:#282f2f;border-radius:.4em;color:#fff;display:inline-flex;font-size:.85em;height:2em;justify-content:center;line-height:1.5;padding-left:0.75em;padding-right:0.75em;white-space:nowrap}html.theme--documenter-dark .tag:not(body) .delete,html.theme--documenter-dark .content kbd:not(body) .delete,html.theme--documenter-dark .docstring>section>a.docs-sourcelink:not(body) .delete{margin-left:0.25rem;margin-right:-0.375rem}html.theme--documenter-dark .tag.is-white:not(body),html.theme--documenter-dark .content kbd.is-white:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-white:not(body){background-color:#fff;color:#0a0a0a}html.theme--documenter-dark .tag.is-black:not(body),html.theme--documenter-dark .content kbd.is-black:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-black:not(body){background-color:#0a0a0a;color:#fff}html.theme--documenter-dark .tag.is-light:not(body),html.theme--documenter-dark .content kbd.is-light:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-light:not(body){background-color:#ecf0f1;color:#282f2f}html.theme--documenter-dark .tag.is-dark:not(body),html.theme--documenter-dark .content kbd:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-dark:not(body),html.theme--documenter-dark .content .docstring>section>kbd:not(body){background-color:#282f2f;color:#ecf0f1}html.theme--documenter-dark .tag.is-primary:not(body),html.theme--documenter-dark .content kbd.is-primary:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink:not(body){background-color:#375a7f;color:#fff}html.theme--documenter-dark .tag.is-link:not(body),html.theme--documenter-dark .content kbd.is-link:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-link:not(body){background-color:#1abc9c;color:#fff}html.theme--documenter-dark .tag.is-info:not(body),html.theme--documenter-dark .content kbd.is-info:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-info:not(body){background-color:#024c7d;color:#fff}html.theme--documenter-dark .tag.is-success:not(body),html.theme--documenter-dark .content kbd.is-success:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-success:not(body){background-color:#008438;color:#fff}html.theme--documenter-dark .tag.is-warning:not(body),html.theme--documenter-dark .content kbd.is-warning:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-warning:not(body){background-color:#ad8100;color:#fff}html.theme--documenter-dark .tag.is-danger:not(body),html.theme--documenter-dark .content kbd.is-danger:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-danger:not(body){background-color:#9e1b0d;color:#fff}html.theme--documenter-dark .tag.is-normal:not(body),html.theme--documenter-dark .content kbd.is-normal:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-normal:not(body){font-size:.85em}html.theme--documenter-dark .tag.is-medium:not(body),html.theme--documenter-dark .content kbd.is-medium:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-medium:not(body){font-size:15px}html.theme--documenter-dark .tag.is-large:not(body),html.theme--documenter-dark .content kbd.is-large:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-large:not(body){font-size:1.25rem}html.theme--documenter-dark .tag:not(body) .icon:first-child:not(:last-child),html.theme--documenter-dark .content kbd:not(body) .icon:first-child:not(:last-child),html.theme--documenter-dark .docstring>section>a.docs-sourcelink:not(body) .icon:first-child:not(:last-child){margin-left:-0.375em;margin-right:0.1875em}html.theme--documenter-dark .tag:not(body) .icon:last-child:not(:first-child),html.theme--documenter-dark .content kbd:not(body) .icon:last-child:not(:first-child),html.theme--documenter-dark .docstring>section>a.docs-sourcelink:not(body) .icon:last-child:not(:first-child){margin-left:0.1875em;margin-right:-0.375em}html.theme--documenter-dark .tag:not(body) .icon:first-child:last-child,html.theme--documenter-dark .content kbd:not(body) .icon:first-child:last-child,html.theme--documenter-dark .docstring>section>a.docs-sourcelink:not(body) .icon:first-child:last-child{margin-left:-0.375em;margin-right:-0.375em}html.theme--documenter-dark .tag.is-delete:not(body),html.theme--documenter-dark .content kbd.is-delete:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-delete:not(body){margin-left:1px;padding:0;position:relative;width:2em}html.theme--documenter-dark .tag.is-delete:not(body)::before,html.theme--documenter-dark .content kbd.is-delete:not(body)::before,html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-delete:not(body)::before,html.theme--documenter-dark .tag.is-delete:not(body)::after,html.theme--documenter-dark .content kbd.is-delete:not(body)::after,html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-delete:not(body)::after{background-color:currentColor;content:"";display:block;left:50%;position:absolute;top:50%;transform:translateX(-50%) translateY(-50%) rotate(45deg);transform-origin:center center}html.theme--documenter-dark .tag.is-delete:not(body)::before,html.theme--documenter-dark .content kbd.is-delete:not(body)::before,html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-delete:not(body)::before{height:1px;width:50%}html.theme--documenter-dark .tag.is-delete:not(body)::after,html.theme--documenter-dark .content kbd.is-delete:not(body)::after,html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-delete:not(body)::after{height:50%;width:1px}html.theme--documenter-dark .tag.is-delete:not(body):hover,html.theme--documenter-dark .content kbd.is-delete:not(body):hover,html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-delete:not(body):hover,html.theme--documenter-dark .tag.is-delete:not(body):focus,html.theme--documenter-dark .content kbd.is-delete:not(body):focus,html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-delete:not(body):focus{background-color:#1d2122}html.theme--documenter-dark .tag.is-delete:not(body):active,html.theme--documenter-dark .content kbd.is-delete:not(body):active,html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-delete:not(body):active{background-color:#111414}html.theme--documenter-dark .tag.is-rounded:not(body),html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input:not(body),html.theme--documenter-dark .content kbd.is-rounded:not(body),html.theme--documenter-dark #documenter .docs-sidebar .content form.docs-search>input:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-rounded:not(body){border-radius:290486px}html.theme--documenter-dark a.tag:hover,html.theme--documenter-dark .docstring>section>a.docs-sourcelink:hover{text-decoration:underline}html.theme--documenter-dark .title,html.theme--documenter-dark .subtitle{word-break:break-word}html.theme--documenter-dark .title em,html.theme--documenter-dark .title span,html.theme--documenter-dark .subtitle em,html.theme--documenter-dark .subtitle span{font-weight:inherit}html.theme--documenter-dark .title sub,html.theme--documenter-dark .subtitle sub{font-size:.75em}html.theme--documenter-dark .title sup,html.theme--documenter-dark .subtitle sup{font-size:.75em}html.theme--documenter-dark .title .tag,html.theme--documenter-dark .title .content kbd,html.theme--documenter-dark .content .title kbd,html.theme--documenter-dark .title .docstring>section>a.docs-sourcelink,html.theme--documenter-dark .subtitle .tag,html.theme--documenter-dark .subtitle .content kbd,html.theme--documenter-dark .content .subtitle kbd,html.theme--documenter-dark .subtitle .docstring>section>a.docs-sourcelink{vertical-align:middle}html.theme--documenter-dark .title{color:#fff;font-size:2rem;font-weight:500;line-height:1.125}html.theme--documenter-dark .title strong{color:inherit;font-weight:inherit}html.theme--documenter-dark .title+.highlight{margin-top:-0.75rem}html.theme--documenter-dark .title:not(.is-spaced)+.subtitle{margin-top:-1.25rem}html.theme--documenter-dark .title.is-1{font-size:3rem}html.theme--documenter-dark .title.is-2{font-size:2.5rem}html.theme--documenter-dark .title.is-3{font-size:2rem}html.theme--documenter-dark .title.is-4{font-size:1.5rem}html.theme--documenter-dark .title.is-5{font-size:1.25rem}html.theme--documenter-dark .title.is-6{font-size:15px}html.theme--documenter-dark .title.is-7{font-size:.85em}html.theme--documenter-dark .subtitle{color:#8c9b9d;font-size:1.25rem;font-weight:400;line-height:1.25}html.theme--documenter-dark .subtitle strong{color:#8c9b9d;font-weight:600}html.theme--documenter-dark .subtitle:not(.is-spaced)+.title{margin-top:-1.25rem}html.theme--documenter-dark .subtitle.is-1{font-size:3rem}html.theme--documenter-dark .subtitle.is-2{font-size:2.5rem}html.theme--documenter-dark .subtitle.is-3{font-size:2rem}html.theme--documenter-dark .subtitle.is-4{font-size:1.5rem}html.theme--documenter-dark .subtitle.is-5{font-size:1.25rem}html.theme--documenter-dark .subtitle.is-6{font-size:15px}html.theme--documenter-dark .subtitle.is-7{font-size:.85em}html.theme--documenter-dark .heading{display:block;font-size:11px;letter-spacing:1px;margin-bottom:5px;text-transform:uppercase}html.theme--documenter-dark .highlight{font-weight:400;max-width:100%;overflow:hidden;padding:0}html.theme--documenter-dark .highlight pre{overflow:auto;max-width:100%}html.theme--documenter-dark .number{align-items:center;background-color:#282f2f;border-radius:290486px;display:inline-flex;font-size:1.25rem;height:2em;justify-content:center;margin-right:1.5rem;min-width:2.5em;padding:0.25rem 0.5rem;text-align:center;vertical-align:top}html.theme--documenter-dark .select select,html.theme--documenter-dark .textarea,html.theme--documenter-dark .input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input{background-color:#1f2424;border-color:#5e6d6f;border-radius:.4em;color:#dbdee0}html.theme--documenter-dark .select select::-moz-placeholder,html.theme--documenter-dark .textarea::-moz-placeholder,html.theme--documenter-dark .input::-moz-placeholder,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input::-moz-placeholder{color:rgba(219,222,224,0.3)}html.theme--documenter-dark .select select::-webkit-input-placeholder,html.theme--documenter-dark .textarea::-webkit-input-placeholder,html.theme--documenter-dark .input::-webkit-input-placeholder,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input::-webkit-input-placeholder{color:rgba(219,222,224,0.3)}html.theme--documenter-dark .select select:-moz-placeholder,html.theme--documenter-dark .textarea:-moz-placeholder,html.theme--documenter-dark .input:-moz-placeholder,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input:-moz-placeholder{color:rgba(219,222,224,0.3)}html.theme--documenter-dark .select select:-ms-input-placeholder,html.theme--documenter-dark .textarea:-ms-input-placeholder,html.theme--documenter-dark .input:-ms-input-placeholder,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input:-ms-input-placeholder{color:rgba(219,222,224,0.3)}html.theme--documenter-dark .select select:hover,html.theme--documenter-dark .textarea:hover,html.theme--documenter-dark .input:hover,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input:hover,html.theme--documenter-dark .select select.is-hovered,html.theme--documenter-dark .is-hovered.textarea,html.theme--documenter-dark .is-hovered.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-hovered{border-color:#8c9b9d}html.theme--documenter-dark .select select:focus,html.theme--documenter-dark .textarea:focus,html.theme--documenter-dark .input:focus,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input:focus,html.theme--documenter-dark .select select.is-focused,html.theme--documenter-dark .is-focused.textarea,html.theme--documenter-dark .is-focused.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-focused,html.theme--documenter-dark .select select:active,html.theme--documenter-dark .textarea:active,html.theme--documenter-dark .input:active,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input:active,html.theme--documenter-dark .select select.is-active,html.theme--documenter-dark .is-active.textarea,html.theme--documenter-dark .is-active.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-active{border-color:#1abc9c;box-shadow:0 0 0 0.125em rgba(26,188,156,0.25)}html.theme--documenter-dark .select select[disabled],html.theme--documenter-dark .textarea[disabled],html.theme--documenter-dark .input[disabled],html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input[disabled],fieldset[disabled] html.theme--documenter-dark .select select,fieldset[disabled] html.theme--documenter-dark .textarea,fieldset[disabled] html.theme--documenter-dark .input,fieldset[disabled] html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input{background-color:#8c9b9d;border-color:#282f2f;box-shadow:none;color:#fff}html.theme--documenter-dark .select select[disabled]::-moz-placeholder,html.theme--documenter-dark .textarea[disabled]::-moz-placeholder,html.theme--documenter-dark .input[disabled]::-moz-placeholder,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input[disabled]::-moz-placeholder,fieldset[disabled] html.theme--documenter-dark .select select::-moz-placeholder,fieldset[disabled] html.theme--documenter-dark .textarea::-moz-placeholder,fieldset[disabled] html.theme--documenter-dark .input::-moz-placeholder,fieldset[disabled] html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input::-moz-placeholder{color:rgba(255,255,255,0.3)}html.theme--documenter-dark .select select[disabled]::-webkit-input-placeholder,html.theme--documenter-dark .textarea[disabled]::-webkit-input-placeholder,html.theme--documenter-dark .input[disabled]::-webkit-input-placeholder,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input[disabled]::-webkit-input-placeholder,fieldset[disabled] html.theme--documenter-dark .select select::-webkit-input-placeholder,fieldset[disabled] html.theme--documenter-dark .textarea::-webkit-input-placeholder,fieldset[disabled] html.theme--documenter-dark .input::-webkit-input-placeholder,fieldset[disabled] html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input::-webkit-input-placeholder{color:rgba(255,255,255,0.3)}html.theme--documenter-dark .select select[disabled]:-moz-placeholder,html.theme--documenter-dark .textarea[disabled]:-moz-placeholder,html.theme--documenter-dark .input[disabled]:-moz-placeholder,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input[disabled]:-moz-placeholder,fieldset[disabled] html.theme--documenter-dark .select select:-moz-placeholder,fieldset[disabled] html.theme--documenter-dark .textarea:-moz-placeholder,fieldset[disabled] html.theme--documenter-dark .input:-moz-placeholder,fieldset[disabled] html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input:-moz-placeholder{color:rgba(255,255,255,0.3)}html.theme--documenter-dark .select select[disabled]:-ms-input-placeholder,html.theme--documenter-dark .textarea[disabled]:-ms-input-placeholder,html.theme--documenter-dark .input[disabled]:-ms-input-placeholder,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input[disabled]:-ms-input-placeholder,fieldset[disabled] html.theme--documenter-dark .select select:-ms-input-placeholder,fieldset[disabled] html.theme--documenter-dark .textarea:-ms-input-placeholder,fieldset[disabled] html.theme--documenter-dark .input:-ms-input-placeholder,fieldset[disabled] html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input:-ms-input-placeholder{color:rgba(255,255,255,0.3)}html.theme--documenter-dark .textarea,html.theme--documenter-dark .input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input{box-shadow:inset 0 1px 2px rgba(10,10,10,0.1);max-width:100%;width:100%}html.theme--documenter-dark .textarea[readonly],html.theme--documenter-dark .input[readonly],html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input[readonly]{box-shadow:none}html.theme--documenter-dark .is-white.textarea,html.theme--documenter-dark .is-white.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-white{border-color:#fff}html.theme--documenter-dark .is-white.textarea:focus,html.theme--documenter-dark .is-white.input:focus,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-white:focus,html.theme--documenter-dark .is-white.is-focused.textarea,html.theme--documenter-dark .is-white.is-focused.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-focused,html.theme--documenter-dark .is-white.textarea:active,html.theme--documenter-dark .is-white.input:active,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-white:active,html.theme--documenter-dark .is-white.is-active.textarea,html.theme--documenter-dark .is-white.is-active.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(255,255,255,0.25)}html.theme--documenter-dark .is-black.textarea,html.theme--documenter-dark .is-black.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-black{border-color:#0a0a0a}html.theme--documenter-dark .is-black.textarea:focus,html.theme--documenter-dark .is-black.input:focus,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-black:focus,html.theme--documenter-dark .is-black.is-focused.textarea,html.theme--documenter-dark .is-black.is-focused.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-focused,html.theme--documenter-dark .is-black.textarea:active,html.theme--documenter-dark .is-black.input:active,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-black:active,html.theme--documenter-dark .is-black.is-active.textarea,html.theme--documenter-dark .is-black.is-active.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(10,10,10,0.25)}html.theme--documenter-dark .is-light.textarea,html.theme--documenter-dark .is-light.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-light{border-color:#ecf0f1}html.theme--documenter-dark .is-light.textarea:focus,html.theme--documenter-dark .is-light.input:focus,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-light:focus,html.theme--documenter-dark .is-light.is-focused.textarea,html.theme--documenter-dark .is-light.is-focused.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-focused,html.theme--documenter-dark .is-light.textarea:active,html.theme--documenter-dark .is-light.input:active,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-light:active,html.theme--documenter-dark .is-light.is-active.textarea,html.theme--documenter-dark .is-light.is-active.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(236,240,241,0.25)}html.theme--documenter-dark .is-dark.textarea,html.theme--documenter-dark .content kbd.textarea,html.theme--documenter-dark .is-dark.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-dark,html.theme--documenter-dark .content kbd.input{border-color:#282f2f}html.theme--documenter-dark .is-dark.textarea:focus,html.theme--documenter-dark .content kbd.textarea:focus,html.theme--documenter-dark .is-dark.input:focus,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-dark:focus,html.theme--documenter-dark .content kbd.input:focus,html.theme--documenter-dark .is-dark.is-focused.textarea,html.theme--documenter-dark .content kbd.is-focused.textarea,html.theme--documenter-dark .is-dark.is-focused.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-focused,html.theme--documenter-dark .content kbd.is-focused.input,html.theme--documenter-dark #documenter .docs-sidebar .content form.docs-search>input.is-focused,html.theme--documenter-dark .is-dark.textarea:active,html.theme--documenter-dark .content kbd.textarea:active,html.theme--documenter-dark .is-dark.input:active,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-dark:active,html.theme--documenter-dark .content kbd.input:active,html.theme--documenter-dark .is-dark.is-active.textarea,html.theme--documenter-dark .content kbd.is-active.textarea,html.theme--documenter-dark .is-dark.is-active.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-active,html.theme--documenter-dark .content kbd.is-active.input,html.theme--documenter-dark #documenter .docs-sidebar .content form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(40,47,47,0.25)}html.theme--documenter-dark .is-primary.textarea,html.theme--documenter-dark .docstring>section>a.textarea.docs-sourcelink,html.theme--documenter-dark .is-primary.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-primary,html.theme--documenter-dark .docstring>section>a.input.docs-sourcelink{border-color:#375a7f}html.theme--documenter-dark .is-primary.textarea:focus,html.theme--documenter-dark .docstring>section>a.textarea.docs-sourcelink:focus,html.theme--documenter-dark .is-primary.input:focus,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-primary:focus,html.theme--documenter-dark .docstring>section>a.input.docs-sourcelink:focus,html.theme--documenter-dark .is-primary.is-focused.textarea,html.theme--documenter-dark .docstring>section>a.is-focused.textarea.docs-sourcelink,html.theme--documenter-dark .is-primary.is-focused.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-focused,html.theme--documenter-dark .docstring>section>a.is-focused.input.docs-sourcelink,html.theme--documenter-dark .is-primary.textarea:active,html.theme--documenter-dark .docstring>section>a.textarea.docs-sourcelink:active,html.theme--documenter-dark .is-primary.input:active,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-primary:active,html.theme--documenter-dark .docstring>section>a.input.docs-sourcelink:active,html.theme--documenter-dark .is-primary.is-active.textarea,html.theme--documenter-dark .docstring>section>a.is-active.textarea.docs-sourcelink,html.theme--documenter-dark .is-primary.is-active.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-active,html.theme--documenter-dark .docstring>section>a.is-active.input.docs-sourcelink{box-shadow:0 0 0 0.125em rgba(55,90,127,0.25)}html.theme--documenter-dark .is-link.textarea,html.theme--documenter-dark .is-link.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-link{border-color:#1abc9c}html.theme--documenter-dark .is-link.textarea:focus,html.theme--documenter-dark .is-link.input:focus,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-link:focus,html.theme--documenter-dark .is-link.is-focused.textarea,html.theme--documenter-dark .is-link.is-focused.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-focused,html.theme--documenter-dark .is-link.textarea:active,html.theme--documenter-dark .is-link.input:active,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-link:active,html.theme--documenter-dark .is-link.is-active.textarea,html.theme--documenter-dark .is-link.is-active.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(26,188,156,0.25)}html.theme--documenter-dark .is-info.textarea,html.theme--documenter-dark .is-info.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-info{border-color:#024c7d}html.theme--documenter-dark .is-info.textarea:focus,html.theme--documenter-dark .is-info.input:focus,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-info:focus,html.theme--documenter-dark .is-info.is-focused.textarea,html.theme--documenter-dark .is-info.is-focused.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-focused,html.theme--documenter-dark .is-info.textarea:active,html.theme--documenter-dark .is-info.input:active,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-info:active,html.theme--documenter-dark .is-info.is-active.textarea,html.theme--documenter-dark .is-info.is-active.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(2,76,125,0.25)}html.theme--documenter-dark .is-success.textarea,html.theme--documenter-dark .is-success.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-success{border-color:#008438}html.theme--documenter-dark .is-success.textarea:focus,html.theme--documenter-dark .is-success.input:focus,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-success:focus,html.theme--documenter-dark .is-success.is-focused.textarea,html.theme--documenter-dark .is-success.is-focused.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-focused,html.theme--documenter-dark .is-success.textarea:active,html.theme--documenter-dark .is-success.input:active,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-success:active,html.theme--documenter-dark .is-success.is-active.textarea,html.theme--documenter-dark .is-success.is-active.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(0,132,56,0.25)}html.theme--documenter-dark .is-warning.textarea,html.theme--documenter-dark .is-warning.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-warning{border-color:#ad8100}html.theme--documenter-dark .is-warning.textarea:focus,html.theme--documenter-dark .is-warning.input:focus,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-warning:focus,html.theme--documenter-dark .is-warning.is-focused.textarea,html.theme--documenter-dark .is-warning.is-focused.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-focused,html.theme--documenter-dark .is-warning.textarea:active,html.theme--documenter-dark .is-warning.input:active,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-warning:active,html.theme--documenter-dark .is-warning.is-active.textarea,html.theme--documenter-dark .is-warning.is-active.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(173,129,0,0.25)}html.theme--documenter-dark .is-danger.textarea,html.theme--documenter-dark .is-danger.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-danger{border-color:#9e1b0d}html.theme--documenter-dark .is-danger.textarea:focus,html.theme--documenter-dark .is-danger.input:focus,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-danger:focus,html.theme--documenter-dark .is-danger.is-focused.textarea,html.theme--documenter-dark .is-danger.is-focused.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-focused,html.theme--documenter-dark .is-danger.textarea:active,html.theme--documenter-dark .is-danger.input:active,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-danger:active,html.theme--documenter-dark .is-danger.is-active.textarea,html.theme--documenter-dark .is-danger.is-active.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(158,27,13,0.25)}html.theme--documenter-dark .is-small.textarea,html.theme--documenter-dark .is-small.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input{border-radius:3px;font-size:.85em}html.theme--documenter-dark .is-medium.textarea,html.theme--documenter-dark .is-medium.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-medium{font-size:1.25rem}html.theme--documenter-dark .is-large.textarea,html.theme--documenter-dark .is-large.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-large{font-size:1.5rem}html.theme--documenter-dark .is-fullwidth.textarea,html.theme--documenter-dark .is-fullwidth.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-fullwidth{display:block;width:100%}html.theme--documenter-dark .is-inline.textarea,html.theme--documenter-dark .is-inline.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-inline{display:inline;width:auto}html.theme--documenter-dark .input.is-rounded,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input{border-radius:290486px;padding-left:1em;padding-right:1em}html.theme--documenter-dark .input.is-static,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-static{background-color:transparent;border-color:transparent;box-shadow:none;padding-left:0;padding-right:0}html.theme--documenter-dark .textarea{display:block;max-width:100%;min-width:100%;padding:0.625em;resize:vertical}html.theme--documenter-dark .textarea:not([rows]){max-height:600px;min-height:120px}html.theme--documenter-dark .textarea[rows]{height:initial}html.theme--documenter-dark .textarea.has-fixed-size{resize:none}html.theme--documenter-dark .radio,html.theme--documenter-dark .checkbox{cursor:pointer;display:inline-block;line-height:1.25;position:relative}html.theme--documenter-dark .radio input,html.theme--documenter-dark .checkbox input{cursor:pointer}html.theme--documenter-dark .radio:hover,html.theme--documenter-dark .checkbox:hover{color:#8c9b9d}html.theme--documenter-dark .radio[disabled],html.theme--documenter-dark .checkbox[disabled],fieldset[disabled] html.theme--documenter-dark .radio,fieldset[disabled] html.theme--documenter-dark .checkbox{color:#fff;cursor:not-allowed}html.theme--documenter-dark .radio+.radio{margin-left:0.5em}html.theme--documenter-dark .select{display:inline-block;max-width:100%;position:relative;vertical-align:top}html.theme--documenter-dark .select:not(.is-multiple){height:2.25em}html.theme--documenter-dark .select:not(.is-multiple):not(.is-loading)::after{border-color:#1abc9c;right:1.125em;z-index:4}html.theme--documenter-dark .select.is-rounded select,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.select select{border-radius:290486px;padding-left:1em}html.theme--documenter-dark .select select{cursor:pointer;display:block;font-size:1em;max-width:100%;outline:none}html.theme--documenter-dark .select select::-ms-expand{display:none}html.theme--documenter-dark .select select[disabled]:hover,fieldset[disabled] html.theme--documenter-dark .select select:hover{border-color:#282f2f}html.theme--documenter-dark .select select:not([multiple]){padding-right:2.5em}html.theme--documenter-dark .select select[multiple]{height:auto;padding:0}html.theme--documenter-dark .select select[multiple] option{padding:0.5em 1em}html.theme--documenter-dark .select:not(.is-multiple):not(.is-loading):hover::after{border-color:#8c9b9d}html.theme--documenter-dark .select.is-white:not(:hover)::after{border-color:#fff}html.theme--documenter-dark .select.is-white select{border-color:#fff}html.theme--documenter-dark .select.is-white select:hover,html.theme--documenter-dark .select.is-white select.is-hovered{border-color:#f2f2f2}html.theme--documenter-dark .select.is-white select:focus,html.theme--documenter-dark .select.is-white select.is-focused,html.theme--documenter-dark .select.is-white select:active,html.theme--documenter-dark .select.is-white select.is-active{box-shadow:0 0 0 0.125em rgba(255,255,255,0.25)}html.theme--documenter-dark .select.is-black:not(:hover)::after{border-color:#0a0a0a}html.theme--documenter-dark .select.is-black select{border-color:#0a0a0a}html.theme--documenter-dark .select.is-black select:hover,html.theme--documenter-dark .select.is-black select.is-hovered{border-color:#000}html.theme--documenter-dark .select.is-black select:focus,html.theme--documenter-dark .select.is-black select.is-focused,html.theme--documenter-dark .select.is-black select:active,html.theme--documenter-dark .select.is-black select.is-active{box-shadow:0 0 0 0.125em rgba(10,10,10,0.25)}html.theme--documenter-dark .select.is-light:not(:hover)::after{border-color:#ecf0f1}html.theme--documenter-dark .select.is-light select{border-color:#ecf0f1}html.theme--documenter-dark .select.is-light select:hover,html.theme--documenter-dark .select.is-light select.is-hovered{border-color:#dde4e6}html.theme--documenter-dark .select.is-light select:focus,html.theme--documenter-dark .select.is-light select.is-focused,html.theme--documenter-dark .select.is-light select:active,html.theme--documenter-dark .select.is-light select.is-active{box-shadow:0 0 0 0.125em rgba(236,240,241,0.25)}html.theme--documenter-dark .select.is-dark:not(:hover)::after,html.theme--documenter-dark .content kbd.select:not(:hover)::after{border-color:#282f2f}html.theme--documenter-dark .select.is-dark select,html.theme--documenter-dark .content kbd.select select{border-color:#282f2f}html.theme--documenter-dark .select.is-dark select:hover,html.theme--documenter-dark .content kbd.select select:hover,html.theme--documenter-dark .select.is-dark select.is-hovered,html.theme--documenter-dark .content kbd.select select.is-hovered{border-color:#1d2122}html.theme--documenter-dark .select.is-dark select:focus,html.theme--documenter-dark .content kbd.select select:focus,html.theme--documenter-dark .select.is-dark select.is-focused,html.theme--documenter-dark .content kbd.select select.is-focused,html.theme--documenter-dark .select.is-dark select:active,html.theme--documenter-dark .content kbd.select select:active,html.theme--documenter-dark .select.is-dark select.is-active,html.theme--documenter-dark .content kbd.select select.is-active{box-shadow:0 0 0 0.125em rgba(40,47,47,0.25)}html.theme--documenter-dark .select.is-primary:not(:hover)::after,html.theme--documenter-dark .docstring>section>a.select.docs-sourcelink:not(:hover)::after{border-color:#375a7f}html.theme--documenter-dark .select.is-primary select,html.theme--documenter-dark .docstring>section>a.select.docs-sourcelink select{border-color:#375a7f}html.theme--documenter-dark .select.is-primary select:hover,html.theme--documenter-dark .docstring>section>a.select.docs-sourcelink select:hover,html.theme--documenter-dark .select.is-primary select.is-hovered,html.theme--documenter-dark .docstring>section>a.select.docs-sourcelink select.is-hovered{border-color:#2f4d6d}html.theme--documenter-dark .select.is-primary select:focus,html.theme--documenter-dark .docstring>section>a.select.docs-sourcelink select:focus,html.theme--documenter-dark .select.is-primary select.is-focused,html.theme--documenter-dark .docstring>section>a.select.docs-sourcelink select.is-focused,html.theme--documenter-dark .select.is-primary select:active,html.theme--documenter-dark .docstring>section>a.select.docs-sourcelink select:active,html.theme--documenter-dark .select.is-primary select.is-active,html.theme--documenter-dark .docstring>section>a.select.docs-sourcelink select.is-active{box-shadow:0 0 0 0.125em rgba(55,90,127,0.25)}html.theme--documenter-dark .select.is-link:not(:hover)::after{border-color:#1abc9c}html.theme--documenter-dark .select.is-link select{border-color:#1abc9c}html.theme--documenter-dark .select.is-link select:hover,html.theme--documenter-dark .select.is-link select.is-hovered{border-color:#17a689}html.theme--documenter-dark .select.is-link select:focus,html.theme--documenter-dark .select.is-link select.is-focused,html.theme--documenter-dark .select.is-link select:active,html.theme--documenter-dark .select.is-link select.is-active{box-shadow:0 0 0 0.125em rgba(26,188,156,0.25)}html.theme--documenter-dark .select.is-info:not(:hover)::after{border-color:#024c7d}html.theme--documenter-dark .select.is-info select{border-color:#024c7d}html.theme--documenter-dark .select.is-info select:hover,html.theme--documenter-dark .select.is-info select.is-hovered{border-color:#023d64}html.theme--documenter-dark .select.is-info select:focus,html.theme--documenter-dark .select.is-info select.is-focused,html.theme--documenter-dark .select.is-info select:active,html.theme--documenter-dark .select.is-info select.is-active{box-shadow:0 0 0 0.125em rgba(2,76,125,0.25)}html.theme--documenter-dark .select.is-success:not(:hover)::after{border-color:#008438}html.theme--documenter-dark .select.is-success select{border-color:#008438}html.theme--documenter-dark .select.is-success select:hover,html.theme--documenter-dark .select.is-success select.is-hovered{border-color:#006b2d}html.theme--documenter-dark .select.is-success select:focus,html.theme--documenter-dark .select.is-success select.is-focused,html.theme--documenter-dark .select.is-success select:active,html.theme--documenter-dark .select.is-success select.is-active{box-shadow:0 0 0 0.125em rgba(0,132,56,0.25)}html.theme--documenter-dark .select.is-warning:not(:hover)::after{border-color:#ad8100}html.theme--documenter-dark .select.is-warning select{border-color:#ad8100}html.theme--documenter-dark .select.is-warning select:hover,html.theme--documenter-dark .select.is-warning select.is-hovered{border-color:#946e00}html.theme--documenter-dark .select.is-warning select:focus,html.theme--documenter-dark .select.is-warning select.is-focused,html.theme--documenter-dark .select.is-warning select:active,html.theme--documenter-dark .select.is-warning select.is-active{box-shadow:0 0 0 0.125em rgba(173,129,0,0.25)}html.theme--documenter-dark .select.is-danger:not(:hover)::after{border-color:#9e1b0d}html.theme--documenter-dark .select.is-danger select{border-color:#9e1b0d}html.theme--documenter-dark .select.is-danger select:hover,html.theme--documenter-dark .select.is-danger select.is-hovered{border-color:#86170b}html.theme--documenter-dark .select.is-danger select:focus,html.theme--documenter-dark .select.is-danger select.is-focused,html.theme--documenter-dark .select.is-danger select:active,html.theme--documenter-dark .select.is-danger select.is-active{box-shadow:0 0 0 0.125em rgba(158,27,13,0.25)}html.theme--documenter-dark .select.is-small,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.select{border-radius:3px;font-size:.85em}html.theme--documenter-dark .select.is-medium{font-size:1.25rem}html.theme--documenter-dark .select.is-large{font-size:1.5rem}html.theme--documenter-dark .select.is-disabled::after{border-color:#fff}html.theme--documenter-dark .select.is-fullwidth{width:100%}html.theme--documenter-dark .select.is-fullwidth select{width:100%}html.theme--documenter-dark .select.is-loading::after{margin-top:0;position:absolute;right:0.625em;top:0.625em;transform:none}html.theme--documenter-dark .select.is-loading.is-small:after,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-loading:after{font-size:.85em}html.theme--documenter-dark .select.is-loading.is-medium:after{font-size:1.25rem}html.theme--documenter-dark .select.is-loading.is-large:after{font-size:1.5rem}html.theme--documenter-dark .file{align-items:stretch;display:flex;justify-content:flex-start;position:relative}html.theme--documenter-dark .file.is-white .file-cta{background-color:#fff;border-color:transparent;color:#0a0a0a}html.theme--documenter-dark .file.is-white:hover .file-cta,html.theme--documenter-dark .file.is-white.is-hovered .file-cta{background-color:#f9f9f9;border-color:transparent;color:#0a0a0a}html.theme--documenter-dark .file.is-white:focus .file-cta,html.theme--documenter-dark .file.is-white.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(255,255,255,0.25);color:#0a0a0a}html.theme--documenter-dark .file.is-white:active .file-cta,html.theme--documenter-dark .file.is-white.is-active .file-cta{background-color:#f2f2f2;border-color:transparent;color:#0a0a0a}html.theme--documenter-dark .file.is-black .file-cta{background-color:#0a0a0a;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-black:hover .file-cta,html.theme--documenter-dark .file.is-black.is-hovered .file-cta{background-color:#040404;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-black:focus .file-cta,html.theme--documenter-dark .file.is-black.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(10,10,10,0.25);color:#fff}html.theme--documenter-dark .file.is-black:active .file-cta,html.theme--documenter-dark .file.is-black.is-active .file-cta{background-color:#000;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-light .file-cta{background-color:#ecf0f1;border-color:transparent;color:#282f2f}html.theme--documenter-dark .file.is-light:hover .file-cta,html.theme--documenter-dark .file.is-light.is-hovered .file-cta{background-color:#e5eaec;border-color:transparent;color:#282f2f}html.theme--documenter-dark .file.is-light:focus .file-cta,html.theme--documenter-dark .file.is-light.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(236,240,241,0.25);color:#282f2f}html.theme--documenter-dark .file.is-light:active .file-cta,html.theme--documenter-dark .file.is-light.is-active .file-cta{background-color:#dde4e6;border-color:transparent;color:#282f2f}html.theme--documenter-dark .file.is-dark .file-cta,html.theme--documenter-dark .content kbd.file .file-cta{background-color:#282f2f;border-color:transparent;color:#ecf0f1}html.theme--documenter-dark .file.is-dark:hover .file-cta,html.theme--documenter-dark .content kbd.file:hover .file-cta,html.theme--documenter-dark .file.is-dark.is-hovered .file-cta,html.theme--documenter-dark .content kbd.file.is-hovered .file-cta{background-color:#232829;border-color:transparent;color:#ecf0f1}html.theme--documenter-dark .file.is-dark:focus .file-cta,html.theme--documenter-dark .content kbd.file:focus .file-cta,html.theme--documenter-dark .file.is-dark.is-focused .file-cta,html.theme--documenter-dark .content kbd.file.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(40,47,47,0.25);color:#ecf0f1}html.theme--documenter-dark .file.is-dark:active .file-cta,html.theme--documenter-dark .content kbd.file:active .file-cta,html.theme--documenter-dark .file.is-dark.is-active .file-cta,html.theme--documenter-dark .content kbd.file.is-active .file-cta{background-color:#1d2122;border-color:transparent;color:#ecf0f1}html.theme--documenter-dark .file.is-primary .file-cta,html.theme--documenter-dark .docstring>section>a.file.docs-sourcelink .file-cta{background-color:#375a7f;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-primary:hover .file-cta,html.theme--documenter-dark .docstring>section>a.file.docs-sourcelink:hover .file-cta,html.theme--documenter-dark .file.is-primary.is-hovered .file-cta,html.theme--documenter-dark .docstring>section>a.file.is-hovered.docs-sourcelink .file-cta{background-color:#335476;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-primary:focus .file-cta,html.theme--documenter-dark .docstring>section>a.file.docs-sourcelink:focus .file-cta,html.theme--documenter-dark .file.is-primary.is-focused .file-cta,html.theme--documenter-dark .docstring>section>a.file.is-focused.docs-sourcelink .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(55,90,127,0.25);color:#fff}html.theme--documenter-dark .file.is-primary:active .file-cta,html.theme--documenter-dark .docstring>section>a.file.docs-sourcelink:active .file-cta,html.theme--documenter-dark .file.is-primary.is-active .file-cta,html.theme--documenter-dark .docstring>section>a.file.is-active.docs-sourcelink .file-cta{background-color:#2f4d6d;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-link .file-cta{background-color:#1abc9c;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-link:hover .file-cta,html.theme--documenter-dark .file.is-link.is-hovered .file-cta{background-color:#18b193;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-link:focus .file-cta,html.theme--documenter-dark .file.is-link.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(26,188,156,0.25);color:#fff}html.theme--documenter-dark .file.is-link:active .file-cta,html.theme--documenter-dark .file.is-link.is-active .file-cta{background-color:#17a689;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-info .file-cta{background-color:#024c7d;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-info:hover .file-cta,html.theme--documenter-dark .file.is-info.is-hovered .file-cta{background-color:#024470;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-info:focus .file-cta,html.theme--documenter-dark .file.is-info.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(2,76,125,0.25);color:#fff}html.theme--documenter-dark .file.is-info:active .file-cta,html.theme--documenter-dark .file.is-info.is-active .file-cta{background-color:#023d64;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-success .file-cta{background-color:#008438;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-success:hover .file-cta,html.theme--documenter-dark .file.is-success.is-hovered .file-cta{background-color:#073;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-success:focus .file-cta,html.theme--documenter-dark .file.is-success.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(0,132,56,0.25);color:#fff}html.theme--documenter-dark .file.is-success:active .file-cta,html.theme--documenter-dark .file.is-success.is-active .file-cta{background-color:#006b2d;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-warning .file-cta{background-color:#ad8100;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-warning:hover .file-cta,html.theme--documenter-dark .file.is-warning.is-hovered .file-cta{background-color:#a07700;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-warning:focus .file-cta,html.theme--documenter-dark .file.is-warning.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(173,129,0,0.25);color:#fff}html.theme--documenter-dark .file.is-warning:active .file-cta,html.theme--documenter-dark .file.is-warning.is-active .file-cta{background-color:#946e00;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-danger .file-cta{background-color:#9e1b0d;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-danger:hover .file-cta,html.theme--documenter-dark .file.is-danger.is-hovered .file-cta{background-color:#92190c;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-danger:focus .file-cta,html.theme--documenter-dark .file.is-danger.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(158,27,13,0.25);color:#fff}html.theme--documenter-dark .file.is-danger:active .file-cta,html.theme--documenter-dark .file.is-danger.is-active .file-cta{background-color:#86170b;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-small,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.file{font-size:.85em}html.theme--documenter-dark .file.is-medium{font-size:1.25rem}html.theme--documenter-dark .file.is-medium .file-icon .fa{font-size:21px}html.theme--documenter-dark .file.is-large{font-size:1.5rem}html.theme--documenter-dark .file.is-large .file-icon .fa{font-size:28px}html.theme--documenter-dark .file.has-name .file-cta{border-bottom-right-radius:0;border-top-right-radius:0}html.theme--documenter-dark .file.has-name .file-name{border-bottom-left-radius:0;border-top-left-radius:0}html.theme--documenter-dark .file.has-name.is-empty .file-cta{border-radius:.4em}html.theme--documenter-dark .file.has-name.is-empty .file-name{display:none}html.theme--documenter-dark .file.is-boxed .file-label{flex-direction:column}html.theme--documenter-dark .file.is-boxed .file-cta{flex-direction:column;height:auto;padding:1em 3em}html.theme--documenter-dark .file.is-boxed .file-name{border-width:0 1px 1px}html.theme--documenter-dark .file.is-boxed .file-icon{height:1.5em;width:1.5em}html.theme--documenter-dark .file.is-boxed .file-icon .fa{font-size:21px}html.theme--documenter-dark .file.is-boxed.is-small .file-icon .fa,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-boxed .file-icon .fa{font-size:14px}html.theme--documenter-dark .file.is-boxed.is-medium .file-icon .fa{font-size:28px}html.theme--documenter-dark .file.is-boxed.is-large .file-icon .fa{font-size:35px}html.theme--documenter-dark .file.is-boxed.has-name .file-cta{border-radius:.4em .4em 0 0}html.theme--documenter-dark .file.is-boxed.has-name .file-name{border-radius:0 0 .4em .4em;border-width:0 1px 1px}html.theme--documenter-dark .file.is-centered{justify-content:center}html.theme--documenter-dark .file.is-fullwidth .file-label{width:100%}html.theme--documenter-dark .file.is-fullwidth .file-name{flex-grow:1;max-width:none}html.theme--documenter-dark .file.is-right{justify-content:flex-end}html.theme--documenter-dark .file.is-right .file-cta{border-radius:0 .4em .4em 0}html.theme--documenter-dark .file.is-right .file-name{border-radius:.4em 0 0 .4em;border-width:1px 0 1px 1px;order:-1}html.theme--documenter-dark .file-label{align-items:stretch;display:flex;cursor:pointer;justify-content:flex-start;overflow:hidden;position:relative}html.theme--documenter-dark .file-label:hover .file-cta{background-color:#e5eaec;color:#282f2f}html.theme--documenter-dark .file-label:hover .file-name{border-color:#596668}html.theme--documenter-dark .file-label:active .file-cta{background-color:#dde4e6;color:#282f2f}html.theme--documenter-dark .file-label:active .file-name{border-color:#535f61}html.theme--documenter-dark .file-input{height:100%;left:0;opacity:0;outline:none;position:absolute;top:0;width:100%}html.theme--documenter-dark .file-cta,html.theme--documenter-dark .file-name{border-color:#5e6d6f;border-radius:.4em;font-size:1em;padding-left:1em;padding-right:1em;white-space:nowrap}html.theme--documenter-dark .file-cta{background-color:#ecf0f1;color:#343c3d}html.theme--documenter-dark .file-name{border-color:#5e6d6f;border-style:solid;border-width:1px 1px 1px 0;display:block;max-width:16em;overflow:hidden;text-align:left;text-overflow:ellipsis}html.theme--documenter-dark .file-icon{align-items:center;display:flex;height:1em;justify-content:center;margin-right:0.5em;width:1em}html.theme--documenter-dark .file-icon .fa{font-size:14px}html.theme--documenter-dark .label{color:#282f2f;display:block;font-size:15px;font-weight:700}html.theme--documenter-dark .label:not(:last-child){margin-bottom:0.5em}html.theme--documenter-dark .label.is-small,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.label{font-size:.85em}html.theme--documenter-dark .label.is-medium{font-size:1.25rem}html.theme--documenter-dark .label.is-large{font-size:1.5rem}html.theme--documenter-dark .help{display:block;font-size:.85em;margin-top:0.25rem}html.theme--documenter-dark .help.is-white{color:#fff}html.theme--documenter-dark .help.is-black{color:#0a0a0a}html.theme--documenter-dark .help.is-light{color:#ecf0f1}html.theme--documenter-dark .help.is-dark,html.theme--documenter-dark .content kbd.help{color:#282f2f}html.theme--documenter-dark .help.is-primary,html.theme--documenter-dark .docstring>section>a.help.docs-sourcelink{color:#375a7f}html.theme--documenter-dark .help.is-link{color:#1abc9c}html.theme--documenter-dark .help.is-info{color:#024c7d}html.theme--documenter-dark .help.is-success{color:#008438}html.theme--documenter-dark .help.is-warning{color:#ad8100}html.theme--documenter-dark .help.is-danger{color:#9e1b0d}html.theme--documenter-dark .field:not(:last-child){margin-bottom:0.75rem}html.theme--documenter-dark .field.has-addons{display:flex;justify-content:flex-start}html.theme--documenter-dark .field.has-addons .control:not(:last-child){margin-right:-1px}html.theme--documenter-dark .field.has-addons .control:not(:first-child):not(:last-child) .button,html.theme--documenter-dark .field.has-addons .control:not(:first-child):not(:last-child) .input,html.theme--documenter-dark .field.has-addons .control:not(:first-child):not(:last-child) #documenter .docs-sidebar form.docs-search>input,html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control:not(:first-child):not(:last-child) form.docs-search>input,html.theme--documenter-dark .field.has-addons .control:not(:first-child):not(:last-child) .select select{border-radius:0}html.theme--documenter-dark .field.has-addons .control:first-child:not(:only-child) .button,html.theme--documenter-dark .field.has-addons .control:first-child:not(:only-child) .input,html.theme--documenter-dark .field.has-addons .control:first-child:not(:only-child) #documenter .docs-sidebar form.docs-search>input,html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control:first-child:not(:only-child) form.docs-search>input,html.theme--documenter-dark .field.has-addons .control:first-child:not(:only-child) .select select{border-bottom-right-radius:0;border-top-right-radius:0}html.theme--documenter-dark .field.has-addons .control:last-child:not(:only-child) .button,html.theme--documenter-dark .field.has-addons .control:last-child:not(:only-child) .input,html.theme--documenter-dark .field.has-addons .control:last-child:not(:only-child) #documenter .docs-sidebar form.docs-search>input,html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control:last-child:not(:only-child) form.docs-search>input,html.theme--documenter-dark .field.has-addons .control:last-child:not(:only-child) .select select{border-bottom-left-radius:0;border-top-left-radius:0}html.theme--documenter-dark .field.has-addons .control .button:not([disabled]):hover,html.theme--documenter-dark .field.has-addons .control .button.is-hovered:not([disabled]),html.theme--documenter-dark .field.has-addons .control .input:not([disabled]):hover,html.theme--documenter-dark .field.has-addons .control #documenter .docs-sidebar form.docs-search>input:not([disabled]):hover,html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control form.docs-search>input:not([disabled]):hover,html.theme--documenter-dark .field.has-addons .control .input.is-hovered:not([disabled]),html.theme--documenter-dark .field.has-addons .control #documenter .docs-sidebar form.docs-search>input.is-hovered:not([disabled]),html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control form.docs-search>input.is-hovered:not([disabled]),html.theme--documenter-dark .field.has-addons .control .select select:not([disabled]):hover,html.theme--documenter-dark .field.has-addons .control .select select.is-hovered:not([disabled]){z-index:2}html.theme--documenter-dark .field.has-addons .control .button:not([disabled]):focus,html.theme--documenter-dark .field.has-addons .control .button.is-focused:not([disabled]),html.theme--documenter-dark .field.has-addons .control .button:not([disabled]):active,html.theme--documenter-dark .field.has-addons .control .button.is-active:not([disabled]),html.theme--documenter-dark .field.has-addons .control .input:not([disabled]):focus,html.theme--documenter-dark .field.has-addons .control #documenter .docs-sidebar form.docs-search>input:not([disabled]):focus,html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control form.docs-search>input:not([disabled]):focus,html.theme--documenter-dark .field.has-addons .control .input.is-focused:not([disabled]),html.theme--documenter-dark .field.has-addons .control #documenter .docs-sidebar form.docs-search>input.is-focused:not([disabled]),html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control form.docs-search>input.is-focused:not([disabled]),html.theme--documenter-dark .field.has-addons .control .input:not([disabled]):active,html.theme--documenter-dark .field.has-addons .control #documenter .docs-sidebar form.docs-search>input:not([disabled]):active,html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control form.docs-search>input:not([disabled]):active,html.theme--documenter-dark .field.has-addons .control .input.is-active:not([disabled]),html.theme--documenter-dark .field.has-addons .control #documenter .docs-sidebar form.docs-search>input.is-active:not([disabled]),html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control form.docs-search>input.is-active:not([disabled]),html.theme--documenter-dark .field.has-addons .control .select select:not([disabled]):focus,html.theme--documenter-dark .field.has-addons .control .select select.is-focused:not([disabled]),html.theme--documenter-dark .field.has-addons .control .select select:not([disabled]):active,html.theme--documenter-dark .field.has-addons .control .select select.is-active:not([disabled]){z-index:3}html.theme--documenter-dark .field.has-addons .control .button:not([disabled]):focus:hover,html.theme--documenter-dark .field.has-addons .control .button.is-focused:not([disabled]):hover,html.theme--documenter-dark .field.has-addons .control .button:not([disabled]):active:hover,html.theme--documenter-dark .field.has-addons .control .button.is-active:not([disabled]):hover,html.theme--documenter-dark .field.has-addons .control .input:not([disabled]):focus:hover,html.theme--documenter-dark .field.has-addons .control #documenter .docs-sidebar form.docs-search>input:not([disabled]):focus:hover,html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control form.docs-search>input:not([disabled]):focus:hover,html.theme--documenter-dark .field.has-addons .control .input.is-focused:not([disabled]):hover,html.theme--documenter-dark .field.has-addons .control #documenter .docs-sidebar form.docs-search>input.is-focused:not([disabled]):hover,html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control form.docs-search>input.is-focused:not([disabled]):hover,html.theme--documenter-dark .field.has-addons .control .input:not([disabled]):active:hover,html.theme--documenter-dark .field.has-addons .control #documenter .docs-sidebar form.docs-search>input:not([disabled]):active:hover,html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control form.docs-search>input:not([disabled]):active:hover,html.theme--documenter-dark .field.has-addons .control .input.is-active:not([disabled]):hover,html.theme--documenter-dark .field.has-addons .control #documenter .docs-sidebar form.docs-search>input.is-active:not([disabled]):hover,html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control form.docs-search>input.is-active:not([disabled]):hover,html.theme--documenter-dark .field.has-addons .control .select select:not([disabled]):focus:hover,html.theme--documenter-dark .field.has-addons .control .select select.is-focused:not([disabled]):hover,html.theme--documenter-dark .field.has-addons .control .select select:not([disabled]):active:hover,html.theme--documenter-dark .field.has-addons .control .select select.is-active:not([disabled]):hover{z-index:4}html.theme--documenter-dark .field.has-addons .control.is-expanded{flex-grow:1;flex-shrink:1}html.theme--documenter-dark .field.has-addons.has-addons-centered{justify-content:center}html.theme--documenter-dark .field.has-addons.has-addons-right{justify-content:flex-end}html.theme--documenter-dark .field.has-addons.has-addons-fullwidth .control{flex-grow:1;flex-shrink:0}html.theme--documenter-dark .field.is-grouped{display:flex;justify-content:flex-start}html.theme--documenter-dark .field.is-grouped>.control{flex-shrink:0}html.theme--documenter-dark .field.is-grouped>.control:not(:last-child){margin-bottom:0;margin-right:0.75rem}html.theme--documenter-dark .field.is-grouped>.control.is-expanded{flex-grow:1;flex-shrink:1}html.theme--documenter-dark .field.is-grouped.is-grouped-centered{justify-content:center}html.theme--documenter-dark .field.is-grouped.is-grouped-right{justify-content:flex-end}html.theme--documenter-dark .field.is-grouped.is-grouped-multiline{flex-wrap:wrap}html.theme--documenter-dark .field.is-grouped.is-grouped-multiline>.control:last-child,html.theme--documenter-dark .field.is-grouped.is-grouped-multiline>.control:not(:last-child){margin-bottom:0.75rem}html.theme--documenter-dark .field.is-grouped.is-grouped-multiline:last-child{margin-bottom:-0.75rem}html.theme--documenter-dark .field.is-grouped.is-grouped-multiline:not(:last-child){margin-bottom:0}@media screen and (min-width: 769px),print{html.theme--documenter-dark .field.is-horizontal{display:flex}}html.theme--documenter-dark .field-label .label{font-size:inherit}@media screen and (max-width: 768px){html.theme--documenter-dark .field-label{margin-bottom:0.5rem}}@media screen and (min-width: 769px),print{html.theme--documenter-dark .field-label{flex-basis:0;flex-grow:1;flex-shrink:0;margin-right:1.5rem;text-align:right}html.theme--documenter-dark .field-label.is-small,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.field-label{font-size:.85em;padding-top:0.375em}html.theme--documenter-dark .field-label.is-normal{padding-top:0.375em}html.theme--documenter-dark .field-label.is-medium{font-size:1.25rem;padding-top:0.375em}html.theme--documenter-dark .field-label.is-large{font-size:1.5rem;padding-top:0.375em}}html.theme--documenter-dark .field-body .field .field{margin-bottom:0}@media screen and (min-width: 769px),print{html.theme--documenter-dark .field-body{display:flex;flex-basis:0;flex-grow:5;flex-shrink:1}html.theme--documenter-dark .field-body .field{margin-bottom:0}html.theme--documenter-dark .field-body>.field{flex-shrink:1}html.theme--documenter-dark .field-body>.field:not(.is-narrow){flex-grow:1}html.theme--documenter-dark .field-body>.field:not(:last-child){margin-right:0.75rem}}html.theme--documenter-dark .control{box-sizing:border-box;clear:both;font-size:15px;position:relative;text-align:left}html.theme--documenter-dark .control.has-icons-left .input:focus~.icon,html.theme--documenter-dark .control.has-icons-left #documenter .docs-sidebar form.docs-search>input:focus~.icon,html.theme--documenter-dark #documenter .docs-sidebar .control.has-icons-left form.docs-search>input:focus~.icon,html.theme--documenter-dark .control.has-icons-left .select:focus~.icon,html.theme--documenter-dark .control.has-icons-right .input:focus~.icon,html.theme--documenter-dark .control.has-icons-right #documenter .docs-sidebar form.docs-search>input:focus~.icon,html.theme--documenter-dark #documenter .docs-sidebar .control.has-icons-right form.docs-search>input:focus~.icon,html.theme--documenter-dark .control.has-icons-right .select:focus~.icon{color:#5e6d6f}html.theme--documenter-dark .control.has-icons-left .input.is-small~.icon,html.theme--documenter-dark .control.has-icons-left #documenter .docs-sidebar form.docs-search>input~.icon,html.theme--documenter-dark #documenter .docs-sidebar .control.has-icons-left form.docs-search>input~.icon,html.theme--documenter-dark .control.has-icons-left .select.is-small~.icon,html.theme--documenter-dark .control.has-icons-right .input.is-small~.icon,html.theme--documenter-dark .control.has-icons-right #documenter .docs-sidebar form.docs-search>input~.icon,html.theme--documenter-dark #documenter .docs-sidebar .control.has-icons-right form.docs-search>input~.icon,html.theme--documenter-dark .control.has-icons-right .select.is-small~.icon{font-size:.85em}html.theme--documenter-dark .control.has-icons-left .input.is-medium~.icon,html.theme--documenter-dark .control.has-icons-left #documenter .docs-sidebar form.docs-search>input.is-medium~.icon,html.theme--documenter-dark #documenter .docs-sidebar .control.has-icons-left form.docs-search>input.is-medium~.icon,html.theme--documenter-dark .control.has-icons-left .select.is-medium~.icon,html.theme--documenter-dark .control.has-icons-right .input.is-medium~.icon,html.theme--documenter-dark .control.has-icons-right #documenter .docs-sidebar form.docs-search>input.is-medium~.icon,html.theme--documenter-dark #documenter .docs-sidebar .control.has-icons-right form.docs-search>input.is-medium~.icon,html.theme--documenter-dark .control.has-icons-right .select.is-medium~.icon{font-size:1.25rem}html.theme--documenter-dark .control.has-icons-left .input.is-large~.icon,html.theme--documenter-dark .control.has-icons-left #documenter .docs-sidebar form.docs-search>input.is-large~.icon,html.theme--documenter-dark #documenter .docs-sidebar .control.has-icons-left form.docs-search>input.is-large~.icon,html.theme--documenter-dark .control.has-icons-left .select.is-large~.icon,html.theme--documenter-dark .control.has-icons-right .input.is-large~.icon,html.theme--documenter-dark .control.has-icons-right #documenter .docs-sidebar form.docs-search>input.is-large~.icon,html.theme--documenter-dark #documenter .docs-sidebar .control.has-icons-right form.docs-search>input.is-large~.icon,html.theme--documenter-dark .control.has-icons-right .select.is-large~.icon{font-size:1.5rem}html.theme--documenter-dark .control.has-icons-left .icon,html.theme--documenter-dark .control.has-icons-right .icon{color:#dbdee0;height:2.25em;pointer-events:none;position:absolute;top:0;width:2.25em;z-index:4}html.theme--documenter-dark .control.has-icons-left .input,html.theme--documenter-dark .control.has-icons-left #documenter .docs-sidebar form.docs-search>input,html.theme--documenter-dark #documenter .docs-sidebar .control.has-icons-left form.docs-search>input,html.theme--documenter-dark .control.has-icons-left .select select{padding-left:2.25em}html.theme--documenter-dark .control.has-icons-left .icon.is-left{left:0}html.theme--documenter-dark .control.has-icons-right .input,html.theme--documenter-dark .control.has-icons-right #documenter .docs-sidebar form.docs-search>input,html.theme--documenter-dark #documenter .docs-sidebar .control.has-icons-right form.docs-search>input,html.theme--documenter-dark .control.has-icons-right .select select{padding-right:2.25em}html.theme--documenter-dark .control.has-icons-right .icon.is-right{right:0}html.theme--documenter-dark .control.is-loading::after{position:absolute !important;right:0.625em;top:0.625em;z-index:4}html.theme--documenter-dark .control.is-loading.is-small:after,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-loading:after{font-size:.85em}html.theme--documenter-dark .control.is-loading.is-medium:after{font-size:1.25rem}html.theme--documenter-dark .control.is-loading.is-large:after{font-size:1.5rem}html.theme--documenter-dark .breadcrumb{font-size:15px;white-space:nowrap}html.theme--documenter-dark .breadcrumb a{align-items:center;color:#1abc9c;display:flex;justify-content:center;padding:0 .75em}html.theme--documenter-dark .breadcrumb a:hover{color:#1dd2af}html.theme--documenter-dark .breadcrumb li{align-items:center;display:flex}html.theme--documenter-dark .breadcrumb li:first-child a{padding-left:0}html.theme--documenter-dark .breadcrumb li.is-active a{color:#f2f2f2;cursor:default;pointer-events:none}html.theme--documenter-dark .breadcrumb li+li::before{color:#8c9b9d;content:"\0002f"}html.theme--documenter-dark .breadcrumb ul,html.theme--documenter-dark .breadcrumb ol{align-items:flex-start;display:flex;flex-wrap:wrap;justify-content:flex-start}html.theme--documenter-dark .breadcrumb .icon:first-child{margin-right:0.5em}html.theme--documenter-dark .breadcrumb .icon:last-child{margin-left:0.5em}html.theme--documenter-dark .breadcrumb.is-centered ol,html.theme--documenter-dark .breadcrumb.is-centered ul{justify-content:center}html.theme--documenter-dark .breadcrumb.is-right ol,html.theme--documenter-dark .breadcrumb.is-right ul{justify-content:flex-end}html.theme--documenter-dark .breadcrumb.is-small,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.breadcrumb{font-size:.85em}html.theme--documenter-dark .breadcrumb.is-medium{font-size:1.25rem}html.theme--documenter-dark .breadcrumb.is-large{font-size:1.5rem}html.theme--documenter-dark .breadcrumb.has-arrow-separator li+li::before{content:"\02192"}html.theme--documenter-dark .breadcrumb.has-bullet-separator li+li::before{content:"\02022"}html.theme--documenter-dark .breadcrumb.has-dot-separator li+li::before{content:"\000b7"}html.theme--documenter-dark .breadcrumb.has-succeeds-separator li+li::before{content:"\0227B"}html.theme--documenter-dark .card{background-color:#fff;box-shadow:0 2px 3px rgba(10,10,10,0.1),0 0 0 1px rgba(10,10,10,0.1);color:#fff;max-width:100%;position:relative}html.theme--documenter-dark .card-header{background-color:rgba(0,0,0,0);align-items:stretch;box-shadow:0 1px 2px rgba(10,10,10,0.1);display:flex}html.theme--documenter-dark .card-header-title{align-items:center;color:#f2f2f2;display:flex;flex-grow:1;font-weight:700;padding:.75rem}html.theme--documenter-dark .card-header-title.is-centered{justify-content:center}html.theme--documenter-dark .card-header-icon{align-items:center;cursor:pointer;display:flex;justify-content:center;padding:.75rem}html.theme--documenter-dark .card-image{display:block;position:relative}html.theme--documenter-dark .card-content{background-color:rgba(0,0,0,0);padding:1.5rem}html.theme--documenter-dark .card-footer{background-color:rgba(0,0,0,0);border-top:1px solid #5e6d6f;align-items:stretch;display:flex}html.theme--documenter-dark .card-footer-item{align-items:center;display:flex;flex-basis:0;flex-grow:1;flex-shrink:0;justify-content:center;padding:.75rem}html.theme--documenter-dark .card-footer-item:not(:last-child){border-right:1px solid #5e6d6f}html.theme--documenter-dark .card .media:not(:last-child){margin-bottom:1.5rem}html.theme--documenter-dark .dropdown{display:inline-flex;position:relative;vertical-align:top}html.theme--documenter-dark .dropdown.is-active .dropdown-menu,html.theme--documenter-dark .dropdown.is-hoverable:hover .dropdown-menu{display:block}html.theme--documenter-dark .dropdown.is-right .dropdown-menu{left:auto;right:0}html.theme--documenter-dark .dropdown.is-up .dropdown-menu{bottom:100%;padding-bottom:4px;padding-top:initial;top:auto}html.theme--documenter-dark .dropdown-menu{display:none;left:0;min-width:12rem;padding-top:4px;position:absolute;top:100%;z-index:20}html.theme--documenter-dark .dropdown-content{background-color:#282f2f;border-radius:.4em;box-shadow:0 2px 3px rgba(10,10,10,0.1),0 0 0 1px rgba(10,10,10,0.1);padding-bottom:.5rem;padding-top:.5rem}html.theme--documenter-dark .dropdown-item{color:#fff;display:block;font-size:0.875rem;line-height:1.5;padding:0.375rem 1rem;position:relative}html.theme--documenter-dark a.dropdown-item,html.theme--documenter-dark button.dropdown-item{padding-right:3rem;text-align:left;white-space:nowrap;width:100%}html.theme--documenter-dark a.dropdown-item:hover,html.theme--documenter-dark button.dropdown-item:hover{background-color:#282f2f;color:#0a0a0a}html.theme--documenter-dark a.dropdown-item.is-active,html.theme--documenter-dark button.dropdown-item.is-active{background-color:#1abc9c;color:#fff}html.theme--documenter-dark .dropdown-divider{background-color:#5e6d6f;border:none;display:block;height:1px;margin:0.5rem 0}html.theme--documenter-dark .level{align-items:center;justify-content:space-between}html.theme--documenter-dark .level code{border-radius:.4em}html.theme--documenter-dark .level img{display:inline-block;vertical-align:top}html.theme--documenter-dark .level.is-mobile{display:flex}html.theme--documenter-dark .level.is-mobile .level-left,html.theme--documenter-dark .level.is-mobile .level-right{display:flex}html.theme--documenter-dark .level.is-mobile .level-left+.level-right{margin-top:0}html.theme--documenter-dark .level.is-mobile .level-item:not(:last-child){margin-bottom:0;margin-right:.75rem}html.theme--documenter-dark .level.is-mobile .level-item:not(.is-narrow){flex-grow:1}@media screen and (min-width: 769px),print{html.theme--documenter-dark .level{display:flex}html.theme--documenter-dark .level>.level-item:not(.is-narrow){flex-grow:1}}html.theme--documenter-dark .level-item{align-items:center;display:flex;flex-basis:auto;flex-grow:0;flex-shrink:0;justify-content:center}html.theme--documenter-dark .level-item .title,html.theme--documenter-dark .level-item .subtitle{margin-bottom:0}@media screen and (max-width: 768px){html.theme--documenter-dark .level-item:not(:last-child){margin-bottom:.75rem}}html.theme--documenter-dark .level-left,html.theme--documenter-dark .level-right{flex-basis:auto;flex-grow:0;flex-shrink:0}html.theme--documenter-dark .level-left .level-item.is-flexible,html.theme--documenter-dark .level-right .level-item.is-flexible{flex-grow:1}@media screen and (min-width: 769px),print{html.theme--documenter-dark .level-left .level-item:not(:last-child),html.theme--documenter-dark .level-right .level-item:not(:last-child){margin-right:.75rem}}html.theme--documenter-dark .level-left{align-items:center;justify-content:flex-start}@media screen and (max-width: 768px){html.theme--documenter-dark .level-left+.level-right{margin-top:1.5rem}}@media screen and (min-width: 769px),print{html.theme--documenter-dark .level-left{display:flex}}html.theme--documenter-dark .level-right{align-items:center;justify-content:flex-end}@media screen and (min-width: 769px),print{html.theme--documenter-dark .level-right{display:flex}}html.theme--documenter-dark .list{background-color:#fff;border-radius:.4em;box-shadow:0 2px 3px rgba(10,10,10,0.1),0 0 0 1px rgba(10,10,10,0.1)}html.theme--documenter-dark .list-item{display:block;padding:0.5em 1em}html.theme--documenter-dark .list-item:not(a){color:#fff}html.theme--documenter-dark .list-item:first-child{border-top-left-radius:.4em;border-top-right-radius:.4em}html.theme--documenter-dark .list-item:last-child{border-bottom-left-radius:.4em;border-bottom-right-radius:.4em}html.theme--documenter-dark .list-item:not(:last-child){border-bottom:1px solid #5e6d6f}html.theme--documenter-dark .list-item.is-active{background-color:#1abc9c;color:#fff}html.theme--documenter-dark a.list-item{background-color:#282f2f;cursor:pointer}html.theme--documenter-dark .media{align-items:flex-start;display:flex;text-align:left}html.theme--documenter-dark .media .content:not(:last-child){margin-bottom:0.75rem}html.theme--documenter-dark .media .media{border-top:1px solid rgba(94,109,111,0.5);display:flex;padding-top:0.75rem}html.theme--documenter-dark .media .media .content:not(:last-child),html.theme--documenter-dark .media .media .control:not(:last-child){margin-bottom:0.5rem}html.theme--documenter-dark .media .media .media{padding-top:0.5rem}html.theme--documenter-dark .media .media .media+.media{margin-top:0.5rem}html.theme--documenter-dark .media+.media{border-top:1px solid rgba(94,109,111,0.5);margin-top:1rem;padding-top:1rem}html.theme--documenter-dark .media.is-large+.media{margin-top:1.5rem;padding-top:1.5rem}html.theme--documenter-dark .media-left,html.theme--documenter-dark .media-right{flex-basis:auto;flex-grow:0;flex-shrink:0}html.theme--documenter-dark .media-left{margin-right:1rem}html.theme--documenter-dark .media-right{margin-left:1rem}html.theme--documenter-dark .media-content{flex-basis:auto;flex-grow:1;flex-shrink:1;text-align:left}@media screen and (max-width: 768px){html.theme--documenter-dark .media-content{overflow-x:auto}}html.theme--documenter-dark .menu{font-size:15px}html.theme--documenter-dark .menu.is-small,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.menu{font-size:.85em}html.theme--documenter-dark .menu.is-medium{font-size:1.25rem}html.theme--documenter-dark .menu.is-large{font-size:1.5rem}html.theme--documenter-dark .menu-list{line-height:1.25}html.theme--documenter-dark .menu-list a{border-radius:3px;color:#fff;display:block;padding:0.5em 0.75em}html.theme--documenter-dark .menu-list a:hover{background-color:#282f2f;color:#f2f2f2}html.theme--documenter-dark .menu-list a.is-active{background-color:#1abc9c;color:#fff}html.theme--documenter-dark .menu-list li ul{border-left:1px solid #5e6d6f;margin:.75em;padding-left:.75em}html.theme--documenter-dark .menu-label{color:#fff;font-size:.75em;letter-spacing:.1em;text-transform:uppercase}html.theme--documenter-dark .menu-label:not(:first-child){margin-top:1em}html.theme--documenter-dark .menu-label:not(:last-child){margin-bottom:1em}html.theme--documenter-dark .message{background-color:#282f2f;border-radius:.4em;font-size:15px}html.theme--documenter-dark .message strong{color:currentColor}html.theme--documenter-dark .message a:not(.button):not(.tag):not(.dropdown-item){color:currentColor;text-decoration:underline}html.theme--documenter-dark .message.is-small,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.message{font-size:.85em}html.theme--documenter-dark .message.is-medium{font-size:1.25rem}html.theme--documenter-dark .message.is-large{font-size:1.5rem}html.theme--documenter-dark .message.is-white{background-color:#fff}html.theme--documenter-dark .message.is-white .message-header{background-color:#fff;color:#0a0a0a}html.theme--documenter-dark .message.is-white .message-body{border-color:#fff;color:#4d4d4d}html.theme--documenter-dark .message.is-black{background-color:#fafafa}html.theme--documenter-dark .message.is-black .message-header{background-color:#0a0a0a;color:#fff}html.theme--documenter-dark .message.is-black .message-body{border-color:#0a0a0a;color:#090909}html.theme--documenter-dark .message.is-light{background-color:#f9fafb}html.theme--documenter-dark .message.is-light .message-header{background-color:#ecf0f1;color:#282f2f}html.theme--documenter-dark .message.is-light .message-body{border-color:#ecf0f1;color:#505050}html.theme--documenter-dark .message.is-dark,html.theme--documenter-dark .content kbd.message{background-color:#f9fafa}html.theme--documenter-dark .message.is-dark .message-header,html.theme--documenter-dark .content kbd.message .message-header{background-color:#282f2f;color:#ecf0f1}html.theme--documenter-dark .message.is-dark .message-body,html.theme--documenter-dark .content kbd.message .message-body{border-color:#282f2f;color:#212526}html.theme--documenter-dark .message.is-primary,html.theme--documenter-dark .docstring>section>a.message.docs-sourcelink{background-color:#f8fafc}html.theme--documenter-dark .message.is-primary .message-header,html.theme--documenter-dark .docstring>section>a.message.docs-sourcelink .message-header{background-color:#375a7f;color:#fff}html.theme--documenter-dark .message.is-primary .message-body,html.theme--documenter-dark .docstring>section>a.message.docs-sourcelink .message-body{border-color:#375a7f;color:#2b4159}html.theme--documenter-dark .message.is-link{background-color:#f6fefc}html.theme--documenter-dark .message.is-link .message-header{background-color:#1abc9c;color:#fff}html.theme--documenter-dark .message.is-link .message-body{border-color:#1abc9c;color:#0b2f28}html.theme--documenter-dark .message.is-info{background-color:#f5fbff}html.theme--documenter-dark .message.is-info .message-header{background-color:#024c7d;color:#fff}html.theme--documenter-dark .message.is-info .message-body{border-color:#024c7d;color:#033659}html.theme--documenter-dark .message.is-success{background-color:#f5fff9}html.theme--documenter-dark .message.is-success .message-header{background-color:#008438;color:#fff}html.theme--documenter-dark .message.is-success .message-body{border-color:#008438;color:#023518}html.theme--documenter-dark .message.is-warning{background-color:#fffcf5}html.theme--documenter-dark .message.is-warning .message-header{background-color:#ad8100;color:#fff}html.theme--documenter-dark .message.is-warning .message-body{border-color:#ad8100;color:#3d2e03}html.theme--documenter-dark .message.is-danger{background-color:#fef6f6}html.theme--documenter-dark .message.is-danger .message-header{background-color:#9e1b0d;color:#fff}html.theme--documenter-dark .message.is-danger .message-body{border-color:#9e1b0d;color:#7a170c}html.theme--documenter-dark .message-header{align-items:center;background-color:#fff;border-radius:.4em .4em 0 0;color:rgba(0,0,0,0.7);display:flex;font-weight:700;justify-content:space-between;line-height:1.25;padding:0.75em 1em;position:relative}html.theme--documenter-dark .message-header .delete{flex-grow:0;flex-shrink:0;margin-left:0.75em}html.theme--documenter-dark .message-header+.message-body{border-width:0;border-top-left-radius:0;border-top-right-radius:0}html.theme--documenter-dark .message-body{border-color:#5e6d6f;border-radius:.4em;border-style:solid;border-width:0 0 0 4px;color:#fff;padding:1.25em 1.5em}html.theme--documenter-dark .message-body code,html.theme--documenter-dark .message-body pre{background-color:#fff}html.theme--documenter-dark .message-body pre code{background-color:rgba(0,0,0,0)}html.theme--documenter-dark .modal{align-items:center;display:none;flex-direction:column;justify-content:center;overflow:hidden;position:fixed;z-index:40}html.theme--documenter-dark .modal.is-active{display:flex}html.theme--documenter-dark .modal-background{background-color:rgba(10,10,10,0.86)}html.theme--documenter-dark .modal-content,html.theme--documenter-dark .modal-card{margin:0 20px;max-height:calc(100vh - 160px);overflow:auto;position:relative;width:100%}@media screen and (min-width: 769px),print{html.theme--documenter-dark .modal-content,html.theme--documenter-dark .modal-card{margin:0 auto;max-height:calc(100vh - 40px);width:640px}}html.theme--documenter-dark .modal-close{background:none;height:40px;position:fixed;right:20px;top:20px;width:40px}html.theme--documenter-dark .modal-card{display:flex;flex-direction:column;max-height:calc(100vh - 40px);overflow:hidden;-ms-overflow-y:visible}html.theme--documenter-dark .modal-card-head,html.theme--documenter-dark .modal-card-foot{align-items:center;background-color:#282f2f;display:flex;flex-shrink:0;justify-content:flex-start;padding:20px;position:relative}html.theme--documenter-dark .modal-card-head{border-bottom:1px solid #5e6d6f;border-top-left-radius:8px;border-top-right-radius:8px}html.theme--documenter-dark .modal-card-title{color:#f2f2f2;flex-grow:1;flex-shrink:0;font-size:1.5rem;line-height:1}html.theme--documenter-dark .modal-card-foot{border-bottom-left-radius:8px;border-bottom-right-radius:8px;border-top:1px solid #5e6d6f}html.theme--documenter-dark .modal-card-foot .button:not(:last-child){margin-right:0.5em}html.theme--documenter-dark .modal-card-body{-webkit-overflow-scrolling:touch;background-color:#fff;flex-grow:1;flex-shrink:1;overflow:auto;padding:20px}html.theme--documenter-dark .navbar{background-color:#375a7f;min-height:4rem;position:relative;z-index:30}html.theme--documenter-dark .navbar.is-white{background-color:#fff;color:#0a0a0a}html.theme--documenter-dark .navbar.is-white .navbar-brand>.navbar-item,html.theme--documenter-dark .navbar.is-white .navbar-brand .navbar-link{color:#0a0a0a}html.theme--documenter-dark .navbar.is-white .navbar-brand>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-white .navbar-brand>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-white .navbar-brand>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-white .navbar-brand .navbar-link:focus,html.theme--documenter-dark .navbar.is-white .navbar-brand .navbar-link:hover,html.theme--documenter-dark .navbar.is-white .navbar-brand .navbar-link.is-active{background-color:#f2f2f2;color:#0a0a0a}html.theme--documenter-dark .navbar.is-white .navbar-brand .navbar-link::after{border-color:#0a0a0a}html.theme--documenter-dark .navbar.is-white .navbar-burger{color:#0a0a0a}@media screen and (min-width: 1056px){html.theme--documenter-dark .navbar.is-white .navbar-start>.navbar-item,html.theme--documenter-dark .navbar.is-white .navbar-start .navbar-link,html.theme--documenter-dark .navbar.is-white .navbar-end>.navbar-item,html.theme--documenter-dark .navbar.is-white .navbar-end .navbar-link{color:#0a0a0a}html.theme--documenter-dark .navbar.is-white .navbar-start>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-white .navbar-start>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-white .navbar-start>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-white .navbar-start .navbar-link:focus,html.theme--documenter-dark .navbar.is-white .navbar-start .navbar-link:hover,html.theme--documenter-dark .navbar.is-white .navbar-start .navbar-link.is-active,html.theme--documenter-dark .navbar.is-white .navbar-end>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-white .navbar-end>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-white .navbar-end>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-white .navbar-end .navbar-link:focus,html.theme--documenter-dark .navbar.is-white .navbar-end .navbar-link:hover,html.theme--documenter-dark .navbar.is-white .navbar-end .navbar-link.is-active{background-color:#f2f2f2;color:#0a0a0a}html.theme--documenter-dark .navbar.is-white .navbar-start .navbar-link::after,html.theme--documenter-dark .navbar.is-white .navbar-end .navbar-link::after{border-color:#0a0a0a}html.theme--documenter-dark .navbar.is-white .navbar-item.has-dropdown:focus .navbar-link,html.theme--documenter-dark .navbar.is-white .navbar-item.has-dropdown:hover .navbar-link,html.theme--documenter-dark .navbar.is-white .navbar-item.has-dropdown.is-active .navbar-link{background-color:#f2f2f2;color:#0a0a0a}html.theme--documenter-dark .navbar.is-white .navbar-dropdown a.navbar-item.is-active{background-color:#fff;color:#0a0a0a}}html.theme--documenter-dark .navbar.is-black{background-color:#0a0a0a;color:#fff}html.theme--documenter-dark .navbar.is-black .navbar-brand>.navbar-item,html.theme--documenter-dark .navbar.is-black .navbar-brand .navbar-link{color:#fff}html.theme--documenter-dark .navbar.is-black .navbar-brand>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-black .navbar-brand>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-black .navbar-brand>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-black .navbar-brand .navbar-link:focus,html.theme--documenter-dark .navbar.is-black .navbar-brand .navbar-link:hover,html.theme--documenter-dark .navbar.is-black .navbar-brand .navbar-link.is-active{background-color:#000;color:#fff}html.theme--documenter-dark .navbar.is-black .navbar-brand .navbar-link::after{border-color:#fff}html.theme--documenter-dark .navbar.is-black .navbar-burger{color:#fff}@media screen and (min-width: 1056px){html.theme--documenter-dark .navbar.is-black .navbar-start>.navbar-item,html.theme--documenter-dark .navbar.is-black .navbar-start .navbar-link,html.theme--documenter-dark .navbar.is-black .navbar-end>.navbar-item,html.theme--documenter-dark .navbar.is-black .navbar-end .navbar-link{color:#fff}html.theme--documenter-dark .navbar.is-black .navbar-start>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-black .navbar-start>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-black .navbar-start>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-black .navbar-start .navbar-link:focus,html.theme--documenter-dark .navbar.is-black .navbar-start .navbar-link:hover,html.theme--documenter-dark .navbar.is-black .navbar-start .navbar-link.is-active,html.theme--documenter-dark .navbar.is-black .navbar-end>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-black .navbar-end>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-black .navbar-end>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-black .navbar-end .navbar-link:focus,html.theme--documenter-dark .navbar.is-black .navbar-end .navbar-link:hover,html.theme--documenter-dark .navbar.is-black .navbar-end .navbar-link.is-active{background-color:#000;color:#fff}html.theme--documenter-dark .navbar.is-black .navbar-start .navbar-link::after,html.theme--documenter-dark .navbar.is-black .navbar-end .navbar-link::after{border-color:#fff}html.theme--documenter-dark .navbar.is-black .navbar-item.has-dropdown:focus .navbar-link,html.theme--documenter-dark .navbar.is-black .navbar-item.has-dropdown:hover .navbar-link,html.theme--documenter-dark .navbar.is-black .navbar-item.has-dropdown.is-active .navbar-link{background-color:#000;color:#fff}html.theme--documenter-dark .navbar.is-black .navbar-dropdown a.navbar-item.is-active{background-color:#0a0a0a;color:#fff}}html.theme--documenter-dark .navbar.is-light{background-color:#ecf0f1;color:#282f2f}html.theme--documenter-dark .navbar.is-light .navbar-brand>.navbar-item,html.theme--documenter-dark .navbar.is-light .navbar-brand .navbar-link{color:#282f2f}html.theme--documenter-dark .navbar.is-light .navbar-brand>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-light .navbar-brand>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-light .navbar-brand>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-light .navbar-brand .navbar-link:focus,html.theme--documenter-dark .navbar.is-light .navbar-brand .navbar-link:hover,html.theme--documenter-dark .navbar.is-light .navbar-brand .navbar-link.is-active{background-color:#dde4e6;color:#282f2f}html.theme--documenter-dark .navbar.is-light .navbar-brand .navbar-link::after{border-color:#282f2f}html.theme--documenter-dark .navbar.is-light .navbar-burger{color:#282f2f}@media screen and (min-width: 1056px){html.theme--documenter-dark .navbar.is-light .navbar-start>.navbar-item,html.theme--documenter-dark .navbar.is-light .navbar-start .navbar-link,html.theme--documenter-dark .navbar.is-light .navbar-end>.navbar-item,html.theme--documenter-dark .navbar.is-light .navbar-end .navbar-link{color:#282f2f}html.theme--documenter-dark .navbar.is-light .navbar-start>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-light .navbar-start>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-light .navbar-start>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-light .navbar-start .navbar-link:focus,html.theme--documenter-dark .navbar.is-light .navbar-start .navbar-link:hover,html.theme--documenter-dark .navbar.is-light .navbar-start .navbar-link.is-active,html.theme--documenter-dark .navbar.is-light .navbar-end>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-light .navbar-end>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-light .navbar-end>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-light .navbar-end .navbar-link:focus,html.theme--documenter-dark .navbar.is-light .navbar-end .navbar-link:hover,html.theme--documenter-dark .navbar.is-light .navbar-end .navbar-link.is-active{background-color:#dde4e6;color:#282f2f}html.theme--documenter-dark .navbar.is-light .navbar-start .navbar-link::after,html.theme--documenter-dark .navbar.is-light .navbar-end .navbar-link::after{border-color:#282f2f}html.theme--documenter-dark .navbar.is-light .navbar-item.has-dropdown:focus .navbar-link,html.theme--documenter-dark .navbar.is-light .navbar-item.has-dropdown:hover .navbar-link,html.theme--documenter-dark .navbar.is-light .navbar-item.has-dropdown.is-active .navbar-link{background-color:#dde4e6;color:#282f2f}html.theme--documenter-dark .navbar.is-light .navbar-dropdown a.navbar-item.is-active{background-color:#ecf0f1;color:#282f2f}}html.theme--documenter-dark .navbar.is-dark,html.theme--documenter-dark .content kbd.navbar{background-color:#282f2f;color:#ecf0f1}html.theme--documenter-dark .navbar.is-dark .navbar-brand>.navbar-item,html.theme--documenter-dark .content kbd.navbar .navbar-brand>.navbar-item,html.theme--documenter-dark .navbar.is-dark .navbar-brand .navbar-link,html.theme--documenter-dark .content kbd.navbar .navbar-brand .navbar-link{color:#ecf0f1}html.theme--documenter-dark .navbar.is-dark .navbar-brand>a.navbar-item:focus,html.theme--documenter-dark .content kbd.navbar .navbar-brand>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-dark .navbar-brand>a.navbar-item:hover,html.theme--documenter-dark .content kbd.navbar .navbar-brand>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-dark .navbar-brand>a.navbar-item.is-active,html.theme--documenter-dark .content kbd.navbar .navbar-brand>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-dark .navbar-brand .navbar-link:focus,html.theme--documenter-dark .content kbd.navbar .navbar-brand .navbar-link:focus,html.theme--documenter-dark .navbar.is-dark .navbar-brand .navbar-link:hover,html.theme--documenter-dark .content kbd.navbar .navbar-brand .navbar-link:hover,html.theme--documenter-dark .navbar.is-dark .navbar-brand .navbar-link.is-active,html.theme--documenter-dark .content kbd.navbar .navbar-brand .navbar-link.is-active{background-color:#1d2122;color:#ecf0f1}html.theme--documenter-dark .navbar.is-dark .navbar-brand .navbar-link::after,html.theme--documenter-dark .content kbd.navbar .navbar-brand .navbar-link::after{border-color:#ecf0f1}html.theme--documenter-dark .navbar.is-dark .navbar-burger,html.theme--documenter-dark .content kbd.navbar .navbar-burger{color:#ecf0f1}@media screen and (min-width: 1056px){html.theme--documenter-dark .navbar.is-dark .navbar-start>.navbar-item,html.theme--documenter-dark .content kbd.navbar .navbar-start>.navbar-item,html.theme--documenter-dark .navbar.is-dark .navbar-start .navbar-link,html.theme--documenter-dark .content kbd.navbar .navbar-start .navbar-link,html.theme--documenter-dark .navbar.is-dark .navbar-end>.navbar-item,html.theme--documenter-dark .content kbd.navbar .navbar-end>.navbar-item,html.theme--documenter-dark .navbar.is-dark .navbar-end .navbar-link,html.theme--documenter-dark .content kbd.navbar .navbar-end .navbar-link{color:#ecf0f1}html.theme--documenter-dark .navbar.is-dark .navbar-start>a.navbar-item:focus,html.theme--documenter-dark .content kbd.navbar .navbar-start>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-dark .navbar-start>a.navbar-item:hover,html.theme--documenter-dark .content kbd.navbar .navbar-start>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-dark .navbar-start>a.navbar-item.is-active,html.theme--documenter-dark .content kbd.navbar .navbar-start>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-dark .navbar-start .navbar-link:focus,html.theme--documenter-dark .content kbd.navbar .navbar-start .navbar-link:focus,html.theme--documenter-dark .navbar.is-dark .navbar-start .navbar-link:hover,html.theme--documenter-dark .content kbd.navbar .navbar-start .navbar-link:hover,html.theme--documenter-dark .navbar.is-dark .navbar-start .navbar-link.is-active,html.theme--documenter-dark .content kbd.navbar .navbar-start .navbar-link.is-active,html.theme--documenter-dark .navbar.is-dark .navbar-end>a.navbar-item:focus,html.theme--documenter-dark .content kbd.navbar .navbar-end>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-dark .navbar-end>a.navbar-item:hover,html.theme--documenter-dark .content kbd.navbar .navbar-end>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-dark .navbar-end>a.navbar-item.is-active,html.theme--documenter-dark .content kbd.navbar .navbar-end>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-dark .navbar-end .navbar-link:focus,html.theme--documenter-dark .content kbd.navbar .navbar-end .navbar-link:focus,html.theme--documenter-dark .navbar.is-dark .navbar-end .navbar-link:hover,html.theme--documenter-dark .content kbd.navbar .navbar-end .navbar-link:hover,html.theme--documenter-dark .navbar.is-dark .navbar-end .navbar-link.is-active,html.theme--documenter-dark .content kbd.navbar .navbar-end .navbar-link.is-active{background-color:#1d2122;color:#ecf0f1}html.theme--documenter-dark .navbar.is-dark .navbar-start .navbar-link::after,html.theme--documenter-dark .content kbd.navbar .navbar-start .navbar-link::after,html.theme--documenter-dark .navbar.is-dark .navbar-end .navbar-link::after,html.theme--documenter-dark .content kbd.navbar .navbar-end .navbar-link::after{border-color:#ecf0f1}html.theme--documenter-dark .navbar.is-dark .navbar-item.has-dropdown:focus .navbar-link,html.theme--documenter-dark .content kbd.navbar .navbar-item.has-dropdown:focus .navbar-link,html.theme--documenter-dark .navbar.is-dark .navbar-item.has-dropdown:hover .navbar-link,html.theme--documenter-dark .content kbd.navbar .navbar-item.has-dropdown:hover .navbar-link,html.theme--documenter-dark .navbar.is-dark .navbar-item.has-dropdown.is-active .navbar-link,html.theme--documenter-dark .content kbd.navbar .navbar-item.has-dropdown.is-active .navbar-link{background-color:#1d2122;color:#ecf0f1}html.theme--documenter-dark .navbar.is-dark .navbar-dropdown a.navbar-item.is-active,html.theme--documenter-dark .content kbd.navbar .navbar-dropdown a.navbar-item.is-active{background-color:#282f2f;color:#ecf0f1}}html.theme--documenter-dark .navbar.is-primary,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink{background-color:#375a7f;color:#fff}html.theme--documenter-dark .navbar.is-primary .navbar-brand>.navbar-item,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-brand>.navbar-item,html.theme--documenter-dark .navbar.is-primary .navbar-brand .navbar-link,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-brand .navbar-link{color:#fff}html.theme--documenter-dark .navbar.is-primary .navbar-brand>a.navbar-item:focus,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-brand>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-primary .navbar-brand>a.navbar-item:hover,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-brand>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-primary .navbar-brand>a.navbar-item.is-active,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-brand>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-primary .navbar-brand .navbar-link:focus,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-brand .navbar-link:focus,html.theme--documenter-dark .navbar.is-primary .navbar-brand .navbar-link:hover,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-brand .navbar-link:hover,html.theme--documenter-dark .navbar.is-primary .navbar-brand .navbar-link.is-active,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-brand .navbar-link.is-active{background-color:#2f4d6d;color:#fff}html.theme--documenter-dark .navbar.is-primary .navbar-brand .navbar-link::after,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-brand .navbar-link::after{border-color:#fff}html.theme--documenter-dark .navbar.is-primary .navbar-burger,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-burger{color:#fff}@media screen and (min-width: 1056px){html.theme--documenter-dark .navbar.is-primary .navbar-start>.navbar-item,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-start>.navbar-item,html.theme--documenter-dark .navbar.is-primary .navbar-start .navbar-link,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-start .navbar-link,html.theme--documenter-dark .navbar.is-primary .navbar-end>.navbar-item,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-end>.navbar-item,html.theme--documenter-dark .navbar.is-primary .navbar-end .navbar-link,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-end .navbar-link{color:#fff}html.theme--documenter-dark .navbar.is-primary .navbar-start>a.navbar-item:focus,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-start>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-primary .navbar-start>a.navbar-item:hover,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-start>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-primary .navbar-start>a.navbar-item.is-active,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-start>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-primary .navbar-start .navbar-link:focus,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-start .navbar-link:focus,html.theme--documenter-dark .navbar.is-primary .navbar-start .navbar-link:hover,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-start .navbar-link:hover,html.theme--documenter-dark .navbar.is-primary .navbar-start .navbar-link.is-active,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-start .navbar-link.is-active,html.theme--documenter-dark .navbar.is-primary .navbar-end>a.navbar-item:focus,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-end>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-primary .navbar-end>a.navbar-item:hover,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-end>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-primary .navbar-end>a.navbar-item.is-active,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-end>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-primary .navbar-end .navbar-link:focus,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-end .navbar-link:focus,html.theme--documenter-dark .navbar.is-primary .navbar-end .navbar-link:hover,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-end .navbar-link:hover,html.theme--documenter-dark .navbar.is-primary .navbar-end .navbar-link.is-active,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-end .navbar-link.is-active{background-color:#2f4d6d;color:#fff}html.theme--documenter-dark .navbar.is-primary .navbar-start .navbar-link::after,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-start .navbar-link::after,html.theme--documenter-dark .navbar.is-primary .navbar-end .navbar-link::after,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-end .navbar-link::after{border-color:#fff}html.theme--documenter-dark .navbar.is-primary .navbar-item.has-dropdown:focus .navbar-link,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-item.has-dropdown:focus .navbar-link,html.theme--documenter-dark .navbar.is-primary .navbar-item.has-dropdown:hover .navbar-link,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-item.has-dropdown:hover .navbar-link,html.theme--documenter-dark .navbar.is-primary .navbar-item.has-dropdown.is-active .navbar-link,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-item.has-dropdown.is-active .navbar-link{background-color:#2f4d6d;color:#fff}html.theme--documenter-dark .navbar.is-primary .navbar-dropdown a.navbar-item.is-active,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-dropdown a.navbar-item.is-active{background-color:#375a7f;color:#fff}}html.theme--documenter-dark .navbar.is-link{background-color:#1abc9c;color:#fff}html.theme--documenter-dark .navbar.is-link .navbar-brand>.navbar-item,html.theme--documenter-dark .navbar.is-link .navbar-brand .navbar-link{color:#fff}html.theme--documenter-dark .navbar.is-link .navbar-brand>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-link .navbar-brand>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-link .navbar-brand>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-link .navbar-brand .navbar-link:focus,html.theme--documenter-dark .navbar.is-link .navbar-brand .navbar-link:hover,html.theme--documenter-dark .navbar.is-link .navbar-brand .navbar-link.is-active{background-color:#17a689;color:#fff}html.theme--documenter-dark .navbar.is-link .navbar-brand .navbar-link::after{border-color:#fff}html.theme--documenter-dark .navbar.is-link .navbar-burger{color:#fff}@media screen and (min-width: 1056px){html.theme--documenter-dark .navbar.is-link .navbar-start>.navbar-item,html.theme--documenter-dark .navbar.is-link .navbar-start .navbar-link,html.theme--documenter-dark .navbar.is-link .navbar-end>.navbar-item,html.theme--documenter-dark .navbar.is-link .navbar-end .navbar-link{color:#fff}html.theme--documenter-dark .navbar.is-link .navbar-start>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-link .navbar-start>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-link .navbar-start>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-link .navbar-start .navbar-link:focus,html.theme--documenter-dark .navbar.is-link .navbar-start .navbar-link:hover,html.theme--documenter-dark .navbar.is-link .navbar-start .navbar-link.is-active,html.theme--documenter-dark .navbar.is-link .navbar-end>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-link .navbar-end>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-link .navbar-end>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-link .navbar-end .navbar-link:focus,html.theme--documenter-dark .navbar.is-link .navbar-end .navbar-link:hover,html.theme--documenter-dark .navbar.is-link .navbar-end .navbar-link.is-active{background-color:#17a689;color:#fff}html.theme--documenter-dark .navbar.is-link .navbar-start .navbar-link::after,html.theme--documenter-dark .navbar.is-link .navbar-end .navbar-link::after{border-color:#fff}html.theme--documenter-dark .navbar.is-link .navbar-item.has-dropdown:focus .navbar-link,html.theme--documenter-dark .navbar.is-link .navbar-item.has-dropdown:hover .navbar-link,html.theme--documenter-dark .navbar.is-link .navbar-item.has-dropdown.is-active .navbar-link{background-color:#17a689;color:#fff}html.theme--documenter-dark .navbar.is-link .navbar-dropdown a.navbar-item.is-active{background-color:#1abc9c;color:#fff}}html.theme--documenter-dark .navbar.is-info{background-color:#024c7d;color:#fff}html.theme--documenter-dark .navbar.is-info .navbar-brand>.navbar-item,html.theme--documenter-dark .navbar.is-info .navbar-brand .navbar-link{color:#fff}html.theme--documenter-dark .navbar.is-info .navbar-brand>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-info .navbar-brand>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-info .navbar-brand>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-info .navbar-brand .navbar-link:focus,html.theme--documenter-dark .navbar.is-info .navbar-brand .navbar-link:hover,html.theme--documenter-dark .navbar.is-info .navbar-brand .navbar-link.is-active{background-color:#023d64;color:#fff}html.theme--documenter-dark .navbar.is-info .navbar-brand .navbar-link::after{border-color:#fff}html.theme--documenter-dark .navbar.is-info .navbar-burger{color:#fff}@media screen and (min-width: 1056px){html.theme--documenter-dark .navbar.is-info .navbar-start>.navbar-item,html.theme--documenter-dark .navbar.is-info .navbar-start .navbar-link,html.theme--documenter-dark .navbar.is-info .navbar-end>.navbar-item,html.theme--documenter-dark .navbar.is-info .navbar-end .navbar-link{color:#fff}html.theme--documenter-dark .navbar.is-info .navbar-start>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-info .navbar-start>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-info .navbar-start>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-info .navbar-start .navbar-link:focus,html.theme--documenter-dark .navbar.is-info .navbar-start .navbar-link:hover,html.theme--documenter-dark .navbar.is-info .navbar-start .navbar-link.is-active,html.theme--documenter-dark .navbar.is-info .navbar-end>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-info .navbar-end>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-info .navbar-end>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-info .navbar-end .navbar-link:focus,html.theme--documenter-dark .navbar.is-info .navbar-end .navbar-link:hover,html.theme--documenter-dark .navbar.is-info .navbar-end .navbar-link.is-active{background-color:#023d64;color:#fff}html.theme--documenter-dark .navbar.is-info .navbar-start .navbar-link::after,html.theme--documenter-dark .navbar.is-info .navbar-end .navbar-link::after{border-color:#fff}html.theme--documenter-dark .navbar.is-info .navbar-item.has-dropdown:focus .navbar-link,html.theme--documenter-dark .navbar.is-info .navbar-item.has-dropdown:hover .navbar-link,html.theme--documenter-dark .navbar.is-info .navbar-item.has-dropdown.is-active .navbar-link{background-color:#023d64;color:#fff}html.theme--documenter-dark .navbar.is-info .navbar-dropdown a.navbar-item.is-active{background-color:#024c7d;color:#fff}}html.theme--documenter-dark .navbar.is-success{background-color:#008438;color:#fff}html.theme--documenter-dark .navbar.is-success .navbar-brand>.navbar-item,html.theme--documenter-dark .navbar.is-success .navbar-brand .navbar-link{color:#fff}html.theme--documenter-dark .navbar.is-success .navbar-brand>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-success .navbar-brand>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-success .navbar-brand>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-success .navbar-brand .navbar-link:focus,html.theme--documenter-dark .navbar.is-success .navbar-brand .navbar-link:hover,html.theme--documenter-dark .navbar.is-success .navbar-brand .navbar-link.is-active{background-color:#006b2d;color:#fff}html.theme--documenter-dark .navbar.is-success .navbar-brand .navbar-link::after{border-color:#fff}html.theme--documenter-dark .navbar.is-success .navbar-burger{color:#fff}@media screen and (min-width: 1056px){html.theme--documenter-dark .navbar.is-success .navbar-start>.navbar-item,html.theme--documenter-dark .navbar.is-success .navbar-start .navbar-link,html.theme--documenter-dark .navbar.is-success .navbar-end>.navbar-item,html.theme--documenter-dark .navbar.is-success .navbar-end .navbar-link{color:#fff}html.theme--documenter-dark .navbar.is-success .navbar-start>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-success .navbar-start>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-success .navbar-start>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-success .navbar-start .navbar-link:focus,html.theme--documenter-dark .navbar.is-success .navbar-start .navbar-link:hover,html.theme--documenter-dark .navbar.is-success .navbar-start .navbar-link.is-active,html.theme--documenter-dark .navbar.is-success .navbar-end>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-success .navbar-end>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-success .navbar-end>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-success .navbar-end .navbar-link:focus,html.theme--documenter-dark .navbar.is-success .navbar-end .navbar-link:hover,html.theme--documenter-dark .navbar.is-success .navbar-end .navbar-link.is-active{background-color:#006b2d;color:#fff}html.theme--documenter-dark .navbar.is-success .navbar-start .navbar-link::after,html.theme--documenter-dark .navbar.is-success .navbar-end .navbar-link::after{border-color:#fff}html.theme--documenter-dark .navbar.is-success .navbar-item.has-dropdown:focus .navbar-link,html.theme--documenter-dark .navbar.is-success .navbar-item.has-dropdown:hover .navbar-link,html.theme--documenter-dark .navbar.is-success .navbar-item.has-dropdown.is-active .navbar-link{background-color:#006b2d;color:#fff}html.theme--documenter-dark .navbar.is-success .navbar-dropdown a.navbar-item.is-active{background-color:#008438;color:#fff}}html.theme--documenter-dark .navbar.is-warning{background-color:#ad8100;color:#fff}html.theme--documenter-dark .navbar.is-warning .navbar-brand>.navbar-item,html.theme--documenter-dark .navbar.is-warning .navbar-brand .navbar-link{color:#fff}html.theme--documenter-dark .navbar.is-warning .navbar-brand>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-warning .navbar-brand>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-warning .navbar-brand>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-warning .navbar-brand .navbar-link:focus,html.theme--documenter-dark .navbar.is-warning .navbar-brand .navbar-link:hover,html.theme--documenter-dark .navbar.is-warning .navbar-brand .navbar-link.is-active{background-color:#946e00;color:#fff}html.theme--documenter-dark .navbar.is-warning .navbar-brand .navbar-link::after{border-color:#fff}html.theme--documenter-dark .navbar.is-warning .navbar-burger{color:#fff}@media screen and (min-width: 1056px){html.theme--documenter-dark .navbar.is-warning .navbar-start>.navbar-item,html.theme--documenter-dark .navbar.is-warning .navbar-start .navbar-link,html.theme--documenter-dark .navbar.is-warning .navbar-end>.navbar-item,html.theme--documenter-dark .navbar.is-warning .navbar-end .navbar-link{color:#fff}html.theme--documenter-dark .navbar.is-warning .navbar-start>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-warning .navbar-start>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-warning .navbar-start>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-warning .navbar-start .navbar-link:focus,html.theme--documenter-dark .navbar.is-warning .navbar-start .navbar-link:hover,html.theme--documenter-dark .navbar.is-warning .navbar-start .navbar-link.is-active,html.theme--documenter-dark .navbar.is-warning .navbar-end>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-warning .navbar-end>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-warning .navbar-end>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-warning .navbar-end .navbar-link:focus,html.theme--documenter-dark .navbar.is-warning .navbar-end .navbar-link:hover,html.theme--documenter-dark .navbar.is-warning .navbar-end .navbar-link.is-active{background-color:#946e00;color:#fff}html.theme--documenter-dark .navbar.is-warning .navbar-start .navbar-link::after,html.theme--documenter-dark .navbar.is-warning .navbar-end .navbar-link::after{border-color:#fff}html.theme--documenter-dark .navbar.is-warning .navbar-item.has-dropdown:focus .navbar-link,html.theme--documenter-dark .navbar.is-warning .navbar-item.has-dropdown:hover .navbar-link,html.theme--documenter-dark .navbar.is-warning .navbar-item.has-dropdown.is-active .navbar-link{background-color:#946e00;color:#fff}html.theme--documenter-dark .navbar.is-warning .navbar-dropdown a.navbar-item.is-active{background-color:#ad8100;color:#fff}}html.theme--documenter-dark .navbar.is-danger{background-color:#9e1b0d;color:#fff}html.theme--documenter-dark .navbar.is-danger .navbar-brand>.navbar-item,html.theme--documenter-dark .navbar.is-danger .navbar-brand .navbar-link{color:#fff}html.theme--documenter-dark .navbar.is-danger .navbar-brand>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-danger .navbar-brand>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-danger .navbar-brand>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-danger .navbar-brand .navbar-link:focus,html.theme--documenter-dark .navbar.is-danger .navbar-brand .navbar-link:hover,html.theme--documenter-dark .navbar.is-danger .navbar-brand .navbar-link.is-active{background-color:#86170b;color:#fff}html.theme--documenter-dark .navbar.is-danger .navbar-brand .navbar-link::after{border-color:#fff}html.theme--documenter-dark .navbar.is-danger .navbar-burger{color:#fff}@media screen and (min-width: 1056px){html.theme--documenter-dark .navbar.is-danger .navbar-start>.navbar-item,html.theme--documenter-dark .navbar.is-danger .navbar-start .navbar-link,html.theme--documenter-dark .navbar.is-danger .navbar-end>.navbar-item,html.theme--documenter-dark .navbar.is-danger .navbar-end .navbar-link{color:#fff}html.theme--documenter-dark .navbar.is-danger .navbar-start>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-danger .navbar-start>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-danger .navbar-start>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-danger .navbar-start .navbar-link:focus,html.theme--documenter-dark .navbar.is-danger .navbar-start .navbar-link:hover,html.theme--documenter-dark .navbar.is-danger .navbar-start .navbar-link.is-active,html.theme--documenter-dark .navbar.is-danger .navbar-end>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-danger .navbar-end>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-danger .navbar-end>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-danger .navbar-end .navbar-link:focus,html.theme--documenter-dark .navbar.is-danger .navbar-end .navbar-link:hover,html.theme--documenter-dark .navbar.is-danger .navbar-end .navbar-link.is-active{background-color:#86170b;color:#fff}html.theme--documenter-dark .navbar.is-danger .navbar-start .navbar-link::after,html.theme--documenter-dark .navbar.is-danger .navbar-end .navbar-link::after{border-color:#fff}html.theme--documenter-dark .navbar.is-danger .navbar-item.has-dropdown:focus .navbar-link,html.theme--documenter-dark .navbar.is-danger .navbar-item.has-dropdown:hover .navbar-link,html.theme--documenter-dark .navbar.is-danger .navbar-item.has-dropdown.is-active .navbar-link{background-color:#86170b;color:#fff}html.theme--documenter-dark .navbar.is-danger .navbar-dropdown a.navbar-item.is-active{background-color:#9e1b0d;color:#fff}}html.theme--documenter-dark .navbar>.container{align-items:stretch;display:flex;min-height:4rem;width:100%}html.theme--documenter-dark .navbar.has-shadow{box-shadow:0 2px 0 0 #282f2f}html.theme--documenter-dark .navbar.is-fixed-bottom,html.theme--documenter-dark .navbar.is-fixed-top{left:0;position:fixed;right:0;z-index:30}html.theme--documenter-dark .navbar.is-fixed-bottom{bottom:0}html.theme--documenter-dark .navbar.is-fixed-bottom.has-shadow{box-shadow:0 -2px 0 0 #282f2f}html.theme--documenter-dark .navbar.is-fixed-top{top:0}html.theme--documenter-dark html.has-navbar-fixed-top,html.theme--documenter-dark body.has-navbar-fixed-top{padding-top:4rem}html.theme--documenter-dark html.has-navbar-fixed-bottom,html.theme--documenter-dark body.has-navbar-fixed-bottom{padding-bottom:4rem}html.theme--documenter-dark .navbar-brand,html.theme--documenter-dark .navbar-tabs{align-items:stretch;display:flex;flex-shrink:0;min-height:4rem}html.theme--documenter-dark .navbar-brand a.navbar-item:focus,html.theme--documenter-dark .navbar-brand a.navbar-item:hover{background-color:transparent}html.theme--documenter-dark .navbar-tabs{-webkit-overflow-scrolling:touch;max-width:100vw;overflow-x:auto;overflow-y:hidden}html.theme--documenter-dark .navbar-burger{color:#fff;cursor:pointer;display:block;height:4rem;position:relative;width:4rem;margin-left:auto}html.theme--documenter-dark .navbar-burger span{background-color:currentColor;display:block;height:1px;left:calc(50% - 8px);position:absolute;transform-origin:center;transition-duration:86ms;transition-property:background-color, opacity, transform;transition-timing-function:ease-out;width:16px}html.theme--documenter-dark .navbar-burger span:nth-child(1){top:calc(50% - 6px)}html.theme--documenter-dark .navbar-burger span:nth-child(2){top:calc(50% - 1px)}html.theme--documenter-dark .navbar-burger span:nth-child(3){top:calc(50% + 4px)}html.theme--documenter-dark .navbar-burger:hover{background-color:rgba(0,0,0,0.05)}html.theme--documenter-dark .navbar-burger.is-active span:nth-child(1){transform:translateY(5px) rotate(45deg)}html.theme--documenter-dark .navbar-burger.is-active span:nth-child(2){opacity:0}html.theme--documenter-dark .navbar-burger.is-active span:nth-child(3){transform:translateY(-5px) rotate(-45deg)}html.theme--documenter-dark .navbar-menu{display:none}html.theme--documenter-dark .navbar-item,html.theme--documenter-dark .navbar-link{color:#fff;display:block;line-height:1.5;padding:0.5rem 0.75rem;position:relative}html.theme--documenter-dark .navbar-item .icon:only-child,html.theme--documenter-dark .navbar-link .icon:only-child{margin-left:-0.25rem;margin-right:-0.25rem}html.theme--documenter-dark a.navbar-item,html.theme--documenter-dark .navbar-link{cursor:pointer}html.theme--documenter-dark a.navbar-item:focus,html.theme--documenter-dark a.navbar-item:focus-within,html.theme--documenter-dark a.navbar-item:hover,html.theme--documenter-dark a.navbar-item.is-active,html.theme--documenter-dark .navbar-link:focus,html.theme--documenter-dark .navbar-link:focus-within,html.theme--documenter-dark .navbar-link:hover,html.theme--documenter-dark .navbar-link.is-active{background-color:rgba(0,0,0,0);color:#1abc9c}html.theme--documenter-dark .navbar-item{display:block;flex-grow:0;flex-shrink:0}html.theme--documenter-dark .navbar-item img{max-height:1.75rem}html.theme--documenter-dark .navbar-item.has-dropdown{padding:0}html.theme--documenter-dark .navbar-item.is-expanded{flex-grow:1;flex-shrink:1}html.theme--documenter-dark .navbar-item.is-tab{border-bottom:1px solid transparent;min-height:4rem;padding-bottom:calc(0.5rem - 1px)}html.theme--documenter-dark .navbar-item.is-tab:focus,html.theme--documenter-dark .navbar-item.is-tab:hover{background-color:rgba(0,0,0,0);border-bottom-color:#1abc9c}html.theme--documenter-dark .navbar-item.is-tab.is-active{background-color:rgba(0,0,0,0);border-bottom-color:#1abc9c;border-bottom-style:solid;border-bottom-width:3px;color:#1abc9c;padding-bottom:calc(0.5rem - 3px)}html.theme--documenter-dark .navbar-content{flex-grow:1;flex-shrink:1}html.theme--documenter-dark .navbar-link:not(.is-arrowless){padding-right:2.5em}html.theme--documenter-dark .navbar-link:not(.is-arrowless)::after{border-color:#fff;margin-top:-0.375em;right:1.125em}html.theme--documenter-dark .navbar-dropdown{font-size:0.875rem;padding-bottom:0.5rem;padding-top:0.5rem}html.theme--documenter-dark .navbar-dropdown .navbar-item{padding-left:1.5rem;padding-right:1.5rem}html.theme--documenter-dark .navbar-divider{background-color:rgba(0,0,0,0.2);border:none;display:none;height:2px;margin:0.5rem 0}@media screen and (max-width: 1055px){html.theme--documenter-dark .navbar>.container{display:block}html.theme--documenter-dark .navbar-brand .navbar-item,html.theme--documenter-dark .navbar-tabs .navbar-item{align-items:center;display:flex}html.theme--documenter-dark .navbar-link::after{display:none}html.theme--documenter-dark .navbar-menu{background-color:#375a7f;box-shadow:0 8px 16px rgba(10,10,10,0.1);padding:0.5rem 0}html.theme--documenter-dark .navbar-menu.is-active{display:block}html.theme--documenter-dark .navbar.is-fixed-bottom-touch,html.theme--documenter-dark .navbar.is-fixed-top-touch{left:0;position:fixed;right:0;z-index:30}html.theme--documenter-dark .navbar.is-fixed-bottom-touch{bottom:0}html.theme--documenter-dark .navbar.is-fixed-bottom-touch.has-shadow{box-shadow:0 -2px 3px rgba(10,10,10,0.1)}html.theme--documenter-dark .navbar.is-fixed-top-touch{top:0}html.theme--documenter-dark .navbar.is-fixed-top .navbar-menu,html.theme--documenter-dark .navbar.is-fixed-top-touch .navbar-menu{-webkit-overflow-scrolling:touch;max-height:calc(100vh - 4rem);overflow:auto}html.theme--documenter-dark html.has-navbar-fixed-top-touch,html.theme--documenter-dark body.has-navbar-fixed-top-touch{padding-top:4rem}html.theme--documenter-dark html.has-navbar-fixed-bottom-touch,html.theme--documenter-dark body.has-navbar-fixed-bottom-touch{padding-bottom:4rem}}@media screen and (min-width: 1056px){html.theme--documenter-dark .navbar,html.theme--documenter-dark .navbar-menu,html.theme--documenter-dark .navbar-start,html.theme--documenter-dark .navbar-end{align-items:stretch;display:flex}html.theme--documenter-dark .navbar{min-height:4rem}html.theme--documenter-dark .navbar.is-spaced{padding:1rem 2rem}html.theme--documenter-dark .navbar.is-spaced .navbar-start,html.theme--documenter-dark .navbar.is-spaced .navbar-end{align-items:center}html.theme--documenter-dark .navbar.is-spaced a.navbar-item,html.theme--documenter-dark .navbar.is-spaced .navbar-link{border-radius:.4em}html.theme--documenter-dark .navbar.is-transparent a.navbar-item:focus,html.theme--documenter-dark .navbar.is-transparent a.navbar-item:hover,html.theme--documenter-dark .navbar.is-transparent a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-transparent .navbar-link:focus,html.theme--documenter-dark .navbar.is-transparent .navbar-link:hover,html.theme--documenter-dark .navbar.is-transparent .navbar-link.is-active{background-color:transparent !important}html.theme--documenter-dark .navbar.is-transparent .navbar-item.has-dropdown.is-active .navbar-link,html.theme--documenter-dark .navbar.is-transparent .navbar-item.has-dropdown.is-hoverable:focus .navbar-link,html.theme--documenter-dark .navbar.is-transparent .navbar-item.has-dropdown.is-hoverable:focus-within .navbar-link,html.theme--documenter-dark .navbar.is-transparent .navbar-item.has-dropdown.is-hoverable:hover .navbar-link{background-color:transparent !important}html.theme--documenter-dark .navbar.is-transparent .navbar-dropdown a.navbar-item:focus,html.theme--documenter-dark .navbar.is-transparent .navbar-dropdown a.navbar-item:hover{background-color:rgba(0,0,0,0);color:#dbdee0}html.theme--documenter-dark .navbar.is-transparent .navbar-dropdown a.navbar-item.is-active{background-color:rgba(0,0,0,0);color:#1abc9c}html.theme--documenter-dark .navbar-burger{display:none}html.theme--documenter-dark .navbar-item,html.theme--documenter-dark .navbar-link{align-items:center;display:flex}html.theme--documenter-dark .navbar-item{display:flex}html.theme--documenter-dark .navbar-item.has-dropdown{align-items:stretch}html.theme--documenter-dark .navbar-item.has-dropdown-up .navbar-link::after{transform:rotate(135deg) translate(0.25em, -0.25em)}html.theme--documenter-dark .navbar-item.has-dropdown-up .navbar-dropdown{border-bottom:1px solid rgba(0,0,0,0.2);border-radius:8px 8px 0 0;border-top:none;bottom:100%;box-shadow:0 -8px 8px rgba(10,10,10,0.1);top:auto}html.theme--documenter-dark .navbar-item.is-active .navbar-dropdown,html.theme--documenter-dark .navbar-item.is-hoverable:focus .navbar-dropdown,html.theme--documenter-dark .navbar-item.is-hoverable:focus-within .navbar-dropdown,html.theme--documenter-dark .navbar-item.is-hoverable:hover .navbar-dropdown{display:block}.navbar.is-spaced html.theme--documenter-dark .navbar-item.is-active .navbar-dropdown,html.theme--documenter-dark .navbar-item.is-active .navbar-dropdown.is-boxed,.navbar.is-spaced html.theme--documenter-dark .navbar-item.is-hoverable:focus .navbar-dropdown,html.theme--documenter-dark .navbar-item.is-hoverable:focus .navbar-dropdown.is-boxed,.navbar.is-spaced html.theme--documenter-dark .navbar-item.is-hoverable:focus-within .navbar-dropdown,html.theme--documenter-dark .navbar-item.is-hoverable:focus-within .navbar-dropdown.is-boxed,.navbar.is-spaced html.theme--documenter-dark .navbar-item.is-hoverable:hover .navbar-dropdown,html.theme--documenter-dark .navbar-item.is-hoverable:hover .navbar-dropdown.is-boxed{opacity:1;pointer-events:auto;transform:translateY(0)}html.theme--documenter-dark .navbar-menu{flex-grow:1;flex-shrink:0}html.theme--documenter-dark .navbar-start{justify-content:flex-start;margin-right:auto}html.theme--documenter-dark .navbar-end{justify-content:flex-end;margin-left:auto}html.theme--documenter-dark .navbar-dropdown{background-color:#375a7f;border-bottom-left-radius:8px;border-bottom-right-radius:8px;border-top:1px solid rgba(0,0,0,0.2);box-shadow:0 8px 8px rgba(10,10,10,0.1);display:none;font-size:0.875rem;left:0;min-width:100%;position:absolute;top:100%;z-index:20}html.theme--documenter-dark .navbar-dropdown .navbar-item{padding:0.375rem 1rem;white-space:nowrap}html.theme--documenter-dark .navbar-dropdown a.navbar-item{padding-right:3rem}html.theme--documenter-dark .navbar-dropdown a.navbar-item:focus,html.theme--documenter-dark .navbar-dropdown a.navbar-item:hover{background-color:rgba(0,0,0,0);color:#dbdee0}html.theme--documenter-dark .navbar-dropdown a.navbar-item.is-active{background-color:rgba(0,0,0,0);color:#1abc9c}.navbar.is-spaced html.theme--documenter-dark .navbar-dropdown,html.theme--documenter-dark .navbar-dropdown.is-boxed{border-radius:8px;border-top:none;box-shadow:0 8px 8px rgba(10,10,10,0.1), 0 0 0 1px rgba(10,10,10,0.1);display:block;opacity:0;pointer-events:none;top:calc(100% + (-4px));transform:translateY(-5px);transition-duration:86ms;transition-property:opacity, transform}html.theme--documenter-dark .navbar-dropdown.is-right{left:auto;right:0}html.theme--documenter-dark .navbar-divider{display:block}html.theme--documenter-dark .navbar>.container .navbar-brand,html.theme--documenter-dark .container>.navbar .navbar-brand{margin-left:-.75rem}html.theme--documenter-dark .navbar>.container .navbar-menu,html.theme--documenter-dark .container>.navbar .navbar-menu{margin-right:-.75rem}html.theme--documenter-dark .navbar.is-fixed-bottom-desktop,html.theme--documenter-dark .navbar.is-fixed-top-desktop{left:0;position:fixed;right:0;z-index:30}html.theme--documenter-dark .navbar.is-fixed-bottom-desktop{bottom:0}html.theme--documenter-dark .navbar.is-fixed-bottom-desktop.has-shadow{box-shadow:0 -2px 3px rgba(10,10,10,0.1)}html.theme--documenter-dark .navbar.is-fixed-top-desktop{top:0}html.theme--documenter-dark html.has-navbar-fixed-top-desktop,html.theme--documenter-dark body.has-navbar-fixed-top-desktop{padding-top:4rem}html.theme--documenter-dark html.has-navbar-fixed-bottom-desktop,html.theme--documenter-dark body.has-navbar-fixed-bottom-desktop{padding-bottom:4rem}html.theme--documenter-dark html.has-spaced-navbar-fixed-top,html.theme--documenter-dark body.has-spaced-navbar-fixed-top{padding-top:6rem}html.theme--documenter-dark html.has-spaced-navbar-fixed-bottom,html.theme--documenter-dark body.has-spaced-navbar-fixed-bottom{padding-bottom:6rem}html.theme--documenter-dark a.navbar-item.is-active,html.theme--documenter-dark .navbar-link.is-active{color:#1abc9c}html.theme--documenter-dark a.navbar-item.is-active:not(:focus):not(:hover),html.theme--documenter-dark .navbar-link.is-active:not(:focus):not(:hover){background-color:rgba(0,0,0,0)}html.theme--documenter-dark .navbar-item.has-dropdown:focus .navbar-link,html.theme--documenter-dark .navbar-item.has-dropdown:hover .navbar-link,html.theme--documenter-dark .navbar-item.has-dropdown.is-active .navbar-link{background-color:rgba(0,0,0,0)}}html.theme--documenter-dark .hero.is-fullheight-with-navbar{min-height:calc(100vh - 4rem)}html.theme--documenter-dark .pagination{font-size:15px;margin:-.25rem}html.theme--documenter-dark .pagination.is-small,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.pagination{font-size:.85em}html.theme--documenter-dark .pagination.is-medium{font-size:1.25rem}html.theme--documenter-dark .pagination.is-large{font-size:1.5rem}html.theme--documenter-dark .pagination.is-rounded .pagination-previous,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.pagination .pagination-previous,html.theme--documenter-dark .pagination.is-rounded .pagination-next,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.pagination .pagination-next{padding-left:1em;padding-right:1em;border-radius:290486px}html.theme--documenter-dark .pagination.is-rounded .pagination-link,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.pagination .pagination-link{border-radius:290486px}html.theme--documenter-dark .pagination,html.theme--documenter-dark .pagination-list{align-items:center;display:flex;justify-content:center;text-align:center}html.theme--documenter-dark .pagination-previous,html.theme--documenter-dark .pagination-next,html.theme--documenter-dark .pagination-link,html.theme--documenter-dark .pagination-ellipsis{font-size:1em;justify-content:center;margin:.25rem;padding-left:.5em;padding-right:.5em;text-align:center}html.theme--documenter-dark .pagination-previous,html.theme--documenter-dark .pagination-next,html.theme--documenter-dark .pagination-link{border-color:#5e6d6f;color:#1abc9c;min-width:2.25em}html.theme--documenter-dark .pagination-previous:hover,html.theme--documenter-dark .pagination-next:hover,html.theme--documenter-dark .pagination-link:hover{border-color:#8c9b9d;color:#1dd2af}html.theme--documenter-dark .pagination-previous:focus,html.theme--documenter-dark .pagination-next:focus,html.theme--documenter-dark .pagination-link:focus{border-color:#8c9b9d}html.theme--documenter-dark .pagination-previous:active,html.theme--documenter-dark .pagination-next:active,html.theme--documenter-dark .pagination-link:active{box-shadow:inset 0 1px 2px rgba(10,10,10,0.2)}html.theme--documenter-dark .pagination-previous[disabled],html.theme--documenter-dark .pagination-next[disabled],html.theme--documenter-dark .pagination-link[disabled]{background-color:#dbdee0;border-color:#dbdee0;box-shadow:none;color:#5e6d6f;opacity:0.5}html.theme--documenter-dark .pagination-previous,html.theme--documenter-dark .pagination-next{padding-left:0.75em;padding-right:0.75em;white-space:nowrap}html.theme--documenter-dark .pagination-link.is-current{background-color:#1abc9c;border-color:#1abc9c;color:#fff}html.theme--documenter-dark .pagination-ellipsis{color:#8c9b9d;pointer-events:none}html.theme--documenter-dark .pagination-list{flex-wrap:wrap}@media screen and (max-width: 768px){html.theme--documenter-dark .pagination{flex-wrap:wrap}html.theme--documenter-dark .pagination-previous,html.theme--documenter-dark .pagination-next{flex-grow:1;flex-shrink:1}html.theme--documenter-dark .pagination-list li{flex-grow:1;flex-shrink:1}}@media screen and (min-width: 769px),print{html.theme--documenter-dark .pagination-list{flex-grow:1;flex-shrink:1;justify-content:flex-start;order:1}html.theme--documenter-dark .pagination-previous{order:2}html.theme--documenter-dark .pagination-next{order:3}html.theme--documenter-dark .pagination{justify-content:space-between}html.theme--documenter-dark .pagination.is-centered .pagination-previous{order:1}html.theme--documenter-dark .pagination.is-centered .pagination-list{justify-content:center;order:2}html.theme--documenter-dark .pagination.is-centered .pagination-next{order:3}html.theme--documenter-dark .pagination.is-right .pagination-previous{order:1}html.theme--documenter-dark .pagination.is-right .pagination-next{order:2}html.theme--documenter-dark .pagination.is-right .pagination-list{justify-content:flex-end;order:3}}html.theme--documenter-dark .panel{font-size:15px}html.theme--documenter-dark .panel:not(:last-child){margin-bottom:1.5rem}html.theme--documenter-dark .panel-heading,html.theme--documenter-dark .panel-tabs,html.theme--documenter-dark .panel-block{border-bottom:1px solid #5e6d6f;border-left:1px solid #5e6d6f;border-right:1px solid #5e6d6f}html.theme--documenter-dark .panel-heading:first-child,html.theme--documenter-dark .panel-tabs:first-child,html.theme--documenter-dark .panel-block:first-child{border-top:1px solid #5e6d6f}html.theme--documenter-dark .panel-heading{background-color:#282f2f;border-radius:.4em .4em 0 0;color:#f2f2f2;font-size:1.25em;font-weight:300;line-height:1.25;padding:0.5em 0.75em}html.theme--documenter-dark .panel-tabs{align-items:flex-end;display:flex;font-size:.875em;justify-content:center}html.theme--documenter-dark .panel-tabs a{border-bottom:1px solid #5e6d6f;margin-bottom:-1px;padding:0.5em}html.theme--documenter-dark .panel-tabs a.is-active{border-bottom-color:#343c3d;color:#17a689}html.theme--documenter-dark .panel-list a{color:#fff}html.theme--documenter-dark .panel-list a:hover{color:#1abc9c}html.theme--documenter-dark .panel-block{align-items:center;color:#f2f2f2;display:flex;justify-content:flex-start;padding:0.5em 0.75em}html.theme--documenter-dark .panel-block input[type="checkbox"]{margin-right:0.75em}html.theme--documenter-dark .panel-block>.control{flex-grow:1;flex-shrink:1;width:100%}html.theme--documenter-dark .panel-block.is-wrapped{flex-wrap:wrap}html.theme--documenter-dark .panel-block.is-active{border-left-color:#1abc9c;color:#17a689}html.theme--documenter-dark .panel-block.is-active .panel-icon{color:#1abc9c}html.theme--documenter-dark a.panel-block,html.theme--documenter-dark label.panel-block{cursor:pointer}html.theme--documenter-dark a.panel-block:hover,html.theme--documenter-dark label.panel-block:hover{background-color:#282f2f}html.theme--documenter-dark .panel-icon{display:inline-block;font-size:14px;height:1em;line-height:1em;text-align:center;vertical-align:top;width:1em;color:#fff;margin-right:0.75em}html.theme--documenter-dark .panel-icon .fa{font-size:inherit;line-height:inherit}html.theme--documenter-dark .tabs{-webkit-overflow-scrolling:touch;align-items:stretch;display:flex;font-size:15px;justify-content:space-between;overflow:hidden;overflow-x:auto;white-space:nowrap}html.theme--documenter-dark .tabs a{align-items:center;border-bottom-color:#5e6d6f;border-bottom-style:solid;border-bottom-width:1px;color:#fff;display:flex;justify-content:center;margin-bottom:-1px;padding:0.5em 1em;vertical-align:top}html.theme--documenter-dark .tabs a:hover{border-bottom-color:#f2f2f2;color:#f2f2f2}html.theme--documenter-dark .tabs li{display:block}html.theme--documenter-dark .tabs li.is-active a{border-bottom-color:#1abc9c;color:#1abc9c}html.theme--documenter-dark .tabs ul{align-items:center;border-bottom-color:#5e6d6f;border-bottom-style:solid;border-bottom-width:1px;display:flex;flex-grow:1;flex-shrink:0;justify-content:flex-start}html.theme--documenter-dark .tabs ul.is-left{padding-right:0.75em}html.theme--documenter-dark .tabs ul.is-center{flex:none;justify-content:center;padding-left:0.75em;padding-right:0.75em}html.theme--documenter-dark .tabs ul.is-right{justify-content:flex-end;padding-left:0.75em}html.theme--documenter-dark .tabs .icon:first-child{margin-right:0.5em}html.theme--documenter-dark .tabs .icon:last-child{margin-left:0.5em}html.theme--documenter-dark .tabs.is-centered ul{justify-content:center}html.theme--documenter-dark .tabs.is-right ul{justify-content:flex-end}html.theme--documenter-dark .tabs.is-boxed a{border:1px solid transparent;border-radius:.4em .4em 0 0}html.theme--documenter-dark .tabs.is-boxed a:hover{background-color:#282f2f;border-bottom-color:#5e6d6f}html.theme--documenter-dark .tabs.is-boxed li.is-active a{background-color:#fff;border-color:#5e6d6f;border-bottom-color:rgba(0,0,0,0) !important}html.theme--documenter-dark .tabs.is-fullwidth li{flex-grow:1;flex-shrink:0}html.theme--documenter-dark .tabs.is-toggle a{border-color:#5e6d6f;border-style:solid;border-width:1px;margin-bottom:0;position:relative}html.theme--documenter-dark .tabs.is-toggle a:hover{background-color:#282f2f;border-color:#8c9b9d;z-index:2}html.theme--documenter-dark .tabs.is-toggle li+li{margin-left:-1px}html.theme--documenter-dark .tabs.is-toggle li:first-child a{border-radius:.4em 0 0 .4em}html.theme--documenter-dark .tabs.is-toggle li:last-child a{border-radius:0 .4em .4em 0}html.theme--documenter-dark .tabs.is-toggle li.is-active a{background-color:#1abc9c;border-color:#1abc9c;color:#fff;z-index:1}html.theme--documenter-dark .tabs.is-toggle ul{border-bottom:none}html.theme--documenter-dark .tabs.is-toggle.is-toggle-rounded li:first-child a{border-bottom-left-radius:290486px;border-top-left-radius:290486px;padding-left:1.25em}html.theme--documenter-dark .tabs.is-toggle.is-toggle-rounded li:last-child a{border-bottom-right-radius:290486px;border-top-right-radius:290486px;padding-right:1.25em}html.theme--documenter-dark .tabs.is-small,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.tabs{font-size:.85em}html.theme--documenter-dark .tabs.is-medium{font-size:1.25rem}html.theme--documenter-dark .tabs.is-large{font-size:1.5rem}html.theme--documenter-dark .column{display:block;flex-basis:0;flex-grow:1;flex-shrink:1;padding:.75rem}.columns.is-mobile>html.theme--documenter-dark .column.is-narrow{flex:none}.columns.is-mobile>html.theme--documenter-dark .column.is-full{flex:none;width:100%}.columns.is-mobile>html.theme--documenter-dark .column.is-three-quarters{flex:none;width:75%}.columns.is-mobile>html.theme--documenter-dark .column.is-two-thirds{flex:none;width:66.6666%}.columns.is-mobile>html.theme--documenter-dark .column.is-half{flex:none;width:50%}.columns.is-mobile>html.theme--documenter-dark .column.is-one-third{flex:none;width:33.3333%}.columns.is-mobile>html.theme--documenter-dark .column.is-one-quarter{flex:none;width:25%}.columns.is-mobile>html.theme--documenter-dark .column.is-one-fifth{flex:none;width:20%}.columns.is-mobile>html.theme--documenter-dark .column.is-two-fifths{flex:none;width:40%}.columns.is-mobile>html.theme--documenter-dark .column.is-three-fifths{flex:none;width:60%}.columns.is-mobile>html.theme--documenter-dark .column.is-four-fifths{flex:none;width:80%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-three-quarters{margin-left:75%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-two-thirds{margin-left:66.6666%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-half{margin-left:50%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-one-third{margin-left:33.3333%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-one-quarter{margin-left:25%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-one-fifth{margin-left:20%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-two-fifths{margin-left:40%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-three-fifths{margin-left:60%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-four-fifths{margin-left:80%}.columns.is-mobile>html.theme--documenter-dark .column.is-0{flex:none;width:0%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-0{margin-left:0%}.columns.is-mobile>html.theme--documenter-dark .column.is-1{flex:none;width:8.3333333333%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-1{margin-left:8.3333333333%}.columns.is-mobile>html.theme--documenter-dark .column.is-2{flex:none;width:16.6666666667%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-2{margin-left:16.6666666667%}.columns.is-mobile>html.theme--documenter-dark .column.is-3{flex:none;width:25%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-3{margin-left:25%}.columns.is-mobile>html.theme--documenter-dark .column.is-4{flex:none;width:33.3333333333%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-4{margin-left:33.3333333333%}.columns.is-mobile>html.theme--documenter-dark .column.is-5{flex:none;width:41.6666666667%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-5{margin-left:41.6666666667%}.columns.is-mobile>html.theme--documenter-dark .column.is-6{flex:none;width:50%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-6{margin-left:50%}.columns.is-mobile>html.theme--documenter-dark .column.is-7{flex:none;width:58.3333333333%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-7{margin-left:58.3333333333%}.columns.is-mobile>html.theme--documenter-dark .column.is-8{flex:none;width:66.6666666667%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-8{margin-left:66.6666666667%}.columns.is-mobile>html.theme--documenter-dark .column.is-9{flex:none;width:75%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-9{margin-left:75%}.columns.is-mobile>html.theme--documenter-dark .column.is-10{flex:none;width:83.3333333333%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-10{margin-left:83.3333333333%}.columns.is-mobile>html.theme--documenter-dark .column.is-11{flex:none;width:91.6666666667%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-11{margin-left:91.6666666667%}.columns.is-mobile>html.theme--documenter-dark .column.is-12{flex:none;width:100%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-12{margin-left:100%}@media screen and (max-width: 768px){html.theme--documenter-dark .column.is-narrow-mobile{flex:none}html.theme--documenter-dark .column.is-full-mobile{flex:none;width:100%}html.theme--documenter-dark .column.is-three-quarters-mobile{flex:none;width:75%}html.theme--documenter-dark .column.is-two-thirds-mobile{flex:none;width:66.6666%}html.theme--documenter-dark .column.is-half-mobile{flex:none;width:50%}html.theme--documenter-dark .column.is-one-third-mobile{flex:none;width:33.3333%}html.theme--documenter-dark .column.is-one-quarter-mobile{flex:none;width:25%}html.theme--documenter-dark .column.is-one-fifth-mobile{flex:none;width:20%}html.theme--documenter-dark .column.is-two-fifths-mobile{flex:none;width:40%}html.theme--documenter-dark .column.is-three-fifths-mobile{flex:none;width:60%}html.theme--documenter-dark .column.is-four-fifths-mobile{flex:none;width:80%}html.theme--documenter-dark .column.is-offset-three-quarters-mobile{margin-left:75%}html.theme--documenter-dark .column.is-offset-two-thirds-mobile{margin-left:66.6666%}html.theme--documenter-dark .column.is-offset-half-mobile{margin-left:50%}html.theme--documenter-dark .column.is-offset-one-third-mobile{margin-left:33.3333%}html.theme--documenter-dark .column.is-offset-one-quarter-mobile{margin-left:25%}html.theme--documenter-dark .column.is-offset-one-fifth-mobile{margin-left:20%}html.theme--documenter-dark .column.is-offset-two-fifths-mobile{margin-left:40%}html.theme--documenter-dark .column.is-offset-three-fifths-mobile{margin-left:60%}html.theme--documenter-dark .column.is-offset-four-fifths-mobile{margin-left:80%}html.theme--documenter-dark .column.is-0-mobile{flex:none;width:0%}html.theme--documenter-dark .column.is-offset-0-mobile{margin-left:0%}html.theme--documenter-dark .column.is-1-mobile{flex:none;width:8.3333333333%}html.theme--documenter-dark .column.is-offset-1-mobile{margin-left:8.3333333333%}html.theme--documenter-dark .column.is-2-mobile{flex:none;width:16.6666666667%}html.theme--documenter-dark .column.is-offset-2-mobile{margin-left:16.6666666667%}html.theme--documenter-dark .column.is-3-mobile{flex:none;width:25%}html.theme--documenter-dark .column.is-offset-3-mobile{margin-left:25%}html.theme--documenter-dark .column.is-4-mobile{flex:none;width:33.3333333333%}html.theme--documenter-dark .column.is-offset-4-mobile{margin-left:33.3333333333%}html.theme--documenter-dark .column.is-5-mobile{flex:none;width:41.6666666667%}html.theme--documenter-dark .column.is-offset-5-mobile{margin-left:41.6666666667%}html.theme--documenter-dark .column.is-6-mobile{flex:none;width:50%}html.theme--documenter-dark .column.is-offset-6-mobile{margin-left:50%}html.theme--documenter-dark .column.is-7-mobile{flex:none;width:58.3333333333%}html.theme--documenter-dark .column.is-offset-7-mobile{margin-left:58.3333333333%}html.theme--documenter-dark .column.is-8-mobile{flex:none;width:66.6666666667%}html.theme--documenter-dark .column.is-offset-8-mobile{margin-left:66.6666666667%}html.theme--documenter-dark .column.is-9-mobile{flex:none;width:75%}html.theme--documenter-dark .column.is-offset-9-mobile{margin-left:75%}html.theme--documenter-dark .column.is-10-mobile{flex:none;width:83.3333333333%}html.theme--documenter-dark .column.is-offset-10-mobile{margin-left:83.3333333333%}html.theme--documenter-dark .column.is-11-mobile{flex:none;width:91.6666666667%}html.theme--documenter-dark .column.is-offset-11-mobile{margin-left:91.6666666667%}html.theme--documenter-dark .column.is-12-mobile{flex:none;width:100%}html.theme--documenter-dark .column.is-offset-12-mobile{margin-left:100%}}@media screen and (min-width: 769px),print{html.theme--documenter-dark .column.is-narrow,html.theme--documenter-dark .column.is-narrow-tablet{flex:none}html.theme--documenter-dark .column.is-full,html.theme--documenter-dark .column.is-full-tablet{flex:none;width:100%}html.theme--documenter-dark .column.is-three-quarters,html.theme--documenter-dark .column.is-three-quarters-tablet{flex:none;width:75%}html.theme--documenter-dark .column.is-two-thirds,html.theme--documenter-dark .column.is-two-thirds-tablet{flex:none;width:66.6666%}html.theme--documenter-dark .column.is-half,html.theme--documenter-dark .column.is-half-tablet{flex:none;width:50%}html.theme--documenter-dark .column.is-one-third,html.theme--documenter-dark .column.is-one-third-tablet{flex:none;width:33.3333%}html.theme--documenter-dark .column.is-one-quarter,html.theme--documenter-dark .column.is-one-quarter-tablet{flex:none;width:25%}html.theme--documenter-dark .column.is-one-fifth,html.theme--documenter-dark .column.is-one-fifth-tablet{flex:none;width:20%}html.theme--documenter-dark .column.is-two-fifths,html.theme--documenter-dark .column.is-two-fifths-tablet{flex:none;width:40%}html.theme--documenter-dark .column.is-three-fifths,html.theme--documenter-dark .column.is-three-fifths-tablet{flex:none;width:60%}html.theme--documenter-dark .column.is-four-fifths,html.theme--documenter-dark .column.is-four-fifths-tablet{flex:none;width:80%}html.theme--documenter-dark .column.is-offset-three-quarters,html.theme--documenter-dark .column.is-offset-three-quarters-tablet{margin-left:75%}html.theme--documenter-dark .column.is-offset-two-thirds,html.theme--documenter-dark .column.is-offset-two-thirds-tablet{margin-left:66.6666%}html.theme--documenter-dark .column.is-offset-half,html.theme--documenter-dark .column.is-offset-half-tablet{margin-left:50%}html.theme--documenter-dark .column.is-offset-one-third,html.theme--documenter-dark .column.is-offset-one-third-tablet{margin-left:33.3333%}html.theme--documenter-dark .column.is-offset-one-quarter,html.theme--documenter-dark .column.is-offset-one-quarter-tablet{margin-left:25%}html.theme--documenter-dark .column.is-offset-one-fifth,html.theme--documenter-dark .column.is-offset-one-fifth-tablet{margin-left:20%}html.theme--documenter-dark .column.is-offset-two-fifths,html.theme--documenter-dark .column.is-offset-two-fifths-tablet{margin-left:40%}html.theme--documenter-dark .column.is-offset-three-fifths,html.theme--documenter-dark .column.is-offset-three-fifths-tablet{margin-left:60%}html.theme--documenter-dark .column.is-offset-four-fifths,html.theme--documenter-dark .column.is-offset-four-fifths-tablet{margin-left:80%}html.theme--documenter-dark .column.is-0,html.theme--documenter-dark .column.is-0-tablet{flex:none;width:0%}html.theme--documenter-dark .column.is-offset-0,html.theme--documenter-dark .column.is-offset-0-tablet{margin-left:0%}html.theme--documenter-dark .column.is-1,html.theme--documenter-dark .column.is-1-tablet{flex:none;width:8.3333333333%}html.theme--documenter-dark .column.is-offset-1,html.theme--documenter-dark .column.is-offset-1-tablet{margin-left:8.3333333333%}html.theme--documenter-dark .column.is-2,html.theme--documenter-dark .column.is-2-tablet{flex:none;width:16.6666666667%}html.theme--documenter-dark .column.is-offset-2,html.theme--documenter-dark .column.is-offset-2-tablet{margin-left:16.6666666667%}html.theme--documenter-dark .column.is-3,html.theme--documenter-dark .column.is-3-tablet{flex:none;width:25%}html.theme--documenter-dark .column.is-offset-3,html.theme--documenter-dark .column.is-offset-3-tablet{margin-left:25%}html.theme--documenter-dark .column.is-4,html.theme--documenter-dark .column.is-4-tablet{flex:none;width:33.3333333333%}html.theme--documenter-dark .column.is-offset-4,html.theme--documenter-dark .column.is-offset-4-tablet{margin-left:33.3333333333%}html.theme--documenter-dark .column.is-5,html.theme--documenter-dark .column.is-5-tablet{flex:none;width:41.6666666667%}html.theme--documenter-dark .column.is-offset-5,html.theme--documenter-dark .column.is-offset-5-tablet{margin-left:41.6666666667%}html.theme--documenter-dark .column.is-6,html.theme--documenter-dark .column.is-6-tablet{flex:none;width:50%}html.theme--documenter-dark .column.is-offset-6,html.theme--documenter-dark .column.is-offset-6-tablet{margin-left:50%}html.theme--documenter-dark .column.is-7,html.theme--documenter-dark .column.is-7-tablet{flex:none;width:58.3333333333%}html.theme--documenter-dark .column.is-offset-7,html.theme--documenter-dark .column.is-offset-7-tablet{margin-left:58.3333333333%}html.theme--documenter-dark .column.is-8,html.theme--documenter-dark .column.is-8-tablet{flex:none;width:66.6666666667%}html.theme--documenter-dark .column.is-offset-8,html.theme--documenter-dark .column.is-offset-8-tablet{margin-left:66.6666666667%}html.theme--documenter-dark .column.is-9,html.theme--documenter-dark .column.is-9-tablet{flex:none;width:75%}html.theme--documenter-dark .column.is-offset-9,html.theme--documenter-dark .column.is-offset-9-tablet{margin-left:75%}html.theme--documenter-dark .column.is-10,html.theme--documenter-dark .column.is-10-tablet{flex:none;width:83.3333333333%}html.theme--documenter-dark .column.is-offset-10,html.theme--documenter-dark .column.is-offset-10-tablet{margin-left:83.3333333333%}html.theme--documenter-dark .column.is-11,html.theme--documenter-dark .column.is-11-tablet{flex:none;width:91.6666666667%}html.theme--documenter-dark .column.is-offset-11,html.theme--documenter-dark .column.is-offset-11-tablet{margin-left:91.6666666667%}html.theme--documenter-dark .column.is-12,html.theme--documenter-dark .column.is-12-tablet{flex:none;width:100%}html.theme--documenter-dark .column.is-offset-12,html.theme--documenter-dark .column.is-offset-12-tablet{margin-left:100%}}@media screen and (max-width: 1055px){html.theme--documenter-dark .column.is-narrow-touch{flex:none}html.theme--documenter-dark .column.is-full-touch{flex:none;width:100%}html.theme--documenter-dark .column.is-three-quarters-touch{flex:none;width:75%}html.theme--documenter-dark .column.is-two-thirds-touch{flex:none;width:66.6666%}html.theme--documenter-dark .column.is-half-touch{flex:none;width:50%}html.theme--documenter-dark .column.is-one-third-touch{flex:none;width:33.3333%}html.theme--documenter-dark .column.is-one-quarter-touch{flex:none;width:25%}html.theme--documenter-dark .column.is-one-fifth-touch{flex:none;width:20%}html.theme--documenter-dark .column.is-two-fifths-touch{flex:none;width:40%}html.theme--documenter-dark .column.is-three-fifths-touch{flex:none;width:60%}html.theme--documenter-dark .column.is-four-fifths-touch{flex:none;width:80%}html.theme--documenter-dark .column.is-offset-three-quarters-touch{margin-left:75%}html.theme--documenter-dark .column.is-offset-two-thirds-touch{margin-left:66.6666%}html.theme--documenter-dark .column.is-offset-half-touch{margin-left:50%}html.theme--documenter-dark .column.is-offset-one-third-touch{margin-left:33.3333%}html.theme--documenter-dark .column.is-offset-one-quarter-touch{margin-left:25%}html.theme--documenter-dark .column.is-offset-one-fifth-touch{margin-left:20%}html.theme--documenter-dark .column.is-offset-two-fifths-touch{margin-left:40%}html.theme--documenter-dark .column.is-offset-three-fifths-touch{margin-left:60%}html.theme--documenter-dark .column.is-offset-four-fifths-touch{margin-left:80%}html.theme--documenter-dark .column.is-0-touch{flex:none;width:0%}html.theme--documenter-dark .column.is-offset-0-touch{margin-left:0%}html.theme--documenter-dark .column.is-1-touch{flex:none;width:8.3333333333%}html.theme--documenter-dark .column.is-offset-1-touch{margin-left:8.3333333333%}html.theme--documenter-dark .column.is-2-touch{flex:none;width:16.6666666667%}html.theme--documenter-dark .column.is-offset-2-touch{margin-left:16.6666666667%}html.theme--documenter-dark .column.is-3-touch{flex:none;width:25%}html.theme--documenter-dark .column.is-offset-3-touch{margin-left:25%}html.theme--documenter-dark .column.is-4-touch{flex:none;width:33.3333333333%}html.theme--documenter-dark .column.is-offset-4-touch{margin-left:33.3333333333%}html.theme--documenter-dark .column.is-5-touch{flex:none;width:41.6666666667%}html.theme--documenter-dark .column.is-offset-5-touch{margin-left:41.6666666667%}html.theme--documenter-dark .column.is-6-touch{flex:none;width:50%}html.theme--documenter-dark .column.is-offset-6-touch{margin-left:50%}html.theme--documenter-dark .column.is-7-touch{flex:none;width:58.3333333333%}html.theme--documenter-dark .column.is-offset-7-touch{margin-left:58.3333333333%}html.theme--documenter-dark .column.is-8-touch{flex:none;width:66.6666666667%}html.theme--documenter-dark .column.is-offset-8-touch{margin-left:66.6666666667%}html.theme--documenter-dark .column.is-9-touch{flex:none;width:75%}html.theme--documenter-dark .column.is-offset-9-touch{margin-left:75%}html.theme--documenter-dark .column.is-10-touch{flex:none;width:83.3333333333%}html.theme--documenter-dark .column.is-offset-10-touch{margin-left:83.3333333333%}html.theme--documenter-dark .column.is-11-touch{flex:none;width:91.6666666667%}html.theme--documenter-dark .column.is-offset-11-touch{margin-left:91.6666666667%}html.theme--documenter-dark .column.is-12-touch{flex:none;width:100%}html.theme--documenter-dark .column.is-offset-12-touch{margin-left:100%}}@media screen and (min-width: 1056px){html.theme--documenter-dark .column.is-narrow-desktop{flex:none}html.theme--documenter-dark .column.is-full-desktop{flex:none;width:100%}html.theme--documenter-dark .column.is-three-quarters-desktop{flex:none;width:75%}html.theme--documenter-dark .column.is-two-thirds-desktop{flex:none;width:66.6666%}html.theme--documenter-dark .column.is-half-desktop{flex:none;width:50%}html.theme--documenter-dark .column.is-one-third-desktop{flex:none;width:33.3333%}html.theme--documenter-dark .column.is-one-quarter-desktop{flex:none;width:25%}html.theme--documenter-dark .column.is-one-fifth-desktop{flex:none;width:20%}html.theme--documenter-dark .column.is-two-fifths-desktop{flex:none;width:40%}html.theme--documenter-dark .column.is-three-fifths-desktop{flex:none;width:60%}html.theme--documenter-dark .column.is-four-fifths-desktop{flex:none;width:80%}html.theme--documenter-dark .column.is-offset-three-quarters-desktop{margin-left:75%}html.theme--documenter-dark .column.is-offset-two-thirds-desktop{margin-left:66.6666%}html.theme--documenter-dark .column.is-offset-half-desktop{margin-left:50%}html.theme--documenter-dark .column.is-offset-one-third-desktop{margin-left:33.3333%}html.theme--documenter-dark .column.is-offset-one-quarter-desktop{margin-left:25%}html.theme--documenter-dark .column.is-offset-one-fifth-desktop{margin-left:20%}html.theme--documenter-dark .column.is-offset-two-fifths-desktop{margin-left:40%}html.theme--documenter-dark .column.is-offset-three-fifths-desktop{margin-left:60%}html.theme--documenter-dark .column.is-offset-four-fifths-desktop{margin-left:80%}html.theme--documenter-dark .column.is-0-desktop{flex:none;width:0%}html.theme--documenter-dark .column.is-offset-0-desktop{margin-left:0%}html.theme--documenter-dark .column.is-1-desktop{flex:none;width:8.3333333333%}html.theme--documenter-dark .column.is-offset-1-desktop{margin-left:8.3333333333%}html.theme--documenter-dark .column.is-2-desktop{flex:none;width:16.6666666667%}html.theme--documenter-dark .column.is-offset-2-desktop{margin-left:16.6666666667%}html.theme--documenter-dark .column.is-3-desktop{flex:none;width:25%}html.theme--documenter-dark .column.is-offset-3-desktop{margin-left:25%}html.theme--documenter-dark .column.is-4-desktop{flex:none;width:33.3333333333%}html.theme--documenter-dark .column.is-offset-4-desktop{margin-left:33.3333333333%}html.theme--documenter-dark .column.is-5-desktop{flex:none;width:41.6666666667%}html.theme--documenter-dark .column.is-offset-5-desktop{margin-left:41.6666666667%}html.theme--documenter-dark .column.is-6-desktop{flex:none;width:50%}html.theme--documenter-dark .column.is-offset-6-desktop{margin-left:50%}html.theme--documenter-dark .column.is-7-desktop{flex:none;width:58.3333333333%}html.theme--documenter-dark .column.is-offset-7-desktop{margin-left:58.3333333333%}html.theme--documenter-dark .column.is-8-desktop{flex:none;width:66.6666666667%}html.theme--documenter-dark .column.is-offset-8-desktop{margin-left:66.6666666667%}html.theme--documenter-dark .column.is-9-desktop{flex:none;width:75%}html.theme--documenter-dark .column.is-offset-9-desktop{margin-left:75%}html.theme--documenter-dark .column.is-10-desktop{flex:none;width:83.3333333333%}html.theme--documenter-dark .column.is-offset-10-desktop{margin-left:83.3333333333%}html.theme--documenter-dark .column.is-11-desktop{flex:none;width:91.6666666667%}html.theme--documenter-dark .column.is-offset-11-desktop{margin-left:91.6666666667%}html.theme--documenter-dark .column.is-12-desktop{flex:none;width:100%}html.theme--documenter-dark .column.is-offset-12-desktop{margin-left:100%}}@media screen and (min-width: 1216px){html.theme--documenter-dark .column.is-narrow-widescreen{flex:none}html.theme--documenter-dark .column.is-full-widescreen{flex:none;width:100%}html.theme--documenter-dark .column.is-three-quarters-widescreen{flex:none;width:75%}html.theme--documenter-dark .column.is-two-thirds-widescreen{flex:none;width:66.6666%}html.theme--documenter-dark .column.is-half-widescreen{flex:none;width:50%}html.theme--documenter-dark .column.is-one-third-widescreen{flex:none;width:33.3333%}html.theme--documenter-dark .column.is-one-quarter-widescreen{flex:none;width:25%}html.theme--documenter-dark .column.is-one-fifth-widescreen{flex:none;width:20%}html.theme--documenter-dark .column.is-two-fifths-widescreen{flex:none;width:40%}html.theme--documenter-dark .column.is-three-fifths-widescreen{flex:none;width:60%}html.theme--documenter-dark .column.is-four-fifths-widescreen{flex:none;width:80%}html.theme--documenter-dark .column.is-offset-three-quarters-widescreen{margin-left:75%}html.theme--documenter-dark .column.is-offset-two-thirds-widescreen{margin-left:66.6666%}html.theme--documenter-dark .column.is-offset-half-widescreen{margin-left:50%}html.theme--documenter-dark .column.is-offset-one-third-widescreen{margin-left:33.3333%}html.theme--documenter-dark .column.is-offset-one-quarter-widescreen{margin-left:25%}html.theme--documenter-dark .column.is-offset-one-fifth-widescreen{margin-left:20%}html.theme--documenter-dark .column.is-offset-two-fifths-widescreen{margin-left:40%}html.theme--documenter-dark .column.is-offset-three-fifths-widescreen{margin-left:60%}html.theme--documenter-dark .column.is-offset-four-fifths-widescreen{margin-left:80%}html.theme--documenter-dark .column.is-0-widescreen{flex:none;width:0%}html.theme--documenter-dark .column.is-offset-0-widescreen{margin-left:0%}html.theme--documenter-dark .column.is-1-widescreen{flex:none;width:8.3333333333%}html.theme--documenter-dark .column.is-offset-1-widescreen{margin-left:8.3333333333%}html.theme--documenter-dark .column.is-2-widescreen{flex:none;width:16.6666666667%}html.theme--documenter-dark .column.is-offset-2-widescreen{margin-left:16.6666666667%}html.theme--documenter-dark .column.is-3-widescreen{flex:none;width:25%}html.theme--documenter-dark .column.is-offset-3-widescreen{margin-left:25%}html.theme--documenter-dark .column.is-4-widescreen{flex:none;width:33.3333333333%}html.theme--documenter-dark .column.is-offset-4-widescreen{margin-left:33.3333333333%}html.theme--documenter-dark .column.is-5-widescreen{flex:none;width:41.6666666667%}html.theme--documenter-dark .column.is-offset-5-widescreen{margin-left:41.6666666667%}html.theme--documenter-dark .column.is-6-widescreen{flex:none;width:50%}html.theme--documenter-dark .column.is-offset-6-widescreen{margin-left:50%}html.theme--documenter-dark .column.is-7-widescreen{flex:none;width:58.3333333333%}html.theme--documenter-dark .column.is-offset-7-widescreen{margin-left:58.3333333333%}html.theme--documenter-dark .column.is-8-widescreen{flex:none;width:66.6666666667%}html.theme--documenter-dark .column.is-offset-8-widescreen{margin-left:66.6666666667%}html.theme--documenter-dark .column.is-9-widescreen{flex:none;width:75%}html.theme--documenter-dark .column.is-offset-9-widescreen{margin-left:75%}html.theme--documenter-dark .column.is-10-widescreen{flex:none;width:83.3333333333%}html.theme--documenter-dark .column.is-offset-10-widescreen{margin-left:83.3333333333%}html.theme--documenter-dark .column.is-11-widescreen{flex:none;width:91.6666666667%}html.theme--documenter-dark .column.is-offset-11-widescreen{margin-left:91.6666666667%}html.theme--documenter-dark .column.is-12-widescreen{flex:none;width:100%}html.theme--documenter-dark .column.is-offset-12-widescreen{margin-left:100%}}@media screen and (min-width: 1408px){html.theme--documenter-dark .column.is-narrow-fullhd{flex:none}html.theme--documenter-dark .column.is-full-fullhd{flex:none;width:100%}html.theme--documenter-dark .column.is-three-quarters-fullhd{flex:none;width:75%}html.theme--documenter-dark .column.is-two-thirds-fullhd{flex:none;width:66.6666%}html.theme--documenter-dark .column.is-half-fullhd{flex:none;width:50%}html.theme--documenter-dark .column.is-one-third-fullhd{flex:none;width:33.3333%}html.theme--documenter-dark .column.is-one-quarter-fullhd{flex:none;width:25%}html.theme--documenter-dark .column.is-one-fifth-fullhd{flex:none;width:20%}html.theme--documenter-dark .column.is-two-fifths-fullhd{flex:none;width:40%}html.theme--documenter-dark .column.is-three-fifths-fullhd{flex:none;width:60%}html.theme--documenter-dark .column.is-four-fifths-fullhd{flex:none;width:80%}html.theme--documenter-dark .column.is-offset-three-quarters-fullhd{margin-left:75%}html.theme--documenter-dark .column.is-offset-two-thirds-fullhd{margin-left:66.6666%}html.theme--documenter-dark .column.is-offset-half-fullhd{margin-left:50%}html.theme--documenter-dark .column.is-offset-one-third-fullhd{margin-left:33.3333%}html.theme--documenter-dark .column.is-offset-one-quarter-fullhd{margin-left:25%}html.theme--documenter-dark .column.is-offset-one-fifth-fullhd{margin-left:20%}html.theme--documenter-dark .column.is-offset-two-fifths-fullhd{margin-left:40%}html.theme--documenter-dark .column.is-offset-three-fifths-fullhd{margin-left:60%}html.theme--documenter-dark .column.is-offset-four-fifths-fullhd{margin-left:80%}html.theme--documenter-dark .column.is-0-fullhd{flex:none;width:0%}html.theme--documenter-dark .column.is-offset-0-fullhd{margin-left:0%}html.theme--documenter-dark .column.is-1-fullhd{flex:none;width:8.3333333333%}html.theme--documenter-dark .column.is-offset-1-fullhd{margin-left:8.3333333333%}html.theme--documenter-dark .column.is-2-fullhd{flex:none;width:16.6666666667%}html.theme--documenter-dark .column.is-offset-2-fullhd{margin-left:16.6666666667%}html.theme--documenter-dark .column.is-3-fullhd{flex:none;width:25%}html.theme--documenter-dark .column.is-offset-3-fullhd{margin-left:25%}html.theme--documenter-dark .column.is-4-fullhd{flex:none;width:33.3333333333%}html.theme--documenter-dark .column.is-offset-4-fullhd{margin-left:33.3333333333%}html.theme--documenter-dark .column.is-5-fullhd{flex:none;width:41.6666666667%}html.theme--documenter-dark .column.is-offset-5-fullhd{margin-left:41.6666666667%}html.theme--documenter-dark .column.is-6-fullhd{flex:none;width:50%}html.theme--documenter-dark .column.is-offset-6-fullhd{margin-left:50%}html.theme--documenter-dark .column.is-7-fullhd{flex:none;width:58.3333333333%}html.theme--documenter-dark .column.is-offset-7-fullhd{margin-left:58.3333333333%}html.theme--documenter-dark .column.is-8-fullhd{flex:none;width:66.6666666667%}html.theme--documenter-dark .column.is-offset-8-fullhd{margin-left:66.6666666667%}html.theme--documenter-dark .column.is-9-fullhd{flex:none;width:75%}html.theme--documenter-dark .column.is-offset-9-fullhd{margin-left:75%}html.theme--documenter-dark .column.is-10-fullhd{flex:none;width:83.3333333333%}html.theme--documenter-dark .column.is-offset-10-fullhd{margin-left:83.3333333333%}html.theme--documenter-dark .column.is-11-fullhd{flex:none;width:91.6666666667%}html.theme--documenter-dark .column.is-offset-11-fullhd{margin-left:91.6666666667%}html.theme--documenter-dark .column.is-12-fullhd{flex:none;width:100%}html.theme--documenter-dark .column.is-offset-12-fullhd{margin-left:100%}}html.theme--documenter-dark .columns{margin-left:-.75rem;margin-right:-.75rem;margin-top:-.75rem}html.theme--documenter-dark .columns:last-child{margin-bottom:-.75rem}html.theme--documenter-dark .columns:not(:last-child){margin-bottom:calc(1.5rem - .75rem)}html.theme--documenter-dark .columns.is-centered{justify-content:center}html.theme--documenter-dark .columns.is-gapless{margin-left:0;margin-right:0;margin-top:0}html.theme--documenter-dark .columns.is-gapless>.column{margin:0;padding:0 !important}html.theme--documenter-dark .columns.is-gapless:not(:last-child){margin-bottom:1.5rem}html.theme--documenter-dark .columns.is-gapless:last-child{margin-bottom:0}html.theme--documenter-dark .columns.is-mobile{display:flex}html.theme--documenter-dark .columns.is-multiline{flex-wrap:wrap}html.theme--documenter-dark .columns.is-vcentered{align-items:center}@media screen and (min-width: 769px),print{html.theme--documenter-dark .columns:not(.is-desktop){display:flex}}@media screen and (min-width: 1056px){html.theme--documenter-dark .columns.is-desktop{display:flex}}html.theme--documenter-dark .columns.is-variable{--columnGap: 0.75rem;margin-left:calc(-1 * var(--columnGap));margin-right:calc(-1 * var(--columnGap))}html.theme--documenter-dark .columns.is-variable .column{padding-left:var(--columnGap);padding-right:var(--columnGap)}html.theme--documenter-dark .columns.is-variable.is-0{--columnGap: 0rem}@media screen and (max-width: 768px){html.theme--documenter-dark .columns.is-variable.is-0-mobile{--columnGap: 0rem}}@media screen and (min-width: 769px),print{html.theme--documenter-dark .columns.is-variable.is-0-tablet{--columnGap: 0rem}}@media screen and (min-width: 769px) and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-0-tablet-only{--columnGap: 0rem}}@media screen and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-0-touch{--columnGap: 0rem}}@media screen and (min-width: 1056px){html.theme--documenter-dark .columns.is-variable.is-0-desktop{--columnGap: 0rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){html.theme--documenter-dark .columns.is-variable.is-0-desktop-only{--columnGap: 0rem}}@media screen and (min-width: 1216px){html.theme--documenter-dark .columns.is-variable.is-0-widescreen{--columnGap: 0rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){html.theme--documenter-dark .columns.is-variable.is-0-widescreen-only{--columnGap: 0rem}}@media screen and (min-width: 1408px){html.theme--documenter-dark .columns.is-variable.is-0-fullhd{--columnGap: 0rem}}html.theme--documenter-dark .columns.is-variable.is-1{--columnGap: .25rem}@media screen and (max-width: 768px){html.theme--documenter-dark .columns.is-variable.is-1-mobile{--columnGap: .25rem}}@media screen and (min-width: 769px),print{html.theme--documenter-dark .columns.is-variable.is-1-tablet{--columnGap: .25rem}}@media screen and (min-width: 769px) and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-1-tablet-only{--columnGap: .25rem}}@media screen and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-1-touch{--columnGap: .25rem}}@media screen and (min-width: 1056px){html.theme--documenter-dark .columns.is-variable.is-1-desktop{--columnGap: .25rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){html.theme--documenter-dark .columns.is-variable.is-1-desktop-only{--columnGap: .25rem}}@media screen and (min-width: 1216px){html.theme--documenter-dark .columns.is-variable.is-1-widescreen{--columnGap: .25rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){html.theme--documenter-dark .columns.is-variable.is-1-widescreen-only{--columnGap: .25rem}}@media screen and (min-width: 1408px){html.theme--documenter-dark .columns.is-variable.is-1-fullhd{--columnGap: .25rem}}html.theme--documenter-dark .columns.is-variable.is-2{--columnGap: .5rem}@media screen and (max-width: 768px){html.theme--documenter-dark .columns.is-variable.is-2-mobile{--columnGap: .5rem}}@media screen and (min-width: 769px),print{html.theme--documenter-dark .columns.is-variable.is-2-tablet{--columnGap: .5rem}}@media screen and (min-width: 769px) and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-2-tablet-only{--columnGap: .5rem}}@media screen and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-2-touch{--columnGap: .5rem}}@media screen and (min-width: 1056px){html.theme--documenter-dark .columns.is-variable.is-2-desktop{--columnGap: .5rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){html.theme--documenter-dark .columns.is-variable.is-2-desktop-only{--columnGap: .5rem}}@media screen and (min-width: 1216px){html.theme--documenter-dark .columns.is-variable.is-2-widescreen{--columnGap: .5rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){html.theme--documenter-dark .columns.is-variable.is-2-widescreen-only{--columnGap: .5rem}}@media screen and (min-width: 1408px){html.theme--documenter-dark .columns.is-variable.is-2-fullhd{--columnGap: .5rem}}html.theme--documenter-dark .columns.is-variable.is-3{--columnGap: .75rem}@media screen and (max-width: 768px){html.theme--documenter-dark .columns.is-variable.is-3-mobile{--columnGap: .75rem}}@media screen and (min-width: 769px),print{html.theme--documenter-dark .columns.is-variable.is-3-tablet{--columnGap: .75rem}}@media screen and (min-width: 769px) and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-3-tablet-only{--columnGap: .75rem}}@media screen and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-3-touch{--columnGap: .75rem}}@media screen and (min-width: 1056px){html.theme--documenter-dark .columns.is-variable.is-3-desktop{--columnGap: .75rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){html.theme--documenter-dark .columns.is-variable.is-3-desktop-only{--columnGap: .75rem}}@media screen and (min-width: 1216px){html.theme--documenter-dark .columns.is-variable.is-3-widescreen{--columnGap: .75rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){html.theme--documenter-dark .columns.is-variable.is-3-widescreen-only{--columnGap: .75rem}}@media screen and (min-width: 1408px){html.theme--documenter-dark .columns.is-variable.is-3-fullhd{--columnGap: .75rem}}html.theme--documenter-dark .columns.is-variable.is-4{--columnGap: 1rem}@media screen and (max-width: 768px){html.theme--documenter-dark .columns.is-variable.is-4-mobile{--columnGap: 1rem}}@media screen and (min-width: 769px),print{html.theme--documenter-dark .columns.is-variable.is-4-tablet{--columnGap: 1rem}}@media screen and (min-width: 769px) and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-4-tablet-only{--columnGap: 1rem}}@media screen and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-4-touch{--columnGap: 1rem}}@media screen and (min-width: 1056px){html.theme--documenter-dark .columns.is-variable.is-4-desktop{--columnGap: 1rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){html.theme--documenter-dark .columns.is-variable.is-4-desktop-only{--columnGap: 1rem}}@media screen and (min-width: 1216px){html.theme--documenter-dark .columns.is-variable.is-4-widescreen{--columnGap: 1rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){html.theme--documenter-dark .columns.is-variable.is-4-widescreen-only{--columnGap: 1rem}}@media screen and (min-width: 1408px){html.theme--documenter-dark .columns.is-variable.is-4-fullhd{--columnGap: 1rem}}html.theme--documenter-dark .columns.is-variable.is-5{--columnGap: 1.25rem}@media screen and (max-width: 768px){html.theme--documenter-dark .columns.is-variable.is-5-mobile{--columnGap: 1.25rem}}@media screen and (min-width: 769px),print{html.theme--documenter-dark .columns.is-variable.is-5-tablet{--columnGap: 1.25rem}}@media screen and (min-width: 769px) and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-5-tablet-only{--columnGap: 1.25rem}}@media screen and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-5-touch{--columnGap: 1.25rem}}@media screen and (min-width: 1056px){html.theme--documenter-dark .columns.is-variable.is-5-desktop{--columnGap: 1.25rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){html.theme--documenter-dark .columns.is-variable.is-5-desktop-only{--columnGap: 1.25rem}}@media screen and (min-width: 1216px){html.theme--documenter-dark .columns.is-variable.is-5-widescreen{--columnGap: 1.25rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){html.theme--documenter-dark .columns.is-variable.is-5-widescreen-only{--columnGap: 1.25rem}}@media screen and (min-width: 1408px){html.theme--documenter-dark .columns.is-variable.is-5-fullhd{--columnGap: 1.25rem}}html.theme--documenter-dark .columns.is-variable.is-6{--columnGap: 1.5rem}@media screen and (max-width: 768px){html.theme--documenter-dark .columns.is-variable.is-6-mobile{--columnGap: 1.5rem}}@media screen and (min-width: 769px),print{html.theme--documenter-dark .columns.is-variable.is-6-tablet{--columnGap: 1.5rem}}@media screen and (min-width: 769px) and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-6-tablet-only{--columnGap: 1.5rem}}@media screen and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-6-touch{--columnGap: 1.5rem}}@media screen and (min-width: 1056px){html.theme--documenter-dark .columns.is-variable.is-6-desktop{--columnGap: 1.5rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){html.theme--documenter-dark .columns.is-variable.is-6-desktop-only{--columnGap: 1.5rem}}@media screen and (min-width: 1216px){html.theme--documenter-dark .columns.is-variable.is-6-widescreen{--columnGap: 1.5rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){html.theme--documenter-dark .columns.is-variable.is-6-widescreen-only{--columnGap: 1.5rem}}@media screen and (min-width: 1408px){html.theme--documenter-dark .columns.is-variable.is-6-fullhd{--columnGap: 1.5rem}}html.theme--documenter-dark .columns.is-variable.is-7{--columnGap: 1.75rem}@media screen and (max-width: 768px){html.theme--documenter-dark .columns.is-variable.is-7-mobile{--columnGap: 1.75rem}}@media screen and (min-width: 769px),print{html.theme--documenter-dark .columns.is-variable.is-7-tablet{--columnGap: 1.75rem}}@media screen and (min-width: 769px) and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-7-tablet-only{--columnGap: 1.75rem}}@media screen and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-7-touch{--columnGap: 1.75rem}}@media screen and (min-width: 1056px){html.theme--documenter-dark .columns.is-variable.is-7-desktop{--columnGap: 1.75rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){html.theme--documenter-dark .columns.is-variable.is-7-desktop-only{--columnGap: 1.75rem}}@media screen and (min-width: 1216px){html.theme--documenter-dark .columns.is-variable.is-7-widescreen{--columnGap: 1.75rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){html.theme--documenter-dark .columns.is-variable.is-7-widescreen-only{--columnGap: 1.75rem}}@media screen and (min-width: 1408px){html.theme--documenter-dark .columns.is-variable.is-7-fullhd{--columnGap: 1.75rem}}html.theme--documenter-dark .columns.is-variable.is-8{--columnGap: 2rem}@media screen and (max-width: 768px){html.theme--documenter-dark .columns.is-variable.is-8-mobile{--columnGap: 2rem}}@media screen and (min-width: 769px),print{html.theme--documenter-dark .columns.is-variable.is-8-tablet{--columnGap: 2rem}}@media screen and (min-width: 769px) and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-8-tablet-only{--columnGap: 2rem}}@media screen and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-8-touch{--columnGap: 2rem}}@media screen and (min-width: 1056px){html.theme--documenter-dark .columns.is-variable.is-8-desktop{--columnGap: 2rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){html.theme--documenter-dark .columns.is-variable.is-8-desktop-only{--columnGap: 2rem}}@media screen and (min-width: 1216px){html.theme--documenter-dark .columns.is-variable.is-8-widescreen{--columnGap: 2rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){html.theme--documenter-dark .columns.is-variable.is-8-widescreen-only{--columnGap: 2rem}}@media screen and (min-width: 1408px){html.theme--documenter-dark .columns.is-variable.is-8-fullhd{--columnGap: 2rem}}html.theme--documenter-dark .tile{align-items:stretch;display:block;flex-basis:0;flex-grow:1;flex-shrink:1;min-height:min-content}html.theme--documenter-dark .tile.is-ancestor{margin-left:-.75rem;margin-right:-.75rem;margin-top:-.75rem}html.theme--documenter-dark .tile.is-ancestor:last-child{margin-bottom:-.75rem}html.theme--documenter-dark .tile.is-ancestor:not(:last-child){margin-bottom:.75rem}html.theme--documenter-dark .tile.is-child{margin:0 !important}html.theme--documenter-dark .tile.is-parent{padding:.75rem}html.theme--documenter-dark .tile.is-vertical{flex-direction:column}html.theme--documenter-dark .tile.is-vertical>.tile.is-child:not(:last-child){margin-bottom:1.5rem !important}@media screen and (min-width: 769px),print{html.theme--documenter-dark .tile:not(.is-child){display:flex}html.theme--documenter-dark .tile.is-1{flex:none;width:8.3333333333%}html.theme--documenter-dark .tile.is-2{flex:none;width:16.6666666667%}html.theme--documenter-dark .tile.is-3{flex:none;width:25%}html.theme--documenter-dark .tile.is-4{flex:none;width:33.3333333333%}html.theme--documenter-dark .tile.is-5{flex:none;width:41.6666666667%}html.theme--documenter-dark .tile.is-6{flex:none;width:50%}html.theme--documenter-dark .tile.is-7{flex:none;width:58.3333333333%}html.theme--documenter-dark .tile.is-8{flex:none;width:66.6666666667%}html.theme--documenter-dark .tile.is-9{flex:none;width:75%}html.theme--documenter-dark .tile.is-10{flex:none;width:83.3333333333%}html.theme--documenter-dark .tile.is-11{flex:none;width:91.6666666667%}html.theme--documenter-dark .tile.is-12{flex:none;width:100%}}html.theme--documenter-dark .hero{align-items:stretch;display:flex;flex-direction:column;justify-content:space-between}html.theme--documenter-dark .hero .navbar{background:none}html.theme--documenter-dark .hero .tabs ul{border-bottom:none}html.theme--documenter-dark .hero.is-white{background-color:#fff;color:#0a0a0a}html.theme--documenter-dark .hero.is-white a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),html.theme--documenter-dark .hero.is-white strong{color:inherit}html.theme--documenter-dark .hero.is-white .title{color:#0a0a0a}html.theme--documenter-dark .hero.is-white .subtitle{color:rgba(10,10,10,0.9)}html.theme--documenter-dark .hero.is-white .subtitle a:not(.button),html.theme--documenter-dark .hero.is-white .subtitle strong{color:#0a0a0a}@media screen and (max-width: 1055px){html.theme--documenter-dark .hero.is-white .navbar-menu{background-color:#fff}}html.theme--documenter-dark .hero.is-white .navbar-item,html.theme--documenter-dark .hero.is-white .navbar-link{color:rgba(10,10,10,0.7)}html.theme--documenter-dark .hero.is-white a.navbar-item:hover,html.theme--documenter-dark .hero.is-white a.navbar-item.is-active,html.theme--documenter-dark .hero.is-white .navbar-link:hover,html.theme--documenter-dark .hero.is-white .navbar-link.is-active{background-color:#f2f2f2;color:#0a0a0a}html.theme--documenter-dark .hero.is-white .tabs a{color:#0a0a0a;opacity:0.9}html.theme--documenter-dark .hero.is-white .tabs a:hover{opacity:1}html.theme--documenter-dark .hero.is-white .tabs li.is-active a{opacity:1}html.theme--documenter-dark .hero.is-white .tabs.is-boxed a,html.theme--documenter-dark .hero.is-white .tabs.is-toggle a{color:#0a0a0a}html.theme--documenter-dark .hero.is-white .tabs.is-boxed a:hover,html.theme--documenter-dark .hero.is-white .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}html.theme--documenter-dark .hero.is-white .tabs.is-boxed li.is-active a,html.theme--documenter-dark .hero.is-white .tabs.is-boxed li.is-active a:hover,html.theme--documenter-dark .hero.is-white .tabs.is-toggle li.is-active a,html.theme--documenter-dark .hero.is-white .tabs.is-toggle li.is-active a:hover{background-color:#0a0a0a;border-color:#0a0a0a;color:#fff}html.theme--documenter-dark .hero.is-white.is-bold{background-image:linear-gradient(141deg, #e8e3e4 0%, #fff 71%, #fff 100%)}@media screen and (max-width: 768px){html.theme--documenter-dark .hero.is-white.is-bold .navbar-menu{background-image:linear-gradient(141deg, #e8e3e4 0%, #fff 71%, #fff 100%)}}html.theme--documenter-dark .hero.is-black{background-color:#0a0a0a;color:#fff}html.theme--documenter-dark .hero.is-black a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),html.theme--documenter-dark .hero.is-black strong{color:inherit}html.theme--documenter-dark .hero.is-black .title{color:#fff}html.theme--documenter-dark .hero.is-black .subtitle{color:rgba(255,255,255,0.9)}html.theme--documenter-dark .hero.is-black .subtitle a:not(.button),html.theme--documenter-dark .hero.is-black .subtitle strong{color:#fff}@media screen and (max-width: 1055px){html.theme--documenter-dark .hero.is-black .navbar-menu{background-color:#0a0a0a}}html.theme--documenter-dark .hero.is-black .navbar-item,html.theme--documenter-dark .hero.is-black .navbar-link{color:rgba(255,255,255,0.7)}html.theme--documenter-dark .hero.is-black a.navbar-item:hover,html.theme--documenter-dark .hero.is-black a.navbar-item.is-active,html.theme--documenter-dark .hero.is-black .navbar-link:hover,html.theme--documenter-dark .hero.is-black .navbar-link.is-active{background-color:#000;color:#fff}html.theme--documenter-dark .hero.is-black .tabs a{color:#fff;opacity:0.9}html.theme--documenter-dark .hero.is-black .tabs a:hover{opacity:1}html.theme--documenter-dark .hero.is-black .tabs li.is-active a{opacity:1}html.theme--documenter-dark .hero.is-black .tabs.is-boxed a,html.theme--documenter-dark .hero.is-black .tabs.is-toggle a{color:#fff}html.theme--documenter-dark .hero.is-black .tabs.is-boxed a:hover,html.theme--documenter-dark .hero.is-black .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}html.theme--documenter-dark .hero.is-black .tabs.is-boxed li.is-active a,html.theme--documenter-dark .hero.is-black .tabs.is-boxed li.is-active a:hover,html.theme--documenter-dark .hero.is-black .tabs.is-toggle li.is-active a,html.theme--documenter-dark .hero.is-black .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#0a0a0a}html.theme--documenter-dark .hero.is-black.is-bold{background-image:linear-gradient(141deg, #000 0%, #0a0a0a 71%, #181616 100%)}@media screen and (max-width: 768px){html.theme--documenter-dark .hero.is-black.is-bold .navbar-menu{background-image:linear-gradient(141deg, #000 0%, #0a0a0a 71%, #181616 100%)}}html.theme--documenter-dark .hero.is-light{background-color:#ecf0f1;color:#282f2f}html.theme--documenter-dark .hero.is-light a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),html.theme--documenter-dark .hero.is-light strong{color:inherit}html.theme--documenter-dark .hero.is-light .title{color:#282f2f}html.theme--documenter-dark .hero.is-light .subtitle{color:rgba(40,47,47,0.9)}html.theme--documenter-dark .hero.is-light .subtitle a:not(.button),html.theme--documenter-dark .hero.is-light .subtitle strong{color:#282f2f}@media screen and (max-width: 1055px){html.theme--documenter-dark .hero.is-light .navbar-menu{background-color:#ecf0f1}}html.theme--documenter-dark .hero.is-light .navbar-item,html.theme--documenter-dark .hero.is-light .navbar-link{color:rgba(40,47,47,0.7)}html.theme--documenter-dark .hero.is-light a.navbar-item:hover,html.theme--documenter-dark .hero.is-light a.navbar-item.is-active,html.theme--documenter-dark .hero.is-light .navbar-link:hover,html.theme--documenter-dark .hero.is-light .navbar-link.is-active{background-color:#dde4e6;color:#282f2f}html.theme--documenter-dark .hero.is-light .tabs a{color:#282f2f;opacity:0.9}html.theme--documenter-dark .hero.is-light .tabs a:hover{opacity:1}html.theme--documenter-dark .hero.is-light .tabs li.is-active a{opacity:1}html.theme--documenter-dark .hero.is-light .tabs.is-boxed a,html.theme--documenter-dark .hero.is-light .tabs.is-toggle a{color:#282f2f}html.theme--documenter-dark .hero.is-light .tabs.is-boxed a:hover,html.theme--documenter-dark .hero.is-light .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}html.theme--documenter-dark .hero.is-light .tabs.is-boxed li.is-active a,html.theme--documenter-dark .hero.is-light .tabs.is-boxed li.is-active a:hover,html.theme--documenter-dark .hero.is-light .tabs.is-toggle li.is-active a,html.theme--documenter-dark .hero.is-light .tabs.is-toggle li.is-active a:hover{background-color:#282f2f;border-color:#282f2f;color:#ecf0f1}html.theme--documenter-dark .hero.is-light.is-bold{background-image:linear-gradient(141deg, #cadfe0 0%, #ecf0f1 71%, #fafbfc 100%)}@media screen and (max-width: 768px){html.theme--documenter-dark .hero.is-light.is-bold .navbar-menu{background-image:linear-gradient(141deg, #cadfe0 0%, #ecf0f1 71%, #fafbfc 100%)}}html.theme--documenter-dark .hero.is-dark,html.theme--documenter-dark .content kbd.hero{background-color:#282f2f;color:#ecf0f1}html.theme--documenter-dark .hero.is-dark a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),html.theme--documenter-dark .content kbd.hero a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),html.theme--documenter-dark .hero.is-dark strong,html.theme--documenter-dark .content kbd.hero strong{color:inherit}html.theme--documenter-dark .hero.is-dark .title,html.theme--documenter-dark .content kbd.hero .title{color:#ecf0f1}html.theme--documenter-dark .hero.is-dark .subtitle,html.theme--documenter-dark .content kbd.hero .subtitle{color:rgba(236,240,241,0.9)}html.theme--documenter-dark .hero.is-dark .subtitle a:not(.button),html.theme--documenter-dark .content kbd.hero .subtitle a:not(.button),html.theme--documenter-dark .hero.is-dark .subtitle strong,html.theme--documenter-dark .content kbd.hero .subtitle strong{color:#ecf0f1}@media screen and (max-width: 1055px){html.theme--documenter-dark .hero.is-dark .navbar-menu,html.theme--documenter-dark .content kbd.hero .navbar-menu{background-color:#282f2f}}html.theme--documenter-dark .hero.is-dark .navbar-item,html.theme--documenter-dark .content kbd.hero .navbar-item,html.theme--documenter-dark .hero.is-dark .navbar-link,html.theme--documenter-dark .content kbd.hero .navbar-link{color:rgba(236,240,241,0.7)}html.theme--documenter-dark .hero.is-dark a.navbar-item:hover,html.theme--documenter-dark .content kbd.hero a.navbar-item:hover,html.theme--documenter-dark .hero.is-dark a.navbar-item.is-active,html.theme--documenter-dark .content kbd.hero a.navbar-item.is-active,html.theme--documenter-dark .hero.is-dark .navbar-link:hover,html.theme--documenter-dark .content kbd.hero .navbar-link:hover,html.theme--documenter-dark .hero.is-dark .navbar-link.is-active,html.theme--documenter-dark .content kbd.hero .navbar-link.is-active{background-color:#1d2122;color:#ecf0f1}html.theme--documenter-dark .hero.is-dark .tabs a,html.theme--documenter-dark .content kbd.hero .tabs a{color:#ecf0f1;opacity:0.9}html.theme--documenter-dark .hero.is-dark .tabs a:hover,html.theme--documenter-dark .content kbd.hero .tabs a:hover{opacity:1}html.theme--documenter-dark .hero.is-dark .tabs li.is-active a,html.theme--documenter-dark .content kbd.hero .tabs li.is-active a{opacity:1}html.theme--documenter-dark .hero.is-dark .tabs.is-boxed a,html.theme--documenter-dark .content kbd.hero .tabs.is-boxed a,html.theme--documenter-dark .hero.is-dark .tabs.is-toggle a,html.theme--documenter-dark .content kbd.hero .tabs.is-toggle a{color:#ecf0f1}html.theme--documenter-dark .hero.is-dark .tabs.is-boxed a:hover,html.theme--documenter-dark .content kbd.hero .tabs.is-boxed a:hover,html.theme--documenter-dark .hero.is-dark .tabs.is-toggle a:hover,html.theme--documenter-dark .content kbd.hero .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}html.theme--documenter-dark .hero.is-dark .tabs.is-boxed li.is-active a,html.theme--documenter-dark .content kbd.hero .tabs.is-boxed li.is-active a,html.theme--documenter-dark .hero.is-dark .tabs.is-boxed li.is-active a:hover,html.theme--documenter-dark .hero.is-dark .tabs.is-toggle li.is-active a,html.theme--documenter-dark .content kbd.hero .tabs.is-toggle li.is-active a,html.theme--documenter-dark .hero.is-dark .tabs.is-toggle li.is-active a:hover{background-color:#ecf0f1;border-color:#ecf0f1;color:#282f2f}html.theme--documenter-dark .hero.is-dark.is-bold,html.theme--documenter-dark .content kbd.hero.is-bold{background-image:linear-gradient(141deg, #0f1615 0%, #282f2f 71%, #313c40 100%)}@media screen and (max-width: 768px){html.theme--documenter-dark .hero.is-dark.is-bold .navbar-menu,html.theme--documenter-dark .content kbd.hero.is-bold .navbar-menu{background-image:linear-gradient(141deg, #0f1615 0%, #282f2f 71%, #313c40 100%)}}html.theme--documenter-dark .hero.is-primary,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink{background-color:#375a7f;color:#fff}html.theme--documenter-dark .hero.is-primary a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),html.theme--documenter-dark .hero.is-primary strong,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink strong{color:inherit}html.theme--documenter-dark .hero.is-primary .title,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .title{color:#fff}html.theme--documenter-dark .hero.is-primary .subtitle,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .subtitle{color:rgba(255,255,255,0.9)}html.theme--documenter-dark .hero.is-primary .subtitle a:not(.button),html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .subtitle a:not(.button),html.theme--documenter-dark .hero.is-primary .subtitle strong,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .subtitle strong{color:#fff}@media screen and (max-width: 1055px){html.theme--documenter-dark .hero.is-primary .navbar-menu,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .navbar-menu{background-color:#375a7f}}html.theme--documenter-dark .hero.is-primary .navbar-item,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .navbar-item,html.theme--documenter-dark .hero.is-primary .navbar-link,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .navbar-link{color:rgba(255,255,255,0.7)}html.theme--documenter-dark .hero.is-primary a.navbar-item:hover,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink a.navbar-item:hover,html.theme--documenter-dark .hero.is-primary a.navbar-item.is-active,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink a.navbar-item.is-active,html.theme--documenter-dark .hero.is-primary .navbar-link:hover,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .navbar-link:hover,html.theme--documenter-dark .hero.is-primary .navbar-link.is-active,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .navbar-link.is-active{background-color:#2f4d6d;color:#fff}html.theme--documenter-dark .hero.is-primary .tabs a,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .tabs a{color:#fff;opacity:0.9}html.theme--documenter-dark .hero.is-primary .tabs a:hover,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .tabs a:hover{opacity:1}html.theme--documenter-dark .hero.is-primary .tabs li.is-active a,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .tabs li.is-active a{opacity:1}html.theme--documenter-dark .hero.is-primary .tabs.is-boxed a,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .tabs.is-boxed a,html.theme--documenter-dark .hero.is-primary .tabs.is-toggle a,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .tabs.is-toggle a{color:#fff}html.theme--documenter-dark .hero.is-primary .tabs.is-boxed a:hover,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .tabs.is-boxed a:hover,html.theme--documenter-dark .hero.is-primary .tabs.is-toggle a:hover,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}html.theme--documenter-dark .hero.is-primary .tabs.is-boxed li.is-active a,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .tabs.is-boxed li.is-active a,html.theme--documenter-dark .hero.is-primary .tabs.is-boxed li.is-active a:hover,html.theme--documenter-dark .hero.is-primary .tabs.is-toggle li.is-active a,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .tabs.is-toggle li.is-active a,html.theme--documenter-dark .hero.is-primary .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#375a7f}html.theme--documenter-dark .hero.is-primary.is-bold,html.theme--documenter-dark .docstring>section>a.hero.is-bold.docs-sourcelink{background-image:linear-gradient(141deg, #214b62 0%, #375a7f 71%, #3a5796 100%)}@media screen and (max-width: 768px){html.theme--documenter-dark .hero.is-primary.is-bold .navbar-menu,html.theme--documenter-dark .docstring>section>a.hero.is-bold.docs-sourcelink .navbar-menu{background-image:linear-gradient(141deg, #214b62 0%, #375a7f 71%, #3a5796 100%)}}html.theme--documenter-dark .hero.is-link{background-color:#1abc9c;color:#fff}html.theme--documenter-dark .hero.is-link a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),html.theme--documenter-dark .hero.is-link strong{color:inherit}html.theme--documenter-dark .hero.is-link .title{color:#fff}html.theme--documenter-dark .hero.is-link .subtitle{color:rgba(255,255,255,0.9)}html.theme--documenter-dark .hero.is-link .subtitle a:not(.button),html.theme--documenter-dark .hero.is-link .subtitle strong{color:#fff}@media screen and (max-width: 1055px){html.theme--documenter-dark .hero.is-link .navbar-menu{background-color:#1abc9c}}html.theme--documenter-dark .hero.is-link .navbar-item,html.theme--documenter-dark .hero.is-link .navbar-link{color:rgba(255,255,255,0.7)}html.theme--documenter-dark .hero.is-link a.navbar-item:hover,html.theme--documenter-dark .hero.is-link a.navbar-item.is-active,html.theme--documenter-dark .hero.is-link .navbar-link:hover,html.theme--documenter-dark .hero.is-link .navbar-link.is-active{background-color:#17a689;color:#fff}html.theme--documenter-dark .hero.is-link .tabs a{color:#fff;opacity:0.9}html.theme--documenter-dark .hero.is-link .tabs a:hover{opacity:1}html.theme--documenter-dark .hero.is-link .tabs li.is-active a{opacity:1}html.theme--documenter-dark .hero.is-link .tabs.is-boxed a,html.theme--documenter-dark .hero.is-link .tabs.is-toggle a{color:#fff}html.theme--documenter-dark .hero.is-link .tabs.is-boxed a:hover,html.theme--documenter-dark .hero.is-link .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}html.theme--documenter-dark .hero.is-link .tabs.is-boxed li.is-active a,html.theme--documenter-dark .hero.is-link .tabs.is-boxed li.is-active a:hover,html.theme--documenter-dark .hero.is-link .tabs.is-toggle li.is-active a,html.theme--documenter-dark .hero.is-link .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#1abc9c}html.theme--documenter-dark .hero.is-link.is-bold{background-image:linear-gradient(141deg, #0c9764 0%, #1abc9c 71%, #17d8d2 100%)}@media screen and (max-width: 768px){html.theme--documenter-dark .hero.is-link.is-bold .navbar-menu{background-image:linear-gradient(141deg, #0c9764 0%, #1abc9c 71%, #17d8d2 100%)}}html.theme--documenter-dark .hero.is-info{background-color:#024c7d;color:#fff}html.theme--documenter-dark .hero.is-info a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),html.theme--documenter-dark .hero.is-info strong{color:inherit}html.theme--documenter-dark .hero.is-info .title{color:#fff}html.theme--documenter-dark .hero.is-info .subtitle{color:rgba(255,255,255,0.9)}html.theme--documenter-dark .hero.is-info .subtitle a:not(.button),html.theme--documenter-dark .hero.is-info .subtitle strong{color:#fff}@media screen and (max-width: 1055px){html.theme--documenter-dark .hero.is-info .navbar-menu{background-color:#024c7d}}html.theme--documenter-dark .hero.is-info .navbar-item,html.theme--documenter-dark .hero.is-info .navbar-link{color:rgba(255,255,255,0.7)}html.theme--documenter-dark .hero.is-info a.navbar-item:hover,html.theme--documenter-dark .hero.is-info a.navbar-item.is-active,html.theme--documenter-dark .hero.is-info .navbar-link:hover,html.theme--documenter-dark .hero.is-info .navbar-link.is-active{background-color:#023d64;color:#fff}html.theme--documenter-dark .hero.is-info .tabs a{color:#fff;opacity:0.9}html.theme--documenter-dark .hero.is-info .tabs a:hover{opacity:1}html.theme--documenter-dark .hero.is-info .tabs li.is-active a{opacity:1}html.theme--documenter-dark .hero.is-info .tabs.is-boxed a,html.theme--documenter-dark .hero.is-info .tabs.is-toggle a{color:#fff}html.theme--documenter-dark .hero.is-info .tabs.is-boxed a:hover,html.theme--documenter-dark .hero.is-info .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}html.theme--documenter-dark .hero.is-info .tabs.is-boxed li.is-active a,html.theme--documenter-dark .hero.is-info .tabs.is-boxed li.is-active a:hover,html.theme--documenter-dark .hero.is-info .tabs.is-toggle li.is-active a,html.theme--documenter-dark .hero.is-info .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#024c7d}html.theme--documenter-dark .hero.is-info.is-bold{background-image:linear-gradient(141deg, #003a4c 0%, #024c7d 71%, #004299 100%)}@media screen and (max-width: 768px){html.theme--documenter-dark .hero.is-info.is-bold .navbar-menu{background-image:linear-gradient(141deg, #003a4c 0%, #024c7d 71%, #004299 100%)}}html.theme--documenter-dark .hero.is-success{background-color:#008438;color:#fff}html.theme--documenter-dark .hero.is-success a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),html.theme--documenter-dark .hero.is-success strong{color:inherit}html.theme--documenter-dark .hero.is-success .title{color:#fff}html.theme--documenter-dark .hero.is-success .subtitle{color:rgba(255,255,255,0.9)}html.theme--documenter-dark .hero.is-success .subtitle a:not(.button),html.theme--documenter-dark .hero.is-success .subtitle strong{color:#fff}@media screen and (max-width: 1055px){html.theme--documenter-dark .hero.is-success .navbar-menu{background-color:#008438}}html.theme--documenter-dark .hero.is-success .navbar-item,html.theme--documenter-dark .hero.is-success .navbar-link{color:rgba(255,255,255,0.7)}html.theme--documenter-dark .hero.is-success a.navbar-item:hover,html.theme--documenter-dark .hero.is-success a.navbar-item.is-active,html.theme--documenter-dark .hero.is-success .navbar-link:hover,html.theme--documenter-dark .hero.is-success .navbar-link.is-active{background-color:#006b2d;color:#fff}html.theme--documenter-dark .hero.is-success .tabs a{color:#fff;opacity:0.9}html.theme--documenter-dark .hero.is-success .tabs a:hover{opacity:1}html.theme--documenter-dark .hero.is-success .tabs li.is-active a{opacity:1}html.theme--documenter-dark .hero.is-success .tabs.is-boxed a,html.theme--documenter-dark .hero.is-success .tabs.is-toggle a{color:#fff}html.theme--documenter-dark .hero.is-success .tabs.is-boxed a:hover,html.theme--documenter-dark .hero.is-success .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}html.theme--documenter-dark .hero.is-success .tabs.is-boxed li.is-active a,html.theme--documenter-dark .hero.is-success .tabs.is-boxed li.is-active a:hover,html.theme--documenter-dark .hero.is-success .tabs.is-toggle li.is-active a,html.theme--documenter-dark .hero.is-success .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#008438}html.theme--documenter-dark .hero.is-success.is-bold{background-image:linear-gradient(141deg, #005115 0%, #008438 71%, #009e5d 100%)}@media screen and (max-width: 768px){html.theme--documenter-dark .hero.is-success.is-bold .navbar-menu{background-image:linear-gradient(141deg, #005115 0%, #008438 71%, #009e5d 100%)}}html.theme--documenter-dark .hero.is-warning{background-color:#ad8100;color:#fff}html.theme--documenter-dark .hero.is-warning a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),html.theme--documenter-dark .hero.is-warning strong{color:inherit}html.theme--documenter-dark .hero.is-warning .title{color:#fff}html.theme--documenter-dark .hero.is-warning .subtitle{color:rgba(255,255,255,0.9)}html.theme--documenter-dark .hero.is-warning .subtitle a:not(.button),html.theme--documenter-dark .hero.is-warning .subtitle strong{color:#fff}@media screen and (max-width: 1055px){html.theme--documenter-dark .hero.is-warning .navbar-menu{background-color:#ad8100}}html.theme--documenter-dark .hero.is-warning .navbar-item,html.theme--documenter-dark .hero.is-warning .navbar-link{color:rgba(255,255,255,0.7)}html.theme--documenter-dark .hero.is-warning a.navbar-item:hover,html.theme--documenter-dark .hero.is-warning a.navbar-item.is-active,html.theme--documenter-dark .hero.is-warning .navbar-link:hover,html.theme--documenter-dark .hero.is-warning .navbar-link.is-active{background-color:#946e00;color:#fff}html.theme--documenter-dark .hero.is-warning .tabs a{color:#fff;opacity:0.9}html.theme--documenter-dark .hero.is-warning .tabs a:hover{opacity:1}html.theme--documenter-dark .hero.is-warning .tabs li.is-active a{opacity:1}html.theme--documenter-dark .hero.is-warning .tabs.is-boxed a,html.theme--documenter-dark .hero.is-warning .tabs.is-toggle a{color:#fff}html.theme--documenter-dark .hero.is-warning .tabs.is-boxed a:hover,html.theme--documenter-dark .hero.is-warning .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}html.theme--documenter-dark .hero.is-warning .tabs.is-boxed li.is-active a,html.theme--documenter-dark .hero.is-warning .tabs.is-boxed li.is-active a:hover,html.theme--documenter-dark .hero.is-warning .tabs.is-toggle li.is-active a,html.theme--documenter-dark .hero.is-warning .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#ad8100}html.theme--documenter-dark .hero.is-warning.is-bold{background-image:linear-gradient(141deg, #7a4700 0%, #ad8100 71%, #c7b500 100%)}@media screen and (max-width: 768px){html.theme--documenter-dark .hero.is-warning.is-bold .navbar-menu{background-image:linear-gradient(141deg, #7a4700 0%, #ad8100 71%, #c7b500 100%)}}html.theme--documenter-dark .hero.is-danger{background-color:#9e1b0d;color:#fff}html.theme--documenter-dark .hero.is-danger a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),html.theme--documenter-dark .hero.is-danger strong{color:inherit}html.theme--documenter-dark .hero.is-danger .title{color:#fff}html.theme--documenter-dark .hero.is-danger .subtitle{color:rgba(255,255,255,0.9)}html.theme--documenter-dark .hero.is-danger .subtitle a:not(.button),html.theme--documenter-dark .hero.is-danger .subtitle strong{color:#fff}@media screen and (max-width: 1055px){html.theme--documenter-dark .hero.is-danger .navbar-menu{background-color:#9e1b0d}}html.theme--documenter-dark .hero.is-danger .navbar-item,html.theme--documenter-dark .hero.is-danger .navbar-link{color:rgba(255,255,255,0.7)}html.theme--documenter-dark .hero.is-danger a.navbar-item:hover,html.theme--documenter-dark .hero.is-danger a.navbar-item.is-active,html.theme--documenter-dark .hero.is-danger .navbar-link:hover,html.theme--documenter-dark .hero.is-danger .navbar-link.is-active{background-color:#86170b;color:#fff}html.theme--documenter-dark .hero.is-danger .tabs a{color:#fff;opacity:0.9}html.theme--documenter-dark .hero.is-danger .tabs a:hover{opacity:1}html.theme--documenter-dark .hero.is-danger .tabs li.is-active a{opacity:1}html.theme--documenter-dark .hero.is-danger .tabs.is-boxed a,html.theme--documenter-dark .hero.is-danger .tabs.is-toggle a{color:#fff}html.theme--documenter-dark .hero.is-danger .tabs.is-boxed a:hover,html.theme--documenter-dark .hero.is-danger .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}html.theme--documenter-dark .hero.is-danger .tabs.is-boxed li.is-active a,html.theme--documenter-dark .hero.is-danger .tabs.is-boxed li.is-active a:hover,html.theme--documenter-dark .hero.is-danger .tabs.is-toggle li.is-active a,html.theme--documenter-dark .hero.is-danger .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#9e1b0d}html.theme--documenter-dark .hero.is-danger.is-bold{background-image:linear-gradient(141deg, #75030b 0%, #9e1b0d 71%, #ba380a 100%)}@media screen and (max-width: 768px){html.theme--documenter-dark .hero.is-danger.is-bold .navbar-menu{background-image:linear-gradient(141deg, #75030b 0%, #9e1b0d 71%, #ba380a 100%)}}html.theme--documenter-dark .hero.is-small .hero-body,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.hero .hero-body{padding-bottom:1.5rem;padding-top:1.5rem}@media screen and (min-width: 769px),print{html.theme--documenter-dark .hero.is-medium .hero-body{padding-bottom:9rem;padding-top:9rem}}@media screen and (min-width: 769px),print{html.theme--documenter-dark .hero.is-large .hero-body{padding-bottom:18rem;padding-top:18rem}}html.theme--documenter-dark .hero.is-halfheight .hero-body,html.theme--documenter-dark .hero.is-fullheight .hero-body,html.theme--documenter-dark .hero.is-fullheight-with-navbar .hero-body{align-items:center;display:flex}html.theme--documenter-dark .hero.is-halfheight .hero-body>.container,html.theme--documenter-dark .hero.is-fullheight .hero-body>.container,html.theme--documenter-dark .hero.is-fullheight-with-navbar .hero-body>.container{flex-grow:1;flex-shrink:1}html.theme--documenter-dark .hero.is-halfheight{min-height:50vh}html.theme--documenter-dark .hero.is-fullheight{min-height:100vh}html.theme--documenter-dark .hero-video{overflow:hidden}html.theme--documenter-dark .hero-video video{left:50%;min-height:100%;min-width:100%;position:absolute;top:50%;transform:translate3d(-50%, -50%, 0)}html.theme--documenter-dark .hero-video.is-transparent{opacity:0.3}@media screen and (max-width: 768px){html.theme--documenter-dark .hero-video{display:none}}html.theme--documenter-dark .hero-buttons{margin-top:1.5rem}@media screen and (max-width: 768px){html.theme--documenter-dark .hero-buttons .button{display:flex}html.theme--documenter-dark .hero-buttons .button:not(:last-child){margin-bottom:0.75rem}}@media screen and (min-width: 769px),print{html.theme--documenter-dark .hero-buttons{display:flex;justify-content:center}html.theme--documenter-dark .hero-buttons .button:not(:last-child){margin-right:1.5rem}}html.theme--documenter-dark .hero-head,html.theme--documenter-dark .hero-foot{flex-grow:0;flex-shrink:0}html.theme--documenter-dark .hero-body{flex-grow:1;flex-shrink:0;padding:3rem 1.5rem}html.theme--documenter-dark .section{padding:3rem 1.5rem}@media screen and (min-width: 1056px){html.theme--documenter-dark .section.is-medium{padding:9rem 1.5rem}html.theme--documenter-dark .section.is-large{padding:18rem 1.5rem}}html.theme--documenter-dark .footer{background-color:#282f2f;padding:3rem 1.5rem 6rem}html.theme--documenter-dark hr{height:1px}html.theme--documenter-dark h6{text-transform:uppercase;letter-spacing:0.5px}html.theme--documenter-dark .hero{background-color:#343c3d}html.theme--documenter-dark a{transition:all 200ms ease}html.theme--documenter-dark .button{transition:all 200ms ease;border-width:1px;color:#fff}html.theme--documenter-dark .button.is-active,html.theme--documenter-dark .button.is-focused,html.theme--documenter-dark .button:active,html.theme--documenter-dark .button:focus{box-shadow:0 0 0 2px rgba(140,155,157,0.5)}html.theme--documenter-dark .button.is-white.is-hovered,html.theme--documenter-dark .button.is-white:hover{background-color:#fff}html.theme--documenter-dark .button.is-white.is-active,html.theme--documenter-dark .button.is-white.is-focused,html.theme--documenter-dark .button.is-white:active,html.theme--documenter-dark .button.is-white:focus{border-color:#fff;box-shadow:0 0 0 2px rgba(255,255,255,0.5)}html.theme--documenter-dark .button.is-black.is-hovered,html.theme--documenter-dark .button.is-black:hover{background-color:#1d1d1d}html.theme--documenter-dark .button.is-black.is-active,html.theme--documenter-dark .button.is-black.is-focused,html.theme--documenter-dark .button.is-black:active,html.theme--documenter-dark .button.is-black:focus{border-color:#0a0a0a;box-shadow:0 0 0 2px rgba(10,10,10,0.5)}html.theme--documenter-dark .button.is-light.is-hovered,html.theme--documenter-dark .button.is-light:hover{background-color:#fff}html.theme--documenter-dark .button.is-light.is-active,html.theme--documenter-dark .button.is-light.is-focused,html.theme--documenter-dark .button.is-light:active,html.theme--documenter-dark .button.is-light:focus{border-color:#ecf0f1;box-shadow:0 0 0 2px rgba(236,240,241,0.5)}html.theme--documenter-dark .button.is-dark.is-hovered,html.theme--documenter-dark .content kbd.button.is-hovered,html.theme--documenter-dark .button.is-dark:hover,html.theme--documenter-dark .content kbd.button:hover{background-color:#3a4344}html.theme--documenter-dark .button.is-dark.is-active,html.theme--documenter-dark .content kbd.button.is-active,html.theme--documenter-dark .button.is-dark.is-focused,html.theme--documenter-dark .content kbd.button.is-focused,html.theme--documenter-dark .button.is-dark:active,html.theme--documenter-dark .content kbd.button:active,html.theme--documenter-dark .button.is-dark:focus,html.theme--documenter-dark .content kbd.button:focus{border-color:#282f2f;box-shadow:0 0 0 2px rgba(40,47,47,0.5)}html.theme--documenter-dark .button.is-primary.is-hovered,html.theme--documenter-dark .docstring>section>a.button.is-hovered.docs-sourcelink,html.theme--documenter-dark .button.is-primary:hover,html.theme--documenter-dark .docstring>section>a.button.docs-sourcelink:hover{background-color:#436d9a}html.theme--documenter-dark .button.is-primary.is-active,html.theme--documenter-dark .docstring>section>a.button.is-active.docs-sourcelink,html.theme--documenter-dark .button.is-primary.is-focused,html.theme--documenter-dark .docstring>section>a.button.is-focused.docs-sourcelink,html.theme--documenter-dark .button.is-primary:active,html.theme--documenter-dark .docstring>section>a.button.docs-sourcelink:active,html.theme--documenter-dark .button.is-primary:focus,html.theme--documenter-dark .docstring>section>a.button.docs-sourcelink:focus{border-color:#375a7f;box-shadow:0 0 0 2px rgba(55,90,127,0.5)}html.theme--documenter-dark .button.is-link.is-hovered,html.theme--documenter-dark .button.is-link:hover{background-color:#1fdeb8}html.theme--documenter-dark .button.is-link.is-active,html.theme--documenter-dark .button.is-link.is-focused,html.theme--documenter-dark .button.is-link:active,html.theme--documenter-dark .button.is-link:focus{border-color:#1abc9c;box-shadow:0 0 0 2px rgba(26,188,156,0.5)}html.theme--documenter-dark .button.is-info.is-hovered,html.theme--documenter-dark .button.is-info:hover{background-color:#0363a3}html.theme--documenter-dark .button.is-info.is-active,html.theme--documenter-dark .button.is-info.is-focused,html.theme--documenter-dark .button.is-info:active,html.theme--documenter-dark .button.is-info:focus{border-color:#024c7d;box-shadow:0 0 0 2px rgba(2,76,125,0.5)}html.theme--documenter-dark .button.is-success.is-hovered,html.theme--documenter-dark .button.is-success:hover{background-color:#00aa48}html.theme--documenter-dark .button.is-success.is-active,html.theme--documenter-dark .button.is-success.is-focused,html.theme--documenter-dark .button.is-success:active,html.theme--documenter-dark .button.is-success:focus{border-color:#008438;box-shadow:0 0 0 2px rgba(0,132,56,0.5)}html.theme--documenter-dark .button.is-warning.is-hovered,html.theme--documenter-dark .button.is-warning:hover{background-color:#d39e00}html.theme--documenter-dark .button.is-warning.is-active,html.theme--documenter-dark .button.is-warning.is-focused,html.theme--documenter-dark .button.is-warning:active,html.theme--documenter-dark .button.is-warning:focus{border-color:#ad8100;box-shadow:0 0 0 2px rgba(173,129,0,0.5)}html.theme--documenter-dark .button.is-danger.is-hovered,html.theme--documenter-dark .button.is-danger:hover{background-color:#c12110}html.theme--documenter-dark .button.is-danger.is-active,html.theme--documenter-dark .button.is-danger.is-focused,html.theme--documenter-dark .button.is-danger:active,html.theme--documenter-dark .button.is-danger:focus{border-color:#9e1b0d;box-shadow:0 0 0 2px rgba(158,27,13,0.5)}html.theme--documenter-dark .label{color:#dbdee0}html.theme--documenter-dark .button,html.theme--documenter-dark .control.has-icons-left .icon,html.theme--documenter-dark .control.has-icons-right .icon,html.theme--documenter-dark .input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input,html.theme--documenter-dark .pagination-ellipsis,html.theme--documenter-dark .pagination-link,html.theme--documenter-dark .pagination-next,html.theme--documenter-dark .pagination-previous,html.theme--documenter-dark .select,html.theme--documenter-dark .select select,html.theme--documenter-dark .textarea{height:2.5em}html.theme--documenter-dark .input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input,html.theme--documenter-dark .textarea{transition:all 200ms ease;box-shadow:none;border-width:1px;padding-left:1em;padding-right:1em}html.theme--documenter-dark .select:after,html.theme--documenter-dark .select select{border-width:1px}html.theme--documenter-dark .control.has-addons .button,html.theme--documenter-dark .control.has-addons .input,html.theme--documenter-dark .control.has-addons #documenter .docs-sidebar form.docs-search>input,html.theme--documenter-dark #documenter .docs-sidebar .control.has-addons form.docs-search>input,html.theme--documenter-dark .control.has-addons .select{margin-right:-1px}html.theme--documenter-dark .notification{background-color:#343c3d}html.theme--documenter-dark .card{box-shadow:none;border:1px solid #343c3d;background-color:#282f2f;border-radius:.4em}html.theme--documenter-dark .card .card-image img{border-radius:.4em .4em 0 0}html.theme--documenter-dark .card .card-header{box-shadow:none;background-color:rgba(18,18,18,0.2);border-radius:.4em .4em 0 0}html.theme--documenter-dark .card .card-footer{background-color:rgba(18,18,18,0.2)}html.theme--documenter-dark .card .card-footer,html.theme--documenter-dark .card .card-footer-item{border-width:1px;border-color:#343c3d}html.theme--documenter-dark .notification.is-white a:not(.button){color:#0a0a0a;text-decoration:underline}html.theme--documenter-dark .notification.is-black a:not(.button){color:#fff;text-decoration:underline}html.theme--documenter-dark .notification.is-light a:not(.button){color:#282f2f;text-decoration:underline}html.theme--documenter-dark .notification.is-dark a:not(.button),html.theme--documenter-dark .content kbd.notification a:not(.button){color:#ecf0f1;text-decoration:underline}html.theme--documenter-dark .notification.is-primary a:not(.button),html.theme--documenter-dark .docstring>section>a.notification.docs-sourcelink a:not(.button){color:#fff;text-decoration:underline}html.theme--documenter-dark .notification.is-link a:not(.button){color:#fff;text-decoration:underline}html.theme--documenter-dark .notification.is-info a:not(.button){color:#fff;text-decoration:underline}html.theme--documenter-dark .notification.is-success a:not(.button){color:#fff;text-decoration:underline}html.theme--documenter-dark .notification.is-warning a:not(.button){color:#fff;text-decoration:underline}html.theme--documenter-dark .notification.is-danger a:not(.button){color:#fff;text-decoration:underline}html.theme--documenter-dark .tag,html.theme--documenter-dark .content kbd,html.theme--documenter-dark .docstring>section>a.docs-sourcelink{border-radius:.4em}html.theme--documenter-dark .menu-list a{transition:all 300ms ease}html.theme--documenter-dark .modal-card-body{background-color:#282f2f}html.theme--documenter-dark .modal-card-foot,html.theme--documenter-dark .modal-card-head{border-color:#343c3d}html.theme--documenter-dark .message-header{font-weight:700;background-color:#343c3d;color:#fff}html.theme--documenter-dark .message-body{border-width:1px;border-color:#343c3d}html.theme--documenter-dark .navbar{border-radius:.4em}html.theme--documenter-dark .navbar.is-transparent{background:none}html.theme--documenter-dark .navbar.is-primary .navbar-dropdown a.navbar-item.is-active,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-dropdown a.navbar-item.is-active{background-color:#1abc9c}@media screen and (max-width: 1055px){html.theme--documenter-dark .navbar .navbar-menu{background-color:#375a7f;border-radius:0 0 .4em .4em}}html.theme--documenter-dark .hero .navbar,html.theme--documenter-dark body>.navbar{border-radius:0}html.theme--documenter-dark .pagination-link,html.theme--documenter-dark .pagination-next,html.theme--documenter-dark .pagination-previous{border-width:1px}html.theme--documenter-dark .panel-block,html.theme--documenter-dark .panel-heading,html.theme--documenter-dark .panel-tabs{border-width:1px}html.theme--documenter-dark .panel-block:first-child,html.theme--documenter-dark .panel-heading:first-child,html.theme--documenter-dark .panel-tabs:first-child{border-top-width:1px}html.theme--documenter-dark .panel-heading{font-weight:700}html.theme--documenter-dark .panel-tabs a{border-width:1px;margin-bottom:-1px}html.theme--documenter-dark .panel-tabs a.is-active{border-bottom-color:#17a689}html.theme--documenter-dark .panel-block:hover{color:#1dd2af}html.theme--documenter-dark .panel-block:hover .panel-icon{color:#1dd2af}html.theme--documenter-dark .panel-block.is-active .panel-icon{color:#17a689}html.theme--documenter-dark .tabs a{border-bottom-width:1px;margin-bottom:-1px}html.theme--documenter-dark .tabs ul{border-bottom-width:1px}html.theme--documenter-dark .tabs.is-boxed a{border-width:1px}html.theme--documenter-dark .tabs.is-boxed li.is-active a{background-color:#1f2424}html.theme--documenter-dark .tabs.is-toggle li a{border-width:1px;margin-bottom:0}html.theme--documenter-dark .tabs.is-toggle li+li{margin-left:-1px}html.theme--documenter-dark .hero.is-white .navbar .navbar-dropdown .navbar-item:hover{background-color:rgba(0,0,0,0)}html.theme--documenter-dark .hero.is-black .navbar .navbar-dropdown .navbar-item:hover{background-color:rgba(0,0,0,0)}html.theme--documenter-dark .hero.is-light .navbar .navbar-dropdown .navbar-item:hover{background-color:rgba(0,0,0,0)}html.theme--documenter-dark .hero.is-dark .navbar .navbar-dropdown .navbar-item:hover,html.theme--documenter-dark .content kbd.hero .navbar .navbar-dropdown .navbar-item:hover{background-color:rgba(0,0,0,0)}html.theme--documenter-dark .hero.is-primary .navbar .navbar-dropdown .navbar-item:hover,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .navbar .navbar-dropdown .navbar-item:hover{background-color:rgba(0,0,0,0)}html.theme--documenter-dark .hero.is-link .navbar .navbar-dropdown .navbar-item:hover{background-color:rgba(0,0,0,0)}html.theme--documenter-dark .hero.is-info .navbar .navbar-dropdown .navbar-item:hover{background-color:rgba(0,0,0,0)}html.theme--documenter-dark .hero.is-success .navbar .navbar-dropdown .navbar-item:hover{background-color:rgba(0,0,0,0)}html.theme--documenter-dark .hero.is-warning .navbar .navbar-dropdown .navbar-item:hover{background-color:rgba(0,0,0,0)}html.theme--documenter-dark .hero.is-danger .navbar .navbar-dropdown .navbar-item:hover{background-color:rgba(0,0,0,0)}html.theme--documenter-dark h1 .docs-heading-anchor,html.theme--documenter-dark h1 .docs-heading-anchor:hover,html.theme--documenter-dark h1 .docs-heading-anchor:visited,html.theme--documenter-dark h2 .docs-heading-anchor,html.theme--documenter-dark h2 .docs-heading-anchor:hover,html.theme--documenter-dark h2 .docs-heading-anchor:visited,html.theme--documenter-dark h3 .docs-heading-anchor,html.theme--documenter-dark h3 .docs-heading-anchor:hover,html.theme--documenter-dark h3 .docs-heading-anchor:visited,html.theme--documenter-dark h4 .docs-heading-anchor,html.theme--documenter-dark h4 .docs-heading-anchor:hover,html.theme--documenter-dark h4 .docs-heading-anchor:visited,html.theme--documenter-dark h5 .docs-heading-anchor,html.theme--documenter-dark h5 .docs-heading-anchor:hover,html.theme--documenter-dark h5 .docs-heading-anchor:visited,html.theme--documenter-dark h6 .docs-heading-anchor,html.theme--documenter-dark h6 .docs-heading-anchor:hover,html.theme--documenter-dark h6 .docs-heading-anchor:visited{color:#f2f2f2}html.theme--documenter-dark h1 .docs-heading-anchor-permalink,html.theme--documenter-dark h2 .docs-heading-anchor-permalink,html.theme--documenter-dark h3 .docs-heading-anchor-permalink,html.theme--documenter-dark h4 .docs-heading-anchor-permalink,html.theme--documenter-dark h5 .docs-heading-anchor-permalink,html.theme--documenter-dark h6 .docs-heading-anchor-permalink{visibility:hidden;vertical-align:middle;margin-left:0.5em;font-size:0.7rem}html.theme--documenter-dark h1 .docs-heading-anchor-permalink::before,html.theme--documenter-dark h2 .docs-heading-anchor-permalink::before,html.theme--documenter-dark h3 .docs-heading-anchor-permalink::before,html.theme--documenter-dark h4 .docs-heading-anchor-permalink::before,html.theme--documenter-dark h5 .docs-heading-anchor-permalink::before,html.theme--documenter-dark h6 .docs-heading-anchor-permalink::before{font-family:"Font Awesome 5 Free";font-weight:900;content:"\f0c1"}html.theme--documenter-dark h1:hover .docs-heading-anchor-permalink,html.theme--documenter-dark h2:hover .docs-heading-anchor-permalink,html.theme--documenter-dark h3:hover .docs-heading-anchor-permalink,html.theme--documenter-dark h4:hover .docs-heading-anchor-permalink,html.theme--documenter-dark h5:hover .docs-heading-anchor-permalink,html.theme--documenter-dark h6:hover .docs-heading-anchor-permalink{visibility:visible}html.theme--documenter-dark .docs-light-only{display:none !important}html.theme--documenter-dark pre{position:relative;overflow:hidden}html.theme--documenter-dark pre code,html.theme--documenter-dark pre code.hljs{padding:0 .75rem !important;overflow:auto;display:block}html.theme--documenter-dark pre code:first-of-type,html.theme--documenter-dark pre code.hljs:first-of-type{padding-top:0.5rem !important}html.theme--documenter-dark pre code:last-of-type,html.theme--documenter-dark pre code.hljs:last-of-type{padding-bottom:0.5rem !important}html.theme--documenter-dark pre .copy-button{opacity:0.2;transition:opacity 0.2s;position:absolute;right:0em;top:0em;padding:0.5em;width:2.5em;height:2.5em;background:transparent;border:none;font-family:"Font Awesome 5 Free";color:#fff;cursor:pointer;text-align:center}html.theme--documenter-dark pre .copy-button:focus,html.theme--documenter-dark pre .copy-button:hover{opacity:1;background:rgba(255,255,255,0.1);color:#1abc9c}html.theme--documenter-dark pre .copy-button.success{color:#259a12;opacity:1}html.theme--documenter-dark pre .copy-button.error{color:#cb3c33;opacity:1}html.theme--documenter-dark pre:hover .copy-button{opacity:1}html.theme--documenter-dark .admonition{background-color:#282f2f;border-style:solid;border-width:1px;border-color:#5e6d6f;border-radius:.4em;font-size:15px}html.theme--documenter-dark .admonition strong{color:currentColor}html.theme--documenter-dark .admonition.is-small,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.admonition{font-size:.85em}html.theme--documenter-dark .admonition.is-medium{font-size:1.25rem}html.theme--documenter-dark .admonition.is-large{font-size:1.5rem}html.theme--documenter-dark .admonition.is-default{background-color:#282f2f;border-color:#5e6d6f}html.theme--documenter-dark .admonition.is-default>.admonition-header{background-color:#5e6d6f;color:#fff}html.theme--documenter-dark .admonition.is-default>.admonition-body{color:#fff}html.theme--documenter-dark .admonition.is-info{background-color:#282f2f;border-color:#024c7d}html.theme--documenter-dark .admonition.is-info>.admonition-header{background-color:#024c7d;color:#fff}html.theme--documenter-dark .admonition.is-info>.admonition-body{color:#fff}html.theme--documenter-dark .admonition.is-success{background-color:#282f2f;border-color:#008438}html.theme--documenter-dark .admonition.is-success>.admonition-header{background-color:#008438;color:#fff}html.theme--documenter-dark .admonition.is-success>.admonition-body{color:#fff}html.theme--documenter-dark .admonition.is-warning{background-color:#282f2f;border-color:#ad8100}html.theme--documenter-dark .admonition.is-warning>.admonition-header{background-color:#ad8100;color:#fff}html.theme--documenter-dark .admonition.is-warning>.admonition-body{color:#fff}html.theme--documenter-dark .admonition.is-danger{background-color:#282f2f;border-color:#9e1b0d}html.theme--documenter-dark .admonition.is-danger>.admonition-header{background-color:#9e1b0d;color:#fff}html.theme--documenter-dark .admonition.is-danger>.admonition-body{color:#fff}html.theme--documenter-dark .admonition.is-compat{background-color:#282f2f;border-color:#137886}html.theme--documenter-dark .admonition.is-compat>.admonition-header{background-color:#137886;color:#fff}html.theme--documenter-dark .admonition.is-compat>.admonition-body{color:#fff}html.theme--documenter-dark .admonition-header{color:#fff;background-color:#5e6d6f;align-items:center;font-weight:700;justify-content:space-between;line-height:1.25;padding:0.5rem .75rem;position:relative}html.theme--documenter-dark .admonition-header:before{font-family:"Font Awesome 5 Free";font-weight:900;margin-right:.75rem;content:"\f06a"}html.theme--documenter-dark .admonition-body{color:#fff;padding:0.5rem .75rem}html.theme--documenter-dark .admonition-body pre{background-color:#282f2f}html.theme--documenter-dark .admonition-body code{background-color:rgba(255,255,255,0.05)}html.theme--documenter-dark .docstring{margin-bottom:1em;background-color:rgba(0,0,0,0);border:1px solid #5e6d6f;box-shadow:none;max-width:100%}html.theme--documenter-dark .docstring>header{display:flex;flex-grow:1;align-items:stretch;padding:0.5rem .75rem;background-color:#282f2f;box-shadow:0 1px 2px rgba(10,10,10,0.1);box-shadow:none;border-bottom:1px solid #5e6d6f}html.theme--documenter-dark .docstring>header code{background-color:transparent}html.theme--documenter-dark .docstring>header .docstring-binding{margin-right:0.3em}html.theme--documenter-dark .docstring>header .docstring-category{margin-left:0.3em}html.theme--documenter-dark .docstring>section{position:relative;padding:.75rem .75rem;border-bottom:1px solid #5e6d6f}html.theme--documenter-dark .docstring>section:last-child{border-bottom:none}html.theme--documenter-dark .docstring>section>a.docs-sourcelink{transition:opacity 0.3s;opacity:0;position:absolute;right:.375rem;bottom:.375rem}html.theme--documenter-dark .docstring>section>a.docs-sourcelink:focus{opacity:1 !important}html.theme--documenter-dark .docstring:hover>section>a.docs-sourcelink{opacity:0.2}html.theme--documenter-dark .docstring:focus-within>section>a.docs-sourcelink{opacity:0.2}html.theme--documenter-dark .docstring>section:hover a.docs-sourcelink{opacity:1}html.theme--documenter-dark .documenter-example-output{background-color:#1f2424}html.theme--documenter-dark .outdated-warning-overlay{position:fixed;top:0;left:0;right:0;box-shadow:0 0 10px rgba(0,0,0,0.3);z-index:999;background-color:#282f2f;color:#fff;border-bottom:3px solid #9e1b0d;padding:10px 35px;text-align:center;font-size:15px}html.theme--documenter-dark .outdated-warning-overlay .outdated-warning-closer{position:absolute;top:calc(50% - 10px);right:18px;cursor:pointer;width:12px}html.theme--documenter-dark .outdated-warning-overlay a{color:#1abc9c}html.theme--documenter-dark .outdated-warning-overlay a:hover{color:#1dd2af}html.theme--documenter-dark .content pre{border:1px solid #5e6d6f}html.theme--documenter-dark .content code{font-weight:inherit}html.theme--documenter-dark .content a code{color:#1abc9c}html.theme--documenter-dark .content h1 code,html.theme--documenter-dark .content h2 code,html.theme--documenter-dark .content h3 code,html.theme--documenter-dark .content h4 code,html.theme--documenter-dark .content h5 code,html.theme--documenter-dark .content h6 code{color:#f2f2f2}html.theme--documenter-dark .content table{display:block;width:initial;max-width:100%;overflow-x:auto}html.theme--documenter-dark .content blockquote>ul:first-child,html.theme--documenter-dark .content blockquote>ol:first-child,html.theme--documenter-dark .content .admonition-body>ul:first-child,html.theme--documenter-dark .content .admonition-body>ol:first-child{margin-top:0}html.theme--documenter-dark pre,html.theme--documenter-dark code{font-variant-ligatures:no-contextual}html.theme--documenter-dark .breadcrumb a.is-disabled{cursor:default;pointer-events:none}html.theme--documenter-dark .breadcrumb a.is-disabled,html.theme--documenter-dark .breadcrumb a.is-disabled:hover{color:#f2f2f2}html.theme--documenter-dark .hljs{background:initial !important}html.theme--documenter-dark .katex .katex-mathml{top:0;right:0}html.theme--documenter-dark .katex-display,html.theme--documenter-dark mjx-container,html.theme--documenter-dark .MathJax_Display{margin:0.5em 0 !important}html.theme--documenter-dark html{-moz-osx-font-smoothing:auto;-webkit-font-smoothing:auto}html.theme--documenter-dark li.no-marker{list-style:none}html.theme--documenter-dark #documenter .docs-main>article{overflow-wrap:break-word}html.theme--documenter-dark #documenter .docs-main>article .math-container{overflow-x:auto;overflow-y:hidden}@media screen and (min-width: 1056px){html.theme--documenter-dark #documenter .docs-main{max-width:52rem;margin-left:20rem;padding-right:1rem}}@media screen and (max-width: 1055px){html.theme--documenter-dark #documenter .docs-main{width:100%}html.theme--documenter-dark #documenter .docs-main>article{max-width:52rem;margin-left:auto;margin-right:auto;margin-bottom:1rem;padding:0 1rem}html.theme--documenter-dark #documenter .docs-main>header,html.theme--documenter-dark #documenter .docs-main>nav{max-width:100%;width:100%;margin:0}}html.theme--documenter-dark #documenter .docs-main header.docs-navbar{background-color:#1f2424;border-bottom:1px solid #5e6d6f;z-index:2;min-height:4rem;margin-bottom:1rem;display:flex}html.theme--documenter-dark #documenter .docs-main header.docs-navbar .breadcrumb{flex-grow:1}html.theme--documenter-dark #documenter .docs-main header.docs-navbar .docs-right{display:flex;white-space:nowrap}html.theme--documenter-dark #documenter .docs-main header.docs-navbar .docs-right .docs-icon,html.theme--documenter-dark #documenter .docs-main header.docs-navbar .docs-right .docs-label,html.theme--documenter-dark #documenter .docs-main header.docs-navbar .docs-right .docs-sidebar-button{display:inline-block}html.theme--documenter-dark #documenter .docs-main header.docs-navbar .docs-right .docs-label{padding:0;margin-left:0.3em}html.theme--documenter-dark #documenter .docs-main header.docs-navbar .docs-right .docs-settings-button{margin:auto 0 auto 1rem}html.theme--documenter-dark #documenter .docs-main header.docs-navbar .docs-right .docs-sidebar-button{font-size:1.5rem;margin:auto 0 auto 1rem}html.theme--documenter-dark #documenter .docs-main header.docs-navbar>*{margin:auto 0}@media screen and (max-width: 1055px){html.theme--documenter-dark #documenter .docs-main header.docs-navbar{position:sticky;top:0;padding:0 1rem;transition-property:top, box-shadow;-webkit-transition-property:top, box-shadow;transition-duration:0.3s;-webkit-transition-duration:0.3s}html.theme--documenter-dark #documenter .docs-main header.docs-navbar.headroom--not-top{box-shadow:.2rem 0rem .4rem #171717;transition-duration:0.7s;-webkit-transition-duration:0.7s}html.theme--documenter-dark #documenter .docs-main header.docs-navbar.headroom--unpinned.headroom--not-top.headroom--not-bottom{top:-4.5rem;transition-duration:0.7s;-webkit-transition-duration:0.7s}}html.theme--documenter-dark #documenter .docs-main section.footnotes{border-top:1px solid #5e6d6f}html.theme--documenter-dark #documenter .docs-main section.footnotes li .tag:first-child,html.theme--documenter-dark #documenter .docs-main section.footnotes li .docstring>section>a.docs-sourcelink:first-child,html.theme--documenter-dark #documenter .docs-main section.footnotes li .content kbd:first-child,html.theme--documenter-dark .content #documenter .docs-main section.footnotes li kbd:first-child{margin-right:1em;margin-bottom:0.4em}html.theme--documenter-dark #documenter .docs-main .docs-footer{display:flex;flex-wrap:wrap;margin-left:0;margin-right:0;border-top:1px solid #5e6d6f;padding-top:1rem;padding-bottom:1rem}@media screen and (max-width: 1055px){html.theme--documenter-dark #documenter .docs-main .docs-footer{padding-left:1rem;padding-right:1rem}}html.theme--documenter-dark #documenter .docs-main .docs-footer .docs-footer-nextpage,html.theme--documenter-dark #documenter .docs-main .docs-footer .docs-footer-prevpage{flex-grow:1}html.theme--documenter-dark #documenter .docs-main .docs-footer .docs-footer-nextpage{text-align:right}html.theme--documenter-dark #documenter .docs-main .docs-footer .flexbox-break{flex-basis:100%;height:0}html.theme--documenter-dark #documenter .docs-main .docs-footer .footer-message{font-size:0.8em;margin:0.5em auto 0 auto;text-align:center}html.theme--documenter-dark #documenter .docs-sidebar{display:flex;flex-direction:column;color:#fff;background-color:#282f2f;border-right:1px solid #5e6d6f;padding:0;flex:0 0 18rem;z-index:5;font-size:15px;position:fixed;left:-18rem;width:18rem;height:100%;transition:left 0.3s}html.theme--documenter-dark #documenter .docs-sidebar.visible{left:0;box-shadow:.4rem 0rem .8rem #171717}@media screen and (min-width: 1056px){html.theme--documenter-dark #documenter .docs-sidebar.visible{box-shadow:none}}@media screen and (min-width: 1056px){html.theme--documenter-dark #documenter .docs-sidebar{left:0;top:0}}html.theme--documenter-dark #documenter .docs-sidebar .docs-logo{margin-top:1rem;padding:0 1rem}html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img{max-height:6rem;margin:auto}html.theme--documenter-dark #documenter .docs-sidebar .docs-package-name{flex-shrink:0;font-size:1.5rem;font-weight:700;text-align:center;white-space:nowrap;overflow:hidden;padding:0.5rem 0}html.theme--documenter-dark #documenter .docs-sidebar .docs-package-name .docs-autofit{max-width:16.2rem}html.theme--documenter-dark #documenter .docs-sidebar .docs-package-name a,html.theme--documenter-dark #documenter .docs-sidebar .docs-package-name a:hover{color:#fff}html.theme--documenter-dark #documenter .docs-sidebar .docs-version-selector{border-top:1px solid #5e6d6f;display:none;padding:0.5rem}html.theme--documenter-dark #documenter .docs-sidebar .docs-version-selector.visible{display:flex}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu{flex-grow:1;user-select:none;border-top:1px solid #5e6d6f;padding-bottom:1.5rem}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu>li>.tocitem{font-weight:bold}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu>li li{font-size:14.25px;margin-left:1em;border-left:1px solid #5e6d6f}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu input.collapse-toggle{display:none}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu ul.collapsed{display:none}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu input:checked~ul.collapsed{display:block}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu label.tocitem{display:flex}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu label.tocitem .docs-label{flex-grow:2}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu label.tocitem .docs-chevron{display:inline-block;font-style:normal;font-variant:normal;text-rendering:auto;line-height:1;font-size:11.25px;margin-left:1rem;margin-top:auto;margin-bottom:auto}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu label.tocitem .docs-chevron::before{font-family:"Font Awesome 5 Free";font-weight:900;content:"\f054"}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu input:checked~label.tocitem .docs-chevron::before{content:"\f078"}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu .tocitem{display:block;padding:0.5rem 0.5rem}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu .tocitem,html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu .tocitem:hover{color:#fff;background:#282f2f}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu a.tocitem:hover,html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu label.tocitem:hover{color:#fff;background-color:#32393a}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu li.is-active{border-top:1px solid #5e6d6f;border-bottom:1px solid #5e6d6f;background-color:#1f2424}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu li.is-active .tocitem,html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu li.is-active .tocitem:hover{background-color:#1f2424;color:#fff}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu li.is-active ul.internal .tocitem:hover{background-color:#32393a;color:#fff}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu>li.is-active:first-child{border-top:none}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu ul.internal{margin:0 0.5rem 0.5rem;border-top:1px solid #5e6d6f}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu ul.internal li{font-size:12.75px;border-left:none;margin-left:0;margin-top:0.5rem}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu ul.internal .tocitem{width:100%;padding:0}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu ul.internal .tocitem::before{content:"⚬";margin-right:0.4em}html.theme--documenter-dark #documenter .docs-sidebar form.docs-search{margin:auto;margin-top:0.5rem;margin-bottom:0.5rem}html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input{width:14.4rem}@media screen and (min-width: 1056px){html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu{overflow-y:auto;-webkit-overflow-scroll:touch}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu::-webkit-scrollbar{width:.3rem;background:none}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu::-webkit-scrollbar-thumb{border-radius:5px 0px 0px 5px;background:#3b4445}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu::-webkit-scrollbar-thumb:hover{background:#4e5a5c}}@media screen and (max-width: 1055px){html.theme--documenter-dark #documenter .docs-sidebar{overflow-y:auto;-webkit-overflow-scroll:touch}html.theme--documenter-dark #documenter .docs-sidebar::-webkit-scrollbar{width:.3rem;background:none}html.theme--documenter-dark #documenter .docs-sidebar::-webkit-scrollbar-thumb{border-radius:5px 0px 0px 5px;background:#3b4445}html.theme--documenter-dark #documenter .docs-sidebar::-webkit-scrollbar-thumb:hover{background:#4e5a5c}}html.theme--documenter-dark #documenter .docs-main #documenter-search-info{margin-bottom:1rem}html.theme--documenter-dark #documenter .docs-main #documenter-search-results{list-style-type:circle;list-style-position:outside}html.theme--documenter-dark #documenter .docs-main #documenter-search-results li{margin-left:2rem}html.theme--documenter-dark #documenter .docs-main #documenter-search-results .docs-highlight{background-color:yellow}html.theme--documenter-dark{background-color:#1f2424;font-size:16px;min-width:300px;overflow-x:auto;overflow-y:scroll;text-rendering:optimizeLegibility;text-size-adjust:100%}html.theme--documenter-dark .ansi span.sgr1{font-weight:bolder}html.theme--documenter-dark .ansi span.sgr2{font-weight:lighter}html.theme--documenter-dark .ansi span.sgr3{font-style:italic}html.theme--documenter-dark .ansi span.sgr4{text-decoration:underline}html.theme--documenter-dark .ansi span.sgr7{color:#1f2424;background-color:#fff}html.theme--documenter-dark .ansi span.sgr8{color:transparent}html.theme--documenter-dark .ansi span.sgr8 span{color:transparent}html.theme--documenter-dark .ansi span.sgr9{text-decoration:line-through}html.theme--documenter-dark .ansi span.sgr30{color:#242424}html.theme--documenter-dark .ansi span.sgr31{color:#f6705f}html.theme--documenter-dark .ansi span.sgr32{color:#4fb43a}html.theme--documenter-dark .ansi span.sgr33{color:#f4c72f}html.theme--documenter-dark .ansi span.sgr34{color:#7587f0}html.theme--documenter-dark .ansi span.sgr35{color:#bc89d3}html.theme--documenter-dark .ansi span.sgr36{color:#49b6ca}html.theme--documenter-dark .ansi span.sgr37{color:#b3bdbe}html.theme--documenter-dark .ansi span.sgr40{background-color:#242424}html.theme--documenter-dark .ansi span.sgr41{background-color:#f6705f}html.theme--documenter-dark .ansi span.sgr42{background-color:#4fb43a}html.theme--documenter-dark .ansi span.sgr43{background-color:#f4c72f}html.theme--documenter-dark .ansi span.sgr44{background-color:#7587f0}html.theme--documenter-dark .ansi span.sgr45{background-color:#bc89d3}html.theme--documenter-dark .ansi span.sgr46{background-color:#49b6ca}html.theme--documenter-dark .ansi span.sgr47{background-color:#b3bdbe}html.theme--documenter-dark .ansi span.sgr90{color:#92a0a2}html.theme--documenter-dark .ansi span.sgr91{color:#ff8674}html.theme--documenter-dark .ansi span.sgr92{color:#79d462}html.theme--documenter-dark .ansi span.sgr93{color:#ffe76b}html.theme--documenter-dark .ansi span.sgr94{color:#8a98ff}html.theme--documenter-dark .ansi span.sgr95{color:#d2a4e6}html.theme--documenter-dark .ansi span.sgr96{color:#6bc8db}html.theme--documenter-dark .ansi span.sgr97{color:#ecf0f1}html.theme--documenter-dark .ansi span.sgr100{background-color:#92a0a2}html.theme--documenter-dark .ansi span.sgr101{background-color:#ff8674}html.theme--documenter-dark .ansi span.sgr102{background-color:#79d462}html.theme--documenter-dark .ansi span.sgr103{background-color:#ffe76b}html.theme--documenter-dark .ansi span.sgr104{background-color:#8a98ff}html.theme--documenter-dark .ansi span.sgr105{background-color:#d2a4e6}html.theme--documenter-dark .ansi span.sgr106{background-color:#6bc8db}html.theme--documenter-dark .ansi span.sgr107{background-color:#ecf0f1}html.theme--documenter-dark code.language-julia-repl>span.hljs-meta{color:#4fb43a;font-weight:bolder}html.theme--documenter-dark .hljs{background:#2b2b2b;color:#f8f8f2}html.theme--documenter-dark .hljs-comment,html.theme--documenter-dark .hljs-quote{color:#d4d0ab}html.theme--documenter-dark .hljs-variable,html.theme--documenter-dark .hljs-template-variable,html.theme--documenter-dark .hljs-tag,html.theme--documenter-dark .hljs-name,html.theme--documenter-dark .hljs-selector-id,html.theme--documenter-dark .hljs-selector-class,html.theme--documenter-dark .hljs-regexp,html.theme--documenter-dark .hljs-deletion{color:#ffa07a}html.theme--documenter-dark .hljs-number,html.theme--documenter-dark .hljs-built_in,html.theme--documenter-dark .hljs-literal,html.theme--documenter-dark .hljs-type,html.theme--documenter-dark .hljs-params,html.theme--documenter-dark .hljs-meta,html.theme--documenter-dark .hljs-link{color:#f5ab35}html.theme--documenter-dark .hljs-attribute{color:#ffd700}html.theme--documenter-dark .hljs-string,html.theme--documenter-dark .hljs-symbol,html.theme--documenter-dark .hljs-bullet,html.theme--documenter-dark .hljs-addition{color:#abe338}html.theme--documenter-dark .hljs-title,html.theme--documenter-dark .hljs-section{color:#00e0e0}html.theme--documenter-dark .hljs-keyword,html.theme--documenter-dark .hljs-selector-tag{color:#dcc6e0}html.theme--documenter-dark .hljs-emphasis{font-style:italic}html.theme--documenter-dark .hljs-strong{font-weight:bold}@media screen and (-ms-high-contrast: active){html.theme--documenter-dark .hljs-addition,html.theme--documenter-dark .hljs-attribute,html.theme--documenter-dark .hljs-built_in,html.theme--documenter-dark .hljs-bullet,html.theme--documenter-dark .hljs-comment,html.theme--documenter-dark .hljs-link,html.theme--documenter-dark .hljs-literal,html.theme--documenter-dark .hljs-meta,html.theme--documenter-dark .hljs-number,html.theme--documenter-dark .hljs-params,html.theme--documenter-dark .hljs-string,html.theme--documenter-dark .hljs-symbol,html.theme--documenter-dark .hljs-type,html.theme--documenter-dark .hljs-quote{color:highlight}html.theme--documenter-dark .hljs-keyword,html.theme--documenter-dark .hljs-selector-tag{font-weight:bold}}html.theme--documenter-dark .hljs-subst{color:#f8f8f2} +*/}html.theme--documenter-dark html{background-color:#1f2424;font-size:16px;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;min-width:300px;overflow-x:auto;overflow-y:scroll;text-rendering:optimizeLegibility;text-size-adjust:100%}html.theme--documenter-dark article,html.theme--documenter-dark aside,html.theme--documenter-dark figure,html.theme--documenter-dark footer,html.theme--documenter-dark header,html.theme--documenter-dark hgroup,html.theme--documenter-dark section{display:block}html.theme--documenter-dark body,html.theme--documenter-dark button,html.theme--documenter-dark input,html.theme--documenter-dark optgroup,html.theme--documenter-dark select,html.theme--documenter-dark textarea{font-family:"Lato Medium",-apple-system,BlinkMacSystemFont,"Segoe UI","Helvetica Neue","Helvetica","Arial",sans-serif}html.theme--documenter-dark code,html.theme--documenter-dark pre{-moz-osx-font-smoothing:auto;-webkit-font-smoothing:auto;font-family:"JuliaMono","SFMono-Regular","Menlo","Consolas","Liberation Mono","DejaVu Sans Mono",monospace}html.theme--documenter-dark body{color:#fff;font-size:1em;font-weight:400;line-height:1.5}html.theme--documenter-dark a{color:#1abc9c;cursor:pointer;text-decoration:none}html.theme--documenter-dark a strong{color:currentColor}html.theme--documenter-dark a:hover{color:#1dd2af}html.theme--documenter-dark code{background-color:rgba(255,255,255,0.05);color:#ececec;font-size:.875em;font-weight:normal;padding:.1em}html.theme--documenter-dark hr{background-color:#282f2f;border:none;display:block;height:2px;margin:1.5rem 0}html.theme--documenter-dark img{height:auto;max-width:100%}html.theme--documenter-dark input[type="checkbox"],html.theme--documenter-dark input[type="radio"]{vertical-align:baseline}html.theme--documenter-dark small{font-size:.875em}html.theme--documenter-dark span{font-style:inherit;font-weight:inherit}html.theme--documenter-dark strong{color:#f2f2f2;font-weight:700}html.theme--documenter-dark fieldset{border:none}html.theme--documenter-dark pre{-webkit-overflow-scrolling:touch;background-color:#282f2f;color:#fff;font-size:.875em;overflow-x:auto;padding:1.25rem 1.5rem;white-space:pre;word-wrap:normal}html.theme--documenter-dark pre code{background-color:transparent;color:currentColor;font-size:1em;padding:0}html.theme--documenter-dark table td,html.theme--documenter-dark table th{vertical-align:top}html.theme--documenter-dark table td:not([align]),html.theme--documenter-dark table th:not([align]){text-align:inherit}html.theme--documenter-dark table th{color:#f2f2f2}html.theme--documenter-dark .box{background-color:#343c3d;border-radius:8px;box-shadow:none;color:#fff;display:block;padding:1.25rem}html.theme--documenter-dark a.box:hover,html.theme--documenter-dark a.box:focus{box-shadow:0 0.5em 1em -0.125em rgba(10,10,10,0.1),0 0 0 1px #1abc9c}html.theme--documenter-dark a.box:active{box-shadow:inset 0 1px 2px rgba(10,10,10,0.2),0 0 0 1px #1abc9c}html.theme--documenter-dark .button{background-color:#282f2f;border-color:#4c5759;border-width:1px;color:#375a7f;cursor:pointer;justify-content:center;padding-bottom:calc(0.5em - 1px);padding-left:1em;padding-right:1em;padding-top:calc(0.5em - 1px);text-align:center;white-space:nowrap}html.theme--documenter-dark .button strong{color:inherit}html.theme--documenter-dark .button .icon,html.theme--documenter-dark .button .icon.is-small,html.theme--documenter-dark .button #documenter .docs-sidebar form.docs-search>input.icon,html.theme--documenter-dark #documenter .docs-sidebar .button form.docs-search>input.icon,html.theme--documenter-dark .button .icon.is-medium,html.theme--documenter-dark .button .icon.is-large{height:1.5em;width:1.5em}html.theme--documenter-dark .button .icon:first-child:not(:last-child){margin-left:calc(-0.5em - 1px);margin-right:.25em}html.theme--documenter-dark .button .icon:last-child:not(:first-child){margin-left:.25em;margin-right:calc(-0.5em - 1px)}html.theme--documenter-dark .button .icon:first-child:last-child{margin-left:calc(-0.5em - 1px);margin-right:calc(-0.5em - 1px)}html.theme--documenter-dark .button:hover,html.theme--documenter-dark .button.is-hovered{border-color:#8c9b9d;color:#f2f2f2}html.theme--documenter-dark .button:focus,html.theme--documenter-dark .button.is-focused{border-color:#8c9b9d;color:#17a689}html.theme--documenter-dark .button:focus:not(:active),html.theme--documenter-dark .button.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(26,188,156,0.25)}html.theme--documenter-dark .button:active,html.theme--documenter-dark .button.is-active{border-color:#343c3d;color:#f2f2f2}html.theme--documenter-dark .button.is-text{background-color:transparent;border-color:transparent;color:#fff;text-decoration:underline}html.theme--documenter-dark .button.is-text:hover,html.theme--documenter-dark .button.is-text.is-hovered,html.theme--documenter-dark .button.is-text:focus,html.theme--documenter-dark .button.is-text.is-focused{background-color:#282f2f;color:#f2f2f2}html.theme--documenter-dark .button.is-text:active,html.theme--documenter-dark .button.is-text.is-active{background-color:#1d2122;color:#f2f2f2}html.theme--documenter-dark .button.is-text[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-text{background-color:transparent;border-color:transparent;box-shadow:none}html.theme--documenter-dark .button.is-ghost{background:none;border-color:rgba(0,0,0,0);color:#1abc9c;text-decoration:none}html.theme--documenter-dark .button.is-ghost:hover,html.theme--documenter-dark .button.is-ghost.is-hovered{color:#1abc9c;text-decoration:underline}html.theme--documenter-dark .button.is-white{background-color:#fff;border-color:transparent;color:#0a0a0a}html.theme--documenter-dark .button.is-white:hover,html.theme--documenter-dark .button.is-white.is-hovered{background-color:#f9f9f9;border-color:transparent;color:#0a0a0a}html.theme--documenter-dark .button.is-white:focus,html.theme--documenter-dark .button.is-white.is-focused{border-color:transparent;color:#0a0a0a}html.theme--documenter-dark .button.is-white:focus:not(:active),html.theme--documenter-dark .button.is-white.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(255,255,255,0.25)}html.theme--documenter-dark .button.is-white:active,html.theme--documenter-dark .button.is-white.is-active{background-color:#f2f2f2;border-color:transparent;color:#0a0a0a}html.theme--documenter-dark .button.is-white[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-white{background-color:#fff;border-color:#fff;box-shadow:none}html.theme--documenter-dark .button.is-white.is-inverted{background-color:#0a0a0a;color:#fff}html.theme--documenter-dark .button.is-white.is-inverted:hover,html.theme--documenter-dark .button.is-white.is-inverted.is-hovered{background-color:#000}html.theme--documenter-dark .button.is-white.is-inverted[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-white.is-inverted{background-color:#0a0a0a;border-color:transparent;box-shadow:none;color:#fff}html.theme--documenter-dark .button.is-white.is-loading::after{border-color:transparent transparent #0a0a0a #0a0a0a !important}html.theme--documenter-dark .button.is-white.is-outlined{background-color:transparent;border-color:#fff;color:#fff}html.theme--documenter-dark .button.is-white.is-outlined:hover,html.theme--documenter-dark .button.is-white.is-outlined.is-hovered,html.theme--documenter-dark .button.is-white.is-outlined:focus,html.theme--documenter-dark .button.is-white.is-outlined.is-focused{background-color:#fff;border-color:#fff;color:#0a0a0a}html.theme--documenter-dark .button.is-white.is-outlined.is-loading::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-white.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-white.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-white.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-white.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #0a0a0a #0a0a0a !important}html.theme--documenter-dark .button.is-white.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-white.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}html.theme--documenter-dark .button.is-white.is-inverted.is-outlined{background-color:transparent;border-color:#0a0a0a;color:#0a0a0a}html.theme--documenter-dark .button.is-white.is-inverted.is-outlined:hover,html.theme--documenter-dark .button.is-white.is-inverted.is-outlined.is-hovered,html.theme--documenter-dark .button.is-white.is-inverted.is-outlined:focus,html.theme--documenter-dark .button.is-white.is-inverted.is-outlined.is-focused{background-color:#0a0a0a;color:#fff}html.theme--documenter-dark .button.is-white.is-inverted.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-white.is-inverted.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-white.is-inverted.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-white.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-white.is-inverted.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-white.is-inverted.is-outlined{background-color:transparent;border-color:#0a0a0a;box-shadow:none;color:#0a0a0a}html.theme--documenter-dark .button.is-black{background-color:#0a0a0a;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-black:hover,html.theme--documenter-dark .button.is-black.is-hovered{background-color:#040404;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-black:focus,html.theme--documenter-dark .button.is-black.is-focused{border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-black:focus:not(:active),html.theme--documenter-dark .button.is-black.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(10,10,10,0.25)}html.theme--documenter-dark .button.is-black:active,html.theme--documenter-dark .button.is-black.is-active{background-color:#000;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-black[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-black{background-color:#0a0a0a;border-color:#0a0a0a;box-shadow:none}html.theme--documenter-dark .button.is-black.is-inverted{background-color:#fff;color:#0a0a0a}html.theme--documenter-dark .button.is-black.is-inverted:hover,html.theme--documenter-dark .button.is-black.is-inverted.is-hovered{background-color:#f2f2f2}html.theme--documenter-dark .button.is-black.is-inverted[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-black.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#0a0a0a}html.theme--documenter-dark .button.is-black.is-loading::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-black.is-outlined{background-color:transparent;border-color:#0a0a0a;color:#0a0a0a}html.theme--documenter-dark .button.is-black.is-outlined:hover,html.theme--documenter-dark .button.is-black.is-outlined.is-hovered,html.theme--documenter-dark .button.is-black.is-outlined:focus,html.theme--documenter-dark .button.is-black.is-outlined.is-focused{background-color:#0a0a0a;border-color:#0a0a0a;color:#fff}html.theme--documenter-dark .button.is-black.is-outlined.is-loading::after{border-color:transparent transparent #0a0a0a #0a0a0a !important}html.theme--documenter-dark .button.is-black.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-black.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-black.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-black.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-black.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-black.is-outlined{background-color:transparent;border-color:#0a0a0a;box-shadow:none;color:#0a0a0a}html.theme--documenter-dark .button.is-black.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}html.theme--documenter-dark .button.is-black.is-inverted.is-outlined:hover,html.theme--documenter-dark .button.is-black.is-inverted.is-outlined.is-hovered,html.theme--documenter-dark .button.is-black.is-inverted.is-outlined:focus,html.theme--documenter-dark .button.is-black.is-inverted.is-outlined.is-focused{background-color:#fff;color:#0a0a0a}html.theme--documenter-dark .button.is-black.is-inverted.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-black.is-inverted.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-black.is-inverted.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-black.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #0a0a0a #0a0a0a !important}html.theme--documenter-dark .button.is-black.is-inverted.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-black.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}html.theme--documenter-dark .button.is-light{background-color:#ecf0f1;border-color:transparent;color:rgba(0,0,0,0.7)}html.theme--documenter-dark .button.is-light:hover,html.theme--documenter-dark .button.is-light.is-hovered{background-color:#e5eaec;border-color:transparent;color:rgba(0,0,0,0.7)}html.theme--documenter-dark .button.is-light:focus,html.theme--documenter-dark .button.is-light.is-focused{border-color:transparent;color:rgba(0,0,0,0.7)}html.theme--documenter-dark .button.is-light:focus:not(:active),html.theme--documenter-dark .button.is-light.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(236,240,241,0.25)}html.theme--documenter-dark .button.is-light:active,html.theme--documenter-dark .button.is-light.is-active{background-color:#dde4e6;border-color:transparent;color:rgba(0,0,0,0.7)}html.theme--documenter-dark .button.is-light[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-light{background-color:#ecf0f1;border-color:#ecf0f1;box-shadow:none}html.theme--documenter-dark .button.is-light.is-inverted{background-color:rgba(0,0,0,0.7);color:#ecf0f1}html.theme--documenter-dark .button.is-light.is-inverted:hover,html.theme--documenter-dark .button.is-light.is-inverted.is-hovered{background-color:rgba(0,0,0,0.7)}html.theme--documenter-dark .button.is-light.is-inverted[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-light.is-inverted{background-color:rgba(0,0,0,0.7);border-color:transparent;box-shadow:none;color:#ecf0f1}html.theme--documenter-dark .button.is-light.is-loading::after{border-color:transparent transparent rgba(0,0,0,0.7) rgba(0,0,0,0.7) !important}html.theme--documenter-dark .button.is-light.is-outlined{background-color:transparent;border-color:#ecf0f1;color:#ecf0f1}html.theme--documenter-dark .button.is-light.is-outlined:hover,html.theme--documenter-dark .button.is-light.is-outlined.is-hovered,html.theme--documenter-dark .button.is-light.is-outlined:focus,html.theme--documenter-dark .button.is-light.is-outlined.is-focused{background-color:#ecf0f1;border-color:#ecf0f1;color:rgba(0,0,0,0.7)}html.theme--documenter-dark .button.is-light.is-outlined.is-loading::after{border-color:transparent transparent #ecf0f1 #ecf0f1 !important}html.theme--documenter-dark .button.is-light.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-light.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-light.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-light.is-outlined.is-loading.is-focused::after{border-color:transparent transparent rgba(0,0,0,0.7) rgba(0,0,0,0.7) !important}html.theme--documenter-dark .button.is-light.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-light.is-outlined{background-color:transparent;border-color:#ecf0f1;box-shadow:none;color:#ecf0f1}html.theme--documenter-dark .button.is-light.is-inverted.is-outlined{background-color:transparent;border-color:rgba(0,0,0,0.7);color:rgba(0,0,0,0.7)}html.theme--documenter-dark .button.is-light.is-inverted.is-outlined:hover,html.theme--documenter-dark .button.is-light.is-inverted.is-outlined.is-hovered,html.theme--documenter-dark .button.is-light.is-inverted.is-outlined:focus,html.theme--documenter-dark .button.is-light.is-inverted.is-outlined.is-focused{background-color:rgba(0,0,0,0.7);color:#ecf0f1}html.theme--documenter-dark .button.is-light.is-inverted.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-light.is-inverted.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-light.is-inverted.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-light.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #ecf0f1 #ecf0f1 !important}html.theme--documenter-dark .button.is-light.is-inverted.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-light.is-inverted.is-outlined{background-color:transparent;border-color:rgba(0,0,0,0.7);box-shadow:none;color:rgba(0,0,0,0.7)}html.theme--documenter-dark .button.is-dark,html.theme--documenter-dark .content kbd.button{background-color:#282f2f;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-dark:hover,html.theme--documenter-dark .content kbd.button:hover,html.theme--documenter-dark .button.is-dark.is-hovered,html.theme--documenter-dark .content kbd.button.is-hovered{background-color:#232829;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-dark:focus,html.theme--documenter-dark .content kbd.button:focus,html.theme--documenter-dark .button.is-dark.is-focused,html.theme--documenter-dark .content kbd.button.is-focused{border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-dark:focus:not(:active),html.theme--documenter-dark .content kbd.button:focus:not(:active),html.theme--documenter-dark .button.is-dark.is-focused:not(:active),html.theme--documenter-dark .content kbd.button.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(40,47,47,0.25)}html.theme--documenter-dark .button.is-dark:active,html.theme--documenter-dark .content kbd.button:active,html.theme--documenter-dark .button.is-dark.is-active,html.theme--documenter-dark .content kbd.button.is-active{background-color:#1d2122;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-dark[disabled],html.theme--documenter-dark .content kbd.button[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-dark,fieldset[disabled] html.theme--documenter-dark .content kbd.button{background-color:#282f2f;border-color:#282f2f;box-shadow:none}html.theme--documenter-dark .button.is-dark.is-inverted,html.theme--documenter-dark .content kbd.button.is-inverted{background-color:#fff;color:#282f2f}html.theme--documenter-dark .button.is-dark.is-inverted:hover,html.theme--documenter-dark .content kbd.button.is-inverted:hover,html.theme--documenter-dark .button.is-dark.is-inverted.is-hovered,html.theme--documenter-dark .content kbd.button.is-inverted.is-hovered{background-color:#f2f2f2}html.theme--documenter-dark .button.is-dark.is-inverted[disabled],html.theme--documenter-dark .content kbd.button.is-inverted[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-dark.is-inverted,fieldset[disabled] html.theme--documenter-dark .content kbd.button.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#282f2f}html.theme--documenter-dark .button.is-dark.is-loading::after,html.theme--documenter-dark .content kbd.button.is-loading::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-dark.is-outlined,html.theme--documenter-dark .content kbd.button.is-outlined{background-color:transparent;border-color:#282f2f;color:#282f2f}html.theme--documenter-dark .button.is-dark.is-outlined:hover,html.theme--documenter-dark .content kbd.button.is-outlined:hover,html.theme--documenter-dark .button.is-dark.is-outlined.is-hovered,html.theme--documenter-dark .content kbd.button.is-outlined.is-hovered,html.theme--documenter-dark .button.is-dark.is-outlined:focus,html.theme--documenter-dark .content kbd.button.is-outlined:focus,html.theme--documenter-dark .button.is-dark.is-outlined.is-focused,html.theme--documenter-dark .content kbd.button.is-outlined.is-focused{background-color:#282f2f;border-color:#282f2f;color:#fff}html.theme--documenter-dark .button.is-dark.is-outlined.is-loading::after,html.theme--documenter-dark .content kbd.button.is-outlined.is-loading::after{border-color:transparent transparent #282f2f #282f2f !important}html.theme--documenter-dark .button.is-dark.is-outlined.is-loading:hover::after,html.theme--documenter-dark .content kbd.button.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-dark.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .content kbd.button.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-dark.is-outlined.is-loading:focus::after,html.theme--documenter-dark .content kbd.button.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-dark.is-outlined.is-loading.is-focused::after,html.theme--documenter-dark .content kbd.button.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-dark.is-outlined[disabled],html.theme--documenter-dark .content kbd.button.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-dark.is-outlined,fieldset[disabled] html.theme--documenter-dark .content kbd.button.is-outlined{background-color:transparent;border-color:#282f2f;box-shadow:none;color:#282f2f}html.theme--documenter-dark .button.is-dark.is-inverted.is-outlined,html.theme--documenter-dark .content kbd.button.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}html.theme--documenter-dark .button.is-dark.is-inverted.is-outlined:hover,html.theme--documenter-dark .content kbd.button.is-inverted.is-outlined:hover,html.theme--documenter-dark .button.is-dark.is-inverted.is-outlined.is-hovered,html.theme--documenter-dark .content kbd.button.is-inverted.is-outlined.is-hovered,html.theme--documenter-dark .button.is-dark.is-inverted.is-outlined:focus,html.theme--documenter-dark .content kbd.button.is-inverted.is-outlined:focus,html.theme--documenter-dark .button.is-dark.is-inverted.is-outlined.is-focused,html.theme--documenter-dark .content kbd.button.is-inverted.is-outlined.is-focused{background-color:#fff;color:#282f2f}html.theme--documenter-dark .button.is-dark.is-inverted.is-outlined.is-loading:hover::after,html.theme--documenter-dark .content kbd.button.is-inverted.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-dark.is-inverted.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .content kbd.button.is-inverted.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-dark.is-inverted.is-outlined.is-loading:focus::after,html.theme--documenter-dark .content kbd.button.is-inverted.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-dark.is-inverted.is-outlined.is-loading.is-focused::after,html.theme--documenter-dark .content kbd.button.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #282f2f #282f2f !important}html.theme--documenter-dark .button.is-dark.is-inverted.is-outlined[disabled],html.theme--documenter-dark .content kbd.button.is-inverted.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-dark.is-inverted.is-outlined,fieldset[disabled] html.theme--documenter-dark .content kbd.button.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}html.theme--documenter-dark .button.is-primary,html.theme--documenter-dark .docstring>section>a.button.docs-sourcelink{background-color:#375a7f;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-primary:hover,html.theme--documenter-dark .docstring>section>a.button.docs-sourcelink:hover,html.theme--documenter-dark .button.is-primary.is-hovered,html.theme--documenter-dark .docstring>section>a.button.is-hovered.docs-sourcelink{background-color:#335476;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-primary:focus,html.theme--documenter-dark .docstring>section>a.button.docs-sourcelink:focus,html.theme--documenter-dark .button.is-primary.is-focused,html.theme--documenter-dark .docstring>section>a.button.is-focused.docs-sourcelink{border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-primary:focus:not(:active),html.theme--documenter-dark .docstring>section>a.button.docs-sourcelink:focus:not(:active),html.theme--documenter-dark .button.is-primary.is-focused:not(:active),html.theme--documenter-dark .docstring>section>a.button.is-focused.docs-sourcelink:not(:active){box-shadow:0 0 0 0.125em rgba(55,90,127,0.25)}html.theme--documenter-dark .button.is-primary:active,html.theme--documenter-dark .docstring>section>a.button.docs-sourcelink:active,html.theme--documenter-dark .button.is-primary.is-active,html.theme--documenter-dark .docstring>section>a.button.is-active.docs-sourcelink{background-color:#2f4d6d;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-primary[disabled],html.theme--documenter-dark .docstring>section>a.button.docs-sourcelink[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-primary,fieldset[disabled] html.theme--documenter-dark .docstring>section>a.button.docs-sourcelink{background-color:#375a7f;border-color:#375a7f;box-shadow:none}html.theme--documenter-dark .button.is-primary.is-inverted,html.theme--documenter-dark .docstring>section>a.button.is-inverted.docs-sourcelink{background-color:#fff;color:#375a7f}html.theme--documenter-dark .button.is-primary.is-inverted:hover,html.theme--documenter-dark .docstring>section>a.button.is-inverted.docs-sourcelink:hover,html.theme--documenter-dark .button.is-primary.is-inverted.is-hovered,html.theme--documenter-dark .docstring>section>a.button.is-inverted.is-hovered.docs-sourcelink{background-color:#f2f2f2}html.theme--documenter-dark .button.is-primary.is-inverted[disabled],html.theme--documenter-dark .docstring>section>a.button.is-inverted.docs-sourcelink[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-primary.is-inverted,fieldset[disabled] html.theme--documenter-dark .docstring>section>a.button.is-inverted.docs-sourcelink{background-color:#fff;border-color:transparent;box-shadow:none;color:#375a7f}html.theme--documenter-dark .button.is-primary.is-loading::after,html.theme--documenter-dark .docstring>section>a.button.is-loading.docs-sourcelink::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-primary.is-outlined,html.theme--documenter-dark .docstring>section>a.button.is-outlined.docs-sourcelink{background-color:transparent;border-color:#375a7f;color:#375a7f}html.theme--documenter-dark .button.is-primary.is-outlined:hover,html.theme--documenter-dark .docstring>section>a.button.is-outlined.docs-sourcelink:hover,html.theme--documenter-dark .button.is-primary.is-outlined.is-hovered,html.theme--documenter-dark .docstring>section>a.button.is-outlined.is-hovered.docs-sourcelink,html.theme--documenter-dark .button.is-primary.is-outlined:focus,html.theme--documenter-dark .docstring>section>a.button.is-outlined.docs-sourcelink:focus,html.theme--documenter-dark .button.is-primary.is-outlined.is-focused,html.theme--documenter-dark .docstring>section>a.button.is-outlined.is-focused.docs-sourcelink{background-color:#375a7f;border-color:#375a7f;color:#fff}html.theme--documenter-dark .button.is-primary.is-outlined.is-loading::after,html.theme--documenter-dark .docstring>section>a.button.is-outlined.is-loading.docs-sourcelink::after{border-color:transparent transparent #375a7f #375a7f !important}html.theme--documenter-dark .button.is-primary.is-outlined.is-loading:hover::after,html.theme--documenter-dark .docstring>section>a.button.is-outlined.is-loading.docs-sourcelink:hover::after,html.theme--documenter-dark .button.is-primary.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .docstring>section>a.button.is-outlined.is-loading.is-hovered.docs-sourcelink::after,html.theme--documenter-dark .button.is-primary.is-outlined.is-loading:focus::after,html.theme--documenter-dark .docstring>section>a.button.is-outlined.is-loading.docs-sourcelink:focus::after,html.theme--documenter-dark .button.is-primary.is-outlined.is-loading.is-focused::after,html.theme--documenter-dark .docstring>section>a.button.is-outlined.is-loading.is-focused.docs-sourcelink::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-primary.is-outlined[disabled],html.theme--documenter-dark .docstring>section>a.button.is-outlined.docs-sourcelink[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-primary.is-outlined,fieldset[disabled] html.theme--documenter-dark .docstring>section>a.button.is-outlined.docs-sourcelink{background-color:transparent;border-color:#375a7f;box-shadow:none;color:#375a7f}html.theme--documenter-dark .button.is-primary.is-inverted.is-outlined,html.theme--documenter-dark .docstring>section>a.button.is-inverted.is-outlined.docs-sourcelink{background-color:transparent;border-color:#fff;color:#fff}html.theme--documenter-dark .button.is-primary.is-inverted.is-outlined:hover,html.theme--documenter-dark .docstring>section>a.button.is-inverted.is-outlined.docs-sourcelink:hover,html.theme--documenter-dark .button.is-primary.is-inverted.is-outlined.is-hovered,html.theme--documenter-dark .docstring>section>a.button.is-inverted.is-outlined.is-hovered.docs-sourcelink,html.theme--documenter-dark .button.is-primary.is-inverted.is-outlined:focus,html.theme--documenter-dark .docstring>section>a.button.is-inverted.is-outlined.docs-sourcelink:focus,html.theme--documenter-dark .button.is-primary.is-inverted.is-outlined.is-focused,html.theme--documenter-dark .docstring>section>a.button.is-inverted.is-outlined.is-focused.docs-sourcelink{background-color:#fff;color:#375a7f}html.theme--documenter-dark .button.is-primary.is-inverted.is-outlined.is-loading:hover::after,html.theme--documenter-dark .docstring>section>a.button.is-inverted.is-outlined.is-loading.docs-sourcelink:hover::after,html.theme--documenter-dark .button.is-primary.is-inverted.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .docstring>section>a.button.is-inverted.is-outlined.is-loading.is-hovered.docs-sourcelink::after,html.theme--documenter-dark .button.is-primary.is-inverted.is-outlined.is-loading:focus::after,html.theme--documenter-dark .docstring>section>a.button.is-inverted.is-outlined.is-loading.docs-sourcelink:focus::after,html.theme--documenter-dark .button.is-primary.is-inverted.is-outlined.is-loading.is-focused::after,html.theme--documenter-dark .docstring>section>a.button.is-inverted.is-outlined.is-loading.is-focused.docs-sourcelink::after{border-color:transparent transparent #375a7f #375a7f !important}html.theme--documenter-dark .button.is-primary.is-inverted.is-outlined[disabled],html.theme--documenter-dark .docstring>section>a.button.is-inverted.is-outlined.docs-sourcelink[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-primary.is-inverted.is-outlined,fieldset[disabled] html.theme--documenter-dark .docstring>section>a.button.is-inverted.is-outlined.docs-sourcelink{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}html.theme--documenter-dark .button.is-primary.is-light,html.theme--documenter-dark .docstring>section>a.button.is-light.docs-sourcelink{background-color:#f1f5f9;color:#4d7eb2}html.theme--documenter-dark .button.is-primary.is-light:hover,html.theme--documenter-dark .docstring>section>a.button.is-light.docs-sourcelink:hover,html.theme--documenter-dark .button.is-primary.is-light.is-hovered,html.theme--documenter-dark .docstring>section>a.button.is-light.is-hovered.docs-sourcelink{background-color:#e8eef5;border-color:transparent;color:#4d7eb2}html.theme--documenter-dark .button.is-primary.is-light:active,html.theme--documenter-dark .docstring>section>a.button.is-light.docs-sourcelink:active,html.theme--documenter-dark .button.is-primary.is-light.is-active,html.theme--documenter-dark .docstring>section>a.button.is-light.is-active.docs-sourcelink{background-color:#dfe8f1;border-color:transparent;color:#4d7eb2}html.theme--documenter-dark .button.is-link{background-color:#1abc9c;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-link:hover,html.theme--documenter-dark .button.is-link.is-hovered{background-color:#18b193;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-link:focus,html.theme--documenter-dark .button.is-link.is-focused{border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-link:focus:not(:active),html.theme--documenter-dark .button.is-link.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(26,188,156,0.25)}html.theme--documenter-dark .button.is-link:active,html.theme--documenter-dark .button.is-link.is-active{background-color:#17a689;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-link[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-link{background-color:#1abc9c;border-color:#1abc9c;box-shadow:none}html.theme--documenter-dark .button.is-link.is-inverted{background-color:#fff;color:#1abc9c}html.theme--documenter-dark .button.is-link.is-inverted:hover,html.theme--documenter-dark .button.is-link.is-inverted.is-hovered{background-color:#f2f2f2}html.theme--documenter-dark .button.is-link.is-inverted[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-link.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#1abc9c}html.theme--documenter-dark .button.is-link.is-loading::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-link.is-outlined{background-color:transparent;border-color:#1abc9c;color:#1abc9c}html.theme--documenter-dark .button.is-link.is-outlined:hover,html.theme--documenter-dark .button.is-link.is-outlined.is-hovered,html.theme--documenter-dark .button.is-link.is-outlined:focus,html.theme--documenter-dark .button.is-link.is-outlined.is-focused{background-color:#1abc9c;border-color:#1abc9c;color:#fff}html.theme--documenter-dark .button.is-link.is-outlined.is-loading::after{border-color:transparent transparent #1abc9c #1abc9c !important}html.theme--documenter-dark .button.is-link.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-link.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-link.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-link.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-link.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-link.is-outlined{background-color:transparent;border-color:#1abc9c;box-shadow:none;color:#1abc9c}html.theme--documenter-dark .button.is-link.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}html.theme--documenter-dark .button.is-link.is-inverted.is-outlined:hover,html.theme--documenter-dark .button.is-link.is-inverted.is-outlined.is-hovered,html.theme--documenter-dark .button.is-link.is-inverted.is-outlined:focus,html.theme--documenter-dark .button.is-link.is-inverted.is-outlined.is-focused{background-color:#fff;color:#1abc9c}html.theme--documenter-dark .button.is-link.is-inverted.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-link.is-inverted.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-link.is-inverted.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-link.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #1abc9c #1abc9c !important}html.theme--documenter-dark .button.is-link.is-inverted.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-link.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}html.theme--documenter-dark .button.is-link.is-light{background-color:#edfdf9;color:#15987e}html.theme--documenter-dark .button.is-link.is-light:hover,html.theme--documenter-dark .button.is-link.is-light.is-hovered{background-color:#e2fbf6;border-color:transparent;color:#15987e}html.theme--documenter-dark .button.is-link.is-light:active,html.theme--documenter-dark .button.is-link.is-light.is-active{background-color:#d7f9f3;border-color:transparent;color:#15987e}html.theme--documenter-dark .button.is-info{background-color:#024c7d;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-info:hover,html.theme--documenter-dark .button.is-info.is-hovered{background-color:#024470;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-info:focus,html.theme--documenter-dark .button.is-info.is-focused{border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-info:focus:not(:active),html.theme--documenter-dark .button.is-info.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(2,76,125,0.25)}html.theme--documenter-dark .button.is-info:active,html.theme--documenter-dark .button.is-info.is-active{background-color:#023d64;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-info[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-info{background-color:#024c7d;border-color:#024c7d;box-shadow:none}html.theme--documenter-dark .button.is-info.is-inverted{background-color:#fff;color:#024c7d}html.theme--documenter-dark .button.is-info.is-inverted:hover,html.theme--documenter-dark .button.is-info.is-inverted.is-hovered{background-color:#f2f2f2}html.theme--documenter-dark .button.is-info.is-inverted[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-info.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#024c7d}html.theme--documenter-dark .button.is-info.is-loading::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-info.is-outlined{background-color:transparent;border-color:#024c7d;color:#024c7d}html.theme--documenter-dark .button.is-info.is-outlined:hover,html.theme--documenter-dark .button.is-info.is-outlined.is-hovered,html.theme--documenter-dark .button.is-info.is-outlined:focus,html.theme--documenter-dark .button.is-info.is-outlined.is-focused{background-color:#024c7d;border-color:#024c7d;color:#fff}html.theme--documenter-dark .button.is-info.is-outlined.is-loading::after{border-color:transparent transparent #024c7d #024c7d !important}html.theme--documenter-dark .button.is-info.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-info.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-info.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-info.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-info.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-info.is-outlined{background-color:transparent;border-color:#024c7d;box-shadow:none;color:#024c7d}html.theme--documenter-dark .button.is-info.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}html.theme--documenter-dark .button.is-info.is-inverted.is-outlined:hover,html.theme--documenter-dark .button.is-info.is-inverted.is-outlined.is-hovered,html.theme--documenter-dark .button.is-info.is-inverted.is-outlined:focus,html.theme--documenter-dark .button.is-info.is-inverted.is-outlined.is-focused{background-color:#fff;color:#024c7d}html.theme--documenter-dark .button.is-info.is-inverted.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-info.is-inverted.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-info.is-inverted.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-info.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #024c7d #024c7d !important}html.theme--documenter-dark .button.is-info.is-inverted.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-info.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}html.theme--documenter-dark .button.is-info.is-light{background-color:#ebf7ff;color:#0e9dfb}html.theme--documenter-dark .button.is-info.is-light:hover,html.theme--documenter-dark .button.is-info.is-light.is-hovered{background-color:#def2fe;border-color:transparent;color:#0e9dfb}html.theme--documenter-dark .button.is-info.is-light:active,html.theme--documenter-dark .button.is-info.is-light.is-active{background-color:#d2edfe;border-color:transparent;color:#0e9dfb}html.theme--documenter-dark .button.is-success{background-color:#008438;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-success:hover,html.theme--documenter-dark .button.is-success.is-hovered{background-color:#073;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-success:focus,html.theme--documenter-dark .button.is-success.is-focused{border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-success:focus:not(:active),html.theme--documenter-dark .button.is-success.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(0,132,56,0.25)}html.theme--documenter-dark .button.is-success:active,html.theme--documenter-dark .button.is-success.is-active{background-color:#006b2d;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-success[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-success{background-color:#008438;border-color:#008438;box-shadow:none}html.theme--documenter-dark .button.is-success.is-inverted{background-color:#fff;color:#008438}html.theme--documenter-dark .button.is-success.is-inverted:hover,html.theme--documenter-dark .button.is-success.is-inverted.is-hovered{background-color:#f2f2f2}html.theme--documenter-dark .button.is-success.is-inverted[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-success.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#008438}html.theme--documenter-dark .button.is-success.is-loading::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-success.is-outlined{background-color:transparent;border-color:#008438;color:#008438}html.theme--documenter-dark .button.is-success.is-outlined:hover,html.theme--documenter-dark .button.is-success.is-outlined.is-hovered,html.theme--documenter-dark .button.is-success.is-outlined:focus,html.theme--documenter-dark .button.is-success.is-outlined.is-focused{background-color:#008438;border-color:#008438;color:#fff}html.theme--documenter-dark .button.is-success.is-outlined.is-loading::after{border-color:transparent transparent #008438 #008438 !important}html.theme--documenter-dark .button.is-success.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-success.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-success.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-success.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-success.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-success.is-outlined{background-color:transparent;border-color:#008438;box-shadow:none;color:#008438}html.theme--documenter-dark .button.is-success.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}html.theme--documenter-dark .button.is-success.is-inverted.is-outlined:hover,html.theme--documenter-dark .button.is-success.is-inverted.is-outlined.is-hovered,html.theme--documenter-dark .button.is-success.is-inverted.is-outlined:focus,html.theme--documenter-dark .button.is-success.is-inverted.is-outlined.is-focused{background-color:#fff;color:#008438}html.theme--documenter-dark .button.is-success.is-inverted.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-success.is-inverted.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-success.is-inverted.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-success.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #008438 #008438 !important}html.theme--documenter-dark .button.is-success.is-inverted.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-success.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}html.theme--documenter-dark .button.is-success.is-light{background-color:#ebfff3;color:#00eb64}html.theme--documenter-dark .button.is-success.is-light:hover,html.theme--documenter-dark .button.is-success.is-light.is-hovered{background-color:#deffec;border-color:transparent;color:#00eb64}html.theme--documenter-dark .button.is-success.is-light:active,html.theme--documenter-dark .button.is-success.is-light.is-active{background-color:#d1ffe5;border-color:transparent;color:#00eb64}html.theme--documenter-dark .button.is-warning{background-color:#ad8100;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-warning:hover,html.theme--documenter-dark .button.is-warning.is-hovered{background-color:#a07700;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-warning:focus,html.theme--documenter-dark .button.is-warning.is-focused{border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-warning:focus:not(:active),html.theme--documenter-dark .button.is-warning.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(173,129,0,0.25)}html.theme--documenter-dark .button.is-warning:active,html.theme--documenter-dark .button.is-warning.is-active{background-color:#946e00;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-warning[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-warning{background-color:#ad8100;border-color:#ad8100;box-shadow:none}html.theme--documenter-dark .button.is-warning.is-inverted{background-color:#fff;color:#ad8100}html.theme--documenter-dark .button.is-warning.is-inverted:hover,html.theme--documenter-dark .button.is-warning.is-inverted.is-hovered{background-color:#f2f2f2}html.theme--documenter-dark .button.is-warning.is-inverted[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-warning.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#ad8100}html.theme--documenter-dark .button.is-warning.is-loading::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-warning.is-outlined{background-color:transparent;border-color:#ad8100;color:#ad8100}html.theme--documenter-dark .button.is-warning.is-outlined:hover,html.theme--documenter-dark .button.is-warning.is-outlined.is-hovered,html.theme--documenter-dark .button.is-warning.is-outlined:focus,html.theme--documenter-dark .button.is-warning.is-outlined.is-focused{background-color:#ad8100;border-color:#ad8100;color:#fff}html.theme--documenter-dark .button.is-warning.is-outlined.is-loading::after{border-color:transparent transparent #ad8100 #ad8100 !important}html.theme--documenter-dark .button.is-warning.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-warning.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-warning.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-warning.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-warning.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-warning.is-outlined{background-color:transparent;border-color:#ad8100;box-shadow:none;color:#ad8100}html.theme--documenter-dark .button.is-warning.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}html.theme--documenter-dark .button.is-warning.is-inverted.is-outlined:hover,html.theme--documenter-dark .button.is-warning.is-inverted.is-outlined.is-hovered,html.theme--documenter-dark .button.is-warning.is-inverted.is-outlined:focus,html.theme--documenter-dark .button.is-warning.is-inverted.is-outlined.is-focused{background-color:#fff;color:#ad8100}html.theme--documenter-dark .button.is-warning.is-inverted.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-warning.is-inverted.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-warning.is-inverted.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-warning.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #ad8100 #ad8100 !important}html.theme--documenter-dark .button.is-warning.is-inverted.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-warning.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}html.theme--documenter-dark .button.is-warning.is-light{background-color:#fffaeb;color:#d19c00}html.theme--documenter-dark .button.is-warning.is-light:hover,html.theme--documenter-dark .button.is-warning.is-light.is-hovered{background-color:#fff7de;border-color:transparent;color:#d19c00}html.theme--documenter-dark .button.is-warning.is-light:active,html.theme--documenter-dark .button.is-warning.is-light.is-active{background-color:#fff3d1;border-color:transparent;color:#d19c00}html.theme--documenter-dark .button.is-danger{background-color:#9e1b0d;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-danger:hover,html.theme--documenter-dark .button.is-danger.is-hovered{background-color:#92190c;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-danger:focus,html.theme--documenter-dark .button.is-danger.is-focused{border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-danger:focus:not(:active),html.theme--documenter-dark .button.is-danger.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(158,27,13,0.25)}html.theme--documenter-dark .button.is-danger:active,html.theme--documenter-dark .button.is-danger.is-active{background-color:#86170b;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-danger[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-danger{background-color:#9e1b0d;border-color:#9e1b0d;box-shadow:none}html.theme--documenter-dark .button.is-danger.is-inverted{background-color:#fff;color:#9e1b0d}html.theme--documenter-dark .button.is-danger.is-inverted:hover,html.theme--documenter-dark .button.is-danger.is-inverted.is-hovered{background-color:#f2f2f2}html.theme--documenter-dark .button.is-danger.is-inverted[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-danger.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#9e1b0d}html.theme--documenter-dark .button.is-danger.is-loading::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-danger.is-outlined{background-color:transparent;border-color:#9e1b0d;color:#9e1b0d}html.theme--documenter-dark .button.is-danger.is-outlined:hover,html.theme--documenter-dark .button.is-danger.is-outlined.is-hovered,html.theme--documenter-dark .button.is-danger.is-outlined:focus,html.theme--documenter-dark .button.is-danger.is-outlined.is-focused{background-color:#9e1b0d;border-color:#9e1b0d;color:#fff}html.theme--documenter-dark .button.is-danger.is-outlined.is-loading::after{border-color:transparent transparent #9e1b0d #9e1b0d !important}html.theme--documenter-dark .button.is-danger.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-danger.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-danger.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-danger.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-danger.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-danger.is-outlined{background-color:transparent;border-color:#9e1b0d;box-shadow:none;color:#9e1b0d}html.theme--documenter-dark .button.is-danger.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}html.theme--documenter-dark .button.is-danger.is-inverted.is-outlined:hover,html.theme--documenter-dark .button.is-danger.is-inverted.is-outlined.is-hovered,html.theme--documenter-dark .button.is-danger.is-inverted.is-outlined:focus,html.theme--documenter-dark .button.is-danger.is-inverted.is-outlined.is-focused{background-color:#fff;color:#9e1b0d}html.theme--documenter-dark .button.is-danger.is-inverted.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-danger.is-inverted.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-danger.is-inverted.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-danger.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #9e1b0d #9e1b0d !important}html.theme--documenter-dark .button.is-danger.is-inverted.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-danger.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}html.theme--documenter-dark .button.is-danger.is-light{background-color:#fdeeec;color:#ec311d}html.theme--documenter-dark .button.is-danger.is-light:hover,html.theme--documenter-dark .button.is-danger.is-light.is-hovered{background-color:#fce3e0;border-color:transparent;color:#ec311d}html.theme--documenter-dark .button.is-danger.is-light:active,html.theme--documenter-dark .button.is-danger.is-light.is-active{background-color:#fcd8d5;border-color:transparent;color:#ec311d}html.theme--documenter-dark .button.is-small,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.button{font-size:.75rem}html.theme--documenter-dark .button.is-small:not(.is-rounded),html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.button:not(.is-rounded){border-radius:3px}html.theme--documenter-dark .button.is-normal{font-size:1rem}html.theme--documenter-dark .button.is-medium{font-size:1.25rem}html.theme--documenter-dark .button.is-large{font-size:1.5rem}html.theme--documenter-dark .button[disabled],fieldset[disabled] html.theme--documenter-dark .button{background-color:#8c9b9d;border-color:#5e6d6f;box-shadow:none;opacity:.5}html.theme--documenter-dark .button.is-fullwidth{display:flex;width:100%}html.theme--documenter-dark .button.is-loading{color:transparent !important;pointer-events:none}html.theme--documenter-dark .button.is-loading::after{position:absolute;left:calc(50% - (1em * 0.5));top:calc(50% - (1em * 0.5));position:absolute !important}html.theme--documenter-dark .button.is-static{background-color:#282f2f;border-color:#5e6d6f;color:#dbdee0;box-shadow:none;pointer-events:none}html.theme--documenter-dark .button.is-rounded,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.button{border-radius:9999px;padding-left:calc(1em + 0.25em);padding-right:calc(1em + 0.25em)}html.theme--documenter-dark .buttons{align-items:center;display:flex;flex-wrap:wrap;justify-content:flex-start}html.theme--documenter-dark .buttons .button{margin-bottom:0.5rem}html.theme--documenter-dark .buttons .button:not(:last-child):not(.is-fullwidth){margin-right:.5rem}html.theme--documenter-dark .buttons:last-child{margin-bottom:-0.5rem}html.theme--documenter-dark .buttons:not(:last-child){margin-bottom:1rem}html.theme--documenter-dark .buttons.are-small .button:not(.is-normal):not(.is-medium):not(.is-large){font-size:.75rem}html.theme--documenter-dark .buttons.are-small .button:not(.is-normal):not(.is-medium):not(.is-large):not(.is-rounded){border-radius:3px}html.theme--documenter-dark .buttons.are-medium .button:not(.is-small):not(.is-normal):not(.is-large){font-size:1.25rem}html.theme--documenter-dark .buttons.are-large .button:not(.is-small):not(.is-normal):not(.is-medium){font-size:1.5rem}html.theme--documenter-dark .buttons.has-addons .button:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}html.theme--documenter-dark .buttons.has-addons .button:not(:last-child){border-bottom-right-radius:0;border-top-right-radius:0;margin-right:-1px}html.theme--documenter-dark .buttons.has-addons .button:last-child{margin-right:0}html.theme--documenter-dark .buttons.has-addons .button:hover,html.theme--documenter-dark .buttons.has-addons .button.is-hovered{z-index:2}html.theme--documenter-dark .buttons.has-addons .button:focus,html.theme--documenter-dark .buttons.has-addons .button.is-focused,html.theme--documenter-dark .buttons.has-addons .button:active,html.theme--documenter-dark .buttons.has-addons .button.is-active,html.theme--documenter-dark .buttons.has-addons .button.is-selected{z-index:3}html.theme--documenter-dark .buttons.has-addons .button:focus:hover,html.theme--documenter-dark .buttons.has-addons .button.is-focused:hover,html.theme--documenter-dark .buttons.has-addons .button:active:hover,html.theme--documenter-dark .buttons.has-addons .button.is-active:hover,html.theme--documenter-dark .buttons.has-addons .button.is-selected:hover{z-index:4}html.theme--documenter-dark .buttons.has-addons .button.is-expanded{flex-grow:1;flex-shrink:1}html.theme--documenter-dark .buttons.is-centered{justify-content:center}html.theme--documenter-dark .buttons.is-centered:not(.has-addons) .button:not(.is-fullwidth){margin-left:0.25rem;margin-right:0.25rem}html.theme--documenter-dark .buttons.is-right{justify-content:flex-end}html.theme--documenter-dark .buttons.is-right:not(.has-addons) .button:not(.is-fullwidth){margin-left:0.25rem;margin-right:0.25rem}@media screen and (max-width: 768px){html.theme--documenter-dark .button.is-responsive.is-small,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-responsive{font-size:.5625rem}html.theme--documenter-dark .button.is-responsive,html.theme--documenter-dark .button.is-responsive.is-normal{font-size:.65625rem}html.theme--documenter-dark .button.is-responsive.is-medium{font-size:.75rem}html.theme--documenter-dark .button.is-responsive.is-large{font-size:1rem}}@media screen and (min-width: 769px) and (max-width: 1055px){html.theme--documenter-dark .button.is-responsive.is-small,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-responsive{font-size:.65625rem}html.theme--documenter-dark .button.is-responsive,html.theme--documenter-dark .button.is-responsive.is-normal{font-size:.75rem}html.theme--documenter-dark .button.is-responsive.is-medium{font-size:1rem}html.theme--documenter-dark .button.is-responsive.is-large{font-size:1.25rem}}html.theme--documenter-dark .container{flex-grow:1;margin:0 auto;position:relative;width:auto}html.theme--documenter-dark .container.is-fluid{max-width:none !important;padding-left:32px;padding-right:32px;width:100%}@media screen and (min-width: 1056px){html.theme--documenter-dark .container{max-width:992px}}@media screen and (max-width: 1215px){html.theme--documenter-dark .container.is-widescreen:not(.is-max-desktop){max-width:1152px}}@media screen and (max-width: 1407px){html.theme--documenter-dark .container.is-fullhd:not(.is-max-desktop):not(.is-max-widescreen){max-width:1344px}}@media screen and (min-width: 1216px){html.theme--documenter-dark .container:not(.is-max-desktop){max-width:1152px}}@media screen and (min-width: 1408px){html.theme--documenter-dark .container:not(.is-max-desktop):not(.is-max-widescreen){max-width:1344px}}html.theme--documenter-dark .content li+li{margin-top:0.25em}html.theme--documenter-dark .content p:not(:last-child),html.theme--documenter-dark .content dl:not(:last-child),html.theme--documenter-dark .content ol:not(:last-child),html.theme--documenter-dark .content ul:not(:last-child),html.theme--documenter-dark .content blockquote:not(:last-child),html.theme--documenter-dark .content pre:not(:last-child),html.theme--documenter-dark .content table:not(:last-child){margin-bottom:1em}html.theme--documenter-dark .content h1,html.theme--documenter-dark .content h2,html.theme--documenter-dark .content h3,html.theme--documenter-dark .content h4,html.theme--documenter-dark .content h5,html.theme--documenter-dark .content h6{color:#f2f2f2;font-weight:600;line-height:1.125}html.theme--documenter-dark .content h1{font-size:2em;margin-bottom:0.5em}html.theme--documenter-dark .content h1:not(:first-child){margin-top:1em}html.theme--documenter-dark .content h2{font-size:1.75em;margin-bottom:0.5714em}html.theme--documenter-dark .content h2:not(:first-child){margin-top:1.1428em}html.theme--documenter-dark .content h3{font-size:1.5em;margin-bottom:0.6666em}html.theme--documenter-dark .content h3:not(:first-child){margin-top:1.3333em}html.theme--documenter-dark .content h4{font-size:1.25em;margin-bottom:0.8em}html.theme--documenter-dark .content h5{font-size:1.125em;margin-bottom:0.8888em}html.theme--documenter-dark .content h6{font-size:1em;margin-bottom:1em}html.theme--documenter-dark .content blockquote{background-color:#282f2f;border-left:5px solid #5e6d6f;padding:1.25em 1.5em}html.theme--documenter-dark .content ol{list-style-position:outside;margin-left:2em;margin-top:1em}html.theme--documenter-dark .content ol:not([type]){list-style-type:decimal}html.theme--documenter-dark .content ol.is-lower-alpha:not([type]){list-style-type:lower-alpha}html.theme--documenter-dark .content ol.is-lower-roman:not([type]){list-style-type:lower-roman}html.theme--documenter-dark .content ol.is-upper-alpha:not([type]){list-style-type:upper-alpha}html.theme--documenter-dark .content ol.is-upper-roman:not([type]){list-style-type:upper-roman}html.theme--documenter-dark .content ul{list-style:disc outside;margin-left:2em;margin-top:1em}html.theme--documenter-dark .content ul ul{list-style-type:circle;margin-top:0.5em}html.theme--documenter-dark .content ul ul ul{list-style-type:square}html.theme--documenter-dark .content dd{margin-left:2em}html.theme--documenter-dark .content figure{margin-left:2em;margin-right:2em;text-align:center}html.theme--documenter-dark .content figure:not(:first-child){margin-top:2em}html.theme--documenter-dark .content figure:not(:last-child){margin-bottom:2em}html.theme--documenter-dark .content figure img{display:inline-block}html.theme--documenter-dark .content figure figcaption{font-style:italic}html.theme--documenter-dark .content pre{-webkit-overflow-scrolling:touch;overflow-x:auto;padding:0;white-space:pre;word-wrap:normal}html.theme--documenter-dark .content sup,html.theme--documenter-dark .content sub{font-size:75%}html.theme--documenter-dark .content table{width:100%}html.theme--documenter-dark .content table td,html.theme--documenter-dark .content table th{border:1px solid #5e6d6f;border-width:0 0 1px;padding:0.5em 0.75em;vertical-align:top}html.theme--documenter-dark .content table th{color:#f2f2f2}html.theme--documenter-dark .content table th:not([align]){text-align:inherit}html.theme--documenter-dark .content table thead td,html.theme--documenter-dark .content table thead th{border-width:0 0 2px;color:#f2f2f2}html.theme--documenter-dark .content table tfoot td,html.theme--documenter-dark .content table tfoot th{border-width:2px 0 0;color:#f2f2f2}html.theme--documenter-dark .content table tbody tr:last-child td,html.theme--documenter-dark .content table tbody tr:last-child th{border-bottom-width:0}html.theme--documenter-dark .content .tabs li+li{margin-top:0}html.theme--documenter-dark .content.is-small,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.content{font-size:.75rem}html.theme--documenter-dark .content.is-normal{font-size:1rem}html.theme--documenter-dark .content.is-medium{font-size:1.25rem}html.theme--documenter-dark .content.is-large{font-size:1.5rem}html.theme--documenter-dark .icon{align-items:center;display:inline-flex;justify-content:center;height:1.5rem;width:1.5rem}html.theme--documenter-dark .icon.is-small,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.icon{height:1rem;width:1rem}html.theme--documenter-dark .icon.is-medium{height:2rem;width:2rem}html.theme--documenter-dark .icon.is-large{height:3rem;width:3rem}html.theme--documenter-dark .icon-text{align-items:flex-start;color:inherit;display:inline-flex;flex-wrap:wrap;line-height:1.5rem;vertical-align:top}html.theme--documenter-dark .icon-text .icon{flex-grow:0;flex-shrink:0}html.theme--documenter-dark .icon-text .icon:not(:last-child){margin-right:.25em}html.theme--documenter-dark .icon-text .icon:not(:first-child){margin-left:.25em}html.theme--documenter-dark div.icon-text{display:flex}html.theme--documenter-dark .image,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img{display:block;position:relative}html.theme--documenter-dark .image img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img img{display:block;height:auto;width:100%}html.theme--documenter-dark .image img.is-rounded,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img img.is-rounded{border-radius:9999px}html.theme--documenter-dark .image.is-fullwidth,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-fullwidth{width:100%}html.theme--documenter-dark .image.is-square img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-square img,html.theme--documenter-dark .image.is-square .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-square .has-ratio,html.theme--documenter-dark .image.is-1by1 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-1by1 img,html.theme--documenter-dark .image.is-1by1 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-1by1 .has-ratio,html.theme--documenter-dark .image.is-5by4 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-5by4 img,html.theme--documenter-dark .image.is-5by4 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-5by4 .has-ratio,html.theme--documenter-dark .image.is-4by3 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-4by3 img,html.theme--documenter-dark .image.is-4by3 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-4by3 .has-ratio,html.theme--documenter-dark .image.is-3by2 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by2 img,html.theme--documenter-dark .image.is-3by2 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by2 .has-ratio,html.theme--documenter-dark .image.is-5by3 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-5by3 img,html.theme--documenter-dark .image.is-5by3 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-5by3 .has-ratio,html.theme--documenter-dark .image.is-16by9 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-16by9 img,html.theme--documenter-dark .image.is-16by9 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-16by9 .has-ratio,html.theme--documenter-dark .image.is-2by1 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-2by1 img,html.theme--documenter-dark .image.is-2by1 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-2by1 .has-ratio,html.theme--documenter-dark .image.is-3by1 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by1 img,html.theme--documenter-dark .image.is-3by1 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by1 .has-ratio,html.theme--documenter-dark .image.is-4by5 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-4by5 img,html.theme--documenter-dark .image.is-4by5 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-4by5 .has-ratio,html.theme--documenter-dark .image.is-3by4 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by4 img,html.theme--documenter-dark .image.is-3by4 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by4 .has-ratio,html.theme--documenter-dark .image.is-2by3 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-2by3 img,html.theme--documenter-dark .image.is-2by3 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-2by3 .has-ratio,html.theme--documenter-dark .image.is-3by5 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by5 img,html.theme--documenter-dark .image.is-3by5 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by5 .has-ratio,html.theme--documenter-dark .image.is-9by16 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-9by16 img,html.theme--documenter-dark .image.is-9by16 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-9by16 .has-ratio,html.theme--documenter-dark .image.is-1by2 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-1by2 img,html.theme--documenter-dark .image.is-1by2 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-1by2 .has-ratio,html.theme--documenter-dark .image.is-1by3 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-1by3 img,html.theme--documenter-dark .image.is-1by3 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-1by3 .has-ratio{height:100%;width:100%}html.theme--documenter-dark .image.is-square,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-square,html.theme--documenter-dark .image.is-1by1,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-1by1{padding-top:100%}html.theme--documenter-dark .image.is-5by4,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-5by4{padding-top:80%}html.theme--documenter-dark .image.is-4by3,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-4by3{padding-top:75%}html.theme--documenter-dark .image.is-3by2,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by2{padding-top:66.6666%}html.theme--documenter-dark .image.is-5by3,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-5by3{padding-top:60%}html.theme--documenter-dark .image.is-16by9,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-16by9{padding-top:56.25%}html.theme--documenter-dark .image.is-2by1,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-2by1{padding-top:50%}html.theme--documenter-dark .image.is-3by1,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by1{padding-top:33.3333%}html.theme--documenter-dark .image.is-4by5,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-4by5{padding-top:125%}html.theme--documenter-dark .image.is-3by4,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by4{padding-top:133.3333%}html.theme--documenter-dark .image.is-2by3,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-2by3{padding-top:150%}html.theme--documenter-dark .image.is-3by5,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by5{padding-top:166.6666%}html.theme--documenter-dark .image.is-9by16,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-9by16{padding-top:177.7777%}html.theme--documenter-dark .image.is-1by2,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-1by2{padding-top:200%}html.theme--documenter-dark .image.is-1by3,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-1by3{padding-top:300%}html.theme--documenter-dark .image.is-16x16,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-16x16{height:16px;width:16px}html.theme--documenter-dark .image.is-24x24,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-24x24{height:24px;width:24px}html.theme--documenter-dark .image.is-32x32,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-32x32{height:32px;width:32px}html.theme--documenter-dark .image.is-48x48,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-48x48{height:48px;width:48px}html.theme--documenter-dark .image.is-64x64,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-64x64{height:64px;width:64px}html.theme--documenter-dark .image.is-96x96,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-96x96{height:96px;width:96px}html.theme--documenter-dark .image.is-128x128,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-128x128{height:128px;width:128px}html.theme--documenter-dark .notification{background-color:#282f2f;border-radius:.4em;position:relative;padding:1.25rem 2.5rem 1.25rem 1.5rem}html.theme--documenter-dark .notification a:not(.button):not(.dropdown-item){color:currentColor;text-decoration:underline}html.theme--documenter-dark .notification strong{color:currentColor}html.theme--documenter-dark .notification code,html.theme--documenter-dark .notification pre{background:#fff}html.theme--documenter-dark .notification pre code{background:transparent}html.theme--documenter-dark .notification>.delete{right:.5rem;position:absolute;top:0.5rem}html.theme--documenter-dark .notification .title,html.theme--documenter-dark .notification .subtitle,html.theme--documenter-dark .notification .content{color:currentColor}html.theme--documenter-dark .notification.is-white{background-color:#fff;color:#0a0a0a}html.theme--documenter-dark .notification.is-black{background-color:#0a0a0a;color:#fff}html.theme--documenter-dark .notification.is-light{background-color:#ecf0f1;color:rgba(0,0,0,0.7)}html.theme--documenter-dark .notification.is-dark,html.theme--documenter-dark .content kbd.notification{background-color:#282f2f;color:#fff}html.theme--documenter-dark .notification.is-primary,html.theme--documenter-dark .docstring>section>a.notification.docs-sourcelink{background-color:#375a7f;color:#fff}html.theme--documenter-dark .notification.is-primary.is-light,html.theme--documenter-dark .docstring>section>a.notification.is-light.docs-sourcelink{background-color:#f1f5f9;color:#4d7eb2}html.theme--documenter-dark .notification.is-link{background-color:#1abc9c;color:#fff}html.theme--documenter-dark .notification.is-link.is-light{background-color:#edfdf9;color:#15987e}html.theme--documenter-dark .notification.is-info{background-color:#024c7d;color:#fff}html.theme--documenter-dark .notification.is-info.is-light{background-color:#ebf7ff;color:#0e9dfb}html.theme--documenter-dark .notification.is-success{background-color:#008438;color:#fff}html.theme--documenter-dark .notification.is-success.is-light{background-color:#ebfff3;color:#00eb64}html.theme--documenter-dark .notification.is-warning{background-color:#ad8100;color:#fff}html.theme--documenter-dark .notification.is-warning.is-light{background-color:#fffaeb;color:#d19c00}html.theme--documenter-dark .notification.is-danger{background-color:#9e1b0d;color:#fff}html.theme--documenter-dark .notification.is-danger.is-light{background-color:#fdeeec;color:#ec311d}html.theme--documenter-dark .progress{-moz-appearance:none;-webkit-appearance:none;border:none;border-radius:9999px;display:block;height:1rem;overflow:hidden;padding:0;width:100%}html.theme--documenter-dark .progress::-webkit-progress-bar{background-color:#343c3d}html.theme--documenter-dark .progress::-webkit-progress-value{background-color:#dbdee0}html.theme--documenter-dark .progress::-moz-progress-bar{background-color:#dbdee0}html.theme--documenter-dark .progress::-ms-fill{background-color:#dbdee0;border:none}html.theme--documenter-dark .progress.is-white::-webkit-progress-value{background-color:#fff}html.theme--documenter-dark .progress.is-white::-moz-progress-bar{background-color:#fff}html.theme--documenter-dark .progress.is-white::-ms-fill{background-color:#fff}html.theme--documenter-dark .progress.is-white:indeterminate{background-image:linear-gradient(to right, #fff 30%, #343c3d 30%)}html.theme--documenter-dark .progress.is-black::-webkit-progress-value{background-color:#0a0a0a}html.theme--documenter-dark .progress.is-black::-moz-progress-bar{background-color:#0a0a0a}html.theme--documenter-dark .progress.is-black::-ms-fill{background-color:#0a0a0a}html.theme--documenter-dark .progress.is-black:indeterminate{background-image:linear-gradient(to right, #0a0a0a 30%, #343c3d 30%)}html.theme--documenter-dark .progress.is-light::-webkit-progress-value{background-color:#ecf0f1}html.theme--documenter-dark .progress.is-light::-moz-progress-bar{background-color:#ecf0f1}html.theme--documenter-dark .progress.is-light::-ms-fill{background-color:#ecf0f1}html.theme--documenter-dark .progress.is-light:indeterminate{background-image:linear-gradient(to right, #ecf0f1 30%, #343c3d 30%)}html.theme--documenter-dark .progress.is-dark::-webkit-progress-value,html.theme--documenter-dark .content kbd.progress::-webkit-progress-value{background-color:#282f2f}html.theme--documenter-dark .progress.is-dark::-moz-progress-bar,html.theme--documenter-dark .content kbd.progress::-moz-progress-bar{background-color:#282f2f}html.theme--documenter-dark .progress.is-dark::-ms-fill,html.theme--documenter-dark .content kbd.progress::-ms-fill{background-color:#282f2f}html.theme--documenter-dark .progress.is-dark:indeterminate,html.theme--documenter-dark .content kbd.progress:indeterminate{background-image:linear-gradient(to right, #282f2f 30%, #343c3d 30%)}html.theme--documenter-dark .progress.is-primary::-webkit-progress-value,html.theme--documenter-dark .docstring>section>a.progress.docs-sourcelink::-webkit-progress-value{background-color:#375a7f}html.theme--documenter-dark .progress.is-primary::-moz-progress-bar,html.theme--documenter-dark .docstring>section>a.progress.docs-sourcelink::-moz-progress-bar{background-color:#375a7f}html.theme--documenter-dark .progress.is-primary::-ms-fill,html.theme--documenter-dark .docstring>section>a.progress.docs-sourcelink::-ms-fill{background-color:#375a7f}html.theme--documenter-dark .progress.is-primary:indeterminate,html.theme--documenter-dark .docstring>section>a.progress.docs-sourcelink:indeterminate{background-image:linear-gradient(to right, #375a7f 30%, #343c3d 30%)}html.theme--documenter-dark .progress.is-link::-webkit-progress-value{background-color:#1abc9c}html.theme--documenter-dark .progress.is-link::-moz-progress-bar{background-color:#1abc9c}html.theme--documenter-dark .progress.is-link::-ms-fill{background-color:#1abc9c}html.theme--documenter-dark .progress.is-link:indeterminate{background-image:linear-gradient(to right, #1abc9c 30%, #343c3d 30%)}html.theme--documenter-dark .progress.is-info::-webkit-progress-value{background-color:#024c7d}html.theme--documenter-dark .progress.is-info::-moz-progress-bar{background-color:#024c7d}html.theme--documenter-dark .progress.is-info::-ms-fill{background-color:#024c7d}html.theme--documenter-dark .progress.is-info:indeterminate{background-image:linear-gradient(to right, #024c7d 30%, #343c3d 30%)}html.theme--documenter-dark .progress.is-success::-webkit-progress-value{background-color:#008438}html.theme--documenter-dark .progress.is-success::-moz-progress-bar{background-color:#008438}html.theme--documenter-dark .progress.is-success::-ms-fill{background-color:#008438}html.theme--documenter-dark .progress.is-success:indeterminate{background-image:linear-gradient(to right, #008438 30%, #343c3d 30%)}html.theme--documenter-dark .progress.is-warning::-webkit-progress-value{background-color:#ad8100}html.theme--documenter-dark .progress.is-warning::-moz-progress-bar{background-color:#ad8100}html.theme--documenter-dark .progress.is-warning::-ms-fill{background-color:#ad8100}html.theme--documenter-dark .progress.is-warning:indeterminate{background-image:linear-gradient(to right, #ad8100 30%, #343c3d 30%)}html.theme--documenter-dark .progress.is-danger::-webkit-progress-value{background-color:#9e1b0d}html.theme--documenter-dark .progress.is-danger::-moz-progress-bar{background-color:#9e1b0d}html.theme--documenter-dark .progress.is-danger::-ms-fill{background-color:#9e1b0d}html.theme--documenter-dark .progress.is-danger:indeterminate{background-image:linear-gradient(to right, #9e1b0d 30%, #343c3d 30%)}html.theme--documenter-dark .progress:indeterminate{animation-duration:1.5s;animation-iteration-count:infinite;animation-name:moveIndeterminate;animation-timing-function:linear;background-color:#343c3d;background-image:linear-gradient(to right, #fff 30%, #343c3d 30%);background-position:top left;background-repeat:no-repeat;background-size:150% 150%}html.theme--documenter-dark .progress:indeterminate::-webkit-progress-bar{background-color:transparent}html.theme--documenter-dark .progress:indeterminate::-moz-progress-bar{background-color:transparent}html.theme--documenter-dark .progress:indeterminate::-ms-fill{animation-name:none}html.theme--documenter-dark .progress.is-small,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.progress{height:.75rem}html.theme--documenter-dark .progress.is-medium{height:1.25rem}html.theme--documenter-dark .progress.is-large{height:1.5rem}@keyframes moveIndeterminate{from{background-position:200% 0}to{background-position:-200% 0}}html.theme--documenter-dark .table{background-color:#343c3d;color:#fff}html.theme--documenter-dark .table td,html.theme--documenter-dark .table th{border:1px solid #5e6d6f;border-width:0 0 1px;padding:0.5em 0.75em;vertical-align:top}html.theme--documenter-dark .table td.is-white,html.theme--documenter-dark .table th.is-white{background-color:#fff;border-color:#fff;color:#0a0a0a}html.theme--documenter-dark .table td.is-black,html.theme--documenter-dark .table th.is-black{background-color:#0a0a0a;border-color:#0a0a0a;color:#fff}html.theme--documenter-dark .table td.is-light,html.theme--documenter-dark .table th.is-light{background-color:#ecf0f1;border-color:#ecf0f1;color:rgba(0,0,0,0.7)}html.theme--documenter-dark .table td.is-dark,html.theme--documenter-dark .table th.is-dark{background-color:#282f2f;border-color:#282f2f;color:#fff}html.theme--documenter-dark .table td.is-primary,html.theme--documenter-dark .table th.is-primary{background-color:#375a7f;border-color:#375a7f;color:#fff}html.theme--documenter-dark .table td.is-link,html.theme--documenter-dark .table th.is-link{background-color:#1abc9c;border-color:#1abc9c;color:#fff}html.theme--documenter-dark .table td.is-info,html.theme--documenter-dark .table th.is-info{background-color:#024c7d;border-color:#024c7d;color:#fff}html.theme--documenter-dark .table td.is-success,html.theme--documenter-dark .table th.is-success{background-color:#008438;border-color:#008438;color:#fff}html.theme--documenter-dark .table td.is-warning,html.theme--documenter-dark .table th.is-warning{background-color:#ad8100;border-color:#ad8100;color:#fff}html.theme--documenter-dark .table td.is-danger,html.theme--documenter-dark .table th.is-danger{background-color:#9e1b0d;border-color:#9e1b0d;color:#fff}html.theme--documenter-dark .table td.is-narrow,html.theme--documenter-dark .table th.is-narrow{white-space:nowrap;width:1%}html.theme--documenter-dark .table td.is-selected,html.theme--documenter-dark .table th.is-selected{background-color:#375a7f;color:#fff}html.theme--documenter-dark .table td.is-selected a,html.theme--documenter-dark .table td.is-selected strong,html.theme--documenter-dark .table th.is-selected a,html.theme--documenter-dark .table th.is-selected strong{color:currentColor}html.theme--documenter-dark .table td.is-vcentered,html.theme--documenter-dark .table th.is-vcentered{vertical-align:middle}html.theme--documenter-dark .table th{color:#f2f2f2}html.theme--documenter-dark .table th:not([align]){text-align:left}html.theme--documenter-dark .table tr.is-selected{background-color:#375a7f;color:#fff}html.theme--documenter-dark .table tr.is-selected a,html.theme--documenter-dark .table tr.is-selected strong{color:currentColor}html.theme--documenter-dark .table tr.is-selected td,html.theme--documenter-dark .table tr.is-selected th{border-color:#fff;color:currentColor}html.theme--documenter-dark .table thead{background-color:rgba(0,0,0,0)}html.theme--documenter-dark .table thead td,html.theme--documenter-dark .table thead th{border-width:0 0 2px;color:#f2f2f2}html.theme--documenter-dark .table tfoot{background-color:rgba(0,0,0,0)}html.theme--documenter-dark .table tfoot td,html.theme--documenter-dark .table tfoot th{border-width:2px 0 0;color:#f2f2f2}html.theme--documenter-dark .table tbody{background-color:rgba(0,0,0,0)}html.theme--documenter-dark .table tbody tr:last-child td,html.theme--documenter-dark .table tbody tr:last-child th{border-bottom-width:0}html.theme--documenter-dark .table.is-bordered td,html.theme--documenter-dark .table.is-bordered th{border-width:1px}html.theme--documenter-dark .table.is-bordered tr:last-child td,html.theme--documenter-dark .table.is-bordered tr:last-child th{border-bottom-width:1px}html.theme--documenter-dark .table.is-fullwidth{width:100%}html.theme--documenter-dark .table.is-hoverable tbody tr:not(.is-selected):hover{background-color:#282f2f}html.theme--documenter-dark .table.is-hoverable.is-striped tbody tr:not(.is-selected):hover{background-color:#282f2f}html.theme--documenter-dark .table.is-hoverable.is-striped tbody tr:not(.is-selected):hover:nth-child(even){background-color:#2d3435}html.theme--documenter-dark .table.is-narrow td,html.theme--documenter-dark .table.is-narrow th{padding:0.25em 0.5em}html.theme--documenter-dark .table.is-striped tbody tr:not(.is-selected):nth-child(even){background-color:#282f2f}html.theme--documenter-dark .table-container{-webkit-overflow-scrolling:touch;overflow:auto;overflow-y:hidden;max-width:100%}html.theme--documenter-dark .tags{align-items:center;display:flex;flex-wrap:wrap;justify-content:flex-start}html.theme--documenter-dark .tags .tag,html.theme--documenter-dark .tags .content kbd,html.theme--documenter-dark .content .tags kbd,html.theme--documenter-dark .tags .docstring>section>a.docs-sourcelink{margin-bottom:0.5rem}html.theme--documenter-dark .tags .tag:not(:last-child),html.theme--documenter-dark .tags .content kbd:not(:last-child),html.theme--documenter-dark .content .tags kbd:not(:last-child),html.theme--documenter-dark .tags .docstring>section>a.docs-sourcelink:not(:last-child){margin-right:.5rem}html.theme--documenter-dark .tags:last-child{margin-bottom:-0.5rem}html.theme--documenter-dark .tags:not(:last-child){margin-bottom:1rem}html.theme--documenter-dark .tags.are-medium .tag:not(.is-normal):not(.is-large),html.theme--documenter-dark .tags.are-medium .content kbd:not(.is-normal):not(.is-large),html.theme--documenter-dark .content .tags.are-medium kbd:not(.is-normal):not(.is-large),html.theme--documenter-dark .tags.are-medium .docstring>section>a.docs-sourcelink:not(.is-normal):not(.is-large){font-size:1rem}html.theme--documenter-dark .tags.are-large .tag:not(.is-normal):not(.is-medium),html.theme--documenter-dark .tags.are-large .content kbd:not(.is-normal):not(.is-medium),html.theme--documenter-dark .content .tags.are-large kbd:not(.is-normal):not(.is-medium),html.theme--documenter-dark .tags.are-large .docstring>section>a.docs-sourcelink:not(.is-normal):not(.is-medium){font-size:1.25rem}html.theme--documenter-dark .tags.is-centered{justify-content:center}html.theme--documenter-dark .tags.is-centered .tag,html.theme--documenter-dark .tags.is-centered .content kbd,html.theme--documenter-dark .content .tags.is-centered kbd,html.theme--documenter-dark .tags.is-centered .docstring>section>a.docs-sourcelink{margin-right:0.25rem;margin-left:0.25rem}html.theme--documenter-dark .tags.is-right{justify-content:flex-end}html.theme--documenter-dark .tags.is-right .tag:not(:first-child),html.theme--documenter-dark .tags.is-right .content kbd:not(:first-child),html.theme--documenter-dark .content .tags.is-right kbd:not(:first-child),html.theme--documenter-dark .tags.is-right .docstring>section>a.docs-sourcelink:not(:first-child){margin-left:0.5rem}html.theme--documenter-dark .tags.is-right .tag:not(:last-child),html.theme--documenter-dark .tags.is-right .content kbd:not(:last-child),html.theme--documenter-dark .content .tags.is-right kbd:not(:last-child),html.theme--documenter-dark .tags.is-right .docstring>section>a.docs-sourcelink:not(:last-child){margin-right:0}html.theme--documenter-dark .tags.has-addons .tag,html.theme--documenter-dark .tags.has-addons .content kbd,html.theme--documenter-dark .content .tags.has-addons kbd,html.theme--documenter-dark .tags.has-addons .docstring>section>a.docs-sourcelink{margin-right:0}html.theme--documenter-dark .tags.has-addons .tag:not(:first-child),html.theme--documenter-dark .tags.has-addons .content kbd:not(:first-child),html.theme--documenter-dark .content .tags.has-addons kbd:not(:first-child),html.theme--documenter-dark .tags.has-addons .docstring>section>a.docs-sourcelink:not(:first-child){margin-left:0;border-top-left-radius:0;border-bottom-left-radius:0}html.theme--documenter-dark .tags.has-addons .tag:not(:last-child),html.theme--documenter-dark .tags.has-addons .content kbd:not(:last-child),html.theme--documenter-dark .content .tags.has-addons kbd:not(:last-child),html.theme--documenter-dark .tags.has-addons .docstring>section>a.docs-sourcelink:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}html.theme--documenter-dark .tag:not(body),html.theme--documenter-dark .content kbd:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink:not(body){align-items:center;background-color:#282f2f;border-radius:.4em;color:#fff;display:inline-flex;font-size:.75rem;height:2em;justify-content:center;line-height:1.5;padding-left:0.75em;padding-right:0.75em;white-space:nowrap}html.theme--documenter-dark .tag:not(body) .delete,html.theme--documenter-dark .content kbd:not(body) .delete,html.theme--documenter-dark .docstring>section>a.docs-sourcelink:not(body) .delete{margin-left:.25rem;margin-right:-.375rem}html.theme--documenter-dark .tag.is-white:not(body),html.theme--documenter-dark .content kbd.is-white:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-white:not(body){background-color:#fff;color:#0a0a0a}html.theme--documenter-dark .tag.is-black:not(body),html.theme--documenter-dark .content kbd.is-black:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-black:not(body){background-color:#0a0a0a;color:#fff}html.theme--documenter-dark .tag.is-light:not(body),html.theme--documenter-dark .content kbd.is-light:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-light:not(body){background-color:#ecf0f1;color:rgba(0,0,0,0.7)}html.theme--documenter-dark .tag.is-dark:not(body),html.theme--documenter-dark .content kbd:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-dark:not(body),html.theme--documenter-dark .content .docstring>section>kbd:not(body){background-color:#282f2f;color:#fff}html.theme--documenter-dark .tag.is-primary:not(body),html.theme--documenter-dark .content kbd.is-primary:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink:not(body){background-color:#375a7f;color:#fff}html.theme--documenter-dark .tag.is-primary.is-light:not(body),html.theme--documenter-dark .content kbd.is-primary.is-light:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-light:not(body){background-color:#f1f5f9;color:#4d7eb2}html.theme--documenter-dark .tag.is-link:not(body),html.theme--documenter-dark .content kbd.is-link:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-link:not(body){background-color:#1abc9c;color:#fff}html.theme--documenter-dark .tag.is-link.is-light:not(body),html.theme--documenter-dark .content kbd.is-link.is-light:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-link.is-light:not(body){background-color:#edfdf9;color:#15987e}html.theme--documenter-dark .tag.is-info:not(body),html.theme--documenter-dark .content kbd.is-info:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-info:not(body){background-color:#024c7d;color:#fff}html.theme--documenter-dark .tag.is-info.is-light:not(body),html.theme--documenter-dark .content kbd.is-info.is-light:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-info.is-light:not(body){background-color:#ebf7ff;color:#0e9dfb}html.theme--documenter-dark .tag.is-success:not(body),html.theme--documenter-dark .content kbd.is-success:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-success:not(body){background-color:#008438;color:#fff}html.theme--documenter-dark .tag.is-success.is-light:not(body),html.theme--documenter-dark .content kbd.is-success.is-light:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-success.is-light:not(body){background-color:#ebfff3;color:#00eb64}html.theme--documenter-dark .tag.is-warning:not(body),html.theme--documenter-dark .content kbd.is-warning:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-warning:not(body){background-color:#ad8100;color:#fff}html.theme--documenter-dark .tag.is-warning.is-light:not(body),html.theme--documenter-dark .content kbd.is-warning.is-light:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-warning.is-light:not(body){background-color:#fffaeb;color:#d19c00}html.theme--documenter-dark .tag.is-danger:not(body),html.theme--documenter-dark .content kbd.is-danger:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-danger:not(body){background-color:#9e1b0d;color:#fff}html.theme--documenter-dark .tag.is-danger.is-light:not(body),html.theme--documenter-dark .content kbd.is-danger.is-light:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-danger.is-light:not(body){background-color:#fdeeec;color:#ec311d}html.theme--documenter-dark .tag.is-normal:not(body),html.theme--documenter-dark .content kbd.is-normal:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-normal:not(body){font-size:.75rem}html.theme--documenter-dark .tag.is-medium:not(body),html.theme--documenter-dark .content kbd.is-medium:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-medium:not(body){font-size:1rem}html.theme--documenter-dark .tag.is-large:not(body),html.theme--documenter-dark .content kbd.is-large:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-large:not(body){font-size:1.25rem}html.theme--documenter-dark .tag:not(body) .icon:first-child:not(:last-child),html.theme--documenter-dark .content kbd:not(body) .icon:first-child:not(:last-child),html.theme--documenter-dark .docstring>section>a.docs-sourcelink:not(body) .icon:first-child:not(:last-child){margin-left:-.375em;margin-right:.1875em}html.theme--documenter-dark .tag:not(body) .icon:last-child:not(:first-child),html.theme--documenter-dark .content kbd:not(body) .icon:last-child:not(:first-child),html.theme--documenter-dark .docstring>section>a.docs-sourcelink:not(body) .icon:last-child:not(:first-child){margin-left:.1875em;margin-right:-.375em}html.theme--documenter-dark .tag:not(body) .icon:first-child:last-child,html.theme--documenter-dark .content kbd:not(body) .icon:first-child:last-child,html.theme--documenter-dark .docstring>section>a.docs-sourcelink:not(body) .icon:first-child:last-child{margin-left:-.375em;margin-right:-.375em}html.theme--documenter-dark .tag.is-delete:not(body),html.theme--documenter-dark .content kbd.is-delete:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-delete:not(body){margin-left:1px;padding:0;position:relative;width:2em}html.theme--documenter-dark .tag.is-delete:not(body)::before,html.theme--documenter-dark .content kbd.is-delete:not(body)::before,html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-delete:not(body)::before,html.theme--documenter-dark .tag.is-delete:not(body)::after,html.theme--documenter-dark .content kbd.is-delete:not(body)::after,html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-delete:not(body)::after{background-color:currentColor;content:"";display:block;left:50%;position:absolute;top:50%;transform:translateX(-50%) translateY(-50%) rotate(45deg);transform-origin:center center}html.theme--documenter-dark .tag.is-delete:not(body)::before,html.theme--documenter-dark .content kbd.is-delete:not(body)::before,html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-delete:not(body)::before{height:1px;width:50%}html.theme--documenter-dark .tag.is-delete:not(body)::after,html.theme--documenter-dark .content kbd.is-delete:not(body)::after,html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-delete:not(body)::after{height:50%;width:1px}html.theme--documenter-dark .tag.is-delete:not(body):hover,html.theme--documenter-dark .content kbd.is-delete:not(body):hover,html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-delete:not(body):hover,html.theme--documenter-dark .tag.is-delete:not(body):focus,html.theme--documenter-dark .content kbd.is-delete:not(body):focus,html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-delete:not(body):focus{background-color:#1d2122}html.theme--documenter-dark .tag.is-delete:not(body):active,html.theme--documenter-dark .content kbd.is-delete:not(body):active,html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-delete:not(body):active{background-color:#111414}html.theme--documenter-dark .tag.is-rounded:not(body),html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input:not(body),html.theme--documenter-dark .content kbd.is-rounded:not(body),html.theme--documenter-dark #documenter .docs-sidebar .content form.docs-search>input:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-rounded:not(body){border-radius:9999px}html.theme--documenter-dark a.tag:hover,html.theme--documenter-dark .docstring>section>a.docs-sourcelink:hover{text-decoration:underline}html.theme--documenter-dark .title,html.theme--documenter-dark .subtitle{word-break:break-word}html.theme--documenter-dark .title em,html.theme--documenter-dark .title span,html.theme--documenter-dark .subtitle em,html.theme--documenter-dark .subtitle span{font-weight:inherit}html.theme--documenter-dark .title sub,html.theme--documenter-dark .subtitle sub{font-size:.75em}html.theme--documenter-dark .title sup,html.theme--documenter-dark .subtitle sup{font-size:.75em}html.theme--documenter-dark .title .tag,html.theme--documenter-dark .title .content kbd,html.theme--documenter-dark .content .title kbd,html.theme--documenter-dark .title .docstring>section>a.docs-sourcelink,html.theme--documenter-dark .subtitle .tag,html.theme--documenter-dark .subtitle .content kbd,html.theme--documenter-dark .content .subtitle kbd,html.theme--documenter-dark .subtitle .docstring>section>a.docs-sourcelink{vertical-align:middle}html.theme--documenter-dark .title{color:#fff;font-size:2rem;font-weight:500;line-height:1.125}html.theme--documenter-dark .title strong{color:inherit;font-weight:inherit}html.theme--documenter-dark .title:not(.is-spaced)+.subtitle{margin-top:-1.25rem}html.theme--documenter-dark .title.is-1{font-size:3rem}html.theme--documenter-dark .title.is-2{font-size:2.5rem}html.theme--documenter-dark .title.is-3{font-size:2rem}html.theme--documenter-dark .title.is-4{font-size:1.5rem}html.theme--documenter-dark .title.is-5{font-size:1.25rem}html.theme--documenter-dark .title.is-6{font-size:1rem}html.theme--documenter-dark .title.is-7{font-size:.75rem}html.theme--documenter-dark .subtitle{color:#8c9b9d;font-size:1.25rem;font-weight:400;line-height:1.25}html.theme--documenter-dark .subtitle strong{color:#8c9b9d;font-weight:600}html.theme--documenter-dark .subtitle:not(.is-spaced)+.title{margin-top:-1.25rem}html.theme--documenter-dark .subtitle.is-1{font-size:3rem}html.theme--documenter-dark .subtitle.is-2{font-size:2.5rem}html.theme--documenter-dark .subtitle.is-3{font-size:2rem}html.theme--documenter-dark .subtitle.is-4{font-size:1.5rem}html.theme--documenter-dark .subtitle.is-5{font-size:1.25rem}html.theme--documenter-dark .subtitle.is-6{font-size:1rem}html.theme--documenter-dark .subtitle.is-7{font-size:.75rem}html.theme--documenter-dark .heading{display:block;font-size:11px;letter-spacing:1px;margin-bottom:5px;text-transform:uppercase}html.theme--documenter-dark .number{align-items:center;background-color:#282f2f;border-radius:9999px;display:inline-flex;font-size:1.25rem;height:2em;justify-content:center;margin-right:1.5rem;min-width:2.5em;padding:0.25rem 0.5rem;text-align:center;vertical-align:top}html.theme--documenter-dark .select select,html.theme--documenter-dark .textarea,html.theme--documenter-dark .input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input{background-color:#1f2424;border-color:#5e6d6f;border-radius:.4em;color:#dbdee0}html.theme--documenter-dark .select select::-moz-placeholder,html.theme--documenter-dark .textarea::-moz-placeholder,html.theme--documenter-dark .input::-moz-placeholder,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input::-moz-placeholder{color:#868c98}html.theme--documenter-dark .select select::-webkit-input-placeholder,html.theme--documenter-dark .textarea::-webkit-input-placeholder,html.theme--documenter-dark .input::-webkit-input-placeholder,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input::-webkit-input-placeholder{color:#868c98}html.theme--documenter-dark .select select:-moz-placeholder,html.theme--documenter-dark .textarea:-moz-placeholder,html.theme--documenter-dark .input:-moz-placeholder,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input:-moz-placeholder{color:#868c98}html.theme--documenter-dark .select select:-ms-input-placeholder,html.theme--documenter-dark .textarea:-ms-input-placeholder,html.theme--documenter-dark .input:-ms-input-placeholder,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input:-ms-input-placeholder{color:#868c98}html.theme--documenter-dark .select select:hover,html.theme--documenter-dark .textarea:hover,html.theme--documenter-dark .input:hover,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input:hover,html.theme--documenter-dark .select select.is-hovered,html.theme--documenter-dark .is-hovered.textarea,html.theme--documenter-dark .is-hovered.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-hovered{border-color:#8c9b9d}html.theme--documenter-dark .select select:focus,html.theme--documenter-dark .textarea:focus,html.theme--documenter-dark .input:focus,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input:focus,html.theme--documenter-dark .select select.is-focused,html.theme--documenter-dark .is-focused.textarea,html.theme--documenter-dark .is-focused.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-focused,html.theme--documenter-dark .select select:active,html.theme--documenter-dark .textarea:active,html.theme--documenter-dark .input:active,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input:active,html.theme--documenter-dark .select select.is-active,html.theme--documenter-dark .is-active.textarea,html.theme--documenter-dark .is-active.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-active{border-color:#1abc9c;box-shadow:0 0 0 0.125em rgba(26,188,156,0.25)}html.theme--documenter-dark .select select[disabled],html.theme--documenter-dark .textarea[disabled],html.theme--documenter-dark .input[disabled],html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input[disabled],fieldset[disabled] html.theme--documenter-dark .select select,fieldset[disabled] html.theme--documenter-dark .textarea,fieldset[disabled] html.theme--documenter-dark .input,fieldset[disabled] html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input{background-color:#8c9b9d;border-color:#282f2f;box-shadow:none;color:#fff}html.theme--documenter-dark .select select[disabled]::-moz-placeholder,html.theme--documenter-dark .textarea[disabled]::-moz-placeholder,html.theme--documenter-dark .input[disabled]::-moz-placeholder,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input[disabled]::-moz-placeholder,fieldset[disabled] html.theme--documenter-dark .select select::-moz-placeholder,fieldset[disabled] html.theme--documenter-dark .textarea::-moz-placeholder,fieldset[disabled] html.theme--documenter-dark .input::-moz-placeholder,fieldset[disabled] html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input::-moz-placeholder{color:rgba(255,255,255,0.3)}html.theme--documenter-dark .select select[disabled]::-webkit-input-placeholder,html.theme--documenter-dark .textarea[disabled]::-webkit-input-placeholder,html.theme--documenter-dark .input[disabled]::-webkit-input-placeholder,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input[disabled]::-webkit-input-placeholder,fieldset[disabled] html.theme--documenter-dark .select select::-webkit-input-placeholder,fieldset[disabled] html.theme--documenter-dark .textarea::-webkit-input-placeholder,fieldset[disabled] html.theme--documenter-dark .input::-webkit-input-placeholder,fieldset[disabled] html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input::-webkit-input-placeholder{color:rgba(255,255,255,0.3)}html.theme--documenter-dark .select select[disabled]:-moz-placeholder,html.theme--documenter-dark .textarea[disabled]:-moz-placeholder,html.theme--documenter-dark .input[disabled]:-moz-placeholder,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input[disabled]:-moz-placeholder,fieldset[disabled] html.theme--documenter-dark .select select:-moz-placeholder,fieldset[disabled] html.theme--documenter-dark .textarea:-moz-placeholder,fieldset[disabled] html.theme--documenter-dark .input:-moz-placeholder,fieldset[disabled] html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input:-moz-placeholder{color:rgba(255,255,255,0.3)}html.theme--documenter-dark .select select[disabled]:-ms-input-placeholder,html.theme--documenter-dark .textarea[disabled]:-ms-input-placeholder,html.theme--documenter-dark .input[disabled]:-ms-input-placeholder,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input[disabled]:-ms-input-placeholder,fieldset[disabled] html.theme--documenter-dark .select select:-ms-input-placeholder,fieldset[disabled] html.theme--documenter-dark .textarea:-ms-input-placeholder,fieldset[disabled] html.theme--documenter-dark .input:-ms-input-placeholder,fieldset[disabled] html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input:-ms-input-placeholder{color:rgba(255,255,255,0.3)}html.theme--documenter-dark .textarea,html.theme--documenter-dark .input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input{box-shadow:inset 0 0.0625em 0.125em rgba(10,10,10,0.05);max-width:100%;width:100%}html.theme--documenter-dark .textarea[readonly],html.theme--documenter-dark .input[readonly],html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input[readonly]{box-shadow:none}html.theme--documenter-dark .is-white.textarea,html.theme--documenter-dark .is-white.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-white{border-color:#fff}html.theme--documenter-dark .is-white.textarea:focus,html.theme--documenter-dark .is-white.input:focus,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-white:focus,html.theme--documenter-dark .is-white.is-focused.textarea,html.theme--documenter-dark .is-white.is-focused.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-focused,html.theme--documenter-dark .is-white.textarea:active,html.theme--documenter-dark .is-white.input:active,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-white:active,html.theme--documenter-dark .is-white.is-active.textarea,html.theme--documenter-dark .is-white.is-active.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(255,255,255,0.25)}html.theme--documenter-dark .is-black.textarea,html.theme--documenter-dark .is-black.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-black{border-color:#0a0a0a}html.theme--documenter-dark .is-black.textarea:focus,html.theme--documenter-dark .is-black.input:focus,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-black:focus,html.theme--documenter-dark .is-black.is-focused.textarea,html.theme--documenter-dark .is-black.is-focused.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-focused,html.theme--documenter-dark .is-black.textarea:active,html.theme--documenter-dark .is-black.input:active,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-black:active,html.theme--documenter-dark .is-black.is-active.textarea,html.theme--documenter-dark .is-black.is-active.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(10,10,10,0.25)}html.theme--documenter-dark .is-light.textarea,html.theme--documenter-dark .is-light.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-light{border-color:#ecf0f1}html.theme--documenter-dark .is-light.textarea:focus,html.theme--documenter-dark .is-light.input:focus,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-light:focus,html.theme--documenter-dark .is-light.is-focused.textarea,html.theme--documenter-dark .is-light.is-focused.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-focused,html.theme--documenter-dark .is-light.textarea:active,html.theme--documenter-dark .is-light.input:active,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-light:active,html.theme--documenter-dark .is-light.is-active.textarea,html.theme--documenter-dark .is-light.is-active.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(236,240,241,0.25)}html.theme--documenter-dark .is-dark.textarea,html.theme--documenter-dark .content kbd.textarea,html.theme--documenter-dark .is-dark.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-dark,html.theme--documenter-dark .content kbd.input{border-color:#282f2f}html.theme--documenter-dark .is-dark.textarea:focus,html.theme--documenter-dark .content kbd.textarea:focus,html.theme--documenter-dark .is-dark.input:focus,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-dark:focus,html.theme--documenter-dark .content kbd.input:focus,html.theme--documenter-dark .is-dark.is-focused.textarea,html.theme--documenter-dark .content kbd.is-focused.textarea,html.theme--documenter-dark .is-dark.is-focused.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-focused,html.theme--documenter-dark .content kbd.is-focused.input,html.theme--documenter-dark #documenter .docs-sidebar .content form.docs-search>input.is-focused,html.theme--documenter-dark .is-dark.textarea:active,html.theme--documenter-dark .content kbd.textarea:active,html.theme--documenter-dark .is-dark.input:active,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-dark:active,html.theme--documenter-dark .content kbd.input:active,html.theme--documenter-dark .is-dark.is-active.textarea,html.theme--documenter-dark .content kbd.is-active.textarea,html.theme--documenter-dark .is-dark.is-active.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-active,html.theme--documenter-dark .content kbd.is-active.input,html.theme--documenter-dark #documenter .docs-sidebar .content form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(40,47,47,0.25)}html.theme--documenter-dark .is-primary.textarea,html.theme--documenter-dark .docstring>section>a.textarea.docs-sourcelink,html.theme--documenter-dark .is-primary.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-primary,html.theme--documenter-dark .docstring>section>a.input.docs-sourcelink{border-color:#375a7f}html.theme--documenter-dark .is-primary.textarea:focus,html.theme--documenter-dark .docstring>section>a.textarea.docs-sourcelink:focus,html.theme--documenter-dark .is-primary.input:focus,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-primary:focus,html.theme--documenter-dark .docstring>section>a.input.docs-sourcelink:focus,html.theme--documenter-dark .is-primary.is-focused.textarea,html.theme--documenter-dark .docstring>section>a.is-focused.textarea.docs-sourcelink,html.theme--documenter-dark .is-primary.is-focused.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-focused,html.theme--documenter-dark .docstring>section>a.is-focused.input.docs-sourcelink,html.theme--documenter-dark .is-primary.textarea:active,html.theme--documenter-dark .docstring>section>a.textarea.docs-sourcelink:active,html.theme--documenter-dark .is-primary.input:active,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-primary:active,html.theme--documenter-dark .docstring>section>a.input.docs-sourcelink:active,html.theme--documenter-dark .is-primary.is-active.textarea,html.theme--documenter-dark .docstring>section>a.is-active.textarea.docs-sourcelink,html.theme--documenter-dark .is-primary.is-active.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-active,html.theme--documenter-dark .docstring>section>a.is-active.input.docs-sourcelink{box-shadow:0 0 0 0.125em rgba(55,90,127,0.25)}html.theme--documenter-dark .is-link.textarea,html.theme--documenter-dark .is-link.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-link{border-color:#1abc9c}html.theme--documenter-dark .is-link.textarea:focus,html.theme--documenter-dark .is-link.input:focus,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-link:focus,html.theme--documenter-dark .is-link.is-focused.textarea,html.theme--documenter-dark .is-link.is-focused.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-focused,html.theme--documenter-dark .is-link.textarea:active,html.theme--documenter-dark .is-link.input:active,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-link:active,html.theme--documenter-dark .is-link.is-active.textarea,html.theme--documenter-dark .is-link.is-active.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(26,188,156,0.25)}html.theme--documenter-dark .is-info.textarea,html.theme--documenter-dark .is-info.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-info{border-color:#024c7d}html.theme--documenter-dark .is-info.textarea:focus,html.theme--documenter-dark .is-info.input:focus,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-info:focus,html.theme--documenter-dark .is-info.is-focused.textarea,html.theme--documenter-dark .is-info.is-focused.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-focused,html.theme--documenter-dark .is-info.textarea:active,html.theme--documenter-dark .is-info.input:active,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-info:active,html.theme--documenter-dark .is-info.is-active.textarea,html.theme--documenter-dark .is-info.is-active.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(2,76,125,0.25)}html.theme--documenter-dark .is-success.textarea,html.theme--documenter-dark .is-success.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-success{border-color:#008438}html.theme--documenter-dark .is-success.textarea:focus,html.theme--documenter-dark .is-success.input:focus,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-success:focus,html.theme--documenter-dark .is-success.is-focused.textarea,html.theme--documenter-dark .is-success.is-focused.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-focused,html.theme--documenter-dark .is-success.textarea:active,html.theme--documenter-dark .is-success.input:active,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-success:active,html.theme--documenter-dark .is-success.is-active.textarea,html.theme--documenter-dark .is-success.is-active.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(0,132,56,0.25)}html.theme--documenter-dark .is-warning.textarea,html.theme--documenter-dark .is-warning.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-warning{border-color:#ad8100}html.theme--documenter-dark .is-warning.textarea:focus,html.theme--documenter-dark .is-warning.input:focus,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-warning:focus,html.theme--documenter-dark .is-warning.is-focused.textarea,html.theme--documenter-dark .is-warning.is-focused.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-focused,html.theme--documenter-dark .is-warning.textarea:active,html.theme--documenter-dark .is-warning.input:active,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-warning:active,html.theme--documenter-dark .is-warning.is-active.textarea,html.theme--documenter-dark .is-warning.is-active.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(173,129,0,0.25)}html.theme--documenter-dark .is-danger.textarea,html.theme--documenter-dark .is-danger.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-danger{border-color:#9e1b0d}html.theme--documenter-dark .is-danger.textarea:focus,html.theme--documenter-dark .is-danger.input:focus,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-danger:focus,html.theme--documenter-dark .is-danger.is-focused.textarea,html.theme--documenter-dark .is-danger.is-focused.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-focused,html.theme--documenter-dark .is-danger.textarea:active,html.theme--documenter-dark .is-danger.input:active,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-danger:active,html.theme--documenter-dark .is-danger.is-active.textarea,html.theme--documenter-dark .is-danger.is-active.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(158,27,13,0.25)}html.theme--documenter-dark .is-small.textarea,html.theme--documenter-dark .is-small.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input{border-radius:3px;font-size:.75rem}html.theme--documenter-dark .is-medium.textarea,html.theme--documenter-dark .is-medium.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-medium{font-size:1.25rem}html.theme--documenter-dark .is-large.textarea,html.theme--documenter-dark .is-large.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-large{font-size:1.5rem}html.theme--documenter-dark .is-fullwidth.textarea,html.theme--documenter-dark .is-fullwidth.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-fullwidth{display:block;width:100%}html.theme--documenter-dark .is-inline.textarea,html.theme--documenter-dark .is-inline.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-inline{display:inline;width:auto}html.theme--documenter-dark .input.is-rounded,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input{border-radius:9999px;padding-left:calc(calc(0.75em - 1px) + 0.375em);padding-right:calc(calc(0.75em - 1px) + 0.375em)}html.theme--documenter-dark .input.is-static,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-static{background-color:transparent;border-color:transparent;box-shadow:none;padding-left:0;padding-right:0}html.theme--documenter-dark .textarea{display:block;max-width:100%;min-width:100%;padding:calc(0.75em - 1px);resize:vertical}html.theme--documenter-dark .textarea:not([rows]){max-height:40em;min-height:8em}html.theme--documenter-dark .textarea[rows]{height:initial}html.theme--documenter-dark .textarea.has-fixed-size{resize:none}html.theme--documenter-dark .radio,html.theme--documenter-dark .checkbox{cursor:pointer;display:inline-block;line-height:1.25;position:relative}html.theme--documenter-dark .radio input,html.theme--documenter-dark .checkbox input{cursor:pointer}html.theme--documenter-dark .radio:hover,html.theme--documenter-dark .checkbox:hover{color:#8c9b9d}html.theme--documenter-dark .radio[disabled],html.theme--documenter-dark .checkbox[disabled],fieldset[disabled] html.theme--documenter-dark .radio,fieldset[disabled] html.theme--documenter-dark .checkbox,html.theme--documenter-dark .radio input[disabled],html.theme--documenter-dark .checkbox input[disabled]{color:#fff;cursor:not-allowed}html.theme--documenter-dark .radio+.radio{margin-left:.5em}html.theme--documenter-dark .select{display:inline-block;max-width:100%;position:relative;vertical-align:top}html.theme--documenter-dark .select:not(.is-multiple){height:2.5em}html.theme--documenter-dark .select:not(.is-multiple):not(.is-loading)::after{border-color:#1abc9c;right:1.125em;z-index:4}html.theme--documenter-dark .select.is-rounded select,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.select select{border-radius:9999px;padding-left:1em}html.theme--documenter-dark .select select{cursor:pointer;display:block;font-size:1em;max-width:100%;outline:none}html.theme--documenter-dark .select select::-ms-expand{display:none}html.theme--documenter-dark .select select[disabled]:hover,fieldset[disabled] html.theme--documenter-dark .select select:hover{border-color:#282f2f}html.theme--documenter-dark .select select:not([multiple]){padding-right:2.5em}html.theme--documenter-dark .select select[multiple]{height:auto;padding:0}html.theme--documenter-dark .select select[multiple] option{padding:0.5em 1em}html.theme--documenter-dark .select:not(.is-multiple):not(.is-loading):hover::after{border-color:#8c9b9d}html.theme--documenter-dark .select.is-white:not(:hover)::after{border-color:#fff}html.theme--documenter-dark .select.is-white select{border-color:#fff}html.theme--documenter-dark .select.is-white select:hover,html.theme--documenter-dark .select.is-white select.is-hovered{border-color:#f2f2f2}html.theme--documenter-dark .select.is-white select:focus,html.theme--documenter-dark .select.is-white select.is-focused,html.theme--documenter-dark .select.is-white select:active,html.theme--documenter-dark .select.is-white select.is-active{box-shadow:0 0 0 0.125em rgba(255,255,255,0.25)}html.theme--documenter-dark .select.is-black:not(:hover)::after{border-color:#0a0a0a}html.theme--documenter-dark .select.is-black select{border-color:#0a0a0a}html.theme--documenter-dark .select.is-black select:hover,html.theme--documenter-dark .select.is-black select.is-hovered{border-color:#000}html.theme--documenter-dark .select.is-black select:focus,html.theme--documenter-dark .select.is-black select.is-focused,html.theme--documenter-dark .select.is-black select:active,html.theme--documenter-dark .select.is-black select.is-active{box-shadow:0 0 0 0.125em rgba(10,10,10,0.25)}html.theme--documenter-dark .select.is-light:not(:hover)::after{border-color:#ecf0f1}html.theme--documenter-dark .select.is-light select{border-color:#ecf0f1}html.theme--documenter-dark .select.is-light select:hover,html.theme--documenter-dark .select.is-light select.is-hovered{border-color:#dde4e6}html.theme--documenter-dark .select.is-light select:focus,html.theme--documenter-dark .select.is-light select.is-focused,html.theme--documenter-dark .select.is-light select:active,html.theme--documenter-dark .select.is-light select.is-active{box-shadow:0 0 0 0.125em rgba(236,240,241,0.25)}html.theme--documenter-dark .select.is-dark:not(:hover)::after,html.theme--documenter-dark .content kbd.select:not(:hover)::after{border-color:#282f2f}html.theme--documenter-dark .select.is-dark select,html.theme--documenter-dark .content kbd.select select{border-color:#282f2f}html.theme--documenter-dark .select.is-dark select:hover,html.theme--documenter-dark .content kbd.select select:hover,html.theme--documenter-dark .select.is-dark select.is-hovered,html.theme--documenter-dark .content kbd.select select.is-hovered{border-color:#1d2122}html.theme--documenter-dark .select.is-dark select:focus,html.theme--documenter-dark .content kbd.select select:focus,html.theme--documenter-dark .select.is-dark select.is-focused,html.theme--documenter-dark .content kbd.select select.is-focused,html.theme--documenter-dark .select.is-dark select:active,html.theme--documenter-dark .content kbd.select select:active,html.theme--documenter-dark .select.is-dark select.is-active,html.theme--documenter-dark .content kbd.select select.is-active{box-shadow:0 0 0 0.125em rgba(40,47,47,0.25)}html.theme--documenter-dark .select.is-primary:not(:hover)::after,html.theme--documenter-dark .docstring>section>a.select.docs-sourcelink:not(:hover)::after{border-color:#375a7f}html.theme--documenter-dark .select.is-primary select,html.theme--documenter-dark .docstring>section>a.select.docs-sourcelink select{border-color:#375a7f}html.theme--documenter-dark .select.is-primary select:hover,html.theme--documenter-dark .docstring>section>a.select.docs-sourcelink select:hover,html.theme--documenter-dark .select.is-primary select.is-hovered,html.theme--documenter-dark .docstring>section>a.select.docs-sourcelink select.is-hovered{border-color:#2f4d6d}html.theme--documenter-dark .select.is-primary select:focus,html.theme--documenter-dark .docstring>section>a.select.docs-sourcelink select:focus,html.theme--documenter-dark .select.is-primary select.is-focused,html.theme--documenter-dark .docstring>section>a.select.docs-sourcelink select.is-focused,html.theme--documenter-dark .select.is-primary select:active,html.theme--documenter-dark .docstring>section>a.select.docs-sourcelink select:active,html.theme--documenter-dark .select.is-primary select.is-active,html.theme--documenter-dark .docstring>section>a.select.docs-sourcelink select.is-active{box-shadow:0 0 0 0.125em rgba(55,90,127,0.25)}html.theme--documenter-dark .select.is-link:not(:hover)::after{border-color:#1abc9c}html.theme--documenter-dark .select.is-link select{border-color:#1abc9c}html.theme--documenter-dark .select.is-link select:hover,html.theme--documenter-dark .select.is-link select.is-hovered{border-color:#17a689}html.theme--documenter-dark .select.is-link select:focus,html.theme--documenter-dark .select.is-link select.is-focused,html.theme--documenter-dark .select.is-link select:active,html.theme--documenter-dark .select.is-link select.is-active{box-shadow:0 0 0 0.125em rgba(26,188,156,0.25)}html.theme--documenter-dark .select.is-info:not(:hover)::after{border-color:#024c7d}html.theme--documenter-dark .select.is-info select{border-color:#024c7d}html.theme--documenter-dark .select.is-info select:hover,html.theme--documenter-dark .select.is-info select.is-hovered{border-color:#023d64}html.theme--documenter-dark .select.is-info select:focus,html.theme--documenter-dark .select.is-info select.is-focused,html.theme--documenter-dark .select.is-info select:active,html.theme--documenter-dark .select.is-info select.is-active{box-shadow:0 0 0 0.125em rgba(2,76,125,0.25)}html.theme--documenter-dark .select.is-success:not(:hover)::after{border-color:#008438}html.theme--documenter-dark .select.is-success select{border-color:#008438}html.theme--documenter-dark .select.is-success select:hover,html.theme--documenter-dark .select.is-success select.is-hovered{border-color:#006b2d}html.theme--documenter-dark .select.is-success select:focus,html.theme--documenter-dark .select.is-success select.is-focused,html.theme--documenter-dark .select.is-success select:active,html.theme--documenter-dark .select.is-success select.is-active{box-shadow:0 0 0 0.125em rgba(0,132,56,0.25)}html.theme--documenter-dark .select.is-warning:not(:hover)::after{border-color:#ad8100}html.theme--documenter-dark .select.is-warning select{border-color:#ad8100}html.theme--documenter-dark .select.is-warning select:hover,html.theme--documenter-dark .select.is-warning select.is-hovered{border-color:#946e00}html.theme--documenter-dark .select.is-warning select:focus,html.theme--documenter-dark .select.is-warning select.is-focused,html.theme--documenter-dark .select.is-warning select:active,html.theme--documenter-dark .select.is-warning select.is-active{box-shadow:0 0 0 0.125em rgba(173,129,0,0.25)}html.theme--documenter-dark .select.is-danger:not(:hover)::after{border-color:#9e1b0d}html.theme--documenter-dark .select.is-danger select{border-color:#9e1b0d}html.theme--documenter-dark .select.is-danger select:hover,html.theme--documenter-dark .select.is-danger select.is-hovered{border-color:#86170b}html.theme--documenter-dark .select.is-danger select:focus,html.theme--documenter-dark .select.is-danger select.is-focused,html.theme--documenter-dark .select.is-danger select:active,html.theme--documenter-dark .select.is-danger select.is-active{box-shadow:0 0 0 0.125em rgba(158,27,13,0.25)}html.theme--documenter-dark .select.is-small,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.select{border-radius:3px;font-size:.75rem}html.theme--documenter-dark .select.is-medium{font-size:1.25rem}html.theme--documenter-dark .select.is-large{font-size:1.5rem}html.theme--documenter-dark .select.is-disabled::after{border-color:#fff !important;opacity:0.5}html.theme--documenter-dark .select.is-fullwidth{width:100%}html.theme--documenter-dark .select.is-fullwidth select{width:100%}html.theme--documenter-dark .select.is-loading::after{margin-top:0;position:absolute;right:.625em;top:0.625em;transform:none}html.theme--documenter-dark .select.is-loading.is-small:after,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-loading:after{font-size:.75rem}html.theme--documenter-dark .select.is-loading.is-medium:after{font-size:1.25rem}html.theme--documenter-dark .select.is-loading.is-large:after{font-size:1.5rem}html.theme--documenter-dark .file{align-items:stretch;display:flex;justify-content:flex-start;position:relative}html.theme--documenter-dark .file.is-white .file-cta{background-color:#fff;border-color:transparent;color:#0a0a0a}html.theme--documenter-dark .file.is-white:hover .file-cta,html.theme--documenter-dark .file.is-white.is-hovered .file-cta{background-color:#f9f9f9;border-color:transparent;color:#0a0a0a}html.theme--documenter-dark .file.is-white:focus .file-cta,html.theme--documenter-dark .file.is-white.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(255,255,255,0.25);color:#0a0a0a}html.theme--documenter-dark .file.is-white:active .file-cta,html.theme--documenter-dark .file.is-white.is-active .file-cta{background-color:#f2f2f2;border-color:transparent;color:#0a0a0a}html.theme--documenter-dark .file.is-black .file-cta{background-color:#0a0a0a;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-black:hover .file-cta,html.theme--documenter-dark .file.is-black.is-hovered .file-cta{background-color:#040404;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-black:focus .file-cta,html.theme--documenter-dark .file.is-black.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(10,10,10,0.25);color:#fff}html.theme--documenter-dark .file.is-black:active .file-cta,html.theme--documenter-dark .file.is-black.is-active .file-cta{background-color:#000;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-light .file-cta{background-color:#ecf0f1;border-color:transparent;color:rgba(0,0,0,0.7)}html.theme--documenter-dark .file.is-light:hover .file-cta,html.theme--documenter-dark .file.is-light.is-hovered .file-cta{background-color:#e5eaec;border-color:transparent;color:rgba(0,0,0,0.7)}html.theme--documenter-dark .file.is-light:focus .file-cta,html.theme--documenter-dark .file.is-light.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(236,240,241,0.25);color:rgba(0,0,0,0.7)}html.theme--documenter-dark .file.is-light:active .file-cta,html.theme--documenter-dark .file.is-light.is-active .file-cta{background-color:#dde4e6;border-color:transparent;color:rgba(0,0,0,0.7)}html.theme--documenter-dark .file.is-dark .file-cta,html.theme--documenter-dark .content kbd.file .file-cta{background-color:#282f2f;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-dark:hover .file-cta,html.theme--documenter-dark .content kbd.file:hover .file-cta,html.theme--documenter-dark .file.is-dark.is-hovered .file-cta,html.theme--documenter-dark .content kbd.file.is-hovered .file-cta{background-color:#232829;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-dark:focus .file-cta,html.theme--documenter-dark .content kbd.file:focus .file-cta,html.theme--documenter-dark .file.is-dark.is-focused .file-cta,html.theme--documenter-dark .content kbd.file.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(40,47,47,0.25);color:#fff}html.theme--documenter-dark .file.is-dark:active .file-cta,html.theme--documenter-dark .content kbd.file:active .file-cta,html.theme--documenter-dark .file.is-dark.is-active .file-cta,html.theme--documenter-dark .content kbd.file.is-active .file-cta{background-color:#1d2122;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-primary .file-cta,html.theme--documenter-dark .docstring>section>a.file.docs-sourcelink .file-cta{background-color:#375a7f;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-primary:hover .file-cta,html.theme--documenter-dark .docstring>section>a.file.docs-sourcelink:hover .file-cta,html.theme--documenter-dark .file.is-primary.is-hovered .file-cta,html.theme--documenter-dark .docstring>section>a.file.is-hovered.docs-sourcelink .file-cta{background-color:#335476;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-primary:focus .file-cta,html.theme--documenter-dark .docstring>section>a.file.docs-sourcelink:focus .file-cta,html.theme--documenter-dark .file.is-primary.is-focused .file-cta,html.theme--documenter-dark .docstring>section>a.file.is-focused.docs-sourcelink .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(55,90,127,0.25);color:#fff}html.theme--documenter-dark .file.is-primary:active .file-cta,html.theme--documenter-dark .docstring>section>a.file.docs-sourcelink:active .file-cta,html.theme--documenter-dark .file.is-primary.is-active .file-cta,html.theme--documenter-dark .docstring>section>a.file.is-active.docs-sourcelink .file-cta{background-color:#2f4d6d;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-link .file-cta{background-color:#1abc9c;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-link:hover .file-cta,html.theme--documenter-dark .file.is-link.is-hovered .file-cta{background-color:#18b193;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-link:focus .file-cta,html.theme--documenter-dark .file.is-link.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(26,188,156,0.25);color:#fff}html.theme--documenter-dark .file.is-link:active .file-cta,html.theme--documenter-dark .file.is-link.is-active .file-cta{background-color:#17a689;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-info .file-cta{background-color:#024c7d;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-info:hover .file-cta,html.theme--documenter-dark .file.is-info.is-hovered .file-cta{background-color:#024470;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-info:focus .file-cta,html.theme--documenter-dark .file.is-info.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(2,76,125,0.25);color:#fff}html.theme--documenter-dark .file.is-info:active .file-cta,html.theme--documenter-dark .file.is-info.is-active .file-cta{background-color:#023d64;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-success .file-cta{background-color:#008438;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-success:hover .file-cta,html.theme--documenter-dark .file.is-success.is-hovered .file-cta{background-color:#073;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-success:focus .file-cta,html.theme--documenter-dark .file.is-success.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(0,132,56,0.25);color:#fff}html.theme--documenter-dark .file.is-success:active .file-cta,html.theme--documenter-dark .file.is-success.is-active .file-cta{background-color:#006b2d;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-warning .file-cta{background-color:#ad8100;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-warning:hover .file-cta,html.theme--documenter-dark .file.is-warning.is-hovered .file-cta{background-color:#a07700;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-warning:focus .file-cta,html.theme--documenter-dark .file.is-warning.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(173,129,0,0.25);color:#fff}html.theme--documenter-dark .file.is-warning:active .file-cta,html.theme--documenter-dark .file.is-warning.is-active .file-cta{background-color:#946e00;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-danger .file-cta{background-color:#9e1b0d;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-danger:hover .file-cta,html.theme--documenter-dark .file.is-danger.is-hovered .file-cta{background-color:#92190c;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-danger:focus .file-cta,html.theme--documenter-dark .file.is-danger.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(158,27,13,0.25);color:#fff}html.theme--documenter-dark .file.is-danger:active .file-cta,html.theme--documenter-dark .file.is-danger.is-active .file-cta{background-color:#86170b;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-small,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.file{font-size:.75rem}html.theme--documenter-dark .file.is-normal{font-size:1rem}html.theme--documenter-dark .file.is-medium{font-size:1.25rem}html.theme--documenter-dark .file.is-medium .file-icon .fa{font-size:21px}html.theme--documenter-dark .file.is-large{font-size:1.5rem}html.theme--documenter-dark .file.is-large .file-icon .fa{font-size:28px}html.theme--documenter-dark .file.has-name .file-cta{border-bottom-right-radius:0;border-top-right-radius:0}html.theme--documenter-dark .file.has-name .file-name{border-bottom-left-radius:0;border-top-left-radius:0}html.theme--documenter-dark .file.has-name.is-empty .file-cta{border-radius:.4em}html.theme--documenter-dark .file.has-name.is-empty .file-name{display:none}html.theme--documenter-dark .file.is-boxed .file-label{flex-direction:column}html.theme--documenter-dark .file.is-boxed .file-cta{flex-direction:column;height:auto;padding:1em 3em}html.theme--documenter-dark .file.is-boxed .file-name{border-width:0 1px 1px}html.theme--documenter-dark .file.is-boxed .file-icon{height:1.5em;width:1.5em}html.theme--documenter-dark .file.is-boxed .file-icon .fa{font-size:21px}html.theme--documenter-dark .file.is-boxed.is-small .file-icon .fa,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-boxed .file-icon .fa{font-size:14px}html.theme--documenter-dark .file.is-boxed.is-medium .file-icon .fa{font-size:28px}html.theme--documenter-dark .file.is-boxed.is-large .file-icon .fa{font-size:35px}html.theme--documenter-dark .file.is-boxed.has-name .file-cta{border-radius:.4em .4em 0 0}html.theme--documenter-dark .file.is-boxed.has-name .file-name{border-radius:0 0 .4em .4em;border-width:0 1px 1px}html.theme--documenter-dark .file.is-centered{justify-content:center}html.theme--documenter-dark .file.is-fullwidth .file-label{width:100%}html.theme--documenter-dark .file.is-fullwidth .file-name{flex-grow:1;max-width:none}html.theme--documenter-dark .file.is-right{justify-content:flex-end}html.theme--documenter-dark .file.is-right .file-cta{border-radius:0 .4em .4em 0}html.theme--documenter-dark .file.is-right .file-name{border-radius:.4em 0 0 .4em;border-width:1px 0 1px 1px;order:-1}html.theme--documenter-dark .file-label{align-items:stretch;display:flex;cursor:pointer;justify-content:flex-start;overflow:hidden;position:relative}html.theme--documenter-dark .file-label:hover .file-cta{background-color:#232829;color:#f2f2f2}html.theme--documenter-dark .file-label:hover .file-name{border-color:#596668}html.theme--documenter-dark .file-label:active .file-cta{background-color:#1d2122;color:#f2f2f2}html.theme--documenter-dark .file-label:active .file-name{border-color:#535f61}html.theme--documenter-dark .file-input{height:100%;left:0;opacity:0;outline:none;position:absolute;top:0;width:100%}html.theme--documenter-dark .file-cta,html.theme--documenter-dark .file-name{border-color:#5e6d6f;border-radius:.4em;font-size:1em;padding-left:1em;padding-right:1em;white-space:nowrap}html.theme--documenter-dark .file-cta{background-color:#282f2f;color:#fff}html.theme--documenter-dark .file-name{border-color:#5e6d6f;border-style:solid;border-width:1px 1px 1px 0;display:block;max-width:16em;overflow:hidden;text-align:inherit;text-overflow:ellipsis}html.theme--documenter-dark .file-icon{align-items:center;display:flex;height:1em;justify-content:center;margin-right:.5em;width:1em}html.theme--documenter-dark .file-icon .fa{font-size:14px}html.theme--documenter-dark .label{color:#f2f2f2;display:block;font-size:1rem;font-weight:700}html.theme--documenter-dark .label:not(:last-child){margin-bottom:0.5em}html.theme--documenter-dark .label.is-small,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.label{font-size:.75rem}html.theme--documenter-dark .label.is-medium{font-size:1.25rem}html.theme--documenter-dark .label.is-large{font-size:1.5rem}html.theme--documenter-dark .help{display:block;font-size:.75rem;margin-top:0.25rem}html.theme--documenter-dark .help.is-white{color:#fff}html.theme--documenter-dark .help.is-black{color:#0a0a0a}html.theme--documenter-dark .help.is-light{color:#ecf0f1}html.theme--documenter-dark .help.is-dark,html.theme--documenter-dark .content kbd.help{color:#282f2f}html.theme--documenter-dark .help.is-primary,html.theme--documenter-dark .docstring>section>a.help.docs-sourcelink{color:#375a7f}html.theme--documenter-dark .help.is-link{color:#1abc9c}html.theme--documenter-dark .help.is-info{color:#024c7d}html.theme--documenter-dark .help.is-success{color:#008438}html.theme--documenter-dark .help.is-warning{color:#ad8100}html.theme--documenter-dark .help.is-danger{color:#9e1b0d}html.theme--documenter-dark .field:not(:last-child){margin-bottom:0.75rem}html.theme--documenter-dark .field.has-addons{display:flex;justify-content:flex-start}html.theme--documenter-dark .field.has-addons .control:not(:last-child){margin-right:-1px}html.theme--documenter-dark .field.has-addons .control:not(:first-child):not(:last-child) .button,html.theme--documenter-dark .field.has-addons .control:not(:first-child):not(:last-child) .input,html.theme--documenter-dark .field.has-addons .control:not(:first-child):not(:last-child) #documenter .docs-sidebar form.docs-search>input,html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control:not(:first-child):not(:last-child) form.docs-search>input,html.theme--documenter-dark .field.has-addons .control:not(:first-child):not(:last-child) .select select{border-radius:0}html.theme--documenter-dark .field.has-addons .control:first-child:not(:only-child) .button,html.theme--documenter-dark .field.has-addons .control:first-child:not(:only-child) .input,html.theme--documenter-dark .field.has-addons .control:first-child:not(:only-child) #documenter .docs-sidebar form.docs-search>input,html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control:first-child:not(:only-child) form.docs-search>input,html.theme--documenter-dark .field.has-addons .control:first-child:not(:only-child) .select select{border-bottom-right-radius:0;border-top-right-radius:0}html.theme--documenter-dark .field.has-addons .control:last-child:not(:only-child) .button,html.theme--documenter-dark .field.has-addons .control:last-child:not(:only-child) .input,html.theme--documenter-dark .field.has-addons .control:last-child:not(:only-child) #documenter .docs-sidebar form.docs-search>input,html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control:last-child:not(:only-child) form.docs-search>input,html.theme--documenter-dark .field.has-addons .control:last-child:not(:only-child) .select select{border-bottom-left-radius:0;border-top-left-radius:0}html.theme--documenter-dark .field.has-addons .control .button:not([disabled]):hover,html.theme--documenter-dark .field.has-addons .control .button.is-hovered:not([disabled]),html.theme--documenter-dark .field.has-addons .control .input:not([disabled]):hover,html.theme--documenter-dark .field.has-addons .control #documenter .docs-sidebar form.docs-search>input:not([disabled]):hover,html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control form.docs-search>input:not([disabled]):hover,html.theme--documenter-dark .field.has-addons .control .input.is-hovered:not([disabled]),html.theme--documenter-dark .field.has-addons .control #documenter .docs-sidebar form.docs-search>input.is-hovered:not([disabled]),html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control form.docs-search>input.is-hovered:not([disabled]),html.theme--documenter-dark .field.has-addons .control .select select:not([disabled]):hover,html.theme--documenter-dark .field.has-addons .control .select select.is-hovered:not([disabled]){z-index:2}html.theme--documenter-dark .field.has-addons .control .button:not([disabled]):focus,html.theme--documenter-dark .field.has-addons .control .button.is-focused:not([disabled]),html.theme--documenter-dark .field.has-addons .control .button:not([disabled]):active,html.theme--documenter-dark .field.has-addons .control .button.is-active:not([disabled]),html.theme--documenter-dark .field.has-addons .control .input:not([disabled]):focus,html.theme--documenter-dark .field.has-addons .control #documenter .docs-sidebar form.docs-search>input:not([disabled]):focus,html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control form.docs-search>input:not([disabled]):focus,html.theme--documenter-dark .field.has-addons .control .input.is-focused:not([disabled]),html.theme--documenter-dark .field.has-addons .control #documenter .docs-sidebar form.docs-search>input.is-focused:not([disabled]),html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control form.docs-search>input.is-focused:not([disabled]),html.theme--documenter-dark .field.has-addons .control .input:not([disabled]):active,html.theme--documenter-dark .field.has-addons .control #documenter .docs-sidebar form.docs-search>input:not([disabled]):active,html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control form.docs-search>input:not([disabled]):active,html.theme--documenter-dark .field.has-addons .control .input.is-active:not([disabled]),html.theme--documenter-dark .field.has-addons .control #documenter .docs-sidebar form.docs-search>input.is-active:not([disabled]),html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control form.docs-search>input.is-active:not([disabled]),html.theme--documenter-dark .field.has-addons .control .select select:not([disabled]):focus,html.theme--documenter-dark .field.has-addons .control .select select.is-focused:not([disabled]),html.theme--documenter-dark .field.has-addons .control .select select:not([disabled]):active,html.theme--documenter-dark .field.has-addons .control .select select.is-active:not([disabled]){z-index:3}html.theme--documenter-dark .field.has-addons .control .button:not([disabled]):focus:hover,html.theme--documenter-dark .field.has-addons .control .button.is-focused:not([disabled]):hover,html.theme--documenter-dark .field.has-addons .control .button:not([disabled]):active:hover,html.theme--documenter-dark .field.has-addons .control .button.is-active:not([disabled]):hover,html.theme--documenter-dark .field.has-addons .control .input:not([disabled]):focus:hover,html.theme--documenter-dark .field.has-addons .control #documenter .docs-sidebar form.docs-search>input:not([disabled]):focus:hover,html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control form.docs-search>input:not([disabled]):focus:hover,html.theme--documenter-dark .field.has-addons .control .input.is-focused:not([disabled]):hover,html.theme--documenter-dark .field.has-addons .control #documenter .docs-sidebar form.docs-search>input.is-focused:not([disabled]):hover,html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control form.docs-search>input.is-focused:not([disabled]):hover,html.theme--documenter-dark .field.has-addons .control .input:not([disabled]):active:hover,html.theme--documenter-dark .field.has-addons .control #documenter .docs-sidebar form.docs-search>input:not([disabled]):active:hover,html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control form.docs-search>input:not([disabled]):active:hover,html.theme--documenter-dark .field.has-addons .control .input.is-active:not([disabled]):hover,html.theme--documenter-dark .field.has-addons .control #documenter .docs-sidebar form.docs-search>input.is-active:not([disabled]):hover,html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control form.docs-search>input.is-active:not([disabled]):hover,html.theme--documenter-dark .field.has-addons .control .select select:not([disabled]):focus:hover,html.theme--documenter-dark .field.has-addons .control .select select.is-focused:not([disabled]):hover,html.theme--documenter-dark .field.has-addons .control .select select:not([disabled]):active:hover,html.theme--documenter-dark .field.has-addons .control .select select.is-active:not([disabled]):hover{z-index:4}html.theme--documenter-dark .field.has-addons .control.is-expanded{flex-grow:1;flex-shrink:1}html.theme--documenter-dark .field.has-addons.has-addons-centered{justify-content:center}html.theme--documenter-dark .field.has-addons.has-addons-right{justify-content:flex-end}html.theme--documenter-dark .field.has-addons.has-addons-fullwidth .control{flex-grow:1;flex-shrink:0}html.theme--documenter-dark .field.is-grouped{display:flex;justify-content:flex-start}html.theme--documenter-dark .field.is-grouped>.control{flex-shrink:0}html.theme--documenter-dark .field.is-grouped>.control:not(:last-child){margin-bottom:0;margin-right:.75rem}html.theme--documenter-dark .field.is-grouped>.control.is-expanded{flex-grow:1;flex-shrink:1}html.theme--documenter-dark .field.is-grouped.is-grouped-centered{justify-content:center}html.theme--documenter-dark .field.is-grouped.is-grouped-right{justify-content:flex-end}html.theme--documenter-dark .field.is-grouped.is-grouped-multiline{flex-wrap:wrap}html.theme--documenter-dark .field.is-grouped.is-grouped-multiline>.control:last-child,html.theme--documenter-dark .field.is-grouped.is-grouped-multiline>.control:not(:last-child){margin-bottom:0.75rem}html.theme--documenter-dark .field.is-grouped.is-grouped-multiline:last-child{margin-bottom:-0.75rem}html.theme--documenter-dark .field.is-grouped.is-grouped-multiline:not(:last-child){margin-bottom:0}@media screen and (min-width: 769px),print{html.theme--documenter-dark .field.is-horizontal{display:flex}}html.theme--documenter-dark .field-label .label{font-size:inherit}@media screen and (max-width: 768px){html.theme--documenter-dark .field-label{margin-bottom:0.5rem}}@media screen and (min-width: 769px),print{html.theme--documenter-dark .field-label{flex-basis:0;flex-grow:1;flex-shrink:0;margin-right:1.5rem;text-align:right}html.theme--documenter-dark .field-label.is-small,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.field-label{font-size:.75rem;padding-top:0.375em}html.theme--documenter-dark .field-label.is-normal{padding-top:0.375em}html.theme--documenter-dark .field-label.is-medium{font-size:1.25rem;padding-top:0.375em}html.theme--documenter-dark .field-label.is-large{font-size:1.5rem;padding-top:0.375em}}html.theme--documenter-dark .field-body .field .field{margin-bottom:0}@media screen and (min-width: 769px),print{html.theme--documenter-dark .field-body{display:flex;flex-basis:0;flex-grow:5;flex-shrink:1}html.theme--documenter-dark .field-body .field{margin-bottom:0}html.theme--documenter-dark .field-body>.field{flex-shrink:1}html.theme--documenter-dark .field-body>.field:not(.is-narrow){flex-grow:1}html.theme--documenter-dark .field-body>.field:not(:last-child){margin-right:.75rem}}html.theme--documenter-dark .control{box-sizing:border-box;clear:both;font-size:1rem;position:relative;text-align:inherit}html.theme--documenter-dark .control.has-icons-left .input:focus~.icon,html.theme--documenter-dark .control.has-icons-left #documenter .docs-sidebar form.docs-search>input:focus~.icon,html.theme--documenter-dark #documenter .docs-sidebar .control.has-icons-left form.docs-search>input:focus~.icon,html.theme--documenter-dark .control.has-icons-left .select:focus~.icon,html.theme--documenter-dark .control.has-icons-right .input:focus~.icon,html.theme--documenter-dark .control.has-icons-right #documenter .docs-sidebar form.docs-search>input:focus~.icon,html.theme--documenter-dark #documenter .docs-sidebar .control.has-icons-right form.docs-search>input:focus~.icon,html.theme--documenter-dark .control.has-icons-right .select:focus~.icon{color:#282f2f}html.theme--documenter-dark .control.has-icons-left .input.is-small~.icon,html.theme--documenter-dark .control.has-icons-left #documenter .docs-sidebar form.docs-search>input~.icon,html.theme--documenter-dark #documenter .docs-sidebar .control.has-icons-left form.docs-search>input~.icon,html.theme--documenter-dark .control.has-icons-left .select.is-small~.icon,html.theme--documenter-dark .control.has-icons-right .input.is-small~.icon,html.theme--documenter-dark .control.has-icons-right #documenter .docs-sidebar form.docs-search>input~.icon,html.theme--documenter-dark #documenter .docs-sidebar .control.has-icons-right form.docs-search>input~.icon,html.theme--documenter-dark .control.has-icons-right .select.is-small~.icon{font-size:.75rem}html.theme--documenter-dark .control.has-icons-left .input.is-medium~.icon,html.theme--documenter-dark .control.has-icons-left #documenter .docs-sidebar form.docs-search>input.is-medium~.icon,html.theme--documenter-dark #documenter .docs-sidebar .control.has-icons-left form.docs-search>input.is-medium~.icon,html.theme--documenter-dark .control.has-icons-left .select.is-medium~.icon,html.theme--documenter-dark .control.has-icons-right .input.is-medium~.icon,html.theme--documenter-dark .control.has-icons-right #documenter .docs-sidebar form.docs-search>input.is-medium~.icon,html.theme--documenter-dark #documenter .docs-sidebar .control.has-icons-right form.docs-search>input.is-medium~.icon,html.theme--documenter-dark .control.has-icons-right .select.is-medium~.icon{font-size:1.25rem}html.theme--documenter-dark .control.has-icons-left .input.is-large~.icon,html.theme--documenter-dark .control.has-icons-left #documenter .docs-sidebar form.docs-search>input.is-large~.icon,html.theme--documenter-dark #documenter .docs-sidebar .control.has-icons-left form.docs-search>input.is-large~.icon,html.theme--documenter-dark .control.has-icons-left .select.is-large~.icon,html.theme--documenter-dark .control.has-icons-right .input.is-large~.icon,html.theme--documenter-dark .control.has-icons-right #documenter .docs-sidebar form.docs-search>input.is-large~.icon,html.theme--documenter-dark #documenter .docs-sidebar .control.has-icons-right form.docs-search>input.is-large~.icon,html.theme--documenter-dark .control.has-icons-right .select.is-large~.icon{font-size:1.5rem}html.theme--documenter-dark .control.has-icons-left .icon,html.theme--documenter-dark .control.has-icons-right .icon{color:#5e6d6f;height:2.5em;pointer-events:none;position:absolute;top:0;width:2.5em;z-index:4}html.theme--documenter-dark .control.has-icons-left .input,html.theme--documenter-dark .control.has-icons-left #documenter .docs-sidebar form.docs-search>input,html.theme--documenter-dark #documenter .docs-sidebar .control.has-icons-left form.docs-search>input,html.theme--documenter-dark .control.has-icons-left .select select{padding-left:2.5em}html.theme--documenter-dark .control.has-icons-left .icon.is-left{left:0}html.theme--documenter-dark .control.has-icons-right .input,html.theme--documenter-dark .control.has-icons-right #documenter .docs-sidebar form.docs-search>input,html.theme--documenter-dark #documenter .docs-sidebar .control.has-icons-right form.docs-search>input,html.theme--documenter-dark .control.has-icons-right .select select{padding-right:2.5em}html.theme--documenter-dark .control.has-icons-right .icon.is-right{right:0}html.theme--documenter-dark .control.is-loading::after{position:absolute !important;right:.625em;top:0.625em;z-index:4}html.theme--documenter-dark .control.is-loading.is-small:after,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-loading:after{font-size:.75rem}html.theme--documenter-dark .control.is-loading.is-medium:after{font-size:1.25rem}html.theme--documenter-dark .control.is-loading.is-large:after{font-size:1.5rem}html.theme--documenter-dark .breadcrumb{font-size:1rem;white-space:nowrap}html.theme--documenter-dark .breadcrumb a{align-items:center;color:#1abc9c;display:flex;justify-content:center;padding:0 .75em}html.theme--documenter-dark .breadcrumb a:hover{color:#1dd2af}html.theme--documenter-dark .breadcrumb li{align-items:center;display:flex}html.theme--documenter-dark .breadcrumb li:first-child a{padding-left:0}html.theme--documenter-dark .breadcrumb li.is-active a{color:#f2f2f2;cursor:default;pointer-events:none}html.theme--documenter-dark .breadcrumb li+li::before{color:#8c9b9d;content:"\0002f"}html.theme--documenter-dark .breadcrumb ul,html.theme--documenter-dark .breadcrumb ol{align-items:flex-start;display:flex;flex-wrap:wrap;justify-content:flex-start}html.theme--documenter-dark .breadcrumb .icon:first-child{margin-right:.5em}html.theme--documenter-dark .breadcrumb .icon:last-child{margin-left:.5em}html.theme--documenter-dark .breadcrumb.is-centered ol,html.theme--documenter-dark .breadcrumb.is-centered ul{justify-content:center}html.theme--documenter-dark .breadcrumb.is-right ol,html.theme--documenter-dark .breadcrumb.is-right ul{justify-content:flex-end}html.theme--documenter-dark .breadcrumb.is-small,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.breadcrumb{font-size:.75rem}html.theme--documenter-dark .breadcrumb.is-medium{font-size:1.25rem}html.theme--documenter-dark .breadcrumb.is-large{font-size:1.5rem}html.theme--documenter-dark .breadcrumb.has-arrow-separator li+li::before{content:"\02192"}html.theme--documenter-dark .breadcrumb.has-bullet-separator li+li::before{content:"\02022"}html.theme--documenter-dark .breadcrumb.has-dot-separator li+li::before{content:"\000b7"}html.theme--documenter-dark .breadcrumb.has-succeeds-separator li+li::before{content:"\0227B"}html.theme--documenter-dark .card{background-color:#fff;border-radius:.25rem;box-shadow:#171717;color:#fff;max-width:100%;position:relative}html.theme--documenter-dark .card-footer:first-child,html.theme--documenter-dark .card-content:first-child,html.theme--documenter-dark .card-header:first-child{border-top-left-radius:.25rem;border-top-right-radius:.25rem}html.theme--documenter-dark .card-footer:last-child,html.theme--documenter-dark .card-content:last-child,html.theme--documenter-dark .card-header:last-child{border-bottom-left-radius:.25rem;border-bottom-right-radius:.25rem}html.theme--documenter-dark .card-header{background-color:rgba(0,0,0,0);align-items:stretch;box-shadow:0 0.125em 0.25em rgba(10,10,10,0.1);display:flex}html.theme--documenter-dark .card-header-title{align-items:center;color:#f2f2f2;display:flex;flex-grow:1;font-weight:700;padding:0.75rem 1rem}html.theme--documenter-dark .card-header-title.is-centered{justify-content:center}html.theme--documenter-dark .card-header-icon{-moz-appearance:none;-webkit-appearance:none;appearance:none;background:none;border:none;color:currentColor;font-family:inherit;font-size:1em;margin:0;padding:0;align-items:center;cursor:pointer;display:flex;justify-content:center;padding:0.75rem 1rem}html.theme--documenter-dark .card-image{display:block;position:relative}html.theme--documenter-dark .card-image:first-child img{border-top-left-radius:.25rem;border-top-right-radius:.25rem}html.theme--documenter-dark .card-image:last-child img{border-bottom-left-radius:.25rem;border-bottom-right-radius:.25rem}html.theme--documenter-dark .card-content{background-color:rgba(0,0,0,0);padding:1.5rem}html.theme--documenter-dark .card-footer{background-color:rgba(0,0,0,0);border-top:1px solid #ededed;align-items:stretch;display:flex}html.theme--documenter-dark .card-footer-item{align-items:center;display:flex;flex-basis:0;flex-grow:1;flex-shrink:0;justify-content:center;padding:.75rem}html.theme--documenter-dark .card-footer-item:not(:last-child){border-right:1px solid #ededed}html.theme--documenter-dark .card .media:not(:last-child){margin-bottom:1.5rem}html.theme--documenter-dark .dropdown{display:inline-flex;position:relative;vertical-align:top}html.theme--documenter-dark .dropdown.is-active .dropdown-menu,html.theme--documenter-dark .dropdown.is-hoverable:hover .dropdown-menu{display:block}html.theme--documenter-dark .dropdown.is-right .dropdown-menu{left:auto;right:0}html.theme--documenter-dark .dropdown.is-up .dropdown-menu{bottom:100%;padding-bottom:4px;padding-top:initial;top:auto}html.theme--documenter-dark .dropdown-menu{display:none;left:0;min-width:12rem;padding-top:4px;position:absolute;top:100%;z-index:20}html.theme--documenter-dark .dropdown-content{background-color:#282f2f;border-radius:.4em;box-shadow:#171717;padding-bottom:.5rem;padding-top:.5rem}html.theme--documenter-dark .dropdown-item{color:#fff;display:block;font-size:0.875rem;line-height:1.5;padding:0.375rem 1rem;position:relative}html.theme--documenter-dark a.dropdown-item,html.theme--documenter-dark button.dropdown-item{padding-right:3rem;text-align:inherit;white-space:nowrap;width:100%}html.theme--documenter-dark a.dropdown-item:hover,html.theme--documenter-dark button.dropdown-item:hover{background-color:#282f2f;color:#0a0a0a}html.theme--documenter-dark a.dropdown-item.is-active,html.theme--documenter-dark button.dropdown-item.is-active{background-color:#1abc9c;color:#fff}html.theme--documenter-dark .dropdown-divider{background-color:#ededed;border:none;display:block;height:1px;margin:0.5rem 0}html.theme--documenter-dark .level{align-items:center;justify-content:space-between}html.theme--documenter-dark .level code{border-radius:.4em}html.theme--documenter-dark .level img{display:inline-block;vertical-align:top}html.theme--documenter-dark .level.is-mobile{display:flex}html.theme--documenter-dark .level.is-mobile .level-left,html.theme--documenter-dark .level.is-mobile .level-right{display:flex}html.theme--documenter-dark .level.is-mobile .level-left+.level-right{margin-top:0}html.theme--documenter-dark .level.is-mobile .level-item:not(:last-child){margin-bottom:0;margin-right:.75rem}html.theme--documenter-dark .level.is-mobile .level-item:not(.is-narrow){flex-grow:1}@media screen and (min-width: 769px),print{html.theme--documenter-dark .level{display:flex}html.theme--documenter-dark .level>.level-item:not(.is-narrow){flex-grow:1}}html.theme--documenter-dark .level-item{align-items:center;display:flex;flex-basis:auto;flex-grow:0;flex-shrink:0;justify-content:center}html.theme--documenter-dark .level-item .title,html.theme--documenter-dark .level-item .subtitle{margin-bottom:0}@media screen and (max-width: 768px){html.theme--documenter-dark .level-item:not(:last-child){margin-bottom:.75rem}}html.theme--documenter-dark .level-left,html.theme--documenter-dark .level-right{flex-basis:auto;flex-grow:0;flex-shrink:0}html.theme--documenter-dark .level-left .level-item.is-flexible,html.theme--documenter-dark .level-right .level-item.is-flexible{flex-grow:1}@media screen and (min-width: 769px),print{html.theme--documenter-dark .level-left .level-item:not(:last-child),html.theme--documenter-dark .level-right .level-item:not(:last-child){margin-right:.75rem}}html.theme--documenter-dark .level-left{align-items:center;justify-content:flex-start}@media screen and (max-width: 768px){html.theme--documenter-dark .level-left+.level-right{margin-top:1.5rem}}@media screen and (min-width: 769px),print{html.theme--documenter-dark .level-left{display:flex}}html.theme--documenter-dark .level-right{align-items:center;justify-content:flex-end}@media screen and (min-width: 769px),print{html.theme--documenter-dark .level-right{display:flex}}html.theme--documenter-dark .media{align-items:flex-start;display:flex;text-align:inherit}html.theme--documenter-dark .media .content:not(:last-child){margin-bottom:.75rem}html.theme--documenter-dark .media .media{border-top:1px solid rgba(94,109,111,0.5);display:flex;padding-top:.75rem}html.theme--documenter-dark .media .media .content:not(:last-child),html.theme--documenter-dark .media .media .control:not(:last-child){margin-bottom:.5rem}html.theme--documenter-dark .media .media .media{padding-top:.5rem}html.theme--documenter-dark .media .media .media+.media{margin-top:.5rem}html.theme--documenter-dark .media+.media{border-top:1px solid rgba(94,109,111,0.5);margin-top:1rem;padding-top:1rem}html.theme--documenter-dark .media.is-large+.media{margin-top:1.5rem;padding-top:1.5rem}html.theme--documenter-dark .media-left,html.theme--documenter-dark .media-right{flex-basis:auto;flex-grow:0;flex-shrink:0}html.theme--documenter-dark .media-left{margin-right:1rem}html.theme--documenter-dark .media-right{margin-left:1rem}html.theme--documenter-dark .media-content{flex-basis:auto;flex-grow:1;flex-shrink:1;text-align:inherit}@media screen and (max-width: 768px){html.theme--documenter-dark .media-content{overflow-x:auto}}html.theme--documenter-dark .menu{font-size:1rem}html.theme--documenter-dark .menu.is-small,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.menu{font-size:.75rem}html.theme--documenter-dark .menu.is-medium{font-size:1.25rem}html.theme--documenter-dark .menu.is-large{font-size:1.5rem}html.theme--documenter-dark .menu-list{line-height:1.25}html.theme--documenter-dark .menu-list a{border-radius:3px;color:#fff;display:block;padding:0.5em 0.75em}html.theme--documenter-dark .menu-list a:hover{background-color:#282f2f;color:#f2f2f2}html.theme--documenter-dark .menu-list a.is-active{background-color:#1abc9c;color:#fff}html.theme--documenter-dark .menu-list li ul{border-left:1px solid #5e6d6f;margin:.75em;padding-left:.75em}html.theme--documenter-dark .menu-label{color:#fff;font-size:.75em;letter-spacing:.1em;text-transform:uppercase}html.theme--documenter-dark .menu-label:not(:first-child){margin-top:1em}html.theme--documenter-dark .menu-label:not(:last-child){margin-bottom:1em}html.theme--documenter-dark .message{background-color:#282f2f;border-radius:.4em;font-size:1rem}html.theme--documenter-dark .message strong{color:currentColor}html.theme--documenter-dark .message a:not(.button):not(.tag):not(.dropdown-item){color:currentColor;text-decoration:underline}html.theme--documenter-dark .message.is-small,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.message{font-size:.75rem}html.theme--documenter-dark .message.is-medium{font-size:1.25rem}html.theme--documenter-dark .message.is-large{font-size:1.5rem}html.theme--documenter-dark .message.is-white{background-color:#fff}html.theme--documenter-dark .message.is-white .message-header{background-color:#fff;color:#0a0a0a}html.theme--documenter-dark .message.is-white .message-body{border-color:#fff}html.theme--documenter-dark .message.is-black{background-color:#fafafa}html.theme--documenter-dark .message.is-black .message-header{background-color:#0a0a0a;color:#fff}html.theme--documenter-dark .message.is-black .message-body{border-color:#0a0a0a}html.theme--documenter-dark .message.is-light{background-color:#f9fafb}html.theme--documenter-dark .message.is-light .message-header{background-color:#ecf0f1;color:rgba(0,0,0,0.7)}html.theme--documenter-dark .message.is-light .message-body{border-color:#ecf0f1}html.theme--documenter-dark .message.is-dark,html.theme--documenter-dark .content kbd.message{background-color:#f9fafa}html.theme--documenter-dark .message.is-dark .message-header,html.theme--documenter-dark .content kbd.message .message-header{background-color:#282f2f;color:#fff}html.theme--documenter-dark .message.is-dark .message-body,html.theme--documenter-dark .content kbd.message .message-body{border-color:#282f2f}html.theme--documenter-dark .message.is-primary,html.theme--documenter-dark .docstring>section>a.message.docs-sourcelink{background-color:#f1f5f9}html.theme--documenter-dark .message.is-primary .message-header,html.theme--documenter-dark .docstring>section>a.message.docs-sourcelink .message-header{background-color:#375a7f;color:#fff}html.theme--documenter-dark .message.is-primary .message-body,html.theme--documenter-dark .docstring>section>a.message.docs-sourcelink .message-body{border-color:#375a7f;color:#4d7eb2}html.theme--documenter-dark .message.is-link{background-color:#edfdf9}html.theme--documenter-dark .message.is-link .message-header{background-color:#1abc9c;color:#fff}html.theme--documenter-dark .message.is-link .message-body{border-color:#1abc9c;color:#15987e}html.theme--documenter-dark .message.is-info{background-color:#ebf7ff}html.theme--documenter-dark .message.is-info .message-header{background-color:#024c7d;color:#fff}html.theme--documenter-dark .message.is-info .message-body{border-color:#024c7d;color:#0e9dfb}html.theme--documenter-dark .message.is-success{background-color:#ebfff3}html.theme--documenter-dark .message.is-success .message-header{background-color:#008438;color:#fff}html.theme--documenter-dark .message.is-success .message-body{border-color:#008438;color:#00eb64}html.theme--documenter-dark .message.is-warning{background-color:#fffaeb}html.theme--documenter-dark .message.is-warning .message-header{background-color:#ad8100;color:#fff}html.theme--documenter-dark .message.is-warning .message-body{border-color:#ad8100;color:#d19c00}html.theme--documenter-dark .message.is-danger{background-color:#fdeeec}html.theme--documenter-dark .message.is-danger .message-header{background-color:#9e1b0d;color:#fff}html.theme--documenter-dark .message.is-danger .message-body{border-color:#9e1b0d;color:#ec311d}html.theme--documenter-dark .message-header{align-items:center;background-color:#fff;border-radius:.4em .4em 0 0;color:rgba(0,0,0,0.7);display:flex;font-weight:700;justify-content:space-between;line-height:1.25;padding:0.75em 1em;position:relative}html.theme--documenter-dark .message-header .delete{flex-grow:0;flex-shrink:0;margin-left:.75em}html.theme--documenter-dark .message-header+.message-body{border-width:0;border-top-left-radius:0;border-top-right-radius:0}html.theme--documenter-dark .message-body{border-color:#5e6d6f;border-radius:.4em;border-style:solid;border-width:0 0 0 4px;color:#fff;padding:1.25em 1.5em}html.theme--documenter-dark .message-body code,html.theme--documenter-dark .message-body pre{background-color:#fff}html.theme--documenter-dark .message-body pre code{background-color:rgba(0,0,0,0)}html.theme--documenter-dark .modal{align-items:center;display:none;flex-direction:column;justify-content:center;overflow:hidden;position:fixed;z-index:40}html.theme--documenter-dark .modal.is-active{display:flex}html.theme--documenter-dark .modal-background{background-color:rgba(10,10,10,0.86)}html.theme--documenter-dark .modal-content,html.theme--documenter-dark .modal-card{margin:0 20px;max-height:calc(100vh - 160px);overflow:auto;position:relative;width:100%}@media screen and (min-width: 769px){html.theme--documenter-dark .modal-content,html.theme--documenter-dark .modal-card{margin:0 auto;max-height:calc(100vh - 40px);width:640px}}html.theme--documenter-dark .modal-close{background:none;height:40px;position:fixed;right:20px;top:20px;width:40px}html.theme--documenter-dark .modal-card{display:flex;flex-direction:column;max-height:calc(100vh - 40px);overflow:hidden;-ms-overflow-y:visible}html.theme--documenter-dark .modal-card-head,html.theme--documenter-dark .modal-card-foot{align-items:center;background-color:#282f2f;display:flex;flex-shrink:0;justify-content:flex-start;padding:20px;position:relative}html.theme--documenter-dark .modal-card-head{border-bottom:1px solid #5e6d6f;border-top-left-radius:8px;border-top-right-radius:8px}html.theme--documenter-dark .modal-card-title{color:#f2f2f2;flex-grow:1;flex-shrink:0;font-size:1.5rem;line-height:1}html.theme--documenter-dark .modal-card-foot{border-bottom-left-radius:8px;border-bottom-right-radius:8px;border-top:1px solid #5e6d6f}html.theme--documenter-dark .modal-card-foot .button:not(:last-child){margin-right:.5em}html.theme--documenter-dark .modal-card-body{-webkit-overflow-scrolling:touch;background-color:#fff;flex-grow:1;flex-shrink:1;overflow:auto;padding:20px}html.theme--documenter-dark .navbar{background-color:#375a7f;min-height:4rem;position:relative;z-index:30}html.theme--documenter-dark .navbar.is-white{background-color:#fff;color:#0a0a0a}html.theme--documenter-dark .navbar.is-white .navbar-brand>.navbar-item,html.theme--documenter-dark .navbar.is-white .navbar-brand .navbar-link{color:#0a0a0a}html.theme--documenter-dark .navbar.is-white .navbar-brand>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-white .navbar-brand>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-white .navbar-brand>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-white .navbar-brand .navbar-link:focus,html.theme--documenter-dark .navbar.is-white .navbar-brand .navbar-link:hover,html.theme--documenter-dark .navbar.is-white .navbar-brand .navbar-link.is-active{background-color:#f2f2f2;color:#0a0a0a}html.theme--documenter-dark .navbar.is-white .navbar-brand .navbar-link::after{border-color:#0a0a0a}html.theme--documenter-dark .navbar.is-white .navbar-burger{color:#0a0a0a}@media screen and (min-width: 1056px){html.theme--documenter-dark .navbar.is-white .navbar-start>.navbar-item,html.theme--documenter-dark .navbar.is-white .navbar-start .navbar-link,html.theme--documenter-dark .navbar.is-white .navbar-end>.navbar-item,html.theme--documenter-dark .navbar.is-white .navbar-end .navbar-link{color:#0a0a0a}html.theme--documenter-dark .navbar.is-white .navbar-start>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-white .navbar-start>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-white .navbar-start>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-white .navbar-start .navbar-link:focus,html.theme--documenter-dark .navbar.is-white .navbar-start .navbar-link:hover,html.theme--documenter-dark .navbar.is-white .navbar-start .navbar-link.is-active,html.theme--documenter-dark .navbar.is-white .navbar-end>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-white .navbar-end>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-white .navbar-end>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-white .navbar-end .navbar-link:focus,html.theme--documenter-dark .navbar.is-white .navbar-end .navbar-link:hover,html.theme--documenter-dark .navbar.is-white .navbar-end .navbar-link.is-active{background-color:#f2f2f2;color:#0a0a0a}html.theme--documenter-dark .navbar.is-white .navbar-start .navbar-link::after,html.theme--documenter-dark .navbar.is-white .navbar-end .navbar-link::after{border-color:#0a0a0a}html.theme--documenter-dark .navbar.is-white .navbar-item.has-dropdown:focus .navbar-link,html.theme--documenter-dark .navbar.is-white .navbar-item.has-dropdown:hover .navbar-link,html.theme--documenter-dark .navbar.is-white .navbar-item.has-dropdown.is-active .navbar-link{background-color:#f2f2f2;color:#0a0a0a}html.theme--documenter-dark .navbar.is-white .navbar-dropdown a.navbar-item.is-active{background-color:#fff;color:#0a0a0a}}html.theme--documenter-dark .navbar.is-black{background-color:#0a0a0a;color:#fff}html.theme--documenter-dark .navbar.is-black .navbar-brand>.navbar-item,html.theme--documenter-dark .navbar.is-black .navbar-brand .navbar-link{color:#fff}html.theme--documenter-dark .navbar.is-black .navbar-brand>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-black .navbar-brand>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-black .navbar-brand>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-black .navbar-brand .navbar-link:focus,html.theme--documenter-dark .navbar.is-black .navbar-brand .navbar-link:hover,html.theme--documenter-dark .navbar.is-black .navbar-brand .navbar-link.is-active{background-color:#000;color:#fff}html.theme--documenter-dark .navbar.is-black .navbar-brand .navbar-link::after{border-color:#fff}html.theme--documenter-dark .navbar.is-black .navbar-burger{color:#fff}@media screen and (min-width: 1056px){html.theme--documenter-dark .navbar.is-black .navbar-start>.navbar-item,html.theme--documenter-dark .navbar.is-black .navbar-start .navbar-link,html.theme--documenter-dark .navbar.is-black .navbar-end>.navbar-item,html.theme--documenter-dark .navbar.is-black .navbar-end .navbar-link{color:#fff}html.theme--documenter-dark .navbar.is-black .navbar-start>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-black .navbar-start>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-black .navbar-start>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-black .navbar-start .navbar-link:focus,html.theme--documenter-dark .navbar.is-black .navbar-start .navbar-link:hover,html.theme--documenter-dark .navbar.is-black .navbar-start .navbar-link.is-active,html.theme--documenter-dark .navbar.is-black .navbar-end>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-black .navbar-end>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-black .navbar-end>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-black .navbar-end .navbar-link:focus,html.theme--documenter-dark .navbar.is-black .navbar-end .navbar-link:hover,html.theme--documenter-dark .navbar.is-black .navbar-end .navbar-link.is-active{background-color:#000;color:#fff}html.theme--documenter-dark .navbar.is-black .navbar-start .navbar-link::after,html.theme--documenter-dark .navbar.is-black .navbar-end .navbar-link::after{border-color:#fff}html.theme--documenter-dark .navbar.is-black .navbar-item.has-dropdown:focus .navbar-link,html.theme--documenter-dark .navbar.is-black .navbar-item.has-dropdown:hover .navbar-link,html.theme--documenter-dark .navbar.is-black .navbar-item.has-dropdown.is-active .navbar-link{background-color:#000;color:#fff}html.theme--documenter-dark .navbar.is-black .navbar-dropdown a.navbar-item.is-active{background-color:#0a0a0a;color:#fff}}html.theme--documenter-dark .navbar.is-light{background-color:#ecf0f1;color:rgba(0,0,0,0.7)}html.theme--documenter-dark .navbar.is-light .navbar-brand>.navbar-item,html.theme--documenter-dark .navbar.is-light .navbar-brand .navbar-link{color:rgba(0,0,0,0.7)}html.theme--documenter-dark .navbar.is-light .navbar-brand>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-light .navbar-brand>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-light .navbar-brand>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-light .navbar-brand .navbar-link:focus,html.theme--documenter-dark .navbar.is-light .navbar-brand .navbar-link:hover,html.theme--documenter-dark .navbar.is-light .navbar-brand .navbar-link.is-active{background-color:#dde4e6;color:rgba(0,0,0,0.7)}html.theme--documenter-dark .navbar.is-light .navbar-brand .navbar-link::after{border-color:rgba(0,0,0,0.7)}html.theme--documenter-dark .navbar.is-light .navbar-burger{color:rgba(0,0,0,0.7)}@media screen and (min-width: 1056px){html.theme--documenter-dark .navbar.is-light .navbar-start>.navbar-item,html.theme--documenter-dark .navbar.is-light .navbar-start .navbar-link,html.theme--documenter-dark .navbar.is-light .navbar-end>.navbar-item,html.theme--documenter-dark .navbar.is-light .navbar-end .navbar-link{color:rgba(0,0,0,0.7)}html.theme--documenter-dark .navbar.is-light .navbar-start>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-light .navbar-start>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-light .navbar-start>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-light .navbar-start .navbar-link:focus,html.theme--documenter-dark .navbar.is-light .navbar-start .navbar-link:hover,html.theme--documenter-dark .navbar.is-light .navbar-start .navbar-link.is-active,html.theme--documenter-dark .navbar.is-light .navbar-end>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-light .navbar-end>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-light .navbar-end>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-light .navbar-end .navbar-link:focus,html.theme--documenter-dark .navbar.is-light .navbar-end .navbar-link:hover,html.theme--documenter-dark .navbar.is-light .navbar-end .navbar-link.is-active{background-color:#dde4e6;color:rgba(0,0,0,0.7)}html.theme--documenter-dark .navbar.is-light .navbar-start .navbar-link::after,html.theme--documenter-dark .navbar.is-light .navbar-end .navbar-link::after{border-color:rgba(0,0,0,0.7)}html.theme--documenter-dark .navbar.is-light .navbar-item.has-dropdown:focus .navbar-link,html.theme--documenter-dark .navbar.is-light .navbar-item.has-dropdown:hover .navbar-link,html.theme--documenter-dark .navbar.is-light .navbar-item.has-dropdown.is-active .navbar-link{background-color:#dde4e6;color:rgba(0,0,0,0.7)}html.theme--documenter-dark .navbar.is-light .navbar-dropdown a.navbar-item.is-active{background-color:#ecf0f1;color:rgba(0,0,0,0.7)}}html.theme--documenter-dark .navbar.is-dark,html.theme--documenter-dark .content kbd.navbar{background-color:#282f2f;color:#fff}html.theme--documenter-dark .navbar.is-dark .navbar-brand>.navbar-item,html.theme--documenter-dark .content kbd.navbar .navbar-brand>.navbar-item,html.theme--documenter-dark .navbar.is-dark .navbar-brand .navbar-link,html.theme--documenter-dark .content kbd.navbar .navbar-brand .navbar-link{color:#fff}html.theme--documenter-dark .navbar.is-dark .navbar-brand>a.navbar-item:focus,html.theme--documenter-dark .content kbd.navbar .navbar-brand>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-dark .navbar-brand>a.navbar-item:hover,html.theme--documenter-dark .content kbd.navbar .navbar-brand>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-dark .navbar-brand>a.navbar-item.is-active,html.theme--documenter-dark .content kbd.navbar .navbar-brand>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-dark .navbar-brand .navbar-link:focus,html.theme--documenter-dark .content kbd.navbar .navbar-brand .navbar-link:focus,html.theme--documenter-dark .navbar.is-dark .navbar-brand .navbar-link:hover,html.theme--documenter-dark .content kbd.navbar .navbar-brand .navbar-link:hover,html.theme--documenter-dark .navbar.is-dark .navbar-brand .navbar-link.is-active,html.theme--documenter-dark .content kbd.navbar .navbar-brand .navbar-link.is-active{background-color:#1d2122;color:#fff}html.theme--documenter-dark .navbar.is-dark .navbar-brand .navbar-link::after,html.theme--documenter-dark .content kbd.navbar .navbar-brand .navbar-link::after{border-color:#fff}html.theme--documenter-dark .navbar.is-dark .navbar-burger,html.theme--documenter-dark .content kbd.navbar .navbar-burger{color:#fff}@media screen and (min-width: 1056px){html.theme--documenter-dark .navbar.is-dark .navbar-start>.navbar-item,html.theme--documenter-dark .content kbd.navbar .navbar-start>.navbar-item,html.theme--documenter-dark .navbar.is-dark .navbar-start .navbar-link,html.theme--documenter-dark .content kbd.navbar .navbar-start .navbar-link,html.theme--documenter-dark .navbar.is-dark .navbar-end>.navbar-item,html.theme--documenter-dark .content kbd.navbar .navbar-end>.navbar-item,html.theme--documenter-dark .navbar.is-dark .navbar-end .navbar-link,html.theme--documenter-dark .content kbd.navbar .navbar-end .navbar-link{color:#fff}html.theme--documenter-dark .navbar.is-dark .navbar-start>a.navbar-item:focus,html.theme--documenter-dark .content kbd.navbar .navbar-start>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-dark .navbar-start>a.navbar-item:hover,html.theme--documenter-dark .content kbd.navbar .navbar-start>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-dark .navbar-start>a.navbar-item.is-active,html.theme--documenter-dark .content kbd.navbar .navbar-start>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-dark .navbar-start .navbar-link:focus,html.theme--documenter-dark .content kbd.navbar .navbar-start .navbar-link:focus,html.theme--documenter-dark .navbar.is-dark .navbar-start .navbar-link:hover,html.theme--documenter-dark .content kbd.navbar .navbar-start .navbar-link:hover,html.theme--documenter-dark .navbar.is-dark .navbar-start .navbar-link.is-active,html.theme--documenter-dark .content kbd.navbar .navbar-start .navbar-link.is-active,html.theme--documenter-dark .navbar.is-dark .navbar-end>a.navbar-item:focus,html.theme--documenter-dark .content kbd.navbar .navbar-end>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-dark .navbar-end>a.navbar-item:hover,html.theme--documenter-dark .content kbd.navbar .navbar-end>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-dark .navbar-end>a.navbar-item.is-active,html.theme--documenter-dark .content kbd.navbar .navbar-end>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-dark .navbar-end .navbar-link:focus,html.theme--documenter-dark .content kbd.navbar .navbar-end .navbar-link:focus,html.theme--documenter-dark .navbar.is-dark .navbar-end .navbar-link:hover,html.theme--documenter-dark .content kbd.navbar .navbar-end .navbar-link:hover,html.theme--documenter-dark .navbar.is-dark .navbar-end .navbar-link.is-active,html.theme--documenter-dark .content kbd.navbar .navbar-end .navbar-link.is-active{background-color:#1d2122;color:#fff}html.theme--documenter-dark .navbar.is-dark .navbar-start .navbar-link::after,html.theme--documenter-dark .content kbd.navbar .navbar-start .navbar-link::after,html.theme--documenter-dark .navbar.is-dark .navbar-end .navbar-link::after,html.theme--documenter-dark .content kbd.navbar .navbar-end .navbar-link::after{border-color:#fff}html.theme--documenter-dark .navbar.is-dark .navbar-item.has-dropdown:focus .navbar-link,html.theme--documenter-dark .content kbd.navbar .navbar-item.has-dropdown:focus .navbar-link,html.theme--documenter-dark .navbar.is-dark .navbar-item.has-dropdown:hover .navbar-link,html.theme--documenter-dark .content kbd.navbar .navbar-item.has-dropdown:hover .navbar-link,html.theme--documenter-dark .navbar.is-dark .navbar-item.has-dropdown.is-active .navbar-link,html.theme--documenter-dark .content kbd.navbar .navbar-item.has-dropdown.is-active .navbar-link{background-color:#1d2122;color:#fff}html.theme--documenter-dark .navbar.is-dark .navbar-dropdown a.navbar-item.is-active,html.theme--documenter-dark .content kbd.navbar .navbar-dropdown a.navbar-item.is-active{background-color:#282f2f;color:#fff}}html.theme--documenter-dark .navbar.is-primary,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink{background-color:#375a7f;color:#fff}html.theme--documenter-dark .navbar.is-primary .navbar-brand>.navbar-item,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-brand>.navbar-item,html.theme--documenter-dark .navbar.is-primary .navbar-brand .navbar-link,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-brand .navbar-link{color:#fff}html.theme--documenter-dark .navbar.is-primary .navbar-brand>a.navbar-item:focus,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-brand>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-primary .navbar-brand>a.navbar-item:hover,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-brand>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-primary .navbar-brand>a.navbar-item.is-active,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-brand>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-primary .navbar-brand .navbar-link:focus,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-brand .navbar-link:focus,html.theme--documenter-dark .navbar.is-primary .navbar-brand .navbar-link:hover,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-brand .navbar-link:hover,html.theme--documenter-dark .navbar.is-primary .navbar-brand .navbar-link.is-active,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-brand .navbar-link.is-active{background-color:#2f4d6d;color:#fff}html.theme--documenter-dark .navbar.is-primary .navbar-brand .navbar-link::after,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-brand .navbar-link::after{border-color:#fff}html.theme--documenter-dark .navbar.is-primary .navbar-burger,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-burger{color:#fff}@media screen and (min-width: 1056px){html.theme--documenter-dark .navbar.is-primary .navbar-start>.navbar-item,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-start>.navbar-item,html.theme--documenter-dark .navbar.is-primary .navbar-start .navbar-link,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-start .navbar-link,html.theme--documenter-dark .navbar.is-primary .navbar-end>.navbar-item,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-end>.navbar-item,html.theme--documenter-dark .navbar.is-primary .navbar-end .navbar-link,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-end .navbar-link{color:#fff}html.theme--documenter-dark .navbar.is-primary .navbar-start>a.navbar-item:focus,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-start>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-primary .navbar-start>a.navbar-item:hover,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-start>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-primary .navbar-start>a.navbar-item.is-active,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-start>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-primary .navbar-start .navbar-link:focus,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-start .navbar-link:focus,html.theme--documenter-dark .navbar.is-primary .navbar-start .navbar-link:hover,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-start .navbar-link:hover,html.theme--documenter-dark .navbar.is-primary .navbar-start .navbar-link.is-active,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-start .navbar-link.is-active,html.theme--documenter-dark .navbar.is-primary .navbar-end>a.navbar-item:focus,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-end>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-primary .navbar-end>a.navbar-item:hover,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-end>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-primary .navbar-end>a.navbar-item.is-active,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-end>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-primary .navbar-end .navbar-link:focus,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-end .navbar-link:focus,html.theme--documenter-dark .navbar.is-primary .navbar-end .navbar-link:hover,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-end .navbar-link:hover,html.theme--documenter-dark .navbar.is-primary .navbar-end .navbar-link.is-active,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-end .navbar-link.is-active{background-color:#2f4d6d;color:#fff}html.theme--documenter-dark .navbar.is-primary .navbar-start .navbar-link::after,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-start .navbar-link::after,html.theme--documenter-dark .navbar.is-primary .navbar-end .navbar-link::after,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-end .navbar-link::after{border-color:#fff}html.theme--documenter-dark .navbar.is-primary .navbar-item.has-dropdown:focus .navbar-link,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-item.has-dropdown:focus .navbar-link,html.theme--documenter-dark .navbar.is-primary .navbar-item.has-dropdown:hover .navbar-link,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-item.has-dropdown:hover .navbar-link,html.theme--documenter-dark .navbar.is-primary .navbar-item.has-dropdown.is-active .navbar-link,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-item.has-dropdown.is-active .navbar-link{background-color:#2f4d6d;color:#fff}html.theme--documenter-dark .navbar.is-primary .navbar-dropdown a.navbar-item.is-active,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-dropdown a.navbar-item.is-active{background-color:#375a7f;color:#fff}}html.theme--documenter-dark .navbar.is-link{background-color:#1abc9c;color:#fff}html.theme--documenter-dark .navbar.is-link .navbar-brand>.navbar-item,html.theme--documenter-dark .navbar.is-link .navbar-brand .navbar-link{color:#fff}html.theme--documenter-dark .navbar.is-link .navbar-brand>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-link .navbar-brand>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-link .navbar-brand>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-link .navbar-brand .navbar-link:focus,html.theme--documenter-dark .navbar.is-link .navbar-brand .navbar-link:hover,html.theme--documenter-dark .navbar.is-link .navbar-brand .navbar-link.is-active{background-color:#17a689;color:#fff}html.theme--documenter-dark .navbar.is-link .navbar-brand .navbar-link::after{border-color:#fff}html.theme--documenter-dark .navbar.is-link .navbar-burger{color:#fff}@media screen and (min-width: 1056px){html.theme--documenter-dark .navbar.is-link .navbar-start>.navbar-item,html.theme--documenter-dark .navbar.is-link .navbar-start .navbar-link,html.theme--documenter-dark .navbar.is-link .navbar-end>.navbar-item,html.theme--documenter-dark .navbar.is-link .navbar-end .navbar-link{color:#fff}html.theme--documenter-dark .navbar.is-link .navbar-start>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-link .navbar-start>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-link .navbar-start>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-link .navbar-start .navbar-link:focus,html.theme--documenter-dark .navbar.is-link .navbar-start .navbar-link:hover,html.theme--documenter-dark .navbar.is-link .navbar-start .navbar-link.is-active,html.theme--documenter-dark .navbar.is-link .navbar-end>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-link .navbar-end>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-link .navbar-end>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-link .navbar-end .navbar-link:focus,html.theme--documenter-dark .navbar.is-link .navbar-end .navbar-link:hover,html.theme--documenter-dark .navbar.is-link .navbar-end .navbar-link.is-active{background-color:#17a689;color:#fff}html.theme--documenter-dark .navbar.is-link .navbar-start .navbar-link::after,html.theme--documenter-dark .navbar.is-link .navbar-end .navbar-link::after{border-color:#fff}html.theme--documenter-dark .navbar.is-link .navbar-item.has-dropdown:focus .navbar-link,html.theme--documenter-dark .navbar.is-link .navbar-item.has-dropdown:hover .navbar-link,html.theme--documenter-dark .navbar.is-link .navbar-item.has-dropdown.is-active .navbar-link{background-color:#17a689;color:#fff}html.theme--documenter-dark .navbar.is-link .navbar-dropdown a.navbar-item.is-active{background-color:#1abc9c;color:#fff}}html.theme--documenter-dark .navbar.is-info{background-color:#024c7d;color:#fff}html.theme--documenter-dark .navbar.is-info .navbar-brand>.navbar-item,html.theme--documenter-dark .navbar.is-info .navbar-brand .navbar-link{color:#fff}html.theme--documenter-dark .navbar.is-info .navbar-brand>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-info .navbar-brand>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-info .navbar-brand>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-info .navbar-brand .navbar-link:focus,html.theme--documenter-dark .navbar.is-info .navbar-brand .navbar-link:hover,html.theme--documenter-dark .navbar.is-info .navbar-brand .navbar-link.is-active{background-color:#023d64;color:#fff}html.theme--documenter-dark .navbar.is-info .navbar-brand .navbar-link::after{border-color:#fff}html.theme--documenter-dark .navbar.is-info .navbar-burger{color:#fff}@media screen and (min-width: 1056px){html.theme--documenter-dark .navbar.is-info .navbar-start>.navbar-item,html.theme--documenter-dark .navbar.is-info .navbar-start .navbar-link,html.theme--documenter-dark .navbar.is-info .navbar-end>.navbar-item,html.theme--documenter-dark .navbar.is-info .navbar-end .navbar-link{color:#fff}html.theme--documenter-dark .navbar.is-info .navbar-start>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-info .navbar-start>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-info .navbar-start>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-info .navbar-start .navbar-link:focus,html.theme--documenter-dark .navbar.is-info .navbar-start .navbar-link:hover,html.theme--documenter-dark .navbar.is-info .navbar-start .navbar-link.is-active,html.theme--documenter-dark .navbar.is-info .navbar-end>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-info .navbar-end>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-info .navbar-end>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-info .navbar-end .navbar-link:focus,html.theme--documenter-dark .navbar.is-info .navbar-end .navbar-link:hover,html.theme--documenter-dark .navbar.is-info .navbar-end .navbar-link.is-active{background-color:#023d64;color:#fff}html.theme--documenter-dark .navbar.is-info .navbar-start .navbar-link::after,html.theme--documenter-dark .navbar.is-info .navbar-end .navbar-link::after{border-color:#fff}html.theme--documenter-dark .navbar.is-info .navbar-item.has-dropdown:focus .navbar-link,html.theme--documenter-dark .navbar.is-info .navbar-item.has-dropdown:hover .navbar-link,html.theme--documenter-dark .navbar.is-info .navbar-item.has-dropdown.is-active .navbar-link{background-color:#023d64;color:#fff}html.theme--documenter-dark .navbar.is-info .navbar-dropdown a.navbar-item.is-active{background-color:#024c7d;color:#fff}}html.theme--documenter-dark .navbar.is-success{background-color:#008438;color:#fff}html.theme--documenter-dark .navbar.is-success .navbar-brand>.navbar-item,html.theme--documenter-dark .navbar.is-success .navbar-brand .navbar-link{color:#fff}html.theme--documenter-dark .navbar.is-success .navbar-brand>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-success .navbar-brand>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-success .navbar-brand>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-success .navbar-brand .navbar-link:focus,html.theme--documenter-dark .navbar.is-success .navbar-brand .navbar-link:hover,html.theme--documenter-dark .navbar.is-success .navbar-brand .navbar-link.is-active{background-color:#006b2d;color:#fff}html.theme--documenter-dark .navbar.is-success .navbar-brand .navbar-link::after{border-color:#fff}html.theme--documenter-dark .navbar.is-success .navbar-burger{color:#fff}@media screen and (min-width: 1056px){html.theme--documenter-dark .navbar.is-success .navbar-start>.navbar-item,html.theme--documenter-dark .navbar.is-success .navbar-start .navbar-link,html.theme--documenter-dark .navbar.is-success .navbar-end>.navbar-item,html.theme--documenter-dark .navbar.is-success .navbar-end .navbar-link{color:#fff}html.theme--documenter-dark .navbar.is-success .navbar-start>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-success .navbar-start>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-success .navbar-start>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-success .navbar-start .navbar-link:focus,html.theme--documenter-dark .navbar.is-success .navbar-start .navbar-link:hover,html.theme--documenter-dark .navbar.is-success .navbar-start .navbar-link.is-active,html.theme--documenter-dark .navbar.is-success .navbar-end>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-success .navbar-end>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-success .navbar-end>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-success .navbar-end .navbar-link:focus,html.theme--documenter-dark .navbar.is-success .navbar-end .navbar-link:hover,html.theme--documenter-dark .navbar.is-success .navbar-end .navbar-link.is-active{background-color:#006b2d;color:#fff}html.theme--documenter-dark .navbar.is-success .navbar-start .navbar-link::after,html.theme--documenter-dark .navbar.is-success .navbar-end .navbar-link::after{border-color:#fff}html.theme--documenter-dark .navbar.is-success .navbar-item.has-dropdown:focus .navbar-link,html.theme--documenter-dark .navbar.is-success .navbar-item.has-dropdown:hover .navbar-link,html.theme--documenter-dark .navbar.is-success .navbar-item.has-dropdown.is-active .navbar-link{background-color:#006b2d;color:#fff}html.theme--documenter-dark .navbar.is-success .navbar-dropdown a.navbar-item.is-active{background-color:#008438;color:#fff}}html.theme--documenter-dark .navbar.is-warning{background-color:#ad8100;color:#fff}html.theme--documenter-dark .navbar.is-warning .navbar-brand>.navbar-item,html.theme--documenter-dark .navbar.is-warning .navbar-brand .navbar-link{color:#fff}html.theme--documenter-dark .navbar.is-warning .navbar-brand>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-warning .navbar-brand>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-warning .navbar-brand>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-warning .navbar-brand .navbar-link:focus,html.theme--documenter-dark .navbar.is-warning .navbar-brand .navbar-link:hover,html.theme--documenter-dark .navbar.is-warning .navbar-brand .navbar-link.is-active{background-color:#946e00;color:#fff}html.theme--documenter-dark .navbar.is-warning .navbar-brand .navbar-link::after{border-color:#fff}html.theme--documenter-dark .navbar.is-warning .navbar-burger{color:#fff}@media screen and (min-width: 1056px){html.theme--documenter-dark .navbar.is-warning .navbar-start>.navbar-item,html.theme--documenter-dark .navbar.is-warning .navbar-start .navbar-link,html.theme--documenter-dark .navbar.is-warning .navbar-end>.navbar-item,html.theme--documenter-dark .navbar.is-warning .navbar-end .navbar-link{color:#fff}html.theme--documenter-dark .navbar.is-warning .navbar-start>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-warning .navbar-start>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-warning .navbar-start>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-warning .navbar-start .navbar-link:focus,html.theme--documenter-dark .navbar.is-warning .navbar-start .navbar-link:hover,html.theme--documenter-dark .navbar.is-warning .navbar-start .navbar-link.is-active,html.theme--documenter-dark .navbar.is-warning .navbar-end>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-warning .navbar-end>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-warning .navbar-end>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-warning .navbar-end .navbar-link:focus,html.theme--documenter-dark .navbar.is-warning .navbar-end .navbar-link:hover,html.theme--documenter-dark .navbar.is-warning .navbar-end .navbar-link.is-active{background-color:#946e00;color:#fff}html.theme--documenter-dark .navbar.is-warning .navbar-start .navbar-link::after,html.theme--documenter-dark .navbar.is-warning .navbar-end .navbar-link::after{border-color:#fff}html.theme--documenter-dark .navbar.is-warning .navbar-item.has-dropdown:focus .navbar-link,html.theme--documenter-dark .navbar.is-warning .navbar-item.has-dropdown:hover .navbar-link,html.theme--documenter-dark .navbar.is-warning .navbar-item.has-dropdown.is-active .navbar-link{background-color:#946e00;color:#fff}html.theme--documenter-dark .navbar.is-warning .navbar-dropdown a.navbar-item.is-active{background-color:#ad8100;color:#fff}}html.theme--documenter-dark .navbar.is-danger{background-color:#9e1b0d;color:#fff}html.theme--documenter-dark .navbar.is-danger .navbar-brand>.navbar-item,html.theme--documenter-dark .navbar.is-danger .navbar-brand .navbar-link{color:#fff}html.theme--documenter-dark .navbar.is-danger .navbar-brand>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-danger .navbar-brand>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-danger .navbar-brand>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-danger .navbar-brand .navbar-link:focus,html.theme--documenter-dark .navbar.is-danger .navbar-brand .navbar-link:hover,html.theme--documenter-dark .navbar.is-danger .navbar-brand .navbar-link.is-active{background-color:#86170b;color:#fff}html.theme--documenter-dark .navbar.is-danger .navbar-brand .navbar-link::after{border-color:#fff}html.theme--documenter-dark .navbar.is-danger .navbar-burger{color:#fff}@media screen and (min-width: 1056px){html.theme--documenter-dark .navbar.is-danger .navbar-start>.navbar-item,html.theme--documenter-dark .navbar.is-danger .navbar-start .navbar-link,html.theme--documenter-dark .navbar.is-danger .navbar-end>.navbar-item,html.theme--documenter-dark .navbar.is-danger .navbar-end .navbar-link{color:#fff}html.theme--documenter-dark .navbar.is-danger .navbar-start>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-danger .navbar-start>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-danger .navbar-start>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-danger .navbar-start .navbar-link:focus,html.theme--documenter-dark .navbar.is-danger .navbar-start .navbar-link:hover,html.theme--documenter-dark .navbar.is-danger .navbar-start .navbar-link.is-active,html.theme--documenter-dark .navbar.is-danger .navbar-end>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-danger .navbar-end>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-danger .navbar-end>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-danger .navbar-end .navbar-link:focus,html.theme--documenter-dark .navbar.is-danger .navbar-end .navbar-link:hover,html.theme--documenter-dark .navbar.is-danger .navbar-end .navbar-link.is-active{background-color:#86170b;color:#fff}html.theme--documenter-dark .navbar.is-danger .navbar-start .navbar-link::after,html.theme--documenter-dark .navbar.is-danger .navbar-end .navbar-link::after{border-color:#fff}html.theme--documenter-dark .navbar.is-danger .navbar-item.has-dropdown:focus .navbar-link,html.theme--documenter-dark .navbar.is-danger .navbar-item.has-dropdown:hover .navbar-link,html.theme--documenter-dark .navbar.is-danger .navbar-item.has-dropdown.is-active .navbar-link{background-color:#86170b;color:#fff}html.theme--documenter-dark .navbar.is-danger .navbar-dropdown a.navbar-item.is-active{background-color:#9e1b0d;color:#fff}}html.theme--documenter-dark .navbar>.container{align-items:stretch;display:flex;min-height:4rem;width:100%}html.theme--documenter-dark .navbar.has-shadow{box-shadow:0 2px 0 0 #282f2f}html.theme--documenter-dark .navbar.is-fixed-bottom,html.theme--documenter-dark .navbar.is-fixed-top{left:0;position:fixed;right:0;z-index:30}html.theme--documenter-dark .navbar.is-fixed-bottom{bottom:0}html.theme--documenter-dark .navbar.is-fixed-bottom.has-shadow{box-shadow:0 -2px 0 0 #282f2f}html.theme--documenter-dark .navbar.is-fixed-top{top:0}html.theme--documenter-dark html.has-navbar-fixed-top,html.theme--documenter-dark body.has-navbar-fixed-top{padding-top:4rem}html.theme--documenter-dark html.has-navbar-fixed-bottom,html.theme--documenter-dark body.has-navbar-fixed-bottom{padding-bottom:4rem}html.theme--documenter-dark .navbar-brand,html.theme--documenter-dark .navbar-tabs{align-items:stretch;display:flex;flex-shrink:0;min-height:4rem}html.theme--documenter-dark .navbar-brand a.navbar-item:focus,html.theme--documenter-dark .navbar-brand a.navbar-item:hover{background-color:transparent}html.theme--documenter-dark .navbar-tabs{-webkit-overflow-scrolling:touch;max-width:100vw;overflow-x:auto;overflow-y:hidden}html.theme--documenter-dark .navbar-burger{color:#fff;-moz-appearance:none;-webkit-appearance:none;appearance:none;background:none;border:none;cursor:pointer;display:block;height:4rem;position:relative;width:4rem;margin-left:auto}html.theme--documenter-dark .navbar-burger span{background-color:currentColor;display:block;height:1px;left:calc(50% - 8px);position:absolute;transform-origin:center;transition-duration:86ms;transition-property:background-color, opacity, transform;transition-timing-function:ease-out;width:16px}html.theme--documenter-dark .navbar-burger span:nth-child(1){top:calc(50% - 6px)}html.theme--documenter-dark .navbar-burger span:nth-child(2){top:calc(50% - 1px)}html.theme--documenter-dark .navbar-burger span:nth-child(3){top:calc(50% + 4px)}html.theme--documenter-dark .navbar-burger:hover{background-color:rgba(0,0,0,0.05)}html.theme--documenter-dark .navbar-burger.is-active span:nth-child(1){transform:translateY(5px) rotate(45deg)}html.theme--documenter-dark .navbar-burger.is-active span:nth-child(2){opacity:0}html.theme--documenter-dark .navbar-burger.is-active span:nth-child(3){transform:translateY(-5px) rotate(-45deg)}html.theme--documenter-dark .navbar-menu{display:none}html.theme--documenter-dark .navbar-item,html.theme--documenter-dark .navbar-link{color:#fff;display:block;line-height:1.5;padding:0.5rem 0.75rem;position:relative}html.theme--documenter-dark .navbar-item .icon:only-child,html.theme--documenter-dark .navbar-link .icon:only-child{margin-left:-0.25rem;margin-right:-0.25rem}html.theme--documenter-dark a.navbar-item,html.theme--documenter-dark .navbar-link{cursor:pointer}html.theme--documenter-dark a.navbar-item:focus,html.theme--documenter-dark a.navbar-item:focus-within,html.theme--documenter-dark a.navbar-item:hover,html.theme--documenter-dark a.navbar-item.is-active,html.theme--documenter-dark .navbar-link:focus,html.theme--documenter-dark .navbar-link:focus-within,html.theme--documenter-dark .navbar-link:hover,html.theme--documenter-dark .navbar-link.is-active{background-color:rgba(0,0,0,0);color:#1abc9c}html.theme--documenter-dark .navbar-item{flex-grow:0;flex-shrink:0}html.theme--documenter-dark .navbar-item img{max-height:1.75rem}html.theme--documenter-dark .navbar-item.has-dropdown{padding:0}html.theme--documenter-dark .navbar-item.is-expanded{flex-grow:1;flex-shrink:1}html.theme--documenter-dark .navbar-item.is-tab{border-bottom:1px solid transparent;min-height:4rem;padding-bottom:calc(0.5rem - 1px)}html.theme--documenter-dark .navbar-item.is-tab:focus,html.theme--documenter-dark .navbar-item.is-tab:hover{background-color:rgba(0,0,0,0);border-bottom-color:#1abc9c}html.theme--documenter-dark .navbar-item.is-tab.is-active{background-color:rgba(0,0,0,0);border-bottom-color:#1abc9c;border-bottom-style:solid;border-bottom-width:3px;color:#1abc9c;padding-bottom:calc(0.5rem - 3px)}html.theme--documenter-dark .navbar-content{flex-grow:1;flex-shrink:1}html.theme--documenter-dark .navbar-link:not(.is-arrowless){padding-right:2.5em}html.theme--documenter-dark .navbar-link:not(.is-arrowless)::after{border-color:#fff;margin-top:-0.375em;right:1.125em}html.theme--documenter-dark .navbar-dropdown{font-size:0.875rem;padding-bottom:0.5rem;padding-top:0.5rem}html.theme--documenter-dark .navbar-dropdown .navbar-item{padding-left:1.5rem;padding-right:1.5rem}html.theme--documenter-dark .navbar-divider{background-color:rgba(0,0,0,0.2);border:none;display:none;height:2px;margin:0.5rem 0}@media screen and (max-width: 1055px){html.theme--documenter-dark .navbar>.container{display:block}html.theme--documenter-dark .navbar-brand .navbar-item,html.theme--documenter-dark .navbar-tabs .navbar-item{align-items:center;display:flex}html.theme--documenter-dark .navbar-link::after{display:none}html.theme--documenter-dark .navbar-menu{background-color:#375a7f;box-shadow:0 8px 16px rgba(10,10,10,0.1);padding:0.5rem 0}html.theme--documenter-dark .navbar-menu.is-active{display:block}html.theme--documenter-dark .navbar.is-fixed-bottom-touch,html.theme--documenter-dark .navbar.is-fixed-top-touch{left:0;position:fixed;right:0;z-index:30}html.theme--documenter-dark .navbar.is-fixed-bottom-touch{bottom:0}html.theme--documenter-dark .navbar.is-fixed-bottom-touch.has-shadow{box-shadow:0 -2px 3px rgba(10,10,10,0.1)}html.theme--documenter-dark .navbar.is-fixed-top-touch{top:0}html.theme--documenter-dark .navbar.is-fixed-top .navbar-menu,html.theme--documenter-dark .navbar.is-fixed-top-touch .navbar-menu{-webkit-overflow-scrolling:touch;max-height:calc(100vh - 4rem);overflow:auto}html.theme--documenter-dark html.has-navbar-fixed-top-touch,html.theme--documenter-dark body.has-navbar-fixed-top-touch{padding-top:4rem}html.theme--documenter-dark html.has-navbar-fixed-bottom-touch,html.theme--documenter-dark body.has-navbar-fixed-bottom-touch{padding-bottom:4rem}}@media screen and (min-width: 1056px){html.theme--documenter-dark .navbar,html.theme--documenter-dark .navbar-menu,html.theme--documenter-dark .navbar-start,html.theme--documenter-dark .navbar-end{align-items:stretch;display:flex}html.theme--documenter-dark .navbar{min-height:4rem}html.theme--documenter-dark .navbar.is-spaced{padding:1rem 2rem}html.theme--documenter-dark .navbar.is-spaced .navbar-start,html.theme--documenter-dark .navbar.is-spaced .navbar-end{align-items:center}html.theme--documenter-dark .navbar.is-spaced a.navbar-item,html.theme--documenter-dark .navbar.is-spaced .navbar-link{border-radius:.4em}html.theme--documenter-dark .navbar.is-transparent a.navbar-item:focus,html.theme--documenter-dark .navbar.is-transparent a.navbar-item:hover,html.theme--documenter-dark .navbar.is-transparent a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-transparent .navbar-link:focus,html.theme--documenter-dark .navbar.is-transparent .navbar-link:hover,html.theme--documenter-dark .navbar.is-transparent .navbar-link.is-active{background-color:transparent !important}html.theme--documenter-dark .navbar.is-transparent .navbar-item.has-dropdown.is-active .navbar-link,html.theme--documenter-dark .navbar.is-transparent .navbar-item.has-dropdown.is-hoverable:focus .navbar-link,html.theme--documenter-dark .navbar.is-transparent .navbar-item.has-dropdown.is-hoverable:focus-within .navbar-link,html.theme--documenter-dark .navbar.is-transparent .navbar-item.has-dropdown.is-hoverable:hover .navbar-link{background-color:transparent !important}html.theme--documenter-dark .navbar.is-transparent .navbar-dropdown a.navbar-item:focus,html.theme--documenter-dark .navbar.is-transparent .navbar-dropdown a.navbar-item:hover{background-color:rgba(0,0,0,0);color:#dbdee0}html.theme--documenter-dark .navbar.is-transparent .navbar-dropdown a.navbar-item.is-active{background-color:rgba(0,0,0,0);color:#1abc9c}html.theme--documenter-dark .navbar-burger{display:none}html.theme--documenter-dark .navbar-item,html.theme--documenter-dark .navbar-link{align-items:center;display:flex}html.theme--documenter-dark .navbar-item.has-dropdown{align-items:stretch}html.theme--documenter-dark .navbar-item.has-dropdown-up .navbar-link::after{transform:rotate(135deg) translate(0.25em, -0.25em)}html.theme--documenter-dark .navbar-item.has-dropdown-up .navbar-dropdown{border-bottom:1px solid rgba(0,0,0,0.2);border-radius:8px 8px 0 0;border-top:none;bottom:100%;box-shadow:0 -8px 8px rgba(10,10,10,0.1);top:auto}html.theme--documenter-dark .navbar-item.is-active .navbar-dropdown,html.theme--documenter-dark .navbar-item.is-hoverable:focus .navbar-dropdown,html.theme--documenter-dark .navbar-item.is-hoverable:focus-within .navbar-dropdown,html.theme--documenter-dark .navbar-item.is-hoverable:hover .navbar-dropdown{display:block}.navbar.is-spaced html.theme--documenter-dark .navbar-item.is-active .navbar-dropdown,html.theme--documenter-dark .navbar-item.is-active .navbar-dropdown.is-boxed,.navbar.is-spaced html.theme--documenter-dark .navbar-item.is-hoverable:focus .navbar-dropdown,html.theme--documenter-dark .navbar-item.is-hoverable:focus .navbar-dropdown.is-boxed,.navbar.is-spaced html.theme--documenter-dark .navbar-item.is-hoverable:focus-within .navbar-dropdown,html.theme--documenter-dark .navbar-item.is-hoverable:focus-within .navbar-dropdown.is-boxed,.navbar.is-spaced html.theme--documenter-dark .navbar-item.is-hoverable:hover .navbar-dropdown,html.theme--documenter-dark .navbar-item.is-hoverable:hover .navbar-dropdown.is-boxed{opacity:1;pointer-events:auto;transform:translateY(0)}html.theme--documenter-dark .navbar-menu{flex-grow:1;flex-shrink:0}html.theme--documenter-dark .navbar-start{justify-content:flex-start;margin-right:auto}html.theme--documenter-dark .navbar-end{justify-content:flex-end;margin-left:auto}html.theme--documenter-dark .navbar-dropdown{background-color:#375a7f;border-bottom-left-radius:8px;border-bottom-right-radius:8px;border-top:1px solid rgba(0,0,0,0.2);box-shadow:0 8px 8px rgba(10,10,10,0.1);display:none;font-size:0.875rem;left:0;min-width:100%;position:absolute;top:100%;z-index:20}html.theme--documenter-dark .navbar-dropdown .navbar-item{padding:0.375rem 1rem;white-space:nowrap}html.theme--documenter-dark .navbar-dropdown a.navbar-item{padding-right:3rem}html.theme--documenter-dark .navbar-dropdown a.navbar-item:focus,html.theme--documenter-dark .navbar-dropdown a.navbar-item:hover{background-color:rgba(0,0,0,0);color:#dbdee0}html.theme--documenter-dark .navbar-dropdown a.navbar-item.is-active{background-color:rgba(0,0,0,0);color:#1abc9c}.navbar.is-spaced html.theme--documenter-dark .navbar-dropdown,html.theme--documenter-dark .navbar-dropdown.is-boxed{border-radius:8px;border-top:none;box-shadow:0 8px 8px rgba(10,10,10,0.1), 0 0 0 1px rgba(10,10,10,0.1);display:block;opacity:0;pointer-events:none;top:calc(100% + (-4px));transform:translateY(-5px);transition-duration:86ms;transition-property:opacity, transform}html.theme--documenter-dark .navbar-dropdown.is-right{left:auto;right:0}html.theme--documenter-dark .navbar-divider{display:block}html.theme--documenter-dark .navbar>.container .navbar-brand,html.theme--documenter-dark .container>.navbar .navbar-brand{margin-left:-.75rem}html.theme--documenter-dark .navbar>.container .navbar-menu,html.theme--documenter-dark .container>.navbar .navbar-menu{margin-right:-.75rem}html.theme--documenter-dark .navbar.is-fixed-bottom-desktop,html.theme--documenter-dark .navbar.is-fixed-top-desktop{left:0;position:fixed;right:0;z-index:30}html.theme--documenter-dark .navbar.is-fixed-bottom-desktop{bottom:0}html.theme--documenter-dark .navbar.is-fixed-bottom-desktop.has-shadow{box-shadow:0 -2px 3px rgba(10,10,10,0.1)}html.theme--documenter-dark .navbar.is-fixed-top-desktop{top:0}html.theme--documenter-dark html.has-navbar-fixed-top-desktop,html.theme--documenter-dark body.has-navbar-fixed-top-desktop{padding-top:4rem}html.theme--documenter-dark html.has-navbar-fixed-bottom-desktop,html.theme--documenter-dark body.has-navbar-fixed-bottom-desktop{padding-bottom:4rem}html.theme--documenter-dark html.has-spaced-navbar-fixed-top,html.theme--documenter-dark body.has-spaced-navbar-fixed-top{padding-top:6rem}html.theme--documenter-dark html.has-spaced-navbar-fixed-bottom,html.theme--documenter-dark body.has-spaced-navbar-fixed-bottom{padding-bottom:6rem}html.theme--documenter-dark a.navbar-item.is-active,html.theme--documenter-dark .navbar-link.is-active{color:#1abc9c}html.theme--documenter-dark a.navbar-item.is-active:not(:focus):not(:hover),html.theme--documenter-dark .navbar-link.is-active:not(:focus):not(:hover){background-color:rgba(0,0,0,0)}html.theme--documenter-dark .navbar-item.has-dropdown:focus .navbar-link,html.theme--documenter-dark .navbar-item.has-dropdown:hover .navbar-link,html.theme--documenter-dark .navbar-item.has-dropdown.is-active .navbar-link{background-color:rgba(0,0,0,0)}}html.theme--documenter-dark .hero.is-fullheight-with-navbar{min-height:calc(100vh - 4rem)}html.theme--documenter-dark .pagination{font-size:1rem;margin:-.25rem}html.theme--documenter-dark .pagination.is-small,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.pagination{font-size:.75rem}html.theme--documenter-dark .pagination.is-medium{font-size:1.25rem}html.theme--documenter-dark .pagination.is-large{font-size:1.5rem}html.theme--documenter-dark .pagination.is-rounded .pagination-previous,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.pagination .pagination-previous,html.theme--documenter-dark .pagination.is-rounded .pagination-next,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.pagination .pagination-next{padding-left:1em;padding-right:1em;border-radius:9999px}html.theme--documenter-dark .pagination.is-rounded .pagination-link,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.pagination .pagination-link{border-radius:9999px}html.theme--documenter-dark .pagination,html.theme--documenter-dark .pagination-list{align-items:center;display:flex;justify-content:center;text-align:center}html.theme--documenter-dark .pagination-previous,html.theme--documenter-dark .pagination-next,html.theme--documenter-dark .pagination-link,html.theme--documenter-dark .pagination-ellipsis{font-size:1em;justify-content:center;margin:.25rem;padding-left:.5em;padding-right:.5em;text-align:center}html.theme--documenter-dark .pagination-previous,html.theme--documenter-dark .pagination-next,html.theme--documenter-dark .pagination-link{border-color:#5e6d6f;color:#1abc9c;min-width:2.5em}html.theme--documenter-dark .pagination-previous:hover,html.theme--documenter-dark .pagination-next:hover,html.theme--documenter-dark .pagination-link:hover{border-color:#8c9b9d;color:#1dd2af}html.theme--documenter-dark .pagination-previous:focus,html.theme--documenter-dark .pagination-next:focus,html.theme--documenter-dark .pagination-link:focus{border-color:#8c9b9d}html.theme--documenter-dark .pagination-previous:active,html.theme--documenter-dark .pagination-next:active,html.theme--documenter-dark .pagination-link:active{box-shadow:inset 0 1px 2px rgba(10,10,10,0.2)}html.theme--documenter-dark .pagination-previous[disabled],html.theme--documenter-dark .pagination-previous.is-disabled,html.theme--documenter-dark .pagination-next[disabled],html.theme--documenter-dark .pagination-next.is-disabled,html.theme--documenter-dark .pagination-link[disabled],html.theme--documenter-dark .pagination-link.is-disabled{background-color:#5e6d6f;border-color:#5e6d6f;box-shadow:none;color:#fff;opacity:0.5}html.theme--documenter-dark .pagination-previous,html.theme--documenter-dark .pagination-next{padding-left:.75em;padding-right:.75em;white-space:nowrap}html.theme--documenter-dark .pagination-link.is-current{background-color:#1abc9c;border-color:#1abc9c;color:#fff}html.theme--documenter-dark .pagination-ellipsis{color:#8c9b9d;pointer-events:none}html.theme--documenter-dark .pagination-list{flex-wrap:wrap}html.theme--documenter-dark .pagination-list li{list-style:none}@media screen and (max-width: 768px){html.theme--documenter-dark .pagination{flex-wrap:wrap}html.theme--documenter-dark .pagination-previous,html.theme--documenter-dark .pagination-next{flex-grow:1;flex-shrink:1}html.theme--documenter-dark .pagination-list li{flex-grow:1;flex-shrink:1}}@media screen and (min-width: 769px),print{html.theme--documenter-dark .pagination-list{flex-grow:1;flex-shrink:1;justify-content:flex-start;order:1}html.theme--documenter-dark .pagination-previous,html.theme--documenter-dark .pagination-next,html.theme--documenter-dark .pagination-link,html.theme--documenter-dark .pagination-ellipsis{margin-bottom:0;margin-top:0}html.theme--documenter-dark .pagination-previous{order:2}html.theme--documenter-dark .pagination-next{order:3}html.theme--documenter-dark .pagination{justify-content:space-between;margin-bottom:0;margin-top:0}html.theme--documenter-dark .pagination.is-centered .pagination-previous{order:1}html.theme--documenter-dark .pagination.is-centered .pagination-list{justify-content:center;order:2}html.theme--documenter-dark .pagination.is-centered .pagination-next{order:3}html.theme--documenter-dark .pagination.is-right .pagination-previous{order:1}html.theme--documenter-dark .pagination.is-right .pagination-next{order:2}html.theme--documenter-dark .pagination.is-right .pagination-list{justify-content:flex-end;order:3}}html.theme--documenter-dark .panel{border-radius:8px;box-shadow:#171717;font-size:1rem}html.theme--documenter-dark .panel:not(:last-child){margin-bottom:1.5rem}html.theme--documenter-dark .panel.is-white .panel-heading{background-color:#fff;color:#0a0a0a}html.theme--documenter-dark .panel.is-white .panel-tabs a.is-active{border-bottom-color:#fff}html.theme--documenter-dark .panel.is-white .panel-block.is-active .panel-icon{color:#fff}html.theme--documenter-dark .panel.is-black .panel-heading{background-color:#0a0a0a;color:#fff}html.theme--documenter-dark .panel.is-black .panel-tabs a.is-active{border-bottom-color:#0a0a0a}html.theme--documenter-dark .panel.is-black .panel-block.is-active .panel-icon{color:#0a0a0a}html.theme--documenter-dark .panel.is-light .panel-heading{background-color:#ecf0f1;color:rgba(0,0,0,0.7)}html.theme--documenter-dark .panel.is-light .panel-tabs a.is-active{border-bottom-color:#ecf0f1}html.theme--documenter-dark .panel.is-light .panel-block.is-active .panel-icon{color:#ecf0f1}html.theme--documenter-dark .panel.is-dark .panel-heading,html.theme--documenter-dark .content kbd.panel .panel-heading{background-color:#282f2f;color:#fff}html.theme--documenter-dark .panel.is-dark .panel-tabs a.is-active,html.theme--documenter-dark .content kbd.panel .panel-tabs a.is-active{border-bottom-color:#282f2f}html.theme--documenter-dark .panel.is-dark .panel-block.is-active .panel-icon,html.theme--documenter-dark .content kbd.panel .panel-block.is-active .panel-icon{color:#282f2f}html.theme--documenter-dark .panel.is-primary .panel-heading,html.theme--documenter-dark .docstring>section>a.panel.docs-sourcelink .panel-heading{background-color:#375a7f;color:#fff}html.theme--documenter-dark .panel.is-primary .panel-tabs a.is-active,html.theme--documenter-dark .docstring>section>a.panel.docs-sourcelink .panel-tabs a.is-active{border-bottom-color:#375a7f}html.theme--documenter-dark .panel.is-primary .panel-block.is-active .panel-icon,html.theme--documenter-dark .docstring>section>a.panel.docs-sourcelink .panel-block.is-active .panel-icon{color:#375a7f}html.theme--documenter-dark .panel.is-link .panel-heading{background-color:#1abc9c;color:#fff}html.theme--documenter-dark .panel.is-link .panel-tabs a.is-active{border-bottom-color:#1abc9c}html.theme--documenter-dark .panel.is-link .panel-block.is-active .panel-icon{color:#1abc9c}html.theme--documenter-dark .panel.is-info .panel-heading{background-color:#024c7d;color:#fff}html.theme--documenter-dark .panel.is-info .panel-tabs a.is-active{border-bottom-color:#024c7d}html.theme--documenter-dark .panel.is-info .panel-block.is-active .panel-icon{color:#024c7d}html.theme--documenter-dark .panel.is-success .panel-heading{background-color:#008438;color:#fff}html.theme--documenter-dark .panel.is-success .panel-tabs a.is-active{border-bottom-color:#008438}html.theme--documenter-dark .panel.is-success .panel-block.is-active .panel-icon{color:#008438}html.theme--documenter-dark .panel.is-warning .panel-heading{background-color:#ad8100;color:#fff}html.theme--documenter-dark .panel.is-warning .panel-tabs a.is-active{border-bottom-color:#ad8100}html.theme--documenter-dark .panel.is-warning .panel-block.is-active .panel-icon{color:#ad8100}html.theme--documenter-dark .panel.is-danger .panel-heading{background-color:#9e1b0d;color:#fff}html.theme--documenter-dark .panel.is-danger .panel-tabs a.is-active{border-bottom-color:#9e1b0d}html.theme--documenter-dark .panel.is-danger .panel-block.is-active .panel-icon{color:#9e1b0d}html.theme--documenter-dark .panel-tabs:not(:last-child),html.theme--documenter-dark .panel-block:not(:last-child){border-bottom:1px solid #ededed}html.theme--documenter-dark .panel-heading{background-color:#343c3d;border-radius:8px 8px 0 0;color:#f2f2f2;font-size:1.25em;font-weight:700;line-height:1.25;padding:0.75em 1em}html.theme--documenter-dark .panel-tabs{align-items:flex-end;display:flex;font-size:.875em;justify-content:center}html.theme--documenter-dark .panel-tabs a{border-bottom:1px solid #5e6d6f;margin-bottom:-1px;padding:0.5em}html.theme--documenter-dark .panel-tabs a.is-active{border-bottom-color:#343c3d;color:#17a689}html.theme--documenter-dark .panel-list a{color:#fff}html.theme--documenter-dark .panel-list a:hover{color:#1abc9c}html.theme--documenter-dark .panel-block{align-items:center;color:#f2f2f2;display:flex;justify-content:flex-start;padding:0.5em 0.75em}html.theme--documenter-dark .panel-block input[type="checkbox"]{margin-right:.75em}html.theme--documenter-dark .panel-block>.control{flex-grow:1;flex-shrink:1;width:100%}html.theme--documenter-dark .panel-block.is-wrapped{flex-wrap:wrap}html.theme--documenter-dark .panel-block.is-active{border-left-color:#1abc9c;color:#17a689}html.theme--documenter-dark .panel-block.is-active .panel-icon{color:#1abc9c}html.theme--documenter-dark .panel-block:last-child{border-bottom-left-radius:8px;border-bottom-right-radius:8px}html.theme--documenter-dark a.panel-block,html.theme--documenter-dark label.panel-block{cursor:pointer}html.theme--documenter-dark a.panel-block:hover,html.theme--documenter-dark label.panel-block:hover{background-color:#282f2f}html.theme--documenter-dark .panel-icon{display:inline-block;font-size:14px;height:1em;line-height:1em;text-align:center;vertical-align:top;width:1em;color:#fff;margin-right:.75em}html.theme--documenter-dark .panel-icon .fa{font-size:inherit;line-height:inherit}html.theme--documenter-dark .tabs{-webkit-overflow-scrolling:touch;align-items:stretch;display:flex;font-size:1rem;justify-content:space-between;overflow:hidden;overflow-x:auto;white-space:nowrap}html.theme--documenter-dark .tabs a{align-items:center;border-bottom-color:#5e6d6f;border-bottom-style:solid;border-bottom-width:1px;color:#fff;display:flex;justify-content:center;margin-bottom:-1px;padding:0.5em 1em;vertical-align:top}html.theme--documenter-dark .tabs a:hover{border-bottom-color:#f2f2f2;color:#f2f2f2}html.theme--documenter-dark .tabs li{display:block}html.theme--documenter-dark .tabs li.is-active a{border-bottom-color:#1abc9c;color:#1abc9c}html.theme--documenter-dark .tabs ul{align-items:center;border-bottom-color:#5e6d6f;border-bottom-style:solid;border-bottom-width:1px;display:flex;flex-grow:1;flex-shrink:0;justify-content:flex-start}html.theme--documenter-dark .tabs ul.is-left{padding-right:0.75em}html.theme--documenter-dark .tabs ul.is-center{flex:none;justify-content:center;padding-left:0.75em;padding-right:0.75em}html.theme--documenter-dark .tabs ul.is-right{justify-content:flex-end;padding-left:0.75em}html.theme--documenter-dark .tabs .icon:first-child{margin-right:.5em}html.theme--documenter-dark .tabs .icon:last-child{margin-left:.5em}html.theme--documenter-dark .tabs.is-centered ul{justify-content:center}html.theme--documenter-dark .tabs.is-right ul{justify-content:flex-end}html.theme--documenter-dark .tabs.is-boxed a{border:1px solid transparent;border-radius:.4em .4em 0 0}html.theme--documenter-dark .tabs.is-boxed a:hover{background-color:#282f2f;border-bottom-color:#5e6d6f}html.theme--documenter-dark .tabs.is-boxed li.is-active a{background-color:#fff;border-color:#5e6d6f;border-bottom-color:rgba(0,0,0,0) !important}html.theme--documenter-dark .tabs.is-fullwidth li{flex-grow:1;flex-shrink:0}html.theme--documenter-dark .tabs.is-toggle a{border-color:#5e6d6f;border-style:solid;border-width:1px;margin-bottom:0;position:relative}html.theme--documenter-dark .tabs.is-toggle a:hover{background-color:#282f2f;border-color:#8c9b9d;z-index:2}html.theme--documenter-dark .tabs.is-toggle li+li{margin-left:-1px}html.theme--documenter-dark .tabs.is-toggle li:first-child a{border-top-left-radius:.4em;border-bottom-left-radius:.4em}html.theme--documenter-dark .tabs.is-toggle li:last-child a{border-top-right-radius:.4em;border-bottom-right-radius:.4em}html.theme--documenter-dark .tabs.is-toggle li.is-active a{background-color:#1abc9c;border-color:#1abc9c;color:#fff;z-index:1}html.theme--documenter-dark .tabs.is-toggle ul{border-bottom:none}html.theme--documenter-dark .tabs.is-toggle.is-toggle-rounded li:first-child a{border-bottom-left-radius:9999px;border-top-left-radius:9999px;padding-left:1.25em}html.theme--documenter-dark .tabs.is-toggle.is-toggle-rounded li:last-child a{border-bottom-right-radius:9999px;border-top-right-radius:9999px;padding-right:1.25em}html.theme--documenter-dark .tabs.is-small,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.tabs{font-size:.75rem}html.theme--documenter-dark .tabs.is-medium{font-size:1.25rem}html.theme--documenter-dark .tabs.is-large{font-size:1.5rem}html.theme--documenter-dark .column{display:block;flex-basis:0;flex-grow:1;flex-shrink:1;padding:.75rem}.columns.is-mobile>html.theme--documenter-dark .column.is-narrow{flex:none;width:unset}.columns.is-mobile>html.theme--documenter-dark .column.is-full{flex:none;width:100%}.columns.is-mobile>html.theme--documenter-dark .column.is-three-quarters{flex:none;width:75%}.columns.is-mobile>html.theme--documenter-dark .column.is-two-thirds{flex:none;width:66.6666%}.columns.is-mobile>html.theme--documenter-dark .column.is-half{flex:none;width:50%}.columns.is-mobile>html.theme--documenter-dark .column.is-one-third{flex:none;width:33.3333%}.columns.is-mobile>html.theme--documenter-dark .column.is-one-quarter{flex:none;width:25%}.columns.is-mobile>html.theme--documenter-dark .column.is-one-fifth{flex:none;width:20%}.columns.is-mobile>html.theme--documenter-dark .column.is-two-fifths{flex:none;width:40%}.columns.is-mobile>html.theme--documenter-dark .column.is-three-fifths{flex:none;width:60%}.columns.is-mobile>html.theme--documenter-dark .column.is-four-fifths{flex:none;width:80%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-three-quarters{margin-left:75%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-two-thirds{margin-left:66.6666%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-half{margin-left:50%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-one-third{margin-left:33.3333%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-one-quarter{margin-left:25%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-one-fifth{margin-left:20%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-two-fifths{margin-left:40%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-three-fifths{margin-left:60%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-four-fifths{margin-left:80%}.columns.is-mobile>html.theme--documenter-dark .column.is-0{flex:none;width:0%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-0{margin-left:0%}.columns.is-mobile>html.theme--documenter-dark .column.is-1{flex:none;width:8.33333337%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-1{margin-left:8.33333337%}.columns.is-mobile>html.theme--documenter-dark .column.is-2{flex:none;width:16.66666674%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-2{margin-left:16.66666674%}.columns.is-mobile>html.theme--documenter-dark .column.is-3{flex:none;width:25%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-3{margin-left:25%}.columns.is-mobile>html.theme--documenter-dark .column.is-4{flex:none;width:33.33333337%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-4{margin-left:33.33333337%}.columns.is-mobile>html.theme--documenter-dark .column.is-5{flex:none;width:41.66666674%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-5{margin-left:41.66666674%}.columns.is-mobile>html.theme--documenter-dark .column.is-6{flex:none;width:50%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-6{margin-left:50%}.columns.is-mobile>html.theme--documenter-dark .column.is-7{flex:none;width:58.33333337%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-7{margin-left:58.33333337%}.columns.is-mobile>html.theme--documenter-dark .column.is-8{flex:none;width:66.66666674%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-8{margin-left:66.66666674%}.columns.is-mobile>html.theme--documenter-dark .column.is-9{flex:none;width:75%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-9{margin-left:75%}.columns.is-mobile>html.theme--documenter-dark .column.is-10{flex:none;width:83.33333337%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-10{margin-left:83.33333337%}.columns.is-mobile>html.theme--documenter-dark .column.is-11{flex:none;width:91.66666674%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-11{margin-left:91.66666674%}.columns.is-mobile>html.theme--documenter-dark .column.is-12{flex:none;width:100%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-12{margin-left:100%}@media screen and (max-width: 768px){html.theme--documenter-dark .column.is-narrow-mobile{flex:none;width:unset}html.theme--documenter-dark .column.is-full-mobile{flex:none;width:100%}html.theme--documenter-dark .column.is-three-quarters-mobile{flex:none;width:75%}html.theme--documenter-dark .column.is-two-thirds-mobile{flex:none;width:66.6666%}html.theme--documenter-dark .column.is-half-mobile{flex:none;width:50%}html.theme--documenter-dark .column.is-one-third-mobile{flex:none;width:33.3333%}html.theme--documenter-dark .column.is-one-quarter-mobile{flex:none;width:25%}html.theme--documenter-dark .column.is-one-fifth-mobile{flex:none;width:20%}html.theme--documenter-dark .column.is-two-fifths-mobile{flex:none;width:40%}html.theme--documenter-dark .column.is-three-fifths-mobile{flex:none;width:60%}html.theme--documenter-dark .column.is-four-fifths-mobile{flex:none;width:80%}html.theme--documenter-dark .column.is-offset-three-quarters-mobile{margin-left:75%}html.theme--documenter-dark .column.is-offset-two-thirds-mobile{margin-left:66.6666%}html.theme--documenter-dark .column.is-offset-half-mobile{margin-left:50%}html.theme--documenter-dark .column.is-offset-one-third-mobile{margin-left:33.3333%}html.theme--documenter-dark .column.is-offset-one-quarter-mobile{margin-left:25%}html.theme--documenter-dark .column.is-offset-one-fifth-mobile{margin-left:20%}html.theme--documenter-dark .column.is-offset-two-fifths-mobile{margin-left:40%}html.theme--documenter-dark .column.is-offset-three-fifths-mobile{margin-left:60%}html.theme--documenter-dark .column.is-offset-four-fifths-mobile{margin-left:80%}html.theme--documenter-dark .column.is-0-mobile{flex:none;width:0%}html.theme--documenter-dark .column.is-offset-0-mobile{margin-left:0%}html.theme--documenter-dark .column.is-1-mobile{flex:none;width:8.33333337%}html.theme--documenter-dark .column.is-offset-1-mobile{margin-left:8.33333337%}html.theme--documenter-dark .column.is-2-mobile{flex:none;width:16.66666674%}html.theme--documenter-dark .column.is-offset-2-mobile{margin-left:16.66666674%}html.theme--documenter-dark .column.is-3-mobile{flex:none;width:25%}html.theme--documenter-dark .column.is-offset-3-mobile{margin-left:25%}html.theme--documenter-dark .column.is-4-mobile{flex:none;width:33.33333337%}html.theme--documenter-dark .column.is-offset-4-mobile{margin-left:33.33333337%}html.theme--documenter-dark .column.is-5-mobile{flex:none;width:41.66666674%}html.theme--documenter-dark .column.is-offset-5-mobile{margin-left:41.66666674%}html.theme--documenter-dark .column.is-6-mobile{flex:none;width:50%}html.theme--documenter-dark .column.is-offset-6-mobile{margin-left:50%}html.theme--documenter-dark .column.is-7-mobile{flex:none;width:58.33333337%}html.theme--documenter-dark .column.is-offset-7-mobile{margin-left:58.33333337%}html.theme--documenter-dark .column.is-8-mobile{flex:none;width:66.66666674%}html.theme--documenter-dark .column.is-offset-8-mobile{margin-left:66.66666674%}html.theme--documenter-dark .column.is-9-mobile{flex:none;width:75%}html.theme--documenter-dark .column.is-offset-9-mobile{margin-left:75%}html.theme--documenter-dark .column.is-10-mobile{flex:none;width:83.33333337%}html.theme--documenter-dark .column.is-offset-10-mobile{margin-left:83.33333337%}html.theme--documenter-dark .column.is-11-mobile{flex:none;width:91.66666674%}html.theme--documenter-dark .column.is-offset-11-mobile{margin-left:91.66666674%}html.theme--documenter-dark .column.is-12-mobile{flex:none;width:100%}html.theme--documenter-dark .column.is-offset-12-mobile{margin-left:100%}}@media screen and (min-width: 769px),print{html.theme--documenter-dark .column.is-narrow,html.theme--documenter-dark .column.is-narrow-tablet{flex:none;width:unset}html.theme--documenter-dark .column.is-full,html.theme--documenter-dark .column.is-full-tablet{flex:none;width:100%}html.theme--documenter-dark .column.is-three-quarters,html.theme--documenter-dark .column.is-three-quarters-tablet{flex:none;width:75%}html.theme--documenter-dark .column.is-two-thirds,html.theme--documenter-dark .column.is-two-thirds-tablet{flex:none;width:66.6666%}html.theme--documenter-dark .column.is-half,html.theme--documenter-dark .column.is-half-tablet{flex:none;width:50%}html.theme--documenter-dark .column.is-one-third,html.theme--documenter-dark .column.is-one-third-tablet{flex:none;width:33.3333%}html.theme--documenter-dark .column.is-one-quarter,html.theme--documenter-dark .column.is-one-quarter-tablet{flex:none;width:25%}html.theme--documenter-dark .column.is-one-fifth,html.theme--documenter-dark .column.is-one-fifth-tablet{flex:none;width:20%}html.theme--documenter-dark .column.is-two-fifths,html.theme--documenter-dark .column.is-two-fifths-tablet{flex:none;width:40%}html.theme--documenter-dark .column.is-three-fifths,html.theme--documenter-dark .column.is-three-fifths-tablet{flex:none;width:60%}html.theme--documenter-dark .column.is-four-fifths,html.theme--documenter-dark .column.is-four-fifths-tablet{flex:none;width:80%}html.theme--documenter-dark .column.is-offset-three-quarters,html.theme--documenter-dark .column.is-offset-three-quarters-tablet{margin-left:75%}html.theme--documenter-dark .column.is-offset-two-thirds,html.theme--documenter-dark .column.is-offset-two-thirds-tablet{margin-left:66.6666%}html.theme--documenter-dark .column.is-offset-half,html.theme--documenter-dark .column.is-offset-half-tablet{margin-left:50%}html.theme--documenter-dark .column.is-offset-one-third,html.theme--documenter-dark .column.is-offset-one-third-tablet{margin-left:33.3333%}html.theme--documenter-dark .column.is-offset-one-quarter,html.theme--documenter-dark .column.is-offset-one-quarter-tablet{margin-left:25%}html.theme--documenter-dark .column.is-offset-one-fifth,html.theme--documenter-dark .column.is-offset-one-fifth-tablet{margin-left:20%}html.theme--documenter-dark .column.is-offset-two-fifths,html.theme--documenter-dark .column.is-offset-two-fifths-tablet{margin-left:40%}html.theme--documenter-dark .column.is-offset-three-fifths,html.theme--documenter-dark .column.is-offset-three-fifths-tablet{margin-left:60%}html.theme--documenter-dark .column.is-offset-four-fifths,html.theme--documenter-dark .column.is-offset-four-fifths-tablet{margin-left:80%}html.theme--documenter-dark .column.is-0,html.theme--documenter-dark .column.is-0-tablet{flex:none;width:0%}html.theme--documenter-dark .column.is-offset-0,html.theme--documenter-dark .column.is-offset-0-tablet{margin-left:0%}html.theme--documenter-dark .column.is-1,html.theme--documenter-dark .column.is-1-tablet{flex:none;width:8.33333337%}html.theme--documenter-dark .column.is-offset-1,html.theme--documenter-dark .column.is-offset-1-tablet{margin-left:8.33333337%}html.theme--documenter-dark .column.is-2,html.theme--documenter-dark .column.is-2-tablet{flex:none;width:16.66666674%}html.theme--documenter-dark .column.is-offset-2,html.theme--documenter-dark .column.is-offset-2-tablet{margin-left:16.66666674%}html.theme--documenter-dark .column.is-3,html.theme--documenter-dark .column.is-3-tablet{flex:none;width:25%}html.theme--documenter-dark .column.is-offset-3,html.theme--documenter-dark .column.is-offset-3-tablet{margin-left:25%}html.theme--documenter-dark .column.is-4,html.theme--documenter-dark .column.is-4-tablet{flex:none;width:33.33333337%}html.theme--documenter-dark .column.is-offset-4,html.theme--documenter-dark .column.is-offset-4-tablet{margin-left:33.33333337%}html.theme--documenter-dark .column.is-5,html.theme--documenter-dark .column.is-5-tablet{flex:none;width:41.66666674%}html.theme--documenter-dark .column.is-offset-5,html.theme--documenter-dark .column.is-offset-5-tablet{margin-left:41.66666674%}html.theme--documenter-dark .column.is-6,html.theme--documenter-dark .column.is-6-tablet{flex:none;width:50%}html.theme--documenter-dark .column.is-offset-6,html.theme--documenter-dark .column.is-offset-6-tablet{margin-left:50%}html.theme--documenter-dark .column.is-7,html.theme--documenter-dark .column.is-7-tablet{flex:none;width:58.33333337%}html.theme--documenter-dark .column.is-offset-7,html.theme--documenter-dark .column.is-offset-7-tablet{margin-left:58.33333337%}html.theme--documenter-dark .column.is-8,html.theme--documenter-dark .column.is-8-tablet{flex:none;width:66.66666674%}html.theme--documenter-dark .column.is-offset-8,html.theme--documenter-dark .column.is-offset-8-tablet{margin-left:66.66666674%}html.theme--documenter-dark .column.is-9,html.theme--documenter-dark .column.is-9-tablet{flex:none;width:75%}html.theme--documenter-dark .column.is-offset-9,html.theme--documenter-dark .column.is-offset-9-tablet{margin-left:75%}html.theme--documenter-dark .column.is-10,html.theme--documenter-dark .column.is-10-tablet{flex:none;width:83.33333337%}html.theme--documenter-dark .column.is-offset-10,html.theme--documenter-dark .column.is-offset-10-tablet{margin-left:83.33333337%}html.theme--documenter-dark .column.is-11,html.theme--documenter-dark .column.is-11-tablet{flex:none;width:91.66666674%}html.theme--documenter-dark .column.is-offset-11,html.theme--documenter-dark .column.is-offset-11-tablet{margin-left:91.66666674%}html.theme--documenter-dark .column.is-12,html.theme--documenter-dark .column.is-12-tablet{flex:none;width:100%}html.theme--documenter-dark .column.is-offset-12,html.theme--documenter-dark .column.is-offset-12-tablet{margin-left:100%}}@media screen and (max-width: 1055px){html.theme--documenter-dark .column.is-narrow-touch{flex:none;width:unset}html.theme--documenter-dark .column.is-full-touch{flex:none;width:100%}html.theme--documenter-dark .column.is-three-quarters-touch{flex:none;width:75%}html.theme--documenter-dark .column.is-two-thirds-touch{flex:none;width:66.6666%}html.theme--documenter-dark .column.is-half-touch{flex:none;width:50%}html.theme--documenter-dark .column.is-one-third-touch{flex:none;width:33.3333%}html.theme--documenter-dark .column.is-one-quarter-touch{flex:none;width:25%}html.theme--documenter-dark .column.is-one-fifth-touch{flex:none;width:20%}html.theme--documenter-dark .column.is-two-fifths-touch{flex:none;width:40%}html.theme--documenter-dark .column.is-three-fifths-touch{flex:none;width:60%}html.theme--documenter-dark .column.is-four-fifths-touch{flex:none;width:80%}html.theme--documenter-dark .column.is-offset-three-quarters-touch{margin-left:75%}html.theme--documenter-dark .column.is-offset-two-thirds-touch{margin-left:66.6666%}html.theme--documenter-dark .column.is-offset-half-touch{margin-left:50%}html.theme--documenter-dark .column.is-offset-one-third-touch{margin-left:33.3333%}html.theme--documenter-dark .column.is-offset-one-quarter-touch{margin-left:25%}html.theme--documenter-dark .column.is-offset-one-fifth-touch{margin-left:20%}html.theme--documenter-dark .column.is-offset-two-fifths-touch{margin-left:40%}html.theme--documenter-dark .column.is-offset-three-fifths-touch{margin-left:60%}html.theme--documenter-dark .column.is-offset-four-fifths-touch{margin-left:80%}html.theme--documenter-dark .column.is-0-touch{flex:none;width:0%}html.theme--documenter-dark .column.is-offset-0-touch{margin-left:0%}html.theme--documenter-dark .column.is-1-touch{flex:none;width:8.33333337%}html.theme--documenter-dark .column.is-offset-1-touch{margin-left:8.33333337%}html.theme--documenter-dark .column.is-2-touch{flex:none;width:16.66666674%}html.theme--documenter-dark .column.is-offset-2-touch{margin-left:16.66666674%}html.theme--documenter-dark .column.is-3-touch{flex:none;width:25%}html.theme--documenter-dark .column.is-offset-3-touch{margin-left:25%}html.theme--documenter-dark .column.is-4-touch{flex:none;width:33.33333337%}html.theme--documenter-dark .column.is-offset-4-touch{margin-left:33.33333337%}html.theme--documenter-dark .column.is-5-touch{flex:none;width:41.66666674%}html.theme--documenter-dark .column.is-offset-5-touch{margin-left:41.66666674%}html.theme--documenter-dark .column.is-6-touch{flex:none;width:50%}html.theme--documenter-dark .column.is-offset-6-touch{margin-left:50%}html.theme--documenter-dark .column.is-7-touch{flex:none;width:58.33333337%}html.theme--documenter-dark .column.is-offset-7-touch{margin-left:58.33333337%}html.theme--documenter-dark .column.is-8-touch{flex:none;width:66.66666674%}html.theme--documenter-dark .column.is-offset-8-touch{margin-left:66.66666674%}html.theme--documenter-dark .column.is-9-touch{flex:none;width:75%}html.theme--documenter-dark .column.is-offset-9-touch{margin-left:75%}html.theme--documenter-dark .column.is-10-touch{flex:none;width:83.33333337%}html.theme--documenter-dark .column.is-offset-10-touch{margin-left:83.33333337%}html.theme--documenter-dark .column.is-11-touch{flex:none;width:91.66666674%}html.theme--documenter-dark .column.is-offset-11-touch{margin-left:91.66666674%}html.theme--documenter-dark .column.is-12-touch{flex:none;width:100%}html.theme--documenter-dark .column.is-offset-12-touch{margin-left:100%}}@media screen and (min-width: 1056px){html.theme--documenter-dark .column.is-narrow-desktop{flex:none;width:unset}html.theme--documenter-dark .column.is-full-desktop{flex:none;width:100%}html.theme--documenter-dark .column.is-three-quarters-desktop{flex:none;width:75%}html.theme--documenter-dark .column.is-two-thirds-desktop{flex:none;width:66.6666%}html.theme--documenter-dark .column.is-half-desktop{flex:none;width:50%}html.theme--documenter-dark .column.is-one-third-desktop{flex:none;width:33.3333%}html.theme--documenter-dark .column.is-one-quarter-desktop{flex:none;width:25%}html.theme--documenter-dark .column.is-one-fifth-desktop{flex:none;width:20%}html.theme--documenter-dark .column.is-two-fifths-desktop{flex:none;width:40%}html.theme--documenter-dark .column.is-three-fifths-desktop{flex:none;width:60%}html.theme--documenter-dark .column.is-four-fifths-desktop{flex:none;width:80%}html.theme--documenter-dark .column.is-offset-three-quarters-desktop{margin-left:75%}html.theme--documenter-dark .column.is-offset-two-thirds-desktop{margin-left:66.6666%}html.theme--documenter-dark .column.is-offset-half-desktop{margin-left:50%}html.theme--documenter-dark .column.is-offset-one-third-desktop{margin-left:33.3333%}html.theme--documenter-dark .column.is-offset-one-quarter-desktop{margin-left:25%}html.theme--documenter-dark .column.is-offset-one-fifth-desktop{margin-left:20%}html.theme--documenter-dark .column.is-offset-two-fifths-desktop{margin-left:40%}html.theme--documenter-dark .column.is-offset-three-fifths-desktop{margin-left:60%}html.theme--documenter-dark .column.is-offset-four-fifths-desktop{margin-left:80%}html.theme--documenter-dark .column.is-0-desktop{flex:none;width:0%}html.theme--documenter-dark .column.is-offset-0-desktop{margin-left:0%}html.theme--documenter-dark .column.is-1-desktop{flex:none;width:8.33333337%}html.theme--documenter-dark .column.is-offset-1-desktop{margin-left:8.33333337%}html.theme--documenter-dark .column.is-2-desktop{flex:none;width:16.66666674%}html.theme--documenter-dark .column.is-offset-2-desktop{margin-left:16.66666674%}html.theme--documenter-dark .column.is-3-desktop{flex:none;width:25%}html.theme--documenter-dark .column.is-offset-3-desktop{margin-left:25%}html.theme--documenter-dark .column.is-4-desktop{flex:none;width:33.33333337%}html.theme--documenter-dark .column.is-offset-4-desktop{margin-left:33.33333337%}html.theme--documenter-dark .column.is-5-desktop{flex:none;width:41.66666674%}html.theme--documenter-dark .column.is-offset-5-desktop{margin-left:41.66666674%}html.theme--documenter-dark .column.is-6-desktop{flex:none;width:50%}html.theme--documenter-dark .column.is-offset-6-desktop{margin-left:50%}html.theme--documenter-dark .column.is-7-desktop{flex:none;width:58.33333337%}html.theme--documenter-dark .column.is-offset-7-desktop{margin-left:58.33333337%}html.theme--documenter-dark .column.is-8-desktop{flex:none;width:66.66666674%}html.theme--documenter-dark .column.is-offset-8-desktop{margin-left:66.66666674%}html.theme--documenter-dark .column.is-9-desktop{flex:none;width:75%}html.theme--documenter-dark .column.is-offset-9-desktop{margin-left:75%}html.theme--documenter-dark .column.is-10-desktop{flex:none;width:83.33333337%}html.theme--documenter-dark .column.is-offset-10-desktop{margin-left:83.33333337%}html.theme--documenter-dark .column.is-11-desktop{flex:none;width:91.66666674%}html.theme--documenter-dark .column.is-offset-11-desktop{margin-left:91.66666674%}html.theme--documenter-dark .column.is-12-desktop{flex:none;width:100%}html.theme--documenter-dark .column.is-offset-12-desktop{margin-left:100%}}@media screen and (min-width: 1216px){html.theme--documenter-dark .column.is-narrow-widescreen{flex:none;width:unset}html.theme--documenter-dark .column.is-full-widescreen{flex:none;width:100%}html.theme--documenter-dark .column.is-three-quarters-widescreen{flex:none;width:75%}html.theme--documenter-dark .column.is-two-thirds-widescreen{flex:none;width:66.6666%}html.theme--documenter-dark .column.is-half-widescreen{flex:none;width:50%}html.theme--documenter-dark .column.is-one-third-widescreen{flex:none;width:33.3333%}html.theme--documenter-dark .column.is-one-quarter-widescreen{flex:none;width:25%}html.theme--documenter-dark .column.is-one-fifth-widescreen{flex:none;width:20%}html.theme--documenter-dark .column.is-two-fifths-widescreen{flex:none;width:40%}html.theme--documenter-dark .column.is-three-fifths-widescreen{flex:none;width:60%}html.theme--documenter-dark .column.is-four-fifths-widescreen{flex:none;width:80%}html.theme--documenter-dark .column.is-offset-three-quarters-widescreen{margin-left:75%}html.theme--documenter-dark .column.is-offset-two-thirds-widescreen{margin-left:66.6666%}html.theme--documenter-dark .column.is-offset-half-widescreen{margin-left:50%}html.theme--documenter-dark .column.is-offset-one-third-widescreen{margin-left:33.3333%}html.theme--documenter-dark .column.is-offset-one-quarter-widescreen{margin-left:25%}html.theme--documenter-dark .column.is-offset-one-fifth-widescreen{margin-left:20%}html.theme--documenter-dark .column.is-offset-two-fifths-widescreen{margin-left:40%}html.theme--documenter-dark .column.is-offset-three-fifths-widescreen{margin-left:60%}html.theme--documenter-dark .column.is-offset-four-fifths-widescreen{margin-left:80%}html.theme--documenter-dark .column.is-0-widescreen{flex:none;width:0%}html.theme--documenter-dark .column.is-offset-0-widescreen{margin-left:0%}html.theme--documenter-dark .column.is-1-widescreen{flex:none;width:8.33333337%}html.theme--documenter-dark .column.is-offset-1-widescreen{margin-left:8.33333337%}html.theme--documenter-dark .column.is-2-widescreen{flex:none;width:16.66666674%}html.theme--documenter-dark .column.is-offset-2-widescreen{margin-left:16.66666674%}html.theme--documenter-dark .column.is-3-widescreen{flex:none;width:25%}html.theme--documenter-dark .column.is-offset-3-widescreen{margin-left:25%}html.theme--documenter-dark .column.is-4-widescreen{flex:none;width:33.33333337%}html.theme--documenter-dark .column.is-offset-4-widescreen{margin-left:33.33333337%}html.theme--documenter-dark .column.is-5-widescreen{flex:none;width:41.66666674%}html.theme--documenter-dark .column.is-offset-5-widescreen{margin-left:41.66666674%}html.theme--documenter-dark .column.is-6-widescreen{flex:none;width:50%}html.theme--documenter-dark .column.is-offset-6-widescreen{margin-left:50%}html.theme--documenter-dark .column.is-7-widescreen{flex:none;width:58.33333337%}html.theme--documenter-dark .column.is-offset-7-widescreen{margin-left:58.33333337%}html.theme--documenter-dark .column.is-8-widescreen{flex:none;width:66.66666674%}html.theme--documenter-dark .column.is-offset-8-widescreen{margin-left:66.66666674%}html.theme--documenter-dark .column.is-9-widescreen{flex:none;width:75%}html.theme--documenter-dark .column.is-offset-9-widescreen{margin-left:75%}html.theme--documenter-dark .column.is-10-widescreen{flex:none;width:83.33333337%}html.theme--documenter-dark .column.is-offset-10-widescreen{margin-left:83.33333337%}html.theme--documenter-dark .column.is-11-widescreen{flex:none;width:91.66666674%}html.theme--documenter-dark .column.is-offset-11-widescreen{margin-left:91.66666674%}html.theme--documenter-dark .column.is-12-widescreen{flex:none;width:100%}html.theme--documenter-dark .column.is-offset-12-widescreen{margin-left:100%}}@media screen and (min-width: 1408px){html.theme--documenter-dark .column.is-narrow-fullhd{flex:none;width:unset}html.theme--documenter-dark .column.is-full-fullhd{flex:none;width:100%}html.theme--documenter-dark .column.is-three-quarters-fullhd{flex:none;width:75%}html.theme--documenter-dark .column.is-two-thirds-fullhd{flex:none;width:66.6666%}html.theme--documenter-dark .column.is-half-fullhd{flex:none;width:50%}html.theme--documenter-dark .column.is-one-third-fullhd{flex:none;width:33.3333%}html.theme--documenter-dark .column.is-one-quarter-fullhd{flex:none;width:25%}html.theme--documenter-dark .column.is-one-fifth-fullhd{flex:none;width:20%}html.theme--documenter-dark .column.is-two-fifths-fullhd{flex:none;width:40%}html.theme--documenter-dark .column.is-three-fifths-fullhd{flex:none;width:60%}html.theme--documenter-dark .column.is-four-fifths-fullhd{flex:none;width:80%}html.theme--documenter-dark .column.is-offset-three-quarters-fullhd{margin-left:75%}html.theme--documenter-dark .column.is-offset-two-thirds-fullhd{margin-left:66.6666%}html.theme--documenter-dark .column.is-offset-half-fullhd{margin-left:50%}html.theme--documenter-dark .column.is-offset-one-third-fullhd{margin-left:33.3333%}html.theme--documenter-dark .column.is-offset-one-quarter-fullhd{margin-left:25%}html.theme--documenter-dark .column.is-offset-one-fifth-fullhd{margin-left:20%}html.theme--documenter-dark .column.is-offset-two-fifths-fullhd{margin-left:40%}html.theme--documenter-dark .column.is-offset-three-fifths-fullhd{margin-left:60%}html.theme--documenter-dark .column.is-offset-four-fifths-fullhd{margin-left:80%}html.theme--documenter-dark .column.is-0-fullhd{flex:none;width:0%}html.theme--documenter-dark .column.is-offset-0-fullhd{margin-left:0%}html.theme--documenter-dark .column.is-1-fullhd{flex:none;width:8.33333337%}html.theme--documenter-dark .column.is-offset-1-fullhd{margin-left:8.33333337%}html.theme--documenter-dark .column.is-2-fullhd{flex:none;width:16.66666674%}html.theme--documenter-dark .column.is-offset-2-fullhd{margin-left:16.66666674%}html.theme--documenter-dark .column.is-3-fullhd{flex:none;width:25%}html.theme--documenter-dark .column.is-offset-3-fullhd{margin-left:25%}html.theme--documenter-dark .column.is-4-fullhd{flex:none;width:33.33333337%}html.theme--documenter-dark .column.is-offset-4-fullhd{margin-left:33.33333337%}html.theme--documenter-dark .column.is-5-fullhd{flex:none;width:41.66666674%}html.theme--documenter-dark .column.is-offset-5-fullhd{margin-left:41.66666674%}html.theme--documenter-dark .column.is-6-fullhd{flex:none;width:50%}html.theme--documenter-dark .column.is-offset-6-fullhd{margin-left:50%}html.theme--documenter-dark .column.is-7-fullhd{flex:none;width:58.33333337%}html.theme--documenter-dark .column.is-offset-7-fullhd{margin-left:58.33333337%}html.theme--documenter-dark .column.is-8-fullhd{flex:none;width:66.66666674%}html.theme--documenter-dark .column.is-offset-8-fullhd{margin-left:66.66666674%}html.theme--documenter-dark .column.is-9-fullhd{flex:none;width:75%}html.theme--documenter-dark .column.is-offset-9-fullhd{margin-left:75%}html.theme--documenter-dark .column.is-10-fullhd{flex:none;width:83.33333337%}html.theme--documenter-dark .column.is-offset-10-fullhd{margin-left:83.33333337%}html.theme--documenter-dark .column.is-11-fullhd{flex:none;width:91.66666674%}html.theme--documenter-dark .column.is-offset-11-fullhd{margin-left:91.66666674%}html.theme--documenter-dark .column.is-12-fullhd{flex:none;width:100%}html.theme--documenter-dark .column.is-offset-12-fullhd{margin-left:100%}}html.theme--documenter-dark .columns{margin-left:-.75rem;margin-right:-.75rem;margin-top:-.75rem}html.theme--documenter-dark .columns:last-child{margin-bottom:-.75rem}html.theme--documenter-dark .columns:not(:last-child){margin-bottom:calc(1.5rem - .75rem)}html.theme--documenter-dark .columns.is-centered{justify-content:center}html.theme--documenter-dark .columns.is-gapless{margin-left:0;margin-right:0;margin-top:0}html.theme--documenter-dark .columns.is-gapless>.column{margin:0;padding:0 !important}html.theme--documenter-dark .columns.is-gapless:not(:last-child){margin-bottom:1.5rem}html.theme--documenter-dark .columns.is-gapless:last-child{margin-bottom:0}html.theme--documenter-dark .columns.is-mobile{display:flex}html.theme--documenter-dark .columns.is-multiline{flex-wrap:wrap}html.theme--documenter-dark .columns.is-vcentered{align-items:center}@media screen and (min-width: 769px),print{html.theme--documenter-dark .columns:not(.is-desktop){display:flex}}@media screen and (min-width: 1056px){html.theme--documenter-dark .columns.is-desktop{display:flex}}html.theme--documenter-dark .columns.is-variable{--columnGap: 0.75rem;margin-left:calc(-1 * var(--columnGap));margin-right:calc(-1 * var(--columnGap))}html.theme--documenter-dark .columns.is-variable>.column{padding-left:var(--columnGap);padding-right:var(--columnGap)}html.theme--documenter-dark .columns.is-variable.is-0{--columnGap: 0rem}@media screen and (max-width: 768px){html.theme--documenter-dark .columns.is-variable.is-0-mobile{--columnGap: 0rem}}@media screen and (min-width: 769px),print{html.theme--documenter-dark .columns.is-variable.is-0-tablet{--columnGap: 0rem}}@media screen and (min-width: 769px) and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-0-tablet-only{--columnGap: 0rem}}@media screen and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-0-touch{--columnGap: 0rem}}@media screen and (min-width: 1056px){html.theme--documenter-dark .columns.is-variable.is-0-desktop{--columnGap: 0rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){html.theme--documenter-dark .columns.is-variable.is-0-desktop-only{--columnGap: 0rem}}@media screen and (min-width: 1216px){html.theme--documenter-dark .columns.is-variable.is-0-widescreen{--columnGap: 0rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){html.theme--documenter-dark .columns.is-variable.is-0-widescreen-only{--columnGap: 0rem}}@media screen and (min-width: 1408px){html.theme--documenter-dark .columns.is-variable.is-0-fullhd{--columnGap: 0rem}}html.theme--documenter-dark .columns.is-variable.is-1{--columnGap: .25rem}@media screen and (max-width: 768px){html.theme--documenter-dark .columns.is-variable.is-1-mobile{--columnGap: .25rem}}@media screen and (min-width: 769px),print{html.theme--documenter-dark .columns.is-variable.is-1-tablet{--columnGap: .25rem}}@media screen and (min-width: 769px) and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-1-tablet-only{--columnGap: .25rem}}@media screen and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-1-touch{--columnGap: .25rem}}@media screen and (min-width: 1056px){html.theme--documenter-dark .columns.is-variable.is-1-desktop{--columnGap: .25rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){html.theme--documenter-dark .columns.is-variable.is-1-desktop-only{--columnGap: .25rem}}@media screen and (min-width: 1216px){html.theme--documenter-dark .columns.is-variable.is-1-widescreen{--columnGap: .25rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){html.theme--documenter-dark .columns.is-variable.is-1-widescreen-only{--columnGap: .25rem}}@media screen and (min-width: 1408px){html.theme--documenter-dark .columns.is-variable.is-1-fullhd{--columnGap: .25rem}}html.theme--documenter-dark .columns.is-variable.is-2{--columnGap: .5rem}@media screen and (max-width: 768px){html.theme--documenter-dark .columns.is-variable.is-2-mobile{--columnGap: .5rem}}@media screen and (min-width: 769px),print{html.theme--documenter-dark .columns.is-variable.is-2-tablet{--columnGap: .5rem}}@media screen and (min-width: 769px) and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-2-tablet-only{--columnGap: .5rem}}@media screen and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-2-touch{--columnGap: .5rem}}@media screen and (min-width: 1056px){html.theme--documenter-dark .columns.is-variable.is-2-desktop{--columnGap: .5rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){html.theme--documenter-dark .columns.is-variable.is-2-desktop-only{--columnGap: .5rem}}@media screen and (min-width: 1216px){html.theme--documenter-dark .columns.is-variable.is-2-widescreen{--columnGap: .5rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){html.theme--documenter-dark .columns.is-variable.is-2-widescreen-only{--columnGap: .5rem}}@media screen and (min-width: 1408px){html.theme--documenter-dark .columns.is-variable.is-2-fullhd{--columnGap: .5rem}}html.theme--documenter-dark .columns.is-variable.is-3{--columnGap: .75rem}@media screen and (max-width: 768px){html.theme--documenter-dark .columns.is-variable.is-3-mobile{--columnGap: .75rem}}@media screen and (min-width: 769px),print{html.theme--documenter-dark .columns.is-variable.is-3-tablet{--columnGap: .75rem}}@media screen and (min-width: 769px) and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-3-tablet-only{--columnGap: .75rem}}@media screen and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-3-touch{--columnGap: .75rem}}@media screen and (min-width: 1056px){html.theme--documenter-dark .columns.is-variable.is-3-desktop{--columnGap: .75rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){html.theme--documenter-dark .columns.is-variable.is-3-desktop-only{--columnGap: .75rem}}@media screen and (min-width: 1216px){html.theme--documenter-dark .columns.is-variable.is-3-widescreen{--columnGap: .75rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){html.theme--documenter-dark .columns.is-variable.is-3-widescreen-only{--columnGap: .75rem}}@media screen and (min-width: 1408px){html.theme--documenter-dark .columns.is-variable.is-3-fullhd{--columnGap: .75rem}}html.theme--documenter-dark .columns.is-variable.is-4{--columnGap: 1rem}@media screen and (max-width: 768px){html.theme--documenter-dark .columns.is-variable.is-4-mobile{--columnGap: 1rem}}@media screen and (min-width: 769px),print{html.theme--documenter-dark .columns.is-variable.is-4-tablet{--columnGap: 1rem}}@media screen and (min-width: 769px) and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-4-tablet-only{--columnGap: 1rem}}@media screen and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-4-touch{--columnGap: 1rem}}@media screen and (min-width: 1056px){html.theme--documenter-dark .columns.is-variable.is-4-desktop{--columnGap: 1rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){html.theme--documenter-dark .columns.is-variable.is-4-desktop-only{--columnGap: 1rem}}@media screen and (min-width: 1216px){html.theme--documenter-dark .columns.is-variable.is-4-widescreen{--columnGap: 1rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){html.theme--documenter-dark .columns.is-variable.is-4-widescreen-only{--columnGap: 1rem}}@media screen and (min-width: 1408px){html.theme--documenter-dark .columns.is-variable.is-4-fullhd{--columnGap: 1rem}}html.theme--documenter-dark .columns.is-variable.is-5{--columnGap: 1.25rem}@media screen and (max-width: 768px){html.theme--documenter-dark .columns.is-variable.is-5-mobile{--columnGap: 1.25rem}}@media screen and (min-width: 769px),print{html.theme--documenter-dark .columns.is-variable.is-5-tablet{--columnGap: 1.25rem}}@media screen and (min-width: 769px) and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-5-tablet-only{--columnGap: 1.25rem}}@media screen and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-5-touch{--columnGap: 1.25rem}}@media screen and (min-width: 1056px){html.theme--documenter-dark .columns.is-variable.is-5-desktop{--columnGap: 1.25rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){html.theme--documenter-dark .columns.is-variable.is-5-desktop-only{--columnGap: 1.25rem}}@media screen and (min-width: 1216px){html.theme--documenter-dark .columns.is-variable.is-5-widescreen{--columnGap: 1.25rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){html.theme--documenter-dark .columns.is-variable.is-5-widescreen-only{--columnGap: 1.25rem}}@media screen and (min-width: 1408px){html.theme--documenter-dark .columns.is-variable.is-5-fullhd{--columnGap: 1.25rem}}html.theme--documenter-dark .columns.is-variable.is-6{--columnGap: 1.5rem}@media screen and (max-width: 768px){html.theme--documenter-dark .columns.is-variable.is-6-mobile{--columnGap: 1.5rem}}@media screen and (min-width: 769px),print{html.theme--documenter-dark .columns.is-variable.is-6-tablet{--columnGap: 1.5rem}}@media screen and (min-width: 769px) and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-6-tablet-only{--columnGap: 1.5rem}}@media screen and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-6-touch{--columnGap: 1.5rem}}@media screen and (min-width: 1056px){html.theme--documenter-dark .columns.is-variable.is-6-desktop{--columnGap: 1.5rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){html.theme--documenter-dark .columns.is-variable.is-6-desktop-only{--columnGap: 1.5rem}}@media screen and (min-width: 1216px){html.theme--documenter-dark .columns.is-variable.is-6-widescreen{--columnGap: 1.5rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){html.theme--documenter-dark .columns.is-variable.is-6-widescreen-only{--columnGap: 1.5rem}}@media screen and (min-width: 1408px){html.theme--documenter-dark .columns.is-variable.is-6-fullhd{--columnGap: 1.5rem}}html.theme--documenter-dark .columns.is-variable.is-7{--columnGap: 1.75rem}@media screen and (max-width: 768px){html.theme--documenter-dark .columns.is-variable.is-7-mobile{--columnGap: 1.75rem}}@media screen and (min-width: 769px),print{html.theme--documenter-dark .columns.is-variable.is-7-tablet{--columnGap: 1.75rem}}@media screen and (min-width: 769px) and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-7-tablet-only{--columnGap: 1.75rem}}@media screen and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-7-touch{--columnGap: 1.75rem}}@media screen and (min-width: 1056px){html.theme--documenter-dark .columns.is-variable.is-7-desktop{--columnGap: 1.75rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){html.theme--documenter-dark .columns.is-variable.is-7-desktop-only{--columnGap: 1.75rem}}@media screen and (min-width: 1216px){html.theme--documenter-dark .columns.is-variable.is-7-widescreen{--columnGap: 1.75rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){html.theme--documenter-dark .columns.is-variable.is-7-widescreen-only{--columnGap: 1.75rem}}@media screen and (min-width: 1408px){html.theme--documenter-dark .columns.is-variable.is-7-fullhd{--columnGap: 1.75rem}}html.theme--documenter-dark .columns.is-variable.is-8{--columnGap: 2rem}@media screen and (max-width: 768px){html.theme--documenter-dark .columns.is-variable.is-8-mobile{--columnGap: 2rem}}@media screen and (min-width: 769px),print{html.theme--documenter-dark .columns.is-variable.is-8-tablet{--columnGap: 2rem}}@media screen and (min-width: 769px) and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-8-tablet-only{--columnGap: 2rem}}@media screen and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-8-touch{--columnGap: 2rem}}@media screen and (min-width: 1056px){html.theme--documenter-dark .columns.is-variable.is-8-desktop{--columnGap: 2rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){html.theme--documenter-dark .columns.is-variable.is-8-desktop-only{--columnGap: 2rem}}@media screen and (min-width: 1216px){html.theme--documenter-dark .columns.is-variable.is-8-widescreen{--columnGap: 2rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){html.theme--documenter-dark .columns.is-variable.is-8-widescreen-only{--columnGap: 2rem}}@media screen and (min-width: 1408px){html.theme--documenter-dark .columns.is-variable.is-8-fullhd{--columnGap: 2rem}}html.theme--documenter-dark .tile{align-items:stretch;display:block;flex-basis:0;flex-grow:1;flex-shrink:1;min-height:min-content}html.theme--documenter-dark .tile.is-ancestor{margin-left:-.75rem;margin-right:-.75rem;margin-top:-.75rem}html.theme--documenter-dark .tile.is-ancestor:last-child{margin-bottom:-.75rem}html.theme--documenter-dark .tile.is-ancestor:not(:last-child){margin-bottom:.75rem}html.theme--documenter-dark .tile.is-child{margin:0 !important}html.theme--documenter-dark .tile.is-parent{padding:.75rem}html.theme--documenter-dark .tile.is-vertical{flex-direction:column}html.theme--documenter-dark .tile.is-vertical>.tile.is-child:not(:last-child){margin-bottom:1.5rem !important}@media screen and (min-width: 769px),print{html.theme--documenter-dark .tile:not(.is-child){display:flex}html.theme--documenter-dark .tile.is-1{flex:none;width:8.33333337%}html.theme--documenter-dark .tile.is-2{flex:none;width:16.66666674%}html.theme--documenter-dark .tile.is-3{flex:none;width:25%}html.theme--documenter-dark .tile.is-4{flex:none;width:33.33333337%}html.theme--documenter-dark .tile.is-5{flex:none;width:41.66666674%}html.theme--documenter-dark .tile.is-6{flex:none;width:50%}html.theme--documenter-dark .tile.is-7{flex:none;width:58.33333337%}html.theme--documenter-dark .tile.is-8{flex:none;width:66.66666674%}html.theme--documenter-dark .tile.is-9{flex:none;width:75%}html.theme--documenter-dark .tile.is-10{flex:none;width:83.33333337%}html.theme--documenter-dark .tile.is-11{flex:none;width:91.66666674%}html.theme--documenter-dark .tile.is-12{flex:none;width:100%}}html.theme--documenter-dark .hero{align-items:stretch;display:flex;flex-direction:column;justify-content:space-between}html.theme--documenter-dark .hero .navbar{background:none}html.theme--documenter-dark .hero .tabs ul{border-bottom:none}html.theme--documenter-dark .hero.is-white{background-color:#fff;color:#0a0a0a}html.theme--documenter-dark .hero.is-white a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),html.theme--documenter-dark .hero.is-white strong{color:inherit}html.theme--documenter-dark .hero.is-white .title{color:#0a0a0a}html.theme--documenter-dark .hero.is-white .subtitle{color:rgba(10,10,10,0.9)}html.theme--documenter-dark .hero.is-white .subtitle a:not(.button),html.theme--documenter-dark .hero.is-white .subtitle strong{color:#0a0a0a}@media screen and (max-width: 1055px){html.theme--documenter-dark .hero.is-white .navbar-menu{background-color:#fff}}html.theme--documenter-dark .hero.is-white .navbar-item,html.theme--documenter-dark .hero.is-white .navbar-link{color:rgba(10,10,10,0.7)}html.theme--documenter-dark .hero.is-white a.navbar-item:hover,html.theme--documenter-dark .hero.is-white a.navbar-item.is-active,html.theme--documenter-dark .hero.is-white .navbar-link:hover,html.theme--documenter-dark .hero.is-white .navbar-link.is-active{background-color:#f2f2f2;color:#0a0a0a}html.theme--documenter-dark .hero.is-white .tabs a{color:#0a0a0a;opacity:0.9}html.theme--documenter-dark .hero.is-white .tabs a:hover{opacity:1}html.theme--documenter-dark .hero.is-white .tabs li.is-active a{color:#fff !important;opacity:1}html.theme--documenter-dark .hero.is-white .tabs.is-boxed a,html.theme--documenter-dark .hero.is-white .tabs.is-toggle a{color:#0a0a0a}html.theme--documenter-dark .hero.is-white .tabs.is-boxed a:hover,html.theme--documenter-dark .hero.is-white .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}html.theme--documenter-dark .hero.is-white .tabs.is-boxed li.is-active a,html.theme--documenter-dark .hero.is-white .tabs.is-boxed li.is-active a:hover,html.theme--documenter-dark .hero.is-white .tabs.is-toggle li.is-active a,html.theme--documenter-dark .hero.is-white .tabs.is-toggle li.is-active a:hover{background-color:#0a0a0a;border-color:#0a0a0a;color:#fff}html.theme--documenter-dark .hero.is-white.is-bold{background-image:linear-gradient(141deg, #e8e3e4 0%, #fff 71%, #fff 100%)}@media screen and (max-width: 768px){html.theme--documenter-dark .hero.is-white.is-bold .navbar-menu{background-image:linear-gradient(141deg, #e8e3e4 0%, #fff 71%, #fff 100%)}}html.theme--documenter-dark .hero.is-black{background-color:#0a0a0a;color:#fff}html.theme--documenter-dark .hero.is-black a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),html.theme--documenter-dark .hero.is-black strong{color:inherit}html.theme--documenter-dark .hero.is-black .title{color:#fff}html.theme--documenter-dark .hero.is-black .subtitle{color:rgba(255,255,255,0.9)}html.theme--documenter-dark .hero.is-black .subtitle a:not(.button),html.theme--documenter-dark .hero.is-black .subtitle strong{color:#fff}@media screen and (max-width: 1055px){html.theme--documenter-dark .hero.is-black .navbar-menu{background-color:#0a0a0a}}html.theme--documenter-dark .hero.is-black .navbar-item,html.theme--documenter-dark .hero.is-black .navbar-link{color:rgba(255,255,255,0.7)}html.theme--documenter-dark .hero.is-black a.navbar-item:hover,html.theme--documenter-dark .hero.is-black a.navbar-item.is-active,html.theme--documenter-dark .hero.is-black .navbar-link:hover,html.theme--documenter-dark .hero.is-black .navbar-link.is-active{background-color:#000;color:#fff}html.theme--documenter-dark .hero.is-black .tabs a{color:#fff;opacity:0.9}html.theme--documenter-dark .hero.is-black .tabs a:hover{opacity:1}html.theme--documenter-dark .hero.is-black .tabs li.is-active a{color:#0a0a0a !important;opacity:1}html.theme--documenter-dark .hero.is-black .tabs.is-boxed a,html.theme--documenter-dark .hero.is-black .tabs.is-toggle a{color:#fff}html.theme--documenter-dark .hero.is-black .tabs.is-boxed a:hover,html.theme--documenter-dark .hero.is-black .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}html.theme--documenter-dark .hero.is-black .tabs.is-boxed li.is-active a,html.theme--documenter-dark .hero.is-black .tabs.is-boxed li.is-active a:hover,html.theme--documenter-dark .hero.is-black .tabs.is-toggle li.is-active a,html.theme--documenter-dark .hero.is-black .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#0a0a0a}html.theme--documenter-dark .hero.is-black.is-bold{background-image:linear-gradient(141deg, #000 0%, #0a0a0a 71%, #181616 100%)}@media screen and (max-width: 768px){html.theme--documenter-dark .hero.is-black.is-bold .navbar-menu{background-image:linear-gradient(141deg, #000 0%, #0a0a0a 71%, #181616 100%)}}html.theme--documenter-dark .hero.is-light{background-color:#ecf0f1;color:rgba(0,0,0,0.7)}html.theme--documenter-dark .hero.is-light a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),html.theme--documenter-dark .hero.is-light strong{color:inherit}html.theme--documenter-dark .hero.is-light .title{color:rgba(0,0,0,0.7)}html.theme--documenter-dark .hero.is-light .subtitle{color:rgba(0,0,0,0.9)}html.theme--documenter-dark .hero.is-light .subtitle a:not(.button),html.theme--documenter-dark .hero.is-light .subtitle strong{color:rgba(0,0,0,0.7)}@media screen and (max-width: 1055px){html.theme--documenter-dark .hero.is-light .navbar-menu{background-color:#ecf0f1}}html.theme--documenter-dark .hero.is-light .navbar-item,html.theme--documenter-dark .hero.is-light .navbar-link{color:rgba(0,0,0,0.7)}html.theme--documenter-dark .hero.is-light a.navbar-item:hover,html.theme--documenter-dark .hero.is-light a.navbar-item.is-active,html.theme--documenter-dark .hero.is-light .navbar-link:hover,html.theme--documenter-dark .hero.is-light .navbar-link.is-active{background-color:#dde4e6;color:rgba(0,0,0,0.7)}html.theme--documenter-dark .hero.is-light .tabs a{color:rgba(0,0,0,0.7);opacity:0.9}html.theme--documenter-dark .hero.is-light .tabs a:hover{opacity:1}html.theme--documenter-dark .hero.is-light .tabs li.is-active a{color:#ecf0f1 !important;opacity:1}html.theme--documenter-dark .hero.is-light .tabs.is-boxed a,html.theme--documenter-dark .hero.is-light .tabs.is-toggle a{color:rgba(0,0,0,0.7)}html.theme--documenter-dark .hero.is-light .tabs.is-boxed a:hover,html.theme--documenter-dark .hero.is-light .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}html.theme--documenter-dark .hero.is-light .tabs.is-boxed li.is-active a,html.theme--documenter-dark .hero.is-light .tabs.is-boxed li.is-active a:hover,html.theme--documenter-dark .hero.is-light .tabs.is-toggle li.is-active a,html.theme--documenter-dark .hero.is-light .tabs.is-toggle li.is-active a:hover{background-color:rgba(0,0,0,0.7);border-color:rgba(0,0,0,0.7);color:#ecf0f1}html.theme--documenter-dark .hero.is-light.is-bold{background-image:linear-gradient(141deg, #cadfe0 0%, #ecf0f1 71%, #fafbfc 100%)}@media screen and (max-width: 768px){html.theme--documenter-dark .hero.is-light.is-bold .navbar-menu{background-image:linear-gradient(141deg, #cadfe0 0%, #ecf0f1 71%, #fafbfc 100%)}}html.theme--documenter-dark .hero.is-dark,html.theme--documenter-dark .content kbd.hero{background-color:#282f2f;color:#fff}html.theme--documenter-dark .hero.is-dark a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),html.theme--documenter-dark .content kbd.hero a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),html.theme--documenter-dark .hero.is-dark strong,html.theme--documenter-dark .content kbd.hero strong{color:inherit}html.theme--documenter-dark .hero.is-dark .title,html.theme--documenter-dark .content kbd.hero .title{color:#fff}html.theme--documenter-dark .hero.is-dark .subtitle,html.theme--documenter-dark .content kbd.hero .subtitle{color:rgba(255,255,255,0.9)}html.theme--documenter-dark .hero.is-dark .subtitle a:not(.button),html.theme--documenter-dark .content kbd.hero .subtitle a:not(.button),html.theme--documenter-dark .hero.is-dark .subtitle strong,html.theme--documenter-dark .content kbd.hero .subtitle strong{color:#fff}@media screen and (max-width: 1055px){html.theme--documenter-dark .hero.is-dark .navbar-menu,html.theme--documenter-dark .content kbd.hero .navbar-menu{background-color:#282f2f}}html.theme--documenter-dark .hero.is-dark .navbar-item,html.theme--documenter-dark .content kbd.hero .navbar-item,html.theme--documenter-dark .hero.is-dark .navbar-link,html.theme--documenter-dark .content kbd.hero .navbar-link{color:rgba(255,255,255,0.7)}html.theme--documenter-dark .hero.is-dark a.navbar-item:hover,html.theme--documenter-dark .content kbd.hero a.navbar-item:hover,html.theme--documenter-dark .hero.is-dark a.navbar-item.is-active,html.theme--documenter-dark .content kbd.hero a.navbar-item.is-active,html.theme--documenter-dark .hero.is-dark .navbar-link:hover,html.theme--documenter-dark .content kbd.hero .navbar-link:hover,html.theme--documenter-dark .hero.is-dark .navbar-link.is-active,html.theme--documenter-dark .content kbd.hero .navbar-link.is-active{background-color:#1d2122;color:#fff}html.theme--documenter-dark .hero.is-dark .tabs a,html.theme--documenter-dark .content kbd.hero .tabs a{color:#fff;opacity:0.9}html.theme--documenter-dark .hero.is-dark .tabs a:hover,html.theme--documenter-dark .content kbd.hero .tabs a:hover{opacity:1}html.theme--documenter-dark .hero.is-dark .tabs li.is-active a,html.theme--documenter-dark .content kbd.hero .tabs li.is-active a{color:#282f2f !important;opacity:1}html.theme--documenter-dark .hero.is-dark .tabs.is-boxed a,html.theme--documenter-dark .content kbd.hero .tabs.is-boxed a,html.theme--documenter-dark .hero.is-dark .tabs.is-toggle a,html.theme--documenter-dark .content kbd.hero .tabs.is-toggle a{color:#fff}html.theme--documenter-dark .hero.is-dark .tabs.is-boxed a:hover,html.theme--documenter-dark .content kbd.hero .tabs.is-boxed a:hover,html.theme--documenter-dark .hero.is-dark .tabs.is-toggle a:hover,html.theme--documenter-dark .content kbd.hero .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}html.theme--documenter-dark .hero.is-dark .tabs.is-boxed li.is-active a,html.theme--documenter-dark .content kbd.hero .tabs.is-boxed li.is-active a,html.theme--documenter-dark .hero.is-dark .tabs.is-boxed li.is-active a:hover,html.theme--documenter-dark .hero.is-dark .tabs.is-toggle li.is-active a,html.theme--documenter-dark .content kbd.hero .tabs.is-toggle li.is-active a,html.theme--documenter-dark .hero.is-dark .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#282f2f}html.theme--documenter-dark .hero.is-dark.is-bold,html.theme--documenter-dark .content kbd.hero.is-bold{background-image:linear-gradient(141deg, #0f1615 0%, #282f2f 71%, #313c40 100%)}@media screen and (max-width: 768px){html.theme--documenter-dark .hero.is-dark.is-bold .navbar-menu,html.theme--documenter-dark .content kbd.hero.is-bold .navbar-menu{background-image:linear-gradient(141deg, #0f1615 0%, #282f2f 71%, #313c40 100%)}}html.theme--documenter-dark .hero.is-primary,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink{background-color:#375a7f;color:#fff}html.theme--documenter-dark .hero.is-primary a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),html.theme--documenter-dark .hero.is-primary strong,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink strong{color:inherit}html.theme--documenter-dark .hero.is-primary .title,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .title{color:#fff}html.theme--documenter-dark .hero.is-primary .subtitle,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .subtitle{color:rgba(255,255,255,0.9)}html.theme--documenter-dark .hero.is-primary .subtitle a:not(.button),html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .subtitle a:not(.button),html.theme--documenter-dark .hero.is-primary .subtitle strong,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .subtitle strong{color:#fff}@media screen and (max-width: 1055px){html.theme--documenter-dark .hero.is-primary .navbar-menu,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .navbar-menu{background-color:#375a7f}}html.theme--documenter-dark .hero.is-primary .navbar-item,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .navbar-item,html.theme--documenter-dark .hero.is-primary .navbar-link,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .navbar-link{color:rgba(255,255,255,0.7)}html.theme--documenter-dark .hero.is-primary a.navbar-item:hover,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink a.navbar-item:hover,html.theme--documenter-dark .hero.is-primary a.navbar-item.is-active,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink a.navbar-item.is-active,html.theme--documenter-dark .hero.is-primary .navbar-link:hover,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .navbar-link:hover,html.theme--documenter-dark .hero.is-primary .navbar-link.is-active,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .navbar-link.is-active{background-color:#2f4d6d;color:#fff}html.theme--documenter-dark .hero.is-primary .tabs a,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .tabs a{color:#fff;opacity:0.9}html.theme--documenter-dark .hero.is-primary .tabs a:hover,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .tabs a:hover{opacity:1}html.theme--documenter-dark .hero.is-primary .tabs li.is-active a,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .tabs li.is-active a{color:#375a7f !important;opacity:1}html.theme--documenter-dark .hero.is-primary .tabs.is-boxed a,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .tabs.is-boxed a,html.theme--documenter-dark .hero.is-primary .tabs.is-toggle a,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .tabs.is-toggle a{color:#fff}html.theme--documenter-dark .hero.is-primary .tabs.is-boxed a:hover,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .tabs.is-boxed a:hover,html.theme--documenter-dark .hero.is-primary .tabs.is-toggle a:hover,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}html.theme--documenter-dark .hero.is-primary .tabs.is-boxed li.is-active a,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .tabs.is-boxed li.is-active a,html.theme--documenter-dark .hero.is-primary .tabs.is-boxed li.is-active a:hover,html.theme--documenter-dark .hero.is-primary .tabs.is-toggle li.is-active a,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .tabs.is-toggle li.is-active a,html.theme--documenter-dark .hero.is-primary .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#375a7f}html.theme--documenter-dark .hero.is-primary.is-bold,html.theme--documenter-dark .docstring>section>a.hero.is-bold.docs-sourcelink{background-image:linear-gradient(141deg, #214b62 0%, #375a7f 71%, #3a5796 100%)}@media screen and (max-width: 768px){html.theme--documenter-dark .hero.is-primary.is-bold .navbar-menu,html.theme--documenter-dark .docstring>section>a.hero.is-bold.docs-sourcelink .navbar-menu{background-image:linear-gradient(141deg, #214b62 0%, #375a7f 71%, #3a5796 100%)}}html.theme--documenter-dark .hero.is-link{background-color:#1abc9c;color:#fff}html.theme--documenter-dark .hero.is-link a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),html.theme--documenter-dark .hero.is-link strong{color:inherit}html.theme--documenter-dark .hero.is-link .title{color:#fff}html.theme--documenter-dark .hero.is-link .subtitle{color:rgba(255,255,255,0.9)}html.theme--documenter-dark .hero.is-link .subtitle a:not(.button),html.theme--documenter-dark .hero.is-link .subtitle strong{color:#fff}@media screen and (max-width: 1055px){html.theme--documenter-dark .hero.is-link .navbar-menu{background-color:#1abc9c}}html.theme--documenter-dark .hero.is-link .navbar-item,html.theme--documenter-dark .hero.is-link .navbar-link{color:rgba(255,255,255,0.7)}html.theme--documenter-dark .hero.is-link a.navbar-item:hover,html.theme--documenter-dark .hero.is-link a.navbar-item.is-active,html.theme--documenter-dark .hero.is-link .navbar-link:hover,html.theme--documenter-dark .hero.is-link .navbar-link.is-active{background-color:#17a689;color:#fff}html.theme--documenter-dark .hero.is-link .tabs a{color:#fff;opacity:0.9}html.theme--documenter-dark .hero.is-link .tabs a:hover{opacity:1}html.theme--documenter-dark .hero.is-link .tabs li.is-active a{color:#1abc9c !important;opacity:1}html.theme--documenter-dark .hero.is-link .tabs.is-boxed a,html.theme--documenter-dark .hero.is-link .tabs.is-toggle a{color:#fff}html.theme--documenter-dark .hero.is-link .tabs.is-boxed a:hover,html.theme--documenter-dark .hero.is-link .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}html.theme--documenter-dark .hero.is-link .tabs.is-boxed li.is-active a,html.theme--documenter-dark .hero.is-link .tabs.is-boxed li.is-active a:hover,html.theme--documenter-dark .hero.is-link .tabs.is-toggle li.is-active a,html.theme--documenter-dark .hero.is-link .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#1abc9c}html.theme--documenter-dark .hero.is-link.is-bold{background-image:linear-gradient(141deg, #0c9764 0%, #1abc9c 71%, #17d8d2 100%)}@media screen and (max-width: 768px){html.theme--documenter-dark .hero.is-link.is-bold .navbar-menu{background-image:linear-gradient(141deg, #0c9764 0%, #1abc9c 71%, #17d8d2 100%)}}html.theme--documenter-dark .hero.is-info{background-color:#024c7d;color:#fff}html.theme--documenter-dark .hero.is-info a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),html.theme--documenter-dark .hero.is-info strong{color:inherit}html.theme--documenter-dark .hero.is-info .title{color:#fff}html.theme--documenter-dark .hero.is-info .subtitle{color:rgba(255,255,255,0.9)}html.theme--documenter-dark .hero.is-info .subtitle a:not(.button),html.theme--documenter-dark .hero.is-info .subtitle strong{color:#fff}@media screen and (max-width: 1055px){html.theme--documenter-dark .hero.is-info .navbar-menu{background-color:#024c7d}}html.theme--documenter-dark .hero.is-info .navbar-item,html.theme--documenter-dark .hero.is-info .navbar-link{color:rgba(255,255,255,0.7)}html.theme--documenter-dark .hero.is-info a.navbar-item:hover,html.theme--documenter-dark .hero.is-info a.navbar-item.is-active,html.theme--documenter-dark .hero.is-info .navbar-link:hover,html.theme--documenter-dark .hero.is-info .navbar-link.is-active{background-color:#023d64;color:#fff}html.theme--documenter-dark .hero.is-info .tabs a{color:#fff;opacity:0.9}html.theme--documenter-dark .hero.is-info .tabs a:hover{opacity:1}html.theme--documenter-dark .hero.is-info .tabs li.is-active a{color:#024c7d !important;opacity:1}html.theme--documenter-dark .hero.is-info .tabs.is-boxed a,html.theme--documenter-dark .hero.is-info .tabs.is-toggle a{color:#fff}html.theme--documenter-dark .hero.is-info .tabs.is-boxed a:hover,html.theme--documenter-dark .hero.is-info .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}html.theme--documenter-dark .hero.is-info .tabs.is-boxed li.is-active a,html.theme--documenter-dark .hero.is-info .tabs.is-boxed li.is-active a:hover,html.theme--documenter-dark .hero.is-info .tabs.is-toggle li.is-active a,html.theme--documenter-dark .hero.is-info .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#024c7d}html.theme--documenter-dark .hero.is-info.is-bold{background-image:linear-gradient(141deg, #003a4c 0%, #024c7d 71%, #004299 100%)}@media screen and (max-width: 768px){html.theme--documenter-dark .hero.is-info.is-bold .navbar-menu{background-image:linear-gradient(141deg, #003a4c 0%, #024c7d 71%, #004299 100%)}}html.theme--documenter-dark .hero.is-success{background-color:#008438;color:#fff}html.theme--documenter-dark .hero.is-success a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),html.theme--documenter-dark .hero.is-success strong{color:inherit}html.theme--documenter-dark .hero.is-success .title{color:#fff}html.theme--documenter-dark .hero.is-success .subtitle{color:rgba(255,255,255,0.9)}html.theme--documenter-dark .hero.is-success .subtitle a:not(.button),html.theme--documenter-dark .hero.is-success .subtitle strong{color:#fff}@media screen and (max-width: 1055px){html.theme--documenter-dark .hero.is-success .navbar-menu{background-color:#008438}}html.theme--documenter-dark .hero.is-success .navbar-item,html.theme--documenter-dark .hero.is-success .navbar-link{color:rgba(255,255,255,0.7)}html.theme--documenter-dark .hero.is-success a.navbar-item:hover,html.theme--documenter-dark .hero.is-success a.navbar-item.is-active,html.theme--documenter-dark .hero.is-success .navbar-link:hover,html.theme--documenter-dark .hero.is-success .navbar-link.is-active{background-color:#006b2d;color:#fff}html.theme--documenter-dark .hero.is-success .tabs a{color:#fff;opacity:0.9}html.theme--documenter-dark .hero.is-success .tabs a:hover{opacity:1}html.theme--documenter-dark .hero.is-success .tabs li.is-active a{color:#008438 !important;opacity:1}html.theme--documenter-dark .hero.is-success .tabs.is-boxed a,html.theme--documenter-dark .hero.is-success .tabs.is-toggle a{color:#fff}html.theme--documenter-dark .hero.is-success .tabs.is-boxed a:hover,html.theme--documenter-dark .hero.is-success .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}html.theme--documenter-dark .hero.is-success .tabs.is-boxed li.is-active a,html.theme--documenter-dark .hero.is-success .tabs.is-boxed li.is-active a:hover,html.theme--documenter-dark .hero.is-success .tabs.is-toggle li.is-active a,html.theme--documenter-dark .hero.is-success .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#008438}html.theme--documenter-dark .hero.is-success.is-bold{background-image:linear-gradient(141deg, #005115 0%, #008438 71%, #009e5d 100%)}@media screen and (max-width: 768px){html.theme--documenter-dark .hero.is-success.is-bold .navbar-menu{background-image:linear-gradient(141deg, #005115 0%, #008438 71%, #009e5d 100%)}}html.theme--documenter-dark .hero.is-warning{background-color:#ad8100;color:#fff}html.theme--documenter-dark .hero.is-warning a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),html.theme--documenter-dark .hero.is-warning strong{color:inherit}html.theme--documenter-dark .hero.is-warning .title{color:#fff}html.theme--documenter-dark .hero.is-warning .subtitle{color:rgba(255,255,255,0.9)}html.theme--documenter-dark .hero.is-warning .subtitle a:not(.button),html.theme--documenter-dark .hero.is-warning .subtitle strong{color:#fff}@media screen and (max-width: 1055px){html.theme--documenter-dark .hero.is-warning .navbar-menu{background-color:#ad8100}}html.theme--documenter-dark .hero.is-warning .navbar-item,html.theme--documenter-dark .hero.is-warning .navbar-link{color:rgba(255,255,255,0.7)}html.theme--documenter-dark .hero.is-warning a.navbar-item:hover,html.theme--documenter-dark .hero.is-warning a.navbar-item.is-active,html.theme--documenter-dark .hero.is-warning .navbar-link:hover,html.theme--documenter-dark .hero.is-warning .navbar-link.is-active{background-color:#946e00;color:#fff}html.theme--documenter-dark .hero.is-warning .tabs a{color:#fff;opacity:0.9}html.theme--documenter-dark .hero.is-warning .tabs a:hover{opacity:1}html.theme--documenter-dark .hero.is-warning .tabs li.is-active a{color:#ad8100 !important;opacity:1}html.theme--documenter-dark .hero.is-warning .tabs.is-boxed a,html.theme--documenter-dark .hero.is-warning .tabs.is-toggle a{color:#fff}html.theme--documenter-dark .hero.is-warning .tabs.is-boxed a:hover,html.theme--documenter-dark .hero.is-warning .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}html.theme--documenter-dark .hero.is-warning .tabs.is-boxed li.is-active a,html.theme--documenter-dark .hero.is-warning .tabs.is-boxed li.is-active a:hover,html.theme--documenter-dark .hero.is-warning .tabs.is-toggle li.is-active a,html.theme--documenter-dark .hero.is-warning .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#ad8100}html.theme--documenter-dark .hero.is-warning.is-bold{background-image:linear-gradient(141deg, #7a4700 0%, #ad8100 71%, #c7b500 100%)}@media screen and (max-width: 768px){html.theme--documenter-dark .hero.is-warning.is-bold .navbar-menu{background-image:linear-gradient(141deg, #7a4700 0%, #ad8100 71%, #c7b500 100%)}}html.theme--documenter-dark .hero.is-danger{background-color:#9e1b0d;color:#fff}html.theme--documenter-dark .hero.is-danger a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),html.theme--documenter-dark .hero.is-danger strong{color:inherit}html.theme--documenter-dark .hero.is-danger .title{color:#fff}html.theme--documenter-dark .hero.is-danger .subtitle{color:rgba(255,255,255,0.9)}html.theme--documenter-dark .hero.is-danger .subtitle a:not(.button),html.theme--documenter-dark .hero.is-danger .subtitle strong{color:#fff}@media screen and (max-width: 1055px){html.theme--documenter-dark .hero.is-danger .navbar-menu{background-color:#9e1b0d}}html.theme--documenter-dark .hero.is-danger .navbar-item,html.theme--documenter-dark .hero.is-danger .navbar-link{color:rgba(255,255,255,0.7)}html.theme--documenter-dark .hero.is-danger a.navbar-item:hover,html.theme--documenter-dark .hero.is-danger a.navbar-item.is-active,html.theme--documenter-dark .hero.is-danger .navbar-link:hover,html.theme--documenter-dark .hero.is-danger .navbar-link.is-active{background-color:#86170b;color:#fff}html.theme--documenter-dark .hero.is-danger .tabs a{color:#fff;opacity:0.9}html.theme--documenter-dark .hero.is-danger .tabs a:hover{opacity:1}html.theme--documenter-dark .hero.is-danger .tabs li.is-active a{color:#9e1b0d !important;opacity:1}html.theme--documenter-dark .hero.is-danger .tabs.is-boxed a,html.theme--documenter-dark .hero.is-danger .tabs.is-toggle a{color:#fff}html.theme--documenter-dark .hero.is-danger .tabs.is-boxed a:hover,html.theme--documenter-dark .hero.is-danger .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}html.theme--documenter-dark .hero.is-danger .tabs.is-boxed li.is-active a,html.theme--documenter-dark .hero.is-danger .tabs.is-boxed li.is-active a:hover,html.theme--documenter-dark .hero.is-danger .tabs.is-toggle li.is-active a,html.theme--documenter-dark .hero.is-danger .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#9e1b0d}html.theme--documenter-dark .hero.is-danger.is-bold{background-image:linear-gradient(141deg, #75030b 0%, #9e1b0d 71%, #ba380a 100%)}@media screen and (max-width: 768px){html.theme--documenter-dark .hero.is-danger.is-bold .navbar-menu{background-image:linear-gradient(141deg, #75030b 0%, #9e1b0d 71%, #ba380a 100%)}}html.theme--documenter-dark .hero.is-small .hero-body,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.hero .hero-body{padding:1.5rem}@media screen and (min-width: 769px),print{html.theme--documenter-dark .hero.is-medium .hero-body{padding:9rem 4.5rem}}@media screen and (min-width: 769px),print{html.theme--documenter-dark .hero.is-large .hero-body{padding:18rem 6rem}}html.theme--documenter-dark .hero.is-halfheight .hero-body,html.theme--documenter-dark .hero.is-fullheight .hero-body,html.theme--documenter-dark .hero.is-fullheight-with-navbar .hero-body{align-items:center;display:flex}html.theme--documenter-dark .hero.is-halfheight .hero-body>.container,html.theme--documenter-dark .hero.is-fullheight .hero-body>.container,html.theme--documenter-dark .hero.is-fullheight-with-navbar .hero-body>.container{flex-grow:1;flex-shrink:1}html.theme--documenter-dark .hero.is-halfheight{min-height:50vh}html.theme--documenter-dark .hero.is-fullheight{min-height:100vh}html.theme--documenter-dark .hero-video{overflow:hidden}html.theme--documenter-dark .hero-video video{left:50%;min-height:100%;min-width:100%;position:absolute;top:50%;transform:translate3d(-50%, -50%, 0)}html.theme--documenter-dark .hero-video.is-transparent{opacity:0.3}@media screen and (max-width: 768px){html.theme--documenter-dark .hero-video{display:none}}html.theme--documenter-dark .hero-buttons{margin-top:1.5rem}@media screen and (max-width: 768px){html.theme--documenter-dark .hero-buttons .button{display:flex}html.theme--documenter-dark .hero-buttons .button:not(:last-child){margin-bottom:0.75rem}}@media screen and (min-width: 769px),print{html.theme--documenter-dark .hero-buttons{display:flex;justify-content:center}html.theme--documenter-dark .hero-buttons .button:not(:last-child){margin-right:1.5rem}}html.theme--documenter-dark .hero-head,html.theme--documenter-dark .hero-foot{flex-grow:0;flex-shrink:0}html.theme--documenter-dark .hero-body{flex-grow:1;flex-shrink:0;padding:3rem 1.5rem}@media screen and (min-width: 769px),print{html.theme--documenter-dark .hero-body{padding:3rem 3rem}}html.theme--documenter-dark .section{padding:3rem 1.5rem}@media screen and (min-width: 1056px){html.theme--documenter-dark .section{padding:3rem 3rem}html.theme--documenter-dark .section.is-medium{padding:9rem 4.5rem}html.theme--documenter-dark .section.is-large{padding:18rem 6rem}}html.theme--documenter-dark .footer{background-color:#282f2f;padding:3rem 1.5rem 6rem}html.theme--documenter-dark hr{height:1px}html.theme--documenter-dark h6{text-transform:uppercase;letter-spacing:0.5px}html.theme--documenter-dark .hero{background-color:#343c3d}html.theme--documenter-dark a{transition:all 200ms ease}html.theme--documenter-dark .button{transition:all 200ms ease;border-width:1px;color:#fff}html.theme--documenter-dark .button.is-active,html.theme--documenter-dark .button.is-focused,html.theme--documenter-dark .button:active,html.theme--documenter-dark .button:focus{box-shadow:0 0 0 2px rgba(140,155,157,0.5)}html.theme--documenter-dark .button.is-white.is-hovered,html.theme--documenter-dark .button.is-white:hover{background-color:#fff}html.theme--documenter-dark .button.is-white.is-active,html.theme--documenter-dark .button.is-white.is-focused,html.theme--documenter-dark .button.is-white:active,html.theme--documenter-dark .button.is-white:focus{border-color:#fff;box-shadow:0 0 0 2px rgba(255,255,255,0.5)}html.theme--documenter-dark .button.is-black.is-hovered,html.theme--documenter-dark .button.is-black:hover{background-color:#1d1d1d}html.theme--documenter-dark .button.is-black.is-active,html.theme--documenter-dark .button.is-black.is-focused,html.theme--documenter-dark .button.is-black:active,html.theme--documenter-dark .button.is-black:focus{border-color:#0a0a0a;box-shadow:0 0 0 2px rgba(10,10,10,0.5)}html.theme--documenter-dark .button.is-light.is-hovered,html.theme--documenter-dark .button.is-light:hover{background-color:#fff}html.theme--documenter-dark .button.is-light.is-active,html.theme--documenter-dark .button.is-light.is-focused,html.theme--documenter-dark .button.is-light:active,html.theme--documenter-dark .button.is-light:focus{border-color:#ecf0f1;box-shadow:0 0 0 2px rgba(236,240,241,0.5)}html.theme--documenter-dark .button.is-dark.is-hovered,html.theme--documenter-dark .content kbd.button.is-hovered,html.theme--documenter-dark .button.is-dark:hover,html.theme--documenter-dark .content kbd.button:hover{background-color:#3a4344}html.theme--documenter-dark .button.is-dark.is-active,html.theme--documenter-dark .content kbd.button.is-active,html.theme--documenter-dark .button.is-dark.is-focused,html.theme--documenter-dark .content kbd.button.is-focused,html.theme--documenter-dark .button.is-dark:active,html.theme--documenter-dark .content kbd.button:active,html.theme--documenter-dark .button.is-dark:focus,html.theme--documenter-dark .content kbd.button:focus{border-color:#282f2f;box-shadow:0 0 0 2px rgba(40,47,47,0.5)}html.theme--documenter-dark .button.is-primary.is-hovered,html.theme--documenter-dark .docstring>section>a.button.is-hovered.docs-sourcelink,html.theme--documenter-dark .button.is-primary:hover,html.theme--documenter-dark .docstring>section>a.button.docs-sourcelink:hover{background-color:#436d9a}html.theme--documenter-dark .button.is-primary.is-active,html.theme--documenter-dark .docstring>section>a.button.is-active.docs-sourcelink,html.theme--documenter-dark .button.is-primary.is-focused,html.theme--documenter-dark .docstring>section>a.button.is-focused.docs-sourcelink,html.theme--documenter-dark .button.is-primary:active,html.theme--documenter-dark .docstring>section>a.button.docs-sourcelink:active,html.theme--documenter-dark .button.is-primary:focus,html.theme--documenter-dark .docstring>section>a.button.docs-sourcelink:focus{border-color:#375a7f;box-shadow:0 0 0 2px rgba(55,90,127,0.5)}html.theme--documenter-dark .button.is-link.is-hovered,html.theme--documenter-dark .button.is-link:hover{background-color:#1fdeb8}html.theme--documenter-dark .button.is-link.is-active,html.theme--documenter-dark .button.is-link.is-focused,html.theme--documenter-dark .button.is-link:active,html.theme--documenter-dark .button.is-link:focus{border-color:#1abc9c;box-shadow:0 0 0 2px rgba(26,188,156,0.5)}html.theme--documenter-dark .button.is-info.is-hovered,html.theme--documenter-dark .button.is-info:hover{background-color:#0363a3}html.theme--documenter-dark .button.is-info.is-active,html.theme--documenter-dark .button.is-info.is-focused,html.theme--documenter-dark .button.is-info:active,html.theme--documenter-dark .button.is-info:focus{border-color:#024c7d;box-shadow:0 0 0 2px rgba(2,76,125,0.5)}html.theme--documenter-dark .button.is-success.is-hovered,html.theme--documenter-dark .button.is-success:hover{background-color:#00aa48}html.theme--documenter-dark .button.is-success.is-active,html.theme--documenter-dark .button.is-success.is-focused,html.theme--documenter-dark .button.is-success:active,html.theme--documenter-dark .button.is-success:focus{border-color:#008438;box-shadow:0 0 0 2px rgba(0,132,56,0.5)}html.theme--documenter-dark .button.is-warning.is-hovered,html.theme--documenter-dark .button.is-warning:hover{background-color:#d39e00}html.theme--documenter-dark .button.is-warning.is-active,html.theme--documenter-dark .button.is-warning.is-focused,html.theme--documenter-dark .button.is-warning:active,html.theme--documenter-dark .button.is-warning:focus{border-color:#ad8100;box-shadow:0 0 0 2px rgba(173,129,0,0.5)}html.theme--documenter-dark .button.is-danger.is-hovered,html.theme--documenter-dark .button.is-danger:hover{background-color:#c12110}html.theme--documenter-dark .button.is-danger.is-active,html.theme--documenter-dark .button.is-danger.is-focused,html.theme--documenter-dark .button.is-danger:active,html.theme--documenter-dark .button.is-danger:focus{border-color:#9e1b0d;box-shadow:0 0 0 2px rgba(158,27,13,0.5)}html.theme--documenter-dark .label{color:#dbdee0}html.theme--documenter-dark .button,html.theme--documenter-dark .control.has-icons-left .icon,html.theme--documenter-dark .control.has-icons-right .icon,html.theme--documenter-dark .input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input,html.theme--documenter-dark .pagination-ellipsis,html.theme--documenter-dark .pagination-link,html.theme--documenter-dark .pagination-next,html.theme--documenter-dark .pagination-previous,html.theme--documenter-dark .select,html.theme--documenter-dark .select select,html.theme--documenter-dark .textarea{height:2.5em}html.theme--documenter-dark .input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input,html.theme--documenter-dark .textarea{transition:all 200ms ease;box-shadow:none;border-width:1px;padding-left:1em;padding-right:1em}html.theme--documenter-dark .select:after,html.theme--documenter-dark .select select{border-width:1px}html.theme--documenter-dark .control.has-addons .button,html.theme--documenter-dark .control.has-addons .input,html.theme--documenter-dark .control.has-addons #documenter .docs-sidebar form.docs-search>input,html.theme--documenter-dark #documenter .docs-sidebar .control.has-addons form.docs-search>input,html.theme--documenter-dark .control.has-addons .select{margin-right:-1px}html.theme--documenter-dark .notification{background-color:#343c3d}html.theme--documenter-dark .card{box-shadow:none;border:1px solid #343c3d;background-color:#282f2f;border-radius:.4em}html.theme--documenter-dark .card .card-image img{border-radius:.4em .4em 0 0}html.theme--documenter-dark .card .card-header{box-shadow:none;background-color:rgba(18,18,18,0.2);border-radius:.4em .4em 0 0}html.theme--documenter-dark .card .card-footer{background-color:rgba(18,18,18,0.2)}html.theme--documenter-dark .card .card-footer,html.theme--documenter-dark .card .card-footer-item{border-width:1px;border-color:#343c3d}html.theme--documenter-dark .notification.is-white a:not(.button){color:#0a0a0a;text-decoration:underline}html.theme--documenter-dark .notification.is-black a:not(.button){color:#fff;text-decoration:underline}html.theme--documenter-dark .notification.is-light a:not(.button){color:rgba(0,0,0,0.7);text-decoration:underline}html.theme--documenter-dark .notification.is-dark a:not(.button),html.theme--documenter-dark .content kbd.notification a:not(.button){color:#fff;text-decoration:underline}html.theme--documenter-dark .notification.is-primary a:not(.button),html.theme--documenter-dark .docstring>section>a.notification.docs-sourcelink a:not(.button){color:#fff;text-decoration:underline}html.theme--documenter-dark .notification.is-link a:not(.button){color:#fff;text-decoration:underline}html.theme--documenter-dark .notification.is-info a:not(.button){color:#fff;text-decoration:underline}html.theme--documenter-dark .notification.is-success a:not(.button){color:#fff;text-decoration:underline}html.theme--documenter-dark .notification.is-warning a:not(.button){color:#fff;text-decoration:underline}html.theme--documenter-dark .notification.is-danger a:not(.button){color:#fff;text-decoration:underline}html.theme--documenter-dark .tag,html.theme--documenter-dark .content kbd,html.theme--documenter-dark .docstring>section>a.docs-sourcelink{border-radius:.4em}html.theme--documenter-dark .menu-list a{transition:all 300ms ease}html.theme--documenter-dark .modal-card-body{background-color:#282f2f}html.theme--documenter-dark .modal-card-foot,html.theme--documenter-dark .modal-card-head{border-color:#343c3d}html.theme--documenter-dark .message-header{font-weight:700;background-color:#343c3d;color:#fff}html.theme--documenter-dark .message-body{border-width:1px;border-color:#343c3d}html.theme--documenter-dark .navbar{border-radius:.4em}html.theme--documenter-dark .navbar.is-transparent{background:none}html.theme--documenter-dark .navbar.is-primary .navbar-dropdown a.navbar-item.is-active,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-dropdown a.navbar-item.is-active{background-color:#1abc9c}@media screen and (max-width: 1055px){html.theme--documenter-dark .navbar .navbar-menu{background-color:#375a7f;border-radius:0 0 .4em .4em}}html.theme--documenter-dark .hero .navbar,html.theme--documenter-dark body>.navbar{border-radius:0}html.theme--documenter-dark .pagination-link,html.theme--documenter-dark .pagination-next,html.theme--documenter-dark .pagination-previous{border-width:1px}html.theme--documenter-dark .panel-block,html.theme--documenter-dark .panel-heading,html.theme--documenter-dark .panel-tabs{border-width:1px}html.theme--documenter-dark .panel-block:first-child,html.theme--documenter-dark .panel-heading:first-child,html.theme--documenter-dark .panel-tabs:first-child{border-top-width:1px}html.theme--documenter-dark .panel-heading{font-weight:700}html.theme--documenter-dark .panel-tabs a{border-width:1px;margin-bottom:-1px}html.theme--documenter-dark .panel-tabs a.is-active{border-bottom-color:#17a689}html.theme--documenter-dark .panel-block:hover{color:#1dd2af}html.theme--documenter-dark .panel-block:hover .panel-icon{color:#1dd2af}html.theme--documenter-dark .panel-block.is-active .panel-icon{color:#17a689}html.theme--documenter-dark .tabs a{border-bottom-width:1px;margin-bottom:-1px}html.theme--documenter-dark .tabs ul{border-bottom-width:1px}html.theme--documenter-dark .tabs.is-boxed a{border-width:1px}html.theme--documenter-dark .tabs.is-boxed li.is-active a{background-color:#1f2424}html.theme--documenter-dark .tabs.is-toggle li a{border-width:1px;margin-bottom:0}html.theme--documenter-dark .tabs.is-toggle li+li{margin-left:-1px}html.theme--documenter-dark .hero.is-white .navbar .navbar-dropdown .navbar-item:hover{background-color:rgba(0,0,0,0)}html.theme--documenter-dark .hero.is-black .navbar .navbar-dropdown .navbar-item:hover{background-color:rgba(0,0,0,0)}html.theme--documenter-dark .hero.is-light .navbar .navbar-dropdown .navbar-item:hover{background-color:rgba(0,0,0,0)}html.theme--documenter-dark .hero.is-dark .navbar .navbar-dropdown .navbar-item:hover,html.theme--documenter-dark .content kbd.hero .navbar .navbar-dropdown .navbar-item:hover{background-color:rgba(0,0,0,0)}html.theme--documenter-dark .hero.is-primary .navbar .navbar-dropdown .navbar-item:hover,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .navbar .navbar-dropdown .navbar-item:hover{background-color:rgba(0,0,0,0)}html.theme--documenter-dark .hero.is-link .navbar .navbar-dropdown .navbar-item:hover{background-color:rgba(0,0,0,0)}html.theme--documenter-dark .hero.is-info .navbar .navbar-dropdown .navbar-item:hover{background-color:rgba(0,0,0,0)}html.theme--documenter-dark .hero.is-success .navbar .navbar-dropdown .navbar-item:hover{background-color:rgba(0,0,0,0)}html.theme--documenter-dark .hero.is-warning .navbar .navbar-dropdown .navbar-item:hover{background-color:rgba(0,0,0,0)}html.theme--documenter-dark .hero.is-danger .navbar .navbar-dropdown .navbar-item:hover{background-color:rgba(0,0,0,0)}html.theme--documenter-dark h1 .docs-heading-anchor,html.theme--documenter-dark h1 .docs-heading-anchor:hover,html.theme--documenter-dark h1 .docs-heading-anchor:visited,html.theme--documenter-dark h2 .docs-heading-anchor,html.theme--documenter-dark h2 .docs-heading-anchor:hover,html.theme--documenter-dark h2 .docs-heading-anchor:visited,html.theme--documenter-dark h3 .docs-heading-anchor,html.theme--documenter-dark h3 .docs-heading-anchor:hover,html.theme--documenter-dark h3 .docs-heading-anchor:visited,html.theme--documenter-dark h4 .docs-heading-anchor,html.theme--documenter-dark h4 .docs-heading-anchor:hover,html.theme--documenter-dark h4 .docs-heading-anchor:visited,html.theme--documenter-dark h5 .docs-heading-anchor,html.theme--documenter-dark h5 .docs-heading-anchor:hover,html.theme--documenter-dark h5 .docs-heading-anchor:visited,html.theme--documenter-dark h6 .docs-heading-anchor,html.theme--documenter-dark h6 .docs-heading-anchor:hover,html.theme--documenter-dark h6 .docs-heading-anchor:visited{color:#f2f2f2}html.theme--documenter-dark h1 .docs-heading-anchor-permalink,html.theme--documenter-dark h2 .docs-heading-anchor-permalink,html.theme--documenter-dark h3 .docs-heading-anchor-permalink,html.theme--documenter-dark h4 .docs-heading-anchor-permalink,html.theme--documenter-dark h5 .docs-heading-anchor-permalink,html.theme--documenter-dark h6 .docs-heading-anchor-permalink{visibility:hidden;vertical-align:middle;margin-left:0.5em;font-size:0.7rem}html.theme--documenter-dark h1 .docs-heading-anchor-permalink::before,html.theme--documenter-dark h2 .docs-heading-anchor-permalink::before,html.theme--documenter-dark h3 .docs-heading-anchor-permalink::before,html.theme--documenter-dark h4 .docs-heading-anchor-permalink::before,html.theme--documenter-dark h5 .docs-heading-anchor-permalink::before,html.theme--documenter-dark h6 .docs-heading-anchor-permalink::before{font-family:"Font Awesome 6 Free";font-weight:900;content:"\f0c1"}html.theme--documenter-dark h1:hover .docs-heading-anchor-permalink,html.theme--documenter-dark h2:hover .docs-heading-anchor-permalink,html.theme--documenter-dark h3:hover .docs-heading-anchor-permalink,html.theme--documenter-dark h4:hover .docs-heading-anchor-permalink,html.theme--documenter-dark h5:hover .docs-heading-anchor-permalink,html.theme--documenter-dark h6:hover .docs-heading-anchor-permalink{visibility:visible}html.theme--documenter-dark .docs-light-only{display:none !important}html.theme--documenter-dark pre{position:relative;overflow:hidden}html.theme--documenter-dark pre code,html.theme--documenter-dark pre code.hljs{padding:0 .75rem !important;overflow:auto;display:block}html.theme--documenter-dark pre code:first-of-type,html.theme--documenter-dark pre code.hljs:first-of-type{padding-top:0.5rem !important}html.theme--documenter-dark pre code:last-of-type,html.theme--documenter-dark pre code.hljs:last-of-type{padding-bottom:0.5rem !important}html.theme--documenter-dark pre .copy-button{opacity:0.2;transition:opacity 0.2s;position:absolute;right:0em;top:0em;padding:0.5em;width:2.5em;height:2.5em;background:transparent;border:none;font-family:"Font Awesome 6 Free";color:#fff;cursor:pointer;text-align:center}html.theme--documenter-dark pre .copy-button:focus,html.theme--documenter-dark pre .copy-button:hover{opacity:1;background:rgba(255,255,255,0.1);color:#1abc9c}html.theme--documenter-dark pre .copy-button.success{color:#259a12;opacity:1}html.theme--documenter-dark pre .copy-button.error{color:#cb3c33;opacity:1}html.theme--documenter-dark pre:hover .copy-button{opacity:1}html.theme--documenter-dark .admonition{background-color:#282f2f;border-style:solid;border-width:1px;border-color:#5e6d6f;border-radius:.4em;font-size:1rem}html.theme--documenter-dark .admonition strong{color:currentColor}html.theme--documenter-dark .admonition.is-small,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.admonition{font-size:.75rem}html.theme--documenter-dark .admonition.is-medium{font-size:1.25rem}html.theme--documenter-dark .admonition.is-large{font-size:1.5rem}html.theme--documenter-dark .admonition.is-default{background-color:#282f2f;border-color:#5e6d6f}html.theme--documenter-dark .admonition.is-default>.admonition-header{background-color:#5e6d6f;color:#fff}html.theme--documenter-dark .admonition.is-default>.admonition-body{color:#fff}html.theme--documenter-dark .admonition.is-info{background-color:#282f2f;border-color:#024c7d}html.theme--documenter-dark .admonition.is-info>.admonition-header{background-color:#024c7d;color:#fff}html.theme--documenter-dark .admonition.is-info>.admonition-body{color:#fff}html.theme--documenter-dark .admonition.is-success{background-color:#282f2f;border-color:#008438}html.theme--documenter-dark .admonition.is-success>.admonition-header{background-color:#008438;color:#fff}html.theme--documenter-dark .admonition.is-success>.admonition-body{color:#fff}html.theme--documenter-dark .admonition.is-warning{background-color:#282f2f;border-color:#ad8100}html.theme--documenter-dark .admonition.is-warning>.admonition-header{background-color:#ad8100;color:#fff}html.theme--documenter-dark .admonition.is-warning>.admonition-body{color:#fff}html.theme--documenter-dark .admonition.is-danger{background-color:#282f2f;border-color:#9e1b0d}html.theme--documenter-dark .admonition.is-danger>.admonition-header{background-color:#9e1b0d;color:#fff}html.theme--documenter-dark .admonition.is-danger>.admonition-body{color:#fff}html.theme--documenter-dark .admonition.is-compat{background-color:#282f2f;border-color:#137886}html.theme--documenter-dark .admonition.is-compat>.admonition-header{background-color:#137886;color:#fff}html.theme--documenter-dark .admonition.is-compat>.admonition-body{color:#fff}html.theme--documenter-dark .admonition-header{color:#fff;background-color:#5e6d6f;align-items:center;font-weight:700;justify-content:space-between;line-height:1.25;padding:0.5rem .75rem;position:relative}html.theme--documenter-dark .admonition-header:before{font-family:"Font Awesome 6 Free";font-weight:900;margin-right:.75rem;content:"\f06a"}html.theme--documenter-dark details.admonition.is-details>.admonition-header{list-style:none}html.theme--documenter-dark details.admonition.is-details>.admonition-header:before{font-family:"Font Awesome 6 Free";font-weight:900;content:"\f055"}html.theme--documenter-dark details.admonition.is-details[open]>.admonition-header:before{font-family:"Font Awesome 6 Free";font-weight:900;content:"\f056"}html.theme--documenter-dark .admonition-body{color:#fff;padding:0.5rem .75rem}html.theme--documenter-dark .admonition-body pre{background-color:#282f2f}html.theme--documenter-dark .admonition-body code{background-color:rgba(255,255,255,0.05)}html.theme--documenter-dark .docstring{margin-bottom:1em;background-color:rgba(0,0,0,0);border:1px solid #5e6d6f;box-shadow:none;max-width:100%}html.theme--documenter-dark .docstring>header{cursor:pointer;display:flex;flex-grow:1;align-items:stretch;padding:0.5rem .75rem;background-color:#282f2f;box-shadow:0 0.125em 0.25em rgba(10,10,10,0.1);box-shadow:none;border-bottom:1px solid #5e6d6f;overflow:auto}html.theme--documenter-dark .docstring>header code{background-color:transparent}html.theme--documenter-dark .docstring>header .docstring-article-toggle-button{min-width:1.1rem;padding:0.2rem 0.2rem 0.2rem 0}html.theme--documenter-dark .docstring>header .docstring-binding{margin-right:0.3em}html.theme--documenter-dark .docstring>header .docstring-category{margin-left:0.3em}html.theme--documenter-dark .docstring>section{position:relative;padding:.75rem .75rem;border-bottom:1px solid #5e6d6f}html.theme--documenter-dark .docstring>section:last-child{border-bottom:none}html.theme--documenter-dark .docstring>section>a.docs-sourcelink{transition:opacity 0.3s;opacity:0;position:absolute;right:.375rem;bottom:.375rem}html.theme--documenter-dark .docstring>section>a.docs-sourcelink:focus{opacity:1 !important}html.theme--documenter-dark .docstring:hover>section>a.docs-sourcelink{opacity:0.2}html.theme--documenter-dark .docstring:focus-within>section>a.docs-sourcelink{opacity:0.2}html.theme--documenter-dark .docstring>section:hover a.docs-sourcelink{opacity:1}html.theme--documenter-dark .documenter-example-output{background-color:#1f2424}html.theme--documenter-dark .outdated-warning-overlay{position:fixed;top:0;left:0;right:0;box-shadow:0 0 10px rgba(0,0,0,0.3);z-index:999;background-color:#282f2f;color:#fff;border-bottom:3px solid #9e1b0d;padding:10px 35px;text-align:center;font-size:15px}html.theme--documenter-dark .outdated-warning-overlay .outdated-warning-closer{position:absolute;top:calc(50% - 10px);right:18px;cursor:pointer;width:12px}html.theme--documenter-dark .outdated-warning-overlay a{color:#1abc9c}html.theme--documenter-dark .outdated-warning-overlay a:hover{color:#1dd2af}html.theme--documenter-dark .content pre{border:1px solid #5e6d6f}html.theme--documenter-dark .content code{font-weight:inherit}html.theme--documenter-dark .content a code{color:#1abc9c}html.theme--documenter-dark .content h1 code,html.theme--documenter-dark .content h2 code,html.theme--documenter-dark .content h3 code,html.theme--documenter-dark .content h4 code,html.theme--documenter-dark .content h5 code,html.theme--documenter-dark .content h6 code{color:#f2f2f2}html.theme--documenter-dark .content table{display:block;width:initial;max-width:100%;overflow-x:auto}html.theme--documenter-dark .content blockquote>ul:first-child,html.theme--documenter-dark .content blockquote>ol:first-child,html.theme--documenter-dark .content .admonition-body>ul:first-child,html.theme--documenter-dark .content .admonition-body>ol:first-child{margin-top:0}html.theme--documenter-dark pre,html.theme--documenter-dark code{font-variant-ligatures:no-contextual}html.theme--documenter-dark .breadcrumb a.is-disabled{cursor:default;pointer-events:none}html.theme--documenter-dark .breadcrumb a.is-disabled,html.theme--documenter-dark .breadcrumb a.is-disabled:hover{color:#f2f2f2}html.theme--documenter-dark .hljs{background:initial !important}html.theme--documenter-dark .katex .katex-mathml{top:0;right:0}html.theme--documenter-dark .katex-display,html.theme--documenter-dark mjx-container,html.theme--documenter-dark .MathJax_Display{margin:0.5em 0 !important}html.theme--documenter-dark html{-moz-osx-font-smoothing:auto;-webkit-font-smoothing:auto}html.theme--documenter-dark li.no-marker{list-style:none}html.theme--documenter-dark #documenter .docs-main>article{overflow-wrap:break-word}html.theme--documenter-dark #documenter .docs-main>article .math-container{overflow-x:auto;overflow-y:hidden}@media screen and (min-width: 1056px){html.theme--documenter-dark #documenter .docs-main{max-width:52rem;margin-left:20rem;padding-right:1rem}}@media screen and (max-width: 1055px){html.theme--documenter-dark #documenter .docs-main{width:100%}html.theme--documenter-dark #documenter .docs-main>article{max-width:52rem;margin-left:auto;margin-right:auto;margin-bottom:1rem;padding:0 1rem}html.theme--documenter-dark #documenter .docs-main>header,html.theme--documenter-dark #documenter .docs-main>nav{max-width:100%;width:100%;margin:0}}html.theme--documenter-dark #documenter .docs-main header.docs-navbar{background-color:#1f2424;border-bottom:1px solid #5e6d6f;z-index:2;min-height:4rem;margin-bottom:1rem;display:flex}html.theme--documenter-dark #documenter .docs-main header.docs-navbar .breadcrumb{flex-grow:1;overflow-x:hidden}html.theme--documenter-dark #documenter .docs-main header.docs-navbar .docs-sidebar-button{display:block;font-size:1.5rem;padding-bottom:0.1rem;margin-right:1rem}html.theme--documenter-dark #documenter .docs-main header.docs-navbar .docs-right{display:flex;white-space:nowrap;gap:1rem;align-items:center}html.theme--documenter-dark #documenter .docs-main header.docs-navbar .docs-right .docs-icon,html.theme--documenter-dark #documenter .docs-main header.docs-navbar .docs-right .docs-label{display:inline-block}html.theme--documenter-dark #documenter .docs-main header.docs-navbar .docs-right .docs-label{padding:0;margin-left:0.3em}@media screen and (max-width: 1055px){html.theme--documenter-dark #documenter .docs-main header.docs-navbar .docs-right .docs-navbar-link{margin-left:0.4rem;margin-right:0.4rem}}html.theme--documenter-dark #documenter .docs-main header.docs-navbar>*{margin:auto 0}@media screen and (max-width: 1055px){html.theme--documenter-dark #documenter .docs-main header.docs-navbar{position:sticky;top:0;padding:0 1rem;transition-property:top, box-shadow;-webkit-transition-property:top, box-shadow;transition-duration:0.3s;-webkit-transition-duration:0.3s}html.theme--documenter-dark #documenter .docs-main header.docs-navbar.headroom--not-top{box-shadow:.2rem 0rem .4rem #171717;transition-duration:0.7s;-webkit-transition-duration:0.7s}html.theme--documenter-dark #documenter .docs-main header.docs-navbar.headroom--unpinned.headroom--not-top.headroom--not-bottom{top:-4.5rem;transition-duration:0.7s;-webkit-transition-duration:0.7s}}html.theme--documenter-dark #documenter .docs-main section.footnotes{border-top:1px solid #5e6d6f}html.theme--documenter-dark #documenter .docs-main section.footnotes li .tag:first-child,html.theme--documenter-dark #documenter .docs-main section.footnotes li .docstring>section>a.docs-sourcelink:first-child,html.theme--documenter-dark #documenter .docs-main section.footnotes li .content kbd:first-child,html.theme--documenter-dark .content #documenter .docs-main section.footnotes li kbd:first-child{margin-right:1em;margin-bottom:0.4em}html.theme--documenter-dark #documenter .docs-main .docs-footer{display:flex;flex-wrap:wrap;margin-left:0;margin-right:0;border-top:1px solid #5e6d6f;padding-top:1rem;padding-bottom:1rem}@media screen and (max-width: 1055px){html.theme--documenter-dark #documenter .docs-main .docs-footer{padding-left:1rem;padding-right:1rem}}html.theme--documenter-dark #documenter .docs-main .docs-footer .docs-footer-nextpage,html.theme--documenter-dark #documenter .docs-main .docs-footer .docs-footer-prevpage{flex-grow:1}html.theme--documenter-dark #documenter .docs-main .docs-footer .docs-footer-nextpage{text-align:right}html.theme--documenter-dark #documenter .docs-main .docs-footer .flexbox-break{flex-basis:100%;height:0}html.theme--documenter-dark #documenter .docs-main .docs-footer .footer-message{font-size:0.8em;margin:0.5em auto 0 auto;text-align:center}html.theme--documenter-dark #documenter .docs-sidebar{display:flex;flex-direction:column;color:#fff;background-color:#282f2f;border-right:1px solid #5e6d6f;padding:0;flex:0 0 18rem;z-index:5;font-size:1rem;position:fixed;left:-18rem;width:18rem;height:100%;transition:left 0.3s}html.theme--documenter-dark #documenter .docs-sidebar.visible{left:0;box-shadow:.4rem 0rem .8rem #171717}@media screen and (min-width: 1056px){html.theme--documenter-dark #documenter .docs-sidebar.visible{box-shadow:none}}@media screen and (min-width: 1056px){html.theme--documenter-dark #documenter .docs-sidebar{left:0;top:0}}html.theme--documenter-dark #documenter .docs-sidebar .docs-logo{margin-top:1rem;padding:0 1rem}html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img{max-height:6rem;margin:auto}html.theme--documenter-dark #documenter .docs-sidebar .docs-package-name{flex-shrink:0;font-size:1.5rem;font-weight:700;text-align:center;white-space:nowrap;overflow:hidden;padding:0.5rem 0}html.theme--documenter-dark #documenter .docs-sidebar .docs-package-name .docs-autofit{max-width:16.2rem}html.theme--documenter-dark #documenter .docs-sidebar .docs-package-name a,html.theme--documenter-dark #documenter .docs-sidebar .docs-package-name a:hover{color:#fff}html.theme--documenter-dark #documenter .docs-sidebar .docs-version-selector{border-top:1px solid #5e6d6f;display:none;padding:0.5rem}html.theme--documenter-dark #documenter .docs-sidebar .docs-version-selector.visible{display:flex}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu{flex-grow:1;user-select:none;border-top:1px solid #5e6d6f;padding-bottom:1.5rem}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu>li>.tocitem{font-weight:bold}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu>li li{font-size:.95rem;margin-left:1em;border-left:1px solid #5e6d6f}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu input.collapse-toggle{display:none}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu ul.collapsed{display:none}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu input:checked~ul.collapsed{display:block}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu label.tocitem{display:flex}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu label.tocitem .docs-label{flex-grow:2}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu label.tocitem .docs-chevron{display:inline-block;font-style:normal;font-variant:normal;text-rendering:auto;line-height:1;font-size:.75rem;margin-left:1rem;margin-top:auto;margin-bottom:auto}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu label.tocitem .docs-chevron::before{font-family:"Font Awesome 6 Free";font-weight:900;content:"\f054"}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu input:checked~label.tocitem .docs-chevron::before{content:"\f078"}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu .tocitem{display:block;padding:0.5rem 0.5rem}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu .tocitem,html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu .tocitem:hover{color:#fff;background:#282f2f}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu a.tocitem:hover,html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu label.tocitem:hover{color:#fff;background-color:#32393a}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu li.is-active{border-top:1px solid #5e6d6f;border-bottom:1px solid #5e6d6f;background-color:#1f2424}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu li.is-active .tocitem,html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu li.is-active .tocitem:hover{background-color:#1f2424;color:#fff}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu li.is-active ul.internal .tocitem:hover{background-color:#32393a;color:#fff}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu>li.is-active:first-child{border-top:none}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu ul.internal{margin:0 0.5rem 0.5rem;border-top:1px solid #5e6d6f}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu ul.internal li{font-size:.85rem;border-left:none;margin-left:0;margin-top:0.5rem}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu ul.internal .tocitem{width:100%;padding:0}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu ul.internal .tocitem::before{content:"⚬";margin-right:0.4em}html.theme--documenter-dark #documenter .docs-sidebar form.docs-search{margin:auto;margin-top:0.5rem;margin-bottom:0.5rem}html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input{width:14.4rem}html.theme--documenter-dark #documenter .docs-sidebar #documenter-search-query{color:#868c98;width:14.4rem;box-shadow:inset 0 1px 2px rgba(10,10,10,0.1)}@media screen and (min-width: 1056px){html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu{overflow-y:auto;-webkit-overflow-scroll:touch}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu::-webkit-scrollbar{width:.3rem;background:none}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu::-webkit-scrollbar-thumb{border-radius:5px 0px 0px 5px;background:#3b4445}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu::-webkit-scrollbar-thumb:hover{background:#4e5a5c}}@media screen and (max-width: 1055px){html.theme--documenter-dark #documenter .docs-sidebar{overflow-y:auto;-webkit-overflow-scroll:touch}html.theme--documenter-dark #documenter .docs-sidebar::-webkit-scrollbar{width:.3rem;background:none}html.theme--documenter-dark #documenter .docs-sidebar::-webkit-scrollbar-thumb{border-radius:5px 0px 0px 5px;background:#3b4445}html.theme--documenter-dark #documenter .docs-sidebar::-webkit-scrollbar-thumb:hover{background:#4e5a5c}}html.theme--documenter-dark kbd.search-modal-key-hints{border-radius:0.25rem;border:1px solid rgba(245,245,245,0.6);box-shadow:0 2px 0 1px rgba(245,245,245,0.6);cursor:default;font-size:0.9rem;line-height:1.5;min-width:0.75rem;text-align:center;padding:0.1rem 0.3rem;position:relative;top:-1px}html.theme--documenter-dark .search-min-width-50{min-width:50%}html.theme--documenter-dark .search-min-height-100{min-height:100%}html.theme--documenter-dark .search-modal-card-body{max-height:calc(100vh - 15rem)}html.theme--documenter-dark .search-result-link{border-radius:0.7em;transition:all 300ms}html.theme--documenter-dark .search-result-link:hover,html.theme--documenter-dark .search-result-link:focus{background-color:rgba(0,128,128,0.1)}html.theme--documenter-dark .search-result-link .property-search-result-badge,html.theme--documenter-dark .search-result-link .search-filter{transition:all 300ms}html.theme--documenter-dark .property-search-result-badge,html.theme--documenter-dark .search-filter{padding:0.15em 0.5em;font-size:0.8em;font-style:italic;text-transform:none !important;line-height:1.5;color:#f5f5f5;background-color:rgba(51,65,85,0.501961);border-radius:0.6rem}html.theme--documenter-dark .search-result-link:hover .property-search-result-badge,html.theme--documenter-dark .search-result-link:hover .search-filter,html.theme--documenter-dark .search-result-link:focus .property-search-result-badge,html.theme--documenter-dark .search-result-link:focus .search-filter{color:#333;background-color:#f1f5f9}html.theme--documenter-dark .search-filter{color:#333;background-color:#f5f5f5;transition:all 300ms}html.theme--documenter-dark .search-filter:hover,html.theme--documenter-dark .search-filter:focus{color:#333}html.theme--documenter-dark .search-filter-selected{color:#f5f5f5;background-color:rgba(139,0,139,0.5)}html.theme--documenter-dark .search-filter-selected:hover,html.theme--documenter-dark .search-filter-selected:focus{color:#f5f5f5}html.theme--documenter-dark .search-result-highlight{background-color:#ffdd57;color:black}html.theme--documenter-dark .search-divider{border-bottom:1px solid #5e6d6f}html.theme--documenter-dark .search-result-title{width:85%;color:#f5f5f5}html.theme--documenter-dark .search-result-code-title{font-size:0.875rem;font-family:"JuliaMono","SFMono-Regular","Menlo","Consolas","Liberation Mono","DejaVu Sans Mono",monospace}html.theme--documenter-dark #search-modal .modal-card-body::-webkit-scrollbar,html.theme--documenter-dark #search-modal .filter-tabs::-webkit-scrollbar{height:10px;width:10px;background-color:transparent}html.theme--documenter-dark #search-modal .modal-card-body::-webkit-scrollbar-thumb,html.theme--documenter-dark #search-modal .filter-tabs::-webkit-scrollbar-thumb{background-color:gray;border-radius:1rem}html.theme--documenter-dark #search-modal .modal-card-body::-webkit-scrollbar-track,html.theme--documenter-dark #search-modal .filter-tabs::-webkit-scrollbar-track{-webkit-box-shadow:inset 0 0 6px rgba(0,0,0,0.6);background-color:transparent}html.theme--documenter-dark .w-100{width:100%}html.theme--documenter-dark .gap-2{gap:0.5rem}html.theme--documenter-dark .gap-4{gap:1rem}html.theme--documenter-dark .gap-8{gap:2rem}html.theme--documenter-dark{background-color:#1f2424;font-size:16px;min-width:300px;overflow-x:auto;overflow-y:scroll;text-rendering:optimizeLegibility;text-size-adjust:100%}html.theme--documenter-dark .ansi span.sgr1{font-weight:bolder}html.theme--documenter-dark .ansi span.sgr2{font-weight:lighter}html.theme--documenter-dark .ansi span.sgr3{font-style:italic}html.theme--documenter-dark .ansi span.sgr4{text-decoration:underline}html.theme--documenter-dark .ansi span.sgr7{color:#1f2424;background-color:#fff}html.theme--documenter-dark .ansi span.sgr8{color:transparent}html.theme--documenter-dark .ansi span.sgr8 span{color:transparent}html.theme--documenter-dark .ansi span.sgr9{text-decoration:line-through}html.theme--documenter-dark .ansi span.sgr30{color:#242424}html.theme--documenter-dark .ansi span.sgr31{color:#f6705f}html.theme--documenter-dark .ansi span.sgr32{color:#4fb43a}html.theme--documenter-dark .ansi span.sgr33{color:#f4c72f}html.theme--documenter-dark .ansi span.sgr34{color:#7587f0}html.theme--documenter-dark .ansi span.sgr35{color:#bc89d3}html.theme--documenter-dark .ansi span.sgr36{color:#49b6ca}html.theme--documenter-dark .ansi span.sgr37{color:#b3bdbe}html.theme--documenter-dark .ansi span.sgr40{background-color:#242424}html.theme--documenter-dark .ansi span.sgr41{background-color:#f6705f}html.theme--documenter-dark .ansi span.sgr42{background-color:#4fb43a}html.theme--documenter-dark .ansi span.sgr43{background-color:#f4c72f}html.theme--documenter-dark .ansi span.sgr44{background-color:#7587f0}html.theme--documenter-dark .ansi span.sgr45{background-color:#bc89d3}html.theme--documenter-dark .ansi span.sgr46{background-color:#49b6ca}html.theme--documenter-dark .ansi span.sgr47{background-color:#b3bdbe}html.theme--documenter-dark .ansi span.sgr90{color:#92a0a2}html.theme--documenter-dark .ansi span.sgr91{color:#ff8674}html.theme--documenter-dark .ansi span.sgr92{color:#79d462}html.theme--documenter-dark .ansi span.sgr93{color:#ffe76b}html.theme--documenter-dark .ansi span.sgr94{color:#8a98ff}html.theme--documenter-dark .ansi span.sgr95{color:#d2a4e6}html.theme--documenter-dark .ansi span.sgr96{color:#6bc8db}html.theme--documenter-dark .ansi span.sgr97{color:#ecf0f1}html.theme--documenter-dark .ansi span.sgr100{background-color:#92a0a2}html.theme--documenter-dark .ansi span.sgr101{background-color:#ff8674}html.theme--documenter-dark .ansi span.sgr102{background-color:#79d462}html.theme--documenter-dark .ansi span.sgr103{background-color:#ffe76b}html.theme--documenter-dark .ansi span.sgr104{background-color:#8a98ff}html.theme--documenter-dark .ansi span.sgr105{background-color:#d2a4e6}html.theme--documenter-dark .ansi span.sgr106{background-color:#6bc8db}html.theme--documenter-dark .ansi span.sgr107{background-color:#ecf0f1}html.theme--documenter-dark code.language-julia-repl>span.hljs-meta{color:#4fb43a;font-weight:bolder}html.theme--documenter-dark .hljs{background:#2b2b2b;color:#f8f8f2}html.theme--documenter-dark .hljs-comment,html.theme--documenter-dark .hljs-quote{color:#d4d0ab}html.theme--documenter-dark .hljs-variable,html.theme--documenter-dark .hljs-template-variable,html.theme--documenter-dark .hljs-tag,html.theme--documenter-dark .hljs-name,html.theme--documenter-dark .hljs-selector-id,html.theme--documenter-dark .hljs-selector-class,html.theme--documenter-dark .hljs-regexp,html.theme--documenter-dark .hljs-deletion{color:#ffa07a}html.theme--documenter-dark .hljs-number,html.theme--documenter-dark .hljs-built_in,html.theme--documenter-dark .hljs-literal,html.theme--documenter-dark .hljs-type,html.theme--documenter-dark .hljs-params,html.theme--documenter-dark .hljs-meta,html.theme--documenter-dark .hljs-link{color:#f5ab35}html.theme--documenter-dark .hljs-attribute{color:#ffd700}html.theme--documenter-dark .hljs-string,html.theme--documenter-dark .hljs-symbol,html.theme--documenter-dark .hljs-bullet,html.theme--documenter-dark .hljs-addition{color:#abe338}html.theme--documenter-dark .hljs-title,html.theme--documenter-dark .hljs-section{color:#00e0e0}html.theme--documenter-dark .hljs-keyword,html.theme--documenter-dark .hljs-selector-tag{color:#dcc6e0}html.theme--documenter-dark .hljs-emphasis{font-style:italic}html.theme--documenter-dark .hljs-strong{font-weight:bold}@media screen and (-ms-high-contrast: active){html.theme--documenter-dark .hljs-addition,html.theme--documenter-dark .hljs-attribute,html.theme--documenter-dark .hljs-built_in,html.theme--documenter-dark .hljs-bullet,html.theme--documenter-dark .hljs-comment,html.theme--documenter-dark .hljs-link,html.theme--documenter-dark .hljs-literal,html.theme--documenter-dark .hljs-meta,html.theme--documenter-dark .hljs-number,html.theme--documenter-dark .hljs-params,html.theme--documenter-dark .hljs-string,html.theme--documenter-dark .hljs-symbol,html.theme--documenter-dark .hljs-type,html.theme--documenter-dark .hljs-quote{color:highlight}html.theme--documenter-dark .hljs-keyword,html.theme--documenter-dark .hljs-selector-tag{font-weight:bold}}html.theme--documenter-dark .hljs-subst{color:#f8f8f2}html.theme--documenter-dark .search-result-link{border-radius:0.7em;transition:all 300ms}html.theme--documenter-dark .search-result-link:hover,html.theme--documenter-dark .search-result-link:focus{background-color:rgba(0,128,128,0.1)}html.theme--documenter-dark .search-result-link .property-search-result-badge,html.theme--documenter-dark .search-result-link .search-filter{transition:all 300ms}html.theme--documenter-dark .search-result-link:hover .property-search-result-badge,html.theme--documenter-dark .search-result-link:hover .search-filter,html.theme--documenter-dark .search-result-link:focus .property-search-result-badge,html.theme--documenter-dark .search-result-link:focus .search-filter{color:#333 !important;background-color:#f1f5f9 !important}html.theme--documenter-dark .property-search-result-badge,html.theme--documenter-dark .search-filter{padding:0.15em 0.5em;font-size:0.8em;font-style:italic;text-transform:none !important;line-height:1.5;color:whitesmoke;background-color:#33415580;border-radius:0.6rem}html.theme--documenter-dark .search-result-title{color:whitesmoke}html.theme--documenter-dark .search-result-highlight{background-color:greenyellow;color:black}html.theme--documenter-dark .search-divider{border-bottom:1px solid #5e6d6f50}html.theme--documenter-dark .w-100{width:100%}html.theme--documenter-dark .gap-2{gap:0.5rem}html.theme--documenter-dark .gap-4{gap:1rem} diff --git a/v1.7.2/assets/themes/documenter-light.css b/v1.7.2/assets/themes/documenter-light.css index 9b9a14b04..2f168c77b 100644 --- a/v1.7.2/assets/themes/documenter-light.css +++ b/v1.7.2/assets/themes/documenter-light.css @@ -1,4 +1,4 @@ -@keyframes spinAround{from{transform:rotate(0deg)}to{transform:rotate(359deg)}}.tabs,.pagination-previous,.pagination-next,.pagination-link,.pagination-ellipsis,.breadcrumb,.file,.button,.is-unselectable,.modal-close,.delete{-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.navbar-link:not(.is-arrowless)::after,.select:not(.is-multiple):not(.is-loading)::after{border:3px solid rgba(0,0,0,0);border-radius:2px;border-right:0;border-top:0;content:" ";display:block;height:0.625em;margin-top:-0.4375em;pointer-events:none;position:absolute;top:50%;transform:rotate(-45deg);transform-origin:center;width:0.625em}.admonition:not(:last-child),.tabs:not(:last-child),.message:not(:last-child),.list:not(:last-child),.level:not(:last-child),.breadcrumb:not(:last-child),.highlight:not(:last-child),.block:not(:last-child),.title:not(:last-child),.subtitle:not(:last-child),.table-container:not(:last-child),.table:not(:last-child),.progress:not(:last-child),.notification:not(:last-child),.content:not(:last-child),.box:not(:last-child){margin-bottom:1.5rem}.modal-close,.delete{-moz-appearance:none;-webkit-appearance:none;background-color:rgba(10,10,10,0.2);border:none;border-radius:290486px;cursor:pointer;pointer-events:auto;display:inline-block;flex-grow:0;flex-shrink:0;font-size:0;height:20px;max-height:20px;max-width:20px;min-height:20px;min-width:20px;outline:none;position:relative;vertical-align:top;width:20px}.modal-close::before,.delete::before,.modal-close::after,.delete::after{background-color:#fff;content:"";display:block;left:50%;position:absolute;top:50%;transform:translateX(-50%) translateY(-50%) rotate(45deg);transform-origin:center center}.modal-close::before,.delete::before{height:2px;width:50%}.modal-close::after,.delete::after{height:50%;width:2px}.modal-close:hover,.delete:hover,.modal-close:focus,.delete:focus{background-color:rgba(10,10,10,0.3)}.modal-close:active,.delete:active{background-color:rgba(10,10,10,0.4)}.is-small.modal-close,#documenter .docs-sidebar form.docs-search>input.modal-close,.is-small.delete,#documenter .docs-sidebar form.docs-search>input.delete{height:16px;max-height:16px;max-width:16px;min-height:16px;min-width:16px;width:16px}.is-medium.modal-close,.is-medium.delete{height:24px;max-height:24px;max-width:24px;min-height:24px;min-width:24px;width:24px}.is-large.modal-close,.is-large.delete{height:32px;max-height:32px;max-width:32px;min-height:32px;min-width:32px;width:32px}.control.is-loading::after,.select.is-loading::after,.loader,.button.is-loading::after{animation:spinAround 500ms infinite linear;border:2px solid #dbdbdb;border-radius:290486px;border-right-color:transparent;border-top-color:transparent;content:"";display:block;height:1em;position:relative;width:1em}.hero-video,.modal-background,.modal,.image.is-square img,#documenter .docs-sidebar .docs-logo>img.is-square img,.image.is-square .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-square .has-ratio,.image.is-1by1 img,#documenter .docs-sidebar .docs-logo>img.is-1by1 img,.image.is-1by1 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-1by1 .has-ratio,.image.is-5by4 img,#documenter .docs-sidebar .docs-logo>img.is-5by4 img,.image.is-5by4 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-5by4 .has-ratio,.image.is-4by3 img,#documenter .docs-sidebar .docs-logo>img.is-4by3 img,.image.is-4by3 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-4by3 .has-ratio,.image.is-3by2 img,#documenter .docs-sidebar .docs-logo>img.is-3by2 img,.image.is-3by2 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-3by2 .has-ratio,.image.is-5by3 img,#documenter .docs-sidebar .docs-logo>img.is-5by3 img,.image.is-5by3 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-5by3 .has-ratio,.image.is-16by9 img,#documenter .docs-sidebar .docs-logo>img.is-16by9 img,.image.is-16by9 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-16by9 .has-ratio,.image.is-2by1 img,#documenter .docs-sidebar .docs-logo>img.is-2by1 img,.image.is-2by1 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-2by1 .has-ratio,.image.is-3by1 img,#documenter .docs-sidebar .docs-logo>img.is-3by1 img,.image.is-3by1 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-3by1 .has-ratio,.image.is-4by5 img,#documenter .docs-sidebar .docs-logo>img.is-4by5 img,.image.is-4by5 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-4by5 .has-ratio,.image.is-3by4 img,#documenter .docs-sidebar .docs-logo>img.is-3by4 img,.image.is-3by4 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-3by4 .has-ratio,.image.is-2by3 img,#documenter .docs-sidebar .docs-logo>img.is-2by3 img,.image.is-2by3 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-2by3 .has-ratio,.image.is-3by5 img,#documenter .docs-sidebar .docs-logo>img.is-3by5 img,.image.is-3by5 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-3by5 .has-ratio,.image.is-9by16 img,#documenter .docs-sidebar .docs-logo>img.is-9by16 img,.image.is-9by16 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-9by16 .has-ratio,.image.is-1by2 img,#documenter .docs-sidebar .docs-logo>img.is-1by2 img,.image.is-1by2 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-1by2 .has-ratio,.image.is-1by3 img,#documenter .docs-sidebar .docs-logo>img.is-1by3 img,.image.is-1by3 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-1by3 .has-ratio,.is-overlay{bottom:0;left:0;position:absolute;right:0;top:0}.pagination-previous,.pagination-next,.pagination-link,.pagination-ellipsis,.file-cta,.file-name,.select select,.textarea,.input,#documenter .docs-sidebar form.docs-search>input,.button{-moz-appearance:none;-webkit-appearance:none;align-items:center;border:1px solid transparent;border-radius:4px;box-shadow:none;display:inline-flex;font-size:1rem;height:2.25em;justify-content:flex-start;line-height:1.5;padding-bottom:calc(0.375em - 1px);padding-left:calc(0.625em - 1px);padding-right:calc(0.625em - 1px);padding-top:calc(0.375em - 1px);position:relative;vertical-align:top}.pagination-previous:focus,.pagination-next:focus,.pagination-link:focus,.pagination-ellipsis:focus,.file-cta:focus,.file-name:focus,.select select:focus,.textarea:focus,.input:focus,#documenter .docs-sidebar form.docs-search>input:focus,.button:focus,.is-focused.pagination-previous,.is-focused.pagination-next,.is-focused.pagination-link,.is-focused.pagination-ellipsis,.is-focused.file-cta,.is-focused.file-name,.select select.is-focused,.is-focused.textarea,.is-focused.input,#documenter .docs-sidebar form.docs-search>input.is-focused,.is-focused.button,.pagination-previous:active,.pagination-next:active,.pagination-link:active,.pagination-ellipsis:active,.file-cta:active,.file-name:active,.select select:active,.textarea:active,.input:active,#documenter .docs-sidebar form.docs-search>input:active,.button:active,.is-active.pagination-previous,.is-active.pagination-next,.is-active.pagination-link,.is-active.pagination-ellipsis,.is-active.file-cta,.is-active.file-name,.select select.is-active,.is-active.textarea,.is-active.input,#documenter .docs-sidebar form.docs-search>input.is-active,.is-active.button{outline:none}.pagination-previous[disabled],.pagination-next[disabled],.pagination-link[disabled],.pagination-ellipsis[disabled],.file-cta[disabled],.file-name[disabled],.select select[disabled],.textarea[disabled],.input[disabled],#documenter .docs-sidebar form.docs-search>input[disabled],.button[disabled],fieldset[disabled] .pagination-previous,fieldset[disabled] .pagination-next,fieldset[disabled] .pagination-link,fieldset[disabled] .pagination-ellipsis,fieldset[disabled] .file-cta,fieldset[disabled] .file-name,fieldset[disabled] .select select,.select fieldset[disabled] select,fieldset[disabled] .textarea,fieldset[disabled] .input,fieldset[disabled] #documenter .docs-sidebar form.docs-search>input,#documenter .docs-sidebar fieldset[disabled] form.docs-search>input,fieldset[disabled] .button{cursor:not-allowed}/*! minireset.css v0.0.4 | MIT License | github.com/jgthms/minireset.css */html,body,p,ol,ul,li,dl,dt,dd,blockquote,figure,fieldset,legend,textarea,pre,iframe,hr,h1,h2,h3,h4,h5,h6{margin:0;padding:0}h1,h2,h3,h4,h5,h6{font-size:100%;font-weight:normal}ul{list-style:none}button,input,select,textarea{margin:0}html{box-sizing:border-box}*,*::before,*::after{box-sizing:inherit}img,embed,iframe,object,video{height:auto;max-width:100%}audio{max-width:100%}iframe{border:0}table{border-collapse:collapse;border-spacing:0}td,th{padding:0}td:not([align]),th:not([align]){text-align:left}html{background-color:#fff;font-size:16px;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;min-width:300px;overflow-x:auto;overflow-y:scroll;text-rendering:optimizeLegibility;text-size-adjust:100%}article,aside,figure,footer,header,hgroup,section{display:block}body,button,input,select,textarea{font-family:"Lato Medium",-apple-system,BlinkMacSystemFont,"Segoe UI","Helvetica Neue","Helvetica","Arial",sans-serif}code,pre{-moz-osx-font-smoothing:auto;-webkit-font-smoothing:auto;font-family:"JuliaMono","SFMono-Regular","Menlo","Consolas","Liberation Mono","DejaVu Sans Mono",monospace}body{color:#222;font-size:1em;font-weight:400;line-height:1.5}a{color:#2e63b8;cursor:pointer;text-decoration:none}a strong{color:currentColor}a:hover{color:#363636}code{background-color:rgba(0,0,0,0.05);color:#000;font-size:.875em;font-weight:normal;padding:.1em}hr{background-color:#f5f5f5;border:none;display:block;height:2px;margin:1.5rem 0}img{height:auto;max-width:100%}input[type="checkbox"],input[type="radio"]{vertical-align:baseline}small{font-size:.875em}span{font-style:inherit;font-weight:inherit}strong{color:#222;font-weight:700}fieldset{border:none}pre{-webkit-overflow-scrolling:touch;background-color:#f5f5f5;color:#222;font-size:.875em;overflow-x:auto;padding:1.25rem 1.5rem;white-space:pre;word-wrap:normal}pre code{background-color:transparent;color:currentColor;font-size:1em;padding:0}table td,table th{vertical-align:top}table td:not([align]),table th:not([align]){text-align:left}table th{color:#222}.is-clearfix::after{clear:both;content:" ";display:table}.is-pulled-left{float:left !important}.is-pulled-right{float:right !important}.is-clipped{overflow:hidden !important}.is-size-1{font-size:3rem !important}.is-size-2{font-size:2.5rem !important}.is-size-3{font-size:2rem !important}.is-size-4{font-size:1.5rem !important}.is-size-5{font-size:1.25rem !important}.is-size-6{font-size:1rem !important}.is-size-7,.docstring>section>a.docs-sourcelink{font-size:.75rem !important}@media screen and (max-width: 768px){.is-size-1-mobile{font-size:3rem !important}.is-size-2-mobile{font-size:2.5rem !important}.is-size-3-mobile{font-size:2rem !important}.is-size-4-mobile{font-size:1.5rem !important}.is-size-5-mobile{font-size:1.25rem !important}.is-size-6-mobile{font-size:1rem !important}.is-size-7-mobile{font-size:.75rem !important}}@media screen and (min-width: 769px),print{.is-size-1-tablet{font-size:3rem !important}.is-size-2-tablet{font-size:2.5rem !important}.is-size-3-tablet{font-size:2rem !important}.is-size-4-tablet{font-size:1.5rem !important}.is-size-5-tablet{font-size:1.25rem !important}.is-size-6-tablet{font-size:1rem !important}.is-size-7-tablet{font-size:.75rem !important}}@media screen and (max-width: 1055px){.is-size-1-touch{font-size:3rem !important}.is-size-2-touch{font-size:2.5rem !important}.is-size-3-touch{font-size:2rem !important}.is-size-4-touch{font-size:1.5rem !important}.is-size-5-touch{font-size:1.25rem !important}.is-size-6-touch{font-size:1rem !important}.is-size-7-touch{font-size:.75rem !important}}@media screen and (min-width: 1056px){.is-size-1-desktop{font-size:3rem !important}.is-size-2-desktop{font-size:2.5rem !important}.is-size-3-desktop{font-size:2rem !important}.is-size-4-desktop{font-size:1.5rem !important}.is-size-5-desktop{font-size:1.25rem !important}.is-size-6-desktop{font-size:1rem !important}.is-size-7-desktop{font-size:.75rem !important}}@media screen and (min-width: 1216px){.is-size-1-widescreen{font-size:3rem !important}.is-size-2-widescreen{font-size:2.5rem !important}.is-size-3-widescreen{font-size:2rem !important}.is-size-4-widescreen{font-size:1.5rem !important}.is-size-5-widescreen{font-size:1.25rem !important}.is-size-6-widescreen{font-size:1rem !important}.is-size-7-widescreen{font-size:.75rem !important}}@media screen and (min-width: 1408px){.is-size-1-fullhd{font-size:3rem !important}.is-size-2-fullhd{font-size:2.5rem !important}.is-size-3-fullhd{font-size:2rem !important}.is-size-4-fullhd{font-size:1.5rem !important}.is-size-5-fullhd{font-size:1.25rem !important}.is-size-6-fullhd{font-size:1rem !important}.is-size-7-fullhd{font-size:.75rem !important}}.has-text-centered{text-align:center !important}.has-text-justified{text-align:justify !important}.has-text-left{text-align:left !important}.has-text-right{text-align:right !important}@media screen and (max-width: 768px){.has-text-centered-mobile{text-align:center !important}}@media screen and (min-width: 769px),print{.has-text-centered-tablet{text-align:center !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.has-text-centered-tablet-only{text-align:center !important}}@media screen and (max-width: 1055px){.has-text-centered-touch{text-align:center !important}}@media screen and (min-width: 1056px){.has-text-centered-desktop{text-align:center !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.has-text-centered-desktop-only{text-align:center !important}}@media screen and (min-width: 1216px){.has-text-centered-widescreen{text-align:center !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.has-text-centered-widescreen-only{text-align:center !important}}@media screen and (min-width: 1408px){.has-text-centered-fullhd{text-align:center !important}}@media screen and (max-width: 768px){.has-text-justified-mobile{text-align:justify !important}}@media screen and (min-width: 769px),print{.has-text-justified-tablet{text-align:justify !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.has-text-justified-tablet-only{text-align:justify !important}}@media screen and (max-width: 1055px){.has-text-justified-touch{text-align:justify !important}}@media screen and (min-width: 1056px){.has-text-justified-desktop{text-align:justify !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.has-text-justified-desktop-only{text-align:justify !important}}@media screen and (min-width: 1216px){.has-text-justified-widescreen{text-align:justify !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.has-text-justified-widescreen-only{text-align:justify !important}}@media screen and (min-width: 1408px){.has-text-justified-fullhd{text-align:justify !important}}@media screen and (max-width: 768px){.has-text-left-mobile{text-align:left !important}}@media screen and (min-width: 769px),print{.has-text-left-tablet{text-align:left !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.has-text-left-tablet-only{text-align:left !important}}@media screen and (max-width: 1055px){.has-text-left-touch{text-align:left !important}}@media screen and (min-width: 1056px){.has-text-left-desktop{text-align:left !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.has-text-left-desktop-only{text-align:left !important}}@media screen and (min-width: 1216px){.has-text-left-widescreen{text-align:left !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.has-text-left-widescreen-only{text-align:left !important}}@media screen and (min-width: 1408px){.has-text-left-fullhd{text-align:left !important}}@media screen and (max-width: 768px){.has-text-right-mobile{text-align:right !important}}@media screen and (min-width: 769px),print{.has-text-right-tablet{text-align:right !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.has-text-right-tablet-only{text-align:right !important}}@media screen and (max-width: 1055px){.has-text-right-touch{text-align:right !important}}@media screen and (min-width: 1056px){.has-text-right-desktop{text-align:right !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.has-text-right-desktop-only{text-align:right !important}}@media screen and (min-width: 1216px){.has-text-right-widescreen{text-align:right !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.has-text-right-widescreen-only{text-align:right !important}}@media screen and (min-width: 1408px){.has-text-right-fullhd{text-align:right !important}}.is-capitalized{text-transform:capitalize !important}.is-lowercase{text-transform:lowercase !important}.is-uppercase{text-transform:uppercase !important}.is-italic{font-style:italic !important}.has-text-white{color:#fff !important}a.has-text-white:hover,a.has-text-white:focus{color:#e6e6e6 !important}.has-background-white{background-color:#fff !important}.has-text-black{color:#0a0a0a !important}a.has-text-black:hover,a.has-text-black:focus{color:#000 !important}.has-background-black{background-color:#0a0a0a !important}.has-text-light{color:#f5f5f5 !important}a.has-text-light:hover,a.has-text-light:focus{color:#dbdbdb !important}.has-background-light{background-color:#f5f5f5 !important}.has-text-dark{color:#363636 !important}a.has-text-dark:hover,a.has-text-dark:focus{color:#1c1c1c !important}.has-background-dark{background-color:#363636 !important}.has-text-primary{color:#4eb5de !important}a.has-text-primary:hover,a.has-text-primary:focus{color:#27a1d2 !important}.has-background-primary{background-color:#4eb5de !important}.has-text-link{color:#2e63b8 !important}a.has-text-link:hover,a.has-text-link:focus{color:#244d8f !important}.has-background-link{background-color:#2e63b8 !important}.has-text-info{color:#209cee !important}a.has-text-info:hover,a.has-text-info:focus{color:#1081cb !important}.has-background-info{background-color:#209cee !important}.has-text-success{color:#22c35b !important}a.has-text-success:hover,a.has-text-success:focus{color:#1a9847 !important}.has-background-success{background-color:#22c35b !important}.has-text-warning{color:#ffdd57 !important}a.has-text-warning:hover,a.has-text-warning:focus{color:#ffd324 !important}.has-background-warning{background-color:#ffdd57 !important}.has-text-danger{color:#da0b00 !important}a.has-text-danger:hover,a.has-text-danger:focus{color:#a70800 !important}.has-background-danger{background-color:#da0b00 !important}.has-text-black-bis{color:#121212 !important}.has-background-black-bis{background-color:#121212 !important}.has-text-black-ter{color:#242424 !important}.has-background-black-ter{background-color:#242424 !important}.has-text-grey-darker{color:#363636 !important}.has-background-grey-darker{background-color:#363636 !important}.has-text-grey-dark{color:#4a4a4a !important}.has-background-grey-dark{background-color:#4a4a4a !important}.has-text-grey{color:#6b6b6b !important}.has-background-grey{background-color:#6b6b6b !important}.has-text-grey-light{color:#b5b5b5 !important}.has-background-grey-light{background-color:#b5b5b5 !important}.has-text-grey-lighter{color:#dbdbdb !important}.has-background-grey-lighter{background-color:#dbdbdb !important}.has-text-white-ter{color:#f5f5f5 !important}.has-background-white-ter{background-color:#f5f5f5 !important}.has-text-white-bis{color:#fafafa !important}.has-background-white-bis{background-color:#fafafa !important}.has-text-weight-light{font-weight:300 !important}.has-text-weight-normal{font-weight:400 !important}.has-text-weight-medium{font-weight:500 !important}.has-text-weight-semibold{font-weight:600 !important}.has-text-weight-bold{font-weight:700 !important}.is-family-primary{font-family:"Lato Medium",-apple-system,BlinkMacSystemFont,"Segoe UI","Helvetica Neue","Helvetica","Arial",sans-serif !important}.is-family-secondary{font-family:"Lato Medium",-apple-system,BlinkMacSystemFont,"Segoe UI","Helvetica Neue","Helvetica","Arial",sans-serif !important}.is-family-sans-serif{font-family:"Lato Medium",-apple-system,BlinkMacSystemFont,"Segoe UI","Helvetica Neue","Helvetica","Arial",sans-serif !important}.is-family-monospace{font-family:"JuliaMono","SFMono-Regular","Menlo","Consolas","Liberation Mono","DejaVu Sans Mono",monospace !important}.is-family-code{font-family:"JuliaMono","SFMono-Regular","Menlo","Consolas","Liberation Mono","DejaVu Sans Mono",monospace !important}.is-block{display:block !important}@media screen and (max-width: 768px){.is-block-mobile{display:block !important}}@media screen and (min-width: 769px),print{.is-block-tablet{display:block !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.is-block-tablet-only{display:block !important}}@media screen and (max-width: 1055px){.is-block-touch{display:block !important}}@media screen and (min-width: 1056px){.is-block-desktop{display:block !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.is-block-desktop-only{display:block !important}}@media screen and (min-width: 1216px){.is-block-widescreen{display:block !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.is-block-widescreen-only{display:block !important}}@media screen and (min-width: 1408px){.is-block-fullhd{display:block !important}}.is-flex{display:flex !important}@media screen and (max-width: 768px){.is-flex-mobile{display:flex !important}}@media screen and (min-width: 769px),print{.is-flex-tablet{display:flex !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.is-flex-tablet-only{display:flex !important}}@media screen and (max-width: 1055px){.is-flex-touch{display:flex !important}}@media screen and (min-width: 1056px){.is-flex-desktop{display:flex !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.is-flex-desktop-only{display:flex !important}}@media screen and (min-width: 1216px){.is-flex-widescreen{display:flex !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.is-flex-widescreen-only{display:flex !important}}@media screen and (min-width: 1408px){.is-flex-fullhd{display:flex !important}}.is-inline{display:inline !important}@media screen and (max-width: 768px){.is-inline-mobile{display:inline !important}}@media screen and (min-width: 769px),print{.is-inline-tablet{display:inline !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.is-inline-tablet-only{display:inline !important}}@media screen and (max-width: 1055px){.is-inline-touch{display:inline !important}}@media screen and (min-width: 1056px){.is-inline-desktop{display:inline !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.is-inline-desktop-only{display:inline !important}}@media screen and (min-width: 1216px){.is-inline-widescreen{display:inline !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.is-inline-widescreen-only{display:inline !important}}@media screen and (min-width: 1408px){.is-inline-fullhd{display:inline !important}}.is-inline-block{display:inline-block !important}@media screen and (max-width: 768px){.is-inline-block-mobile{display:inline-block !important}}@media screen and (min-width: 769px),print{.is-inline-block-tablet{display:inline-block !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.is-inline-block-tablet-only{display:inline-block !important}}@media screen and (max-width: 1055px){.is-inline-block-touch{display:inline-block !important}}@media screen and (min-width: 1056px){.is-inline-block-desktop{display:inline-block !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.is-inline-block-desktop-only{display:inline-block !important}}@media screen and (min-width: 1216px){.is-inline-block-widescreen{display:inline-block !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.is-inline-block-widescreen-only{display:inline-block !important}}@media screen and (min-width: 1408px){.is-inline-block-fullhd{display:inline-block !important}}.is-inline-flex{display:inline-flex !important}@media screen and (max-width: 768px){.is-inline-flex-mobile{display:inline-flex !important}}@media screen and (min-width: 769px),print{.is-inline-flex-tablet{display:inline-flex !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.is-inline-flex-tablet-only{display:inline-flex !important}}@media screen and (max-width: 1055px){.is-inline-flex-touch{display:inline-flex !important}}@media screen and (min-width: 1056px){.is-inline-flex-desktop{display:inline-flex !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.is-inline-flex-desktop-only{display:inline-flex !important}}@media screen and (min-width: 1216px){.is-inline-flex-widescreen{display:inline-flex !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.is-inline-flex-widescreen-only{display:inline-flex !important}}@media screen and (min-width: 1408px){.is-inline-flex-fullhd{display:inline-flex !important}}.is-hidden{display:none !important}.is-sr-only{border:none !important;clip:rect(0, 0, 0, 0) !important;height:0.01em !important;overflow:hidden !important;padding:0 !important;position:absolute !important;white-space:nowrap !important;width:0.01em !important}@media screen and (max-width: 768px){.is-hidden-mobile{display:none !important}}@media screen and (min-width: 769px),print{.is-hidden-tablet{display:none !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.is-hidden-tablet-only{display:none !important}}@media screen and (max-width: 1055px){.is-hidden-touch{display:none !important}}@media screen and (min-width: 1056px){.is-hidden-desktop{display:none !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.is-hidden-desktop-only{display:none !important}}@media screen and (min-width: 1216px){.is-hidden-widescreen{display:none !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.is-hidden-widescreen-only{display:none !important}}@media screen and (min-width: 1408px){.is-hidden-fullhd{display:none !important}}.is-invisible{visibility:hidden !important}@media screen and (max-width: 768px){.is-invisible-mobile{visibility:hidden !important}}@media screen and (min-width: 769px),print{.is-invisible-tablet{visibility:hidden !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.is-invisible-tablet-only{visibility:hidden !important}}@media screen and (max-width: 1055px){.is-invisible-touch{visibility:hidden !important}}@media screen and (min-width: 1056px){.is-invisible-desktop{visibility:hidden !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.is-invisible-desktop-only{visibility:hidden !important}}@media screen and (min-width: 1216px){.is-invisible-widescreen{visibility:hidden !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.is-invisible-widescreen-only{visibility:hidden !important}}@media screen and (min-width: 1408px){.is-invisible-fullhd{visibility:hidden !important}}.is-marginless{margin:0 !important}.is-paddingless{padding:0 !important}.is-radiusless{border-radius:0 !important}.is-shadowless{box-shadow:none !important}.is-relative{position:relative !important}.box{background-color:#fff;border-radius:6px;box-shadow:0 2px 3px rgba(10,10,10,0.1),0 0 0 1px rgba(10,10,10,0.1);color:#222;display:block;padding:1.25rem}a.box:hover,a.box:focus{box-shadow:0 2px 3px rgba(10,10,10,0.1),0 0 0 1px #2e63b8}a.box:active{box-shadow:inset 0 1px 2px rgba(10,10,10,0.2),0 0 0 1px #2e63b8}.button{background-color:#fff;border-color:#dbdbdb;border-width:1px;color:#363636;cursor:pointer;justify-content:center;padding-bottom:calc(0.375em - 1px);padding-left:.75em;padding-right:.75em;padding-top:calc(0.375em - 1px);text-align:center;white-space:nowrap}.button strong{color:inherit}.button .icon,.button .icon.is-small,.button #documenter .docs-sidebar form.docs-search>input.icon,#documenter .docs-sidebar .button form.docs-search>input.icon,.button .icon.is-medium,.button .icon.is-large{height:1.5em;width:1.5em}.button .icon:first-child:not(:last-child){margin-left:calc(-0.375em - 1px);margin-right:0.1875em}.button .icon:last-child:not(:first-child){margin-left:0.1875em;margin-right:calc(-0.375em - 1px)}.button .icon:first-child:last-child{margin-left:calc(-0.375em - 1px);margin-right:calc(-0.375em - 1px)}.button:hover,.button.is-hovered{border-color:#b5b5b5;color:#363636}.button:focus,.button.is-focused{border-color:#3c5dcd;color:#363636}.button:focus:not(:active),.button.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(46,99,184,0.25)}.button:active,.button.is-active{border-color:#4a4a4a;color:#363636}.button.is-text{background-color:transparent;border-color:transparent;color:#222;text-decoration:underline}.button.is-text:hover,.button.is-text.is-hovered,.button.is-text:focus,.button.is-text.is-focused{background-color:#f5f5f5;color:#222}.button.is-text:active,.button.is-text.is-active{background-color:#e8e8e8;color:#222}.button.is-text[disabled],fieldset[disabled] .button.is-text{background-color:transparent;border-color:transparent;box-shadow:none}.button.is-white{background-color:#fff;border-color:transparent;color:#0a0a0a}.button.is-white:hover,.button.is-white.is-hovered{background-color:#f9f9f9;border-color:transparent;color:#0a0a0a}.button.is-white:focus,.button.is-white.is-focused{border-color:transparent;color:#0a0a0a}.button.is-white:focus:not(:active),.button.is-white.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(255,255,255,0.25)}.button.is-white:active,.button.is-white.is-active{background-color:#f2f2f2;border-color:transparent;color:#0a0a0a}.button.is-white[disabled],fieldset[disabled] .button.is-white{background-color:#fff;border-color:transparent;box-shadow:none}.button.is-white.is-inverted{background-color:#0a0a0a;color:#fff}.button.is-white.is-inverted:hover,.button.is-white.is-inverted.is-hovered{background-color:#000}.button.is-white.is-inverted[disabled],fieldset[disabled] .button.is-white.is-inverted{background-color:#0a0a0a;border-color:transparent;box-shadow:none;color:#fff}.button.is-white.is-loading::after{border-color:transparent transparent #0a0a0a #0a0a0a !important}.button.is-white.is-outlined{background-color:transparent;border-color:#fff;color:#fff}.button.is-white.is-outlined:hover,.button.is-white.is-outlined.is-hovered,.button.is-white.is-outlined:focus,.button.is-white.is-outlined.is-focused{background-color:#fff;border-color:#fff;color:#0a0a0a}.button.is-white.is-outlined.is-loading::after{border-color:transparent transparent #fff #fff !important}.button.is-white.is-outlined.is-loading:hover::after,.button.is-white.is-outlined.is-loading.is-hovered::after,.button.is-white.is-outlined.is-loading:focus::after,.button.is-white.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #0a0a0a #0a0a0a !important}.button.is-white.is-outlined[disabled],fieldset[disabled] .button.is-white.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}.button.is-white.is-inverted.is-outlined{background-color:transparent;border-color:#0a0a0a;color:#0a0a0a}.button.is-white.is-inverted.is-outlined:hover,.button.is-white.is-inverted.is-outlined.is-hovered,.button.is-white.is-inverted.is-outlined:focus,.button.is-white.is-inverted.is-outlined.is-focused{background-color:#0a0a0a;color:#fff}.button.is-white.is-inverted.is-outlined.is-loading:hover::after,.button.is-white.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-white.is-inverted.is-outlined.is-loading:focus::after,.button.is-white.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #fff #fff !important}.button.is-white.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-white.is-inverted.is-outlined{background-color:transparent;border-color:#0a0a0a;box-shadow:none;color:#0a0a0a}.button.is-black{background-color:#0a0a0a;border-color:transparent;color:#fff}.button.is-black:hover,.button.is-black.is-hovered{background-color:#040404;border-color:transparent;color:#fff}.button.is-black:focus,.button.is-black.is-focused{border-color:transparent;color:#fff}.button.is-black:focus:not(:active),.button.is-black.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(10,10,10,0.25)}.button.is-black:active,.button.is-black.is-active{background-color:#000;border-color:transparent;color:#fff}.button.is-black[disabled],fieldset[disabled] .button.is-black{background-color:#0a0a0a;border-color:transparent;box-shadow:none}.button.is-black.is-inverted{background-color:#fff;color:#0a0a0a}.button.is-black.is-inverted:hover,.button.is-black.is-inverted.is-hovered{background-color:#f2f2f2}.button.is-black.is-inverted[disabled],fieldset[disabled] .button.is-black.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#0a0a0a}.button.is-black.is-loading::after{border-color:transparent transparent #fff #fff !important}.button.is-black.is-outlined{background-color:transparent;border-color:#0a0a0a;color:#0a0a0a}.button.is-black.is-outlined:hover,.button.is-black.is-outlined.is-hovered,.button.is-black.is-outlined:focus,.button.is-black.is-outlined.is-focused{background-color:#0a0a0a;border-color:#0a0a0a;color:#fff}.button.is-black.is-outlined.is-loading::after{border-color:transparent transparent #0a0a0a #0a0a0a !important}.button.is-black.is-outlined.is-loading:hover::after,.button.is-black.is-outlined.is-loading.is-hovered::after,.button.is-black.is-outlined.is-loading:focus::after,.button.is-black.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #fff #fff !important}.button.is-black.is-outlined[disabled],fieldset[disabled] .button.is-black.is-outlined{background-color:transparent;border-color:#0a0a0a;box-shadow:none;color:#0a0a0a}.button.is-black.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}.button.is-black.is-inverted.is-outlined:hover,.button.is-black.is-inverted.is-outlined.is-hovered,.button.is-black.is-inverted.is-outlined:focus,.button.is-black.is-inverted.is-outlined.is-focused{background-color:#fff;color:#0a0a0a}.button.is-black.is-inverted.is-outlined.is-loading:hover::after,.button.is-black.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-black.is-inverted.is-outlined.is-loading:focus::after,.button.is-black.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #0a0a0a #0a0a0a !important}.button.is-black.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-black.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}.button.is-light{background-color:#f5f5f5;border-color:transparent;color:#363636}.button.is-light:hover,.button.is-light.is-hovered{background-color:#eee;border-color:transparent;color:#363636}.button.is-light:focus,.button.is-light.is-focused{border-color:transparent;color:#363636}.button.is-light:focus:not(:active),.button.is-light.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(245,245,245,0.25)}.button.is-light:active,.button.is-light.is-active{background-color:#e8e8e8;border-color:transparent;color:#363636}.button.is-light[disabled],fieldset[disabled] .button.is-light{background-color:#f5f5f5;border-color:transparent;box-shadow:none}.button.is-light.is-inverted{background-color:#363636;color:#f5f5f5}.button.is-light.is-inverted:hover,.button.is-light.is-inverted.is-hovered{background-color:#292929}.button.is-light.is-inverted[disabled],fieldset[disabled] .button.is-light.is-inverted{background-color:#363636;border-color:transparent;box-shadow:none;color:#f5f5f5}.button.is-light.is-loading::after{border-color:transparent transparent #363636 #363636 !important}.button.is-light.is-outlined{background-color:transparent;border-color:#f5f5f5;color:#f5f5f5}.button.is-light.is-outlined:hover,.button.is-light.is-outlined.is-hovered,.button.is-light.is-outlined:focus,.button.is-light.is-outlined.is-focused{background-color:#f5f5f5;border-color:#f5f5f5;color:#363636}.button.is-light.is-outlined.is-loading::after{border-color:transparent transparent #f5f5f5 #f5f5f5 !important}.button.is-light.is-outlined.is-loading:hover::after,.button.is-light.is-outlined.is-loading.is-hovered::after,.button.is-light.is-outlined.is-loading:focus::after,.button.is-light.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #363636 #363636 !important}.button.is-light.is-outlined[disabled],fieldset[disabled] .button.is-light.is-outlined{background-color:transparent;border-color:#f5f5f5;box-shadow:none;color:#f5f5f5}.button.is-light.is-inverted.is-outlined{background-color:transparent;border-color:#363636;color:#363636}.button.is-light.is-inverted.is-outlined:hover,.button.is-light.is-inverted.is-outlined.is-hovered,.button.is-light.is-inverted.is-outlined:focus,.button.is-light.is-inverted.is-outlined.is-focused{background-color:#363636;color:#f5f5f5}.button.is-light.is-inverted.is-outlined.is-loading:hover::after,.button.is-light.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-light.is-inverted.is-outlined.is-loading:focus::after,.button.is-light.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #f5f5f5 #f5f5f5 !important}.button.is-light.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-light.is-inverted.is-outlined{background-color:transparent;border-color:#363636;box-shadow:none;color:#363636}.button.is-dark,.content kbd.button{background-color:#363636;border-color:transparent;color:#f5f5f5}.button.is-dark:hover,.content kbd.button:hover,.button.is-dark.is-hovered,.content kbd.button.is-hovered{background-color:#2f2f2f;border-color:transparent;color:#f5f5f5}.button.is-dark:focus,.content kbd.button:focus,.button.is-dark.is-focused,.content kbd.button.is-focused{border-color:transparent;color:#f5f5f5}.button.is-dark:focus:not(:active),.content kbd.button:focus:not(:active),.button.is-dark.is-focused:not(:active),.content kbd.button.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(54,54,54,0.25)}.button.is-dark:active,.content kbd.button:active,.button.is-dark.is-active,.content kbd.button.is-active{background-color:#292929;border-color:transparent;color:#f5f5f5}.button.is-dark[disabled],.content kbd.button[disabled],fieldset[disabled] .button.is-dark,fieldset[disabled] .content kbd.button,.content fieldset[disabled] kbd.button{background-color:#363636;border-color:transparent;box-shadow:none}.button.is-dark.is-inverted,.content kbd.button.is-inverted{background-color:#f5f5f5;color:#363636}.button.is-dark.is-inverted:hover,.content kbd.button.is-inverted:hover,.button.is-dark.is-inverted.is-hovered,.content kbd.button.is-inverted.is-hovered{background-color:#e8e8e8}.button.is-dark.is-inverted[disabled],.content kbd.button.is-inverted[disabled],fieldset[disabled] .button.is-dark.is-inverted,fieldset[disabled] .content kbd.button.is-inverted,.content fieldset[disabled] kbd.button.is-inverted{background-color:#f5f5f5;border-color:transparent;box-shadow:none;color:#363636}.button.is-dark.is-loading::after,.content kbd.button.is-loading::after{border-color:transparent transparent #f5f5f5 #f5f5f5 !important}.button.is-dark.is-outlined,.content kbd.button.is-outlined{background-color:transparent;border-color:#363636;color:#363636}.button.is-dark.is-outlined:hover,.content kbd.button.is-outlined:hover,.button.is-dark.is-outlined.is-hovered,.content kbd.button.is-outlined.is-hovered,.button.is-dark.is-outlined:focus,.content kbd.button.is-outlined:focus,.button.is-dark.is-outlined.is-focused,.content kbd.button.is-outlined.is-focused{background-color:#363636;border-color:#363636;color:#f5f5f5}.button.is-dark.is-outlined.is-loading::after,.content kbd.button.is-outlined.is-loading::after{border-color:transparent transparent #363636 #363636 !important}.button.is-dark.is-outlined.is-loading:hover::after,.content kbd.button.is-outlined.is-loading:hover::after,.button.is-dark.is-outlined.is-loading.is-hovered::after,.content kbd.button.is-outlined.is-loading.is-hovered::after,.button.is-dark.is-outlined.is-loading:focus::after,.content kbd.button.is-outlined.is-loading:focus::after,.button.is-dark.is-outlined.is-loading.is-focused::after,.content kbd.button.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #f5f5f5 #f5f5f5 !important}.button.is-dark.is-outlined[disabled],.content kbd.button.is-outlined[disabled],fieldset[disabled] .button.is-dark.is-outlined,fieldset[disabled] .content kbd.button.is-outlined,.content fieldset[disabled] kbd.button.is-outlined{background-color:transparent;border-color:#363636;box-shadow:none;color:#363636}.button.is-dark.is-inverted.is-outlined,.content kbd.button.is-inverted.is-outlined{background-color:transparent;border-color:#f5f5f5;color:#f5f5f5}.button.is-dark.is-inverted.is-outlined:hover,.content kbd.button.is-inverted.is-outlined:hover,.button.is-dark.is-inverted.is-outlined.is-hovered,.content kbd.button.is-inverted.is-outlined.is-hovered,.button.is-dark.is-inverted.is-outlined:focus,.content kbd.button.is-inverted.is-outlined:focus,.button.is-dark.is-inverted.is-outlined.is-focused,.content kbd.button.is-inverted.is-outlined.is-focused{background-color:#f5f5f5;color:#363636}.button.is-dark.is-inverted.is-outlined.is-loading:hover::after,.content kbd.button.is-inverted.is-outlined.is-loading:hover::after,.button.is-dark.is-inverted.is-outlined.is-loading.is-hovered::after,.content kbd.button.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-dark.is-inverted.is-outlined.is-loading:focus::after,.content kbd.button.is-inverted.is-outlined.is-loading:focus::after,.button.is-dark.is-inverted.is-outlined.is-loading.is-focused::after,.content kbd.button.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #363636 #363636 !important}.button.is-dark.is-inverted.is-outlined[disabled],.content kbd.button.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-dark.is-inverted.is-outlined,fieldset[disabled] .content kbd.button.is-inverted.is-outlined,.content fieldset[disabled] kbd.button.is-inverted.is-outlined{background-color:transparent;border-color:#f5f5f5;box-shadow:none;color:#f5f5f5}.button.is-primary,.docstring>section>a.button.docs-sourcelink{background-color:#4eb5de;border-color:transparent;color:#fff}.button.is-primary:hover,.docstring>section>a.button.docs-sourcelink:hover,.button.is-primary.is-hovered,.docstring>section>a.button.is-hovered.docs-sourcelink{background-color:#43b1dc;border-color:transparent;color:#fff}.button.is-primary:focus,.docstring>section>a.button.docs-sourcelink:focus,.button.is-primary.is-focused,.docstring>section>a.button.is-focused.docs-sourcelink{border-color:transparent;color:#fff}.button.is-primary:focus:not(:active),.docstring>section>a.button.docs-sourcelink:focus:not(:active),.button.is-primary.is-focused:not(:active),.docstring>section>a.button.is-focused.docs-sourcelink:not(:active){box-shadow:0 0 0 0.125em rgba(78,181,222,0.25)}.button.is-primary:active,.docstring>section>a.button.docs-sourcelink:active,.button.is-primary.is-active,.docstring>section>a.button.is-active.docs-sourcelink{background-color:#39acda;border-color:transparent;color:#fff}.button.is-primary[disabled],.docstring>section>a.button.docs-sourcelink[disabled],fieldset[disabled] .button.is-primary,fieldset[disabled] .docstring>section>a.button.docs-sourcelink{background-color:#4eb5de;border-color:transparent;box-shadow:none}.button.is-primary.is-inverted,.docstring>section>a.button.is-inverted.docs-sourcelink{background-color:#fff;color:#4eb5de}.button.is-primary.is-inverted:hover,.docstring>section>a.button.is-inverted.docs-sourcelink:hover,.button.is-primary.is-inverted.is-hovered,.docstring>section>a.button.is-inverted.is-hovered.docs-sourcelink{background-color:#f2f2f2}.button.is-primary.is-inverted[disabled],.docstring>section>a.button.is-inverted.docs-sourcelink[disabled],fieldset[disabled] .button.is-primary.is-inverted,fieldset[disabled] .docstring>section>a.button.is-inverted.docs-sourcelink{background-color:#fff;border-color:transparent;box-shadow:none;color:#4eb5de}.button.is-primary.is-loading::after,.docstring>section>a.button.is-loading.docs-sourcelink::after{border-color:transparent transparent #fff #fff !important}.button.is-primary.is-outlined,.docstring>section>a.button.is-outlined.docs-sourcelink{background-color:transparent;border-color:#4eb5de;color:#4eb5de}.button.is-primary.is-outlined:hover,.docstring>section>a.button.is-outlined.docs-sourcelink:hover,.button.is-primary.is-outlined.is-hovered,.docstring>section>a.button.is-outlined.is-hovered.docs-sourcelink,.button.is-primary.is-outlined:focus,.docstring>section>a.button.is-outlined.docs-sourcelink:focus,.button.is-primary.is-outlined.is-focused,.docstring>section>a.button.is-outlined.is-focused.docs-sourcelink{background-color:#4eb5de;border-color:#4eb5de;color:#fff}.button.is-primary.is-outlined.is-loading::after,.docstring>section>a.button.is-outlined.is-loading.docs-sourcelink::after{border-color:transparent transparent #4eb5de #4eb5de !important}.button.is-primary.is-outlined.is-loading:hover::after,.docstring>section>a.button.is-outlined.is-loading.docs-sourcelink:hover::after,.button.is-primary.is-outlined.is-loading.is-hovered::after,.docstring>section>a.button.is-outlined.is-loading.is-hovered.docs-sourcelink::after,.button.is-primary.is-outlined.is-loading:focus::after,.docstring>section>a.button.is-outlined.is-loading.docs-sourcelink:focus::after,.button.is-primary.is-outlined.is-loading.is-focused::after,.docstring>section>a.button.is-outlined.is-loading.is-focused.docs-sourcelink::after{border-color:transparent transparent #fff #fff !important}.button.is-primary.is-outlined[disabled],.docstring>section>a.button.is-outlined.docs-sourcelink[disabled],fieldset[disabled] .button.is-primary.is-outlined,fieldset[disabled] .docstring>section>a.button.is-outlined.docs-sourcelink{background-color:transparent;border-color:#4eb5de;box-shadow:none;color:#4eb5de}.button.is-primary.is-inverted.is-outlined,.docstring>section>a.button.is-inverted.is-outlined.docs-sourcelink{background-color:transparent;border-color:#fff;color:#fff}.button.is-primary.is-inverted.is-outlined:hover,.docstring>section>a.button.is-inverted.is-outlined.docs-sourcelink:hover,.button.is-primary.is-inverted.is-outlined.is-hovered,.docstring>section>a.button.is-inverted.is-outlined.is-hovered.docs-sourcelink,.button.is-primary.is-inverted.is-outlined:focus,.docstring>section>a.button.is-inverted.is-outlined.docs-sourcelink:focus,.button.is-primary.is-inverted.is-outlined.is-focused,.docstring>section>a.button.is-inverted.is-outlined.is-focused.docs-sourcelink{background-color:#fff;color:#4eb5de}.button.is-primary.is-inverted.is-outlined.is-loading:hover::after,.docstring>section>a.button.is-inverted.is-outlined.is-loading.docs-sourcelink:hover::after,.button.is-primary.is-inverted.is-outlined.is-loading.is-hovered::after,.docstring>section>a.button.is-inverted.is-outlined.is-loading.is-hovered.docs-sourcelink::after,.button.is-primary.is-inverted.is-outlined.is-loading:focus::after,.docstring>section>a.button.is-inverted.is-outlined.is-loading.docs-sourcelink:focus::after,.button.is-primary.is-inverted.is-outlined.is-loading.is-focused::after,.docstring>section>a.button.is-inverted.is-outlined.is-loading.is-focused.docs-sourcelink::after{border-color:transparent transparent #4eb5de #4eb5de !important}.button.is-primary.is-inverted.is-outlined[disabled],.docstring>section>a.button.is-inverted.is-outlined.docs-sourcelink[disabled],fieldset[disabled] .button.is-primary.is-inverted.is-outlined,fieldset[disabled] .docstring>section>a.button.is-inverted.is-outlined.docs-sourcelink{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}.button.is-link{background-color:#2e63b8;border-color:transparent;color:#fff}.button.is-link:hover,.button.is-link.is-hovered{background-color:#2b5eae;border-color:transparent;color:#fff}.button.is-link:focus,.button.is-link.is-focused{border-color:transparent;color:#fff}.button.is-link:focus:not(:active),.button.is-link.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(46,99,184,0.25)}.button.is-link:active,.button.is-link.is-active{background-color:#2958a4;border-color:transparent;color:#fff}.button.is-link[disabled],fieldset[disabled] .button.is-link{background-color:#2e63b8;border-color:transparent;box-shadow:none}.button.is-link.is-inverted{background-color:#fff;color:#2e63b8}.button.is-link.is-inverted:hover,.button.is-link.is-inverted.is-hovered{background-color:#f2f2f2}.button.is-link.is-inverted[disabled],fieldset[disabled] .button.is-link.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#2e63b8}.button.is-link.is-loading::after{border-color:transparent transparent #fff #fff !important}.button.is-link.is-outlined{background-color:transparent;border-color:#2e63b8;color:#2e63b8}.button.is-link.is-outlined:hover,.button.is-link.is-outlined.is-hovered,.button.is-link.is-outlined:focus,.button.is-link.is-outlined.is-focused{background-color:#2e63b8;border-color:#2e63b8;color:#fff}.button.is-link.is-outlined.is-loading::after{border-color:transparent transparent #2e63b8 #2e63b8 !important}.button.is-link.is-outlined.is-loading:hover::after,.button.is-link.is-outlined.is-loading.is-hovered::after,.button.is-link.is-outlined.is-loading:focus::after,.button.is-link.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #fff #fff !important}.button.is-link.is-outlined[disabled],fieldset[disabled] .button.is-link.is-outlined{background-color:transparent;border-color:#2e63b8;box-shadow:none;color:#2e63b8}.button.is-link.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}.button.is-link.is-inverted.is-outlined:hover,.button.is-link.is-inverted.is-outlined.is-hovered,.button.is-link.is-inverted.is-outlined:focus,.button.is-link.is-inverted.is-outlined.is-focused{background-color:#fff;color:#2e63b8}.button.is-link.is-inverted.is-outlined.is-loading:hover::after,.button.is-link.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-link.is-inverted.is-outlined.is-loading:focus::after,.button.is-link.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #2e63b8 #2e63b8 !important}.button.is-link.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-link.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}.button.is-info{background-color:#209cee;border-color:transparent;color:#fff}.button.is-info:hover,.button.is-info.is-hovered{background-color:#1497ed;border-color:transparent;color:#fff}.button.is-info:focus,.button.is-info.is-focused{border-color:transparent;color:#fff}.button.is-info:focus:not(:active),.button.is-info.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(32,156,238,0.25)}.button.is-info:active,.button.is-info.is-active{background-color:#1190e3;border-color:transparent;color:#fff}.button.is-info[disabled],fieldset[disabled] .button.is-info{background-color:#209cee;border-color:transparent;box-shadow:none}.button.is-info.is-inverted{background-color:#fff;color:#209cee}.button.is-info.is-inverted:hover,.button.is-info.is-inverted.is-hovered{background-color:#f2f2f2}.button.is-info.is-inverted[disabled],fieldset[disabled] .button.is-info.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#209cee}.button.is-info.is-loading::after{border-color:transparent transparent #fff #fff !important}.button.is-info.is-outlined{background-color:transparent;border-color:#209cee;color:#209cee}.button.is-info.is-outlined:hover,.button.is-info.is-outlined.is-hovered,.button.is-info.is-outlined:focus,.button.is-info.is-outlined.is-focused{background-color:#209cee;border-color:#209cee;color:#fff}.button.is-info.is-outlined.is-loading::after{border-color:transparent transparent #209cee #209cee !important}.button.is-info.is-outlined.is-loading:hover::after,.button.is-info.is-outlined.is-loading.is-hovered::after,.button.is-info.is-outlined.is-loading:focus::after,.button.is-info.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #fff #fff !important}.button.is-info.is-outlined[disabled],fieldset[disabled] .button.is-info.is-outlined{background-color:transparent;border-color:#209cee;box-shadow:none;color:#209cee}.button.is-info.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}.button.is-info.is-inverted.is-outlined:hover,.button.is-info.is-inverted.is-outlined.is-hovered,.button.is-info.is-inverted.is-outlined:focus,.button.is-info.is-inverted.is-outlined.is-focused{background-color:#fff;color:#209cee}.button.is-info.is-inverted.is-outlined.is-loading:hover::after,.button.is-info.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-info.is-inverted.is-outlined.is-loading:focus::after,.button.is-info.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #209cee #209cee !important}.button.is-info.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-info.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}.button.is-success{background-color:#22c35b;border-color:transparent;color:#fff}.button.is-success:hover,.button.is-success.is-hovered{background-color:#20b856;border-color:transparent;color:#fff}.button.is-success:focus,.button.is-success.is-focused{border-color:transparent;color:#fff}.button.is-success:focus:not(:active),.button.is-success.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(34,195,91,0.25)}.button.is-success:active,.button.is-success.is-active{background-color:#1ead51;border-color:transparent;color:#fff}.button.is-success[disabled],fieldset[disabled] .button.is-success{background-color:#22c35b;border-color:transparent;box-shadow:none}.button.is-success.is-inverted{background-color:#fff;color:#22c35b}.button.is-success.is-inverted:hover,.button.is-success.is-inverted.is-hovered{background-color:#f2f2f2}.button.is-success.is-inverted[disabled],fieldset[disabled] .button.is-success.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#22c35b}.button.is-success.is-loading::after{border-color:transparent transparent #fff #fff !important}.button.is-success.is-outlined{background-color:transparent;border-color:#22c35b;color:#22c35b}.button.is-success.is-outlined:hover,.button.is-success.is-outlined.is-hovered,.button.is-success.is-outlined:focus,.button.is-success.is-outlined.is-focused{background-color:#22c35b;border-color:#22c35b;color:#fff}.button.is-success.is-outlined.is-loading::after{border-color:transparent transparent #22c35b #22c35b !important}.button.is-success.is-outlined.is-loading:hover::after,.button.is-success.is-outlined.is-loading.is-hovered::after,.button.is-success.is-outlined.is-loading:focus::after,.button.is-success.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #fff #fff !important}.button.is-success.is-outlined[disabled],fieldset[disabled] .button.is-success.is-outlined{background-color:transparent;border-color:#22c35b;box-shadow:none;color:#22c35b}.button.is-success.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}.button.is-success.is-inverted.is-outlined:hover,.button.is-success.is-inverted.is-outlined.is-hovered,.button.is-success.is-inverted.is-outlined:focus,.button.is-success.is-inverted.is-outlined.is-focused{background-color:#fff;color:#22c35b}.button.is-success.is-inverted.is-outlined.is-loading:hover::after,.button.is-success.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-success.is-inverted.is-outlined.is-loading:focus::after,.button.is-success.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #22c35b #22c35b !important}.button.is-success.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-success.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}.button.is-warning{background-color:#ffdd57;border-color:transparent;color:rgba(0,0,0,0.7)}.button.is-warning:hover,.button.is-warning.is-hovered{background-color:#ffda4a;border-color:transparent;color:rgba(0,0,0,0.7)}.button.is-warning:focus,.button.is-warning.is-focused{border-color:transparent;color:rgba(0,0,0,0.7)}.button.is-warning:focus:not(:active),.button.is-warning.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(255,221,87,0.25)}.button.is-warning:active,.button.is-warning.is-active{background-color:#ffd83e;border-color:transparent;color:rgba(0,0,0,0.7)}.button.is-warning[disabled],fieldset[disabled] .button.is-warning{background-color:#ffdd57;border-color:transparent;box-shadow:none}.button.is-warning.is-inverted{background-color:rgba(0,0,0,0.7);color:#ffdd57}.button.is-warning.is-inverted:hover,.button.is-warning.is-inverted.is-hovered{background-color:rgba(0,0,0,0.7)}.button.is-warning.is-inverted[disabled],fieldset[disabled] .button.is-warning.is-inverted{background-color:rgba(0,0,0,0.7);border-color:transparent;box-shadow:none;color:#ffdd57}.button.is-warning.is-loading::after{border-color:transparent transparent rgba(0,0,0,0.7) rgba(0,0,0,0.7) !important}.button.is-warning.is-outlined{background-color:transparent;border-color:#ffdd57;color:#ffdd57}.button.is-warning.is-outlined:hover,.button.is-warning.is-outlined.is-hovered,.button.is-warning.is-outlined:focus,.button.is-warning.is-outlined.is-focused{background-color:#ffdd57;border-color:#ffdd57;color:rgba(0,0,0,0.7)}.button.is-warning.is-outlined.is-loading::after{border-color:transparent transparent #ffdd57 #ffdd57 !important}.button.is-warning.is-outlined.is-loading:hover::after,.button.is-warning.is-outlined.is-loading.is-hovered::after,.button.is-warning.is-outlined.is-loading:focus::after,.button.is-warning.is-outlined.is-loading.is-focused::after{border-color:transparent transparent rgba(0,0,0,0.7) rgba(0,0,0,0.7) !important}.button.is-warning.is-outlined[disabled],fieldset[disabled] .button.is-warning.is-outlined{background-color:transparent;border-color:#ffdd57;box-shadow:none;color:#ffdd57}.button.is-warning.is-inverted.is-outlined{background-color:transparent;border-color:rgba(0,0,0,0.7);color:rgba(0,0,0,0.7)}.button.is-warning.is-inverted.is-outlined:hover,.button.is-warning.is-inverted.is-outlined.is-hovered,.button.is-warning.is-inverted.is-outlined:focus,.button.is-warning.is-inverted.is-outlined.is-focused{background-color:rgba(0,0,0,0.7);color:#ffdd57}.button.is-warning.is-inverted.is-outlined.is-loading:hover::after,.button.is-warning.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-warning.is-inverted.is-outlined.is-loading:focus::after,.button.is-warning.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #ffdd57 #ffdd57 !important}.button.is-warning.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-warning.is-inverted.is-outlined{background-color:transparent;border-color:rgba(0,0,0,0.7);box-shadow:none;color:rgba(0,0,0,0.7)}.button.is-danger{background-color:#da0b00;border-color:transparent;color:#fff}.button.is-danger:hover,.button.is-danger.is-hovered{background-color:#cd0a00;border-color:transparent;color:#fff}.button.is-danger:focus,.button.is-danger.is-focused{border-color:transparent;color:#fff}.button.is-danger:focus:not(:active),.button.is-danger.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(218,11,0,0.25)}.button.is-danger:active,.button.is-danger.is-active{background-color:#c10a00;border-color:transparent;color:#fff}.button.is-danger[disabled],fieldset[disabled] .button.is-danger{background-color:#da0b00;border-color:transparent;box-shadow:none}.button.is-danger.is-inverted{background-color:#fff;color:#da0b00}.button.is-danger.is-inverted:hover,.button.is-danger.is-inverted.is-hovered{background-color:#f2f2f2}.button.is-danger.is-inverted[disabled],fieldset[disabled] .button.is-danger.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#da0b00}.button.is-danger.is-loading::after{border-color:transparent transparent #fff #fff !important}.button.is-danger.is-outlined{background-color:transparent;border-color:#da0b00;color:#da0b00}.button.is-danger.is-outlined:hover,.button.is-danger.is-outlined.is-hovered,.button.is-danger.is-outlined:focus,.button.is-danger.is-outlined.is-focused{background-color:#da0b00;border-color:#da0b00;color:#fff}.button.is-danger.is-outlined.is-loading::after{border-color:transparent transparent #da0b00 #da0b00 !important}.button.is-danger.is-outlined.is-loading:hover::after,.button.is-danger.is-outlined.is-loading.is-hovered::after,.button.is-danger.is-outlined.is-loading:focus::after,.button.is-danger.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #fff #fff !important}.button.is-danger.is-outlined[disabled],fieldset[disabled] .button.is-danger.is-outlined{background-color:transparent;border-color:#da0b00;box-shadow:none;color:#da0b00}.button.is-danger.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}.button.is-danger.is-inverted.is-outlined:hover,.button.is-danger.is-inverted.is-outlined.is-hovered,.button.is-danger.is-inverted.is-outlined:focus,.button.is-danger.is-inverted.is-outlined.is-focused{background-color:#fff;color:#da0b00}.button.is-danger.is-inverted.is-outlined.is-loading:hover::after,.button.is-danger.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-danger.is-inverted.is-outlined.is-loading:focus::after,.button.is-danger.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #da0b00 #da0b00 !important}.button.is-danger.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-danger.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}.button.is-small,#documenter .docs-sidebar form.docs-search>input.button{border-radius:2px;font-size:.75rem}.button.is-normal{font-size:1rem}.button.is-medium{font-size:1.25rem}.button.is-large{font-size:1.5rem}.button[disabled],fieldset[disabled] .button{background-color:#fff;border-color:#dbdbdb;box-shadow:none;opacity:.5}.button.is-fullwidth{display:flex;width:100%}.button.is-loading{color:transparent !important;pointer-events:none}.button.is-loading::after{position:absolute;left:calc(50% - (1em / 2));top:calc(50% - (1em / 2));position:absolute !important}.button.is-static{background-color:#f5f5f5;border-color:#dbdbdb;color:#6b6b6b;box-shadow:none;pointer-events:none}.button.is-rounded,#documenter .docs-sidebar form.docs-search>input.button{border-radius:290486px;padding-left:1em;padding-right:1em}.buttons{align-items:center;display:flex;flex-wrap:wrap;justify-content:flex-start}.buttons .button{margin-bottom:0.5rem}.buttons .button:not(:last-child):not(.is-fullwidth){margin-right:0.5rem}.buttons:last-child{margin-bottom:-0.5rem}.buttons:not(:last-child){margin-bottom:1rem}.buttons.are-small .button:not(.is-normal):not(.is-medium):not(.is-large){border-radius:2px;font-size:.75rem}.buttons.are-medium .button:not(.is-small):not(.is-normal):not(.is-large){font-size:1.25rem}.buttons.are-large .button:not(.is-small):not(.is-normal):not(.is-medium){font-size:1.5rem}.buttons.has-addons .button:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}.buttons.has-addons .button:not(:last-child){border-bottom-right-radius:0;border-top-right-radius:0;margin-right:-1px}.buttons.has-addons .button:last-child{margin-right:0}.buttons.has-addons .button:hover,.buttons.has-addons .button.is-hovered{z-index:2}.buttons.has-addons .button:focus,.buttons.has-addons .button.is-focused,.buttons.has-addons .button:active,.buttons.has-addons .button.is-active,.buttons.has-addons .button.is-selected{z-index:3}.buttons.has-addons .button:focus:hover,.buttons.has-addons .button.is-focused:hover,.buttons.has-addons .button:active:hover,.buttons.has-addons .button.is-active:hover,.buttons.has-addons .button.is-selected:hover{z-index:4}.buttons.has-addons .button.is-expanded{flex-grow:1;flex-shrink:1}.buttons.is-centered{justify-content:center}.buttons.is-centered:not(.has-addons) .button:not(.is-fullwidth){margin-left:0.25rem;margin-right:0.25rem}.buttons.is-right{justify-content:flex-end}.buttons.is-right:not(.has-addons) .button:not(.is-fullwidth){margin-left:0.25rem;margin-right:0.25rem}.container{flex-grow:1;margin:0 auto;position:relative;width:auto}@media screen and (min-width: 1056px){.container{max-width:992px}.container.is-fluid{margin-left:32px;margin-right:32px;max-width:none}}@media screen and (max-width: 1215px){.container.is-widescreen{max-width:1152px}}@media screen and (max-width: 1407px){.container.is-fullhd{max-width:1344px}}@media screen and (min-width: 1216px){.container{max-width:1152px}}@media screen and (min-width: 1408px){.container{max-width:1344px}}.content li+li{margin-top:0.25em}.content p:not(:last-child),.content dl:not(:last-child),.content ol:not(:last-child),.content ul:not(:last-child),.content blockquote:not(:last-child),.content pre:not(:last-child),.content table:not(:last-child){margin-bottom:1em}.content h1,.content h2,.content h3,.content h4,.content h5,.content h6{color:#222;font-weight:600;line-height:1.125}.content h1{font-size:2em;margin-bottom:0.5em}.content h1:not(:first-child){margin-top:1em}.content h2{font-size:1.75em;margin-bottom:0.5714em}.content h2:not(:first-child){margin-top:1.1428em}.content h3{font-size:1.5em;margin-bottom:0.6666em}.content h3:not(:first-child){margin-top:1.3333em}.content h4{font-size:1.25em;margin-bottom:0.8em}.content h5{font-size:1.125em;margin-bottom:0.8888em}.content h6{font-size:1em;margin-bottom:1em}.content blockquote{background-color:#f5f5f5;border-left:5px solid #dbdbdb;padding:1.25em 1.5em}.content ol{list-style-position:outside;margin-left:2em;margin-top:1em}.content ol:not([type]){list-style-type:decimal}.content ol.is-lower-alpha:not([type]){list-style-type:lower-alpha}.content ol.is-lower-roman:not([type]){list-style-type:lower-roman}.content ol.is-upper-alpha:not([type]){list-style-type:upper-alpha}.content ol.is-upper-roman:not([type]){list-style-type:upper-roman}.content ul{list-style:disc outside;margin-left:2em;margin-top:1em}.content ul ul{list-style-type:circle;margin-top:0.5em}.content ul ul ul{list-style-type:square}.content dd{margin-left:2em}.content figure{margin-left:2em;margin-right:2em;text-align:center}.content figure:not(:first-child){margin-top:2em}.content figure:not(:last-child){margin-bottom:2em}.content figure img{display:inline-block}.content figure figcaption{font-style:italic}.content pre{-webkit-overflow-scrolling:touch;overflow-x:auto;padding:0;white-space:pre;word-wrap:normal}.content sup,.content sub{font-size:75%}.content table{width:100%}.content table td,.content table th{border:1px solid #dbdbdb;border-width:0 0 1px;padding:0.5em 0.75em;vertical-align:top}.content table th{color:#222}.content table th:not([align]){text-align:left}.content table thead td,.content table thead th{border-width:0 0 2px;color:#222}.content table tfoot td,.content table tfoot th{border-width:2px 0 0;color:#222}.content table tbody tr:last-child td,.content table tbody tr:last-child th{border-bottom-width:0}.content .tabs li+li{margin-top:0}.content.is-small,#documenter .docs-sidebar form.docs-search>input.content{font-size:.75rem}.content.is-medium{font-size:1.25rem}.content.is-large{font-size:1.5rem}.icon{align-items:center;display:inline-flex;justify-content:center;height:1.5rem;width:1.5rem}.icon.is-small,#documenter .docs-sidebar form.docs-search>input.icon{height:1rem;width:1rem}.icon.is-medium{height:2rem;width:2rem}.icon.is-large{height:3rem;width:3rem}.image,#documenter .docs-sidebar .docs-logo>img{display:block;position:relative}.image img,#documenter .docs-sidebar .docs-logo>img img{display:block;height:auto;width:100%}.image img.is-rounded,#documenter .docs-sidebar .docs-logo>img img.is-rounded{border-radius:290486px}.image.is-square img,#documenter .docs-sidebar .docs-logo>img.is-square img,.image.is-square .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-square .has-ratio,.image.is-1by1 img,#documenter .docs-sidebar .docs-logo>img.is-1by1 img,.image.is-1by1 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-1by1 .has-ratio,.image.is-5by4 img,#documenter .docs-sidebar .docs-logo>img.is-5by4 img,.image.is-5by4 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-5by4 .has-ratio,.image.is-4by3 img,#documenter .docs-sidebar .docs-logo>img.is-4by3 img,.image.is-4by3 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-4by3 .has-ratio,.image.is-3by2 img,#documenter .docs-sidebar .docs-logo>img.is-3by2 img,.image.is-3by2 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-3by2 .has-ratio,.image.is-5by3 img,#documenter .docs-sidebar .docs-logo>img.is-5by3 img,.image.is-5by3 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-5by3 .has-ratio,.image.is-16by9 img,#documenter .docs-sidebar .docs-logo>img.is-16by9 img,.image.is-16by9 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-16by9 .has-ratio,.image.is-2by1 img,#documenter .docs-sidebar .docs-logo>img.is-2by1 img,.image.is-2by1 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-2by1 .has-ratio,.image.is-3by1 img,#documenter .docs-sidebar .docs-logo>img.is-3by1 img,.image.is-3by1 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-3by1 .has-ratio,.image.is-4by5 img,#documenter .docs-sidebar .docs-logo>img.is-4by5 img,.image.is-4by5 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-4by5 .has-ratio,.image.is-3by4 img,#documenter .docs-sidebar .docs-logo>img.is-3by4 img,.image.is-3by4 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-3by4 .has-ratio,.image.is-2by3 img,#documenter .docs-sidebar .docs-logo>img.is-2by3 img,.image.is-2by3 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-2by3 .has-ratio,.image.is-3by5 img,#documenter .docs-sidebar .docs-logo>img.is-3by5 img,.image.is-3by5 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-3by5 .has-ratio,.image.is-9by16 img,#documenter .docs-sidebar .docs-logo>img.is-9by16 img,.image.is-9by16 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-9by16 .has-ratio,.image.is-1by2 img,#documenter .docs-sidebar .docs-logo>img.is-1by2 img,.image.is-1by2 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-1by2 .has-ratio,.image.is-1by3 img,#documenter .docs-sidebar .docs-logo>img.is-1by3 img,.image.is-1by3 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-1by3 .has-ratio{height:100%;width:100%}.image.is-square,#documenter .docs-sidebar .docs-logo>img.is-square,.image.is-1by1,#documenter .docs-sidebar .docs-logo>img.is-1by1{padding-top:100%}.image.is-5by4,#documenter .docs-sidebar .docs-logo>img.is-5by4{padding-top:80%}.image.is-4by3,#documenter .docs-sidebar .docs-logo>img.is-4by3{padding-top:75%}.image.is-3by2,#documenter .docs-sidebar .docs-logo>img.is-3by2{padding-top:66.6666%}.image.is-5by3,#documenter .docs-sidebar .docs-logo>img.is-5by3{padding-top:60%}.image.is-16by9,#documenter .docs-sidebar .docs-logo>img.is-16by9{padding-top:56.25%}.image.is-2by1,#documenter .docs-sidebar .docs-logo>img.is-2by1{padding-top:50%}.image.is-3by1,#documenter .docs-sidebar .docs-logo>img.is-3by1{padding-top:33.3333%}.image.is-4by5,#documenter .docs-sidebar .docs-logo>img.is-4by5{padding-top:125%}.image.is-3by4,#documenter .docs-sidebar .docs-logo>img.is-3by4{padding-top:133.3333%}.image.is-2by3,#documenter .docs-sidebar .docs-logo>img.is-2by3{padding-top:150%}.image.is-3by5,#documenter .docs-sidebar .docs-logo>img.is-3by5{padding-top:166.6666%}.image.is-9by16,#documenter .docs-sidebar .docs-logo>img.is-9by16{padding-top:177.7777%}.image.is-1by2,#documenter .docs-sidebar .docs-logo>img.is-1by2{padding-top:200%}.image.is-1by3,#documenter .docs-sidebar .docs-logo>img.is-1by3{padding-top:300%}.image.is-16x16,#documenter .docs-sidebar .docs-logo>img.is-16x16{height:16px;width:16px}.image.is-24x24,#documenter .docs-sidebar .docs-logo>img.is-24x24{height:24px;width:24px}.image.is-32x32,#documenter .docs-sidebar .docs-logo>img.is-32x32{height:32px;width:32px}.image.is-48x48,#documenter .docs-sidebar .docs-logo>img.is-48x48{height:48px;width:48px}.image.is-64x64,#documenter .docs-sidebar .docs-logo>img.is-64x64{height:64px;width:64px}.image.is-96x96,#documenter .docs-sidebar .docs-logo>img.is-96x96{height:96px;width:96px}.image.is-128x128,#documenter .docs-sidebar .docs-logo>img.is-128x128{height:128px;width:128px}.notification{background-color:#f5f5f5;border-radius:4px;padding:1.25rem 2.5rem 1.25rem 1.5rem;position:relative}.notification a:not(.button):not(.dropdown-item){color:currentColor;text-decoration:underline}.notification strong{color:currentColor}.notification code,.notification pre{background:#fff}.notification pre code{background:transparent}.notification>.delete{position:absolute;right:0.5rem;top:0.5rem}.notification .title,.notification .subtitle,.notification .content{color:currentColor}.notification.is-white{background-color:#fff;color:#0a0a0a}.notification.is-black{background-color:#0a0a0a;color:#fff}.notification.is-light{background-color:#f5f5f5;color:#363636}.notification.is-dark,.content kbd.notification{background-color:#363636;color:#f5f5f5}.notification.is-primary,.docstring>section>a.notification.docs-sourcelink{background-color:#4eb5de;color:#fff}.notification.is-link{background-color:#2e63b8;color:#fff}.notification.is-info{background-color:#209cee;color:#fff}.notification.is-success{background-color:#22c35b;color:#fff}.notification.is-warning{background-color:#ffdd57;color:rgba(0,0,0,0.7)}.notification.is-danger{background-color:#da0b00;color:#fff}.progress{-moz-appearance:none;-webkit-appearance:none;border:none;border-radius:290486px;display:block;height:1rem;overflow:hidden;padding:0;width:100%}.progress::-webkit-progress-bar{background-color:#dbdbdb}.progress::-webkit-progress-value{background-color:#222}.progress::-moz-progress-bar{background-color:#222}.progress::-ms-fill{background-color:#222;border:none}.progress.is-white::-webkit-progress-value{background-color:#fff}.progress.is-white::-moz-progress-bar{background-color:#fff}.progress.is-white::-ms-fill{background-color:#fff}.progress.is-white:indeterminate{background-image:linear-gradient(to right, #fff 30%, #dbdbdb 30%)}.progress.is-black::-webkit-progress-value{background-color:#0a0a0a}.progress.is-black::-moz-progress-bar{background-color:#0a0a0a}.progress.is-black::-ms-fill{background-color:#0a0a0a}.progress.is-black:indeterminate{background-image:linear-gradient(to right, #0a0a0a 30%, #dbdbdb 30%)}.progress.is-light::-webkit-progress-value{background-color:#f5f5f5}.progress.is-light::-moz-progress-bar{background-color:#f5f5f5}.progress.is-light::-ms-fill{background-color:#f5f5f5}.progress.is-light:indeterminate{background-image:linear-gradient(to right, #f5f5f5 30%, #dbdbdb 30%)}.progress.is-dark::-webkit-progress-value,.content kbd.progress::-webkit-progress-value{background-color:#363636}.progress.is-dark::-moz-progress-bar,.content kbd.progress::-moz-progress-bar{background-color:#363636}.progress.is-dark::-ms-fill,.content kbd.progress::-ms-fill{background-color:#363636}.progress.is-dark:indeterminate,.content kbd.progress:indeterminate{background-image:linear-gradient(to right, #363636 30%, #dbdbdb 30%)}.progress.is-primary::-webkit-progress-value,.docstring>section>a.progress.docs-sourcelink::-webkit-progress-value{background-color:#4eb5de}.progress.is-primary::-moz-progress-bar,.docstring>section>a.progress.docs-sourcelink::-moz-progress-bar{background-color:#4eb5de}.progress.is-primary::-ms-fill,.docstring>section>a.progress.docs-sourcelink::-ms-fill{background-color:#4eb5de}.progress.is-primary:indeterminate,.docstring>section>a.progress.docs-sourcelink:indeterminate{background-image:linear-gradient(to right, #4eb5de 30%, #dbdbdb 30%)}.progress.is-link::-webkit-progress-value{background-color:#2e63b8}.progress.is-link::-moz-progress-bar{background-color:#2e63b8}.progress.is-link::-ms-fill{background-color:#2e63b8}.progress.is-link:indeterminate{background-image:linear-gradient(to right, #2e63b8 30%, #dbdbdb 30%)}.progress.is-info::-webkit-progress-value{background-color:#209cee}.progress.is-info::-moz-progress-bar{background-color:#209cee}.progress.is-info::-ms-fill{background-color:#209cee}.progress.is-info:indeterminate{background-image:linear-gradient(to right, #209cee 30%, #dbdbdb 30%)}.progress.is-success::-webkit-progress-value{background-color:#22c35b}.progress.is-success::-moz-progress-bar{background-color:#22c35b}.progress.is-success::-ms-fill{background-color:#22c35b}.progress.is-success:indeterminate{background-image:linear-gradient(to right, #22c35b 30%, #dbdbdb 30%)}.progress.is-warning::-webkit-progress-value{background-color:#ffdd57}.progress.is-warning::-moz-progress-bar{background-color:#ffdd57}.progress.is-warning::-ms-fill{background-color:#ffdd57}.progress.is-warning:indeterminate{background-image:linear-gradient(to right, #ffdd57 30%, #dbdbdb 30%)}.progress.is-danger::-webkit-progress-value{background-color:#da0b00}.progress.is-danger::-moz-progress-bar{background-color:#da0b00}.progress.is-danger::-ms-fill{background-color:#da0b00}.progress.is-danger:indeterminate{background-image:linear-gradient(to right, #da0b00 30%, #dbdbdb 30%)}.progress:indeterminate{animation-duration:1.5s;animation-iteration-count:infinite;animation-name:moveIndeterminate;animation-timing-function:linear;background-color:#dbdbdb;background-image:linear-gradient(to right, #222 30%, #dbdbdb 30%);background-position:top left;background-repeat:no-repeat;background-size:150% 150%}.progress:indeterminate::-webkit-progress-bar{background-color:transparent}.progress:indeterminate::-moz-progress-bar{background-color:transparent}.progress.is-small,#documenter .docs-sidebar form.docs-search>input.progress{height:.75rem}.progress.is-medium{height:1.25rem}.progress.is-large{height:1.5rem}@keyframes moveIndeterminate{from{background-position:200% 0}to{background-position:-200% 0}}.table{background-color:#fff;color:#363636}.table td,.table th{border:1px solid #dbdbdb;border-width:0 0 1px;padding:0.5em 0.75em;vertical-align:top}.table td.is-white,.table th.is-white{background-color:#fff;border-color:#fff;color:#0a0a0a}.table td.is-black,.table th.is-black{background-color:#0a0a0a;border-color:#0a0a0a;color:#fff}.table td.is-light,.table th.is-light{background-color:#f5f5f5;border-color:#f5f5f5;color:#363636}.table td.is-dark,.table th.is-dark{background-color:#363636;border-color:#363636;color:#f5f5f5}.table td.is-primary,.table th.is-primary{background-color:#4eb5de;border-color:#4eb5de;color:#fff}.table td.is-link,.table th.is-link{background-color:#2e63b8;border-color:#2e63b8;color:#fff}.table td.is-info,.table th.is-info{background-color:#209cee;border-color:#209cee;color:#fff}.table td.is-success,.table th.is-success{background-color:#22c35b;border-color:#22c35b;color:#fff}.table td.is-warning,.table th.is-warning{background-color:#ffdd57;border-color:#ffdd57;color:rgba(0,0,0,0.7)}.table td.is-danger,.table th.is-danger{background-color:#da0b00;border-color:#da0b00;color:#fff}.table td.is-narrow,.table th.is-narrow{white-space:nowrap;width:1%}.table td.is-selected,.table th.is-selected{background-color:#4eb5de;color:#fff}.table td.is-selected a,.table td.is-selected strong,.table th.is-selected a,.table th.is-selected strong{color:currentColor}.table th{color:#222}.table th:not([align]){text-align:left}.table tr.is-selected{background-color:#4eb5de;color:#fff}.table tr.is-selected a,.table tr.is-selected strong{color:currentColor}.table tr.is-selected td,.table tr.is-selected th{border-color:#fff;color:currentColor}.table thead{background-color:rgba(0,0,0,0)}.table thead td,.table thead th{border-width:0 0 2px;color:#222}.table tfoot{background-color:rgba(0,0,0,0)}.table tfoot td,.table tfoot th{border-width:2px 0 0;color:#222}.table tbody{background-color:rgba(0,0,0,0)}.table tbody tr:last-child td,.table tbody tr:last-child th{border-bottom-width:0}.table.is-bordered td,.table.is-bordered th{border-width:1px}.table.is-bordered tr:last-child td,.table.is-bordered tr:last-child th{border-bottom-width:1px}.table.is-fullwidth{width:100%}.table.is-hoverable tbody tr:not(.is-selected):hover{background-color:#fafafa}.table.is-hoverable.is-striped tbody tr:not(.is-selected):hover{background-color:#fafafa}.table.is-hoverable.is-striped tbody tr:not(.is-selected):hover:nth-child(even){background-color:#f5f5f5}.table.is-narrow td,.table.is-narrow th{padding:0.25em 0.5em}.table.is-striped tbody tr:not(.is-selected):nth-child(even){background-color:#fafafa}.table-container{-webkit-overflow-scrolling:touch;overflow:auto;overflow-y:hidden;max-width:100%}.tags{align-items:center;display:flex;flex-wrap:wrap;justify-content:flex-start}.tags .tag,.tags .content kbd,.content .tags kbd,.tags .docstring>section>a.docs-sourcelink{margin-bottom:0.5rem}.tags .tag:not(:last-child),.tags .content kbd:not(:last-child),.content .tags kbd:not(:last-child),.tags .docstring>section>a.docs-sourcelink:not(:last-child){margin-right:0.5rem}.tags:last-child{margin-bottom:-0.5rem}.tags:not(:last-child){margin-bottom:1rem}.tags.are-medium .tag:not(.is-normal):not(.is-large),.tags.are-medium .content kbd:not(.is-normal):not(.is-large),.content .tags.are-medium kbd:not(.is-normal):not(.is-large),.tags.are-medium .docstring>section>a.docs-sourcelink:not(.is-normal):not(.is-large){font-size:1rem}.tags.are-large .tag:not(.is-normal):not(.is-medium),.tags.are-large .content kbd:not(.is-normal):not(.is-medium),.content .tags.are-large kbd:not(.is-normal):not(.is-medium),.tags.are-large .docstring>section>a.docs-sourcelink:not(.is-normal):not(.is-medium){font-size:1.25rem}.tags.is-centered{justify-content:center}.tags.is-centered .tag,.tags.is-centered .content kbd,.content .tags.is-centered kbd,.tags.is-centered .docstring>section>a.docs-sourcelink{margin-right:0.25rem;margin-left:0.25rem}.tags.is-right{justify-content:flex-end}.tags.is-right .tag:not(:first-child),.tags.is-right .content kbd:not(:first-child),.content .tags.is-right kbd:not(:first-child),.tags.is-right .docstring>section>a.docs-sourcelink:not(:first-child){margin-left:0.5rem}.tags.is-right .tag:not(:last-child),.tags.is-right .content kbd:not(:last-child),.content .tags.is-right kbd:not(:last-child),.tags.is-right .docstring>section>a.docs-sourcelink:not(:last-child){margin-right:0}.tags.has-addons .tag,.tags.has-addons .content kbd,.content .tags.has-addons kbd,.tags.has-addons .docstring>section>a.docs-sourcelink{margin-right:0}.tags.has-addons .tag:not(:first-child),.tags.has-addons .content kbd:not(:first-child),.content .tags.has-addons kbd:not(:first-child),.tags.has-addons .docstring>section>a.docs-sourcelink:not(:first-child){margin-left:0;border-bottom-left-radius:0;border-top-left-radius:0}.tags.has-addons .tag:not(:last-child),.tags.has-addons .content kbd:not(:last-child),.content .tags.has-addons kbd:not(:last-child),.tags.has-addons .docstring>section>a.docs-sourcelink:not(:last-child){border-bottom-right-radius:0;border-top-right-radius:0}.tag:not(body),.content kbd:not(body),.docstring>section>a.docs-sourcelink:not(body){align-items:center;background-color:#f5f5f5;border-radius:4px;color:#222;display:inline-flex;font-size:.75rem;height:2em;justify-content:center;line-height:1.5;padding-left:0.75em;padding-right:0.75em;white-space:nowrap}.tag:not(body) .delete,.content kbd:not(body) .delete,.docstring>section>a.docs-sourcelink:not(body) .delete{margin-left:0.25rem;margin-right:-0.375rem}.tag.is-white:not(body),.content kbd.is-white:not(body),.docstring>section>a.docs-sourcelink.is-white:not(body){background-color:#fff;color:#0a0a0a}.tag.is-black:not(body),.content kbd.is-black:not(body),.docstring>section>a.docs-sourcelink.is-black:not(body){background-color:#0a0a0a;color:#fff}.tag.is-light:not(body),.content kbd.is-light:not(body),.docstring>section>a.docs-sourcelink.is-light:not(body){background-color:#f5f5f5;color:#363636}.tag.is-dark:not(body),.content kbd:not(body),.docstring>section>a.docs-sourcelink.is-dark:not(body),.content .docstring>section>kbd:not(body){background-color:#363636;color:#f5f5f5}.tag.is-primary:not(body),.content kbd.is-primary:not(body),.docstring>section>a.docs-sourcelink:not(body){background-color:#4eb5de;color:#fff}.tag.is-link:not(body),.content kbd.is-link:not(body),.docstring>section>a.docs-sourcelink.is-link:not(body){background-color:#2e63b8;color:#fff}.tag.is-info:not(body),.content kbd.is-info:not(body),.docstring>section>a.docs-sourcelink.is-info:not(body){background-color:#209cee;color:#fff}.tag.is-success:not(body),.content kbd.is-success:not(body),.docstring>section>a.docs-sourcelink.is-success:not(body){background-color:#22c35b;color:#fff}.tag.is-warning:not(body),.content kbd.is-warning:not(body),.docstring>section>a.docs-sourcelink.is-warning:not(body){background-color:#ffdd57;color:rgba(0,0,0,0.7)}.tag.is-danger:not(body),.content kbd.is-danger:not(body),.docstring>section>a.docs-sourcelink.is-danger:not(body){background-color:#da0b00;color:#fff}.tag.is-normal:not(body),.content kbd.is-normal:not(body),.docstring>section>a.docs-sourcelink.is-normal:not(body){font-size:.75rem}.tag.is-medium:not(body),.content kbd.is-medium:not(body),.docstring>section>a.docs-sourcelink.is-medium:not(body){font-size:1rem}.tag.is-large:not(body),.content kbd.is-large:not(body),.docstring>section>a.docs-sourcelink.is-large:not(body){font-size:1.25rem}.tag:not(body) .icon:first-child:not(:last-child),.content kbd:not(body) .icon:first-child:not(:last-child),.docstring>section>a.docs-sourcelink:not(body) .icon:first-child:not(:last-child){margin-left:-0.375em;margin-right:0.1875em}.tag:not(body) .icon:last-child:not(:first-child),.content kbd:not(body) .icon:last-child:not(:first-child),.docstring>section>a.docs-sourcelink:not(body) .icon:last-child:not(:first-child){margin-left:0.1875em;margin-right:-0.375em}.tag:not(body) .icon:first-child:last-child,.content kbd:not(body) .icon:first-child:last-child,.docstring>section>a.docs-sourcelink:not(body) .icon:first-child:last-child{margin-left:-0.375em;margin-right:-0.375em}.tag.is-delete:not(body),.content kbd.is-delete:not(body),.docstring>section>a.docs-sourcelink.is-delete:not(body){margin-left:1px;padding:0;position:relative;width:2em}.tag.is-delete:not(body)::before,.content kbd.is-delete:not(body)::before,.docstring>section>a.docs-sourcelink.is-delete:not(body)::before,.tag.is-delete:not(body)::after,.content kbd.is-delete:not(body)::after,.docstring>section>a.docs-sourcelink.is-delete:not(body)::after{background-color:currentColor;content:"";display:block;left:50%;position:absolute;top:50%;transform:translateX(-50%) translateY(-50%) rotate(45deg);transform-origin:center center}.tag.is-delete:not(body)::before,.content kbd.is-delete:not(body)::before,.docstring>section>a.docs-sourcelink.is-delete:not(body)::before{height:1px;width:50%}.tag.is-delete:not(body)::after,.content kbd.is-delete:not(body)::after,.docstring>section>a.docs-sourcelink.is-delete:not(body)::after{height:50%;width:1px}.tag.is-delete:not(body):hover,.content kbd.is-delete:not(body):hover,.docstring>section>a.docs-sourcelink.is-delete:not(body):hover,.tag.is-delete:not(body):focus,.content kbd.is-delete:not(body):focus,.docstring>section>a.docs-sourcelink.is-delete:not(body):focus{background-color:#e8e8e8}.tag.is-delete:not(body):active,.content kbd.is-delete:not(body):active,.docstring>section>a.docs-sourcelink.is-delete:not(body):active{background-color:#dbdbdb}.tag.is-rounded:not(body),#documenter .docs-sidebar form.docs-search>input:not(body),.content kbd.is-rounded:not(body),#documenter .docs-sidebar .content form.docs-search>input:not(body),.docstring>section>a.docs-sourcelink.is-rounded:not(body){border-radius:290486px}a.tag:hover,.docstring>section>a.docs-sourcelink:hover{text-decoration:underline}.title,.subtitle{word-break:break-word}.title em,.title span,.subtitle em,.subtitle span{font-weight:inherit}.title sub,.subtitle sub{font-size:.75em}.title sup,.subtitle sup{font-size:.75em}.title .tag,.title .content kbd,.content .title kbd,.title .docstring>section>a.docs-sourcelink,.subtitle .tag,.subtitle .content kbd,.content .subtitle kbd,.subtitle .docstring>section>a.docs-sourcelink{vertical-align:middle}.title{color:#363636;font-size:2rem;font-weight:600;line-height:1.125}.title strong{color:inherit;font-weight:inherit}.title+.highlight{margin-top:-0.75rem}.title:not(.is-spaced)+.subtitle{margin-top:-1.25rem}.title.is-1{font-size:3rem}.title.is-2{font-size:2.5rem}.title.is-3{font-size:2rem}.title.is-4{font-size:1.5rem}.title.is-5{font-size:1.25rem}.title.is-6{font-size:1rem}.title.is-7{font-size:.75rem}.subtitle{color:#4a4a4a;font-size:1.25rem;font-weight:400;line-height:1.25}.subtitle strong{color:#363636;font-weight:600}.subtitle:not(.is-spaced)+.title{margin-top:-1.25rem}.subtitle.is-1{font-size:3rem}.subtitle.is-2{font-size:2.5rem}.subtitle.is-3{font-size:2rem}.subtitle.is-4{font-size:1.5rem}.subtitle.is-5{font-size:1.25rem}.subtitle.is-6{font-size:1rem}.subtitle.is-7{font-size:.75rem}.heading{display:block;font-size:11px;letter-spacing:1px;margin-bottom:5px;text-transform:uppercase}.highlight{font-weight:400;max-width:100%;overflow:hidden;padding:0}.highlight pre{overflow:auto;max-width:100%}.number{align-items:center;background-color:#f5f5f5;border-radius:290486px;display:inline-flex;font-size:1.25rem;height:2em;justify-content:center;margin-right:1.5rem;min-width:2.5em;padding:0.25rem 0.5rem;text-align:center;vertical-align:top}.select select,.textarea,.input,#documenter .docs-sidebar form.docs-search>input{background-color:#fff;border-color:#dbdbdb;border-radius:4px;color:#363636}.select select::-moz-placeholder,.textarea::-moz-placeholder,.input::-moz-placeholder,#documenter .docs-sidebar form.docs-search>input::-moz-placeholder{color:rgba(54,54,54,0.3)}.select select::-webkit-input-placeholder,.textarea::-webkit-input-placeholder,.input::-webkit-input-placeholder,#documenter .docs-sidebar form.docs-search>input::-webkit-input-placeholder{color:rgba(54,54,54,0.3)}.select select:-moz-placeholder,.textarea:-moz-placeholder,.input:-moz-placeholder,#documenter .docs-sidebar form.docs-search>input:-moz-placeholder{color:rgba(54,54,54,0.3)}.select select:-ms-input-placeholder,.textarea:-ms-input-placeholder,.input:-ms-input-placeholder,#documenter .docs-sidebar form.docs-search>input:-ms-input-placeholder{color:rgba(54,54,54,0.3)}.select select:hover,.textarea:hover,.input:hover,#documenter .docs-sidebar form.docs-search>input:hover,.select select.is-hovered,.is-hovered.textarea,.is-hovered.input,#documenter .docs-sidebar form.docs-search>input.is-hovered{border-color:#b5b5b5}.select select:focus,.textarea:focus,.input:focus,#documenter .docs-sidebar form.docs-search>input:focus,.select select.is-focused,.is-focused.textarea,.is-focused.input,#documenter .docs-sidebar form.docs-search>input.is-focused,.select select:active,.textarea:active,.input:active,#documenter .docs-sidebar form.docs-search>input:active,.select select.is-active,.is-active.textarea,.is-active.input,#documenter .docs-sidebar form.docs-search>input.is-active{border-color:#2e63b8;box-shadow:0 0 0 0.125em rgba(46,99,184,0.25)}.select select[disabled],.textarea[disabled],.input[disabled],#documenter .docs-sidebar form.docs-search>input[disabled],fieldset[disabled] .select select,.select fieldset[disabled] select,fieldset[disabled] .textarea,fieldset[disabled] .input,fieldset[disabled] #documenter .docs-sidebar form.docs-search>input,#documenter .docs-sidebar fieldset[disabled] form.docs-search>input{background-color:#f5f5f5;border-color:#f5f5f5;box-shadow:none;color:#6b6b6b}.select select[disabled]::-moz-placeholder,.textarea[disabled]::-moz-placeholder,.input[disabled]::-moz-placeholder,#documenter .docs-sidebar form.docs-search>input[disabled]::-moz-placeholder,fieldset[disabled] .select select::-moz-placeholder,.select fieldset[disabled] select::-moz-placeholder,fieldset[disabled] .textarea::-moz-placeholder,fieldset[disabled] .input::-moz-placeholder,fieldset[disabled] #documenter .docs-sidebar form.docs-search>input::-moz-placeholder,#documenter .docs-sidebar fieldset[disabled] form.docs-search>input::-moz-placeholder{color:rgba(107,107,107,0.3)}.select select[disabled]::-webkit-input-placeholder,.textarea[disabled]::-webkit-input-placeholder,.input[disabled]::-webkit-input-placeholder,#documenter .docs-sidebar form.docs-search>input[disabled]::-webkit-input-placeholder,fieldset[disabled] .select select::-webkit-input-placeholder,.select fieldset[disabled] select::-webkit-input-placeholder,fieldset[disabled] .textarea::-webkit-input-placeholder,fieldset[disabled] .input::-webkit-input-placeholder,fieldset[disabled] #documenter .docs-sidebar form.docs-search>input::-webkit-input-placeholder,#documenter .docs-sidebar fieldset[disabled] form.docs-search>input::-webkit-input-placeholder{color:rgba(107,107,107,0.3)}.select select[disabled]:-moz-placeholder,.textarea[disabled]:-moz-placeholder,.input[disabled]:-moz-placeholder,#documenter .docs-sidebar form.docs-search>input[disabled]:-moz-placeholder,fieldset[disabled] .select select:-moz-placeholder,.select fieldset[disabled] select:-moz-placeholder,fieldset[disabled] .textarea:-moz-placeholder,fieldset[disabled] .input:-moz-placeholder,fieldset[disabled] #documenter .docs-sidebar form.docs-search>input:-moz-placeholder,#documenter .docs-sidebar fieldset[disabled] form.docs-search>input:-moz-placeholder{color:rgba(107,107,107,0.3)}.select select[disabled]:-ms-input-placeholder,.textarea[disabled]:-ms-input-placeholder,.input[disabled]:-ms-input-placeholder,#documenter .docs-sidebar form.docs-search>input[disabled]:-ms-input-placeholder,fieldset[disabled] .select select:-ms-input-placeholder,.select fieldset[disabled] select:-ms-input-placeholder,fieldset[disabled] .textarea:-ms-input-placeholder,fieldset[disabled] .input:-ms-input-placeholder,fieldset[disabled] #documenter .docs-sidebar form.docs-search>input:-ms-input-placeholder,#documenter .docs-sidebar fieldset[disabled] form.docs-search>input:-ms-input-placeholder{color:rgba(107,107,107,0.3)}.textarea,.input,#documenter .docs-sidebar form.docs-search>input{box-shadow:inset 0 1px 2px rgba(10,10,10,0.1);max-width:100%;width:100%}.textarea[readonly],.input[readonly],#documenter .docs-sidebar form.docs-search>input[readonly]{box-shadow:none}.is-white.textarea,.is-white.input,#documenter .docs-sidebar form.docs-search>input.is-white{border-color:#fff}.is-white.textarea:focus,.is-white.input:focus,#documenter .docs-sidebar form.docs-search>input.is-white:focus,.is-white.is-focused.textarea,.is-white.is-focused.input,#documenter .docs-sidebar form.docs-search>input.is-focused,.is-white.textarea:active,.is-white.input:active,#documenter .docs-sidebar form.docs-search>input.is-white:active,.is-white.is-active.textarea,.is-white.is-active.input,#documenter .docs-sidebar form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(255,255,255,0.25)}.is-black.textarea,.is-black.input,#documenter .docs-sidebar form.docs-search>input.is-black{border-color:#0a0a0a}.is-black.textarea:focus,.is-black.input:focus,#documenter .docs-sidebar form.docs-search>input.is-black:focus,.is-black.is-focused.textarea,.is-black.is-focused.input,#documenter .docs-sidebar form.docs-search>input.is-focused,.is-black.textarea:active,.is-black.input:active,#documenter .docs-sidebar form.docs-search>input.is-black:active,.is-black.is-active.textarea,.is-black.is-active.input,#documenter .docs-sidebar form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(10,10,10,0.25)}.is-light.textarea,.is-light.input,#documenter .docs-sidebar form.docs-search>input.is-light{border-color:#f5f5f5}.is-light.textarea:focus,.is-light.input:focus,#documenter .docs-sidebar form.docs-search>input.is-light:focus,.is-light.is-focused.textarea,.is-light.is-focused.input,#documenter .docs-sidebar form.docs-search>input.is-focused,.is-light.textarea:active,.is-light.input:active,#documenter .docs-sidebar form.docs-search>input.is-light:active,.is-light.is-active.textarea,.is-light.is-active.input,#documenter .docs-sidebar form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(245,245,245,0.25)}.is-dark.textarea,.content kbd.textarea,.is-dark.input,#documenter .docs-sidebar form.docs-search>input.is-dark,.content kbd.input{border-color:#363636}.is-dark.textarea:focus,.content kbd.textarea:focus,.is-dark.input:focus,#documenter .docs-sidebar form.docs-search>input.is-dark:focus,.content kbd.input:focus,.is-dark.is-focused.textarea,.content kbd.is-focused.textarea,.is-dark.is-focused.input,#documenter .docs-sidebar form.docs-search>input.is-focused,.content kbd.is-focused.input,#documenter .docs-sidebar .content form.docs-search>input.is-focused,.is-dark.textarea:active,.content kbd.textarea:active,.is-dark.input:active,#documenter .docs-sidebar form.docs-search>input.is-dark:active,.content kbd.input:active,.is-dark.is-active.textarea,.content kbd.is-active.textarea,.is-dark.is-active.input,#documenter .docs-sidebar form.docs-search>input.is-active,.content kbd.is-active.input,#documenter .docs-sidebar .content form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(54,54,54,0.25)}.is-primary.textarea,.docstring>section>a.textarea.docs-sourcelink,.is-primary.input,#documenter .docs-sidebar form.docs-search>input.is-primary,.docstring>section>a.input.docs-sourcelink{border-color:#4eb5de}.is-primary.textarea:focus,.docstring>section>a.textarea.docs-sourcelink:focus,.is-primary.input:focus,#documenter .docs-sidebar form.docs-search>input.is-primary:focus,.docstring>section>a.input.docs-sourcelink:focus,.is-primary.is-focused.textarea,.docstring>section>a.is-focused.textarea.docs-sourcelink,.is-primary.is-focused.input,#documenter .docs-sidebar form.docs-search>input.is-focused,.docstring>section>a.is-focused.input.docs-sourcelink,.is-primary.textarea:active,.docstring>section>a.textarea.docs-sourcelink:active,.is-primary.input:active,#documenter .docs-sidebar form.docs-search>input.is-primary:active,.docstring>section>a.input.docs-sourcelink:active,.is-primary.is-active.textarea,.docstring>section>a.is-active.textarea.docs-sourcelink,.is-primary.is-active.input,#documenter .docs-sidebar form.docs-search>input.is-active,.docstring>section>a.is-active.input.docs-sourcelink{box-shadow:0 0 0 0.125em rgba(78,181,222,0.25)}.is-link.textarea,.is-link.input,#documenter .docs-sidebar form.docs-search>input.is-link{border-color:#2e63b8}.is-link.textarea:focus,.is-link.input:focus,#documenter .docs-sidebar form.docs-search>input.is-link:focus,.is-link.is-focused.textarea,.is-link.is-focused.input,#documenter .docs-sidebar form.docs-search>input.is-focused,.is-link.textarea:active,.is-link.input:active,#documenter .docs-sidebar form.docs-search>input.is-link:active,.is-link.is-active.textarea,.is-link.is-active.input,#documenter .docs-sidebar form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(46,99,184,0.25)}.is-info.textarea,.is-info.input,#documenter .docs-sidebar form.docs-search>input.is-info{border-color:#209cee}.is-info.textarea:focus,.is-info.input:focus,#documenter .docs-sidebar form.docs-search>input.is-info:focus,.is-info.is-focused.textarea,.is-info.is-focused.input,#documenter .docs-sidebar form.docs-search>input.is-focused,.is-info.textarea:active,.is-info.input:active,#documenter .docs-sidebar form.docs-search>input.is-info:active,.is-info.is-active.textarea,.is-info.is-active.input,#documenter .docs-sidebar form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(32,156,238,0.25)}.is-success.textarea,.is-success.input,#documenter .docs-sidebar form.docs-search>input.is-success{border-color:#22c35b}.is-success.textarea:focus,.is-success.input:focus,#documenter .docs-sidebar form.docs-search>input.is-success:focus,.is-success.is-focused.textarea,.is-success.is-focused.input,#documenter .docs-sidebar form.docs-search>input.is-focused,.is-success.textarea:active,.is-success.input:active,#documenter .docs-sidebar form.docs-search>input.is-success:active,.is-success.is-active.textarea,.is-success.is-active.input,#documenter .docs-sidebar form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(34,195,91,0.25)}.is-warning.textarea,.is-warning.input,#documenter .docs-sidebar form.docs-search>input.is-warning{border-color:#ffdd57}.is-warning.textarea:focus,.is-warning.input:focus,#documenter .docs-sidebar form.docs-search>input.is-warning:focus,.is-warning.is-focused.textarea,.is-warning.is-focused.input,#documenter .docs-sidebar form.docs-search>input.is-focused,.is-warning.textarea:active,.is-warning.input:active,#documenter .docs-sidebar form.docs-search>input.is-warning:active,.is-warning.is-active.textarea,.is-warning.is-active.input,#documenter .docs-sidebar form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(255,221,87,0.25)}.is-danger.textarea,.is-danger.input,#documenter .docs-sidebar form.docs-search>input.is-danger{border-color:#da0b00}.is-danger.textarea:focus,.is-danger.input:focus,#documenter .docs-sidebar form.docs-search>input.is-danger:focus,.is-danger.is-focused.textarea,.is-danger.is-focused.input,#documenter .docs-sidebar form.docs-search>input.is-focused,.is-danger.textarea:active,.is-danger.input:active,#documenter .docs-sidebar form.docs-search>input.is-danger:active,.is-danger.is-active.textarea,.is-danger.is-active.input,#documenter .docs-sidebar form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(218,11,0,0.25)}.is-small.textarea,.is-small.input,#documenter .docs-sidebar form.docs-search>input{border-radius:2px;font-size:.75rem}.is-medium.textarea,.is-medium.input,#documenter .docs-sidebar form.docs-search>input.is-medium{font-size:1.25rem}.is-large.textarea,.is-large.input,#documenter .docs-sidebar form.docs-search>input.is-large{font-size:1.5rem}.is-fullwidth.textarea,.is-fullwidth.input,#documenter .docs-sidebar form.docs-search>input.is-fullwidth{display:block;width:100%}.is-inline.textarea,.is-inline.input,#documenter .docs-sidebar form.docs-search>input.is-inline{display:inline;width:auto}.input.is-rounded,#documenter .docs-sidebar form.docs-search>input{border-radius:290486px;padding-left:1em;padding-right:1em}.input.is-static,#documenter .docs-sidebar form.docs-search>input.is-static{background-color:transparent;border-color:transparent;box-shadow:none;padding-left:0;padding-right:0}.textarea{display:block;max-width:100%;min-width:100%;padding:0.625em;resize:vertical}.textarea:not([rows]){max-height:600px;min-height:120px}.textarea[rows]{height:initial}.textarea.has-fixed-size{resize:none}.radio,.checkbox{cursor:pointer;display:inline-block;line-height:1.25;position:relative}.radio input,.checkbox input{cursor:pointer}.radio:hover,.checkbox:hover{color:#363636}.radio[disabled],.checkbox[disabled],fieldset[disabled] .radio,fieldset[disabled] .checkbox{color:#6b6b6b;cursor:not-allowed}.radio+.radio{margin-left:0.5em}.select{display:inline-block;max-width:100%;position:relative;vertical-align:top}.select:not(.is-multiple){height:2.25em}.select:not(.is-multiple):not(.is-loading)::after{border-color:#2e63b8;right:1.125em;z-index:4}.select.is-rounded select,#documenter .docs-sidebar form.docs-search>input.select select{border-radius:290486px;padding-left:1em}.select select{cursor:pointer;display:block;font-size:1em;max-width:100%;outline:none}.select select::-ms-expand{display:none}.select select[disabled]:hover,fieldset[disabled] .select select:hover{border-color:#f5f5f5}.select select:not([multiple]){padding-right:2.5em}.select select[multiple]{height:auto;padding:0}.select select[multiple] option{padding:0.5em 1em}.select:not(.is-multiple):not(.is-loading):hover::after{border-color:#363636}.select.is-white:not(:hover)::after{border-color:#fff}.select.is-white select{border-color:#fff}.select.is-white select:hover,.select.is-white select.is-hovered{border-color:#f2f2f2}.select.is-white select:focus,.select.is-white select.is-focused,.select.is-white select:active,.select.is-white select.is-active{box-shadow:0 0 0 0.125em rgba(255,255,255,0.25)}.select.is-black:not(:hover)::after{border-color:#0a0a0a}.select.is-black select{border-color:#0a0a0a}.select.is-black select:hover,.select.is-black select.is-hovered{border-color:#000}.select.is-black select:focus,.select.is-black select.is-focused,.select.is-black select:active,.select.is-black select.is-active{box-shadow:0 0 0 0.125em rgba(10,10,10,0.25)}.select.is-light:not(:hover)::after{border-color:#f5f5f5}.select.is-light select{border-color:#f5f5f5}.select.is-light select:hover,.select.is-light select.is-hovered{border-color:#e8e8e8}.select.is-light select:focus,.select.is-light select.is-focused,.select.is-light select:active,.select.is-light select.is-active{box-shadow:0 0 0 0.125em rgba(245,245,245,0.25)}.select.is-dark:not(:hover)::after,.content kbd.select:not(:hover)::after{border-color:#363636}.select.is-dark select,.content kbd.select select{border-color:#363636}.select.is-dark select:hover,.content kbd.select select:hover,.select.is-dark select.is-hovered,.content kbd.select select.is-hovered{border-color:#292929}.select.is-dark select:focus,.content kbd.select select:focus,.select.is-dark select.is-focused,.content kbd.select select.is-focused,.select.is-dark select:active,.content kbd.select select:active,.select.is-dark select.is-active,.content kbd.select select.is-active{box-shadow:0 0 0 0.125em rgba(54,54,54,0.25)}.select.is-primary:not(:hover)::after,.docstring>section>a.select.docs-sourcelink:not(:hover)::after{border-color:#4eb5de}.select.is-primary select,.docstring>section>a.select.docs-sourcelink select{border-color:#4eb5de}.select.is-primary select:hover,.docstring>section>a.select.docs-sourcelink select:hover,.select.is-primary select.is-hovered,.docstring>section>a.select.docs-sourcelink select.is-hovered{border-color:#39acda}.select.is-primary select:focus,.docstring>section>a.select.docs-sourcelink select:focus,.select.is-primary select.is-focused,.docstring>section>a.select.docs-sourcelink select.is-focused,.select.is-primary select:active,.docstring>section>a.select.docs-sourcelink select:active,.select.is-primary select.is-active,.docstring>section>a.select.docs-sourcelink select.is-active{box-shadow:0 0 0 0.125em rgba(78,181,222,0.25)}.select.is-link:not(:hover)::after{border-color:#2e63b8}.select.is-link select{border-color:#2e63b8}.select.is-link select:hover,.select.is-link select.is-hovered{border-color:#2958a4}.select.is-link select:focus,.select.is-link select.is-focused,.select.is-link select:active,.select.is-link select.is-active{box-shadow:0 0 0 0.125em rgba(46,99,184,0.25)}.select.is-info:not(:hover)::after{border-color:#209cee}.select.is-info select{border-color:#209cee}.select.is-info select:hover,.select.is-info select.is-hovered{border-color:#1190e3}.select.is-info select:focus,.select.is-info select.is-focused,.select.is-info select:active,.select.is-info select.is-active{box-shadow:0 0 0 0.125em rgba(32,156,238,0.25)}.select.is-success:not(:hover)::after{border-color:#22c35b}.select.is-success select{border-color:#22c35b}.select.is-success select:hover,.select.is-success select.is-hovered{border-color:#1ead51}.select.is-success select:focus,.select.is-success select.is-focused,.select.is-success select:active,.select.is-success select.is-active{box-shadow:0 0 0 0.125em rgba(34,195,91,0.25)}.select.is-warning:not(:hover)::after{border-color:#ffdd57}.select.is-warning select{border-color:#ffdd57}.select.is-warning select:hover,.select.is-warning select.is-hovered{border-color:#ffd83e}.select.is-warning select:focus,.select.is-warning select.is-focused,.select.is-warning select:active,.select.is-warning select.is-active{box-shadow:0 0 0 0.125em rgba(255,221,87,0.25)}.select.is-danger:not(:hover)::after{border-color:#da0b00}.select.is-danger select{border-color:#da0b00}.select.is-danger select:hover,.select.is-danger select.is-hovered{border-color:#c10a00}.select.is-danger select:focus,.select.is-danger select.is-focused,.select.is-danger select:active,.select.is-danger select.is-active{box-shadow:0 0 0 0.125em rgba(218,11,0,0.25)}.select.is-small,#documenter .docs-sidebar form.docs-search>input.select{border-radius:2px;font-size:.75rem}.select.is-medium{font-size:1.25rem}.select.is-large{font-size:1.5rem}.select.is-disabled::after{border-color:#6b6b6b}.select.is-fullwidth{width:100%}.select.is-fullwidth select{width:100%}.select.is-loading::after{margin-top:0;position:absolute;right:0.625em;top:0.625em;transform:none}.select.is-loading.is-small:after,#documenter .docs-sidebar form.docs-search>input.is-loading:after{font-size:.75rem}.select.is-loading.is-medium:after{font-size:1.25rem}.select.is-loading.is-large:after{font-size:1.5rem}.file{align-items:stretch;display:flex;justify-content:flex-start;position:relative}.file.is-white .file-cta{background-color:#fff;border-color:transparent;color:#0a0a0a}.file.is-white:hover .file-cta,.file.is-white.is-hovered .file-cta{background-color:#f9f9f9;border-color:transparent;color:#0a0a0a}.file.is-white:focus .file-cta,.file.is-white.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(255,255,255,0.25);color:#0a0a0a}.file.is-white:active .file-cta,.file.is-white.is-active .file-cta{background-color:#f2f2f2;border-color:transparent;color:#0a0a0a}.file.is-black .file-cta{background-color:#0a0a0a;border-color:transparent;color:#fff}.file.is-black:hover .file-cta,.file.is-black.is-hovered .file-cta{background-color:#040404;border-color:transparent;color:#fff}.file.is-black:focus .file-cta,.file.is-black.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(10,10,10,0.25);color:#fff}.file.is-black:active .file-cta,.file.is-black.is-active .file-cta{background-color:#000;border-color:transparent;color:#fff}.file.is-light .file-cta{background-color:#f5f5f5;border-color:transparent;color:#363636}.file.is-light:hover .file-cta,.file.is-light.is-hovered .file-cta{background-color:#eee;border-color:transparent;color:#363636}.file.is-light:focus .file-cta,.file.is-light.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(245,245,245,0.25);color:#363636}.file.is-light:active .file-cta,.file.is-light.is-active .file-cta{background-color:#e8e8e8;border-color:transparent;color:#363636}.file.is-dark .file-cta,.content kbd.file .file-cta{background-color:#363636;border-color:transparent;color:#f5f5f5}.file.is-dark:hover .file-cta,.content kbd.file:hover .file-cta,.file.is-dark.is-hovered .file-cta,.content kbd.file.is-hovered .file-cta{background-color:#2f2f2f;border-color:transparent;color:#f5f5f5}.file.is-dark:focus .file-cta,.content kbd.file:focus .file-cta,.file.is-dark.is-focused .file-cta,.content kbd.file.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(54,54,54,0.25);color:#f5f5f5}.file.is-dark:active .file-cta,.content kbd.file:active .file-cta,.file.is-dark.is-active .file-cta,.content kbd.file.is-active .file-cta{background-color:#292929;border-color:transparent;color:#f5f5f5}.file.is-primary .file-cta,.docstring>section>a.file.docs-sourcelink .file-cta{background-color:#4eb5de;border-color:transparent;color:#fff}.file.is-primary:hover .file-cta,.docstring>section>a.file.docs-sourcelink:hover .file-cta,.file.is-primary.is-hovered .file-cta,.docstring>section>a.file.is-hovered.docs-sourcelink .file-cta{background-color:#43b1dc;border-color:transparent;color:#fff}.file.is-primary:focus .file-cta,.docstring>section>a.file.docs-sourcelink:focus .file-cta,.file.is-primary.is-focused .file-cta,.docstring>section>a.file.is-focused.docs-sourcelink .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(78,181,222,0.25);color:#fff}.file.is-primary:active .file-cta,.docstring>section>a.file.docs-sourcelink:active .file-cta,.file.is-primary.is-active .file-cta,.docstring>section>a.file.is-active.docs-sourcelink .file-cta{background-color:#39acda;border-color:transparent;color:#fff}.file.is-link .file-cta{background-color:#2e63b8;border-color:transparent;color:#fff}.file.is-link:hover .file-cta,.file.is-link.is-hovered .file-cta{background-color:#2b5eae;border-color:transparent;color:#fff}.file.is-link:focus .file-cta,.file.is-link.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(46,99,184,0.25);color:#fff}.file.is-link:active .file-cta,.file.is-link.is-active .file-cta{background-color:#2958a4;border-color:transparent;color:#fff}.file.is-info .file-cta{background-color:#209cee;border-color:transparent;color:#fff}.file.is-info:hover .file-cta,.file.is-info.is-hovered .file-cta{background-color:#1497ed;border-color:transparent;color:#fff}.file.is-info:focus .file-cta,.file.is-info.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(32,156,238,0.25);color:#fff}.file.is-info:active .file-cta,.file.is-info.is-active .file-cta{background-color:#1190e3;border-color:transparent;color:#fff}.file.is-success .file-cta{background-color:#22c35b;border-color:transparent;color:#fff}.file.is-success:hover .file-cta,.file.is-success.is-hovered .file-cta{background-color:#20b856;border-color:transparent;color:#fff}.file.is-success:focus .file-cta,.file.is-success.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(34,195,91,0.25);color:#fff}.file.is-success:active .file-cta,.file.is-success.is-active .file-cta{background-color:#1ead51;border-color:transparent;color:#fff}.file.is-warning .file-cta{background-color:#ffdd57;border-color:transparent;color:rgba(0,0,0,0.7)}.file.is-warning:hover .file-cta,.file.is-warning.is-hovered .file-cta{background-color:#ffda4a;border-color:transparent;color:rgba(0,0,0,0.7)}.file.is-warning:focus .file-cta,.file.is-warning.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(255,221,87,0.25);color:rgba(0,0,0,0.7)}.file.is-warning:active .file-cta,.file.is-warning.is-active .file-cta{background-color:#ffd83e;border-color:transparent;color:rgba(0,0,0,0.7)}.file.is-danger .file-cta{background-color:#da0b00;border-color:transparent;color:#fff}.file.is-danger:hover .file-cta,.file.is-danger.is-hovered .file-cta{background-color:#cd0a00;border-color:transparent;color:#fff}.file.is-danger:focus .file-cta,.file.is-danger.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(218,11,0,0.25);color:#fff}.file.is-danger:active .file-cta,.file.is-danger.is-active .file-cta{background-color:#c10a00;border-color:transparent;color:#fff}.file.is-small,#documenter .docs-sidebar form.docs-search>input.file{font-size:.75rem}.file.is-medium{font-size:1.25rem}.file.is-medium .file-icon .fa{font-size:21px}.file.is-large{font-size:1.5rem}.file.is-large .file-icon .fa{font-size:28px}.file.has-name .file-cta{border-bottom-right-radius:0;border-top-right-radius:0}.file.has-name .file-name{border-bottom-left-radius:0;border-top-left-radius:0}.file.has-name.is-empty .file-cta{border-radius:4px}.file.has-name.is-empty .file-name{display:none}.file.is-boxed .file-label{flex-direction:column}.file.is-boxed .file-cta{flex-direction:column;height:auto;padding:1em 3em}.file.is-boxed .file-name{border-width:0 1px 1px}.file.is-boxed .file-icon{height:1.5em;width:1.5em}.file.is-boxed .file-icon .fa{font-size:21px}.file.is-boxed.is-small .file-icon .fa,#documenter .docs-sidebar form.docs-search>input.is-boxed .file-icon .fa{font-size:14px}.file.is-boxed.is-medium .file-icon .fa{font-size:28px}.file.is-boxed.is-large .file-icon .fa{font-size:35px}.file.is-boxed.has-name .file-cta{border-radius:4px 4px 0 0}.file.is-boxed.has-name .file-name{border-radius:0 0 4px 4px;border-width:0 1px 1px}.file.is-centered{justify-content:center}.file.is-fullwidth .file-label{width:100%}.file.is-fullwidth .file-name{flex-grow:1;max-width:none}.file.is-right{justify-content:flex-end}.file.is-right .file-cta{border-radius:0 4px 4px 0}.file.is-right .file-name{border-radius:4px 0 0 4px;border-width:1px 0 1px 1px;order:-1}.file-label{align-items:stretch;display:flex;cursor:pointer;justify-content:flex-start;overflow:hidden;position:relative}.file-label:hover .file-cta{background-color:#eee;color:#363636}.file-label:hover .file-name{border-color:#d5d5d5}.file-label:active .file-cta{background-color:#e8e8e8;color:#363636}.file-label:active .file-name{border-color:#cfcfcf}.file-input{height:100%;left:0;opacity:0;outline:none;position:absolute;top:0;width:100%}.file-cta,.file-name{border-color:#dbdbdb;border-radius:4px;font-size:1em;padding-left:1em;padding-right:1em;white-space:nowrap}.file-cta{background-color:#f5f5f5;color:#4a4a4a}.file-name{border-color:#dbdbdb;border-style:solid;border-width:1px 1px 1px 0;display:block;max-width:16em;overflow:hidden;text-align:left;text-overflow:ellipsis}.file-icon{align-items:center;display:flex;height:1em;justify-content:center;margin-right:0.5em;width:1em}.file-icon .fa{font-size:14px}.label{color:#363636;display:block;font-size:1rem;font-weight:700}.label:not(:last-child){margin-bottom:0.5em}.label.is-small,#documenter .docs-sidebar form.docs-search>input.label{font-size:.75rem}.label.is-medium{font-size:1.25rem}.label.is-large{font-size:1.5rem}.help{display:block;font-size:.75rem;margin-top:0.25rem}.help.is-white{color:#fff}.help.is-black{color:#0a0a0a}.help.is-light{color:#f5f5f5}.help.is-dark,.content kbd.help{color:#363636}.help.is-primary,.docstring>section>a.help.docs-sourcelink{color:#4eb5de}.help.is-link{color:#2e63b8}.help.is-info{color:#209cee}.help.is-success{color:#22c35b}.help.is-warning{color:#ffdd57}.help.is-danger{color:#da0b00}.field:not(:last-child){margin-bottom:0.75rem}.field.has-addons{display:flex;justify-content:flex-start}.field.has-addons .control:not(:last-child){margin-right:-1px}.field.has-addons .control:not(:first-child):not(:last-child) .button,.field.has-addons .control:not(:first-child):not(:last-child) .input,.field.has-addons .control:not(:first-child):not(:last-child) #documenter .docs-sidebar form.docs-search>input,#documenter .docs-sidebar .field.has-addons .control:not(:first-child):not(:last-child) form.docs-search>input,.field.has-addons .control:not(:first-child):not(:last-child) .select select{border-radius:0}.field.has-addons .control:first-child:not(:only-child) .button,.field.has-addons .control:first-child:not(:only-child) .input,.field.has-addons .control:first-child:not(:only-child) #documenter .docs-sidebar form.docs-search>input,#documenter .docs-sidebar .field.has-addons .control:first-child:not(:only-child) form.docs-search>input,.field.has-addons .control:first-child:not(:only-child) .select select{border-bottom-right-radius:0;border-top-right-radius:0}.field.has-addons .control:last-child:not(:only-child) .button,.field.has-addons .control:last-child:not(:only-child) .input,.field.has-addons .control:last-child:not(:only-child) #documenter .docs-sidebar form.docs-search>input,#documenter .docs-sidebar .field.has-addons .control:last-child:not(:only-child) form.docs-search>input,.field.has-addons .control:last-child:not(:only-child) .select select{border-bottom-left-radius:0;border-top-left-radius:0}.field.has-addons .control .button:not([disabled]):hover,.field.has-addons .control .button.is-hovered:not([disabled]),.field.has-addons .control .input:not([disabled]):hover,.field.has-addons .control #documenter .docs-sidebar form.docs-search>input:not([disabled]):hover,#documenter .docs-sidebar .field.has-addons .control form.docs-search>input:not([disabled]):hover,.field.has-addons .control .input.is-hovered:not([disabled]),.field.has-addons .control #documenter .docs-sidebar form.docs-search>input.is-hovered:not([disabled]),#documenter .docs-sidebar .field.has-addons .control form.docs-search>input.is-hovered:not([disabled]),.field.has-addons .control .select select:not([disabled]):hover,.field.has-addons .control .select select.is-hovered:not([disabled]){z-index:2}.field.has-addons .control .button:not([disabled]):focus,.field.has-addons .control .button.is-focused:not([disabled]),.field.has-addons .control .button:not([disabled]):active,.field.has-addons .control .button.is-active:not([disabled]),.field.has-addons .control .input:not([disabled]):focus,.field.has-addons .control #documenter .docs-sidebar form.docs-search>input:not([disabled]):focus,#documenter .docs-sidebar .field.has-addons .control form.docs-search>input:not([disabled]):focus,.field.has-addons .control .input.is-focused:not([disabled]),.field.has-addons .control #documenter .docs-sidebar form.docs-search>input.is-focused:not([disabled]),#documenter .docs-sidebar .field.has-addons .control form.docs-search>input.is-focused:not([disabled]),.field.has-addons .control .input:not([disabled]):active,.field.has-addons .control #documenter .docs-sidebar form.docs-search>input:not([disabled]):active,#documenter .docs-sidebar .field.has-addons .control form.docs-search>input:not([disabled]):active,.field.has-addons .control .input.is-active:not([disabled]),.field.has-addons .control #documenter .docs-sidebar form.docs-search>input.is-active:not([disabled]),#documenter .docs-sidebar .field.has-addons .control form.docs-search>input.is-active:not([disabled]),.field.has-addons .control .select select:not([disabled]):focus,.field.has-addons .control .select select.is-focused:not([disabled]),.field.has-addons .control .select select:not([disabled]):active,.field.has-addons .control .select select.is-active:not([disabled]){z-index:3}.field.has-addons .control .button:not([disabled]):focus:hover,.field.has-addons .control .button.is-focused:not([disabled]):hover,.field.has-addons .control .button:not([disabled]):active:hover,.field.has-addons .control .button.is-active:not([disabled]):hover,.field.has-addons .control .input:not([disabled]):focus:hover,.field.has-addons .control #documenter .docs-sidebar form.docs-search>input:not([disabled]):focus:hover,#documenter .docs-sidebar .field.has-addons .control form.docs-search>input:not([disabled]):focus:hover,.field.has-addons .control .input.is-focused:not([disabled]):hover,.field.has-addons .control #documenter .docs-sidebar form.docs-search>input.is-focused:not([disabled]):hover,#documenter .docs-sidebar .field.has-addons .control form.docs-search>input.is-focused:not([disabled]):hover,.field.has-addons .control .input:not([disabled]):active:hover,.field.has-addons .control #documenter .docs-sidebar form.docs-search>input:not([disabled]):active:hover,#documenter .docs-sidebar .field.has-addons .control form.docs-search>input:not([disabled]):active:hover,.field.has-addons .control .input.is-active:not([disabled]):hover,.field.has-addons .control #documenter .docs-sidebar form.docs-search>input.is-active:not([disabled]):hover,#documenter .docs-sidebar .field.has-addons .control form.docs-search>input.is-active:not([disabled]):hover,.field.has-addons .control .select select:not([disabled]):focus:hover,.field.has-addons .control .select select.is-focused:not([disabled]):hover,.field.has-addons .control .select select:not([disabled]):active:hover,.field.has-addons .control .select select.is-active:not([disabled]):hover{z-index:4}.field.has-addons .control.is-expanded{flex-grow:1;flex-shrink:1}.field.has-addons.has-addons-centered{justify-content:center}.field.has-addons.has-addons-right{justify-content:flex-end}.field.has-addons.has-addons-fullwidth .control{flex-grow:1;flex-shrink:0}.field.is-grouped{display:flex;justify-content:flex-start}.field.is-grouped>.control{flex-shrink:0}.field.is-grouped>.control:not(:last-child){margin-bottom:0;margin-right:0.75rem}.field.is-grouped>.control.is-expanded{flex-grow:1;flex-shrink:1}.field.is-grouped.is-grouped-centered{justify-content:center}.field.is-grouped.is-grouped-right{justify-content:flex-end}.field.is-grouped.is-grouped-multiline{flex-wrap:wrap}.field.is-grouped.is-grouped-multiline>.control:last-child,.field.is-grouped.is-grouped-multiline>.control:not(:last-child){margin-bottom:0.75rem}.field.is-grouped.is-grouped-multiline:last-child{margin-bottom:-0.75rem}.field.is-grouped.is-grouped-multiline:not(:last-child){margin-bottom:0}@media screen and (min-width: 769px),print{.field.is-horizontal{display:flex}}.field-label .label{font-size:inherit}@media screen and (max-width: 768px){.field-label{margin-bottom:0.5rem}}@media screen and (min-width: 769px),print{.field-label{flex-basis:0;flex-grow:1;flex-shrink:0;margin-right:1.5rem;text-align:right}.field-label.is-small,#documenter .docs-sidebar form.docs-search>input.field-label{font-size:.75rem;padding-top:0.375em}.field-label.is-normal{padding-top:0.375em}.field-label.is-medium{font-size:1.25rem;padding-top:0.375em}.field-label.is-large{font-size:1.5rem;padding-top:0.375em}}.field-body .field .field{margin-bottom:0}@media screen and (min-width: 769px),print{.field-body{display:flex;flex-basis:0;flex-grow:5;flex-shrink:1}.field-body .field{margin-bottom:0}.field-body>.field{flex-shrink:1}.field-body>.field:not(.is-narrow){flex-grow:1}.field-body>.field:not(:last-child){margin-right:0.75rem}}.control{box-sizing:border-box;clear:both;font-size:1rem;position:relative;text-align:left}.control.has-icons-left .input:focus~.icon,.control.has-icons-left #documenter .docs-sidebar form.docs-search>input:focus~.icon,#documenter .docs-sidebar .control.has-icons-left form.docs-search>input:focus~.icon,.control.has-icons-left .select:focus~.icon,.control.has-icons-right .input:focus~.icon,.control.has-icons-right #documenter .docs-sidebar form.docs-search>input:focus~.icon,#documenter .docs-sidebar .control.has-icons-right form.docs-search>input:focus~.icon,.control.has-icons-right .select:focus~.icon{color:#6b6b6b}.control.has-icons-left .input.is-small~.icon,.control.has-icons-left #documenter .docs-sidebar form.docs-search>input~.icon,#documenter .docs-sidebar .control.has-icons-left form.docs-search>input~.icon,.control.has-icons-left .select.is-small~.icon,.control.has-icons-right .input.is-small~.icon,.control.has-icons-right #documenter .docs-sidebar form.docs-search>input~.icon,#documenter .docs-sidebar .control.has-icons-right form.docs-search>input~.icon,.control.has-icons-right .select.is-small~.icon{font-size:.75rem}.control.has-icons-left .input.is-medium~.icon,.control.has-icons-left #documenter .docs-sidebar form.docs-search>input.is-medium~.icon,#documenter .docs-sidebar .control.has-icons-left form.docs-search>input.is-medium~.icon,.control.has-icons-left .select.is-medium~.icon,.control.has-icons-right .input.is-medium~.icon,.control.has-icons-right #documenter .docs-sidebar form.docs-search>input.is-medium~.icon,#documenter .docs-sidebar .control.has-icons-right form.docs-search>input.is-medium~.icon,.control.has-icons-right .select.is-medium~.icon{font-size:1.25rem}.control.has-icons-left .input.is-large~.icon,.control.has-icons-left #documenter .docs-sidebar form.docs-search>input.is-large~.icon,#documenter .docs-sidebar .control.has-icons-left form.docs-search>input.is-large~.icon,.control.has-icons-left .select.is-large~.icon,.control.has-icons-right .input.is-large~.icon,.control.has-icons-right #documenter .docs-sidebar form.docs-search>input.is-large~.icon,#documenter .docs-sidebar .control.has-icons-right form.docs-search>input.is-large~.icon,.control.has-icons-right .select.is-large~.icon{font-size:1.5rem}.control.has-icons-left .icon,.control.has-icons-right .icon{color:#dbdbdb;height:2.25em;pointer-events:none;position:absolute;top:0;width:2.25em;z-index:4}.control.has-icons-left .input,.control.has-icons-left #documenter .docs-sidebar form.docs-search>input,#documenter .docs-sidebar .control.has-icons-left form.docs-search>input,.control.has-icons-left .select select{padding-left:2.25em}.control.has-icons-left .icon.is-left{left:0}.control.has-icons-right .input,.control.has-icons-right #documenter .docs-sidebar form.docs-search>input,#documenter .docs-sidebar .control.has-icons-right form.docs-search>input,.control.has-icons-right .select select{padding-right:2.25em}.control.has-icons-right .icon.is-right{right:0}.control.is-loading::after{position:absolute !important;right:0.625em;top:0.625em;z-index:4}.control.is-loading.is-small:after,#documenter .docs-sidebar form.docs-search>input.is-loading:after{font-size:.75rem}.control.is-loading.is-medium:after{font-size:1.25rem}.control.is-loading.is-large:after{font-size:1.5rem}.breadcrumb{font-size:1rem;white-space:nowrap}.breadcrumb a{align-items:center;color:#2e63b8;display:flex;justify-content:center;padding:0 .75em}.breadcrumb a:hover{color:#363636}.breadcrumb li{align-items:center;display:flex}.breadcrumb li:first-child a{padding-left:0}.breadcrumb li.is-active a{color:#222;cursor:default;pointer-events:none}.breadcrumb li+li::before{color:#b5b5b5;content:"\0002f"}.breadcrumb ul,.breadcrumb ol{align-items:flex-start;display:flex;flex-wrap:wrap;justify-content:flex-start}.breadcrumb .icon:first-child{margin-right:0.5em}.breadcrumb .icon:last-child{margin-left:0.5em}.breadcrumb.is-centered ol,.breadcrumb.is-centered ul{justify-content:center}.breadcrumb.is-right ol,.breadcrumb.is-right ul{justify-content:flex-end}.breadcrumb.is-small,#documenter .docs-sidebar form.docs-search>input.breadcrumb{font-size:.75rem}.breadcrumb.is-medium{font-size:1.25rem}.breadcrumb.is-large{font-size:1.5rem}.breadcrumb.has-arrow-separator li+li::before{content:"\02192"}.breadcrumb.has-bullet-separator li+li::before{content:"\02022"}.breadcrumb.has-dot-separator li+li::before{content:"\000b7"}.breadcrumb.has-succeeds-separator li+li::before{content:"\0227B"}.card{background-color:#fff;box-shadow:0 2px 3px rgba(10,10,10,0.1),0 0 0 1px rgba(10,10,10,0.1);color:#222;max-width:100%;position:relative}.card-header{background-color:rgba(0,0,0,0);align-items:stretch;box-shadow:0 1px 2px rgba(10,10,10,0.1);display:flex}.card-header-title{align-items:center;color:#222;display:flex;flex-grow:1;font-weight:700;padding:.75rem}.card-header-title.is-centered{justify-content:center}.card-header-icon{align-items:center;cursor:pointer;display:flex;justify-content:center;padding:.75rem}.card-image{display:block;position:relative}.card-content{background-color:rgba(0,0,0,0);padding:1.5rem}.card-footer{background-color:rgba(0,0,0,0);border-top:1px solid #dbdbdb;align-items:stretch;display:flex}.card-footer-item{align-items:center;display:flex;flex-basis:0;flex-grow:1;flex-shrink:0;justify-content:center;padding:.75rem}.card-footer-item:not(:last-child){border-right:1px solid #dbdbdb}.card .media:not(:last-child){margin-bottom:1.5rem}.dropdown{display:inline-flex;position:relative;vertical-align:top}.dropdown.is-active .dropdown-menu,.dropdown.is-hoverable:hover .dropdown-menu{display:block}.dropdown.is-right .dropdown-menu{left:auto;right:0}.dropdown.is-up .dropdown-menu{bottom:100%;padding-bottom:4px;padding-top:initial;top:auto}.dropdown-menu{display:none;left:0;min-width:12rem;padding-top:4px;position:absolute;top:100%;z-index:20}.dropdown-content{background-color:#fff;border-radius:4px;box-shadow:0 2px 3px rgba(10,10,10,0.1),0 0 0 1px rgba(10,10,10,0.1);padding-bottom:.5rem;padding-top:.5rem}.dropdown-item{color:#4a4a4a;display:block;font-size:0.875rem;line-height:1.5;padding:0.375rem 1rem;position:relative}a.dropdown-item,button.dropdown-item{padding-right:3rem;text-align:left;white-space:nowrap;width:100%}a.dropdown-item:hover,button.dropdown-item:hover{background-color:#f5f5f5;color:#0a0a0a}a.dropdown-item.is-active,button.dropdown-item.is-active{background-color:#2e63b8;color:#fff}.dropdown-divider{background-color:#dbdbdb;border:none;display:block;height:1px;margin:0.5rem 0}.level{align-items:center;justify-content:space-between}.level code{border-radius:4px}.level img{display:inline-block;vertical-align:top}.level.is-mobile{display:flex}.level.is-mobile .level-left,.level.is-mobile .level-right{display:flex}.level.is-mobile .level-left+.level-right{margin-top:0}.level.is-mobile .level-item:not(:last-child){margin-bottom:0;margin-right:.75rem}.level.is-mobile .level-item:not(.is-narrow){flex-grow:1}@media screen and (min-width: 769px),print{.level{display:flex}.level>.level-item:not(.is-narrow){flex-grow:1}}.level-item{align-items:center;display:flex;flex-basis:auto;flex-grow:0;flex-shrink:0;justify-content:center}.level-item .title,.level-item .subtitle{margin-bottom:0}@media screen and (max-width: 768px){.level-item:not(:last-child){margin-bottom:.75rem}}.level-left,.level-right{flex-basis:auto;flex-grow:0;flex-shrink:0}.level-left .level-item.is-flexible,.level-right .level-item.is-flexible{flex-grow:1}@media screen and (min-width: 769px),print{.level-left .level-item:not(:last-child),.level-right .level-item:not(:last-child){margin-right:.75rem}}.level-left{align-items:center;justify-content:flex-start}@media screen and (max-width: 768px){.level-left+.level-right{margin-top:1.5rem}}@media screen and (min-width: 769px),print{.level-left{display:flex}}.level-right{align-items:center;justify-content:flex-end}@media screen and (min-width: 769px),print{.level-right{display:flex}}.list{background-color:#fff;border-radius:4px;box-shadow:0 2px 3px rgba(10,10,10,0.1),0 0 0 1px rgba(10,10,10,0.1)}.list-item{display:block;padding:0.5em 1em}.list-item:not(a){color:#222}.list-item:first-child{border-top-left-radius:4px;border-top-right-radius:4px}.list-item:last-child{border-bottom-left-radius:4px;border-bottom-right-radius:4px}.list-item:not(:last-child){border-bottom:1px solid #dbdbdb}.list-item.is-active{background-color:#2e63b8;color:#fff}a.list-item{background-color:#f5f5f5;cursor:pointer}.media{align-items:flex-start;display:flex;text-align:left}.media .content:not(:last-child){margin-bottom:0.75rem}.media .media{border-top:1px solid rgba(219,219,219,0.5);display:flex;padding-top:0.75rem}.media .media .content:not(:last-child),.media .media .control:not(:last-child){margin-bottom:0.5rem}.media .media .media{padding-top:0.5rem}.media .media .media+.media{margin-top:0.5rem}.media+.media{border-top:1px solid rgba(219,219,219,0.5);margin-top:1rem;padding-top:1rem}.media.is-large+.media{margin-top:1.5rem;padding-top:1.5rem}.media-left,.media-right{flex-basis:auto;flex-grow:0;flex-shrink:0}.media-left{margin-right:1rem}.media-right{margin-left:1rem}.media-content{flex-basis:auto;flex-grow:1;flex-shrink:1;text-align:left}@media screen and (max-width: 768px){.media-content{overflow-x:auto}}.menu{font-size:1rem}.menu.is-small,#documenter .docs-sidebar form.docs-search>input.menu{font-size:.75rem}.menu.is-medium{font-size:1.25rem}.menu.is-large{font-size:1.5rem}.menu-list{line-height:1.25}.menu-list a{border-radius:2px;color:#222;display:block;padding:0.5em 0.75em}.menu-list a:hover{background-color:#f5f5f5;color:#222}.menu-list a.is-active{background-color:#2e63b8;color:#fff}.menu-list li ul{border-left:1px solid #dbdbdb;margin:.75em;padding-left:.75em}.menu-label{color:#6b6b6b;font-size:.75em;letter-spacing:.1em;text-transform:uppercase}.menu-label:not(:first-child){margin-top:1em}.menu-label:not(:last-child){margin-bottom:1em}.message{background-color:#f5f5f5;border-radius:4px;font-size:1rem}.message strong{color:currentColor}.message a:not(.button):not(.tag):not(.dropdown-item){color:currentColor;text-decoration:underline}.message.is-small,#documenter .docs-sidebar form.docs-search>input.message{font-size:.75rem}.message.is-medium{font-size:1.25rem}.message.is-large{font-size:1.5rem}.message.is-white{background-color:#fff}.message.is-white .message-header{background-color:#fff;color:#0a0a0a}.message.is-white .message-body{border-color:#fff;color:#4d4d4d}.message.is-black{background-color:#fafafa}.message.is-black .message-header{background-color:#0a0a0a;color:#fff}.message.is-black .message-body{border-color:#0a0a0a;color:#090909}.message.is-light{background-color:#fafafa}.message.is-light .message-header{background-color:#f5f5f5;color:#363636}.message.is-light .message-body{border-color:#f5f5f5;color:#505050}.message.is-dark,.content kbd.message{background-color:#fafafa}.message.is-dark .message-header,.content kbd.message .message-header{background-color:#363636;color:#f5f5f5}.message.is-dark .message-body,.content kbd.message .message-body{border-color:#363636;color:#2a2a2a}.message.is-primary,.docstring>section>a.message.docs-sourcelink{background-color:#f6fbfd}.message.is-primary .message-header,.docstring>section>a.message.docs-sourcelink .message-header{background-color:#4eb5de;color:#fff}.message.is-primary .message-body,.docstring>section>a.message.docs-sourcelink .message-body{border-color:#4eb5de;color:#1f556a}.message.is-link{background-color:#f7f9fd}.message.is-link .message-header{background-color:#2e63b8;color:#fff}.message.is-link .message-body{border-color:#2e63b8;color:#264981}.message.is-info{background-color:#f6fbfe}.message.is-info .message-header{background-color:#209cee;color:#fff}.message.is-info .message-body{border-color:#209cee;color:#12537d}.message.is-success{background-color:#f6fdf9}.message.is-success .message-header{background-color:#22c35b;color:#fff}.message.is-success .message-body{border-color:#22c35b;color:#0f361d}.message.is-warning{background-color:#fffdf5}.message.is-warning .message-header{background-color:#ffdd57;color:rgba(0,0,0,0.7)}.message.is-warning .message-body{border-color:#ffdd57;color:#3c3108}.message.is-danger{background-color:#fff5f5}.message.is-danger .message-header{background-color:#da0b00;color:#fff}.message.is-danger .message-body{border-color:#da0b00;color:#9b0c04}.message-header{align-items:center;background-color:#222;border-radius:4px 4px 0 0;color:#fff;display:flex;font-weight:700;justify-content:space-between;line-height:1.25;padding:0.75em 1em;position:relative}.message-header .delete{flex-grow:0;flex-shrink:0;margin-left:0.75em}.message-header+.message-body{border-width:0;border-top-left-radius:0;border-top-right-radius:0}.message-body{border-color:#dbdbdb;border-radius:4px;border-style:solid;border-width:0 0 0 4px;color:#222;padding:1.25em 1.5em}.message-body code,.message-body pre{background-color:#fff}.message-body pre code{background-color:rgba(0,0,0,0)}.modal{align-items:center;display:none;flex-direction:column;justify-content:center;overflow:hidden;position:fixed;z-index:40}.modal.is-active{display:flex}.modal-background{background-color:rgba(10,10,10,0.86)}.modal-content,.modal-card{margin:0 20px;max-height:calc(100vh - 160px);overflow:auto;position:relative;width:100%}@media screen and (min-width: 769px),print{.modal-content,.modal-card{margin:0 auto;max-height:calc(100vh - 40px);width:640px}}.modal-close{background:none;height:40px;position:fixed;right:20px;top:20px;width:40px}.modal-card{display:flex;flex-direction:column;max-height:calc(100vh - 40px);overflow:hidden;-ms-overflow-y:visible}.modal-card-head,.modal-card-foot{align-items:center;background-color:#f5f5f5;display:flex;flex-shrink:0;justify-content:flex-start;padding:20px;position:relative}.modal-card-head{border-bottom:1px solid #dbdbdb;border-top-left-radius:6px;border-top-right-radius:6px}.modal-card-title{color:#222;flex-grow:1;flex-shrink:0;font-size:1.5rem;line-height:1}.modal-card-foot{border-bottom-left-radius:6px;border-bottom-right-radius:6px;border-top:1px solid #dbdbdb}.modal-card-foot .button:not(:last-child){margin-right:0.5em}.modal-card-body{-webkit-overflow-scrolling:touch;background-color:#fff;flex-grow:1;flex-shrink:1;overflow:auto;padding:20px}.navbar{background-color:#fff;min-height:3.25rem;position:relative;z-index:30}.navbar.is-white{background-color:#fff;color:#0a0a0a}.navbar.is-white .navbar-brand>.navbar-item,.navbar.is-white .navbar-brand .navbar-link{color:#0a0a0a}.navbar.is-white .navbar-brand>a.navbar-item:focus,.navbar.is-white .navbar-brand>a.navbar-item:hover,.navbar.is-white .navbar-brand>a.navbar-item.is-active,.navbar.is-white .navbar-brand .navbar-link:focus,.navbar.is-white .navbar-brand .navbar-link:hover,.navbar.is-white .navbar-brand .navbar-link.is-active{background-color:#f2f2f2;color:#0a0a0a}.navbar.is-white .navbar-brand .navbar-link::after{border-color:#0a0a0a}.navbar.is-white .navbar-burger{color:#0a0a0a}@media screen and (min-width: 1056px){.navbar.is-white .navbar-start>.navbar-item,.navbar.is-white .navbar-start .navbar-link,.navbar.is-white .navbar-end>.navbar-item,.navbar.is-white .navbar-end .navbar-link{color:#0a0a0a}.navbar.is-white .navbar-start>a.navbar-item:focus,.navbar.is-white .navbar-start>a.navbar-item:hover,.navbar.is-white .navbar-start>a.navbar-item.is-active,.navbar.is-white .navbar-start .navbar-link:focus,.navbar.is-white .navbar-start .navbar-link:hover,.navbar.is-white .navbar-start .navbar-link.is-active,.navbar.is-white .navbar-end>a.navbar-item:focus,.navbar.is-white .navbar-end>a.navbar-item:hover,.navbar.is-white .navbar-end>a.navbar-item.is-active,.navbar.is-white .navbar-end .navbar-link:focus,.navbar.is-white .navbar-end .navbar-link:hover,.navbar.is-white .navbar-end .navbar-link.is-active{background-color:#f2f2f2;color:#0a0a0a}.navbar.is-white .navbar-start .navbar-link::after,.navbar.is-white .navbar-end .navbar-link::after{border-color:#0a0a0a}.navbar.is-white .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-white .navbar-item.has-dropdown:hover .navbar-link,.navbar.is-white .navbar-item.has-dropdown.is-active .navbar-link{background-color:#f2f2f2;color:#0a0a0a}.navbar.is-white .navbar-dropdown a.navbar-item.is-active{background-color:#fff;color:#0a0a0a}}.navbar.is-black{background-color:#0a0a0a;color:#fff}.navbar.is-black .navbar-brand>.navbar-item,.navbar.is-black .navbar-brand .navbar-link{color:#fff}.navbar.is-black .navbar-brand>a.navbar-item:focus,.navbar.is-black .navbar-brand>a.navbar-item:hover,.navbar.is-black .navbar-brand>a.navbar-item.is-active,.navbar.is-black .navbar-brand .navbar-link:focus,.navbar.is-black .navbar-brand .navbar-link:hover,.navbar.is-black .navbar-brand .navbar-link.is-active{background-color:#000;color:#fff}.navbar.is-black .navbar-brand .navbar-link::after{border-color:#fff}.navbar.is-black .navbar-burger{color:#fff}@media screen and (min-width: 1056px){.navbar.is-black .navbar-start>.navbar-item,.navbar.is-black .navbar-start .navbar-link,.navbar.is-black .navbar-end>.navbar-item,.navbar.is-black .navbar-end .navbar-link{color:#fff}.navbar.is-black .navbar-start>a.navbar-item:focus,.navbar.is-black .navbar-start>a.navbar-item:hover,.navbar.is-black .navbar-start>a.navbar-item.is-active,.navbar.is-black .navbar-start .navbar-link:focus,.navbar.is-black .navbar-start .navbar-link:hover,.navbar.is-black .navbar-start .navbar-link.is-active,.navbar.is-black .navbar-end>a.navbar-item:focus,.navbar.is-black .navbar-end>a.navbar-item:hover,.navbar.is-black .navbar-end>a.navbar-item.is-active,.navbar.is-black .navbar-end .navbar-link:focus,.navbar.is-black .navbar-end .navbar-link:hover,.navbar.is-black .navbar-end .navbar-link.is-active{background-color:#000;color:#fff}.navbar.is-black .navbar-start .navbar-link::after,.navbar.is-black .navbar-end .navbar-link::after{border-color:#fff}.navbar.is-black .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-black .navbar-item.has-dropdown:hover .navbar-link,.navbar.is-black .navbar-item.has-dropdown.is-active .navbar-link{background-color:#000;color:#fff}.navbar.is-black .navbar-dropdown a.navbar-item.is-active{background-color:#0a0a0a;color:#fff}}.navbar.is-light{background-color:#f5f5f5;color:#363636}.navbar.is-light .navbar-brand>.navbar-item,.navbar.is-light .navbar-brand .navbar-link{color:#363636}.navbar.is-light .navbar-brand>a.navbar-item:focus,.navbar.is-light .navbar-brand>a.navbar-item:hover,.navbar.is-light .navbar-brand>a.navbar-item.is-active,.navbar.is-light .navbar-brand .navbar-link:focus,.navbar.is-light .navbar-brand .navbar-link:hover,.navbar.is-light .navbar-brand .navbar-link.is-active{background-color:#e8e8e8;color:#363636}.navbar.is-light .navbar-brand .navbar-link::after{border-color:#363636}.navbar.is-light .navbar-burger{color:#363636}@media screen and (min-width: 1056px){.navbar.is-light .navbar-start>.navbar-item,.navbar.is-light .navbar-start .navbar-link,.navbar.is-light .navbar-end>.navbar-item,.navbar.is-light .navbar-end .navbar-link{color:#363636}.navbar.is-light .navbar-start>a.navbar-item:focus,.navbar.is-light .navbar-start>a.navbar-item:hover,.navbar.is-light .navbar-start>a.navbar-item.is-active,.navbar.is-light .navbar-start .navbar-link:focus,.navbar.is-light .navbar-start .navbar-link:hover,.navbar.is-light .navbar-start .navbar-link.is-active,.navbar.is-light .navbar-end>a.navbar-item:focus,.navbar.is-light .navbar-end>a.navbar-item:hover,.navbar.is-light .navbar-end>a.navbar-item.is-active,.navbar.is-light .navbar-end .navbar-link:focus,.navbar.is-light .navbar-end .navbar-link:hover,.navbar.is-light .navbar-end .navbar-link.is-active{background-color:#e8e8e8;color:#363636}.navbar.is-light .navbar-start .navbar-link::after,.navbar.is-light .navbar-end .navbar-link::after{border-color:#363636}.navbar.is-light .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-light .navbar-item.has-dropdown:hover .navbar-link,.navbar.is-light .navbar-item.has-dropdown.is-active .navbar-link{background-color:#e8e8e8;color:#363636}.navbar.is-light .navbar-dropdown a.navbar-item.is-active{background-color:#f5f5f5;color:#363636}}.navbar.is-dark,.content kbd.navbar{background-color:#363636;color:#f5f5f5}.navbar.is-dark .navbar-brand>.navbar-item,.content kbd.navbar .navbar-brand>.navbar-item,.navbar.is-dark .navbar-brand .navbar-link,.content kbd.navbar .navbar-brand .navbar-link{color:#f5f5f5}.navbar.is-dark .navbar-brand>a.navbar-item:focus,.content kbd.navbar .navbar-brand>a.navbar-item:focus,.navbar.is-dark .navbar-brand>a.navbar-item:hover,.content kbd.navbar .navbar-brand>a.navbar-item:hover,.navbar.is-dark .navbar-brand>a.navbar-item.is-active,.content kbd.navbar .navbar-brand>a.navbar-item.is-active,.navbar.is-dark .navbar-brand .navbar-link:focus,.content kbd.navbar .navbar-brand .navbar-link:focus,.navbar.is-dark .navbar-brand .navbar-link:hover,.content kbd.navbar .navbar-brand .navbar-link:hover,.navbar.is-dark .navbar-brand .navbar-link.is-active,.content kbd.navbar .navbar-brand .navbar-link.is-active{background-color:#292929;color:#f5f5f5}.navbar.is-dark .navbar-brand .navbar-link::after,.content kbd.navbar .navbar-brand .navbar-link::after{border-color:#f5f5f5}.navbar.is-dark .navbar-burger,.content kbd.navbar .navbar-burger{color:#f5f5f5}@media screen and (min-width: 1056px){.navbar.is-dark .navbar-start>.navbar-item,.content kbd.navbar .navbar-start>.navbar-item,.navbar.is-dark .navbar-start .navbar-link,.content kbd.navbar .navbar-start .navbar-link,.navbar.is-dark .navbar-end>.navbar-item,.content kbd.navbar .navbar-end>.navbar-item,.navbar.is-dark .navbar-end .navbar-link,.content kbd.navbar .navbar-end .navbar-link{color:#f5f5f5}.navbar.is-dark .navbar-start>a.navbar-item:focus,.content kbd.navbar .navbar-start>a.navbar-item:focus,.navbar.is-dark .navbar-start>a.navbar-item:hover,.content kbd.navbar .navbar-start>a.navbar-item:hover,.navbar.is-dark .navbar-start>a.navbar-item.is-active,.content kbd.navbar .navbar-start>a.navbar-item.is-active,.navbar.is-dark .navbar-start .navbar-link:focus,.content kbd.navbar .navbar-start .navbar-link:focus,.navbar.is-dark .navbar-start .navbar-link:hover,.content kbd.navbar .navbar-start .navbar-link:hover,.navbar.is-dark .navbar-start .navbar-link.is-active,.content kbd.navbar .navbar-start .navbar-link.is-active,.navbar.is-dark .navbar-end>a.navbar-item:focus,.content kbd.navbar .navbar-end>a.navbar-item:focus,.navbar.is-dark .navbar-end>a.navbar-item:hover,.content kbd.navbar .navbar-end>a.navbar-item:hover,.navbar.is-dark .navbar-end>a.navbar-item.is-active,.content kbd.navbar .navbar-end>a.navbar-item.is-active,.navbar.is-dark .navbar-end .navbar-link:focus,.content kbd.navbar .navbar-end .navbar-link:focus,.navbar.is-dark .navbar-end .navbar-link:hover,.content kbd.navbar .navbar-end .navbar-link:hover,.navbar.is-dark .navbar-end .navbar-link.is-active,.content kbd.navbar .navbar-end .navbar-link.is-active{background-color:#292929;color:#f5f5f5}.navbar.is-dark .navbar-start .navbar-link::after,.content kbd.navbar .navbar-start .navbar-link::after,.navbar.is-dark .navbar-end .navbar-link::after,.content kbd.navbar .navbar-end .navbar-link::after{border-color:#f5f5f5}.navbar.is-dark .navbar-item.has-dropdown:focus .navbar-link,.content kbd.navbar .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-dark .navbar-item.has-dropdown:hover .navbar-link,.content kbd.navbar .navbar-item.has-dropdown:hover .navbar-link,.navbar.is-dark .navbar-item.has-dropdown.is-active .navbar-link,.content kbd.navbar .navbar-item.has-dropdown.is-active .navbar-link{background-color:#292929;color:#f5f5f5}.navbar.is-dark .navbar-dropdown a.navbar-item.is-active,.content kbd.navbar .navbar-dropdown a.navbar-item.is-active{background-color:#363636;color:#f5f5f5}}.navbar.is-primary,.docstring>section>a.navbar.docs-sourcelink{background-color:#4eb5de;color:#fff}.navbar.is-primary .navbar-brand>.navbar-item,.docstring>section>a.navbar.docs-sourcelink .navbar-brand>.navbar-item,.navbar.is-primary .navbar-brand .navbar-link,.docstring>section>a.navbar.docs-sourcelink .navbar-brand .navbar-link{color:#fff}.navbar.is-primary .navbar-brand>a.navbar-item:focus,.docstring>section>a.navbar.docs-sourcelink .navbar-brand>a.navbar-item:focus,.navbar.is-primary .navbar-brand>a.navbar-item:hover,.docstring>section>a.navbar.docs-sourcelink .navbar-brand>a.navbar-item:hover,.navbar.is-primary .navbar-brand>a.navbar-item.is-active,.docstring>section>a.navbar.docs-sourcelink .navbar-brand>a.navbar-item.is-active,.navbar.is-primary .navbar-brand .navbar-link:focus,.docstring>section>a.navbar.docs-sourcelink .navbar-brand .navbar-link:focus,.navbar.is-primary .navbar-brand .navbar-link:hover,.docstring>section>a.navbar.docs-sourcelink .navbar-brand .navbar-link:hover,.navbar.is-primary .navbar-brand .navbar-link.is-active,.docstring>section>a.navbar.docs-sourcelink .navbar-brand .navbar-link.is-active{background-color:#39acda;color:#fff}.navbar.is-primary .navbar-brand .navbar-link::after,.docstring>section>a.navbar.docs-sourcelink .navbar-brand .navbar-link::after{border-color:#fff}.navbar.is-primary .navbar-burger,.docstring>section>a.navbar.docs-sourcelink .navbar-burger{color:#fff}@media screen and (min-width: 1056px){.navbar.is-primary .navbar-start>.navbar-item,.docstring>section>a.navbar.docs-sourcelink .navbar-start>.navbar-item,.navbar.is-primary .navbar-start .navbar-link,.docstring>section>a.navbar.docs-sourcelink .navbar-start .navbar-link,.navbar.is-primary .navbar-end>.navbar-item,.docstring>section>a.navbar.docs-sourcelink .navbar-end>.navbar-item,.navbar.is-primary .navbar-end .navbar-link,.docstring>section>a.navbar.docs-sourcelink .navbar-end .navbar-link{color:#fff}.navbar.is-primary .navbar-start>a.navbar-item:focus,.docstring>section>a.navbar.docs-sourcelink .navbar-start>a.navbar-item:focus,.navbar.is-primary .navbar-start>a.navbar-item:hover,.docstring>section>a.navbar.docs-sourcelink .navbar-start>a.navbar-item:hover,.navbar.is-primary .navbar-start>a.navbar-item.is-active,.docstring>section>a.navbar.docs-sourcelink .navbar-start>a.navbar-item.is-active,.navbar.is-primary .navbar-start .navbar-link:focus,.docstring>section>a.navbar.docs-sourcelink .navbar-start .navbar-link:focus,.navbar.is-primary .navbar-start .navbar-link:hover,.docstring>section>a.navbar.docs-sourcelink .navbar-start .navbar-link:hover,.navbar.is-primary .navbar-start .navbar-link.is-active,.docstring>section>a.navbar.docs-sourcelink .navbar-start .navbar-link.is-active,.navbar.is-primary .navbar-end>a.navbar-item:focus,.docstring>section>a.navbar.docs-sourcelink .navbar-end>a.navbar-item:focus,.navbar.is-primary .navbar-end>a.navbar-item:hover,.docstring>section>a.navbar.docs-sourcelink .navbar-end>a.navbar-item:hover,.navbar.is-primary .navbar-end>a.navbar-item.is-active,.docstring>section>a.navbar.docs-sourcelink .navbar-end>a.navbar-item.is-active,.navbar.is-primary .navbar-end .navbar-link:focus,.docstring>section>a.navbar.docs-sourcelink .navbar-end .navbar-link:focus,.navbar.is-primary .navbar-end .navbar-link:hover,.docstring>section>a.navbar.docs-sourcelink .navbar-end .navbar-link:hover,.navbar.is-primary .navbar-end .navbar-link.is-active,.docstring>section>a.navbar.docs-sourcelink .navbar-end .navbar-link.is-active{background-color:#39acda;color:#fff}.navbar.is-primary .navbar-start .navbar-link::after,.docstring>section>a.navbar.docs-sourcelink .navbar-start .navbar-link::after,.navbar.is-primary .navbar-end .navbar-link::after,.docstring>section>a.navbar.docs-sourcelink .navbar-end .navbar-link::after{border-color:#fff}.navbar.is-primary .navbar-item.has-dropdown:focus .navbar-link,.docstring>section>a.navbar.docs-sourcelink .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-primary .navbar-item.has-dropdown:hover .navbar-link,.docstring>section>a.navbar.docs-sourcelink .navbar-item.has-dropdown:hover .navbar-link,.navbar.is-primary .navbar-item.has-dropdown.is-active .navbar-link,.docstring>section>a.navbar.docs-sourcelink .navbar-item.has-dropdown.is-active .navbar-link{background-color:#39acda;color:#fff}.navbar.is-primary .navbar-dropdown a.navbar-item.is-active,.docstring>section>a.navbar.docs-sourcelink .navbar-dropdown a.navbar-item.is-active{background-color:#4eb5de;color:#fff}}.navbar.is-link{background-color:#2e63b8;color:#fff}.navbar.is-link .navbar-brand>.navbar-item,.navbar.is-link .navbar-brand .navbar-link{color:#fff}.navbar.is-link .navbar-brand>a.navbar-item:focus,.navbar.is-link .navbar-brand>a.navbar-item:hover,.navbar.is-link .navbar-brand>a.navbar-item.is-active,.navbar.is-link .navbar-brand .navbar-link:focus,.navbar.is-link .navbar-brand .navbar-link:hover,.navbar.is-link .navbar-brand .navbar-link.is-active{background-color:#2958a4;color:#fff}.navbar.is-link .navbar-brand .navbar-link::after{border-color:#fff}.navbar.is-link .navbar-burger{color:#fff}@media screen and (min-width: 1056px){.navbar.is-link .navbar-start>.navbar-item,.navbar.is-link .navbar-start .navbar-link,.navbar.is-link .navbar-end>.navbar-item,.navbar.is-link .navbar-end .navbar-link{color:#fff}.navbar.is-link .navbar-start>a.navbar-item:focus,.navbar.is-link .navbar-start>a.navbar-item:hover,.navbar.is-link .navbar-start>a.navbar-item.is-active,.navbar.is-link .navbar-start .navbar-link:focus,.navbar.is-link .navbar-start .navbar-link:hover,.navbar.is-link .navbar-start .navbar-link.is-active,.navbar.is-link .navbar-end>a.navbar-item:focus,.navbar.is-link .navbar-end>a.navbar-item:hover,.navbar.is-link .navbar-end>a.navbar-item.is-active,.navbar.is-link .navbar-end .navbar-link:focus,.navbar.is-link .navbar-end .navbar-link:hover,.navbar.is-link .navbar-end .navbar-link.is-active{background-color:#2958a4;color:#fff}.navbar.is-link .navbar-start .navbar-link::after,.navbar.is-link .navbar-end .navbar-link::after{border-color:#fff}.navbar.is-link .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-link .navbar-item.has-dropdown:hover .navbar-link,.navbar.is-link .navbar-item.has-dropdown.is-active .navbar-link{background-color:#2958a4;color:#fff}.navbar.is-link .navbar-dropdown a.navbar-item.is-active{background-color:#2e63b8;color:#fff}}.navbar.is-info{background-color:#209cee;color:#fff}.navbar.is-info .navbar-brand>.navbar-item,.navbar.is-info .navbar-brand .navbar-link{color:#fff}.navbar.is-info .navbar-brand>a.navbar-item:focus,.navbar.is-info .navbar-brand>a.navbar-item:hover,.navbar.is-info .navbar-brand>a.navbar-item.is-active,.navbar.is-info .navbar-brand .navbar-link:focus,.navbar.is-info .navbar-brand .navbar-link:hover,.navbar.is-info .navbar-brand .navbar-link.is-active{background-color:#1190e3;color:#fff}.navbar.is-info .navbar-brand .navbar-link::after{border-color:#fff}.navbar.is-info .navbar-burger{color:#fff}@media screen and (min-width: 1056px){.navbar.is-info .navbar-start>.navbar-item,.navbar.is-info .navbar-start .navbar-link,.navbar.is-info .navbar-end>.navbar-item,.navbar.is-info .navbar-end .navbar-link{color:#fff}.navbar.is-info .navbar-start>a.navbar-item:focus,.navbar.is-info .navbar-start>a.navbar-item:hover,.navbar.is-info .navbar-start>a.navbar-item.is-active,.navbar.is-info .navbar-start .navbar-link:focus,.navbar.is-info .navbar-start .navbar-link:hover,.navbar.is-info .navbar-start .navbar-link.is-active,.navbar.is-info .navbar-end>a.navbar-item:focus,.navbar.is-info .navbar-end>a.navbar-item:hover,.navbar.is-info .navbar-end>a.navbar-item.is-active,.navbar.is-info .navbar-end .navbar-link:focus,.navbar.is-info .navbar-end .navbar-link:hover,.navbar.is-info .navbar-end .navbar-link.is-active{background-color:#1190e3;color:#fff}.navbar.is-info .navbar-start .navbar-link::after,.navbar.is-info .navbar-end .navbar-link::after{border-color:#fff}.navbar.is-info .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-info .navbar-item.has-dropdown:hover .navbar-link,.navbar.is-info .navbar-item.has-dropdown.is-active .navbar-link{background-color:#1190e3;color:#fff}.navbar.is-info .navbar-dropdown a.navbar-item.is-active{background-color:#209cee;color:#fff}}.navbar.is-success{background-color:#22c35b;color:#fff}.navbar.is-success .navbar-brand>.navbar-item,.navbar.is-success .navbar-brand .navbar-link{color:#fff}.navbar.is-success .navbar-brand>a.navbar-item:focus,.navbar.is-success .navbar-brand>a.navbar-item:hover,.navbar.is-success .navbar-brand>a.navbar-item.is-active,.navbar.is-success .navbar-brand .navbar-link:focus,.navbar.is-success .navbar-brand .navbar-link:hover,.navbar.is-success .navbar-brand .navbar-link.is-active{background-color:#1ead51;color:#fff}.navbar.is-success .navbar-brand .navbar-link::after{border-color:#fff}.navbar.is-success .navbar-burger{color:#fff}@media screen and (min-width: 1056px){.navbar.is-success .navbar-start>.navbar-item,.navbar.is-success .navbar-start .navbar-link,.navbar.is-success .navbar-end>.navbar-item,.navbar.is-success .navbar-end .navbar-link{color:#fff}.navbar.is-success .navbar-start>a.navbar-item:focus,.navbar.is-success .navbar-start>a.navbar-item:hover,.navbar.is-success .navbar-start>a.navbar-item.is-active,.navbar.is-success .navbar-start .navbar-link:focus,.navbar.is-success .navbar-start .navbar-link:hover,.navbar.is-success .navbar-start .navbar-link.is-active,.navbar.is-success .navbar-end>a.navbar-item:focus,.navbar.is-success .navbar-end>a.navbar-item:hover,.navbar.is-success .navbar-end>a.navbar-item.is-active,.navbar.is-success .navbar-end .navbar-link:focus,.navbar.is-success .navbar-end .navbar-link:hover,.navbar.is-success .navbar-end .navbar-link.is-active{background-color:#1ead51;color:#fff}.navbar.is-success .navbar-start .navbar-link::after,.navbar.is-success .navbar-end .navbar-link::after{border-color:#fff}.navbar.is-success .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-success .navbar-item.has-dropdown:hover .navbar-link,.navbar.is-success .navbar-item.has-dropdown.is-active .navbar-link{background-color:#1ead51;color:#fff}.navbar.is-success .navbar-dropdown a.navbar-item.is-active{background-color:#22c35b;color:#fff}}.navbar.is-warning{background-color:#ffdd57;color:rgba(0,0,0,0.7)}.navbar.is-warning .navbar-brand>.navbar-item,.navbar.is-warning .navbar-brand .navbar-link{color:rgba(0,0,0,0.7)}.navbar.is-warning .navbar-brand>a.navbar-item:focus,.navbar.is-warning .navbar-brand>a.navbar-item:hover,.navbar.is-warning .navbar-brand>a.navbar-item.is-active,.navbar.is-warning .navbar-brand .navbar-link:focus,.navbar.is-warning .navbar-brand .navbar-link:hover,.navbar.is-warning .navbar-brand .navbar-link.is-active{background-color:#ffd83e;color:rgba(0,0,0,0.7)}.navbar.is-warning .navbar-brand .navbar-link::after{border-color:rgba(0,0,0,0.7)}.navbar.is-warning .navbar-burger{color:rgba(0,0,0,0.7)}@media screen and (min-width: 1056px){.navbar.is-warning .navbar-start>.navbar-item,.navbar.is-warning .navbar-start .navbar-link,.navbar.is-warning .navbar-end>.navbar-item,.navbar.is-warning .navbar-end .navbar-link{color:rgba(0,0,0,0.7)}.navbar.is-warning .navbar-start>a.navbar-item:focus,.navbar.is-warning .navbar-start>a.navbar-item:hover,.navbar.is-warning .navbar-start>a.navbar-item.is-active,.navbar.is-warning .navbar-start .navbar-link:focus,.navbar.is-warning .navbar-start .navbar-link:hover,.navbar.is-warning .navbar-start .navbar-link.is-active,.navbar.is-warning .navbar-end>a.navbar-item:focus,.navbar.is-warning .navbar-end>a.navbar-item:hover,.navbar.is-warning .navbar-end>a.navbar-item.is-active,.navbar.is-warning .navbar-end .navbar-link:focus,.navbar.is-warning .navbar-end .navbar-link:hover,.navbar.is-warning .navbar-end .navbar-link.is-active{background-color:#ffd83e;color:rgba(0,0,0,0.7)}.navbar.is-warning .navbar-start .navbar-link::after,.navbar.is-warning .navbar-end .navbar-link::after{border-color:rgba(0,0,0,0.7)}.navbar.is-warning .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-warning .navbar-item.has-dropdown:hover .navbar-link,.navbar.is-warning .navbar-item.has-dropdown.is-active .navbar-link{background-color:#ffd83e;color:rgba(0,0,0,0.7)}.navbar.is-warning .navbar-dropdown a.navbar-item.is-active{background-color:#ffdd57;color:rgba(0,0,0,0.7)}}.navbar.is-danger{background-color:#da0b00;color:#fff}.navbar.is-danger .navbar-brand>.navbar-item,.navbar.is-danger .navbar-brand .navbar-link{color:#fff}.navbar.is-danger .navbar-brand>a.navbar-item:focus,.navbar.is-danger .navbar-brand>a.navbar-item:hover,.navbar.is-danger .navbar-brand>a.navbar-item.is-active,.navbar.is-danger .navbar-brand .navbar-link:focus,.navbar.is-danger .navbar-brand .navbar-link:hover,.navbar.is-danger .navbar-brand .navbar-link.is-active{background-color:#c10a00;color:#fff}.navbar.is-danger .navbar-brand .navbar-link::after{border-color:#fff}.navbar.is-danger .navbar-burger{color:#fff}@media screen and (min-width: 1056px){.navbar.is-danger .navbar-start>.navbar-item,.navbar.is-danger .navbar-start .navbar-link,.navbar.is-danger .navbar-end>.navbar-item,.navbar.is-danger .navbar-end .navbar-link{color:#fff}.navbar.is-danger .navbar-start>a.navbar-item:focus,.navbar.is-danger .navbar-start>a.navbar-item:hover,.navbar.is-danger .navbar-start>a.navbar-item.is-active,.navbar.is-danger .navbar-start .navbar-link:focus,.navbar.is-danger .navbar-start .navbar-link:hover,.navbar.is-danger .navbar-start .navbar-link.is-active,.navbar.is-danger .navbar-end>a.navbar-item:focus,.navbar.is-danger .navbar-end>a.navbar-item:hover,.navbar.is-danger .navbar-end>a.navbar-item.is-active,.navbar.is-danger .navbar-end .navbar-link:focus,.navbar.is-danger .navbar-end .navbar-link:hover,.navbar.is-danger .navbar-end .navbar-link.is-active{background-color:#c10a00;color:#fff}.navbar.is-danger .navbar-start .navbar-link::after,.navbar.is-danger .navbar-end .navbar-link::after{border-color:#fff}.navbar.is-danger .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-danger .navbar-item.has-dropdown:hover .navbar-link,.navbar.is-danger .navbar-item.has-dropdown.is-active .navbar-link{background-color:#c10a00;color:#fff}.navbar.is-danger .navbar-dropdown a.navbar-item.is-active{background-color:#da0b00;color:#fff}}.navbar>.container{align-items:stretch;display:flex;min-height:3.25rem;width:100%}.navbar.has-shadow{box-shadow:0 2px 0 0 #f5f5f5}.navbar.is-fixed-bottom,.navbar.is-fixed-top{left:0;position:fixed;right:0;z-index:30}.navbar.is-fixed-bottom{bottom:0}.navbar.is-fixed-bottom.has-shadow{box-shadow:0 -2px 0 0 #f5f5f5}.navbar.is-fixed-top{top:0}html.has-navbar-fixed-top,body.has-navbar-fixed-top{padding-top:3.25rem}html.has-navbar-fixed-bottom,body.has-navbar-fixed-bottom{padding-bottom:3.25rem}.navbar-brand,.navbar-tabs{align-items:stretch;display:flex;flex-shrink:0;min-height:3.25rem}.navbar-brand a.navbar-item:focus,.navbar-brand a.navbar-item:hover{background-color:transparent}.navbar-tabs{-webkit-overflow-scrolling:touch;max-width:100vw;overflow-x:auto;overflow-y:hidden}.navbar-burger{color:#4a4a4a;cursor:pointer;display:block;height:3.25rem;position:relative;width:3.25rem;margin-left:auto}.navbar-burger span{background-color:currentColor;display:block;height:1px;left:calc(50% - 8px);position:absolute;transform-origin:center;transition-duration:86ms;transition-property:background-color, opacity, transform;transition-timing-function:ease-out;width:16px}.navbar-burger span:nth-child(1){top:calc(50% - 6px)}.navbar-burger span:nth-child(2){top:calc(50% - 1px)}.navbar-burger span:nth-child(3){top:calc(50% + 4px)}.navbar-burger:hover{background-color:rgba(0,0,0,0.05)}.navbar-burger.is-active span:nth-child(1){transform:translateY(5px) rotate(45deg)}.navbar-burger.is-active span:nth-child(2){opacity:0}.navbar-burger.is-active span:nth-child(3){transform:translateY(-5px) rotate(-45deg)}.navbar-menu{display:none}.navbar-item,.navbar-link{color:#4a4a4a;display:block;line-height:1.5;padding:0.5rem 0.75rem;position:relative}.navbar-item .icon:only-child,.navbar-link .icon:only-child{margin-left:-0.25rem;margin-right:-0.25rem}a.navbar-item,.navbar-link{cursor:pointer}a.navbar-item:focus,a.navbar-item:focus-within,a.navbar-item:hover,a.navbar-item.is-active,.navbar-link:focus,.navbar-link:focus-within,.navbar-link:hover,.navbar-link.is-active{background-color:#fafafa;color:#2e63b8}.navbar-item{display:block;flex-grow:0;flex-shrink:0}.navbar-item img{max-height:1.75rem}.navbar-item.has-dropdown{padding:0}.navbar-item.is-expanded{flex-grow:1;flex-shrink:1}.navbar-item.is-tab{border-bottom:1px solid transparent;min-height:3.25rem;padding-bottom:calc(0.5rem - 1px)}.navbar-item.is-tab:focus,.navbar-item.is-tab:hover{background-color:rgba(0,0,0,0);border-bottom-color:#2e63b8}.navbar-item.is-tab.is-active{background-color:rgba(0,0,0,0);border-bottom-color:#2e63b8;border-bottom-style:solid;border-bottom-width:3px;color:#2e63b8;padding-bottom:calc(0.5rem - 3px)}.navbar-content{flex-grow:1;flex-shrink:1}.navbar-link:not(.is-arrowless){padding-right:2.5em}.navbar-link:not(.is-arrowless)::after{border-color:#2e63b8;margin-top:-0.375em;right:1.125em}.navbar-dropdown{font-size:0.875rem;padding-bottom:0.5rem;padding-top:0.5rem}.navbar-dropdown .navbar-item{padding-left:1.5rem;padding-right:1.5rem}.navbar-divider{background-color:#f5f5f5;border:none;display:none;height:2px;margin:0.5rem 0}@media screen and (max-width: 1055px){.navbar>.container{display:block}.navbar-brand .navbar-item,.navbar-tabs .navbar-item{align-items:center;display:flex}.navbar-link::after{display:none}.navbar-menu{background-color:#fff;box-shadow:0 8px 16px rgba(10,10,10,0.1);padding:0.5rem 0}.navbar-menu.is-active{display:block}.navbar.is-fixed-bottom-touch,.navbar.is-fixed-top-touch{left:0;position:fixed;right:0;z-index:30}.navbar.is-fixed-bottom-touch{bottom:0}.navbar.is-fixed-bottom-touch.has-shadow{box-shadow:0 -2px 3px rgba(10,10,10,0.1)}.navbar.is-fixed-top-touch{top:0}.navbar.is-fixed-top .navbar-menu,.navbar.is-fixed-top-touch .navbar-menu{-webkit-overflow-scrolling:touch;max-height:calc(100vh - 3.25rem);overflow:auto}html.has-navbar-fixed-top-touch,body.has-navbar-fixed-top-touch{padding-top:3.25rem}html.has-navbar-fixed-bottom-touch,body.has-navbar-fixed-bottom-touch{padding-bottom:3.25rem}}@media screen and (min-width: 1056px){.navbar,.navbar-menu,.navbar-start,.navbar-end{align-items:stretch;display:flex}.navbar{min-height:3.25rem}.navbar.is-spaced{padding:1rem 2rem}.navbar.is-spaced .navbar-start,.navbar.is-spaced .navbar-end{align-items:center}.navbar.is-spaced a.navbar-item,.navbar.is-spaced .navbar-link{border-radius:4px}.navbar.is-transparent a.navbar-item:focus,.navbar.is-transparent a.navbar-item:hover,.navbar.is-transparent a.navbar-item.is-active,.navbar.is-transparent .navbar-link:focus,.navbar.is-transparent .navbar-link:hover,.navbar.is-transparent .navbar-link.is-active{background-color:transparent !important}.navbar.is-transparent .navbar-item.has-dropdown.is-active .navbar-link,.navbar.is-transparent .navbar-item.has-dropdown.is-hoverable:focus .navbar-link,.navbar.is-transparent .navbar-item.has-dropdown.is-hoverable:focus-within .navbar-link,.navbar.is-transparent .navbar-item.has-dropdown.is-hoverable:hover .navbar-link{background-color:transparent !important}.navbar.is-transparent .navbar-dropdown a.navbar-item:focus,.navbar.is-transparent .navbar-dropdown a.navbar-item:hover{background-color:#f5f5f5;color:#0a0a0a}.navbar.is-transparent .navbar-dropdown a.navbar-item.is-active{background-color:#f5f5f5;color:#2e63b8}.navbar-burger{display:none}.navbar-item,.navbar-link{align-items:center;display:flex}.navbar-item{display:flex}.navbar-item.has-dropdown{align-items:stretch}.navbar-item.has-dropdown-up .navbar-link::after{transform:rotate(135deg) translate(0.25em, -0.25em)}.navbar-item.has-dropdown-up .navbar-dropdown{border-bottom:2px solid #dbdbdb;border-radius:6px 6px 0 0;border-top:none;bottom:100%;box-shadow:0 -8px 8px rgba(10,10,10,0.1);top:auto}.navbar-item.is-active .navbar-dropdown,.navbar-item.is-hoverable:focus .navbar-dropdown,.navbar-item.is-hoverable:focus-within .navbar-dropdown,.navbar-item.is-hoverable:hover .navbar-dropdown{display:block}.navbar.is-spaced .navbar-item.is-active .navbar-dropdown,.navbar-item.is-active .navbar-dropdown.is-boxed,.navbar.is-spaced .navbar-item.is-hoverable:focus .navbar-dropdown,.navbar-item.is-hoverable:focus .navbar-dropdown.is-boxed,.navbar.is-spaced .navbar-item.is-hoverable:focus-within .navbar-dropdown,.navbar-item.is-hoverable:focus-within .navbar-dropdown.is-boxed,.navbar.is-spaced .navbar-item.is-hoverable:hover .navbar-dropdown,.navbar-item.is-hoverable:hover .navbar-dropdown.is-boxed{opacity:1;pointer-events:auto;transform:translateY(0)}.navbar-menu{flex-grow:1;flex-shrink:0}.navbar-start{justify-content:flex-start;margin-right:auto}.navbar-end{justify-content:flex-end;margin-left:auto}.navbar-dropdown{background-color:#fff;border-bottom-left-radius:6px;border-bottom-right-radius:6px;border-top:2px solid #dbdbdb;box-shadow:0 8px 8px rgba(10,10,10,0.1);display:none;font-size:0.875rem;left:0;min-width:100%;position:absolute;top:100%;z-index:20}.navbar-dropdown .navbar-item{padding:0.375rem 1rem;white-space:nowrap}.navbar-dropdown a.navbar-item{padding-right:3rem}.navbar-dropdown a.navbar-item:focus,.navbar-dropdown a.navbar-item:hover{background-color:#f5f5f5;color:#0a0a0a}.navbar-dropdown a.navbar-item.is-active{background-color:#f5f5f5;color:#2e63b8}.navbar.is-spaced .navbar-dropdown,.navbar-dropdown.is-boxed{border-radius:6px;border-top:none;box-shadow:0 8px 8px rgba(10,10,10,0.1), 0 0 0 1px rgba(10,10,10,0.1);display:block;opacity:0;pointer-events:none;top:calc(100% + (-4px));transform:translateY(-5px);transition-duration:86ms;transition-property:opacity, transform}.navbar-dropdown.is-right{left:auto;right:0}.navbar-divider{display:block}.navbar>.container .navbar-brand,.container>.navbar .navbar-brand{margin-left:-.75rem}.navbar>.container .navbar-menu,.container>.navbar .navbar-menu{margin-right:-.75rem}.navbar.is-fixed-bottom-desktop,.navbar.is-fixed-top-desktop{left:0;position:fixed;right:0;z-index:30}.navbar.is-fixed-bottom-desktop{bottom:0}.navbar.is-fixed-bottom-desktop.has-shadow{box-shadow:0 -2px 3px rgba(10,10,10,0.1)}.navbar.is-fixed-top-desktop{top:0}html.has-navbar-fixed-top-desktop,body.has-navbar-fixed-top-desktop{padding-top:3.25rem}html.has-navbar-fixed-bottom-desktop,body.has-navbar-fixed-bottom-desktop{padding-bottom:3.25rem}html.has-spaced-navbar-fixed-top,body.has-spaced-navbar-fixed-top{padding-top:5.25rem}html.has-spaced-navbar-fixed-bottom,body.has-spaced-navbar-fixed-bottom{padding-bottom:5.25rem}a.navbar-item.is-active,.navbar-link.is-active{color:#0a0a0a}a.navbar-item.is-active:not(:focus):not(:hover),.navbar-link.is-active:not(:focus):not(:hover){background-color:rgba(0,0,0,0)}.navbar-item.has-dropdown:focus .navbar-link,.navbar-item.has-dropdown:hover .navbar-link,.navbar-item.has-dropdown.is-active .navbar-link{background-color:#fafafa}}.hero.is-fullheight-with-navbar{min-height:calc(100vh - 3.25rem)}.pagination{font-size:1rem;margin:-.25rem}.pagination.is-small,#documenter .docs-sidebar form.docs-search>input.pagination{font-size:.75rem}.pagination.is-medium{font-size:1.25rem}.pagination.is-large{font-size:1.5rem}.pagination.is-rounded .pagination-previous,#documenter .docs-sidebar form.docs-search>input.pagination .pagination-previous,.pagination.is-rounded .pagination-next,#documenter .docs-sidebar form.docs-search>input.pagination .pagination-next{padding-left:1em;padding-right:1em;border-radius:290486px}.pagination.is-rounded .pagination-link,#documenter .docs-sidebar form.docs-search>input.pagination .pagination-link{border-radius:290486px}.pagination,.pagination-list{align-items:center;display:flex;justify-content:center;text-align:center}.pagination-previous,.pagination-next,.pagination-link,.pagination-ellipsis{font-size:1em;justify-content:center;margin:.25rem;padding-left:.5em;padding-right:.5em;text-align:center}.pagination-previous,.pagination-next,.pagination-link{border-color:#dbdbdb;color:#363636;min-width:2.25em}.pagination-previous:hover,.pagination-next:hover,.pagination-link:hover{border-color:#b5b5b5;color:#363636}.pagination-previous:focus,.pagination-next:focus,.pagination-link:focus{border-color:#3c5dcd}.pagination-previous:active,.pagination-next:active,.pagination-link:active{box-shadow:inset 0 1px 2px rgba(10,10,10,0.2)}.pagination-previous[disabled],.pagination-next[disabled],.pagination-link[disabled]{background-color:#dbdbdb;border-color:#dbdbdb;box-shadow:none;color:#6b6b6b;opacity:0.5}.pagination-previous,.pagination-next{padding-left:0.75em;padding-right:0.75em;white-space:nowrap}.pagination-link.is-current{background-color:#2e63b8;border-color:#2e63b8;color:#fff}.pagination-ellipsis{color:#b5b5b5;pointer-events:none}.pagination-list{flex-wrap:wrap}@media screen and (max-width: 768px){.pagination{flex-wrap:wrap}.pagination-previous,.pagination-next{flex-grow:1;flex-shrink:1}.pagination-list li{flex-grow:1;flex-shrink:1}}@media screen and (min-width: 769px),print{.pagination-list{flex-grow:1;flex-shrink:1;justify-content:flex-start;order:1}.pagination-previous{order:2}.pagination-next{order:3}.pagination{justify-content:space-between}.pagination.is-centered .pagination-previous{order:1}.pagination.is-centered .pagination-list{justify-content:center;order:2}.pagination.is-centered .pagination-next{order:3}.pagination.is-right .pagination-previous{order:1}.pagination.is-right .pagination-next{order:2}.pagination.is-right .pagination-list{justify-content:flex-end;order:3}}.panel{font-size:1rem}.panel:not(:last-child){margin-bottom:1.5rem}.panel-heading,.panel-tabs,.panel-block{border-bottom:1px solid #dbdbdb;border-left:1px solid #dbdbdb;border-right:1px solid #dbdbdb}.panel-heading:first-child,.panel-tabs:first-child,.panel-block:first-child{border-top:1px solid #dbdbdb}.panel-heading{background-color:#f5f5f5;border-radius:4px 4px 0 0;color:#222;font-size:1.25em;font-weight:300;line-height:1.25;padding:0.5em 0.75em}.panel-tabs{align-items:flex-end;display:flex;font-size:.875em;justify-content:center}.panel-tabs a{border-bottom:1px solid #dbdbdb;margin-bottom:-1px;padding:0.5em}.panel-tabs a.is-active{border-bottom-color:#4a4a4a;color:#363636}.panel-list a{color:#222}.panel-list a:hover{color:#2e63b8}.panel-block{align-items:center;color:#222;display:flex;justify-content:flex-start;padding:0.5em 0.75em}.panel-block input[type="checkbox"]{margin-right:0.75em}.panel-block>.control{flex-grow:1;flex-shrink:1;width:100%}.panel-block.is-wrapped{flex-wrap:wrap}.panel-block.is-active{border-left-color:#2e63b8;color:#363636}.panel-block.is-active .panel-icon{color:#2e63b8}a.panel-block,label.panel-block{cursor:pointer}a.panel-block:hover,label.panel-block:hover{background-color:#f5f5f5}.panel-icon{display:inline-block;font-size:14px;height:1em;line-height:1em;text-align:center;vertical-align:top;width:1em;color:#6b6b6b;margin-right:0.75em}.panel-icon .fa{font-size:inherit;line-height:inherit}.tabs{-webkit-overflow-scrolling:touch;align-items:stretch;display:flex;font-size:1rem;justify-content:space-between;overflow:hidden;overflow-x:auto;white-space:nowrap}.tabs a{align-items:center;border-bottom-color:#dbdbdb;border-bottom-style:solid;border-bottom-width:1px;color:#222;display:flex;justify-content:center;margin-bottom:-1px;padding:0.5em 1em;vertical-align:top}.tabs a:hover{border-bottom-color:#222;color:#222}.tabs li{display:block}.tabs li.is-active a{border-bottom-color:#2e63b8;color:#2e63b8}.tabs ul{align-items:center;border-bottom-color:#dbdbdb;border-bottom-style:solid;border-bottom-width:1px;display:flex;flex-grow:1;flex-shrink:0;justify-content:flex-start}.tabs ul.is-left{padding-right:0.75em}.tabs ul.is-center{flex:none;justify-content:center;padding-left:0.75em;padding-right:0.75em}.tabs ul.is-right{justify-content:flex-end;padding-left:0.75em}.tabs .icon:first-child{margin-right:0.5em}.tabs .icon:last-child{margin-left:0.5em}.tabs.is-centered ul{justify-content:center}.tabs.is-right ul{justify-content:flex-end}.tabs.is-boxed a{border:1px solid transparent;border-radius:4px 4px 0 0}.tabs.is-boxed a:hover{background-color:#f5f5f5;border-bottom-color:#dbdbdb}.tabs.is-boxed li.is-active a{background-color:#fff;border-color:#dbdbdb;border-bottom-color:rgba(0,0,0,0) !important}.tabs.is-fullwidth li{flex-grow:1;flex-shrink:0}.tabs.is-toggle a{border-color:#dbdbdb;border-style:solid;border-width:1px;margin-bottom:0;position:relative}.tabs.is-toggle a:hover{background-color:#f5f5f5;border-color:#b5b5b5;z-index:2}.tabs.is-toggle li+li{margin-left:-1px}.tabs.is-toggle li:first-child a{border-radius:4px 0 0 4px}.tabs.is-toggle li:last-child a{border-radius:0 4px 4px 0}.tabs.is-toggle li.is-active a{background-color:#2e63b8;border-color:#2e63b8;color:#fff;z-index:1}.tabs.is-toggle ul{border-bottom:none}.tabs.is-toggle.is-toggle-rounded li:first-child a{border-bottom-left-radius:290486px;border-top-left-radius:290486px;padding-left:1.25em}.tabs.is-toggle.is-toggle-rounded li:last-child a{border-bottom-right-radius:290486px;border-top-right-radius:290486px;padding-right:1.25em}.tabs.is-small,#documenter .docs-sidebar form.docs-search>input.tabs{font-size:.75rem}.tabs.is-medium{font-size:1.25rem}.tabs.is-large{font-size:1.5rem}.column{display:block;flex-basis:0;flex-grow:1;flex-shrink:1;padding:.75rem}.columns.is-mobile>.column.is-narrow{flex:none}.columns.is-mobile>.column.is-full{flex:none;width:100%}.columns.is-mobile>.column.is-three-quarters{flex:none;width:75%}.columns.is-mobile>.column.is-two-thirds{flex:none;width:66.6666%}.columns.is-mobile>.column.is-half{flex:none;width:50%}.columns.is-mobile>.column.is-one-third{flex:none;width:33.3333%}.columns.is-mobile>.column.is-one-quarter{flex:none;width:25%}.columns.is-mobile>.column.is-one-fifth{flex:none;width:20%}.columns.is-mobile>.column.is-two-fifths{flex:none;width:40%}.columns.is-mobile>.column.is-three-fifths{flex:none;width:60%}.columns.is-mobile>.column.is-four-fifths{flex:none;width:80%}.columns.is-mobile>.column.is-offset-three-quarters{margin-left:75%}.columns.is-mobile>.column.is-offset-two-thirds{margin-left:66.6666%}.columns.is-mobile>.column.is-offset-half{margin-left:50%}.columns.is-mobile>.column.is-offset-one-third{margin-left:33.3333%}.columns.is-mobile>.column.is-offset-one-quarter{margin-left:25%}.columns.is-mobile>.column.is-offset-one-fifth{margin-left:20%}.columns.is-mobile>.column.is-offset-two-fifths{margin-left:40%}.columns.is-mobile>.column.is-offset-three-fifths{margin-left:60%}.columns.is-mobile>.column.is-offset-four-fifths{margin-left:80%}.columns.is-mobile>.column.is-0{flex:none;width:0%}.columns.is-mobile>.column.is-offset-0{margin-left:0%}.columns.is-mobile>.column.is-1{flex:none;width:8.3333333333%}.columns.is-mobile>.column.is-offset-1{margin-left:8.3333333333%}.columns.is-mobile>.column.is-2{flex:none;width:16.6666666667%}.columns.is-mobile>.column.is-offset-2{margin-left:16.6666666667%}.columns.is-mobile>.column.is-3{flex:none;width:25%}.columns.is-mobile>.column.is-offset-3{margin-left:25%}.columns.is-mobile>.column.is-4{flex:none;width:33.3333333333%}.columns.is-mobile>.column.is-offset-4{margin-left:33.3333333333%}.columns.is-mobile>.column.is-5{flex:none;width:41.6666666667%}.columns.is-mobile>.column.is-offset-5{margin-left:41.6666666667%}.columns.is-mobile>.column.is-6{flex:none;width:50%}.columns.is-mobile>.column.is-offset-6{margin-left:50%}.columns.is-mobile>.column.is-7{flex:none;width:58.3333333333%}.columns.is-mobile>.column.is-offset-7{margin-left:58.3333333333%}.columns.is-mobile>.column.is-8{flex:none;width:66.6666666667%}.columns.is-mobile>.column.is-offset-8{margin-left:66.6666666667%}.columns.is-mobile>.column.is-9{flex:none;width:75%}.columns.is-mobile>.column.is-offset-9{margin-left:75%}.columns.is-mobile>.column.is-10{flex:none;width:83.3333333333%}.columns.is-mobile>.column.is-offset-10{margin-left:83.3333333333%}.columns.is-mobile>.column.is-11{flex:none;width:91.6666666667%}.columns.is-mobile>.column.is-offset-11{margin-left:91.6666666667%}.columns.is-mobile>.column.is-12{flex:none;width:100%}.columns.is-mobile>.column.is-offset-12{margin-left:100%}@media screen and (max-width: 768px){.column.is-narrow-mobile{flex:none}.column.is-full-mobile{flex:none;width:100%}.column.is-three-quarters-mobile{flex:none;width:75%}.column.is-two-thirds-mobile{flex:none;width:66.6666%}.column.is-half-mobile{flex:none;width:50%}.column.is-one-third-mobile{flex:none;width:33.3333%}.column.is-one-quarter-mobile{flex:none;width:25%}.column.is-one-fifth-mobile{flex:none;width:20%}.column.is-two-fifths-mobile{flex:none;width:40%}.column.is-three-fifths-mobile{flex:none;width:60%}.column.is-four-fifths-mobile{flex:none;width:80%}.column.is-offset-three-quarters-mobile{margin-left:75%}.column.is-offset-two-thirds-mobile{margin-left:66.6666%}.column.is-offset-half-mobile{margin-left:50%}.column.is-offset-one-third-mobile{margin-left:33.3333%}.column.is-offset-one-quarter-mobile{margin-left:25%}.column.is-offset-one-fifth-mobile{margin-left:20%}.column.is-offset-two-fifths-mobile{margin-left:40%}.column.is-offset-three-fifths-mobile{margin-left:60%}.column.is-offset-four-fifths-mobile{margin-left:80%}.column.is-0-mobile{flex:none;width:0%}.column.is-offset-0-mobile{margin-left:0%}.column.is-1-mobile{flex:none;width:8.3333333333%}.column.is-offset-1-mobile{margin-left:8.3333333333%}.column.is-2-mobile{flex:none;width:16.6666666667%}.column.is-offset-2-mobile{margin-left:16.6666666667%}.column.is-3-mobile{flex:none;width:25%}.column.is-offset-3-mobile{margin-left:25%}.column.is-4-mobile{flex:none;width:33.3333333333%}.column.is-offset-4-mobile{margin-left:33.3333333333%}.column.is-5-mobile{flex:none;width:41.6666666667%}.column.is-offset-5-mobile{margin-left:41.6666666667%}.column.is-6-mobile{flex:none;width:50%}.column.is-offset-6-mobile{margin-left:50%}.column.is-7-mobile{flex:none;width:58.3333333333%}.column.is-offset-7-mobile{margin-left:58.3333333333%}.column.is-8-mobile{flex:none;width:66.6666666667%}.column.is-offset-8-mobile{margin-left:66.6666666667%}.column.is-9-mobile{flex:none;width:75%}.column.is-offset-9-mobile{margin-left:75%}.column.is-10-mobile{flex:none;width:83.3333333333%}.column.is-offset-10-mobile{margin-left:83.3333333333%}.column.is-11-mobile{flex:none;width:91.6666666667%}.column.is-offset-11-mobile{margin-left:91.6666666667%}.column.is-12-mobile{flex:none;width:100%}.column.is-offset-12-mobile{margin-left:100%}}@media screen and (min-width: 769px),print{.column.is-narrow,.column.is-narrow-tablet{flex:none}.column.is-full,.column.is-full-tablet{flex:none;width:100%}.column.is-three-quarters,.column.is-three-quarters-tablet{flex:none;width:75%}.column.is-two-thirds,.column.is-two-thirds-tablet{flex:none;width:66.6666%}.column.is-half,.column.is-half-tablet{flex:none;width:50%}.column.is-one-third,.column.is-one-third-tablet{flex:none;width:33.3333%}.column.is-one-quarter,.column.is-one-quarter-tablet{flex:none;width:25%}.column.is-one-fifth,.column.is-one-fifth-tablet{flex:none;width:20%}.column.is-two-fifths,.column.is-two-fifths-tablet{flex:none;width:40%}.column.is-three-fifths,.column.is-three-fifths-tablet{flex:none;width:60%}.column.is-four-fifths,.column.is-four-fifths-tablet{flex:none;width:80%}.column.is-offset-three-quarters,.column.is-offset-three-quarters-tablet{margin-left:75%}.column.is-offset-two-thirds,.column.is-offset-two-thirds-tablet{margin-left:66.6666%}.column.is-offset-half,.column.is-offset-half-tablet{margin-left:50%}.column.is-offset-one-third,.column.is-offset-one-third-tablet{margin-left:33.3333%}.column.is-offset-one-quarter,.column.is-offset-one-quarter-tablet{margin-left:25%}.column.is-offset-one-fifth,.column.is-offset-one-fifth-tablet{margin-left:20%}.column.is-offset-two-fifths,.column.is-offset-two-fifths-tablet{margin-left:40%}.column.is-offset-three-fifths,.column.is-offset-three-fifths-tablet{margin-left:60%}.column.is-offset-four-fifths,.column.is-offset-four-fifths-tablet{margin-left:80%}.column.is-0,.column.is-0-tablet{flex:none;width:0%}.column.is-offset-0,.column.is-offset-0-tablet{margin-left:0%}.column.is-1,.column.is-1-tablet{flex:none;width:8.3333333333%}.column.is-offset-1,.column.is-offset-1-tablet{margin-left:8.3333333333%}.column.is-2,.column.is-2-tablet{flex:none;width:16.6666666667%}.column.is-offset-2,.column.is-offset-2-tablet{margin-left:16.6666666667%}.column.is-3,.column.is-3-tablet{flex:none;width:25%}.column.is-offset-3,.column.is-offset-3-tablet{margin-left:25%}.column.is-4,.column.is-4-tablet{flex:none;width:33.3333333333%}.column.is-offset-4,.column.is-offset-4-tablet{margin-left:33.3333333333%}.column.is-5,.column.is-5-tablet{flex:none;width:41.6666666667%}.column.is-offset-5,.column.is-offset-5-tablet{margin-left:41.6666666667%}.column.is-6,.column.is-6-tablet{flex:none;width:50%}.column.is-offset-6,.column.is-offset-6-tablet{margin-left:50%}.column.is-7,.column.is-7-tablet{flex:none;width:58.3333333333%}.column.is-offset-7,.column.is-offset-7-tablet{margin-left:58.3333333333%}.column.is-8,.column.is-8-tablet{flex:none;width:66.6666666667%}.column.is-offset-8,.column.is-offset-8-tablet{margin-left:66.6666666667%}.column.is-9,.column.is-9-tablet{flex:none;width:75%}.column.is-offset-9,.column.is-offset-9-tablet{margin-left:75%}.column.is-10,.column.is-10-tablet{flex:none;width:83.3333333333%}.column.is-offset-10,.column.is-offset-10-tablet{margin-left:83.3333333333%}.column.is-11,.column.is-11-tablet{flex:none;width:91.6666666667%}.column.is-offset-11,.column.is-offset-11-tablet{margin-left:91.6666666667%}.column.is-12,.column.is-12-tablet{flex:none;width:100%}.column.is-offset-12,.column.is-offset-12-tablet{margin-left:100%}}@media screen and (max-width: 1055px){.column.is-narrow-touch{flex:none}.column.is-full-touch{flex:none;width:100%}.column.is-three-quarters-touch{flex:none;width:75%}.column.is-two-thirds-touch{flex:none;width:66.6666%}.column.is-half-touch{flex:none;width:50%}.column.is-one-third-touch{flex:none;width:33.3333%}.column.is-one-quarter-touch{flex:none;width:25%}.column.is-one-fifth-touch{flex:none;width:20%}.column.is-two-fifths-touch{flex:none;width:40%}.column.is-three-fifths-touch{flex:none;width:60%}.column.is-four-fifths-touch{flex:none;width:80%}.column.is-offset-three-quarters-touch{margin-left:75%}.column.is-offset-two-thirds-touch{margin-left:66.6666%}.column.is-offset-half-touch{margin-left:50%}.column.is-offset-one-third-touch{margin-left:33.3333%}.column.is-offset-one-quarter-touch{margin-left:25%}.column.is-offset-one-fifth-touch{margin-left:20%}.column.is-offset-two-fifths-touch{margin-left:40%}.column.is-offset-three-fifths-touch{margin-left:60%}.column.is-offset-four-fifths-touch{margin-left:80%}.column.is-0-touch{flex:none;width:0%}.column.is-offset-0-touch{margin-left:0%}.column.is-1-touch{flex:none;width:8.3333333333%}.column.is-offset-1-touch{margin-left:8.3333333333%}.column.is-2-touch{flex:none;width:16.6666666667%}.column.is-offset-2-touch{margin-left:16.6666666667%}.column.is-3-touch{flex:none;width:25%}.column.is-offset-3-touch{margin-left:25%}.column.is-4-touch{flex:none;width:33.3333333333%}.column.is-offset-4-touch{margin-left:33.3333333333%}.column.is-5-touch{flex:none;width:41.6666666667%}.column.is-offset-5-touch{margin-left:41.6666666667%}.column.is-6-touch{flex:none;width:50%}.column.is-offset-6-touch{margin-left:50%}.column.is-7-touch{flex:none;width:58.3333333333%}.column.is-offset-7-touch{margin-left:58.3333333333%}.column.is-8-touch{flex:none;width:66.6666666667%}.column.is-offset-8-touch{margin-left:66.6666666667%}.column.is-9-touch{flex:none;width:75%}.column.is-offset-9-touch{margin-left:75%}.column.is-10-touch{flex:none;width:83.3333333333%}.column.is-offset-10-touch{margin-left:83.3333333333%}.column.is-11-touch{flex:none;width:91.6666666667%}.column.is-offset-11-touch{margin-left:91.6666666667%}.column.is-12-touch{flex:none;width:100%}.column.is-offset-12-touch{margin-left:100%}}@media screen and (min-width: 1056px){.column.is-narrow-desktop{flex:none}.column.is-full-desktop{flex:none;width:100%}.column.is-three-quarters-desktop{flex:none;width:75%}.column.is-two-thirds-desktop{flex:none;width:66.6666%}.column.is-half-desktop{flex:none;width:50%}.column.is-one-third-desktop{flex:none;width:33.3333%}.column.is-one-quarter-desktop{flex:none;width:25%}.column.is-one-fifth-desktop{flex:none;width:20%}.column.is-two-fifths-desktop{flex:none;width:40%}.column.is-three-fifths-desktop{flex:none;width:60%}.column.is-four-fifths-desktop{flex:none;width:80%}.column.is-offset-three-quarters-desktop{margin-left:75%}.column.is-offset-two-thirds-desktop{margin-left:66.6666%}.column.is-offset-half-desktop{margin-left:50%}.column.is-offset-one-third-desktop{margin-left:33.3333%}.column.is-offset-one-quarter-desktop{margin-left:25%}.column.is-offset-one-fifth-desktop{margin-left:20%}.column.is-offset-two-fifths-desktop{margin-left:40%}.column.is-offset-three-fifths-desktop{margin-left:60%}.column.is-offset-four-fifths-desktop{margin-left:80%}.column.is-0-desktop{flex:none;width:0%}.column.is-offset-0-desktop{margin-left:0%}.column.is-1-desktop{flex:none;width:8.3333333333%}.column.is-offset-1-desktop{margin-left:8.3333333333%}.column.is-2-desktop{flex:none;width:16.6666666667%}.column.is-offset-2-desktop{margin-left:16.6666666667%}.column.is-3-desktop{flex:none;width:25%}.column.is-offset-3-desktop{margin-left:25%}.column.is-4-desktop{flex:none;width:33.3333333333%}.column.is-offset-4-desktop{margin-left:33.3333333333%}.column.is-5-desktop{flex:none;width:41.6666666667%}.column.is-offset-5-desktop{margin-left:41.6666666667%}.column.is-6-desktop{flex:none;width:50%}.column.is-offset-6-desktop{margin-left:50%}.column.is-7-desktop{flex:none;width:58.3333333333%}.column.is-offset-7-desktop{margin-left:58.3333333333%}.column.is-8-desktop{flex:none;width:66.6666666667%}.column.is-offset-8-desktop{margin-left:66.6666666667%}.column.is-9-desktop{flex:none;width:75%}.column.is-offset-9-desktop{margin-left:75%}.column.is-10-desktop{flex:none;width:83.3333333333%}.column.is-offset-10-desktop{margin-left:83.3333333333%}.column.is-11-desktop{flex:none;width:91.6666666667%}.column.is-offset-11-desktop{margin-left:91.6666666667%}.column.is-12-desktop{flex:none;width:100%}.column.is-offset-12-desktop{margin-left:100%}}@media screen and (min-width: 1216px){.column.is-narrow-widescreen{flex:none}.column.is-full-widescreen{flex:none;width:100%}.column.is-three-quarters-widescreen{flex:none;width:75%}.column.is-two-thirds-widescreen{flex:none;width:66.6666%}.column.is-half-widescreen{flex:none;width:50%}.column.is-one-third-widescreen{flex:none;width:33.3333%}.column.is-one-quarter-widescreen{flex:none;width:25%}.column.is-one-fifth-widescreen{flex:none;width:20%}.column.is-two-fifths-widescreen{flex:none;width:40%}.column.is-three-fifths-widescreen{flex:none;width:60%}.column.is-four-fifths-widescreen{flex:none;width:80%}.column.is-offset-three-quarters-widescreen{margin-left:75%}.column.is-offset-two-thirds-widescreen{margin-left:66.6666%}.column.is-offset-half-widescreen{margin-left:50%}.column.is-offset-one-third-widescreen{margin-left:33.3333%}.column.is-offset-one-quarter-widescreen{margin-left:25%}.column.is-offset-one-fifth-widescreen{margin-left:20%}.column.is-offset-two-fifths-widescreen{margin-left:40%}.column.is-offset-three-fifths-widescreen{margin-left:60%}.column.is-offset-four-fifths-widescreen{margin-left:80%}.column.is-0-widescreen{flex:none;width:0%}.column.is-offset-0-widescreen{margin-left:0%}.column.is-1-widescreen{flex:none;width:8.3333333333%}.column.is-offset-1-widescreen{margin-left:8.3333333333%}.column.is-2-widescreen{flex:none;width:16.6666666667%}.column.is-offset-2-widescreen{margin-left:16.6666666667%}.column.is-3-widescreen{flex:none;width:25%}.column.is-offset-3-widescreen{margin-left:25%}.column.is-4-widescreen{flex:none;width:33.3333333333%}.column.is-offset-4-widescreen{margin-left:33.3333333333%}.column.is-5-widescreen{flex:none;width:41.6666666667%}.column.is-offset-5-widescreen{margin-left:41.6666666667%}.column.is-6-widescreen{flex:none;width:50%}.column.is-offset-6-widescreen{margin-left:50%}.column.is-7-widescreen{flex:none;width:58.3333333333%}.column.is-offset-7-widescreen{margin-left:58.3333333333%}.column.is-8-widescreen{flex:none;width:66.6666666667%}.column.is-offset-8-widescreen{margin-left:66.6666666667%}.column.is-9-widescreen{flex:none;width:75%}.column.is-offset-9-widescreen{margin-left:75%}.column.is-10-widescreen{flex:none;width:83.3333333333%}.column.is-offset-10-widescreen{margin-left:83.3333333333%}.column.is-11-widescreen{flex:none;width:91.6666666667%}.column.is-offset-11-widescreen{margin-left:91.6666666667%}.column.is-12-widescreen{flex:none;width:100%}.column.is-offset-12-widescreen{margin-left:100%}}@media screen and (min-width: 1408px){.column.is-narrow-fullhd{flex:none}.column.is-full-fullhd{flex:none;width:100%}.column.is-three-quarters-fullhd{flex:none;width:75%}.column.is-two-thirds-fullhd{flex:none;width:66.6666%}.column.is-half-fullhd{flex:none;width:50%}.column.is-one-third-fullhd{flex:none;width:33.3333%}.column.is-one-quarter-fullhd{flex:none;width:25%}.column.is-one-fifth-fullhd{flex:none;width:20%}.column.is-two-fifths-fullhd{flex:none;width:40%}.column.is-three-fifths-fullhd{flex:none;width:60%}.column.is-four-fifths-fullhd{flex:none;width:80%}.column.is-offset-three-quarters-fullhd{margin-left:75%}.column.is-offset-two-thirds-fullhd{margin-left:66.6666%}.column.is-offset-half-fullhd{margin-left:50%}.column.is-offset-one-third-fullhd{margin-left:33.3333%}.column.is-offset-one-quarter-fullhd{margin-left:25%}.column.is-offset-one-fifth-fullhd{margin-left:20%}.column.is-offset-two-fifths-fullhd{margin-left:40%}.column.is-offset-three-fifths-fullhd{margin-left:60%}.column.is-offset-four-fifths-fullhd{margin-left:80%}.column.is-0-fullhd{flex:none;width:0%}.column.is-offset-0-fullhd{margin-left:0%}.column.is-1-fullhd{flex:none;width:8.3333333333%}.column.is-offset-1-fullhd{margin-left:8.3333333333%}.column.is-2-fullhd{flex:none;width:16.6666666667%}.column.is-offset-2-fullhd{margin-left:16.6666666667%}.column.is-3-fullhd{flex:none;width:25%}.column.is-offset-3-fullhd{margin-left:25%}.column.is-4-fullhd{flex:none;width:33.3333333333%}.column.is-offset-4-fullhd{margin-left:33.3333333333%}.column.is-5-fullhd{flex:none;width:41.6666666667%}.column.is-offset-5-fullhd{margin-left:41.6666666667%}.column.is-6-fullhd{flex:none;width:50%}.column.is-offset-6-fullhd{margin-left:50%}.column.is-7-fullhd{flex:none;width:58.3333333333%}.column.is-offset-7-fullhd{margin-left:58.3333333333%}.column.is-8-fullhd{flex:none;width:66.6666666667%}.column.is-offset-8-fullhd{margin-left:66.6666666667%}.column.is-9-fullhd{flex:none;width:75%}.column.is-offset-9-fullhd{margin-left:75%}.column.is-10-fullhd{flex:none;width:83.3333333333%}.column.is-offset-10-fullhd{margin-left:83.3333333333%}.column.is-11-fullhd{flex:none;width:91.6666666667%}.column.is-offset-11-fullhd{margin-left:91.6666666667%}.column.is-12-fullhd{flex:none;width:100%}.column.is-offset-12-fullhd{margin-left:100%}}.columns{margin-left:-.75rem;margin-right:-.75rem;margin-top:-.75rem}.columns:last-child{margin-bottom:-.75rem}.columns:not(:last-child){margin-bottom:calc(1.5rem - .75rem)}.columns.is-centered{justify-content:center}.columns.is-gapless{margin-left:0;margin-right:0;margin-top:0}.columns.is-gapless>.column{margin:0;padding:0 !important}.columns.is-gapless:not(:last-child){margin-bottom:1.5rem}.columns.is-gapless:last-child{margin-bottom:0}.columns.is-mobile{display:flex}.columns.is-multiline{flex-wrap:wrap}.columns.is-vcentered{align-items:center}@media screen and (min-width: 769px),print{.columns:not(.is-desktop){display:flex}}@media screen and (min-width: 1056px){.columns.is-desktop{display:flex}}.columns.is-variable{--columnGap: 0.75rem;margin-left:calc(-1 * var(--columnGap));margin-right:calc(-1 * var(--columnGap))}.columns.is-variable .column{padding-left:var(--columnGap);padding-right:var(--columnGap)}.columns.is-variable.is-0{--columnGap: 0rem}@media screen and (max-width: 768px){.columns.is-variable.is-0-mobile{--columnGap: 0rem}}@media screen and (min-width: 769px),print{.columns.is-variable.is-0-tablet{--columnGap: 0rem}}@media screen and (min-width: 769px) and (max-width: 1055px){.columns.is-variable.is-0-tablet-only{--columnGap: 0rem}}@media screen and (max-width: 1055px){.columns.is-variable.is-0-touch{--columnGap: 0rem}}@media screen and (min-width: 1056px){.columns.is-variable.is-0-desktop{--columnGap: 0rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){.columns.is-variable.is-0-desktop-only{--columnGap: 0rem}}@media screen and (min-width: 1216px){.columns.is-variable.is-0-widescreen{--columnGap: 0rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){.columns.is-variable.is-0-widescreen-only{--columnGap: 0rem}}@media screen and (min-width: 1408px){.columns.is-variable.is-0-fullhd{--columnGap: 0rem}}.columns.is-variable.is-1{--columnGap: .25rem}@media screen and (max-width: 768px){.columns.is-variable.is-1-mobile{--columnGap: .25rem}}@media screen and (min-width: 769px),print{.columns.is-variable.is-1-tablet{--columnGap: .25rem}}@media screen and (min-width: 769px) and (max-width: 1055px){.columns.is-variable.is-1-tablet-only{--columnGap: .25rem}}@media screen and (max-width: 1055px){.columns.is-variable.is-1-touch{--columnGap: .25rem}}@media screen and (min-width: 1056px){.columns.is-variable.is-1-desktop{--columnGap: .25rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){.columns.is-variable.is-1-desktop-only{--columnGap: .25rem}}@media screen and (min-width: 1216px){.columns.is-variable.is-1-widescreen{--columnGap: .25rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){.columns.is-variable.is-1-widescreen-only{--columnGap: .25rem}}@media screen and (min-width: 1408px){.columns.is-variable.is-1-fullhd{--columnGap: .25rem}}.columns.is-variable.is-2{--columnGap: .5rem}@media screen and (max-width: 768px){.columns.is-variable.is-2-mobile{--columnGap: .5rem}}@media screen and (min-width: 769px),print{.columns.is-variable.is-2-tablet{--columnGap: .5rem}}@media screen and (min-width: 769px) and (max-width: 1055px){.columns.is-variable.is-2-tablet-only{--columnGap: .5rem}}@media screen and (max-width: 1055px){.columns.is-variable.is-2-touch{--columnGap: .5rem}}@media screen and (min-width: 1056px){.columns.is-variable.is-2-desktop{--columnGap: .5rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){.columns.is-variable.is-2-desktop-only{--columnGap: .5rem}}@media screen and (min-width: 1216px){.columns.is-variable.is-2-widescreen{--columnGap: .5rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){.columns.is-variable.is-2-widescreen-only{--columnGap: .5rem}}@media screen and (min-width: 1408px){.columns.is-variable.is-2-fullhd{--columnGap: .5rem}}.columns.is-variable.is-3{--columnGap: .75rem}@media screen and (max-width: 768px){.columns.is-variable.is-3-mobile{--columnGap: .75rem}}@media screen and (min-width: 769px),print{.columns.is-variable.is-3-tablet{--columnGap: .75rem}}@media screen and (min-width: 769px) and (max-width: 1055px){.columns.is-variable.is-3-tablet-only{--columnGap: .75rem}}@media screen and (max-width: 1055px){.columns.is-variable.is-3-touch{--columnGap: .75rem}}@media screen and (min-width: 1056px){.columns.is-variable.is-3-desktop{--columnGap: .75rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){.columns.is-variable.is-3-desktop-only{--columnGap: .75rem}}@media screen and (min-width: 1216px){.columns.is-variable.is-3-widescreen{--columnGap: .75rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){.columns.is-variable.is-3-widescreen-only{--columnGap: .75rem}}@media screen and (min-width: 1408px){.columns.is-variable.is-3-fullhd{--columnGap: .75rem}}.columns.is-variable.is-4{--columnGap: 1rem}@media screen and (max-width: 768px){.columns.is-variable.is-4-mobile{--columnGap: 1rem}}@media screen and (min-width: 769px),print{.columns.is-variable.is-4-tablet{--columnGap: 1rem}}@media screen and (min-width: 769px) and (max-width: 1055px){.columns.is-variable.is-4-tablet-only{--columnGap: 1rem}}@media screen and (max-width: 1055px){.columns.is-variable.is-4-touch{--columnGap: 1rem}}@media screen and (min-width: 1056px){.columns.is-variable.is-4-desktop{--columnGap: 1rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){.columns.is-variable.is-4-desktop-only{--columnGap: 1rem}}@media screen and (min-width: 1216px){.columns.is-variable.is-4-widescreen{--columnGap: 1rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){.columns.is-variable.is-4-widescreen-only{--columnGap: 1rem}}@media screen and (min-width: 1408px){.columns.is-variable.is-4-fullhd{--columnGap: 1rem}}.columns.is-variable.is-5{--columnGap: 1.25rem}@media screen and (max-width: 768px){.columns.is-variable.is-5-mobile{--columnGap: 1.25rem}}@media screen and (min-width: 769px),print{.columns.is-variable.is-5-tablet{--columnGap: 1.25rem}}@media screen and (min-width: 769px) and (max-width: 1055px){.columns.is-variable.is-5-tablet-only{--columnGap: 1.25rem}}@media screen and (max-width: 1055px){.columns.is-variable.is-5-touch{--columnGap: 1.25rem}}@media screen and (min-width: 1056px){.columns.is-variable.is-5-desktop{--columnGap: 1.25rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){.columns.is-variable.is-5-desktop-only{--columnGap: 1.25rem}}@media screen and (min-width: 1216px){.columns.is-variable.is-5-widescreen{--columnGap: 1.25rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){.columns.is-variable.is-5-widescreen-only{--columnGap: 1.25rem}}@media screen and (min-width: 1408px){.columns.is-variable.is-5-fullhd{--columnGap: 1.25rem}}.columns.is-variable.is-6{--columnGap: 1.5rem}@media screen and (max-width: 768px){.columns.is-variable.is-6-mobile{--columnGap: 1.5rem}}@media screen and (min-width: 769px),print{.columns.is-variable.is-6-tablet{--columnGap: 1.5rem}}@media screen and (min-width: 769px) and (max-width: 1055px){.columns.is-variable.is-6-tablet-only{--columnGap: 1.5rem}}@media screen and (max-width: 1055px){.columns.is-variable.is-6-touch{--columnGap: 1.5rem}}@media screen and (min-width: 1056px){.columns.is-variable.is-6-desktop{--columnGap: 1.5rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){.columns.is-variable.is-6-desktop-only{--columnGap: 1.5rem}}@media screen and (min-width: 1216px){.columns.is-variable.is-6-widescreen{--columnGap: 1.5rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){.columns.is-variable.is-6-widescreen-only{--columnGap: 1.5rem}}@media screen and (min-width: 1408px){.columns.is-variable.is-6-fullhd{--columnGap: 1.5rem}}.columns.is-variable.is-7{--columnGap: 1.75rem}@media screen and (max-width: 768px){.columns.is-variable.is-7-mobile{--columnGap: 1.75rem}}@media screen and (min-width: 769px),print{.columns.is-variable.is-7-tablet{--columnGap: 1.75rem}}@media screen and (min-width: 769px) and (max-width: 1055px){.columns.is-variable.is-7-tablet-only{--columnGap: 1.75rem}}@media screen and (max-width: 1055px){.columns.is-variable.is-7-touch{--columnGap: 1.75rem}}@media screen and (min-width: 1056px){.columns.is-variable.is-7-desktop{--columnGap: 1.75rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){.columns.is-variable.is-7-desktop-only{--columnGap: 1.75rem}}@media screen and (min-width: 1216px){.columns.is-variable.is-7-widescreen{--columnGap: 1.75rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){.columns.is-variable.is-7-widescreen-only{--columnGap: 1.75rem}}@media screen and (min-width: 1408px){.columns.is-variable.is-7-fullhd{--columnGap: 1.75rem}}.columns.is-variable.is-8{--columnGap: 2rem}@media screen and (max-width: 768px){.columns.is-variable.is-8-mobile{--columnGap: 2rem}}@media screen and (min-width: 769px),print{.columns.is-variable.is-8-tablet{--columnGap: 2rem}}@media screen and (min-width: 769px) and (max-width: 1055px){.columns.is-variable.is-8-tablet-only{--columnGap: 2rem}}@media screen and (max-width: 1055px){.columns.is-variable.is-8-touch{--columnGap: 2rem}}@media screen and (min-width: 1056px){.columns.is-variable.is-8-desktop{--columnGap: 2rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){.columns.is-variable.is-8-desktop-only{--columnGap: 2rem}}@media screen and (min-width: 1216px){.columns.is-variable.is-8-widescreen{--columnGap: 2rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){.columns.is-variable.is-8-widescreen-only{--columnGap: 2rem}}@media screen and (min-width: 1408px){.columns.is-variable.is-8-fullhd{--columnGap: 2rem}}.tile{align-items:stretch;display:block;flex-basis:0;flex-grow:1;flex-shrink:1;min-height:min-content}.tile.is-ancestor{margin-left:-.75rem;margin-right:-.75rem;margin-top:-.75rem}.tile.is-ancestor:last-child{margin-bottom:-.75rem}.tile.is-ancestor:not(:last-child){margin-bottom:.75rem}.tile.is-child{margin:0 !important}.tile.is-parent{padding:.75rem}.tile.is-vertical{flex-direction:column}.tile.is-vertical>.tile.is-child:not(:last-child){margin-bottom:1.5rem !important}@media screen and (min-width: 769px),print{.tile:not(.is-child){display:flex}.tile.is-1{flex:none;width:8.3333333333%}.tile.is-2{flex:none;width:16.6666666667%}.tile.is-3{flex:none;width:25%}.tile.is-4{flex:none;width:33.3333333333%}.tile.is-5{flex:none;width:41.6666666667%}.tile.is-6{flex:none;width:50%}.tile.is-7{flex:none;width:58.3333333333%}.tile.is-8{flex:none;width:66.6666666667%}.tile.is-9{flex:none;width:75%}.tile.is-10{flex:none;width:83.3333333333%}.tile.is-11{flex:none;width:91.6666666667%}.tile.is-12{flex:none;width:100%}}.hero{align-items:stretch;display:flex;flex-direction:column;justify-content:space-between}.hero .navbar{background:none}.hero .tabs ul{border-bottom:none}.hero.is-white{background-color:#fff;color:#0a0a0a}.hero.is-white a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-white strong{color:inherit}.hero.is-white .title{color:#0a0a0a}.hero.is-white .subtitle{color:rgba(10,10,10,0.9)}.hero.is-white .subtitle a:not(.button),.hero.is-white .subtitle strong{color:#0a0a0a}@media screen and (max-width: 1055px){.hero.is-white .navbar-menu{background-color:#fff}}.hero.is-white .navbar-item,.hero.is-white .navbar-link{color:rgba(10,10,10,0.7)}.hero.is-white a.navbar-item:hover,.hero.is-white a.navbar-item.is-active,.hero.is-white .navbar-link:hover,.hero.is-white .navbar-link.is-active{background-color:#f2f2f2;color:#0a0a0a}.hero.is-white .tabs a{color:#0a0a0a;opacity:0.9}.hero.is-white .tabs a:hover{opacity:1}.hero.is-white .tabs li.is-active a{opacity:1}.hero.is-white .tabs.is-boxed a,.hero.is-white .tabs.is-toggle a{color:#0a0a0a}.hero.is-white .tabs.is-boxed a:hover,.hero.is-white .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}.hero.is-white .tabs.is-boxed li.is-active a,.hero.is-white .tabs.is-boxed li.is-active a:hover,.hero.is-white .tabs.is-toggle li.is-active a,.hero.is-white .tabs.is-toggle li.is-active a:hover{background-color:#0a0a0a;border-color:#0a0a0a;color:#fff}.hero.is-white.is-bold{background-image:linear-gradient(141deg, #e8e3e4 0%, #fff 71%, #fff 100%)}@media screen and (max-width: 768px){.hero.is-white.is-bold .navbar-menu{background-image:linear-gradient(141deg, #e8e3e4 0%, #fff 71%, #fff 100%)}}.hero.is-black{background-color:#0a0a0a;color:#fff}.hero.is-black a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-black strong{color:inherit}.hero.is-black .title{color:#fff}.hero.is-black .subtitle{color:rgba(255,255,255,0.9)}.hero.is-black .subtitle a:not(.button),.hero.is-black .subtitle strong{color:#fff}@media screen and (max-width: 1055px){.hero.is-black .navbar-menu{background-color:#0a0a0a}}.hero.is-black .navbar-item,.hero.is-black .navbar-link{color:rgba(255,255,255,0.7)}.hero.is-black a.navbar-item:hover,.hero.is-black a.navbar-item.is-active,.hero.is-black .navbar-link:hover,.hero.is-black .navbar-link.is-active{background-color:#000;color:#fff}.hero.is-black .tabs a{color:#fff;opacity:0.9}.hero.is-black .tabs a:hover{opacity:1}.hero.is-black .tabs li.is-active a{opacity:1}.hero.is-black .tabs.is-boxed a,.hero.is-black .tabs.is-toggle a{color:#fff}.hero.is-black .tabs.is-boxed a:hover,.hero.is-black .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}.hero.is-black .tabs.is-boxed li.is-active a,.hero.is-black .tabs.is-boxed li.is-active a:hover,.hero.is-black .tabs.is-toggle li.is-active a,.hero.is-black .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#0a0a0a}.hero.is-black.is-bold{background-image:linear-gradient(141deg, #000 0%, #0a0a0a 71%, #181616 100%)}@media screen and (max-width: 768px){.hero.is-black.is-bold .navbar-menu{background-image:linear-gradient(141deg, #000 0%, #0a0a0a 71%, #181616 100%)}}.hero.is-light{background-color:#f5f5f5;color:#363636}.hero.is-light a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-light strong{color:inherit}.hero.is-light .title{color:#363636}.hero.is-light .subtitle{color:rgba(54,54,54,0.9)}.hero.is-light .subtitle a:not(.button),.hero.is-light .subtitle strong{color:#363636}@media screen and (max-width: 1055px){.hero.is-light .navbar-menu{background-color:#f5f5f5}}.hero.is-light .navbar-item,.hero.is-light .navbar-link{color:rgba(54,54,54,0.7)}.hero.is-light a.navbar-item:hover,.hero.is-light a.navbar-item.is-active,.hero.is-light .navbar-link:hover,.hero.is-light .navbar-link.is-active{background-color:#e8e8e8;color:#363636}.hero.is-light .tabs a{color:#363636;opacity:0.9}.hero.is-light .tabs a:hover{opacity:1}.hero.is-light .tabs li.is-active a{opacity:1}.hero.is-light .tabs.is-boxed a,.hero.is-light .tabs.is-toggle a{color:#363636}.hero.is-light .tabs.is-boxed a:hover,.hero.is-light .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}.hero.is-light .tabs.is-boxed li.is-active a,.hero.is-light .tabs.is-boxed li.is-active a:hover,.hero.is-light .tabs.is-toggle li.is-active a,.hero.is-light .tabs.is-toggle li.is-active a:hover{background-color:#363636;border-color:#363636;color:#f5f5f5}.hero.is-light.is-bold{background-image:linear-gradient(141deg, #dfd8d9 0%, #f5f5f5 71%, #fff 100%)}@media screen and (max-width: 768px){.hero.is-light.is-bold .navbar-menu{background-image:linear-gradient(141deg, #dfd8d9 0%, #f5f5f5 71%, #fff 100%)}}.hero.is-dark,.content kbd.hero{background-color:#363636;color:#f5f5f5}.hero.is-dark a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.content kbd.hero a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-dark strong,.content kbd.hero strong{color:inherit}.hero.is-dark .title,.content kbd.hero .title{color:#f5f5f5}.hero.is-dark .subtitle,.content kbd.hero .subtitle{color:rgba(245,245,245,0.9)}.hero.is-dark .subtitle a:not(.button),.content kbd.hero .subtitle a:not(.button),.hero.is-dark .subtitle strong,.content kbd.hero .subtitle strong{color:#f5f5f5}@media screen and (max-width: 1055px){.hero.is-dark .navbar-menu,.content kbd.hero .navbar-menu{background-color:#363636}}.hero.is-dark .navbar-item,.content kbd.hero .navbar-item,.hero.is-dark .navbar-link,.content kbd.hero .navbar-link{color:rgba(245,245,245,0.7)}.hero.is-dark a.navbar-item:hover,.content kbd.hero a.navbar-item:hover,.hero.is-dark a.navbar-item.is-active,.content kbd.hero a.navbar-item.is-active,.hero.is-dark .navbar-link:hover,.content kbd.hero .navbar-link:hover,.hero.is-dark .navbar-link.is-active,.content kbd.hero .navbar-link.is-active{background-color:#292929;color:#f5f5f5}.hero.is-dark .tabs a,.content kbd.hero .tabs a{color:#f5f5f5;opacity:0.9}.hero.is-dark .tabs a:hover,.content kbd.hero .tabs a:hover{opacity:1}.hero.is-dark .tabs li.is-active a,.content kbd.hero .tabs li.is-active a{opacity:1}.hero.is-dark .tabs.is-boxed a,.content kbd.hero .tabs.is-boxed a,.hero.is-dark .tabs.is-toggle a,.content kbd.hero .tabs.is-toggle a{color:#f5f5f5}.hero.is-dark .tabs.is-boxed a:hover,.content kbd.hero .tabs.is-boxed a:hover,.hero.is-dark .tabs.is-toggle a:hover,.content kbd.hero .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}.hero.is-dark .tabs.is-boxed li.is-active a,.content kbd.hero .tabs.is-boxed li.is-active a,.hero.is-dark .tabs.is-boxed li.is-active a:hover,.hero.is-dark .tabs.is-toggle li.is-active a,.content kbd.hero .tabs.is-toggle li.is-active a,.hero.is-dark .tabs.is-toggle li.is-active a:hover{background-color:#f5f5f5;border-color:#f5f5f5;color:#363636}.hero.is-dark.is-bold,.content kbd.hero.is-bold{background-image:linear-gradient(141deg, #1f191a 0%, #363636 71%, #46403f 100%)}@media screen and (max-width: 768px){.hero.is-dark.is-bold .navbar-menu,.content kbd.hero.is-bold .navbar-menu{background-image:linear-gradient(141deg, #1f191a 0%, #363636 71%, #46403f 100%)}}.hero.is-primary,.docstring>section>a.hero.docs-sourcelink{background-color:#4eb5de;color:#fff}.hero.is-primary a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.docstring>section>a.hero.docs-sourcelink a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-primary strong,.docstring>section>a.hero.docs-sourcelink strong{color:inherit}.hero.is-primary .title,.docstring>section>a.hero.docs-sourcelink .title{color:#fff}.hero.is-primary .subtitle,.docstring>section>a.hero.docs-sourcelink .subtitle{color:rgba(255,255,255,0.9)}.hero.is-primary .subtitle a:not(.button),.docstring>section>a.hero.docs-sourcelink .subtitle a:not(.button),.hero.is-primary .subtitle strong,.docstring>section>a.hero.docs-sourcelink .subtitle strong{color:#fff}@media screen and (max-width: 1055px){.hero.is-primary .navbar-menu,.docstring>section>a.hero.docs-sourcelink .navbar-menu{background-color:#4eb5de}}.hero.is-primary .navbar-item,.docstring>section>a.hero.docs-sourcelink .navbar-item,.hero.is-primary .navbar-link,.docstring>section>a.hero.docs-sourcelink .navbar-link{color:rgba(255,255,255,0.7)}.hero.is-primary a.navbar-item:hover,.docstring>section>a.hero.docs-sourcelink a.navbar-item:hover,.hero.is-primary a.navbar-item.is-active,.docstring>section>a.hero.docs-sourcelink a.navbar-item.is-active,.hero.is-primary .navbar-link:hover,.docstring>section>a.hero.docs-sourcelink .navbar-link:hover,.hero.is-primary .navbar-link.is-active,.docstring>section>a.hero.docs-sourcelink .navbar-link.is-active{background-color:#39acda;color:#fff}.hero.is-primary .tabs a,.docstring>section>a.hero.docs-sourcelink .tabs a{color:#fff;opacity:0.9}.hero.is-primary .tabs a:hover,.docstring>section>a.hero.docs-sourcelink .tabs a:hover{opacity:1}.hero.is-primary .tabs li.is-active a,.docstring>section>a.hero.docs-sourcelink .tabs li.is-active a{opacity:1}.hero.is-primary .tabs.is-boxed a,.docstring>section>a.hero.docs-sourcelink .tabs.is-boxed a,.hero.is-primary .tabs.is-toggle a,.docstring>section>a.hero.docs-sourcelink .tabs.is-toggle a{color:#fff}.hero.is-primary .tabs.is-boxed a:hover,.docstring>section>a.hero.docs-sourcelink .tabs.is-boxed a:hover,.hero.is-primary .tabs.is-toggle a:hover,.docstring>section>a.hero.docs-sourcelink .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}.hero.is-primary .tabs.is-boxed li.is-active a,.docstring>section>a.hero.docs-sourcelink .tabs.is-boxed li.is-active a,.hero.is-primary .tabs.is-boxed li.is-active a:hover,.hero.is-primary .tabs.is-toggle li.is-active a,.docstring>section>a.hero.docs-sourcelink .tabs.is-toggle li.is-active a,.hero.is-primary .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#4eb5de}.hero.is-primary.is-bold,.docstring>section>a.hero.is-bold.docs-sourcelink{background-image:linear-gradient(141deg, #1bc7de 0%, #4eb5de 71%, #5fa9e7 100%)}@media screen and (max-width: 768px){.hero.is-primary.is-bold .navbar-menu,.docstring>section>a.hero.is-bold.docs-sourcelink .navbar-menu{background-image:linear-gradient(141deg, #1bc7de 0%, #4eb5de 71%, #5fa9e7 100%)}}.hero.is-link{background-color:#2e63b8;color:#fff}.hero.is-link a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-link strong{color:inherit}.hero.is-link .title{color:#fff}.hero.is-link .subtitle{color:rgba(255,255,255,0.9)}.hero.is-link .subtitle a:not(.button),.hero.is-link .subtitle strong{color:#fff}@media screen and (max-width: 1055px){.hero.is-link .navbar-menu{background-color:#2e63b8}}.hero.is-link .navbar-item,.hero.is-link .navbar-link{color:rgba(255,255,255,0.7)}.hero.is-link a.navbar-item:hover,.hero.is-link a.navbar-item.is-active,.hero.is-link .navbar-link:hover,.hero.is-link .navbar-link.is-active{background-color:#2958a4;color:#fff}.hero.is-link .tabs a{color:#fff;opacity:0.9}.hero.is-link .tabs a:hover{opacity:1}.hero.is-link .tabs li.is-active a{opacity:1}.hero.is-link .tabs.is-boxed a,.hero.is-link .tabs.is-toggle a{color:#fff}.hero.is-link .tabs.is-boxed a:hover,.hero.is-link .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}.hero.is-link .tabs.is-boxed li.is-active a,.hero.is-link .tabs.is-boxed li.is-active a:hover,.hero.is-link .tabs.is-toggle li.is-active a,.hero.is-link .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#2e63b8}.hero.is-link.is-bold{background-image:linear-gradient(141deg, #1b6098 0%, #2e63b8 71%, #2d51d2 100%)}@media screen and (max-width: 768px){.hero.is-link.is-bold .navbar-menu{background-image:linear-gradient(141deg, #1b6098 0%, #2e63b8 71%, #2d51d2 100%)}}.hero.is-info{background-color:#209cee;color:#fff}.hero.is-info a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-info strong{color:inherit}.hero.is-info .title{color:#fff}.hero.is-info .subtitle{color:rgba(255,255,255,0.9)}.hero.is-info .subtitle a:not(.button),.hero.is-info .subtitle strong{color:#fff}@media screen and (max-width: 1055px){.hero.is-info .navbar-menu{background-color:#209cee}}.hero.is-info .navbar-item,.hero.is-info .navbar-link{color:rgba(255,255,255,0.7)}.hero.is-info a.navbar-item:hover,.hero.is-info a.navbar-item.is-active,.hero.is-info .navbar-link:hover,.hero.is-info .navbar-link.is-active{background-color:#1190e3;color:#fff}.hero.is-info .tabs a{color:#fff;opacity:0.9}.hero.is-info .tabs a:hover{opacity:1}.hero.is-info .tabs li.is-active a{opacity:1}.hero.is-info .tabs.is-boxed a,.hero.is-info .tabs.is-toggle a{color:#fff}.hero.is-info .tabs.is-boxed a:hover,.hero.is-info .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}.hero.is-info .tabs.is-boxed li.is-active a,.hero.is-info .tabs.is-boxed li.is-active a:hover,.hero.is-info .tabs.is-toggle li.is-active a,.hero.is-info .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#209cee}.hero.is-info.is-bold{background-image:linear-gradient(141deg, #05a6d6 0%, #209cee 71%, #3287f5 100%)}@media screen and (max-width: 768px){.hero.is-info.is-bold .navbar-menu{background-image:linear-gradient(141deg, #05a6d6 0%, #209cee 71%, #3287f5 100%)}}.hero.is-success{background-color:#22c35b;color:#fff}.hero.is-success a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-success strong{color:inherit}.hero.is-success .title{color:#fff}.hero.is-success .subtitle{color:rgba(255,255,255,0.9)}.hero.is-success .subtitle a:not(.button),.hero.is-success .subtitle strong{color:#fff}@media screen and (max-width: 1055px){.hero.is-success .navbar-menu{background-color:#22c35b}}.hero.is-success .navbar-item,.hero.is-success .navbar-link{color:rgba(255,255,255,0.7)}.hero.is-success a.navbar-item:hover,.hero.is-success a.navbar-item.is-active,.hero.is-success .navbar-link:hover,.hero.is-success .navbar-link.is-active{background-color:#1ead51;color:#fff}.hero.is-success .tabs a{color:#fff;opacity:0.9}.hero.is-success .tabs a:hover{opacity:1}.hero.is-success .tabs li.is-active a{opacity:1}.hero.is-success .tabs.is-boxed a,.hero.is-success .tabs.is-toggle a{color:#fff}.hero.is-success .tabs.is-boxed a:hover,.hero.is-success .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}.hero.is-success .tabs.is-boxed li.is-active a,.hero.is-success .tabs.is-boxed li.is-active a:hover,.hero.is-success .tabs.is-toggle li.is-active a,.hero.is-success .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#22c35b}.hero.is-success.is-bold{background-image:linear-gradient(141deg, #12a02c 0%, #22c35b 71%, #1fdf83 100%)}@media screen and (max-width: 768px){.hero.is-success.is-bold .navbar-menu{background-image:linear-gradient(141deg, #12a02c 0%, #22c35b 71%, #1fdf83 100%)}}.hero.is-warning{background-color:#ffdd57;color:rgba(0,0,0,0.7)}.hero.is-warning a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-warning strong{color:inherit}.hero.is-warning .title{color:rgba(0,0,0,0.7)}.hero.is-warning .subtitle{color:rgba(0,0,0,0.9)}.hero.is-warning .subtitle a:not(.button),.hero.is-warning .subtitle strong{color:rgba(0,0,0,0.7)}@media screen and (max-width: 1055px){.hero.is-warning .navbar-menu{background-color:#ffdd57}}.hero.is-warning .navbar-item,.hero.is-warning .navbar-link{color:rgba(0,0,0,0.7)}.hero.is-warning a.navbar-item:hover,.hero.is-warning a.navbar-item.is-active,.hero.is-warning .navbar-link:hover,.hero.is-warning .navbar-link.is-active{background-color:#ffd83e;color:rgba(0,0,0,0.7)}.hero.is-warning .tabs a{color:rgba(0,0,0,0.7);opacity:0.9}.hero.is-warning .tabs a:hover{opacity:1}.hero.is-warning .tabs li.is-active a{opacity:1}.hero.is-warning .tabs.is-boxed a,.hero.is-warning .tabs.is-toggle a{color:rgba(0,0,0,0.7)}.hero.is-warning .tabs.is-boxed a:hover,.hero.is-warning .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}.hero.is-warning .tabs.is-boxed li.is-active a,.hero.is-warning .tabs.is-boxed li.is-active a:hover,.hero.is-warning .tabs.is-toggle li.is-active a,.hero.is-warning .tabs.is-toggle li.is-active a:hover{background-color:rgba(0,0,0,0.7);border-color:rgba(0,0,0,0.7);color:#ffdd57}.hero.is-warning.is-bold{background-image:linear-gradient(141deg, #ffae24 0%, #ffdd57 71%, #fffa71 100%)}@media screen and (max-width: 768px){.hero.is-warning.is-bold .navbar-menu{background-image:linear-gradient(141deg, #ffae24 0%, #ffdd57 71%, #fffa71 100%)}}.hero.is-danger{background-color:#da0b00;color:#fff}.hero.is-danger a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-danger strong{color:inherit}.hero.is-danger .title{color:#fff}.hero.is-danger .subtitle{color:rgba(255,255,255,0.9)}.hero.is-danger .subtitle a:not(.button),.hero.is-danger .subtitle strong{color:#fff}@media screen and (max-width: 1055px){.hero.is-danger .navbar-menu{background-color:#da0b00}}.hero.is-danger .navbar-item,.hero.is-danger .navbar-link{color:rgba(255,255,255,0.7)}.hero.is-danger a.navbar-item:hover,.hero.is-danger a.navbar-item.is-active,.hero.is-danger .navbar-link:hover,.hero.is-danger .navbar-link.is-active{background-color:#c10a00;color:#fff}.hero.is-danger .tabs a{color:#fff;opacity:0.9}.hero.is-danger .tabs a:hover{opacity:1}.hero.is-danger .tabs li.is-active a{opacity:1}.hero.is-danger .tabs.is-boxed a,.hero.is-danger .tabs.is-toggle a{color:#fff}.hero.is-danger .tabs.is-boxed a:hover,.hero.is-danger .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}.hero.is-danger .tabs.is-boxed li.is-active a,.hero.is-danger .tabs.is-boxed li.is-active a:hover,.hero.is-danger .tabs.is-toggle li.is-active a,.hero.is-danger .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#da0b00}.hero.is-danger.is-bold{background-image:linear-gradient(141deg, #a70013 0%, #da0b00 71%, #f43500 100%)}@media screen and (max-width: 768px){.hero.is-danger.is-bold .navbar-menu{background-image:linear-gradient(141deg, #a70013 0%, #da0b00 71%, #f43500 100%)}}.hero.is-small .hero-body,#documenter .docs-sidebar form.docs-search>input.hero .hero-body{padding-bottom:1.5rem;padding-top:1.5rem}@media screen and (min-width: 769px),print{.hero.is-medium .hero-body{padding-bottom:9rem;padding-top:9rem}}@media screen and (min-width: 769px),print{.hero.is-large .hero-body{padding-bottom:18rem;padding-top:18rem}}.hero.is-halfheight .hero-body,.hero.is-fullheight .hero-body,.hero.is-fullheight-with-navbar .hero-body{align-items:center;display:flex}.hero.is-halfheight .hero-body>.container,.hero.is-fullheight .hero-body>.container,.hero.is-fullheight-with-navbar .hero-body>.container{flex-grow:1;flex-shrink:1}.hero.is-halfheight{min-height:50vh}.hero.is-fullheight{min-height:100vh}.hero-video{overflow:hidden}.hero-video video{left:50%;min-height:100%;min-width:100%;position:absolute;top:50%;transform:translate3d(-50%, -50%, 0)}.hero-video.is-transparent{opacity:0.3}@media screen and (max-width: 768px){.hero-video{display:none}}.hero-buttons{margin-top:1.5rem}@media screen and (max-width: 768px){.hero-buttons .button{display:flex}.hero-buttons .button:not(:last-child){margin-bottom:0.75rem}}@media screen and (min-width: 769px),print{.hero-buttons{display:flex;justify-content:center}.hero-buttons .button:not(:last-child){margin-right:1.5rem}}.hero-head,.hero-foot{flex-grow:0;flex-shrink:0}.hero-body{flex-grow:1;flex-shrink:0;padding:3rem 1.5rem}.section{padding:3rem 1.5rem}@media screen and (min-width: 1056px){.section.is-medium{padding:9rem 1.5rem}.section.is-large{padding:18rem 1.5rem}}.footer{background-color:#fafafa;padding:3rem 1.5rem 6rem}h1 .docs-heading-anchor,h1 .docs-heading-anchor:hover,h1 .docs-heading-anchor:visited,h2 .docs-heading-anchor,h2 .docs-heading-anchor:hover,h2 .docs-heading-anchor:visited,h3 .docs-heading-anchor,h3 .docs-heading-anchor:hover,h3 .docs-heading-anchor:visited,h4 .docs-heading-anchor,h4 .docs-heading-anchor:hover,h4 .docs-heading-anchor:visited,h5 .docs-heading-anchor,h5 .docs-heading-anchor:hover,h5 .docs-heading-anchor:visited,h6 .docs-heading-anchor,h6 .docs-heading-anchor:hover,h6 .docs-heading-anchor:visited{color:#222}h1 .docs-heading-anchor-permalink,h2 .docs-heading-anchor-permalink,h3 .docs-heading-anchor-permalink,h4 .docs-heading-anchor-permalink,h5 .docs-heading-anchor-permalink,h6 .docs-heading-anchor-permalink{visibility:hidden;vertical-align:middle;margin-left:0.5em;font-size:0.7rem}h1 .docs-heading-anchor-permalink::before,h2 .docs-heading-anchor-permalink::before,h3 .docs-heading-anchor-permalink::before,h4 .docs-heading-anchor-permalink::before,h5 .docs-heading-anchor-permalink::before,h6 .docs-heading-anchor-permalink::before{font-family:"Font Awesome 5 Free";font-weight:900;content:"\f0c1"}h1:hover .docs-heading-anchor-permalink,h2:hover .docs-heading-anchor-permalink,h3:hover .docs-heading-anchor-permalink,h4:hover .docs-heading-anchor-permalink,h5:hover .docs-heading-anchor-permalink,h6:hover .docs-heading-anchor-permalink{visibility:visible}.docs-dark-only{display:none !important}pre{position:relative;overflow:hidden}pre code,pre code.hljs{padding:0 .75rem !important;overflow:auto;display:block}pre code:first-of-type,pre code.hljs:first-of-type{padding-top:0.5rem !important}pre code:last-of-type,pre code.hljs:last-of-type{padding-bottom:0.5rem !important}pre .copy-button{opacity:0.2;transition:opacity 0.2s;position:absolute;right:0em;top:0em;padding:0.5em;width:2.5em;height:2.5em;background:transparent;border:none;font-family:"Font Awesome 5 Free";color:#222;cursor:pointer;text-align:center}pre .copy-button:focus,pre .copy-button:hover{opacity:1;background:rgba(34,34,34,0.1);color:#2e63b8}pre .copy-button.success{color:#259a12;opacity:1}pre .copy-button.error{color:#cb3c33;opacity:1}pre:hover .copy-button{opacity:1}.admonition{background-color:#b5b5b5;border-style:solid;border-width:1px;border-color:#363636;border-radius:4px;font-size:1rem}.admonition strong{color:currentColor}.admonition.is-small,#documenter .docs-sidebar form.docs-search>input.admonition{font-size:.75rem}.admonition.is-medium{font-size:1.25rem}.admonition.is-large{font-size:1.5rem}.admonition.is-default{background-color:#b5b5b5;border-color:#363636}.admonition.is-default>.admonition-header{background-color:#363636;color:#fff}.admonition.is-default>.admonition-body{color:#fff}.admonition.is-info{background-color:#def0fc;border-color:#209cee}.admonition.is-info>.admonition-header{background-color:#209cee;color:#fff}.admonition.is-info>.admonition-body{color:rgba(0,0,0,0.7)}.admonition.is-success{background-color:#bdf4d1;border-color:#22c35b}.admonition.is-success>.admonition-header{background-color:#22c35b;color:#fff}.admonition.is-success>.admonition-body{color:rgba(0,0,0,0.7)}.admonition.is-warning{background-color:#fff3c5;border-color:#ffdd57}.admonition.is-warning>.admonition-header{background-color:#ffdd57;color:rgba(0,0,0,0.7)}.admonition.is-warning>.admonition-body{color:rgba(0,0,0,0.7)}.admonition.is-danger{background-color:#ffaba7;border-color:#da0b00}.admonition.is-danger>.admonition-header{background-color:#da0b00;color:#fff}.admonition.is-danger>.admonition-body{color:rgba(0,0,0,0.7)}.admonition.is-compat{background-color:#bdeff5;border-color:#1db5c9}.admonition.is-compat>.admonition-header{background-color:#1db5c9;color:#fff}.admonition.is-compat>.admonition-body{color:rgba(0,0,0,0.7)}.admonition-header{color:#fff;background-color:#363636;align-items:center;font-weight:700;justify-content:space-between;line-height:1.25;padding:0.5rem .75rem;position:relative}.admonition-header:before{font-family:"Font Awesome 5 Free";font-weight:900;margin-right:.75rem;content:"\f06a"}.admonition-body{color:#222;padding:0.5rem .75rem}.admonition-body pre{background-color:#f5f5f5}.admonition-body code{background-color:rgba(0,0,0,0.05)}.docstring{margin-bottom:1em;background-color:rgba(0,0,0,0);border:1px solid #dbdbdb;box-shadow:2px 2px 3px rgba(10,10,10,0.1);max-width:100%}.docstring>header{display:flex;flex-grow:1;align-items:stretch;padding:0.5rem .75rem;background-color:#f5f5f5;box-shadow:0 1px 2px rgba(10,10,10,0.1);box-shadow:none;border-bottom:1px solid #dbdbdb}.docstring>header code{background-color:transparent}.docstring>header .docstring-binding{margin-right:0.3em}.docstring>header .docstring-category{margin-left:0.3em}.docstring>section{position:relative;padding:.75rem .75rem;border-bottom:1px solid #dbdbdb}.docstring>section:last-child{border-bottom:none}.docstring>section>a.docs-sourcelink{transition:opacity 0.3s;opacity:0;position:absolute;right:.375rem;bottom:.375rem}.docstring>section>a.docs-sourcelink:focus{opacity:1 !important}.docstring:hover>section>a.docs-sourcelink{opacity:0.2}.docstring:focus-within>section>a.docs-sourcelink{opacity:0.2}.docstring>section:hover a.docs-sourcelink{opacity:1}.documenter-example-output{background-color:#fff}.outdated-warning-overlay{position:fixed;top:0;left:0;right:0;box-shadow:0 0 10px rgba(0,0,0,0.3);z-index:999;background-color:#ffaba7;color:rgba(0,0,0,0.7);border-bottom:3px solid #da0b00;padding:10px 35px;text-align:center;font-size:15px}.outdated-warning-overlay .outdated-warning-closer{position:absolute;top:calc(50% - 10px);right:18px;cursor:pointer;width:12px}.outdated-warning-overlay a{color:#2e63b8}.outdated-warning-overlay a:hover{color:#363636}.content pre{border:1px solid #dbdbdb}.content code{font-weight:inherit}.content a code{color:#2e63b8}.content h1 code,.content h2 code,.content h3 code,.content h4 code,.content h5 code,.content h6 code{color:#222}.content table{display:block;width:initial;max-width:100%;overflow-x:auto}.content blockquote>ul:first-child,.content blockquote>ol:first-child,.content .admonition-body>ul:first-child,.content .admonition-body>ol:first-child{margin-top:0}pre,code{font-variant-ligatures:no-contextual}.breadcrumb a.is-disabled{cursor:default;pointer-events:none}.breadcrumb a.is-disabled,.breadcrumb a.is-disabled:hover{color:#222}.hljs{background:initial !important}.katex .katex-mathml{top:0;right:0}.katex-display,mjx-container,.MathJax_Display{margin:0.5em 0 !important}html{-moz-osx-font-smoothing:auto;-webkit-font-smoothing:auto}li.no-marker{list-style:none}#documenter .docs-main>article{overflow-wrap:break-word}#documenter .docs-main>article .math-container{overflow-x:auto;overflow-y:hidden}@media screen and (min-width: 1056px){#documenter .docs-main{max-width:52rem;margin-left:20rem;padding-right:1rem}}@media screen and (max-width: 1055px){#documenter .docs-main{width:100%}#documenter .docs-main>article{max-width:52rem;margin-left:auto;margin-right:auto;margin-bottom:1rem;padding:0 1rem}#documenter .docs-main>header,#documenter .docs-main>nav{max-width:100%;width:100%;margin:0}}#documenter .docs-main header.docs-navbar{background-color:#fff;border-bottom:1px solid #dbdbdb;z-index:2;min-height:4rem;margin-bottom:1rem;display:flex}#documenter .docs-main header.docs-navbar .breadcrumb{flex-grow:1}#documenter .docs-main header.docs-navbar .docs-right{display:flex;white-space:nowrap}#documenter .docs-main header.docs-navbar .docs-right .docs-icon,#documenter .docs-main header.docs-navbar .docs-right .docs-label,#documenter .docs-main header.docs-navbar .docs-right .docs-sidebar-button{display:inline-block}#documenter .docs-main header.docs-navbar .docs-right .docs-label{padding:0;margin-left:0.3em}#documenter .docs-main header.docs-navbar .docs-right .docs-settings-button{margin:auto 0 auto 1rem}#documenter .docs-main header.docs-navbar .docs-right .docs-sidebar-button{font-size:1.5rem;margin:auto 0 auto 1rem}#documenter .docs-main header.docs-navbar>*{margin:auto 0}@media screen and (max-width: 1055px){#documenter .docs-main header.docs-navbar{position:sticky;top:0;padding:0 1rem;transition-property:top, box-shadow;-webkit-transition-property:top, box-shadow;transition-duration:0.3s;-webkit-transition-duration:0.3s}#documenter .docs-main header.docs-navbar.headroom--not-top{box-shadow:.2rem 0rem .4rem #bbb;transition-duration:0.7s;-webkit-transition-duration:0.7s}#documenter .docs-main header.docs-navbar.headroom--unpinned.headroom--not-top.headroom--not-bottom{top:-4.5rem;transition-duration:0.7s;-webkit-transition-duration:0.7s}}#documenter .docs-main section.footnotes{border-top:1px solid #dbdbdb}#documenter .docs-main section.footnotes li .tag:first-child,#documenter .docs-main section.footnotes li .docstring>section>a.docs-sourcelink:first-child,#documenter .docs-main section.footnotes li .content kbd:first-child,.content #documenter .docs-main section.footnotes li kbd:first-child{margin-right:1em;margin-bottom:0.4em}#documenter .docs-main .docs-footer{display:flex;flex-wrap:wrap;margin-left:0;margin-right:0;border-top:1px solid #dbdbdb;padding-top:1rem;padding-bottom:1rem}@media screen and (max-width: 1055px){#documenter .docs-main .docs-footer{padding-left:1rem;padding-right:1rem}}#documenter .docs-main .docs-footer .docs-footer-nextpage,#documenter .docs-main .docs-footer .docs-footer-prevpage{flex-grow:1}#documenter .docs-main .docs-footer .docs-footer-nextpage{text-align:right}#documenter .docs-main .docs-footer .flexbox-break{flex-basis:100%;height:0}#documenter .docs-main .docs-footer .footer-message{font-size:0.8em;margin:0.5em auto 0 auto;text-align:center}#documenter .docs-sidebar{display:flex;flex-direction:column;color:#0a0a0a;background-color:#f5f5f5;border-right:1px solid #dbdbdb;padding:0;flex:0 0 18rem;z-index:5;font-size:1rem;position:fixed;left:-18rem;width:18rem;height:100%;transition:left 0.3s}#documenter .docs-sidebar.visible{left:0;box-shadow:.4rem 0rem .8rem #bbb}@media screen and (min-width: 1056px){#documenter .docs-sidebar.visible{box-shadow:none}}@media screen and (min-width: 1056px){#documenter .docs-sidebar{left:0;top:0}}#documenter .docs-sidebar .docs-logo{margin-top:1rem;padding:0 1rem}#documenter .docs-sidebar .docs-logo>img{max-height:6rem;margin:auto}#documenter .docs-sidebar .docs-package-name{flex-shrink:0;font-size:1.5rem;font-weight:700;text-align:center;white-space:nowrap;overflow:hidden;padding:0.5rem 0}#documenter .docs-sidebar .docs-package-name .docs-autofit{max-width:16.2rem}#documenter .docs-sidebar .docs-package-name a,#documenter .docs-sidebar .docs-package-name a:hover{color:#0a0a0a}#documenter .docs-sidebar .docs-version-selector{border-top:1px solid #dbdbdb;display:none;padding:0.5rem}#documenter .docs-sidebar .docs-version-selector.visible{display:flex}#documenter .docs-sidebar ul.docs-menu{flex-grow:1;user-select:none;border-top:1px solid #dbdbdb;padding-bottom:1.5rem}#documenter .docs-sidebar ul.docs-menu>li>.tocitem{font-weight:bold}#documenter .docs-sidebar ul.docs-menu>li li{font-size:.95rem;margin-left:1em;border-left:1px solid #dbdbdb}#documenter .docs-sidebar ul.docs-menu input.collapse-toggle{display:none}#documenter .docs-sidebar ul.docs-menu ul.collapsed{display:none}#documenter .docs-sidebar ul.docs-menu input:checked~ul.collapsed{display:block}#documenter .docs-sidebar ul.docs-menu label.tocitem{display:flex}#documenter .docs-sidebar ul.docs-menu label.tocitem .docs-label{flex-grow:2}#documenter .docs-sidebar ul.docs-menu label.tocitem .docs-chevron{display:inline-block;font-style:normal;font-variant:normal;text-rendering:auto;line-height:1;font-size:.75rem;margin-left:1rem;margin-top:auto;margin-bottom:auto}#documenter .docs-sidebar ul.docs-menu label.tocitem .docs-chevron::before{font-family:"Font Awesome 5 Free";font-weight:900;content:"\f054"}#documenter .docs-sidebar ul.docs-menu input:checked~label.tocitem .docs-chevron::before{content:"\f078"}#documenter .docs-sidebar ul.docs-menu .tocitem{display:block;padding:0.5rem 0.5rem}#documenter .docs-sidebar ul.docs-menu .tocitem,#documenter .docs-sidebar ul.docs-menu .tocitem:hover{color:#0a0a0a;background:#f5f5f5}#documenter .docs-sidebar ul.docs-menu a.tocitem:hover,#documenter .docs-sidebar ul.docs-menu label.tocitem:hover{color:#0a0a0a;background-color:#ebebeb}#documenter .docs-sidebar ul.docs-menu li.is-active{border-top:1px solid #dbdbdb;border-bottom:1px solid #dbdbdb;background-color:#fff}#documenter .docs-sidebar ul.docs-menu li.is-active .tocitem,#documenter .docs-sidebar ul.docs-menu li.is-active .tocitem:hover{background-color:#fff;color:#0a0a0a}#documenter .docs-sidebar ul.docs-menu li.is-active ul.internal .tocitem:hover{background-color:#ebebeb;color:#0a0a0a}#documenter .docs-sidebar ul.docs-menu>li.is-active:first-child{border-top:none}#documenter .docs-sidebar ul.docs-menu ul.internal{margin:0 0.5rem 0.5rem;border-top:1px solid #dbdbdb}#documenter .docs-sidebar ul.docs-menu ul.internal li{font-size:.85rem;border-left:none;margin-left:0;margin-top:0.5rem}#documenter .docs-sidebar ul.docs-menu ul.internal .tocitem{width:100%;padding:0}#documenter .docs-sidebar ul.docs-menu ul.internal .tocitem::before{content:"⚬";margin-right:0.4em}#documenter .docs-sidebar form.docs-search{margin:auto;margin-top:0.5rem;margin-bottom:0.5rem}#documenter .docs-sidebar form.docs-search>input{width:14.4rem}@media screen and (min-width: 1056px){#documenter .docs-sidebar ul.docs-menu{overflow-y:auto;-webkit-overflow-scroll:touch}#documenter .docs-sidebar ul.docs-menu::-webkit-scrollbar{width:.3rem;background:none}#documenter .docs-sidebar ul.docs-menu::-webkit-scrollbar-thumb{border-radius:5px 0px 0px 5px;background:#e0e0e0}#documenter .docs-sidebar ul.docs-menu::-webkit-scrollbar-thumb:hover{background:#ccc}}@media screen and (max-width: 1055px){#documenter .docs-sidebar{overflow-y:auto;-webkit-overflow-scroll:touch}#documenter .docs-sidebar::-webkit-scrollbar{width:.3rem;background:none}#documenter .docs-sidebar::-webkit-scrollbar-thumb{border-radius:5px 0px 0px 5px;background:#e0e0e0}#documenter .docs-sidebar::-webkit-scrollbar-thumb:hover{background:#ccc}}#documenter .docs-main #documenter-search-info{margin-bottom:1rem}#documenter .docs-main #documenter-search-results{list-style-type:circle;list-style-position:outside}#documenter .docs-main #documenter-search-results li{margin-left:2rem}#documenter .docs-main #documenter-search-results .docs-highlight{background-color:yellow}.ansi span.sgr1{font-weight:bolder}.ansi span.sgr2{font-weight:lighter}.ansi span.sgr3{font-style:italic}.ansi span.sgr4{text-decoration:underline}.ansi span.sgr7{color:#fff;background-color:#222}.ansi span.sgr8{color:transparent}.ansi span.sgr8 span{color:transparent}.ansi span.sgr9{text-decoration:line-through}.ansi span.sgr30{color:#242424}.ansi span.sgr31{color:#a7201f}.ansi span.sgr32{color:#066f00}.ansi span.sgr33{color:#856b00}.ansi span.sgr34{color:#2149b0}.ansi span.sgr35{color:#7d4498}.ansi span.sgr36{color:#007989}.ansi span.sgr37{color:gray}.ansi span.sgr40{background-color:#242424}.ansi span.sgr41{background-color:#a7201f}.ansi span.sgr42{background-color:#066f00}.ansi span.sgr43{background-color:#856b00}.ansi span.sgr44{background-color:#2149b0}.ansi span.sgr45{background-color:#7d4498}.ansi span.sgr46{background-color:#007989}.ansi span.sgr47{background-color:gray}.ansi span.sgr90{color:#616161}.ansi span.sgr91{color:#cb3c33}.ansi span.sgr92{color:#0e8300}.ansi span.sgr93{color:#a98800}.ansi span.sgr94{color:#3c5dcd}.ansi span.sgr95{color:#9256af}.ansi span.sgr96{color:#008fa3}.ansi span.sgr97{color:#f5f5f5}.ansi span.sgr100{background-color:#616161}.ansi span.sgr101{background-color:#cb3c33}.ansi span.sgr102{background-color:#0e8300}.ansi span.sgr103{background-color:#a98800}.ansi span.sgr104{background-color:#3c5dcd}.ansi span.sgr105{background-color:#9256af}.ansi span.sgr106{background-color:#008fa3}.ansi span.sgr107{background-color:#f5f5f5}code.language-julia-repl>span.hljs-meta{color:#066f00;font-weight:bolder}/*! +.pagination-previous,.pagination-next,.pagination-link,.pagination-ellipsis,.file-cta,.file-name,.select select,.textarea,.input,#documenter .docs-sidebar form.docs-search>input,.button{-moz-appearance:none;-webkit-appearance:none;align-items:center;border:1px solid transparent;border-radius:4px;box-shadow:none;display:inline-flex;font-size:1rem;height:2.5em;justify-content:flex-start;line-height:1.5;padding-bottom:calc(0.5em - 1px);padding-left:calc(0.75em - 1px);padding-right:calc(0.75em - 1px);padding-top:calc(0.5em - 1px);position:relative;vertical-align:top}.pagination-previous:focus,.pagination-next:focus,.pagination-link:focus,.pagination-ellipsis:focus,.file-cta:focus,.file-name:focus,.select select:focus,.textarea:focus,.input:focus,#documenter .docs-sidebar form.docs-search>input:focus,.button:focus,.is-focused.pagination-previous,.is-focused.pagination-next,.is-focused.pagination-link,.is-focused.pagination-ellipsis,.is-focused.file-cta,.is-focused.file-name,.select select.is-focused,.is-focused.textarea,.is-focused.input,#documenter .docs-sidebar form.docs-search>input.is-focused,.is-focused.button,.pagination-previous:active,.pagination-next:active,.pagination-link:active,.pagination-ellipsis:active,.file-cta:active,.file-name:active,.select select:active,.textarea:active,.input:active,#documenter .docs-sidebar form.docs-search>input:active,.button:active,.is-active.pagination-previous,.is-active.pagination-next,.is-active.pagination-link,.is-active.pagination-ellipsis,.is-active.file-cta,.is-active.file-name,.select select.is-active,.is-active.textarea,.is-active.input,#documenter .docs-sidebar form.docs-search>input.is-active,.is-active.button{outline:none}.pagination-previous[disabled],.pagination-next[disabled],.pagination-link[disabled],.pagination-ellipsis[disabled],.file-cta[disabled],.file-name[disabled],.select select[disabled],.textarea[disabled],.input[disabled],#documenter .docs-sidebar form.docs-search>input[disabled],.button[disabled],fieldset[disabled] .pagination-previous,fieldset[disabled] .pagination-next,fieldset[disabled] .pagination-link,fieldset[disabled] .pagination-ellipsis,fieldset[disabled] .file-cta,fieldset[disabled] .file-name,fieldset[disabled] .select select,.select fieldset[disabled] select,fieldset[disabled] .textarea,fieldset[disabled] .input,fieldset[disabled] #documenter .docs-sidebar form.docs-search>input,#documenter .docs-sidebar fieldset[disabled] form.docs-search>input,fieldset[disabled] .button{cursor:not-allowed}.tabs,.pagination-previous,.pagination-next,.pagination-link,.pagination-ellipsis,.breadcrumb,.file,.button,.is-unselectable{-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.navbar-link:not(.is-arrowless)::after,.select:not(.is-multiple):not(.is-loading)::after{border:3px solid rgba(0,0,0,0);border-radius:2px;border-right:0;border-top:0;content:" ";display:block;height:0.625em;margin-top:-0.4375em;pointer-events:none;position:absolute;top:50%;transform:rotate(-45deg);transform-origin:center;width:0.625em}.admonition:not(:last-child),.tabs:not(:last-child),.pagination:not(:last-child),.message:not(:last-child),.level:not(:last-child),.breadcrumb:not(:last-child),.block:not(:last-child),.title:not(:last-child),.subtitle:not(:last-child),.table-container:not(:last-child),.table:not(:last-child),.progress:not(:last-child),.notification:not(:last-child),.content:not(:last-child),.box:not(:last-child){margin-bottom:1.5rem}.modal-close,.delete{-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-moz-appearance:none;-webkit-appearance:none;background-color:rgba(10,10,10,0.2);border:none;border-radius:9999px;cursor:pointer;pointer-events:auto;display:inline-block;flex-grow:0;flex-shrink:0;font-size:0;height:20px;max-height:20px;max-width:20px;min-height:20px;min-width:20px;outline:none;position:relative;vertical-align:top;width:20px}.modal-close::before,.delete::before,.modal-close::after,.delete::after{background-color:#fff;content:"";display:block;left:50%;position:absolute;top:50%;transform:translateX(-50%) translateY(-50%) rotate(45deg);transform-origin:center center}.modal-close::before,.delete::before{height:2px;width:50%}.modal-close::after,.delete::after{height:50%;width:2px}.modal-close:hover,.delete:hover,.modal-close:focus,.delete:focus{background-color:rgba(10,10,10,0.3)}.modal-close:active,.delete:active{background-color:rgba(10,10,10,0.4)}.is-small.modal-close,#documenter .docs-sidebar form.docs-search>input.modal-close,.is-small.delete,#documenter .docs-sidebar form.docs-search>input.delete{height:16px;max-height:16px;max-width:16px;min-height:16px;min-width:16px;width:16px}.is-medium.modal-close,.is-medium.delete{height:24px;max-height:24px;max-width:24px;min-height:24px;min-width:24px;width:24px}.is-large.modal-close,.is-large.delete{height:32px;max-height:32px;max-width:32px;min-height:32px;min-width:32px;width:32px}.control.is-loading::after,.select.is-loading::after,.loader,.button.is-loading::after{animation:spinAround 500ms infinite linear;border:2px solid #dbdbdb;border-radius:9999px;border-right-color:transparent;border-top-color:transparent;content:"";display:block;height:1em;position:relative;width:1em}.hero-video,.modal-background,.modal,.image.is-square img,#documenter .docs-sidebar .docs-logo>img.is-square img,.image.is-square .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-square .has-ratio,.image.is-1by1 img,#documenter .docs-sidebar .docs-logo>img.is-1by1 img,.image.is-1by1 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-1by1 .has-ratio,.image.is-5by4 img,#documenter .docs-sidebar .docs-logo>img.is-5by4 img,.image.is-5by4 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-5by4 .has-ratio,.image.is-4by3 img,#documenter .docs-sidebar .docs-logo>img.is-4by3 img,.image.is-4by3 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-4by3 .has-ratio,.image.is-3by2 img,#documenter .docs-sidebar .docs-logo>img.is-3by2 img,.image.is-3by2 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-3by2 .has-ratio,.image.is-5by3 img,#documenter .docs-sidebar .docs-logo>img.is-5by3 img,.image.is-5by3 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-5by3 .has-ratio,.image.is-16by9 img,#documenter .docs-sidebar .docs-logo>img.is-16by9 img,.image.is-16by9 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-16by9 .has-ratio,.image.is-2by1 img,#documenter .docs-sidebar .docs-logo>img.is-2by1 img,.image.is-2by1 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-2by1 .has-ratio,.image.is-3by1 img,#documenter .docs-sidebar .docs-logo>img.is-3by1 img,.image.is-3by1 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-3by1 .has-ratio,.image.is-4by5 img,#documenter .docs-sidebar .docs-logo>img.is-4by5 img,.image.is-4by5 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-4by5 .has-ratio,.image.is-3by4 img,#documenter .docs-sidebar .docs-logo>img.is-3by4 img,.image.is-3by4 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-3by4 .has-ratio,.image.is-2by3 img,#documenter .docs-sidebar .docs-logo>img.is-2by3 img,.image.is-2by3 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-2by3 .has-ratio,.image.is-3by5 img,#documenter .docs-sidebar .docs-logo>img.is-3by5 img,.image.is-3by5 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-3by5 .has-ratio,.image.is-9by16 img,#documenter .docs-sidebar .docs-logo>img.is-9by16 img,.image.is-9by16 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-9by16 .has-ratio,.image.is-1by2 img,#documenter .docs-sidebar .docs-logo>img.is-1by2 img,.image.is-1by2 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-1by2 .has-ratio,.image.is-1by3 img,#documenter .docs-sidebar .docs-logo>img.is-1by3 img,.image.is-1by3 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-1by3 .has-ratio,.is-overlay{bottom:0;left:0;position:absolute;right:0;top:0}.navbar-burger{-moz-appearance:none;-webkit-appearance:none;appearance:none;background:none;border:none;color:currentColor;font-family:inherit;font-size:1em;margin:0;padding:0}.has-text-white{color:#fff !important}a.has-text-white:hover,a.has-text-white:focus{color:#e6e6e6 !important}.has-background-white{background-color:#fff !important}.has-text-black{color:#0a0a0a !important}a.has-text-black:hover,a.has-text-black:focus{color:#000 !important}.has-background-black{background-color:#0a0a0a !important}.has-text-light{color:#f5f5f5 !important}a.has-text-light:hover,a.has-text-light:focus{color:#dbdbdb !important}.has-background-light{background-color:#f5f5f5 !important}.has-text-dark{color:#363636 !important}a.has-text-dark:hover,a.has-text-dark:focus{color:#1c1c1c !important}.has-background-dark{background-color:#363636 !important}.has-text-primary{color:#4eb5de !important}a.has-text-primary:hover,a.has-text-primary:focus{color:#27a1d2 !important}.has-background-primary{background-color:#4eb5de !important}.has-text-primary-light{color:#eef8fc !important}a.has-text-primary-light:hover,a.has-text-primary-light:focus{color:#c3e6f4 !important}.has-background-primary-light{background-color:#eef8fc !important}.has-text-primary-dark{color:#1a6d8e !important}a.has-text-primary-dark:hover,a.has-text-primary-dark:focus{color:#228eb9 !important}.has-background-primary-dark{background-color:#1a6d8e !important}.has-text-link{color:#2e63b8 !important}a.has-text-link:hover,a.has-text-link:focus{color:#244d8f !important}.has-background-link{background-color:#2e63b8 !important}.has-text-link-light{color:#eff3fb !important}a.has-text-link-light:hover,a.has-text-link-light:focus{color:#c6d6f1 !important}.has-background-link-light{background-color:#eff3fb !important}.has-text-link-dark{color:#3169c4 !important}a.has-text-link-dark:hover,a.has-text-link-dark:focus{color:#5485d4 !important}.has-background-link-dark{background-color:#3169c4 !important}.has-text-info{color:#209cee !important}a.has-text-info:hover,a.has-text-info:focus{color:#1081cb !important}.has-background-info{background-color:#209cee !important}.has-text-info-light{color:#ecf7fe !important}a.has-text-info-light:hover,a.has-text-info-light:focus{color:#bde2fa !important}.has-background-info-light{background-color:#ecf7fe !important}.has-text-info-dark{color:#0e72b4 !important}a.has-text-info-dark:hover,a.has-text-info-dark:focus{color:#1190e3 !important}.has-background-info-dark{background-color:#0e72b4 !important}.has-text-success{color:#22c35b !important}a.has-text-success:hover,a.has-text-success:focus{color:#1a9847 !important}.has-background-success{background-color:#22c35b !important}.has-text-success-light{color:#eefcf3 !important}a.has-text-success-light:hover,a.has-text-success-light:focus{color:#c2f4d4 !important}.has-background-success-light{background-color:#eefcf3 !important}.has-text-success-dark{color:#198f43 !important}a.has-text-success-dark:hover,a.has-text-success-dark:focus{color:#21bb57 !important}.has-background-success-dark{background-color:#198f43 !important}.has-text-warning{color:#ffdd57 !important}a.has-text-warning:hover,a.has-text-warning:focus{color:#ffd324 !important}.has-background-warning{background-color:#ffdd57 !important}.has-text-warning-light{color:#fffbeb !important}a.has-text-warning-light:hover,a.has-text-warning-light:focus{color:#fff1b8 !important}.has-background-warning-light{background-color:#fffbeb !important}.has-text-warning-dark{color:#947600 !important}a.has-text-warning-dark:hover,a.has-text-warning-dark:focus{color:#c79f00 !important}.has-background-warning-dark{background-color:#947600 !important}.has-text-danger{color:#da0b00 !important}a.has-text-danger:hover,a.has-text-danger:focus{color:#a70800 !important}.has-background-danger{background-color:#da0b00 !important}.has-text-danger-light{color:#ffeceb !important}a.has-text-danger-light:hover,a.has-text-danger-light:focus{color:#ffbbb8 !important}.has-background-danger-light{background-color:#ffeceb !important}.has-text-danger-dark{color:#f50c00 !important}a.has-text-danger-dark:hover,a.has-text-danger-dark:focus{color:#ff3429 !important}.has-background-danger-dark{background-color:#f50c00 !important}.has-text-black-bis{color:#121212 !important}.has-background-black-bis{background-color:#121212 !important}.has-text-black-ter{color:#242424 !important}.has-background-black-ter{background-color:#242424 !important}.has-text-grey-darker{color:#363636 !important}.has-background-grey-darker{background-color:#363636 !important}.has-text-grey-dark{color:#4a4a4a !important}.has-background-grey-dark{background-color:#4a4a4a !important}.has-text-grey{color:#6b6b6b !important}.has-background-grey{background-color:#6b6b6b !important}.has-text-grey-light{color:#b5b5b5 !important}.has-background-grey-light{background-color:#b5b5b5 !important}.has-text-grey-lighter{color:#dbdbdb !important}.has-background-grey-lighter{background-color:#dbdbdb !important}.has-text-white-ter{color:#f5f5f5 !important}.has-background-white-ter{background-color:#f5f5f5 !important}.has-text-white-bis{color:#fafafa !important}.has-background-white-bis{background-color:#fafafa !important}.is-flex-direction-row{flex-direction:row !important}.is-flex-direction-row-reverse{flex-direction:row-reverse !important}.is-flex-direction-column{flex-direction:column !important}.is-flex-direction-column-reverse{flex-direction:column-reverse !important}.is-flex-wrap-nowrap{flex-wrap:nowrap !important}.is-flex-wrap-wrap{flex-wrap:wrap !important}.is-flex-wrap-wrap-reverse{flex-wrap:wrap-reverse !important}.is-justify-content-flex-start{justify-content:flex-start !important}.is-justify-content-flex-end{justify-content:flex-end !important}.is-justify-content-center{justify-content:center !important}.is-justify-content-space-between{justify-content:space-between !important}.is-justify-content-space-around{justify-content:space-around !important}.is-justify-content-space-evenly{justify-content:space-evenly !important}.is-justify-content-start{justify-content:start !important}.is-justify-content-end{justify-content:end !important}.is-justify-content-left{justify-content:left !important}.is-justify-content-right{justify-content:right !important}.is-align-content-flex-start{align-content:flex-start !important}.is-align-content-flex-end{align-content:flex-end !important}.is-align-content-center{align-content:center !important}.is-align-content-space-between{align-content:space-between !important}.is-align-content-space-around{align-content:space-around !important}.is-align-content-space-evenly{align-content:space-evenly !important}.is-align-content-stretch{align-content:stretch !important}.is-align-content-start{align-content:start !important}.is-align-content-end{align-content:end !important}.is-align-content-baseline{align-content:baseline !important}.is-align-items-stretch{align-items:stretch !important}.is-align-items-flex-start{align-items:flex-start !important}.is-align-items-flex-end{align-items:flex-end !important}.is-align-items-center{align-items:center !important}.is-align-items-baseline{align-items:baseline !important}.is-align-items-start{align-items:start !important}.is-align-items-end{align-items:end !important}.is-align-items-self-start{align-items:self-start !important}.is-align-items-self-end{align-items:self-end !important}.is-align-self-auto{align-self:auto !important}.is-align-self-flex-start{align-self:flex-start !important}.is-align-self-flex-end{align-self:flex-end !important}.is-align-self-center{align-self:center !important}.is-align-self-baseline{align-self:baseline !important}.is-align-self-stretch{align-self:stretch !important}.is-flex-grow-0{flex-grow:0 !important}.is-flex-grow-1{flex-grow:1 !important}.is-flex-grow-2{flex-grow:2 !important}.is-flex-grow-3{flex-grow:3 !important}.is-flex-grow-4{flex-grow:4 !important}.is-flex-grow-5{flex-grow:5 !important}.is-flex-shrink-0{flex-shrink:0 !important}.is-flex-shrink-1{flex-shrink:1 !important}.is-flex-shrink-2{flex-shrink:2 !important}.is-flex-shrink-3{flex-shrink:3 !important}.is-flex-shrink-4{flex-shrink:4 !important}.is-flex-shrink-5{flex-shrink:5 !important}.is-clearfix::after{clear:both;content:" ";display:table}.is-pulled-left{float:left !important}.is-pulled-right{float:right !important}.is-radiusless{border-radius:0 !important}.is-shadowless{box-shadow:none !important}.is-clickable{cursor:pointer !important;pointer-events:all !important}.is-clipped{overflow:hidden !important}.is-relative{position:relative !important}.is-marginless{margin:0 !important}.is-paddingless{padding:0 !important}.m-0{margin:0 !important}.mt-0{margin-top:0 !important}.mr-0{margin-right:0 !important}.mb-0{margin-bottom:0 !important}.ml-0{margin-left:0 !important}.mx-0{margin-left:0 !important;margin-right:0 !important}.my-0{margin-top:0 !important;margin-bottom:0 !important}.m-1{margin:.25rem !important}.mt-1{margin-top:.25rem !important}.mr-1{margin-right:.25rem !important}.mb-1{margin-bottom:.25rem !important}.ml-1{margin-left:.25rem !important}.mx-1{margin-left:.25rem !important;margin-right:.25rem !important}.my-1{margin-top:.25rem !important;margin-bottom:.25rem !important}.m-2{margin:.5rem !important}.mt-2{margin-top:.5rem !important}.mr-2{margin-right:.5rem !important}.mb-2{margin-bottom:.5rem !important}.ml-2{margin-left:.5rem !important}.mx-2{margin-left:.5rem !important;margin-right:.5rem !important}.my-2{margin-top:.5rem !important;margin-bottom:.5rem !important}.m-3{margin:.75rem !important}.mt-3{margin-top:.75rem !important}.mr-3{margin-right:.75rem !important}.mb-3{margin-bottom:.75rem !important}.ml-3{margin-left:.75rem !important}.mx-3{margin-left:.75rem !important;margin-right:.75rem !important}.my-3{margin-top:.75rem !important;margin-bottom:.75rem !important}.m-4{margin:1rem !important}.mt-4{margin-top:1rem !important}.mr-4{margin-right:1rem !important}.mb-4{margin-bottom:1rem !important}.ml-4{margin-left:1rem !important}.mx-4{margin-left:1rem !important;margin-right:1rem !important}.my-4{margin-top:1rem !important;margin-bottom:1rem !important}.m-5{margin:1.5rem !important}.mt-5{margin-top:1.5rem !important}.mr-5{margin-right:1.5rem !important}.mb-5{margin-bottom:1.5rem !important}.ml-5{margin-left:1.5rem !important}.mx-5{margin-left:1.5rem !important;margin-right:1.5rem !important}.my-5{margin-top:1.5rem !important;margin-bottom:1.5rem !important}.m-6{margin:3rem !important}.mt-6{margin-top:3rem !important}.mr-6{margin-right:3rem !important}.mb-6{margin-bottom:3rem !important}.ml-6{margin-left:3rem !important}.mx-6{margin-left:3rem !important;margin-right:3rem !important}.my-6{margin-top:3rem !important;margin-bottom:3rem !important}.m-auto{margin:auto !important}.mt-auto{margin-top:auto !important}.mr-auto{margin-right:auto !important}.mb-auto{margin-bottom:auto !important}.ml-auto{margin-left:auto !important}.mx-auto{margin-left:auto !important;margin-right:auto !important}.my-auto{margin-top:auto !important;margin-bottom:auto !important}.p-0{padding:0 !important}.pt-0{padding-top:0 !important}.pr-0{padding-right:0 !important}.pb-0{padding-bottom:0 !important}.pl-0{padding-left:0 !important}.px-0{padding-left:0 !important;padding-right:0 !important}.py-0{padding-top:0 !important;padding-bottom:0 !important}.p-1{padding:.25rem !important}.pt-1{padding-top:.25rem !important}.pr-1{padding-right:.25rem !important}.pb-1{padding-bottom:.25rem !important}.pl-1{padding-left:.25rem !important}.px-1{padding-left:.25rem !important;padding-right:.25rem !important}.py-1{padding-top:.25rem !important;padding-bottom:.25rem !important}.p-2{padding:.5rem !important}.pt-2{padding-top:.5rem !important}.pr-2{padding-right:.5rem !important}.pb-2{padding-bottom:.5rem !important}.pl-2{padding-left:.5rem !important}.px-2{padding-left:.5rem !important;padding-right:.5rem !important}.py-2{padding-top:.5rem !important;padding-bottom:.5rem !important}.p-3{padding:.75rem !important}.pt-3{padding-top:.75rem !important}.pr-3{padding-right:.75rem !important}.pb-3{padding-bottom:.75rem !important}.pl-3{padding-left:.75rem !important}.px-3{padding-left:.75rem !important;padding-right:.75rem !important}.py-3{padding-top:.75rem !important;padding-bottom:.75rem !important}.p-4{padding:1rem !important}.pt-4{padding-top:1rem !important}.pr-4{padding-right:1rem !important}.pb-4{padding-bottom:1rem !important}.pl-4{padding-left:1rem !important}.px-4{padding-left:1rem !important;padding-right:1rem !important}.py-4{padding-top:1rem !important;padding-bottom:1rem !important}.p-5{padding:1.5rem !important}.pt-5{padding-top:1.5rem !important}.pr-5{padding-right:1.5rem !important}.pb-5{padding-bottom:1.5rem !important}.pl-5{padding-left:1.5rem !important}.px-5{padding-left:1.5rem !important;padding-right:1.5rem !important}.py-5{padding-top:1.5rem !important;padding-bottom:1.5rem !important}.p-6{padding:3rem !important}.pt-6{padding-top:3rem !important}.pr-6{padding-right:3rem !important}.pb-6{padding-bottom:3rem !important}.pl-6{padding-left:3rem !important}.px-6{padding-left:3rem !important;padding-right:3rem !important}.py-6{padding-top:3rem !important;padding-bottom:3rem !important}.p-auto{padding:auto !important}.pt-auto{padding-top:auto !important}.pr-auto{padding-right:auto !important}.pb-auto{padding-bottom:auto !important}.pl-auto{padding-left:auto !important}.px-auto{padding-left:auto !important;padding-right:auto !important}.py-auto{padding-top:auto !important;padding-bottom:auto !important}.is-size-1{font-size:3rem !important}.is-size-2{font-size:2.5rem !important}.is-size-3{font-size:2rem !important}.is-size-4{font-size:1.5rem !important}.is-size-5{font-size:1.25rem !important}.is-size-6{font-size:1rem !important}.is-size-7,.docstring>section>a.docs-sourcelink{font-size:.75rem !important}@media screen and (max-width: 768px){.is-size-1-mobile{font-size:3rem !important}.is-size-2-mobile{font-size:2.5rem !important}.is-size-3-mobile{font-size:2rem !important}.is-size-4-mobile{font-size:1.5rem !important}.is-size-5-mobile{font-size:1.25rem !important}.is-size-6-mobile{font-size:1rem !important}.is-size-7-mobile{font-size:.75rem !important}}@media screen and (min-width: 769px),print{.is-size-1-tablet{font-size:3rem !important}.is-size-2-tablet{font-size:2.5rem !important}.is-size-3-tablet{font-size:2rem !important}.is-size-4-tablet{font-size:1.5rem !important}.is-size-5-tablet{font-size:1.25rem !important}.is-size-6-tablet{font-size:1rem !important}.is-size-7-tablet{font-size:.75rem !important}}@media screen and (max-width: 1055px){.is-size-1-touch{font-size:3rem !important}.is-size-2-touch{font-size:2.5rem !important}.is-size-3-touch{font-size:2rem !important}.is-size-4-touch{font-size:1.5rem !important}.is-size-5-touch{font-size:1.25rem !important}.is-size-6-touch{font-size:1rem !important}.is-size-7-touch{font-size:.75rem !important}}@media screen and (min-width: 1056px){.is-size-1-desktop{font-size:3rem !important}.is-size-2-desktop{font-size:2.5rem !important}.is-size-3-desktop{font-size:2rem !important}.is-size-4-desktop{font-size:1.5rem !important}.is-size-5-desktop{font-size:1.25rem !important}.is-size-6-desktop{font-size:1rem !important}.is-size-7-desktop{font-size:.75rem !important}}@media screen and (min-width: 1216px){.is-size-1-widescreen{font-size:3rem !important}.is-size-2-widescreen{font-size:2.5rem !important}.is-size-3-widescreen{font-size:2rem !important}.is-size-4-widescreen{font-size:1.5rem !important}.is-size-5-widescreen{font-size:1.25rem !important}.is-size-6-widescreen{font-size:1rem !important}.is-size-7-widescreen{font-size:.75rem !important}}@media screen and (min-width: 1408px){.is-size-1-fullhd{font-size:3rem !important}.is-size-2-fullhd{font-size:2.5rem !important}.is-size-3-fullhd{font-size:2rem !important}.is-size-4-fullhd{font-size:1.5rem !important}.is-size-5-fullhd{font-size:1.25rem !important}.is-size-6-fullhd{font-size:1rem !important}.is-size-7-fullhd{font-size:.75rem !important}}.has-text-centered{text-align:center !important}.has-text-justified{text-align:justify !important}.has-text-left{text-align:left !important}.has-text-right{text-align:right !important}@media screen and (max-width: 768px){.has-text-centered-mobile{text-align:center !important}}@media screen and (min-width: 769px),print{.has-text-centered-tablet{text-align:center !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.has-text-centered-tablet-only{text-align:center !important}}@media screen and (max-width: 1055px){.has-text-centered-touch{text-align:center !important}}@media screen and (min-width: 1056px){.has-text-centered-desktop{text-align:center !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.has-text-centered-desktop-only{text-align:center !important}}@media screen and (min-width: 1216px){.has-text-centered-widescreen{text-align:center !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.has-text-centered-widescreen-only{text-align:center !important}}@media screen and (min-width: 1408px){.has-text-centered-fullhd{text-align:center !important}}@media screen and (max-width: 768px){.has-text-justified-mobile{text-align:justify !important}}@media screen and (min-width: 769px),print{.has-text-justified-tablet{text-align:justify !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.has-text-justified-tablet-only{text-align:justify !important}}@media screen and (max-width: 1055px){.has-text-justified-touch{text-align:justify !important}}@media screen and (min-width: 1056px){.has-text-justified-desktop{text-align:justify !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.has-text-justified-desktop-only{text-align:justify !important}}@media screen and (min-width: 1216px){.has-text-justified-widescreen{text-align:justify !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.has-text-justified-widescreen-only{text-align:justify !important}}@media screen and (min-width: 1408px){.has-text-justified-fullhd{text-align:justify !important}}@media screen and (max-width: 768px){.has-text-left-mobile{text-align:left !important}}@media screen and (min-width: 769px),print{.has-text-left-tablet{text-align:left !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.has-text-left-tablet-only{text-align:left !important}}@media screen and (max-width: 1055px){.has-text-left-touch{text-align:left !important}}@media screen and (min-width: 1056px){.has-text-left-desktop{text-align:left !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.has-text-left-desktop-only{text-align:left !important}}@media screen and (min-width: 1216px){.has-text-left-widescreen{text-align:left !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.has-text-left-widescreen-only{text-align:left !important}}@media screen and (min-width: 1408px){.has-text-left-fullhd{text-align:left !important}}@media screen and (max-width: 768px){.has-text-right-mobile{text-align:right !important}}@media screen and (min-width: 769px),print{.has-text-right-tablet{text-align:right !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.has-text-right-tablet-only{text-align:right !important}}@media screen and (max-width: 1055px){.has-text-right-touch{text-align:right !important}}@media screen and (min-width: 1056px){.has-text-right-desktop{text-align:right !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.has-text-right-desktop-only{text-align:right !important}}@media screen and (min-width: 1216px){.has-text-right-widescreen{text-align:right !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.has-text-right-widescreen-only{text-align:right !important}}@media screen and (min-width: 1408px){.has-text-right-fullhd{text-align:right !important}}.is-capitalized{text-transform:capitalize !important}.is-lowercase{text-transform:lowercase !important}.is-uppercase{text-transform:uppercase !important}.is-italic{font-style:italic !important}.is-underlined{text-decoration:underline !important}.has-text-weight-light{font-weight:300 !important}.has-text-weight-normal{font-weight:400 !important}.has-text-weight-medium{font-weight:500 !important}.has-text-weight-semibold{font-weight:600 !important}.has-text-weight-bold{font-weight:700 !important}.is-family-primary{font-family:"Lato Medium",-apple-system,BlinkMacSystemFont,"Segoe UI","Helvetica Neue","Helvetica","Arial",sans-serif !important}.is-family-secondary{font-family:"Lato Medium",-apple-system,BlinkMacSystemFont,"Segoe UI","Helvetica Neue","Helvetica","Arial",sans-serif !important}.is-family-sans-serif{font-family:"Lato Medium",-apple-system,BlinkMacSystemFont,"Segoe UI","Helvetica Neue","Helvetica","Arial",sans-serif !important}.is-family-monospace{font-family:"JuliaMono","SFMono-Regular","Menlo","Consolas","Liberation Mono","DejaVu Sans Mono",monospace !important}.is-family-code{font-family:"JuliaMono","SFMono-Regular","Menlo","Consolas","Liberation Mono","DejaVu Sans Mono",monospace !important}.is-block{display:block !important}@media screen and (max-width: 768px){.is-block-mobile{display:block !important}}@media screen and (min-width: 769px),print{.is-block-tablet{display:block !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.is-block-tablet-only{display:block !important}}@media screen and (max-width: 1055px){.is-block-touch{display:block !important}}@media screen and (min-width: 1056px){.is-block-desktop{display:block !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.is-block-desktop-only{display:block !important}}@media screen and (min-width: 1216px){.is-block-widescreen{display:block !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.is-block-widescreen-only{display:block !important}}@media screen and (min-width: 1408px){.is-block-fullhd{display:block !important}}.is-flex{display:flex !important}@media screen and (max-width: 768px){.is-flex-mobile{display:flex !important}}@media screen and (min-width: 769px),print{.is-flex-tablet{display:flex !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.is-flex-tablet-only{display:flex !important}}@media screen and (max-width: 1055px){.is-flex-touch{display:flex !important}}@media screen and (min-width: 1056px){.is-flex-desktop{display:flex !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.is-flex-desktop-only{display:flex !important}}@media screen and (min-width: 1216px){.is-flex-widescreen{display:flex !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.is-flex-widescreen-only{display:flex !important}}@media screen and (min-width: 1408px){.is-flex-fullhd{display:flex !important}}.is-inline{display:inline !important}@media screen and (max-width: 768px){.is-inline-mobile{display:inline !important}}@media screen and (min-width: 769px),print{.is-inline-tablet{display:inline !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.is-inline-tablet-only{display:inline !important}}@media screen and (max-width: 1055px){.is-inline-touch{display:inline !important}}@media screen and (min-width: 1056px){.is-inline-desktop{display:inline !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.is-inline-desktop-only{display:inline !important}}@media screen and (min-width: 1216px){.is-inline-widescreen{display:inline !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.is-inline-widescreen-only{display:inline !important}}@media screen and (min-width: 1408px){.is-inline-fullhd{display:inline !important}}.is-inline-block{display:inline-block !important}@media screen and (max-width: 768px){.is-inline-block-mobile{display:inline-block !important}}@media screen and (min-width: 769px),print{.is-inline-block-tablet{display:inline-block !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.is-inline-block-tablet-only{display:inline-block !important}}@media screen and (max-width: 1055px){.is-inline-block-touch{display:inline-block !important}}@media screen and (min-width: 1056px){.is-inline-block-desktop{display:inline-block !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.is-inline-block-desktop-only{display:inline-block !important}}@media screen and (min-width: 1216px){.is-inline-block-widescreen{display:inline-block !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.is-inline-block-widescreen-only{display:inline-block !important}}@media screen and (min-width: 1408px){.is-inline-block-fullhd{display:inline-block !important}}.is-inline-flex{display:inline-flex !important}@media screen and (max-width: 768px){.is-inline-flex-mobile{display:inline-flex !important}}@media screen and (min-width: 769px),print{.is-inline-flex-tablet{display:inline-flex !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.is-inline-flex-tablet-only{display:inline-flex !important}}@media screen and (max-width: 1055px){.is-inline-flex-touch{display:inline-flex !important}}@media screen and (min-width: 1056px){.is-inline-flex-desktop{display:inline-flex !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.is-inline-flex-desktop-only{display:inline-flex !important}}@media screen and (min-width: 1216px){.is-inline-flex-widescreen{display:inline-flex !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.is-inline-flex-widescreen-only{display:inline-flex !important}}@media screen and (min-width: 1408px){.is-inline-flex-fullhd{display:inline-flex !important}}.is-hidden{display:none !important}.is-sr-only{border:none !important;clip:rect(0, 0, 0, 0) !important;height:0.01em !important;overflow:hidden !important;padding:0 !important;position:absolute !important;white-space:nowrap !important;width:0.01em !important}@media screen and (max-width: 768px){.is-hidden-mobile{display:none !important}}@media screen and (min-width: 769px),print{.is-hidden-tablet{display:none !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.is-hidden-tablet-only{display:none !important}}@media screen and (max-width: 1055px){.is-hidden-touch{display:none !important}}@media screen and (min-width: 1056px){.is-hidden-desktop{display:none !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.is-hidden-desktop-only{display:none !important}}@media screen and (min-width: 1216px){.is-hidden-widescreen{display:none !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.is-hidden-widescreen-only{display:none !important}}@media screen and (min-width: 1408px){.is-hidden-fullhd{display:none !important}}.is-invisible{visibility:hidden !important}@media screen and (max-width: 768px){.is-invisible-mobile{visibility:hidden !important}}@media screen and (min-width: 769px),print{.is-invisible-tablet{visibility:hidden !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.is-invisible-tablet-only{visibility:hidden !important}}@media screen and (max-width: 1055px){.is-invisible-touch{visibility:hidden !important}}@media screen and (min-width: 1056px){.is-invisible-desktop{visibility:hidden !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.is-invisible-desktop-only{visibility:hidden !important}}@media screen and (min-width: 1216px){.is-invisible-widescreen{visibility:hidden !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.is-invisible-widescreen-only{visibility:hidden !important}}@media screen and (min-width: 1408px){.is-invisible-fullhd{visibility:hidden !important}}/*! minireset.css v0.0.6 | MIT License | github.com/jgthms/minireset.css */html,body,p,ol,ul,li,dl,dt,dd,blockquote,figure,fieldset,legend,textarea,pre,iframe,hr,h1,h2,h3,h4,h5,h6{margin:0;padding:0}h1,h2,h3,h4,h5,h6{font-size:100%;font-weight:normal}ul{list-style:none}button,input,select,textarea{margin:0}html{box-sizing:border-box}*,*::before,*::after{box-sizing:inherit}img,video{height:auto;max-width:100%}iframe{border:0}table{border-collapse:collapse;border-spacing:0}td,th{padding:0}td:not([align]),th:not([align]){text-align:inherit}html{background-color:#fff;font-size:16px;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;min-width:300px;overflow-x:auto;overflow-y:scroll;text-rendering:optimizeLegibility;text-size-adjust:100%}article,aside,figure,footer,header,hgroup,section{display:block}body,button,input,optgroup,select,textarea{font-family:"Lato Medium",-apple-system,BlinkMacSystemFont,"Segoe UI","Helvetica Neue","Helvetica","Arial",sans-serif}code,pre{-moz-osx-font-smoothing:auto;-webkit-font-smoothing:auto;font-family:"JuliaMono","SFMono-Regular","Menlo","Consolas","Liberation Mono","DejaVu Sans Mono",monospace}body{color:#222;font-size:1em;font-weight:400;line-height:1.5}a{color:#2e63b8;cursor:pointer;text-decoration:none}a strong{color:currentColor}a:hover{color:#363636}code{background-color:rgba(0,0,0,0.05);color:#000;font-size:.875em;font-weight:normal;padding:.1em}hr{background-color:#f5f5f5;border:none;display:block;height:2px;margin:1.5rem 0}img{height:auto;max-width:100%}input[type="checkbox"],input[type="radio"]{vertical-align:baseline}small{font-size:.875em}span{font-style:inherit;font-weight:inherit}strong{color:#222;font-weight:700}fieldset{border:none}pre{-webkit-overflow-scrolling:touch;background-color:#f5f5f5;color:#222;font-size:.875em;overflow-x:auto;padding:1.25rem 1.5rem;white-space:pre;word-wrap:normal}pre code{background-color:transparent;color:currentColor;font-size:1em;padding:0}table td,table th{vertical-align:top}table td:not([align]),table th:not([align]){text-align:inherit}table th{color:#222}@keyframes spinAround{from{transform:rotate(0deg)}to{transform:rotate(359deg)}}.box{background-color:#fff;border-radius:6px;box-shadow:#bbb;color:#222;display:block;padding:1.25rem}a.box:hover,a.box:focus{box-shadow:0 0.5em 1em -0.125em rgba(10,10,10,0.1),0 0 0 1px #2e63b8}a.box:active{box-shadow:inset 0 1px 2px rgba(10,10,10,0.2),0 0 0 1px #2e63b8}.button{background-color:#fff;border-color:#dbdbdb;border-width:1px;color:#222;cursor:pointer;justify-content:center;padding-bottom:calc(0.5em - 1px);padding-left:1em;padding-right:1em;padding-top:calc(0.5em - 1px);text-align:center;white-space:nowrap}.button strong{color:inherit}.button .icon,.button .icon.is-small,.button #documenter .docs-sidebar form.docs-search>input.icon,#documenter .docs-sidebar .button form.docs-search>input.icon,.button .icon.is-medium,.button .icon.is-large{height:1.5em;width:1.5em}.button .icon:first-child:not(:last-child){margin-left:calc(-0.5em - 1px);margin-right:.25em}.button .icon:last-child:not(:first-child){margin-left:.25em;margin-right:calc(-0.5em - 1px)}.button .icon:first-child:last-child{margin-left:calc(-0.5em - 1px);margin-right:calc(-0.5em - 1px)}.button:hover,.button.is-hovered{border-color:#b5b5b5;color:#363636}.button:focus,.button.is-focused{border-color:#3c5dcd;color:#363636}.button:focus:not(:active),.button.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(46,99,184,0.25)}.button:active,.button.is-active{border-color:#4a4a4a;color:#363636}.button.is-text{background-color:transparent;border-color:transparent;color:#222;text-decoration:underline}.button.is-text:hover,.button.is-text.is-hovered,.button.is-text:focus,.button.is-text.is-focused{background-color:#f5f5f5;color:#222}.button.is-text:active,.button.is-text.is-active{background-color:#e8e8e8;color:#222}.button.is-text[disabled],fieldset[disabled] .button.is-text{background-color:transparent;border-color:transparent;box-shadow:none}.button.is-ghost{background:none;border-color:rgba(0,0,0,0);color:#2e63b8;text-decoration:none}.button.is-ghost:hover,.button.is-ghost.is-hovered{color:#2e63b8;text-decoration:underline}.button.is-white{background-color:#fff;border-color:transparent;color:#0a0a0a}.button.is-white:hover,.button.is-white.is-hovered{background-color:#f9f9f9;border-color:transparent;color:#0a0a0a}.button.is-white:focus,.button.is-white.is-focused{border-color:transparent;color:#0a0a0a}.button.is-white:focus:not(:active),.button.is-white.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(255,255,255,0.25)}.button.is-white:active,.button.is-white.is-active{background-color:#f2f2f2;border-color:transparent;color:#0a0a0a}.button.is-white[disabled],fieldset[disabled] .button.is-white{background-color:#fff;border-color:#fff;box-shadow:none}.button.is-white.is-inverted{background-color:#0a0a0a;color:#fff}.button.is-white.is-inverted:hover,.button.is-white.is-inverted.is-hovered{background-color:#000}.button.is-white.is-inverted[disabled],fieldset[disabled] .button.is-white.is-inverted{background-color:#0a0a0a;border-color:transparent;box-shadow:none;color:#fff}.button.is-white.is-loading::after{border-color:transparent transparent #0a0a0a #0a0a0a !important}.button.is-white.is-outlined{background-color:transparent;border-color:#fff;color:#fff}.button.is-white.is-outlined:hover,.button.is-white.is-outlined.is-hovered,.button.is-white.is-outlined:focus,.button.is-white.is-outlined.is-focused{background-color:#fff;border-color:#fff;color:#0a0a0a}.button.is-white.is-outlined.is-loading::after{border-color:transparent transparent #fff #fff !important}.button.is-white.is-outlined.is-loading:hover::after,.button.is-white.is-outlined.is-loading.is-hovered::after,.button.is-white.is-outlined.is-loading:focus::after,.button.is-white.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #0a0a0a #0a0a0a !important}.button.is-white.is-outlined[disabled],fieldset[disabled] .button.is-white.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}.button.is-white.is-inverted.is-outlined{background-color:transparent;border-color:#0a0a0a;color:#0a0a0a}.button.is-white.is-inverted.is-outlined:hover,.button.is-white.is-inverted.is-outlined.is-hovered,.button.is-white.is-inverted.is-outlined:focus,.button.is-white.is-inverted.is-outlined.is-focused{background-color:#0a0a0a;color:#fff}.button.is-white.is-inverted.is-outlined.is-loading:hover::after,.button.is-white.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-white.is-inverted.is-outlined.is-loading:focus::after,.button.is-white.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #fff #fff !important}.button.is-white.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-white.is-inverted.is-outlined{background-color:transparent;border-color:#0a0a0a;box-shadow:none;color:#0a0a0a}.button.is-black{background-color:#0a0a0a;border-color:transparent;color:#fff}.button.is-black:hover,.button.is-black.is-hovered{background-color:#040404;border-color:transparent;color:#fff}.button.is-black:focus,.button.is-black.is-focused{border-color:transparent;color:#fff}.button.is-black:focus:not(:active),.button.is-black.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(10,10,10,0.25)}.button.is-black:active,.button.is-black.is-active{background-color:#000;border-color:transparent;color:#fff}.button.is-black[disabled],fieldset[disabled] .button.is-black{background-color:#0a0a0a;border-color:#0a0a0a;box-shadow:none}.button.is-black.is-inverted{background-color:#fff;color:#0a0a0a}.button.is-black.is-inverted:hover,.button.is-black.is-inverted.is-hovered{background-color:#f2f2f2}.button.is-black.is-inverted[disabled],fieldset[disabled] .button.is-black.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#0a0a0a}.button.is-black.is-loading::after{border-color:transparent transparent #fff #fff !important}.button.is-black.is-outlined{background-color:transparent;border-color:#0a0a0a;color:#0a0a0a}.button.is-black.is-outlined:hover,.button.is-black.is-outlined.is-hovered,.button.is-black.is-outlined:focus,.button.is-black.is-outlined.is-focused{background-color:#0a0a0a;border-color:#0a0a0a;color:#fff}.button.is-black.is-outlined.is-loading::after{border-color:transparent transparent #0a0a0a #0a0a0a !important}.button.is-black.is-outlined.is-loading:hover::after,.button.is-black.is-outlined.is-loading.is-hovered::after,.button.is-black.is-outlined.is-loading:focus::after,.button.is-black.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #fff #fff !important}.button.is-black.is-outlined[disabled],fieldset[disabled] .button.is-black.is-outlined{background-color:transparent;border-color:#0a0a0a;box-shadow:none;color:#0a0a0a}.button.is-black.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}.button.is-black.is-inverted.is-outlined:hover,.button.is-black.is-inverted.is-outlined.is-hovered,.button.is-black.is-inverted.is-outlined:focus,.button.is-black.is-inverted.is-outlined.is-focused{background-color:#fff;color:#0a0a0a}.button.is-black.is-inverted.is-outlined.is-loading:hover::after,.button.is-black.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-black.is-inverted.is-outlined.is-loading:focus::after,.button.is-black.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #0a0a0a #0a0a0a !important}.button.is-black.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-black.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}.button.is-light{background-color:#f5f5f5;border-color:transparent;color:rgba(0,0,0,0.7)}.button.is-light:hover,.button.is-light.is-hovered{background-color:#eee;border-color:transparent;color:rgba(0,0,0,0.7)}.button.is-light:focus,.button.is-light.is-focused{border-color:transparent;color:rgba(0,0,0,0.7)}.button.is-light:focus:not(:active),.button.is-light.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(245,245,245,0.25)}.button.is-light:active,.button.is-light.is-active{background-color:#e8e8e8;border-color:transparent;color:rgba(0,0,0,0.7)}.button.is-light[disabled],fieldset[disabled] .button.is-light{background-color:#f5f5f5;border-color:#f5f5f5;box-shadow:none}.button.is-light.is-inverted{background-color:rgba(0,0,0,0.7);color:#f5f5f5}.button.is-light.is-inverted:hover,.button.is-light.is-inverted.is-hovered{background-color:rgba(0,0,0,0.7)}.button.is-light.is-inverted[disabled],fieldset[disabled] .button.is-light.is-inverted{background-color:rgba(0,0,0,0.7);border-color:transparent;box-shadow:none;color:#f5f5f5}.button.is-light.is-loading::after{border-color:transparent transparent rgba(0,0,0,0.7) rgba(0,0,0,0.7) !important}.button.is-light.is-outlined{background-color:transparent;border-color:#f5f5f5;color:#f5f5f5}.button.is-light.is-outlined:hover,.button.is-light.is-outlined.is-hovered,.button.is-light.is-outlined:focus,.button.is-light.is-outlined.is-focused{background-color:#f5f5f5;border-color:#f5f5f5;color:rgba(0,0,0,0.7)}.button.is-light.is-outlined.is-loading::after{border-color:transparent transparent #f5f5f5 #f5f5f5 !important}.button.is-light.is-outlined.is-loading:hover::after,.button.is-light.is-outlined.is-loading.is-hovered::after,.button.is-light.is-outlined.is-loading:focus::after,.button.is-light.is-outlined.is-loading.is-focused::after{border-color:transparent transparent rgba(0,0,0,0.7) rgba(0,0,0,0.7) !important}.button.is-light.is-outlined[disabled],fieldset[disabled] .button.is-light.is-outlined{background-color:transparent;border-color:#f5f5f5;box-shadow:none;color:#f5f5f5}.button.is-light.is-inverted.is-outlined{background-color:transparent;border-color:rgba(0,0,0,0.7);color:rgba(0,0,0,0.7)}.button.is-light.is-inverted.is-outlined:hover,.button.is-light.is-inverted.is-outlined.is-hovered,.button.is-light.is-inverted.is-outlined:focus,.button.is-light.is-inverted.is-outlined.is-focused{background-color:rgba(0,0,0,0.7);color:#f5f5f5}.button.is-light.is-inverted.is-outlined.is-loading:hover::after,.button.is-light.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-light.is-inverted.is-outlined.is-loading:focus::after,.button.is-light.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #f5f5f5 #f5f5f5 !important}.button.is-light.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-light.is-inverted.is-outlined{background-color:transparent;border-color:rgba(0,0,0,0.7);box-shadow:none;color:rgba(0,0,0,0.7)}.button.is-dark,.content kbd.button{background-color:#363636;border-color:transparent;color:#fff}.button.is-dark:hover,.content kbd.button:hover,.button.is-dark.is-hovered,.content kbd.button.is-hovered{background-color:#2f2f2f;border-color:transparent;color:#fff}.button.is-dark:focus,.content kbd.button:focus,.button.is-dark.is-focused,.content kbd.button.is-focused{border-color:transparent;color:#fff}.button.is-dark:focus:not(:active),.content kbd.button:focus:not(:active),.button.is-dark.is-focused:not(:active),.content kbd.button.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(54,54,54,0.25)}.button.is-dark:active,.content kbd.button:active,.button.is-dark.is-active,.content kbd.button.is-active{background-color:#292929;border-color:transparent;color:#fff}.button.is-dark[disabled],.content kbd.button[disabled],fieldset[disabled] .button.is-dark,fieldset[disabled] .content kbd.button,.content fieldset[disabled] kbd.button{background-color:#363636;border-color:#363636;box-shadow:none}.button.is-dark.is-inverted,.content kbd.button.is-inverted{background-color:#fff;color:#363636}.button.is-dark.is-inverted:hover,.content kbd.button.is-inverted:hover,.button.is-dark.is-inverted.is-hovered,.content kbd.button.is-inverted.is-hovered{background-color:#f2f2f2}.button.is-dark.is-inverted[disabled],.content kbd.button.is-inverted[disabled],fieldset[disabled] .button.is-dark.is-inverted,fieldset[disabled] .content kbd.button.is-inverted,.content fieldset[disabled] kbd.button.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#363636}.button.is-dark.is-loading::after,.content kbd.button.is-loading::after{border-color:transparent transparent #fff #fff !important}.button.is-dark.is-outlined,.content kbd.button.is-outlined{background-color:transparent;border-color:#363636;color:#363636}.button.is-dark.is-outlined:hover,.content kbd.button.is-outlined:hover,.button.is-dark.is-outlined.is-hovered,.content kbd.button.is-outlined.is-hovered,.button.is-dark.is-outlined:focus,.content kbd.button.is-outlined:focus,.button.is-dark.is-outlined.is-focused,.content kbd.button.is-outlined.is-focused{background-color:#363636;border-color:#363636;color:#fff}.button.is-dark.is-outlined.is-loading::after,.content kbd.button.is-outlined.is-loading::after{border-color:transparent transparent #363636 #363636 !important}.button.is-dark.is-outlined.is-loading:hover::after,.content kbd.button.is-outlined.is-loading:hover::after,.button.is-dark.is-outlined.is-loading.is-hovered::after,.content kbd.button.is-outlined.is-loading.is-hovered::after,.button.is-dark.is-outlined.is-loading:focus::after,.content kbd.button.is-outlined.is-loading:focus::after,.button.is-dark.is-outlined.is-loading.is-focused::after,.content kbd.button.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #fff #fff !important}.button.is-dark.is-outlined[disabled],.content kbd.button.is-outlined[disabled],fieldset[disabled] .button.is-dark.is-outlined,fieldset[disabled] .content kbd.button.is-outlined,.content fieldset[disabled] kbd.button.is-outlined{background-color:transparent;border-color:#363636;box-shadow:none;color:#363636}.button.is-dark.is-inverted.is-outlined,.content kbd.button.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}.button.is-dark.is-inverted.is-outlined:hover,.content kbd.button.is-inverted.is-outlined:hover,.button.is-dark.is-inverted.is-outlined.is-hovered,.content kbd.button.is-inverted.is-outlined.is-hovered,.button.is-dark.is-inverted.is-outlined:focus,.content kbd.button.is-inverted.is-outlined:focus,.button.is-dark.is-inverted.is-outlined.is-focused,.content kbd.button.is-inverted.is-outlined.is-focused{background-color:#fff;color:#363636}.button.is-dark.is-inverted.is-outlined.is-loading:hover::after,.content kbd.button.is-inverted.is-outlined.is-loading:hover::after,.button.is-dark.is-inverted.is-outlined.is-loading.is-hovered::after,.content kbd.button.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-dark.is-inverted.is-outlined.is-loading:focus::after,.content kbd.button.is-inverted.is-outlined.is-loading:focus::after,.button.is-dark.is-inverted.is-outlined.is-loading.is-focused::after,.content kbd.button.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #363636 #363636 !important}.button.is-dark.is-inverted.is-outlined[disabled],.content kbd.button.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-dark.is-inverted.is-outlined,fieldset[disabled] .content kbd.button.is-inverted.is-outlined,.content fieldset[disabled] kbd.button.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}.button.is-primary,.docstring>section>a.button.docs-sourcelink{background-color:#4eb5de;border-color:transparent;color:#fff}.button.is-primary:hover,.docstring>section>a.button.docs-sourcelink:hover,.button.is-primary.is-hovered,.docstring>section>a.button.is-hovered.docs-sourcelink{background-color:#43b1dc;border-color:transparent;color:#fff}.button.is-primary:focus,.docstring>section>a.button.docs-sourcelink:focus,.button.is-primary.is-focused,.docstring>section>a.button.is-focused.docs-sourcelink{border-color:transparent;color:#fff}.button.is-primary:focus:not(:active),.docstring>section>a.button.docs-sourcelink:focus:not(:active),.button.is-primary.is-focused:not(:active),.docstring>section>a.button.is-focused.docs-sourcelink:not(:active){box-shadow:0 0 0 0.125em rgba(78,181,222,0.25)}.button.is-primary:active,.docstring>section>a.button.docs-sourcelink:active,.button.is-primary.is-active,.docstring>section>a.button.is-active.docs-sourcelink{background-color:#39acda;border-color:transparent;color:#fff}.button.is-primary[disabled],.docstring>section>a.button.docs-sourcelink[disabled],fieldset[disabled] .button.is-primary,fieldset[disabled] .docstring>section>a.button.docs-sourcelink{background-color:#4eb5de;border-color:#4eb5de;box-shadow:none}.button.is-primary.is-inverted,.docstring>section>a.button.is-inverted.docs-sourcelink{background-color:#fff;color:#4eb5de}.button.is-primary.is-inverted:hover,.docstring>section>a.button.is-inverted.docs-sourcelink:hover,.button.is-primary.is-inverted.is-hovered,.docstring>section>a.button.is-inverted.is-hovered.docs-sourcelink{background-color:#f2f2f2}.button.is-primary.is-inverted[disabled],.docstring>section>a.button.is-inverted.docs-sourcelink[disabled],fieldset[disabled] .button.is-primary.is-inverted,fieldset[disabled] .docstring>section>a.button.is-inverted.docs-sourcelink{background-color:#fff;border-color:transparent;box-shadow:none;color:#4eb5de}.button.is-primary.is-loading::after,.docstring>section>a.button.is-loading.docs-sourcelink::after{border-color:transparent transparent #fff #fff !important}.button.is-primary.is-outlined,.docstring>section>a.button.is-outlined.docs-sourcelink{background-color:transparent;border-color:#4eb5de;color:#4eb5de}.button.is-primary.is-outlined:hover,.docstring>section>a.button.is-outlined.docs-sourcelink:hover,.button.is-primary.is-outlined.is-hovered,.docstring>section>a.button.is-outlined.is-hovered.docs-sourcelink,.button.is-primary.is-outlined:focus,.docstring>section>a.button.is-outlined.docs-sourcelink:focus,.button.is-primary.is-outlined.is-focused,.docstring>section>a.button.is-outlined.is-focused.docs-sourcelink{background-color:#4eb5de;border-color:#4eb5de;color:#fff}.button.is-primary.is-outlined.is-loading::after,.docstring>section>a.button.is-outlined.is-loading.docs-sourcelink::after{border-color:transparent transparent #4eb5de #4eb5de !important}.button.is-primary.is-outlined.is-loading:hover::after,.docstring>section>a.button.is-outlined.is-loading.docs-sourcelink:hover::after,.button.is-primary.is-outlined.is-loading.is-hovered::after,.docstring>section>a.button.is-outlined.is-loading.is-hovered.docs-sourcelink::after,.button.is-primary.is-outlined.is-loading:focus::after,.docstring>section>a.button.is-outlined.is-loading.docs-sourcelink:focus::after,.button.is-primary.is-outlined.is-loading.is-focused::after,.docstring>section>a.button.is-outlined.is-loading.is-focused.docs-sourcelink::after{border-color:transparent transparent #fff #fff !important}.button.is-primary.is-outlined[disabled],.docstring>section>a.button.is-outlined.docs-sourcelink[disabled],fieldset[disabled] .button.is-primary.is-outlined,fieldset[disabled] .docstring>section>a.button.is-outlined.docs-sourcelink{background-color:transparent;border-color:#4eb5de;box-shadow:none;color:#4eb5de}.button.is-primary.is-inverted.is-outlined,.docstring>section>a.button.is-inverted.is-outlined.docs-sourcelink{background-color:transparent;border-color:#fff;color:#fff}.button.is-primary.is-inverted.is-outlined:hover,.docstring>section>a.button.is-inverted.is-outlined.docs-sourcelink:hover,.button.is-primary.is-inverted.is-outlined.is-hovered,.docstring>section>a.button.is-inverted.is-outlined.is-hovered.docs-sourcelink,.button.is-primary.is-inverted.is-outlined:focus,.docstring>section>a.button.is-inverted.is-outlined.docs-sourcelink:focus,.button.is-primary.is-inverted.is-outlined.is-focused,.docstring>section>a.button.is-inverted.is-outlined.is-focused.docs-sourcelink{background-color:#fff;color:#4eb5de}.button.is-primary.is-inverted.is-outlined.is-loading:hover::after,.docstring>section>a.button.is-inverted.is-outlined.is-loading.docs-sourcelink:hover::after,.button.is-primary.is-inverted.is-outlined.is-loading.is-hovered::after,.docstring>section>a.button.is-inverted.is-outlined.is-loading.is-hovered.docs-sourcelink::after,.button.is-primary.is-inverted.is-outlined.is-loading:focus::after,.docstring>section>a.button.is-inverted.is-outlined.is-loading.docs-sourcelink:focus::after,.button.is-primary.is-inverted.is-outlined.is-loading.is-focused::after,.docstring>section>a.button.is-inverted.is-outlined.is-loading.is-focused.docs-sourcelink::after{border-color:transparent transparent #4eb5de #4eb5de !important}.button.is-primary.is-inverted.is-outlined[disabled],.docstring>section>a.button.is-inverted.is-outlined.docs-sourcelink[disabled],fieldset[disabled] .button.is-primary.is-inverted.is-outlined,fieldset[disabled] .docstring>section>a.button.is-inverted.is-outlined.docs-sourcelink{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}.button.is-primary.is-light,.docstring>section>a.button.is-light.docs-sourcelink{background-color:#eef8fc;color:#1a6d8e}.button.is-primary.is-light:hover,.docstring>section>a.button.is-light.docs-sourcelink:hover,.button.is-primary.is-light.is-hovered,.docstring>section>a.button.is-light.is-hovered.docs-sourcelink{background-color:#e3f3fa;border-color:transparent;color:#1a6d8e}.button.is-primary.is-light:active,.docstring>section>a.button.is-light.docs-sourcelink:active,.button.is-primary.is-light.is-active,.docstring>section>a.button.is-light.is-active.docs-sourcelink{background-color:#d8eff8;border-color:transparent;color:#1a6d8e}.button.is-link{background-color:#2e63b8;border-color:transparent;color:#fff}.button.is-link:hover,.button.is-link.is-hovered{background-color:#2b5eae;border-color:transparent;color:#fff}.button.is-link:focus,.button.is-link.is-focused{border-color:transparent;color:#fff}.button.is-link:focus:not(:active),.button.is-link.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(46,99,184,0.25)}.button.is-link:active,.button.is-link.is-active{background-color:#2958a4;border-color:transparent;color:#fff}.button.is-link[disabled],fieldset[disabled] .button.is-link{background-color:#2e63b8;border-color:#2e63b8;box-shadow:none}.button.is-link.is-inverted{background-color:#fff;color:#2e63b8}.button.is-link.is-inverted:hover,.button.is-link.is-inverted.is-hovered{background-color:#f2f2f2}.button.is-link.is-inverted[disabled],fieldset[disabled] .button.is-link.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#2e63b8}.button.is-link.is-loading::after{border-color:transparent transparent #fff #fff !important}.button.is-link.is-outlined{background-color:transparent;border-color:#2e63b8;color:#2e63b8}.button.is-link.is-outlined:hover,.button.is-link.is-outlined.is-hovered,.button.is-link.is-outlined:focus,.button.is-link.is-outlined.is-focused{background-color:#2e63b8;border-color:#2e63b8;color:#fff}.button.is-link.is-outlined.is-loading::after{border-color:transparent transparent #2e63b8 #2e63b8 !important}.button.is-link.is-outlined.is-loading:hover::after,.button.is-link.is-outlined.is-loading.is-hovered::after,.button.is-link.is-outlined.is-loading:focus::after,.button.is-link.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #fff #fff !important}.button.is-link.is-outlined[disabled],fieldset[disabled] .button.is-link.is-outlined{background-color:transparent;border-color:#2e63b8;box-shadow:none;color:#2e63b8}.button.is-link.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}.button.is-link.is-inverted.is-outlined:hover,.button.is-link.is-inverted.is-outlined.is-hovered,.button.is-link.is-inverted.is-outlined:focus,.button.is-link.is-inverted.is-outlined.is-focused{background-color:#fff;color:#2e63b8}.button.is-link.is-inverted.is-outlined.is-loading:hover::after,.button.is-link.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-link.is-inverted.is-outlined.is-loading:focus::after,.button.is-link.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #2e63b8 #2e63b8 !important}.button.is-link.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-link.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}.button.is-link.is-light{background-color:#eff3fb;color:#3169c4}.button.is-link.is-light:hover,.button.is-link.is-light.is-hovered{background-color:#e4ecf8;border-color:transparent;color:#3169c4}.button.is-link.is-light:active,.button.is-link.is-light.is-active{background-color:#dae5f6;border-color:transparent;color:#3169c4}.button.is-info{background-color:#209cee;border-color:transparent;color:#fff}.button.is-info:hover,.button.is-info.is-hovered{background-color:#1497ed;border-color:transparent;color:#fff}.button.is-info:focus,.button.is-info.is-focused{border-color:transparent;color:#fff}.button.is-info:focus:not(:active),.button.is-info.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(32,156,238,0.25)}.button.is-info:active,.button.is-info.is-active{background-color:#1190e3;border-color:transparent;color:#fff}.button.is-info[disabled],fieldset[disabled] .button.is-info{background-color:#209cee;border-color:#209cee;box-shadow:none}.button.is-info.is-inverted{background-color:#fff;color:#209cee}.button.is-info.is-inverted:hover,.button.is-info.is-inverted.is-hovered{background-color:#f2f2f2}.button.is-info.is-inverted[disabled],fieldset[disabled] .button.is-info.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#209cee}.button.is-info.is-loading::after{border-color:transparent transparent #fff #fff !important}.button.is-info.is-outlined{background-color:transparent;border-color:#209cee;color:#209cee}.button.is-info.is-outlined:hover,.button.is-info.is-outlined.is-hovered,.button.is-info.is-outlined:focus,.button.is-info.is-outlined.is-focused{background-color:#209cee;border-color:#209cee;color:#fff}.button.is-info.is-outlined.is-loading::after{border-color:transparent transparent #209cee #209cee !important}.button.is-info.is-outlined.is-loading:hover::after,.button.is-info.is-outlined.is-loading.is-hovered::after,.button.is-info.is-outlined.is-loading:focus::after,.button.is-info.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #fff #fff !important}.button.is-info.is-outlined[disabled],fieldset[disabled] .button.is-info.is-outlined{background-color:transparent;border-color:#209cee;box-shadow:none;color:#209cee}.button.is-info.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}.button.is-info.is-inverted.is-outlined:hover,.button.is-info.is-inverted.is-outlined.is-hovered,.button.is-info.is-inverted.is-outlined:focus,.button.is-info.is-inverted.is-outlined.is-focused{background-color:#fff;color:#209cee}.button.is-info.is-inverted.is-outlined.is-loading:hover::after,.button.is-info.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-info.is-inverted.is-outlined.is-loading:focus::after,.button.is-info.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #209cee #209cee !important}.button.is-info.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-info.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}.button.is-info.is-light{background-color:#ecf7fe;color:#0e72b4}.button.is-info.is-light:hover,.button.is-info.is-light.is-hovered{background-color:#e0f1fd;border-color:transparent;color:#0e72b4}.button.is-info.is-light:active,.button.is-info.is-light.is-active{background-color:#d4ecfc;border-color:transparent;color:#0e72b4}.button.is-success{background-color:#22c35b;border-color:transparent;color:#fff}.button.is-success:hover,.button.is-success.is-hovered{background-color:#20b856;border-color:transparent;color:#fff}.button.is-success:focus,.button.is-success.is-focused{border-color:transparent;color:#fff}.button.is-success:focus:not(:active),.button.is-success.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(34,195,91,0.25)}.button.is-success:active,.button.is-success.is-active{background-color:#1ead51;border-color:transparent;color:#fff}.button.is-success[disabled],fieldset[disabled] .button.is-success{background-color:#22c35b;border-color:#22c35b;box-shadow:none}.button.is-success.is-inverted{background-color:#fff;color:#22c35b}.button.is-success.is-inverted:hover,.button.is-success.is-inverted.is-hovered{background-color:#f2f2f2}.button.is-success.is-inverted[disabled],fieldset[disabled] .button.is-success.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#22c35b}.button.is-success.is-loading::after{border-color:transparent transparent #fff #fff !important}.button.is-success.is-outlined{background-color:transparent;border-color:#22c35b;color:#22c35b}.button.is-success.is-outlined:hover,.button.is-success.is-outlined.is-hovered,.button.is-success.is-outlined:focus,.button.is-success.is-outlined.is-focused{background-color:#22c35b;border-color:#22c35b;color:#fff}.button.is-success.is-outlined.is-loading::after{border-color:transparent transparent #22c35b #22c35b !important}.button.is-success.is-outlined.is-loading:hover::after,.button.is-success.is-outlined.is-loading.is-hovered::after,.button.is-success.is-outlined.is-loading:focus::after,.button.is-success.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #fff #fff !important}.button.is-success.is-outlined[disabled],fieldset[disabled] .button.is-success.is-outlined{background-color:transparent;border-color:#22c35b;box-shadow:none;color:#22c35b}.button.is-success.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}.button.is-success.is-inverted.is-outlined:hover,.button.is-success.is-inverted.is-outlined.is-hovered,.button.is-success.is-inverted.is-outlined:focus,.button.is-success.is-inverted.is-outlined.is-focused{background-color:#fff;color:#22c35b}.button.is-success.is-inverted.is-outlined.is-loading:hover::after,.button.is-success.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-success.is-inverted.is-outlined.is-loading:focus::after,.button.is-success.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #22c35b #22c35b !important}.button.is-success.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-success.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}.button.is-success.is-light{background-color:#eefcf3;color:#198f43}.button.is-success.is-light:hover,.button.is-success.is-light.is-hovered{background-color:#e3faeb;border-color:transparent;color:#198f43}.button.is-success.is-light:active,.button.is-success.is-light.is-active{background-color:#d8f8e3;border-color:transparent;color:#198f43}.button.is-warning{background-color:#ffdd57;border-color:transparent;color:rgba(0,0,0,0.7)}.button.is-warning:hover,.button.is-warning.is-hovered{background-color:#ffda4a;border-color:transparent;color:rgba(0,0,0,0.7)}.button.is-warning:focus,.button.is-warning.is-focused{border-color:transparent;color:rgba(0,0,0,0.7)}.button.is-warning:focus:not(:active),.button.is-warning.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(255,221,87,0.25)}.button.is-warning:active,.button.is-warning.is-active{background-color:#ffd83e;border-color:transparent;color:rgba(0,0,0,0.7)}.button.is-warning[disabled],fieldset[disabled] .button.is-warning{background-color:#ffdd57;border-color:#ffdd57;box-shadow:none}.button.is-warning.is-inverted{background-color:rgba(0,0,0,0.7);color:#ffdd57}.button.is-warning.is-inverted:hover,.button.is-warning.is-inverted.is-hovered{background-color:rgba(0,0,0,0.7)}.button.is-warning.is-inverted[disabled],fieldset[disabled] .button.is-warning.is-inverted{background-color:rgba(0,0,0,0.7);border-color:transparent;box-shadow:none;color:#ffdd57}.button.is-warning.is-loading::after{border-color:transparent transparent rgba(0,0,0,0.7) rgba(0,0,0,0.7) !important}.button.is-warning.is-outlined{background-color:transparent;border-color:#ffdd57;color:#ffdd57}.button.is-warning.is-outlined:hover,.button.is-warning.is-outlined.is-hovered,.button.is-warning.is-outlined:focus,.button.is-warning.is-outlined.is-focused{background-color:#ffdd57;border-color:#ffdd57;color:rgba(0,0,0,0.7)}.button.is-warning.is-outlined.is-loading::after{border-color:transparent transparent #ffdd57 #ffdd57 !important}.button.is-warning.is-outlined.is-loading:hover::after,.button.is-warning.is-outlined.is-loading.is-hovered::after,.button.is-warning.is-outlined.is-loading:focus::after,.button.is-warning.is-outlined.is-loading.is-focused::after{border-color:transparent transparent rgba(0,0,0,0.7) rgba(0,0,0,0.7) !important}.button.is-warning.is-outlined[disabled],fieldset[disabled] .button.is-warning.is-outlined{background-color:transparent;border-color:#ffdd57;box-shadow:none;color:#ffdd57}.button.is-warning.is-inverted.is-outlined{background-color:transparent;border-color:rgba(0,0,0,0.7);color:rgba(0,0,0,0.7)}.button.is-warning.is-inverted.is-outlined:hover,.button.is-warning.is-inverted.is-outlined.is-hovered,.button.is-warning.is-inverted.is-outlined:focus,.button.is-warning.is-inverted.is-outlined.is-focused{background-color:rgba(0,0,0,0.7);color:#ffdd57}.button.is-warning.is-inverted.is-outlined.is-loading:hover::after,.button.is-warning.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-warning.is-inverted.is-outlined.is-loading:focus::after,.button.is-warning.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #ffdd57 #ffdd57 !important}.button.is-warning.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-warning.is-inverted.is-outlined{background-color:transparent;border-color:rgba(0,0,0,0.7);box-shadow:none;color:rgba(0,0,0,0.7)}.button.is-warning.is-light{background-color:#fffbeb;color:#947600}.button.is-warning.is-light:hover,.button.is-warning.is-light.is-hovered{background-color:#fff8de;border-color:transparent;color:#947600}.button.is-warning.is-light:active,.button.is-warning.is-light.is-active{background-color:#fff6d1;border-color:transparent;color:#947600}.button.is-danger{background-color:#da0b00;border-color:transparent;color:#fff}.button.is-danger:hover,.button.is-danger.is-hovered{background-color:#cd0a00;border-color:transparent;color:#fff}.button.is-danger:focus,.button.is-danger.is-focused{border-color:transparent;color:#fff}.button.is-danger:focus:not(:active),.button.is-danger.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(218,11,0,0.25)}.button.is-danger:active,.button.is-danger.is-active{background-color:#c10a00;border-color:transparent;color:#fff}.button.is-danger[disabled],fieldset[disabled] .button.is-danger{background-color:#da0b00;border-color:#da0b00;box-shadow:none}.button.is-danger.is-inverted{background-color:#fff;color:#da0b00}.button.is-danger.is-inverted:hover,.button.is-danger.is-inverted.is-hovered{background-color:#f2f2f2}.button.is-danger.is-inverted[disabled],fieldset[disabled] .button.is-danger.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#da0b00}.button.is-danger.is-loading::after{border-color:transparent transparent #fff #fff !important}.button.is-danger.is-outlined{background-color:transparent;border-color:#da0b00;color:#da0b00}.button.is-danger.is-outlined:hover,.button.is-danger.is-outlined.is-hovered,.button.is-danger.is-outlined:focus,.button.is-danger.is-outlined.is-focused{background-color:#da0b00;border-color:#da0b00;color:#fff}.button.is-danger.is-outlined.is-loading::after{border-color:transparent transparent #da0b00 #da0b00 !important}.button.is-danger.is-outlined.is-loading:hover::after,.button.is-danger.is-outlined.is-loading.is-hovered::after,.button.is-danger.is-outlined.is-loading:focus::after,.button.is-danger.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #fff #fff !important}.button.is-danger.is-outlined[disabled],fieldset[disabled] .button.is-danger.is-outlined{background-color:transparent;border-color:#da0b00;box-shadow:none;color:#da0b00}.button.is-danger.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}.button.is-danger.is-inverted.is-outlined:hover,.button.is-danger.is-inverted.is-outlined.is-hovered,.button.is-danger.is-inverted.is-outlined:focus,.button.is-danger.is-inverted.is-outlined.is-focused{background-color:#fff;color:#da0b00}.button.is-danger.is-inverted.is-outlined.is-loading:hover::after,.button.is-danger.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-danger.is-inverted.is-outlined.is-loading:focus::after,.button.is-danger.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #da0b00 #da0b00 !important}.button.is-danger.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-danger.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}.button.is-danger.is-light{background-color:#ffeceb;color:#f50c00}.button.is-danger.is-light:hover,.button.is-danger.is-light.is-hovered{background-color:#ffe0de;border-color:transparent;color:#f50c00}.button.is-danger.is-light:active,.button.is-danger.is-light.is-active{background-color:#ffd3d1;border-color:transparent;color:#f50c00}.button.is-small,#documenter .docs-sidebar form.docs-search>input.button{font-size:.75rem}.button.is-small:not(.is-rounded),#documenter .docs-sidebar form.docs-search>input.button:not(.is-rounded){border-radius:2px}.button.is-normal{font-size:1rem}.button.is-medium{font-size:1.25rem}.button.is-large{font-size:1.5rem}.button[disabled],fieldset[disabled] .button{background-color:#fff;border-color:#dbdbdb;box-shadow:none;opacity:.5}.button.is-fullwidth{display:flex;width:100%}.button.is-loading{color:transparent !important;pointer-events:none}.button.is-loading::after{position:absolute;left:calc(50% - (1em * 0.5));top:calc(50% - (1em * 0.5));position:absolute !important}.button.is-static{background-color:#f5f5f5;border-color:#dbdbdb;color:#6b6b6b;box-shadow:none;pointer-events:none}.button.is-rounded,#documenter .docs-sidebar form.docs-search>input.button{border-radius:9999px;padding-left:calc(1em + 0.25em);padding-right:calc(1em + 0.25em)}.buttons{align-items:center;display:flex;flex-wrap:wrap;justify-content:flex-start}.buttons .button{margin-bottom:0.5rem}.buttons .button:not(:last-child):not(.is-fullwidth){margin-right:.5rem}.buttons:last-child{margin-bottom:-0.5rem}.buttons:not(:last-child){margin-bottom:1rem}.buttons.are-small .button:not(.is-normal):not(.is-medium):not(.is-large){font-size:.75rem}.buttons.are-small .button:not(.is-normal):not(.is-medium):not(.is-large):not(.is-rounded){border-radius:2px}.buttons.are-medium .button:not(.is-small):not(.is-normal):not(.is-large){font-size:1.25rem}.buttons.are-large .button:not(.is-small):not(.is-normal):not(.is-medium){font-size:1.5rem}.buttons.has-addons .button:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}.buttons.has-addons .button:not(:last-child){border-bottom-right-radius:0;border-top-right-radius:0;margin-right:-1px}.buttons.has-addons .button:last-child{margin-right:0}.buttons.has-addons .button:hover,.buttons.has-addons .button.is-hovered{z-index:2}.buttons.has-addons .button:focus,.buttons.has-addons .button.is-focused,.buttons.has-addons .button:active,.buttons.has-addons .button.is-active,.buttons.has-addons .button.is-selected{z-index:3}.buttons.has-addons .button:focus:hover,.buttons.has-addons .button.is-focused:hover,.buttons.has-addons .button:active:hover,.buttons.has-addons .button.is-active:hover,.buttons.has-addons .button.is-selected:hover{z-index:4}.buttons.has-addons .button.is-expanded{flex-grow:1;flex-shrink:1}.buttons.is-centered{justify-content:center}.buttons.is-centered:not(.has-addons) .button:not(.is-fullwidth){margin-left:0.25rem;margin-right:0.25rem}.buttons.is-right{justify-content:flex-end}.buttons.is-right:not(.has-addons) .button:not(.is-fullwidth){margin-left:0.25rem;margin-right:0.25rem}@media screen and (max-width: 768px){.button.is-responsive.is-small,#documenter .docs-sidebar form.docs-search>input.is-responsive{font-size:.5625rem}.button.is-responsive,.button.is-responsive.is-normal{font-size:.65625rem}.button.is-responsive.is-medium{font-size:.75rem}.button.is-responsive.is-large{font-size:1rem}}@media screen and (min-width: 769px) and (max-width: 1055px){.button.is-responsive.is-small,#documenter .docs-sidebar form.docs-search>input.is-responsive{font-size:.65625rem}.button.is-responsive,.button.is-responsive.is-normal{font-size:.75rem}.button.is-responsive.is-medium{font-size:1rem}.button.is-responsive.is-large{font-size:1.25rem}}.container{flex-grow:1;margin:0 auto;position:relative;width:auto}.container.is-fluid{max-width:none !important;padding-left:32px;padding-right:32px;width:100%}@media screen and (min-width: 1056px){.container{max-width:992px}}@media screen and (max-width: 1215px){.container.is-widescreen:not(.is-max-desktop){max-width:1152px}}@media screen and (max-width: 1407px){.container.is-fullhd:not(.is-max-desktop):not(.is-max-widescreen){max-width:1344px}}@media screen and (min-width: 1216px){.container:not(.is-max-desktop){max-width:1152px}}@media screen and (min-width: 1408px){.container:not(.is-max-desktop):not(.is-max-widescreen){max-width:1344px}}.content li+li{margin-top:0.25em}.content p:not(:last-child),.content dl:not(:last-child),.content ol:not(:last-child),.content ul:not(:last-child),.content blockquote:not(:last-child),.content pre:not(:last-child),.content table:not(:last-child){margin-bottom:1em}.content h1,.content h2,.content h3,.content h4,.content h5,.content h6{color:#222;font-weight:600;line-height:1.125}.content h1{font-size:2em;margin-bottom:0.5em}.content h1:not(:first-child){margin-top:1em}.content h2{font-size:1.75em;margin-bottom:0.5714em}.content h2:not(:first-child){margin-top:1.1428em}.content h3{font-size:1.5em;margin-bottom:0.6666em}.content h3:not(:first-child){margin-top:1.3333em}.content h4{font-size:1.25em;margin-bottom:0.8em}.content h5{font-size:1.125em;margin-bottom:0.8888em}.content h6{font-size:1em;margin-bottom:1em}.content blockquote{background-color:#f5f5f5;border-left:5px solid #dbdbdb;padding:1.25em 1.5em}.content ol{list-style-position:outside;margin-left:2em;margin-top:1em}.content ol:not([type]){list-style-type:decimal}.content ol.is-lower-alpha:not([type]){list-style-type:lower-alpha}.content ol.is-lower-roman:not([type]){list-style-type:lower-roman}.content ol.is-upper-alpha:not([type]){list-style-type:upper-alpha}.content ol.is-upper-roman:not([type]){list-style-type:upper-roman}.content ul{list-style:disc outside;margin-left:2em;margin-top:1em}.content ul ul{list-style-type:circle;margin-top:0.5em}.content ul ul ul{list-style-type:square}.content dd{margin-left:2em}.content figure{margin-left:2em;margin-right:2em;text-align:center}.content figure:not(:first-child){margin-top:2em}.content figure:not(:last-child){margin-bottom:2em}.content figure img{display:inline-block}.content figure figcaption{font-style:italic}.content pre{-webkit-overflow-scrolling:touch;overflow-x:auto;padding:0;white-space:pre;word-wrap:normal}.content sup,.content sub{font-size:75%}.content table{width:100%}.content table td,.content table th{border:1px solid #dbdbdb;border-width:0 0 1px;padding:0.5em 0.75em;vertical-align:top}.content table th{color:#222}.content table th:not([align]){text-align:inherit}.content table thead td,.content table thead th{border-width:0 0 2px;color:#222}.content table tfoot td,.content table tfoot th{border-width:2px 0 0;color:#222}.content table tbody tr:last-child td,.content table tbody tr:last-child th{border-bottom-width:0}.content .tabs li+li{margin-top:0}.content.is-small,#documenter .docs-sidebar form.docs-search>input.content{font-size:.75rem}.content.is-normal{font-size:1rem}.content.is-medium{font-size:1.25rem}.content.is-large{font-size:1.5rem}.icon{align-items:center;display:inline-flex;justify-content:center;height:1.5rem;width:1.5rem}.icon.is-small,#documenter .docs-sidebar form.docs-search>input.icon{height:1rem;width:1rem}.icon.is-medium{height:2rem;width:2rem}.icon.is-large{height:3rem;width:3rem}.icon-text{align-items:flex-start;color:inherit;display:inline-flex;flex-wrap:wrap;line-height:1.5rem;vertical-align:top}.icon-text .icon{flex-grow:0;flex-shrink:0}.icon-text .icon:not(:last-child){margin-right:.25em}.icon-text .icon:not(:first-child){margin-left:.25em}div.icon-text{display:flex}.image,#documenter .docs-sidebar .docs-logo>img{display:block;position:relative}.image img,#documenter .docs-sidebar .docs-logo>img img{display:block;height:auto;width:100%}.image img.is-rounded,#documenter .docs-sidebar .docs-logo>img img.is-rounded{border-radius:9999px}.image.is-fullwidth,#documenter .docs-sidebar .docs-logo>img.is-fullwidth{width:100%}.image.is-square img,#documenter .docs-sidebar .docs-logo>img.is-square img,.image.is-square .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-square .has-ratio,.image.is-1by1 img,#documenter .docs-sidebar .docs-logo>img.is-1by1 img,.image.is-1by1 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-1by1 .has-ratio,.image.is-5by4 img,#documenter .docs-sidebar .docs-logo>img.is-5by4 img,.image.is-5by4 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-5by4 .has-ratio,.image.is-4by3 img,#documenter .docs-sidebar .docs-logo>img.is-4by3 img,.image.is-4by3 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-4by3 .has-ratio,.image.is-3by2 img,#documenter .docs-sidebar .docs-logo>img.is-3by2 img,.image.is-3by2 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-3by2 .has-ratio,.image.is-5by3 img,#documenter .docs-sidebar .docs-logo>img.is-5by3 img,.image.is-5by3 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-5by3 .has-ratio,.image.is-16by9 img,#documenter .docs-sidebar .docs-logo>img.is-16by9 img,.image.is-16by9 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-16by9 .has-ratio,.image.is-2by1 img,#documenter .docs-sidebar .docs-logo>img.is-2by1 img,.image.is-2by1 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-2by1 .has-ratio,.image.is-3by1 img,#documenter .docs-sidebar .docs-logo>img.is-3by1 img,.image.is-3by1 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-3by1 .has-ratio,.image.is-4by5 img,#documenter .docs-sidebar .docs-logo>img.is-4by5 img,.image.is-4by5 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-4by5 .has-ratio,.image.is-3by4 img,#documenter .docs-sidebar .docs-logo>img.is-3by4 img,.image.is-3by4 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-3by4 .has-ratio,.image.is-2by3 img,#documenter .docs-sidebar .docs-logo>img.is-2by3 img,.image.is-2by3 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-2by3 .has-ratio,.image.is-3by5 img,#documenter .docs-sidebar .docs-logo>img.is-3by5 img,.image.is-3by5 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-3by5 .has-ratio,.image.is-9by16 img,#documenter .docs-sidebar .docs-logo>img.is-9by16 img,.image.is-9by16 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-9by16 .has-ratio,.image.is-1by2 img,#documenter .docs-sidebar .docs-logo>img.is-1by2 img,.image.is-1by2 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-1by2 .has-ratio,.image.is-1by3 img,#documenter .docs-sidebar .docs-logo>img.is-1by3 img,.image.is-1by3 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-1by3 .has-ratio{height:100%;width:100%}.image.is-square,#documenter .docs-sidebar .docs-logo>img.is-square,.image.is-1by1,#documenter .docs-sidebar .docs-logo>img.is-1by1{padding-top:100%}.image.is-5by4,#documenter .docs-sidebar .docs-logo>img.is-5by4{padding-top:80%}.image.is-4by3,#documenter .docs-sidebar .docs-logo>img.is-4by3{padding-top:75%}.image.is-3by2,#documenter .docs-sidebar .docs-logo>img.is-3by2{padding-top:66.6666%}.image.is-5by3,#documenter .docs-sidebar .docs-logo>img.is-5by3{padding-top:60%}.image.is-16by9,#documenter .docs-sidebar .docs-logo>img.is-16by9{padding-top:56.25%}.image.is-2by1,#documenter .docs-sidebar .docs-logo>img.is-2by1{padding-top:50%}.image.is-3by1,#documenter .docs-sidebar .docs-logo>img.is-3by1{padding-top:33.3333%}.image.is-4by5,#documenter .docs-sidebar .docs-logo>img.is-4by5{padding-top:125%}.image.is-3by4,#documenter .docs-sidebar .docs-logo>img.is-3by4{padding-top:133.3333%}.image.is-2by3,#documenter .docs-sidebar .docs-logo>img.is-2by3{padding-top:150%}.image.is-3by5,#documenter .docs-sidebar .docs-logo>img.is-3by5{padding-top:166.6666%}.image.is-9by16,#documenter .docs-sidebar .docs-logo>img.is-9by16{padding-top:177.7777%}.image.is-1by2,#documenter .docs-sidebar .docs-logo>img.is-1by2{padding-top:200%}.image.is-1by3,#documenter .docs-sidebar .docs-logo>img.is-1by3{padding-top:300%}.image.is-16x16,#documenter .docs-sidebar .docs-logo>img.is-16x16{height:16px;width:16px}.image.is-24x24,#documenter .docs-sidebar .docs-logo>img.is-24x24{height:24px;width:24px}.image.is-32x32,#documenter .docs-sidebar .docs-logo>img.is-32x32{height:32px;width:32px}.image.is-48x48,#documenter .docs-sidebar .docs-logo>img.is-48x48{height:48px;width:48px}.image.is-64x64,#documenter .docs-sidebar .docs-logo>img.is-64x64{height:64px;width:64px}.image.is-96x96,#documenter .docs-sidebar .docs-logo>img.is-96x96{height:96px;width:96px}.image.is-128x128,#documenter .docs-sidebar .docs-logo>img.is-128x128{height:128px;width:128px}.notification{background-color:#f5f5f5;border-radius:4px;position:relative;padding:1.25rem 2.5rem 1.25rem 1.5rem}.notification a:not(.button):not(.dropdown-item){color:currentColor;text-decoration:underline}.notification strong{color:currentColor}.notification code,.notification pre{background:#fff}.notification pre code{background:transparent}.notification>.delete{right:.5rem;position:absolute;top:0.5rem}.notification .title,.notification .subtitle,.notification .content{color:currentColor}.notification.is-white{background-color:#fff;color:#0a0a0a}.notification.is-black{background-color:#0a0a0a;color:#fff}.notification.is-light{background-color:#f5f5f5;color:rgba(0,0,0,0.7)}.notification.is-dark,.content kbd.notification{background-color:#363636;color:#fff}.notification.is-primary,.docstring>section>a.notification.docs-sourcelink{background-color:#4eb5de;color:#fff}.notification.is-primary.is-light,.docstring>section>a.notification.is-light.docs-sourcelink{background-color:#eef8fc;color:#1a6d8e}.notification.is-link{background-color:#2e63b8;color:#fff}.notification.is-link.is-light{background-color:#eff3fb;color:#3169c4}.notification.is-info{background-color:#209cee;color:#fff}.notification.is-info.is-light{background-color:#ecf7fe;color:#0e72b4}.notification.is-success{background-color:#22c35b;color:#fff}.notification.is-success.is-light{background-color:#eefcf3;color:#198f43}.notification.is-warning{background-color:#ffdd57;color:rgba(0,0,0,0.7)}.notification.is-warning.is-light{background-color:#fffbeb;color:#947600}.notification.is-danger{background-color:#da0b00;color:#fff}.notification.is-danger.is-light{background-color:#ffeceb;color:#f50c00}.progress{-moz-appearance:none;-webkit-appearance:none;border:none;border-radius:9999px;display:block;height:1rem;overflow:hidden;padding:0;width:100%}.progress::-webkit-progress-bar{background-color:#ededed}.progress::-webkit-progress-value{background-color:#222}.progress::-moz-progress-bar{background-color:#222}.progress::-ms-fill{background-color:#222;border:none}.progress.is-white::-webkit-progress-value{background-color:#fff}.progress.is-white::-moz-progress-bar{background-color:#fff}.progress.is-white::-ms-fill{background-color:#fff}.progress.is-white:indeterminate{background-image:linear-gradient(to right, #fff 30%, #ededed 30%)}.progress.is-black::-webkit-progress-value{background-color:#0a0a0a}.progress.is-black::-moz-progress-bar{background-color:#0a0a0a}.progress.is-black::-ms-fill{background-color:#0a0a0a}.progress.is-black:indeterminate{background-image:linear-gradient(to right, #0a0a0a 30%, #ededed 30%)}.progress.is-light::-webkit-progress-value{background-color:#f5f5f5}.progress.is-light::-moz-progress-bar{background-color:#f5f5f5}.progress.is-light::-ms-fill{background-color:#f5f5f5}.progress.is-light:indeterminate{background-image:linear-gradient(to right, #f5f5f5 30%, #ededed 30%)}.progress.is-dark::-webkit-progress-value,.content kbd.progress::-webkit-progress-value{background-color:#363636}.progress.is-dark::-moz-progress-bar,.content kbd.progress::-moz-progress-bar{background-color:#363636}.progress.is-dark::-ms-fill,.content kbd.progress::-ms-fill{background-color:#363636}.progress.is-dark:indeterminate,.content kbd.progress:indeterminate{background-image:linear-gradient(to right, #363636 30%, #ededed 30%)}.progress.is-primary::-webkit-progress-value,.docstring>section>a.progress.docs-sourcelink::-webkit-progress-value{background-color:#4eb5de}.progress.is-primary::-moz-progress-bar,.docstring>section>a.progress.docs-sourcelink::-moz-progress-bar{background-color:#4eb5de}.progress.is-primary::-ms-fill,.docstring>section>a.progress.docs-sourcelink::-ms-fill{background-color:#4eb5de}.progress.is-primary:indeterminate,.docstring>section>a.progress.docs-sourcelink:indeterminate{background-image:linear-gradient(to right, #4eb5de 30%, #ededed 30%)}.progress.is-link::-webkit-progress-value{background-color:#2e63b8}.progress.is-link::-moz-progress-bar{background-color:#2e63b8}.progress.is-link::-ms-fill{background-color:#2e63b8}.progress.is-link:indeterminate{background-image:linear-gradient(to right, #2e63b8 30%, #ededed 30%)}.progress.is-info::-webkit-progress-value{background-color:#209cee}.progress.is-info::-moz-progress-bar{background-color:#209cee}.progress.is-info::-ms-fill{background-color:#209cee}.progress.is-info:indeterminate{background-image:linear-gradient(to right, #209cee 30%, #ededed 30%)}.progress.is-success::-webkit-progress-value{background-color:#22c35b}.progress.is-success::-moz-progress-bar{background-color:#22c35b}.progress.is-success::-ms-fill{background-color:#22c35b}.progress.is-success:indeterminate{background-image:linear-gradient(to right, #22c35b 30%, #ededed 30%)}.progress.is-warning::-webkit-progress-value{background-color:#ffdd57}.progress.is-warning::-moz-progress-bar{background-color:#ffdd57}.progress.is-warning::-ms-fill{background-color:#ffdd57}.progress.is-warning:indeterminate{background-image:linear-gradient(to right, #ffdd57 30%, #ededed 30%)}.progress.is-danger::-webkit-progress-value{background-color:#da0b00}.progress.is-danger::-moz-progress-bar{background-color:#da0b00}.progress.is-danger::-ms-fill{background-color:#da0b00}.progress.is-danger:indeterminate{background-image:linear-gradient(to right, #da0b00 30%, #ededed 30%)}.progress:indeterminate{animation-duration:1.5s;animation-iteration-count:infinite;animation-name:moveIndeterminate;animation-timing-function:linear;background-color:#ededed;background-image:linear-gradient(to right, #222 30%, #ededed 30%);background-position:top left;background-repeat:no-repeat;background-size:150% 150%}.progress:indeterminate::-webkit-progress-bar{background-color:transparent}.progress:indeterminate::-moz-progress-bar{background-color:transparent}.progress:indeterminate::-ms-fill{animation-name:none}.progress.is-small,#documenter .docs-sidebar form.docs-search>input.progress{height:.75rem}.progress.is-medium{height:1.25rem}.progress.is-large{height:1.5rem}@keyframes moveIndeterminate{from{background-position:200% 0}to{background-position:-200% 0}}.table{background-color:#fff;color:#222}.table td,.table th{border:1px solid #dbdbdb;border-width:0 0 1px;padding:0.5em 0.75em;vertical-align:top}.table td.is-white,.table th.is-white{background-color:#fff;border-color:#fff;color:#0a0a0a}.table td.is-black,.table th.is-black{background-color:#0a0a0a;border-color:#0a0a0a;color:#fff}.table td.is-light,.table th.is-light{background-color:#f5f5f5;border-color:#f5f5f5;color:rgba(0,0,0,0.7)}.table td.is-dark,.table th.is-dark{background-color:#363636;border-color:#363636;color:#fff}.table td.is-primary,.table th.is-primary{background-color:#4eb5de;border-color:#4eb5de;color:#fff}.table td.is-link,.table th.is-link{background-color:#2e63b8;border-color:#2e63b8;color:#fff}.table td.is-info,.table th.is-info{background-color:#209cee;border-color:#209cee;color:#fff}.table td.is-success,.table th.is-success{background-color:#22c35b;border-color:#22c35b;color:#fff}.table td.is-warning,.table th.is-warning{background-color:#ffdd57;border-color:#ffdd57;color:rgba(0,0,0,0.7)}.table td.is-danger,.table th.is-danger{background-color:#da0b00;border-color:#da0b00;color:#fff}.table td.is-narrow,.table th.is-narrow{white-space:nowrap;width:1%}.table td.is-selected,.table th.is-selected{background-color:#4eb5de;color:#fff}.table td.is-selected a,.table td.is-selected strong,.table th.is-selected a,.table th.is-selected strong{color:currentColor}.table td.is-vcentered,.table th.is-vcentered{vertical-align:middle}.table th{color:#222}.table th:not([align]){text-align:left}.table tr.is-selected{background-color:#4eb5de;color:#fff}.table tr.is-selected a,.table tr.is-selected strong{color:currentColor}.table tr.is-selected td,.table tr.is-selected th{border-color:#fff;color:currentColor}.table thead{background-color:rgba(0,0,0,0)}.table thead td,.table thead th{border-width:0 0 2px;color:#222}.table tfoot{background-color:rgba(0,0,0,0)}.table tfoot td,.table tfoot th{border-width:2px 0 0;color:#222}.table tbody{background-color:rgba(0,0,0,0)}.table tbody tr:last-child td,.table tbody tr:last-child th{border-bottom-width:0}.table.is-bordered td,.table.is-bordered th{border-width:1px}.table.is-bordered tr:last-child td,.table.is-bordered tr:last-child th{border-bottom-width:1px}.table.is-fullwidth{width:100%}.table.is-hoverable tbody tr:not(.is-selected):hover{background-color:#fafafa}.table.is-hoverable.is-striped tbody tr:not(.is-selected):hover{background-color:#fafafa}.table.is-hoverable.is-striped tbody tr:not(.is-selected):hover:nth-child(even){background-color:#f5f5f5}.table.is-narrow td,.table.is-narrow th{padding:0.25em 0.5em}.table.is-striped tbody tr:not(.is-selected):nth-child(even){background-color:#fafafa}.table-container{-webkit-overflow-scrolling:touch;overflow:auto;overflow-y:hidden;max-width:100%}.tags{align-items:center;display:flex;flex-wrap:wrap;justify-content:flex-start}.tags .tag,.tags .content kbd,.content .tags kbd,.tags .docstring>section>a.docs-sourcelink{margin-bottom:0.5rem}.tags .tag:not(:last-child),.tags .content kbd:not(:last-child),.content .tags kbd:not(:last-child),.tags .docstring>section>a.docs-sourcelink:not(:last-child){margin-right:.5rem}.tags:last-child{margin-bottom:-0.5rem}.tags:not(:last-child){margin-bottom:1rem}.tags.are-medium .tag:not(.is-normal):not(.is-large),.tags.are-medium .content kbd:not(.is-normal):not(.is-large),.content .tags.are-medium kbd:not(.is-normal):not(.is-large),.tags.are-medium .docstring>section>a.docs-sourcelink:not(.is-normal):not(.is-large){font-size:1rem}.tags.are-large .tag:not(.is-normal):not(.is-medium),.tags.are-large .content kbd:not(.is-normal):not(.is-medium),.content .tags.are-large kbd:not(.is-normal):not(.is-medium),.tags.are-large .docstring>section>a.docs-sourcelink:not(.is-normal):not(.is-medium){font-size:1.25rem}.tags.is-centered{justify-content:center}.tags.is-centered .tag,.tags.is-centered .content kbd,.content .tags.is-centered kbd,.tags.is-centered .docstring>section>a.docs-sourcelink{margin-right:0.25rem;margin-left:0.25rem}.tags.is-right{justify-content:flex-end}.tags.is-right .tag:not(:first-child),.tags.is-right .content kbd:not(:first-child),.content .tags.is-right kbd:not(:first-child),.tags.is-right .docstring>section>a.docs-sourcelink:not(:first-child){margin-left:0.5rem}.tags.is-right .tag:not(:last-child),.tags.is-right .content kbd:not(:last-child),.content .tags.is-right kbd:not(:last-child),.tags.is-right .docstring>section>a.docs-sourcelink:not(:last-child){margin-right:0}.tags.has-addons .tag,.tags.has-addons .content kbd,.content .tags.has-addons kbd,.tags.has-addons .docstring>section>a.docs-sourcelink{margin-right:0}.tags.has-addons .tag:not(:first-child),.tags.has-addons .content kbd:not(:first-child),.content .tags.has-addons kbd:not(:first-child),.tags.has-addons .docstring>section>a.docs-sourcelink:not(:first-child){margin-left:0;border-top-left-radius:0;border-bottom-left-radius:0}.tags.has-addons .tag:not(:last-child),.tags.has-addons .content kbd:not(:last-child),.content .tags.has-addons kbd:not(:last-child),.tags.has-addons .docstring>section>a.docs-sourcelink:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.tag:not(body),.content kbd:not(body),.docstring>section>a.docs-sourcelink:not(body){align-items:center;background-color:#f5f5f5;border-radius:4px;color:#222;display:inline-flex;font-size:.75rem;height:2em;justify-content:center;line-height:1.5;padding-left:0.75em;padding-right:0.75em;white-space:nowrap}.tag:not(body) .delete,.content kbd:not(body) .delete,.docstring>section>a.docs-sourcelink:not(body) .delete{margin-left:.25rem;margin-right:-.375rem}.tag.is-white:not(body),.content kbd.is-white:not(body),.docstring>section>a.docs-sourcelink.is-white:not(body){background-color:#fff;color:#0a0a0a}.tag.is-black:not(body),.content kbd.is-black:not(body),.docstring>section>a.docs-sourcelink.is-black:not(body){background-color:#0a0a0a;color:#fff}.tag.is-light:not(body),.content kbd.is-light:not(body),.docstring>section>a.docs-sourcelink.is-light:not(body){background-color:#f5f5f5;color:rgba(0,0,0,0.7)}.tag.is-dark:not(body),.content kbd:not(body),.docstring>section>a.docs-sourcelink.is-dark:not(body),.content .docstring>section>kbd:not(body){background-color:#363636;color:#fff}.tag.is-primary:not(body),.content kbd.is-primary:not(body),.docstring>section>a.docs-sourcelink:not(body){background-color:#4eb5de;color:#fff}.tag.is-primary.is-light:not(body),.content kbd.is-primary.is-light:not(body),.docstring>section>a.docs-sourcelink.is-light:not(body){background-color:#eef8fc;color:#1a6d8e}.tag.is-link:not(body),.content kbd.is-link:not(body),.docstring>section>a.docs-sourcelink.is-link:not(body){background-color:#2e63b8;color:#fff}.tag.is-link.is-light:not(body),.content kbd.is-link.is-light:not(body),.docstring>section>a.docs-sourcelink.is-link.is-light:not(body){background-color:#eff3fb;color:#3169c4}.tag.is-info:not(body),.content kbd.is-info:not(body),.docstring>section>a.docs-sourcelink.is-info:not(body){background-color:#209cee;color:#fff}.tag.is-info.is-light:not(body),.content kbd.is-info.is-light:not(body),.docstring>section>a.docs-sourcelink.is-info.is-light:not(body){background-color:#ecf7fe;color:#0e72b4}.tag.is-success:not(body),.content kbd.is-success:not(body),.docstring>section>a.docs-sourcelink.is-success:not(body){background-color:#22c35b;color:#fff}.tag.is-success.is-light:not(body),.content kbd.is-success.is-light:not(body),.docstring>section>a.docs-sourcelink.is-success.is-light:not(body){background-color:#eefcf3;color:#198f43}.tag.is-warning:not(body),.content kbd.is-warning:not(body),.docstring>section>a.docs-sourcelink.is-warning:not(body){background-color:#ffdd57;color:rgba(0,0,0,0.7)}.tag.is-warning.is-light:not(body),.content kbd.is-warning.is-light:not(body),.docstring>section>a.docs-sourcelink.is-warning.is-light:not(body){background-color:#fffbeb;color:#947600}.tag.is-danger:not(body),.content kbd.is-danger:not(body),.docstring>section>a.docs-sourcelink.is-danger:not(body){background-color:#da0b00;color:#fff}.tag.is-danger.is-light:not(body),.content kbd.is-danger.is-light:not(body),.docstring>section>a.docs-sourcelink.is-danger.is-light:not(body){background-color:#ffeceb;color:#f50c00}.tag.is-normal:not(body),.content kbd.is-normal:not(body),.docstring>section>a.docs-sourcelink.is-normal:not(body){font-size:.75rem}.tag.is-medium:not(body),.content kbd.is-medium:not(body),.docstring>section>a.docs-sourcelink.is-medium:not(body){font-size:1rem}.tag.is-large:not(body),.content kbd.is-large:not(body),.docstring>section>a.docs-sourcelink.is-large:not(body){font-size:1.25rem}.tag:not(body) .icon:first-child:not(:last-child),.content kbd:not(body) .icon:first-child:not(:last-child),.docstring>section>a.docs-sourcelink:not(body) .icon:first-child:not(:last-child){margin-left:-.375em;margin-right:.1875em}.tag:not(body) .icon:last-child:not(:first-child),.content kbd:not(body) .icon:last-child:not(:first-child),.docstring>section>a.docs-sourcelink:not(body) .icon:last-child:not(:first-child){margin-left:.1875em;margin-right:-.375em}.tag:not(body) .icon:first-child:last-child,.content kbd:not(body) .icon:first-child:last-child,.docstring>section>a.docs-sourcelink:not(body) .icon:first-child:last-child{margin-left:-.375em;margin-right:-.375em}.tag.is-delete:not(body),.content kbd.is-delete:not(body),.docstring>section>a.docs-sourcelink.is-delete:not(body){margin-left:1px;padding:0;position:relative;width:2em}.tag.is-delete:not(body)::before,.content kbd.is-delete:not(body)::before,.docstring>section>a.docs-sourcelink.is-delete:not(body)::before,.tag.is-delete:not(body)::after,.content kbd.is-delete:not(body)::after,.docstring>section>a.docs-sourcelink.is-delete:not(body)::after{background-color:currentColor;content:"";display:block;left:50%;position:absolute;top:50%;transform:translateX(-50%) translateY(-50%) rotate(45deg);transform-origin:center center}.tag.is-delete:not(body)::before,.content kbd.is-delete:not(body)::before,.docstring>section>a.docs-sourcelink.is-delete:not(body)::before{height:1px;width:50%}.tag.is-delete:not(body)::after,.content kbd.is-delete:not(body)::after,.docstring>section>a.docs-sourcelink.is-delete:not(body)::after{height:50%;width:1px}.tag.is-delete:not(body):hover,.content kbd.is-delete:not(body):hover,.docstring>section>a.docs-sourcelink.is-delete:not(body):hover,.tag.is-delete:not(body):focus,.content kbd.is-delete:not(body):focus,.docstring>section>a.docs-sourcelink.is-delete:not(body):focus{background-color:#e8e8e8}.tag.is-delete:not(body):active,.content kbd.is-delete:not(body):active,.docstring>section>a.docs-sourcelink.is-delete:not(body):active{background-color:#dbdbdb}.tag.is-rounded:not(body),#documenter .docs-sidebar form.docs-search>input:not(body),.content kbd.is-rounded:not(body),#documenter .docs-sidebar .content form.docs-search>input:not(body),.docstring>section>a.docs-sourcelink.is-rounded:not(body){border-radius:9999px}a.tag:hover,.docstring>section>a.docs-sourcelink:hover{text-decoration:underline}.title,.subtitle{word-break:break-word}.title em,.title span,.subtitle em,.subtitle span{font-weight:inherit}.title sub,.subtitle sub{font-size:.75em}.title sup,.subtitle sup{font-size:.75em}.title .tag,.title .content kbd,.content .title kbd,.title .docstring>section>a.docs-sourcelink,.subtitle .tag,.subtitle .content kbd,.content .subtitle kbd,.subtitle .docstring>section>a.docs-sourcelink{vertical-align:middle}.title{color:#222;font-size:2rem;font-weight:600;line-height:1.125}.title strong{color:inherit;font-weight:inherit}.title:not(.is-spaced)+.subtitle{margin-top:-1.25rem}.title.is-1{font-size:3rem}.title.is-2{font-size:2.5rem}.title.is-3{font-size:2rem}.title.is-4{font-size:1.5rem}.title.is-5{font-size:1.25rem}.title.is-6{font-size:1rem}.title.is-7{font-size:.75rem}.subtitle{color:#222;font-size:1.25rem;font-weight:400;line-height:1.25}.subtitle strong{color:#222;font-weight:600}.subtitle:not(.is-spaced)+.title{margin-top:-1.25rem}.subtitle.is-1{font-size:3rem}.subtitle.is-2{font-size:2.5rem}.subtitle.is-3{font-size:2rem}.subtitle.is-4{font-size:1.5rem}.subtitle.is-5{font-size:1.25rem}.subtitle.is-6{font-size:1rem}.subtitle.is-7{font-size:.75rem}.heading{display:block;font-size:11px;letter-spacing:1px;margin-bottom:5px;text-transform:uppercase}.number{align-items:center;background-color:#f5f5f5;border-radius:9999px;display:inline-flex;font-size:1.25rem;height:2em;justify-content:center;margin-right:1.5rem;min-width:2.5em;padding:0.25rem 0.5rem;text-align:center;vertical-align:top}.select select,.textarea,.input,#documenter .docs-sidebar form.docs-search>input{background-color:#fff;border-color:#dbdbdb;border-radius:4px;color:#222}.select select::-moz-placeholder,.textarea::-moz-placeholder,.input::-moz-placeholder,#documenter .docs-sidebar form.docs-search>input::-moz-placeholder{color:#707070}.select select::-webkit-input-placeholder,.textarea::-webkit-input-placeholder,.input::-webkit-input-placeholder,#documenter .docs-sidebar form.docs-search>input::-webkit-input-placeholder{color:#707070}.select select:-moz-placeholder,.textarea:-moz-placeholder,.input:-moz-placeholder,#documenter .docs-sidebar form.docs-search>input:-moz-placeholder{color:#707070}.select select:-ms-input-placeholder,.textarea:-ms-input-placeholder,.input:-ms-input-placeholder,#documenter .docs-sidebar form.docs-search>input:-ms-input-placeholder{color:#707070}.select select:hover,.textarea:hover,.input:hover,#documenter .docs-sidebar form.docs-search>input:hover,.select select.is-hovered,.is-hovered.textarea,.is-hovered.input,#documenter .docs-sidebar form.docs-search>input.is-hovered{border-color:#b5b5b5}.select select:focus,.textarea:focus,.input:focus,#documenter .docs-sidebar form.docs-search>input:focus,.select select.is-focused,.is-focused.textarea,.is-focused.input,#documenter .docs-sidebar form.docs-search>input.is-focused,.select select:active,.textarea:active,.input:active,#documenter .docs-sidebar form.docs-search>input:active,.select select.is-active,.is-active.textarea,.is-active.input,#documenter .docs-sidebar form.docs-search>input.is-active{border-color:#2e63b8;box-shadow:0 0 0 0.125em rgba(46,99,184,0.25)}.select select[disabled],.textarea[disabled],.input[disabled],#documenter .docs-sidebar form.docs-search>input[disabled],fieldset[disabled] .select select,.select fieldset[disabled] select,fieldset[disabled] .textarea,fieldset[disabled] .input,fieldset[disabled] #documenter .docs-sidebar form.docs-search>input,#documenter .docs-sidebar fieldset[disabled] form.docs-search>input{background-color:#f5f5f5;border-color:#f5f5f5;box-shadow:none;color:#6b6b6b}.select select[disabled]::-moz-placeholder,.textarea[disabled]::-moz-placeholder,.input[disabled]::-moz-placeholder,#documenter .docs-sidebar form.docs-search>input[disabled]::-moz-placeholder,fieldset[disabled] .select select::-moz-placeholder,.select fieldset[disabled] select::-moz-placeholder,fieldset[disabled] .textarea::-moz-placeholder,fieldset[disabled] .input::-moz-placeholder,fieldset[disabled] #documenter .docs-sidebar form.docs-search>input::-moz-placeholder,#documenter .docs-sidebar fieldset[disabled] form.docs-search>input::-moz-placeholder{color:rgba(107,107,107,0.3)}.select select[disabled]::-webkit-input-placeholder,.textarea[disabled]::-webkit-input-placeholder,.input[disabled]::-webkit-input-placeholder,#documenter .docs-sidebar form.docs-search>input[disabled]::-webkit-input-placeholder,fieldset[disabled] .select select::-webkit-input-placeholder,.select fieldset[disabled] select::-webkit-input-placeholder,fieldset[disabled] .textarea::-webkit-input-placeholder,fieldset[disabled] .input::-webkit-input-placeholder,fieldset[disabled] #documenter .docs-sidebar form.docs-search>input::-webkit-input-placeholder,#documenter .docs-sidebar fieldset[disabled] form.docs-search>input::-webkit-input-placeholder{color:rgba(107,107,107,0.3)}.select select[disabled]:-moz-placeholder,.textarea[disabled]:-moz-placeholder,.input[disabled]:-moz-placeholder,#documenter .docs-sidebar form.docs-search>input[disabled]:-moz-placeholder,fieldset[disabled] .select select:-moz-placeholder,.select fieldset[disabled] select:-moz-placeholder,fieldset[disabled] .textarea:-moz-placeholder,fieldset[disabled] .input:-moz-placeholder,fieldset[disabled] #documenter .docs-sidebar form.docs-search>input:-moz-placeholder,#documenter .docs-sidebar fieldset[disabled] form.docs-search>input:-moz-placeholder{color:rgba(107,107,107,0.3)}.select select[disabled]:-ms-input-placeholder,.textarea[disabled]:-ms-input-placeholder,.input[disabled]:-ms-input-placeholder,#documenter .docs-sidebar form.docs-search>input[disabled]:-ms-input-placeholder,fieldset[disabled] .select select:-ms-input-placeholder,.select fieldset[disabled] select:-ms-input-placeholder,fieldset[disabled] .textarea:-ms-input-placeholder,fieldset[disabled] .input:-ms-input-placeholder,fieldset[disabled] #documenter .docs-sidebar form.docs-search>input:-ms-input-placeholder,#documenter .docs-sidebar fieldset[disabled] form.docs-search>input:-ms-input-placeholder{color:rgba(107,107,107,0.3)}.textarea,.input,#documenter .docs-sidebar form.docs-search>input{box-shadow:inset 0 0.0625em 0.125em rgba(10,10,10,0.05);max-width:100%;width:100%}.textarea[readonly],.input[readonly],#documenter .docs-sidebar form.docs-search>input[readonly]{box-shadow:none}.is-white.textarea,.is-white.input,#documenter .docs-sidebar form.docs-search>input.is-white{border-color:#fff}.is-white.textarea:focus,.is-white.input:focus,#documenter .docs-sidebar form.docs-search>input.is-white:focus,.is-white.is-focused.textarea,.is-white.is-focused.input,#documenter .docs-sidebar form.docs-search>input.is-focused,.is-white.textarea:active,.is-white.input:active,#documenter .docs-sidebar form.docs-search>input.is-white:active,.is-white.is-active.textarea,.is-white.is-active.input,#documenter .docs-sidebar form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(255,255,255,0.25)}.is-black.textarea,.is-black.input,#documenter .docs-sidebar form.docs-search>input.is-black{border-color:#0a0a0a}.is-black.textarea:focus,.is-black.input:focus,#documenter .docs-sidebar form.docs-search>input.is-black:focus,.is-black.is-focused.textarea,.is-black.is-focused.input,#documenter .docs-sidebar form.docs-search>input.is-focused,.is-black.textarea:active,.is-black.input:active,#documenter .docs-sidebar form.docs-search>input.is-black:active,.is-black.is-active.textarea,.is-black.is-active.input,#documenter .docs-sidebar form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(10,10,10,0.25)}.is-light.textarea,.is-light.input,#documenter .docs-sidebar form.docs-search>input.is-light{border-color:#f5f5f5}.is-light.textarea:focus,.is-light.input:focus,#documenter .docs-sidebar form.docs-search>input.is-light:focus,.is-light.is-focused.textarea,.is-light.is-focused.input,#documenter .docs-sidebar form.docs-search>input.is-focused,.is-light.textarea:active,.is-light.input:active,#documenter .docs-sidebar form.docs-search>input.is-light:active,.is-light.is-active.textarea,.is-light.is-active.input,#documenter .docs-sidebar form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(245,245,245,0.25)}.is-dark.textarea,.content kbd.textarea,.is-dark.input,#documenter .docs-sidebar form.docs-search>input.is-dark,.content kbd.input{border-color:#363636}.is-dark.textarea:focus,.content kbd.textarea:focus,.is-dark.input:focus,#documenter .docs-sidebar form.docs-search>input.is-dark:focus,.content kbd.input:focus,.is-dark.is-focused.textarea,.content kbd.is-focused.textarea,.is-dark.is-focused.input,#documenter .docs-sidebar form.docs-search>input.is-focused,.content kbd.is-focused.input,#documenter .docs-sidebar .content form.docs-search>input.is-focused,.is-dark.textarea:active,.content kbd.textarea:active,.is-dark.input:active,#documenter .docs-sidebar form.docs-search>input.is-dark:active,.content kbd.input:active,.is-dark.is-active.textarea,.content kbd.is-active.textarea,.is-dark.is-active.input,#documenter .docs-sidebar form.docs-search>input.is-active,.content kbd.is-active.input,#documenter .docs-sidebar .content form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(54,54,54,0.25)}.is-primary.textarea,.docstring>section>a.textarea.docs-sourcelink,.is-primary.input,#documenter .docs-sidebar form.docs-search>input.is-primary,.docstring>section>a.input.docs-sourcelink{border-color:#4eb5de}.is-primary.textarea:focus,.docstring>section>a.textarea.docs-sourcelink:focus,.is-primary.input:focus,#documenter .docs-sidebar form.docs-search>input.is-primary:focus,.docstring>section>a.input.docs-sourcelink:focus,.is-primary.is-focused.textarea,.docstring>section>a.is-focused.textarea.docs-sourcelink,.is-primary.is-focused.input,#documenter .docs-sidebar form.docs-search>input.is-focused,.docstring>section>a.is-focused.input.docs-sourcelink,.is-primary.textarea:active,.docstring>section>a.textarea.docs-sourcelink:active,.is-primary.input:active,#documenter .docs-sidebar form.docs-search>input.is-primary:active,.docstring>section>a.input.docs-sourcelink:active,.is-primary.is-active.textarea,.docstring>section>a.is-active.textarea.docs-sourcelink,.is-primary.is-active.input,#documenter .docs-sidebar form.docs-search>input.is-active,.docstring>section>a.is-active.input.docs-sourcelink{box-shadow:0 0 0 0.125em rgba(78,181,222,0.25)}.is-link.textarea,.is-link.input,#documenter .docs-sidebar form.docs-search>input.is-link{border-color:#2e63b8}.is-link.textarea:focus,.is-link.input:focus,#documenter .docs-sidebar form.docs-search>input.is-link:focus,.is-link.is-focused.textarea,.is-link.is-focused.input,#documenter .docs-sidebar form.docs-search>input.is-focused,.is-link.textarea:active,.is-link.input:active,#documenter .docs-sidebar form.docs-search>input.is-link:active,.is-link.is-active.textarea,.is-link.is-active.input,#documenter .docs-sidebar form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(46,99,184,0.25)}.is-info.textarea,.is-info.input,#documenter .docs-sidebar form.docs-search>input.is-info{border-color:#209cee}.is-info.textarea:focus,.is-info.input:focus,#documenter .docs-sidebar form.docs-search>input.is-info:focus,.is-info.is-focused.textarea,.is-info.is-focused.input,#documenter .docs-sidebar form.docs-search>input.is-focused,.is-info.textarea:active,.is-info.input:active,#documenter .docs-sidebar form.docs-search>input.is-info:active,.is-info.is-active.textarea,.is-info.is-active.input,#documenter .docs-sidebar form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(32,156,238,0.25)}.is-success.textarea,.is-success.input,#documenter .docs-sidebar form.docs-search>input.is-success{border-color:#22c35b}.is-success.textarea:focus,.is-success.input:focus,#documenter .docs-sidebar form.docs-search>input.is-success:focus,.is-success.is-focused.textarea,.is-success.is-focused.input,#documenter .docs-sidebar form.docs-search>input.is-focused,.is-success.textarea:active,.is-success.input:active,#documenter .docs-sidebar form.docs-search>input.is-success:active,.is-success.is-active.textarea,.is-success.is-active.input,#documenter .docs-sidebar form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(34,195,91,0.25)}.is-warning.textarea,.is-warning.input,#documenter .docs-sidebar form.docs-search>input.is-warning{border-color:#ffdd57}.is-warning.textarea:focus,.is-warning.input:focus,#documenter .docs-sidebar form.docs-search>input.is-warning:focus,.is-warning.is-focused.textarea,.is-warning.is-focused.input,#documenter .docs-sidebar form.docs-search>input.is-focused,.is-warning.textarea:active,.is-warning.input:active,#documenter .docs-sidebar form.docs-search>input.is-warning:active,.is-warning.is-active.textarea,.is-warning.is-active.input,#documenter .docs-sidebar form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(255,221,87,0.25)}.is-danger.textarea,.is-danger.input,#documenter .docs-sidebar form.docs-search>input.is-danger{border-color:#da0b00}.is-danger.textarea:focus,.is-danger.input:focus,#documenter .docs-sidebar form.docs-search>input.is-danger:focus,.is-danger.is-focused.textarea,.is-danger.is-focused.input,#documenter .docs-sidebar form.docs-search>input.is-focused,.is-danger.textarea:active,.is-danger.input:active,#documenter .docs-sidebar form.docs-search>input.is-danger:active,.is-danger.is-active.textarea,.is-danger.is-active.input,#documenter .docs-sidebar form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(218,11,0,0.25)}.is-small.textarea,.is-small.input,#documenter .docs-sidebar form.docs-search>input{border-radius:2px;font-size:.75rem}.is-medium.textarea,.is-medium.input,#documenter .docs-sidebar form.docs-search>input.is-medium{font-size:1.25rem}.is-large.textarea,.is-large.input,#documenter .docs-sidebar form.docs-search>input.is-large{font-size:1.5rem}.is-fullwidth.textarea,.is-fullwidth.input,#documenter .docs-sidebar form.docs-search>input.is-fullwidth{display:block;width:100%}.is-inline.textarea,.is-inline.input,#documenter .docs-sidebar form.docs-search>input.is-inline{display:inline;width:auto}.input.is-rounded,#documenter .docs-sidebar form.docs-search>input{border-radius:9999px;padding-left:calc(calc(0.75em - 1px) + 0.375em);padding-right:calc(calc(0.75em - 1px) + 0.375em)}.input.is-static,#documenter .docs-sidebar form.docs-search>input.is-static{background-color:transparent;border-color:transparent;box-shadow:none;padding-left:0;padding-right:0}.textarea{display:block;max-width:100%;min-width:100%;padding:calc(0.75em - 1px);resize:vertical}.textarea:not([rows]){max-height:40em;min-height:8em}.textarea[rows]{height:initial}.textarea.has-fixed-size{resize:none}.radio,.checkbox{cursor:pointer;display:inline-block;line-height:1.25;position:relative}.radio input,.checkbox input{cursor:pointer}.radio:hover,.checkbox:hover{color:#222}.radio[disabled],.checkbox[disabled],fieldset[disabled] .radio,fieldset[disabled] .checkbox,.radio input[disabled],.checkbox input[disabled]{color:#6b6b6b;cursor:not-allowed}.radio+.radio{margin-left:.5em}.select{display:inline-block;max-width:100%;position:relative;vertical-align:top}.select:not(.is-multiple){height:2.5em}.select:not(.is-multiple):not(.is-loading)::after{border-color:#2e63b8;right:1.125em;z-index:4}.select.is-rounded select,#documenter .docs-sidebar form.docs-search>input.select select{border-radius:9999px;padding-left:1em}.select select{cursor:pointer;display:block;font-size:1em;max-width:100%;outline:none}.select select::-ms-expand{display:none}.select select[disabled]:hover,fieldset[disabled] .select select:hover{border-color:#f5f5f5}.select select:not([multiple]){padding-right:2.5em}.select select[multiple]{height:auto;padding:0}.select select[multiple] option{padding:0.5em 1em}.select:not(.is-multiple):not(.is-loading):hover::after{border-color:#222}.select.is-white:not(:hover)::after{border-color:#fff}.select.is-white select{border-color:#fff}.select.is-white select:hover,.select.is-white select.is-hovered{border-color:#f2f2f2}.select.is-white select:focus,.select.is-white select.is-focused,.select.is-white select:active,.select.is-white select.is-active{box-shadow:0 0 0 0.125em rgba(255,255,255,0.25)}.select.is-black:not(:hover)::after{border-color:#0a0a0a}.select.is-black select{border-color:#0a0a0a}.select.is-black select:hover,.select.is-black select.is-hovered{border-color:#000}.select.is-black select:focus,.select.is-black select.is-focused,.select.is-black select:active,.select.is-black select.is-active{box-shadow:0 0 0 0.125em rgba(10,10,10,0.25)}.select.is-light:not(:hover)::after{border-color:#f5f5f5}.select.is-light select{border-color:#f5f5f5}.select.is-light select:hover,.select.is-light select.is-hovered{border-color:#e8e8e8}.select.is-light select:focus,.select.is-light select.is-focused,.select.is-light select:active,.select.is-light select.is-active{box-shadow:0 0 0 0.125em rgba(245,245,245,0.25)}.select.is-dark:not(:hover)::after,.content kbd.select:not(:hover)::after{border-color:#363636}.select.is-dark select,.content kbd.select select{border-color:#363636}.select.is-dark select:hover,.content kbd.select select:hover,.select.is-dark select.is-hovered,.content kbd.select select.is-hovered{border-color:#292929}.select.is-dark select:focus,.content kbd.select select:focus,.select.is-dark select.is-focused,.content kbd.select select.is-focused,.select.is-dark select:active,.content kbd.select select:active,.select.is-dark select.is-active,.content kbd.select select.is-active{box-shadow:0 0 0 0.125em rgba(54,54,54,0.25)}.select.is-primary:not(:hover)::after,.docstring>section>a.select.docs-sourcelink:not(:hover)::after{border-color:#4eb5de}.select.is-primary select,.docstring>section>a.select.docs-sourcelink select{border-color:#4eb5de}.select.is-primary select:hover,.docstring>section>a.select.docs-sourcelink select:hover,.select.is-primary select.is-hovered,.docstring>section>a.select.docs-sourcelink select.is-hovered{border-color:#39acda}.select.is-primary select:focus,.docstring>section>a.select.docs-sourcelink select:focus,.select.is-primary select.is-focused,.docstring>section>a.select.docs-sourcelink select.is-focused,.select.is-primary select:active,.docstring>section>a.select.docs-sourcelink select:active,.select.is-primary select.is-active,.docstring>section>a.select.docs-sourcelink select.is-active{box-shadow:0 0 0 0.125em rgba(78,181,222,0.25)}.select.is-link:not(:hover)::after{border-color:#2e63b8}.select.is-link select{border-color:#2e63b8}.select.is-link select:hover,.select.is-link select.is-hovered{border-color:#2958a4}.select.is-link select:focus,.select.is-link select.is-focused,.select.is-link select:active,.select.is-link select.is-active{box-shadow:0 0 0 0.125em rgba(46,99,184,0.25)}.select.is-info:not(:hover)::after{border-color:#209cee}.select.is-info select{border-color:#209cee}.select.is-info select:hover,.select.is-info select.is-hovered{border-color:#1190e3}.select.is-info select:focus,.select.is-info select.is-focused,.select.is-info select:active,.select.is-info select.is-active{box-shadow:0 0 0 0.125em rgba(32,156,238,0.25)}.select.is-success:not(:hover)::after{border-color:#22c35b}.select.is-success select{border-color:#22c35b}.select.is-success select:hover,.select.is-success select.is-hovered{border-color:#1ead51}.select.is-success select:focus,.select.is-success select.is-focused,.select.is-success select:active,.select.is-success select.is-active{box-shadow:0 0 0 0.125em rgba(34,195,91,0.25)}.select.is-warning:not(:hover)::after{border-color:#ffdd57}.select.is-warning select{border-color:#ffdd57}.select.is-warning select:hover,.select.is-warning select.is-hovered{border-color:#ffd83e}.select.is-warning select:focus,.select.is-warning select.is-focused,.select.is-warning select:active,.select.is-warning select.is-active{box-shadow:0 0 0 0.125em rgba(255,221,87,0.25)}.select.is-danger:not(:hover)::after{border-color:#da0b00}.select.is-danger select{border-color:#da0b00}.select.is-danger select:hover,.select.is-danger select.is-hovered{border-color:#c10a00}.select.is-danger select:focus,.select.is-danger select.is-focused,.select.is-danger select:active,.select.is-danger select.is-active{box-shadow:0 0 0 0.125em rgba(218,11,0,0.25)}.select.is-small,#documenter .docs-sidebar form.docs-search>input.select{border-radius:2px;font-size:.75rem}.select.is-medium{font-size:1.25rem}.select.is-large{font-size:1.5rem}.select.is-disabled::after{border-color:#6b6b6b !important;opacity:0.5}.select.is-fullwidth{width:100%}.select.is-fullwidth select{width:100%}.select.is-loading::after{margin-top:0;position:absolute;right:.625em;top:0.625em;transform:none}.select.is-loading.is-small:after,#documenter .docs-sidebar form.docs-search>input.is-loading:after{font-size:.75rem}.select.is-loading.is-medium:after{font-size:1.25rem}.select.is-loading.is-large:after{font-size:1.5rem}.file{align-items:stretch;display:flex;justify-content:flex-start;position:relative}.file.is-white .file-cta{background-color:#fff;border-color:transparent;color:#0a0a0a}.file.is-white:hover .file-cta,.file.is-white.is-hovered .file-cta{background-color:#f9f9f9;border-color:transparent;color:#0a0a0a}.file.is-white:focus .file-cta,.file.is-white.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(255,255,255,0.25);color:#0a0a0a}.file.is-white:active .file-cta,.file.is-white.is-active .file-cta{background-color:#f2f2f2;border-color:transparent;color:#0a0a0a}.file.is-black .file-cta{background-color:#0a0a0a;border-color:transparent;color:#fff}.file.is-black:hover .file-cta,.file.is-black.is-hovered .file-cta{background-color:#040404;border-color:transparent;color:#fff}.file.is-black:focus .file-cta,.file.is-black.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(10,10,10,0.25);color:#fff}.file.is-black:active .file-cta,.file.is-black.is-active .file-cta{background-color:#000;border-color:transparent;color:#fff}.file.is-light .file-cta{background-color:#f5f5f5;border-color:transparent;color:rgba(0,0,0,0.7)}.file.is-light:hover .file-cta,.file.is-light.is-hovered .file-cta{background-color:#eee;border-color:transparent;color:rgba(0,0,0,0.7)}.file.is-light:focus .file-cta,.file.is-light.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(245,245,245,0.25);color:rgba(0,0,0,0.7)}.file.is-light:active .file-cta,.file.is-light.is-active .file-cta{background-color:#e8e8e8;border-color:transparent;color:rgba(0,0,0,0.7)}.file.is-dark .file-cta,.content kbd.file .file-cta{background-color:#363636;border-color:transparent;color:#fff}.file.is-dark:hover .file-cta,.content kbd.file:hover .file-cta,.file.is-dark.is-hovered .file-cta,.content kbd.file.is-hovered .file-cta{background-color:#2f2f2f;border-color:transparent;color:#fff}.file.is-dark:focus .file-cta,.content kbd.file:focus .file-cta,.file.is-dark.is-focused .file-cta,.content kbd.file.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(54,54,54,0.25);color:#fff}.file.is-dark:active .file-cta,.content kbd.file:active .file-cta,.file.is-dark.is-active .file-cta,.content kbd.file.is-active .file-cta{background-color:#292929;border-color:transparent;color:#fff}.file.is-primary .file-cta,.docstring>section>a.file.docs-sourcelink .file-cta{background-color:#4eb5de;border-color:transparent;color:#fff}.file.is-primary:hover .file-cta,.docstring>section>a.file.docs-sourcelink:hover .file-cta,.file.is-primary.is-hovered .file-cta,.docstring>section>a.file.is-hovered.docs-sourcelink .file-cta{background-color:#43b1dc;border-color:transparent;color:#fff}.file.is-primary:focus .file-cta,.docstring>section>a.file.docs-sourcelink:focus .file-cta,.file.is-primary.is-focused .file-cta,.docstring>section>a.file.is-focused.docs-sourcelink .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(78,181,222,0.25);color:#fff}.file.is-primary:active .file-cta,.docstring>section>a.file.docs-sourcelink:active .file-cta,.file.is-primary.is-active .file-cta,.docstring>section>a.file.is-active.docs-sourcelink .file-cta{background-color:#39acda;border-color:transparent;color:#fff}.file.is-link .file-cta{background-color:#2e63b8;border-color:transparent;color:#fff}.file.is-link:hover .file-cta,.file.is-link.is-hovered .file-cta{background-color:#2b5eae;border-color:transparent;color:#fff}.file.is-link:focus .file-cta,.file.is-link.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(46,99,184,0.25);color:#fff}.file.is-link:active .file-cta,.file.is-link.is-active .file-cta{background-color:#2958a4;border-color:transparent;color:#fff}.file.is-info .file-cta{background-color:#209cee;border-color:transparent;color:#fff}.file.is-info:hover .file-cta,.file.is-info.is-hovered .file-cta{background-color:#1497ed;border-color:transparent;color:#fff}.file.is-info:focus .file-cta,.file.is-info.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(32,156,238,0.25);color:#fff}.file.is-info:active .file-cta,.file.is-info.is-active .file-cta{background-color:#1190e3;border-color:transparent;color:#fff}.file.is-success .file-cta{background-color:#22c35b;border-color:transparent;color:#fff}.file.is-success:hover .file-cta,.file.is-success.is-hovered .file-cta{background-color:#20b856;border-color:transparent;color:#fff}.file.is-success:focus .file-cta,.file.is-success.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(34,195,91,0.25);color:#fff}.file.is-success:active .file-cta,.file.is-success.is-active .file-cta{background-color:#1ead51;border-color:transparent;color:#fff}.file.is-warning .file-cta{background-color:#ffdd57;border-color:transparent;color:rgba(0,0,0,0.7)}.file.is-warning:hover .file-cta,.file.is-warning.is-hovered .file-cta{background-color:#ffda4a;border-color:transparent;color:rgba(0,0,0,0.7)}.file.is-warning:focus .file-cta,.file.is-warning.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(255,221,87,0.25);color:rgba(0,0,0,0.7)}.file.is-warning:active .file-cta,.file.is-warning.is-active .file-cta{background-color:#ffd83e;border-color:transparent;color:rgba(0,0,0,0.7)}.file.is-danger .file-cta{background-color:#da0b00;border-color:transparent;color:#fff}.file.is-danger:hover .file-cta,.file.is-danger.is-hovered .file-cta{background-color:#cd0a00;border-color:transparent;color:#fff}.file.is-danger:focus .file-cta,.file.is-danger.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(218,11,0,0.25);color:#fff}.file.is-danger:active .file-cta,.file.is-danger.is-active .file-cta{background-color:#c10a00;border-color:transparent;color:#fff}.file.is-small,#documenter .docs-sidebar form.docs-search>input.file{font-size:.75rem}.file.is-normal{font-size:1rem}.file.is-medium{font-size:1.25rem}.file.is-medium .file-icon .fa{font-size:21px}.file.is-large{font-size:1.5rem}.file.is-large .file-icon .fa{font-size:28px}.file.has-name .file-cta{border-bottom-right-radius:0;border-top-right-radius:0}.file.has-name .file-name{border-bottom-left-radius:0;border-top-left-radius:0}.file.has-name.is-empty .file-cta{border-radius:4px}.file.has-name.is-empty .file-name{display:none}.file.is-boxed .file-label{flex-direction:column}.file.is-boxed .file-cta{flex-direction:column;height:auto;padding:1em 3em}.file.is-boxed .file-name{border-width:0 1px 1px}.file.is-boxed .file-icon{height:1.5em;width:1.5em}.file.is-boxed .file-icon .fa{font-size:21px}.file.is-boxed.is-small .file-icon .fa,#documenter .docs-sidebar form.docs-search>input.is-boxed .file-icon .fa{font-size:14px}.file.is-boxed.is-medium .file-icon .fa{font-size:28px}.file.is-boxed.is-large .file-icon .fa{font-size:35px}.file.is-boxed.has-name .file-cta{border-radius:4px 4px 0 0}.file.is-boxed.has-name .file-name{border-radius:0 0 4px 4px;border-width:0 1px 1px}.file.is-centered{justify-content:center}.file.is-fullwidth .file-label{width:100%}.file.is-fullwidth .file-name{flex-grow:1;max-width:none}.file.is-right{justify-content:flex-end}.file.is-right .file-cta{border-radius:0 4px 4px 0}.file.is-right .file-name{border-radius:4px 0 0 4px;border-width:1px 0 1px 1px;order:-1}.file-label{align-items:stretch;display:flex;cursor:pointer;justify-content:flex-start;overflow:hidden;position:relative}.file-label:hover .file-cta{background-color:#eee;color:#222}.file-label:hover .file-name{border-color:#d5d5d5}.file-label:active .file-cta{background-color:#e8e8e8;color:#222}.file-label:active .file-name{border-color:#cfcfcf}.file-input{height:100%;left:0;opacity:0;outline:none;position:absolute;top:0;width:100%}.file-cta,.file-name{border-color:#dbdbdb;border-radius:4px;font-size:1em;padding-left:1em;padding-right:1em;white-space:nowrap}.file-cta{background-color:#f5f5f5;color:#222}.file-name{border-color:#dbdbdb;border-style:solid;border-width:1px 1px 1px 0;display:block;max-width:16em;overflow:hidden;text-align:inherit;text-overflow:ellipsis}.file-icon{align-items:center;display:flex;height:1em;justify-content:center;margin-right:.5em;width:1em}.file-icon .fa{font-size:14px}.label{color:#222;display:block;font-size:1rem;font-weight:700}.label:not(:last-child){margin-bottom:0.5em}.label.is-small,#documenter .docs-sidebar form.docs-search>input.label{font-size:.75rem}.label.is-medium{font-size:1.25rem}.label.is-large{font-size:1.5rem}.help{display:block;font-size:.75rem;margin-top:0.25rem}.help.is-white{color:#fff}.help.is-black{color:#0a0a0a}.help.is-light{color:#f5f5f5}.help.is-dark,.content kbd.help{color:#363636}.help.is-primary,.docstring>section>a.help.docs-sourcelink{color:#4eb5de}.help.is-link{color:#2e63b8}.help.is-info{color:#209cee}.help.is-success{color:#22c35b}.help.is-warning{color:#ffdd57}.help.is-danger{color:#da0b00}.field:not(:last-child){margin-bottom:0.75rem}.field.has-addons{display:flex;justify-content:flex-start}.field.has-addons .control:not(:last-child){margin-right:-1px}.field.has-addons .control:not(:first-child):not(:last-child) .button,.field.has-addons .control:not(:first-child):not(:last-child) .input,.field.has-addons .control:not(:first-child):not(:last-child) #documenter .docs-sidebar form.docs-search>input,#documenter .docs-sidebar .field.has-addons .control:not(:first-child):not(:last-child) form.docs-search>input,.field.has-addons .control:not(:first-child):not(:last-child) .select select{border-radius:0}.field.has-addons .control:first-child:not(:only-child) .button,.field.has-addons .control:first-child:not(:only-child) .input,.field.has-addons .control:first-child:not(:only-child) #documenter .docs-sidebar form.docs-search>input,#documenter .docs-sidebar .field.has-addons .control:first-child:not(:only-child) form.docs-search>input,.field.has-addons .control:first-child:not(:only-child) .select select{border-bottom-right-radius:0;border-top-right-radius:0}.field.has-addons .control:last-child:not(:only-child) .button,.field.has-addons .control:last-child:not(:only-child) .input,.field.has-addons .control:last-child:not(:only-child) #documenter .docs-sidebar form.docs-search>input,#documenter .docs-sidebar .field.has-addons .control:last-child:not(:only-child) form.docs-search>input,.field.has-addons .control:last-child:not(:only-child) .select select{border-bottom-left-radius:0;border-top-left-radius:0}.field.has-addons .control .button:not([disabled]):hover,.field.has-addons .control .button.is-hovered:not([disabled]),.field.has-addons .control .input:not([disabled]):hover,.field.has-addons .control #documenter .docs-sidebar form.docs-search>input:not([disabled]):hover,#documenter .docs-sidebar .field.has-addons .control form.docs-search>input:not([disabled]):hover,.field.has-addons .control .input.is-hovered:not([disabled]),.field.has-addons .control #documenter .docs-sidebar form.docs-search>input.is-hovered:not([disabled]),#documenter .docs-sidebar .field.has-addons .control form.docs-search>input.is-hovered:not([disabled]),.field.has-addons .control .select select:not([disabled]):hover,.field.has-addons .control .select select.is-hovered:not([disabled]){z-index:2}.field.has-addons .control .button:not([disabled]):focus,.field.has-addons .control .button.is-focused:not([disabled]),.field.has-addons .control .button:not([disabled]):active,.field.has-addons .control .button.is-active:not([disabled]),.field.has-addons .control .input:not([disabled]):focus,.field.has-addons .control #documenter .docs-sidebar form.docs-search>input:not([disabled]):focus,#documenter .docs-sidebar .field.has-addons .control form.docs-search>input:not([disabled]):focus,.field.has-addons .control .input.is-focused:not([disabled]),.field.has-addons .control #documenter .docs-sidebar form.docs-search>input.is-focused:not([disabled]),#documenter .docs-sidebar .field.has-addons .control form.docs-search>input.is-focused:not([disabled]),.field.has-addons .control .input:not([disabled]):active,.field.has-addons .control #documenter .docs-sidebar form.docs-search>input:not([disabled]):active,#documenter .docs-sidebar .field.has-addons .control form.docs-search>input:not([disabled]):active,.field.has-addons .control .input.is-active:not([disabled]),.field.has-addons .control #documenter .docs-sidebar form.docs-search>input.is-active:not([disabled]),#documenter .docs-sidebar .field.has-addons .control form.docs-search>input.is-active:not([disabled]),.field.has-addons .control .select select:not([disabled]):focus,.field.has-addons .control .select select.is-focused:not([disabled]),.field.has-addons .control .select select:not([disabled]):active,.field.has-addons .control .select select.is-active:not([disabled]){z-index:3}.field.has-addons .control .button:not([disabled]):focus:hover,.field.has-addons .control .button.is-focused:not([disabled]):hover,.field.has-addons .control .button:not([disabled]):active:hover,.field.has-addons .control .button.is-active:not([disabled]):hover,.field.has-addons .control .input:not([disabled]):focus:hover,.field.has-addons .control #documenter .docs-sidebar form.docs-search>input:not([disabled]):focus:hover,#documenter .docs-sidebar .field.has-addons .control form.docs-search>input:not([disabled]):focus:hover,.field.has-addons .control .input.is-focused:not([disabled]):hover,.field.has-addons .control #documenter .docs-sidebar form.docs-search>input.is-focused:not([disabled]):hover,#documenter .docs-sidebar .field.has-addons .control form.docs-search>input.is-focused:not([disabled]):hover,.field.has-addons .control .input:not([disabled]):active:hover,.field.has-addons .control #documenter .docs-sidebar form.docs-search>input:not([disabled]):active:hover,#documenter .docs-sidebar .field.has-addons .control form.docs-search>input:not([disabled]):active:hover,.field.has-addons .control .input.is-active:not([disabled]):hover,.field.has-addons .control #documenter .docs-sidebar form.docs-search>input.is-active:not([disabled]):hover,#documenter .docs-sidebar .field.has-addons .control form.docs-search>input.is-active:not([disabled]):hover,.field.has-addons .control .select select:not([disabled]):focus:hover,.field.has-addons .control .select select.is-focused:not([disabled]):hover,.field.has-addons .control .select select:not([disabled]):active:hover,.field.has-addons .control .select select.is-active:not([disabled]):hover{z-index:4}.field.has-addons .control.is-expanded{flex-grow:1;flex-shrink:1}.field.has-addons.has-addons-centered{justify-content:center}.field.has-addons.has-addons-right{justify-content:flex-end}.field.has-addons.has-addons-fullwidth .control{flex-grow:1;flex-shrink:0}.field.is-grouped{display:flex;justify-content:flex-start}.field.is-grouped>.control{flex-shrink:0}.field.is-grouped>.control:not(:last-child){margin-bottom:0;margin-right:.75rem}.field.is-grouped>.control.is-expanded{flex-grow:1;flex-shrink:1}.field.is-grouped.is-grouped-centered{justify-content:center}.field.is-grouped.is-grouped-right{justify-content:flex-end}.field.is-grouped.is-grouped-multiline{flex-wrap:wrap}.field.is-grouped.is-grouped-multiline>.control:last-child,.field.is-grouped.is-grouped-multiline>.control:not(:last-child){margin-bottom:0.75rem}.field.is-grouped.is-grouped-multiline:last-child{margin-bottom:-0.75rem}.field.is-grouped.is-grouped-multiline:not(:last-child){margin-bottom:0}@media screen and (min-width: 769px),print{.field.is-horizontal{display:flex}}.field-label .label{font-size:inherit}@media screen and (max-width: 768px){.field-label{margin-bottom:0.5rem}}@media screen and (min-width: 769px),print{.field-label{flex-basis:0;flex-grow:1;flex-shrink:0;margin-right:1.5rem;text-align:right}.field-label.is-small,#documenter .docs-sidebar form.docs-search>input.field-label{font-size:.75rem;padding-top:0.375em}.field-label.is-normal{padding-top:0.375em}.field-label.is-medium{font-size:1.25rem;padding-top:0.375em}.field-label.is-large{font-size:1.5rem;padding-top:0.375em}}.field-body .field .field{margin-bottom:0}@media screen and (min-width: 769px),print{.field-body{display:flex;flex-basis:0;flex-grow:5;flex-shrink:1}.field-body .field{margin-bottom:0}.field-body>.field{flex-shrink:1}.field-body>.field:not(.is-narrow){flex-grow:1}.field-body>.field:not(:last-child){margin-right:.75rem}}.control{box-sizing:border-box;clear:both;font-size:1rem;position:relative;text-align:inherit}.control.has-icons-left .input:focus~.icon,.control.has-icons-left #documenter .docs-sidebar form.docs-search>input:focus~.icon,#documenter .docs-sidebar .control.has-icons-left form.docs-search>input:focus~.icon,.control.has-icons-left .select:focus~.icon,.control.has-icons-right .input:focus~.icon,.control.has-icons-right #documenter .docs-sidebar form.docs-search>input:focus~.icon,#documenter .docs-sidebar .control.has-icons-right form.docs-search>input:focus~.icon,.control.has-icons-right .select:focus~.icon{color:#222}.control.has-icons-left .input.is-small~.icon,.control.has-icons-left #documenter .docs-sidebar form.docs-search>input~.icon,#documenter .docs-sidebar .control.has-icons-left form.docs-search>input~.icon,.control.has-icons-left .select.is-small~.icon,.control.has-icons-right .input.is-small~.icon,.control.has-icons-right #documenter .docs-sidebar form.docs-search>input~.icon,#documenter .docs-sidebar .control.has-icons-right form.docs-search>input~.icon,.control.has-icons-right .select.is-small~.icon{font-size:.75rem}.control.has-icons-left .input.is-medium~.icon,.control.has-icons-left #documenter .docs-sidebar form.docs-search>input.is-medium~.icon,#documenter .docs-sidebar .control.has-icons-left form.docs-search>input.is-medium~.icon,.control.has-icons-left .select.is-medium~.icon,.control.has-icons-right .input.is-medium~.icon,.control.has-icons-right #documenter .docs-sidebar form.docs-search>input.is-medium~.icon,#documenter .docs-sidebar .control.has-icons-right form.docs-search>input.is-medium~.icon,.control.has-icons-right .select.is-medium~.icon{font-size:1.25rem}.control.has-icons-left .input.is-large~.icon,.control.has-icons-left #documenter .docs-sidebar form.docs-search>input.is-large~.icon,#documenter .docs-sidebar .control.has-icons-left form.docs-search>input.is-large~.icon,.control.has-icons-left .select.is-large~.icon,.control.has-icons-right .input.is-large~.icon,.control.has-icons-right #documenter .docs-sidebar form.docs-search>input.is-large~.icon,#documenter .docs-sidebar .control.has-icons-right form.docs-search>input.is-large~.icon,.control.has-icons-right .select.is-large~.icon{font-size:1.5rem}.control.has-icons-left .icon,.control.has-icons-right .icon{color:#dbdbdb;height:2.5em;pointer-events:none;position:absolute;top:0;width:2.5em;z-index:4}.control.has-icons-left .input,.control.has-icons-left #documenter .docs-sidebar form.docs-search>input,#documenter .docs-sidebar .control.has-icons-left form.docs-search>input,.control.has-icons-left .select select{padding-left:2.5em}.control.has-icons-left .icon.is-left{left:0}.control.has-icons-right .input,.control.has-icons-right #documenter .docs-sidebar form.docs-search>input,#documenter .docs-sidebar .control.has-icons-right form.docs-search>input,.control.has-icons-right .select select{padding-right:2.5em}.control.has-icons-right .icon.is-right{right:0}.control.is-loading::after{position:absolute !important;right:.625em;top:0.625em;z-index:4}.control.is-loading.is-small:after,#documenter .docs-sidebar form.docs-search>input.is-loading:after{font-size:.75rem}.control.is-loading.is-medium:after{font-size:1.25rem}.control.is-loading.is-large:after{font-size:1.5rem}.breadcrumb{font-size:1rem;white-space:nowrap}.breadcrumb a{align-items:center;color:#2e63b8;display:flex;justify-content:center;padding:0 .75em}.breadcrumb a:hover{color:#363636}.breadcrumb li{align-items:center;display:flex}.breadcrumb li:first-child a{padding-left:0}.breadcrumb li.is-active a{color:#222;cursor:default;pointer-events:none}.breadcrumb li+li::before{color:#b5b5b5;content:"\0002f"}.breadcrumb ul,.breadcrumb ol{align-items:flex-start;display:flex;flex-wrap:wrap;justify-content:flex-start}.breadcrumb .icon:first-child{margin-right:.5em}.breadcrumb .icon:last-child{margin-left:.5em}.breadcrumb.is-centered ol,.breadcrumb.is-centered ul{justify-content:center}.breadcrumb.is-right ol,.breadcrumb.is-right ul{justify-content:flex-end}.breadcrumb.is-small,#documenter .docs-sidebar form.docs-search>input.breadcrumb{font-size:.75rem}.breadcrumb.is-medium{font-size:1.25rem}.breadcrumb.is-large{font-size:1.5rem}.breadcrumb.has-arrow-separator li+li::before{content:"\02192"}.breadcrumb.has-bullet-separator li+li::before{content:"\02022"}.breadcrumb.has-dot-separator li+li::before{content:"\000b7"}.breadcrumb.has-succeeds-separator li+li::before{content:"\0227B"}.card{background-color:#fff;border-radius:.25rem;box-shadow:#bbb;color:#222;max-width:100%;position:relative}.card-footer:first-child,.card-content:first-child,.card-header:first-child{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.card-footer:last-child,.card-content:last-child,.card-header:last-child{border-bottom-left-radius:.25rem;border-bottom-right-radius:.25rem}.card-header{background-color:rgba(0,0,0,0);align-items:stretch;box-shadow:0 0.125em 0.25em rgba(10,10,10,0.1);display:flex}.card-header-title{align-items:center;color:#222;display:flex;flex-grow:1;font-weight:700;padding:0.75rem 1rem}.card-header-title.is-centered{justify-content:center}.card-header-icon{-moz-appearance:none;-webkit-appearance:none;appearance:none;background:none;border:none;color:currentColor;font-family:inherit;font-size:1em;margin:0;padding:0;align-items:center;cursor:pointer;display:flex;justify-content:center;padding:0.75rem 1rem}.card-image{display:block;position:relative}.card-image:first-child img{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.card-image:last-child img{border-bottom-left-radius:.25rem;border-bottom-right-radius:.25rem}.card-content{background-color:rgba(0,0,0,0);padding:1.5rem}.card-footer{background-color:rgba(0,0,0,0);border-top:1px solid #ededed;align-items:stretch;display:flex}.card-footer-item{align-items:center;display:flex;flex-basis:0;flex-grow:1;flex-shrink:0;justify-content:center;padding:.75rem}.card-footer-item:not(:last-child){border-right:1px solid #ededed}.card .media:not(:last-child){margin-bottom:1.5rem}.dropdown{display:inline-flex;position:relative;vertical-align:top}.dropdown.is-active .dropdown-menu,.dropdown.is-hoverable:hover .dropdown-menu{display:block}.dropdown.is-right .dropdown-menu{left:auto;right:0}.dropdown.is-up .dropdown-menu{bottom:100%;padding-bottom:4px;padding-top:initial;top:auto}.dropdown-menu{display:none;left:0;min-width:12rem;padding-top:4px;position:absolute;top:100%;z-index:20}.dropdown-content{background-color:#fff;border-radius:4px;box-shadow:#bbb;padding-bottom:.5rem;padding-top:.5rem}.dropdown-item{color:#222;display:block;font-size:0.875rem;line-height:1.5;padding:0.375rem 1rem;position:relative}a.dropdown-item,button.dropdown-item{padding-right:3rem;text-align:inherit;white-space:nowrap;width:100%}a.dropdown-item:hover,button.dropdown-item:hover{background-color:#f5f5f5;color:#0a0a0a}a.dropdown-item.is-active,button.dropdown-item.is-active{background-color:#2e63b8;color:#fff}.dropdown-divider{background-color:#ededed;border:none;display:block;height:1px;margin:0.5rem 0}.level{align-items:center;justify-content:space-between}.level code{border-radius:4px}.level img{display:inline-block;vertical-align:top}.level.is-mobile{display:flex}.level.is-mobile .level-left,.level.is-mobile .level-right{display:flex}.level.is-mobile .level-left+.level-right{margin-top:0}.level.is-mobile .level-item:not(:last-child){margin-bottom:0;margin-right:.75rem}.level.is-mobile .level-item:not(.is-narrow){flex-grow:1}@media screen and (min-width: 769px),print{.level{display:flex}.level>.level-item:not(.is-narrow){flex-grow:1}}.level-item{align-items:center;display:flex;flex-basis:auto;flex-grow:0;flex-shrink:0;justify-content:center}.level-item .title,.level-item .subtitle{margin-bottom:0}@media screen and (max-width: 768px){.level-item:not(:last-child){margin-bottom:.75rem}}.level-left,.level-right{flex-basis:auto;flex-grow:0;flex-shrink:0}.level-left .level-item.is-flexible,.level-right .level-item.is-flexible{flex-grow:1}@media screen and (min-width: 769px),print{.level-left .level-item:not(:last-child),.level-right .level-item:not(:last-child){margin-right:.75rem}}.level-left{align-items:center;justify-content:flex-start}@media screen and (max-width: 768px){.level-left+.level-right{margin-top:1.5rem}}@media screen and (min-width: 769px),print{.level-left{display:flex}}.level-right{align-items:center;justify-content:flex-end}@media screen and (min-width: 769px),print{.level-right{display:flex}}.media{align-items:flex-start;display:flex;text-align:inherit}.media .content:not(:last-child){margin-bottom:.75rem}.media .media{border-top:1px solid rgba(219,219,219,0.5);display:flex;padding-top:.75rem}.media .media .content:not(:last-child),.media .media .control:not(:last-child){margin-bottom:.5rem}.media .media .media{padding-top:.5rem}.media .media .media+.media{margin-top:.5rem}.media+.media{border-top:1px solid rgba(219,219,219,0.5);margin-top:1rem;padding-top:1rem}.media.is-large+.media{margin-top:1.5rem;padding-top:1.5rem}.media-left,.media-right{flex-basis:auto;flex-grow:0;flex-shrink:0}.media-left{margin-right:1rem}.media-right{margin-left:1rem}.media-content{flex-basis:auto;flex-grow:1;flex-shrink:1;text-align:inherit}@media screen and (max-width: 768px){.media-content{overflow-x:auto}}.menu{font-size:1rem}.menu.is-small,#documenter .docs-sidebar form.docs-search>input.menu{font-size:.75rem}.menu.is-medium{font-size:1.25rem}.menu.is-large{font-size:1.5rem}.menu-list{line-height:1.25}.menu-list a{border-radius:2px;color:#222;display:block;padding:0.5em 0.75em}.menu-list a:hover{background-color:#f5f5f5;color:#222}.menu-list a.is-active{background-color:#2e63b8;color:#fff}.menu-list li ul{border-left:1px solid #dbdbdb;margin:.75em;padding-left:.75em}.menu-label{color:#6b6b6b;font-size:.75em;letter-spacing:.1em;text-transform:uppercase}.menu-label:not(:first-child){margin-top:1em}.menu-label:not(:last-child){margin-bottom:1em}.message{background-color:#f5f5f5;border-radius:4px;font-size:1rem}.message strong{color:currentColor}.message a:not(.button):not(.tag):not(.dropdown-item){color:currentColor;text-decoration:underline}.message.is-small,#documenter .docs-sidebar form.docs-search>input.message{font-size:.75rem}.message.is-medium{font-size:1.25rem}.message.is-large{font-size:1.5rem}.message.is-white{background-color:#fff}.message.is-white .message-header{background-color:#fff;color:#0a0a0a}.message.is-white .message-body{border-color:#fff}.message.is-black{background-color:#fafafa}.message.is-black .message-header{background-color:#0a0a0a;color:#fff}.message.is-black .message-body{border-color:#0a0a0a}.message.is-light{background-color:#fafafa}.message.is-light .message-header{background-color:#f5f5f5;color:rgba(0,0,0,0.7)}.message.is-light .message-body{border-color:#f5f5f5}.message.is-dark,.content kbd.message{background-color:#fafafa}.message.is-dark .message-header,.content kbd.message .message-header{background-color:#363636;color:#fff}.message.is-dark .message-body,.content kbd.message .message-body{border-color:#363636}.message.is-primary,.docstring>section>a.message.docs-sourcelink{background-color:#eef8fc}.message.is-primary .message-header,.docstring>section>a.message.docs-sourcelink .message-header{background-color:#4eb5de;color:#fff}.message.is-primary .message-body,.docstring>section>a.message.docs-sourcelink .message-body{border-color:#4eb5de;color:#1a6d8e}.message.is-link{background-color:#eff3fb}.message.is-link .message-header{background-color:#2e63b8;color:#fff}.message.is-link .message-body{border-color:#2e63b8;color:#3169c4}.message.is-info{background-color:#ecf7fe}.message.is-info .message-header{background-color:#209cee;color:#fff}.message.is-info .message-body{border-color:#209cee;color:#0e72b4}.message.is-success{background-color:#eefcf3}.message.is-success .message-header{background-color:#22c35b;color:#fff}.message.is-success .message-body{border-color:#22c35b;color:#198f43}.message.is-warning{background-color:#fffbeb}.message.is-warning .message-header{background-color:#ffdd57;color:rgba(0,0,0,0.7)}.message.is-warning .message-body{border-color:#ffdd57;color:#947600}.message.is-danger{background-color:#ffeceb}.message.is-danger .message-header{background-color:#da0b00;color:#fff}.message.is-danger .message-body{border-color:#da0b00;color:#f50c00}.message-header{align-items:center;background-color:#222;border-radius:4px 4px 0 0;color:#fff;display:flex;font-weight:700;justify-content:space-between;line-height:1.25;padding:0.75em 1em;position:relative}.message-header .delete{flex-grow:0;flex-shrink:0;margin-left:.75em}.message-header+.message-body{border-width:0;border-top-left-radius:0;border-top-right-radius:0}.message-body{border-color:#dbdbdb;border-radius:4px;border-style:solid;border-width:0 0 0 4px;color:#222;padding:1.25em 1.5em}.message-body code,.message-body pre{background-color:#fff}.message-body pre code{background-color:rgba(0,0,0,0)}.modal{align-items:center;display:none;flex-direction:column;justify-content:center;overflow:hidden;position:fixed;z-index:40}.modal.is-active{display:flex}.modal-background{background-color:rgba(10,10,10,0.86)}.modal-content,.modal-card{margin:0 20px;max-height:calc(100vh - 160px);overflow:auto;position:relative;width:100%}@media screen and (min-width: 769px){.modal-content,.modal-card{margin:0 auto;max-height:calc(100vh - 40px);width:640px}}.modal-close{background:none;height:40px;position:fixed;right:20px;top:20px;width:40px}.modal-card{display:flex;flex-direction:column;max-height:calc(100vh - 40px);overflow:hidden;-ms-overflow-y:visible}.modal-card-head,.modal-card-foot{align-items:center;background-color:#f5f5f5;display:flex;flex-shrink:0;justify-content:flex-start;padding:20px;position:relative}.modal-card-head{border-bottom:1px solid #dbdbdb;border-top-left-radius:6px;border-top-right-radius:6px}.modal-card-title{color:#222;flex-grow:1;flex-shrink:0;font-size:1.5rem;line-height:1}.modal-card-foot{border-bottom-left-radius:6px;border-bottom-right-radius:6px;border-top:1px solid #dbdbdb}.modal-card-foot .button:not(:last-child){margin-right:.5em}.modal-card-body{-webkit-overflow-scrolling:touch;background-color:#fff;flex-grow:1;flex-shrink:1;overflow:auto;padding:20px}.navbar{background-color:#fff;min-height:3.25rem;position:relative;z-index:30}.navbar.is-white{background-color:#fff;color:#0a0a0a}.navbar.is-white .navbar-brand>.navbar-item,.navbar.is-white .navbar-brand .navbar-link{color:#0a0a0a}.navbar.is-white .navbar-brand>a.navbar-item:focus,.navbar.is-white .navbar-brand>a.navbar-item:hover,.navbar.is-white .navbar-brand>a.navbar-item.is-active,.navbar.is-white .navbar-brand .navbar-link:focus,.navbar.is-white .navbar-brand .navbar-link:hover,.navbar.is-white .navbar-brand .navbar-link.is-active{background-color:#f2f2f2;color:#0a0a0a}.navbar.is-white .navbar-brand .navbar-link::after{border-color:#0a0a0a}.navbar.is-white .navbar-burger{color:#0a0a0a}@media screen and (min-width: 1056px){.navbar.is-white .navbar-start>.navbar-item,.navbar.is-white .navbar-start .navbar-link,.navbar.is-white .navbar-end>.navbar-item,.navbar.is-white .navbar-end .navbar-link{color:#0a0a0a}.navbar.is-white .navbar-start>a.navbar-item:focus,.navbar.is-white .navbar-start>a.navbar-item:hover,.navbar.is-white .navbar-start>a.navbar-item.is-active,.navbar.is-white .navbar-start .navbar-link:focus,.navbar.is-white .navbar-start .navbar-link:hover,.navbar.is-white .navbar-start .navbar-link.is-active,.navbar.is-white .navbar-end>a.navbar-item:focus,.navbar.is-white .navbar-end>a.navbar-item:hover,.navbar.is-white .navbar-end>a.navbar-item.is-active,.navbar.is-white .navbar-end .navbar-link:focus,.navbar.is-white .navbar-end .navbar-link:hover,.navbar.is-white .navbar-end .navbar-link.is-active{background-color:#f2f2f2;color:#0a0a0a}.navbar.is-white .navbar-start .navbar-link::after,.navbar.is-white .navbar-end .navbar-link::after{border-color:#0a0a0a}.navbar.is-white .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-white .navbar-item.has-dropdown:hover .navbar-link,.navbar.is-white .navbar-item.has-dropdown.is-active .navbar-link{background-color:#f2f2f2;color:#0a0a0a}.navbar.is-white .navbar-dropdown a.navbar-item.is-active{background-color:#fff;color:#0a0a0a}}.navbar.is-black{background-color:#0a0a0a;color:#fff}.navbar.is-black .navbar-brand>.navbar-item,.navbar.is-black .navbar-brand .navbar-link{color:#fff}.navbar.is-black .navbar-brand>a.navbar-item:focus,.navbar.is-black .navbar-brand>a.navbar-item:hover,.navbar.is-black .navbar-brand>a.navbar-item.is-active,.navbar.is-black .navbar-brand .navbar-link:focus,.navbar.is-black .navbar-brand .navbar-link:hover,.navbar.is-black .navbar-brand .navbar-link.is-active{background-color:#000;color:#fff}.navbar.is-black .navbar-brand .navbar-link::after{border-color:#fff}.navbar.is-black .navbar-burger{color:#fff}@media screen and (min-width: 1056px){.navbar.is-black .navbar-start>.navbar-item,.navbar.is-black .navbar-start .navbar-link,.navbar.is-black .navbar-end>.navbar-item,.navbar.is-black .navbar-end .navbar-link{color:#fff}.navbar.is-black .navbar-start>a.navbar-item:focus,.navbar.is-black .navbar-start>a.navbar-item:hover,.navbar.is-black .navbar-start>a.navbar-item.is-active,.navbar.is-black .navbar-start .navbar-link:focus,.navbar.is-black .navbar-start .navbar-link:hover,.navbar.is-black .navbar-start .navbar-link.is-active,.navbar.is-black .navbar-end>a.navbar-item:focus,.navbar.is-black .navbar-end>a.navbar-item:hover,.navbar.is-black .navbar-end>a.navbar-item.is-active,.navbar.is-black .navbar-end .navbar-link:focus,.navbar.is-black .navbar-end .navbar-link:hover,.navbar.is-black .navbar-end .navbar-link.is-active{background-color:#000;color:#fff}.navbar.is-black .navbar-start .navbar-link::after,.navbar.is-black .navbar-end .navbar-link::after{border-color:#fff}.navbar.is-black .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-black .navbar-item.has-dropdown:hover .navbar-link,.navbar.is-black .navbar-item.has-dropdown.is-active .navbar-link{background-color:#000;color:#fff}.navbar.is-black .navbar-dropdown a.navbar-item.is-active{background-color:#0a0a0a;color:#fff}}.navbar.is-light{background-color:#f5f5f5;color:rgba(0,0,0,0.7)}.navbar.is-light .navbar-brand>.navbar-item,.navbar.is-light .navbar-brand .navbar-link{color:rgba(0,0,0,0.7)}.navbar.is-light .navbar-brand>a.navbar-item:focus,.navbar.is-light .navbar-brand>a.navbar-item:hover,.navbar.is-light .navbar-brand>a.navbar-item.is-active,.navbar.is-light .navbar-brand .navbar-link:focus,.navbar.is-light .navbar-brand .navbar-link:hover,.navbar.is-light .navbar-brand .navbar-link.is-active{background-color:#e8e8e8;color:rgba(0,0,0,0.7)}.navbar.is-light .navbar-brand .navbar-link::after{border-color:rgba(0,0,0,0.7)}.navbar.is-light .navbar-burger{color:rgba(0,0,0,0.7)}@media screen and (min-width: 1056px){.navbar.is-light .navbar-start>.navbar-item,.navbar.is-light .navbar-start .navbar-link,.navbar.is-light .navbar-end>.navbar-item,.navbar.is-light .navbar-end .navbar-link{color:rgba(0,0,0,0.7)}.navbar.is-light .navbar-start>a.navbar-item:focus,.navbar.is-light .navbar-start>a.navbar-item:hover,.navbar.is-light .navbar-start>a.navbar-item.is-active,.navbar.is-light .navbar-start .navbar-link:focus,.navbar.is-light .navbar-start .navbar-link:hover,.navbar.is-light .navbar-start .navbar-link.is-active,.navbar.is-light .navbar-end>a.navbar-item:focus,.navbar.is-light .navbar-end>a.navbar-item:hover,.navbar.is-light .navbar-end>a.navbar-item.is-active,.navbar.is-light .navbar-end .navbar-link:focus,.navbar.is-light .navbar-end .navbar-link:hover,.navbar.is-light .navbar-end .navbar-link.is-active{background-color:#e8e8e8;color:rgba(0,0,0,0.7)}.navbar.is-light .navbar-start .navbar-link::after,.navbar.is-light .navbar-end .navbar-link::after{border-color:rgba(0,0,0,0.7)}.navbar.is-light .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-light .navbar-item.has-dropdown:hover .navbar-link,.navbar.is-light .navbar-item.has-dropdown.is-active .navbar-link{background-color:#e8e8e8;color:rgba(0,0,0,0.7)}.navbar.is-light .navbar-dropdown a.navbar-item.is-active{background-color:#f5f5f5;color:rgba(0,0,0,0.7)}}.navbar.is-dark,.content kbd.navbar{background-color:#363636;color:#fff}.navbar.is-dark .navbar-brand>.navbar-item,.content kbd.navbar .navbar-brand>.navbar-item,.navbar.is-dark .navbar-brand .navbar-link,.content kbd.navbar .navbar-brand .navbar-link{color:#fff}.navbar.is-dark .navbar-brand>a.navbar-item:focus,.content kbd.navbar .navbar-brand>a.navbar-item:focus,.navbar.is-dark .navbar-brand>a.navbar-item:hover,.content kbd.navbar .navbar-brand>a.navbar-item:hover,.navbar.is-dark .navbar-brand>a.navbar-item.is-active,.content kbd.navbar .navbar-brand>a.navbar-item.is-active,.navbar.is-dark .navbar-brand .navbar-link:focus,.content kbd.navbar .navbar-brand .navbar-link:focus,.navbar.is-dark .navbar-brand .navbar-link:hover,.content kbd.navbar .navbar-brand .navbar-link:hover,.navbar.is-dark .navbar-brand .navbar-link.is-active,.content kbd.navbar .navbar-brand .navbar-link.is-active{background-color:#292929;color:#fff}.navbar.is-dark .navbar-brand .navbar-link::after,.content kbd.navbar .navbar-brand .navbar-link::after{border-color:#fff}.navbar.is-dark .navbar-burger,.content kbd.navbar .navbar-burger{color:#fff}@media screen and (min-width: 1056px){.navbar.is-dark .navbar-start>.navbar-item,.content kbd.navbar .navbar-start>.navbar-item,.navbar.is-dark .navbar-start .navbar-link,.content kbd.navbar .navbar-start .navbar-link,.navbar.is-dark .navbar-end>.navbar-item,.content kbd.navbar .navbar-end>.navbar-item,.navbar.is-dark .navbar-end .navbar-link,.content kbd.navbar .navbar-end .navbar-link{color:#fff}.navbar.is-dark .navbar-start>a.navbar-item:focus,.content kbd.navbar .navbar-start>a.navbar-item:focus,.navbar.is-dark .navbar-start>a.navbar-item:hover,.content kbd.navbar .navbar-start>a.navbar-item:hover,.navbar.is-dark .navbar-start>a.navbar-item.is-active,.content kbd.navbar .navbar-start>a.navbar-item.is-active,.navbar.is-dark .navbar-start .navbar-link:focus,.content kbd.navbar .navbar-start .navbar-link:focus,.navbar.is-dark .navbar-start .navbar-link:hover,.content kbd.navbar .navbar-start .navbar-link:hover,.navbar.is-dark .navbar-start .navbar-link.is-active,.content kbd.navbar .navbar-start .navbar-link.is-active,.navbar.is-dark .navbar-end>a.navbar-item:focus,.content kbd.navbar .navbar-end>a.navbar-item:focus,.navbar.is-dark .navbar-end>a.navbar-item:hover,.content kbd.navbar .navbar-end>a.navbar-item:hover,.navbar.is-dark .navbar-end>a.navbar-item.is-active,.content kbd.navbar .navbar-end>a.navbar-item.is-active,.navbar.is-dark .navbar-end .navbar-link:focus,.content kbd.navbar .navbar-end .navbar-link:focus,.navbar.is-dark .navbar-end .navbar-link:hover,.content kbd.navbar .navbar-end .navbar-link:hover,.navbar.is-dark .navbar-end .navbar-link.is-active,.content kbd.navbar .navbar-end .navbar-link.is-active{background-color:#292929;color:#fff}.navbar.is-dark .navbar-start .navbar-link::after,.content kbd.navbar .navbar-start .navbar-link::after,.navbar.is-dark .navbar-end .navbar-link::after,.content kbd.navbar .navbar-end .navbar-link::after{border-color:#fff}.navbar.is-dark .navbar-item.has-dropdown:focus .navbar-link,.content kbd.navbar .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-dark .navbar-item.has-dropdown:hover .navbar-link,.content kbd.navbar .navbar-item.has-dropdown:hover .navbar-link,.navbar.is-dark .navbar-item.has-dropdown.is-active .navbar-link,.content kbd.navbar .navbar-item.has-dropdown.is-active .navbar-link{background-color:#292929;color:#fff}.navbar.is-dark .navbar-dropdown a.navbar-item.is-active,.content kbd.navbar .navbar-dropdown a.navbar-item.is-active{background-color:#363636;color:#fff}}.navbar.is-primary,.docstring>section>a.navbar.docs-sourcelink{background-color:#4eb5de;color:#fff}.navbar.is-primary .navbar-brand>.navbar-item,.docstring>section>a.navbar.docs-sourcelink .navbar-brand>.navbar-item,.navbar.is-primary .navbar-brand .navbar-link,.docstring>section>a.navbar.docs-sourcelink .navbar-brand .navbar-link{color:#fff}.navbar.is-primary .navbar-brand>a.navbar-item:focus,.docstring>section>a.navbar.docs-sourcelink .navbar-brand>a.navbar-item:focus,.navbar.is-primary .navbar-brand>a.navbar-item:hover,.docstring>section>a.navbar.docs-sourcelink .navbar-brand>a.navbar-item:hover,.navbar.is-primary .navbar-brand>a.navbar-item.is-active,.docstring>section>a.navbar.docs-sourcelink .navbar-brand>a.navbar-item.is-active,.navbar.is-primary .navbar-brand .navbar-link:focus,.docstring>section>a.navbar.docs-sourcelink .navbar-brand .navbar-link:focus,.navbar.is-primary .navbar-brand .navbar-link:hover,.docstring>section>a.navbar.docs-sourcelink .navbar-brand .navbar-link:hover,.navbar.is-primary .navbar-brand .navbar-link.is-active,.docstring>section>a.navbar.docs-sourcelink .navbar-brand .navbar-link.is-active{background-color:#39acda;color:#fff}.navbar.is-primary .navbar-brand .navbar-link::after,.docstring>section>a.navbar.docs-sourcelink .navbar-brand .navbar-link::after{border-color:#fff}.navbar.is-primary .navbar-burger,.docstring>section>a.navbar.docs-sourcelink .navbar-burger{color:#fff}@media screen and (min-width: 1056px){.navbar.is-primary .navbar-start>.navbar-item,.docstring>section>a.navbar.docs-sourcelink .navbar-start>.navbar-item,.navbar.is-primary .navbar-start .navbar-link,.docstring>section>a.navbar.docs-sourcelink .navbar-start .navbar-link,.navbar.is-primary .navbar-end>.navbar-item,.docstring>section>a.navbar.docs-sourcelink .navbar-end>.navbar-item,.navbar.is-primary .navbar-end .navbar-link,.docstring>section>a.navbar.docs-sourcelink .navbar-end .navbar-link{color:#fff}.navbar.is-primary .navbar-start>a.navbar-item:focus,.docstring>section>a.navbar.docs-sourcelink .navbar-start>a.navbar-item:focus,.navbar.is-primary .navbar-start>a.navbar-item:hover,.docstring>section>a.navbar.docs-sourcelink .navbar-start>a.navbar-item:hover,.navbar.is-primary .navbar-start>a.navbar-item.is-active,.docstring>section>a.navbar.docs-sourcelink .navbar-start>a.navbar-item.is-active,.navbar.is-primary .navbar-start .navbar-link:focus,.docstring>section>a.navbar.docs-sourcelink .navbar-start .navbar-link:focus,.navbar.is-primary .navbar-start .navbar-link:hover,.docstring>section>a.navbar.docs-sourcelink .navbar-start .navbar-link:hover,.navbar.is-primary .navbar-start .navbar-link.is-active,.docstring>section>a.navbar.docs-sourcelink .navbar-start .navbar-link.is-active,.navbar.is-primary .navbar-end>a.navbar-item:focus,.docstring>section>a.navbar.docs-sourcelink .navbar-end>a.navbar-item:focus,.navbar.is-primary .navbar-end>a.navbar-item:hover,.docstring>section>a.navbar.docs-sourcelink .navbar-end>a.navbar-item:hover,.navbar.is-primary .navbar-end>a.navbar-item.is-active,.docstring>section>a.navbar.docs-sourcelink .navbar-end>a.navbar-item.is-active,.navbar.is-primary .navbar-end .navbar-link:focus,.docstring>section>a.navbar.docs-sourcelink .navbar-end .navbar-link:focus,.navbar.is-primary .navbar-end .navbar-link:hover,.docstring>section>a.navbar.docs-sourcelink .navbar-end .navbar-link:hover,.navbar.is-primary .navbar-end .navbar-link.is-active,.docstring>section>a.navbar.docs-sourcelink .navbar-end .navbar-link.is-active{background-color:#39acda;color:#fff}.navbar.is-primary .navbar-start .navbar-link::after,.docstring>section>a.navbar.docs-sourcelink .navbar-start .navbar-link::after,.navbar.is-primary .navbar-end .navbar-link::after,.docstring>section>a.navbar.docs-sourcelink .navbar-end .navbar-link::after{border-color:#fff}.navbar.is-primary .navbar-item.has-dropdown:focus .navbar-link,.docstring>section>a.navbar.docs-sourcelink .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-primary .navbar-item.has-dropdown:hover .navbar-link,.docstring>section>a.navbar.docs-sourcelink .navbar-item.has-dropdown:hover .navbar-link,.navbar.is-primary .navbar-item.has-dropdown.is-active .navbar-link,.docstring>section>a.navbar.docs-sourcelink .navbar-item.has-dropdown.is-active .navbar-link{background-color:#39acda;color:#fff}.navbar.is-primary .navbar-dropdown a.navbar-item.is-active,.docstring>section>a.navbar.docs-sourcelink .navbar-dropdown a.navbar-item.is-active{background-color:#4eb5de;color:#fff}}.navbar.is-link{background-color:#2e63b8;color:#fff}.navbar.is-link .navbar-brand>.navbar-item,.navbar.is-link .navbar-brand .navbar-link{color:#fff}.navbar.is-link .navbar-brand>a.navbar-item:focus,.navbar.is-link .navbar-brand>a.navbar-item:hover,.navbar.is-link .navbar-brand>a.navbar-item.is-active,.navbar.is-link .navbar-brand .navbar-link:focus,.navbar.is-link .navbar-brand .navbar-link:hover,.navbar.is-link .navbar-brand .navbar-link.is-active{background-color:#2958a4;color:#fff}.navbar.is-link .navbar-brand .navbar-link::after{border-color:#fff}.navbar.is-link .navbar-burger{color:#fff}@media screen and (min-width: 1056px){.navbar.is-link .navbar-start>.navbar-item,.navbar.is-link .navbar-start .navbar-link,.navbar.is-link .navbar-end>.navbar-item,.navbar.is-link .navbar-end .navbar-link{color:#fff}.navbar.is-link .navbar-start>a.navbar-item:focus,.navbar.is-link .navbar-start>a.navbar-item:hover,.navbar.is-link .navbar-start>a.navbar-item.is-active,.navbar.is-link .navbar-start .navbar-link:focus,.navbar.is-link .navbar-start .navbar-link:hover,.navbar.is-link .navbar-start .navbar-link.is-active,.navbar.is-link .navbar-end>a.navbar-item:focus,.navbar.is-link .navbar-end>a.navbar-item:hover,.navbar.is-link .navbar-end>a.navbar-item.is-active,.navbar.is-link .navbar-end .navbar-link:focus,.navbar.is-link .navbar-end .navbar-link:hover,.navbar.is-link .navbar-end .navbar-link.is-active{background-color:#2958a4;color:#fff}.navbar.is-link .navbar-start .navbar-link::after,.navbar.is-link .navbar-end .navbar-link::after{border-color:#fff}.navbar.is-link .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-link .navbar-item.has-dropdown:hover .navbar-link,.navbar.is-link .navbar-item.has-dropdown.is-active .navbar-link{background-color:#2958a4;color:#fff}.navbar.is-link .navbar-dropdown a.navbar-item.is-active{background-color:#2e63b8;color:#fff}}.navbar.is-info{background-color:#209cee;color:#fff}.navbar.is-info .navbar-brand>.navbar-item,.navbar.is-info .navbar-brand .navbar-link{color:#fff}.navbar.is-info .navbar-brand>a.navbar-item:focus,.navbar.is-info .navbar-brand>a.navbar-item:hover,.navbar.is-info .navbar-brand>a.navbar-item.is-active,.navbar.is-info .navbar-brand .navbar-link:focus,.navbar.is-info .navbar-brand .navbar-link:hover,.navbar.is-info .navbar-brand .navbar-link.is-active{background-color:#1190e3;color:#fff}.navbar.is-info .navbar-brand .navbar-link::after{border-color:#fff}.navbar.is-info .navbar-burger{color:#fff}@media screen and (min-width: 1056px){.navbar.is-info .navbar-start>.navbar-item,.navbar.is-info .navbar-start .navbar-link,.navbar.is-info .navbar-end>.navbar-item,.navbar.is-info .navbar-end .navbar-link{color:#fff}.navbar.is-info .navbar-start>a.navbar-item:focus,.navbar.is-info .navbar-start>a.navbar-item:hover,.navbar.is-info .navbar-start>a.navbar-item.is-active,.navbar.is-info .navbar-start .navbar-link:focus,.navbar.is-info .navbar-start .navbar-link:hover,.navbar.is-info .navbar-start .navbar-link.is-active,.navbar.is-info .navbar-end>a.navbar-item:focus,.navbar.is-info .navbar-end>a.navbar-item:hover,.navbar.is-info .navbar-end>a.navbar-item.is-active,.navbar.is-info .navbar-end .navbar-link:focus,.navbar.is-info .navbar-end .navbar-link:hover,.navbar.is-info .navbar-end .navbar-link.is-active{background-color:#1190e3;color:#fff}.navbar.is-info .navbar-start .navbar-link::after,.navbar.is-info .navbar-end .navbar-link::after{border-color:#fff}.navbar.is-info .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-info .navbar-item.has-dropdown:hover .navbar-link,.navbar.is-info .navbar-item.has-dropdown.is-active .navbar-link{background-color:#1190e3;color:#fff}.navbar.is-info .navbar-dropdown a.navbar-item.is-active{background-color:#209cee;color:#fff}}.navbar.is-success{background-color:#22c35b;color:#fff}.navbar.is-success .navbar-brand>.navbar-item,.navbar.is-success .navbar-brand .navbar-link{color:#fff}.navbar.is-success .navbar-brand>a.navbar-item:focus,.navbar.is-success .navbar-brand>a.navbar-item:hover,.navbar.is-success .navbar-brand>a.navbar-item.is-active,.navbar.is-success .navbar-brand .navbar-link:focus,.navbar.is-success .navbar-brand .navbar-link:hover,.navbar.is-success .navbar-brand .navbar-link.is-active{background-color:#1ead51;color:#fff}.navbar.is-success .navbar-brand .navbar-link::after{border-color:#fff}.navbar.is-success .navbar-burger{color:#fff}@media screen and (min-width: 1056px){.navbar.is-success .navbar-start>.navbar-item,.navbar.is-success .navbar-start .navbar-link,.navbar.is-success .navbar-end>.navbar-item,.navbar.is-success .navbar-end .navbar-link{color:#fff}.navbar.is-success .navbar-start>a.navbar-item:focus,.navbar.is-success .navbar-start>a.navbar-item:hover,.navbar.is-success .navbar-start>a.navbar-item.is-active,.navbar.is-success .navbar-start .navbar-link:focus,.navbar.is-success .navbar-start .navbar-link:hover,.navbar.is-success .navbar-start .navbar-link.is-active,.navbar.is-success .navbar-end>a.navbar-item:focus,.navbar.is-success .navbar-end>a.navbar-item:hover,.navbar.is-success .navbar-end>a.navbar-item.is-active,.navbar.is-success .navbar-end .navbar-link:focus,.navbar.is-success .navbar-end .navbar-link:hover,.navbar.is-success .navbar-end .navbar-link.is-active{background-color:#1ead51;color:#fff}.navbar.is-success .navbar-start .navbar-link::after,.navbar.is-success .navbar-end .navbar-link::after{border-color:#fff}.navbar.is-success .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-success .navbar-item.has-dropdown:hover .navbar-link,.navbar.is-success .navbar-item.has-dropdown.is-active .navbar-link{background-color:#1ead51;color:#fff}.navbar.is-success .navbar-dropdown a.navbar-item.is-active{background-color:#22c35b;color:#fff}}.navbar.is-warning{background-color:#ffdd57;color:rgba(0,0,0,0.7)}.navbar.is-warning .navbar-brand>.navbar-item,.navbar.is-warning .navbar-brand .navbar-link{color:rgba(0,0,0,0.7)}.navbar.is-warning .navbar-brand>a.navbar-item:focus,.navbar.is-warning .navbar-brand>a.navbar-item:hover,.navbar.is-warning .navbar-brand>a.navbar-item.is-active,.navbar.is-warning .navbar-brand .navbar-link:focus,.navbar.is-warning .navbar-brand .navbar-link:hover,.navbar.is-warning .navbar-brand .navbar-link.is-active{background-color:#ffd83e;color:rgba(0,0,0,0.7)}.navbar.is-warning .navbar-brand .navbar-link::after{border-color:rgba(0,0,0,0.7)}.navbar.is-warning .navbar-burger{color:rgba(0,0,0,0.7)}@media screen and (min-width: 1056px){.navbar.is-warning .navbar-start>.navbar-item,.navbar.is-warning .navbar-start .navbar-link,.navbar.is-warning .navbar-end>.navbar-item,.navbar.is-warning .navbar-end .navbar-link{color:rgba(0,0,0,0.7)}.navbar.is-warning .navbar-start>a.navbar-item:focus,.navbar.is-warning .navbar-start>a.navbar-item:hover,.navbar.is-warning .navbar-start>a.navbar-item.is-active,.navbar.is-warning .navbar-start .navbar-link:focus,.navbar.is-warning .navbar-start .navbar-link:hover,.navbar.is-warning .navbar-start .navbar-link.is-active,.navbar.is-warning .navbar-end>a.navbar-item:focus,.navbar.is-warning .navbar-end>a.navbar-item:hover,.navbar.is-warning .navbar-end>a.navbar-item.is-active,.navbar.is-warning .navbar-end .navbar-link:focus,.navbar.is-warning .navbar-end .navbar-link:hover,.navbar.is-warning .navbar-end .navbar-link.is-active{background-color:#ffd83e;color:rgba(0,0,0,0.7)}.navbar.is-warning .navbar-start .navbar-link::after,.navbar.is-warning .navbar-end .navbar-link::after{border-color:rgba(0,0,0,0.7)}.navbar.is-warning .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-warning .navbar-item.has-dropdown:hover .navbar-link,.navbar.is-warning .navbar-item.has-dropdown.is-active .navbar-link{background-color:#ffd83e;color:rgba(0,0,0,0.7)}.navbar.is-warning .navbar-dropdown a.navbar-item.is-active{background-color:#ffdd57;color:rgba(0,0,0,0.7)}}.navbar.is-danger{background-color:#da0b00;color:#fff}.navbar.is-danger .navbar-brand>.navbar-item,.navbar.is-danger .navbar-brand .navbar-link{color:#fff}.navbar.is-danger .navbar-brand>a.navbar-item:focus,.navbar.is-danger .navbar-brand>a.navbar-item:hover,.navbar.is-danger .navbar-brand>a.navbar-item.is-active,.navbar.is-danger .navbar-brand .navbar-link:focus,.navbar.is-danger .navbar-brand .navbar-link:hover,.navbar.is-danger .navbar-brand .navbar-link.is-active{background-color:#c10a00;color:#fff}.navbar.is-danger .navbar-brand .navbar-link::after{border-color:#fff}.navbar.is-danger .navbar-burger{color:#fff}@media screen and (min-width: 1056px){.navbar.is-danger .navbar-start>.navbar-item,.navbar.is-danger .navbar-start .navbar-link,.navbar.is-danger .navbar-end>.navbar-item,.navbar.is-danger .navbar-end .navbar-link{color:#fff}.navbar.is-danger .navbar-start>a.navbar-item:focus,.navbar.is-danger .navbar-start>a.navbar-item:hover,.navbar.is-danger .navbar-start>a.navbar-item.is-active,.navbar.is-danger .navbar-start .navbar-link:focus,.navbar.is-danger .navbar-start .navbar-link:hover,.navbar.is-danger .navbar-start .navbar-link.is-active,.navbar.is-danger .navbar-end>a.navbar-item:focus,.navbar.is-danger .navbar-end>a.navbar-item:hover,.navbar.is-danger .navbar-end>a.navbar-item.is-active,.navbar.is-danger .navbar-end .navbar-link:focus,.navbar.is-danger .navbar-end .navbar-link:hover,.navbar.is-danger .navbar-end .navbar-link.is-active{background-color:#c10a00;color:#fff}.navbar.is-danger .navbar-start .navbar-link::after,.navbar.is-danger .navbar-end .navbar-link::after{border-color:#fff}.navbar.is-danger .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-danger .navbar-item.has-dropdown:hover .navbar-link,.navbar.is-danger .navbar-item.has-dropdown.is-active .navbar-link{background-color:#c10a00;color:#fff}.navbar.is-danger .navbar-dropdown a.navbar-item.is-active{background-color:#da0b00;color:#fff}}.navbar>.container{align-items:stretch;display:flex;min-height:3.25rem;width:100%}.navbar.has-shadow{box-shadow:0 2px 0 0 #f5f5f5}.navbar.is-fixed-bottom,.navbar.is-fixed-top{left:0;position:fixed;right:0;z-index:30}.navbar.is-fixed-bottom{bottom:0}.navbar.is-fixed-bottom.has-shadow{box-shadow:0 -2px 0 0 #f5f5f5}.navbar.is-fixed-top{top:0}html.has-navbar-fixed-top,body.has-navbar-fixed-top{padding-top:3.25rem}html.has-navbar-fixed-bottom,body.has-navbar-fixed-bottom{padding-bottom:3.25rem}.navbar-brand,.navbar-tabs{align-items:stretch;display:flex;flex-shrink:0;min-height:3.25rem}.navbar-brand a.navbar-item:focus,.navbar-brand a.navbar-item:hover{background-color:transparent}.navbar-tabs{-webkit-overflow-scrolling:touch;max-width:100vw;overflow-x:auto;overflow-y:hidden}.navbar-burger{color:#222;-moz-appearance:none;-webkit-appearance:none;appearance:none;background:none;border:none;cursor:pointer;display:block;height:3.25rem;position:relative;width:3.25rem;margin-left:auto}.navbar-burger span{background-color:currentColor;display:block;height:1px;left:calc(50% - 8px);position:absolute;transform-origin:center;transition-duration:86ms;transition-property:background-color, opacity, transform;transition-timing-function:ease-out;width:16px}.navbar-burger span:nth-child(1){top:calc(50% - 6px)}.navbar-burger span:nth-child(2){top:calc(50% - 1px)}.navbar-burger span:nth-child(3){top:calc(50% + 4px)}.navbar-burger:hover{background-color:rgba(0,0,0,0.05)}.navbar-burger.is-active span:nth-child(1){transform:translateY(5px) rotate(45deg)}.navbar-burger.is-active span:nth-child(2){opacity:0}.navbar-burger.is-active span:nth-child(3){transform:translateY(-5px) rotate(-45deg)}.navbar-menu{display:none}.navbar-item,.navbar-link{color:#222;display:block;line-height:1.5;padding:0.5rem 0.75rem;position:relative}.navbar-item .icon:only-child,.navbar-link .icon:only-child{margin-left:-0.25rem;margin-right:-0.25rem}a.navbar-item,.navbar-link{cursor:pointer}a.navbar-item:focus,a.navbar-item:focus-within,a.navbar-item:hover,a.navbar-item.is-active,.navbar-link:focus,.navbar-link:focus-within,.navbar-link:hover,.navbar-link.is-active{background-color:#fafafa;color:#2e63b8}.navbar-item{flex-grow:0;flex-shrink:0}.navbar-item img{max-height:1.75rem}.navbar-item.has-dropdown{padding:0}.navbar-item.is-expanded{flex-grow:1;flex-shrink:1}.navbar-item.is-tab{border-bottom:1px solid transparent;min-height:3.25rem;padding-bottom:calc(0.5rem - 1px)}.navbar-item.is-tab:focus,.navbar-item.is-tab:hover{background-color:rgba(0,0,0,0);border-bottom-color:#2e63b8}.navbar-item.is-tab.is-active{background-color:rgba(0,0,0,0);border-bottom-color:#2e63b8;border-bottom-style:solid;border-bottom-width:3px;color:#2e63b8;padding-bottom:calc(0.5rem - 3px)}.navbar-content{flex-grow:1;flex-shrink:1}.navbar-link:not(.is-arrowless){padding-right:2.5em}.navbar-link:not(.is-arrowless)::after{border-color:#2e63b8;margin-top:-0.375em;right:1.125em}.navbar-dropdown{font-size:0.875rem;padding-bottom:0.5rem;padding-top:0.5rem}.navbar-dropdown .navbar-item{padding-left:1.5rem;padding-right:1.5rem}.navbar-divider{background-color:#f5f5f5;border:none;display:none;height:2px;margin:0.5rem 0}@media screen and (max-width: 1055px){.navbar>.container{display:block}.navbar-brand .navbar-item,.navbar-tabs .navbar-item{align-items:center;display:flex}.navbar-link::after{display:none}.navbar-menu{background-color:#fff;box-shadow:0 8px 16px rgba(10,10,10,0.1);padding:0.5rem 0}.navbar-menu.is-active{display:block}.navbar.is-fixed-bottom-touch,.navbar.is-fixed-top-touch{left:0;position:fixed;right:0;z-index:30}.navbar.is-fixed-bottom-touch{bottom:0}.navbar.is-fixed-bottom-touch.has-shadow{box-shadow:0 -2px 3px rgba(10,10,10,0.1)}.navbar.is-fixed-top-touch{top:0}.navbar.is-fixed-top .navbar-menu,.navbar.is-fixed-top-touch .navbar-menu{-webkit-overflow-scrolling:touch;max-height:calc(100vh - 3.25rem);overflow:auto}html.has-navbar-fixed-top-touch,body.has-navbar-fixed-top-touch{padding-top:3.25rem}html.has-navbar-fixed-bottom-touch,body.has-navbar-fixed-bottom-touch{padding-bottom:3.25rem}}@media screen and (min-width: 1056px){.navbar,.navbar-menu,.navbar-start,.navbar-end{align-items:stretch;display:flex}.navbar{min-height:3.25rem}.navbar.is-spaced{padding:1rem 2rem}.navbar.is-spaced .navbar-start,.navbar.is-spaced .navbar-end{align-items:center}.navbar.is-spaced a.navbar-item,.navbar.is-spaced .navbar-link{border-radius:4px}.navbar.is-transparent a.navbar-item:focus,.navbar.is-transparent a.navbar-item:hover,.navbar.is-transparent a.navbar-item.is-active,.navbar.is-transparent .navbar-link:focus,.navbar.is-transparent .navbar-link:hover,.navbar.is-transparent .navbar-link.is-active{background-color:transparent !important}.navbar.is-transparent .navbar-item.has-dropdown.is-active .navbar-link,.navbar.is-transparent .navbar-item.has-dropdown.is-hoverable:focus .navbar-link,.navbar.is-transparent .navbar-item.has-dropdown.is-hoverable:focus-within .navbar-link,.navbar.is-transparent .navbar-item.has-dropdown.is-hoverable:hover .navbar-link{background-color:transparent !important}.navbar.is-transparent .navbar-dropdown a.navbar-item:focus,.navbar.is-transparent .navbar-dropdown a.navbar-item:hover{background-color:#f5f5f5;color:#0a0a0a}.navbar.is-transparent .navbar-dropdown a.navbar-item.is-active{background-color:#f5f5f5;color:#2e63b8}.navbar-burger{display:none}.navbar-item,.navbar-link{align-items:center;display:flex}.navbar-item.has-dropdown{align-items:stretch}.navbar-item.has-dropdown-up .navbar-link::after{transform:rotate(135deg) translate(0.25em, -0.25em)}.navbar-item.has-dropdown-up .navbar-dropdown{border-bottom:2px solid #dbdbdb;border-radius:6px 6px 0 0;border-top:none;bottom:100%;box-shadow:0 -8px 8px rgba(10,10,10,0.1);top:auto}.navbar-item.is-active .navbar-dropdown,.navbar-item.is-hoverable:focus .navbar-dropdown,.navbar-item.is-hoverable:focus-within .navbar-dropdown,.navbar-item.is-hoverable:hover .navbar-dropdown{display:block}.navbar.is-spaced .navbar-item.is-active .navbar-dropdown,.navbar-item.is-active .navbar-dropdown.is-boxed,.navbar.is-spaced .navbar-item.is-hoverable:focus .navbar-dropdown,.navbar-item.is-hoverable:focus .navbar-dropdown.is-boxed,.navbar.is-spaced .navbar-item.is-hoverable:focus-within .navbar-dropdown,.navbar-item.is-hoverable:focus-within .navbar-dropdown.is-boxed,.navbar.is-spaced .navbar-item.is-hoverable:hover .navbar-dropdown,.navbar-item.is-hoverable:hover .navbar-dropdown.is-boxed{opacity:1;pointer-events:auto;transform:translateY(0)}.navbar-menu{flex-grow:1;flex-shrink:0}.navbar-start{justify-content:flex-start;margin-right:auto}.navbar-end{justify-content:flex-end;margin-left:auto}.navbar-dropdown{background-color:#fff;border-bottom-left-radius:6px;border-bottom-right-radius:6px;border-top:2px solid #dbdbdb;box-shadow:0 8px 8px rgba(10,10,10,0.1);display:none;font-size:0.875rem;left:0;min-width:100%;position:absolute;top:100%;z-index:20}.navbar-dropdown .navbar-item{padding:0.375rem 1rem;white-space:nowrap}.navbar-dropdown a.navbar-item{padding-right:3rem}.navbar-dropdown a.navbar-item:focus,.navbar-dropdown a.navbar-item:hover{background-color:#f5f5f5;color:#0a0a0a}.navbar-dropdown a.navbar-item.is-active{background-color:#f5f5f5;color:#2e63b8}.navbar.is-spaced .navbar-dropdown,.navbar-dropdown.is-boxed{border-radius:6px;border-top:none;box-shadow:0 8px 8px rgba(10,10,10,0.1), 0 0 0 1px rgba(10,10,10,0.1);display:block;opacity:0;pointer-events:none;top:calc(100% + (-4px));transform:translateY(-5px);transition-duration:86ms;transition-property:opacity, transform}.navbar-dropdown.is-right{left:auto;right:0}.navbar-divider{display:block}.navbar>.container .navbar-brand,.container>.navbar .navbar-brand{margin-left:-.75rem}.navbar>.container .navbar-menu,.container>.navbar .navbar-menu{margin-right:-.75rem}.navbar.is-fixed-bottom-desktop,.navbar.is-fixed-top-desktop{left:0;position:fixed;right:0;z-index:30}.navbar.is-fixed-bottom-desktop{bottom:0}.navbar.is-fixed-bottom-desktop.has-shadow{box-shadow:0 -2px 3px rgba(10,10,10,0.1)}.navbar.is-fixed-top-desktop{top:0}html.has-navbar-fixed-top-desktop,body.has-navbar-fixed-top-desktop{padding-top:3.25rem}html.has-navbar-fixed-bottom-desktop,body.has-navbar-fixed-bottom-desktop{padding-bottom:3.25rem}html.has-spaced-navbar-fixed-top,body.has-spaced-navbar-fixed-top{padding-top:5.25rem}html.has-spaced-navbar-fixed-bottom,body.has-spaced-navbar-fixed-bottom{padding-bottom:5.25rem}a.navbar-item.is-active,.navbar-link.is-active{color:#0a0a0a}a.navbar-item.is-active:not(:focus):not(:hover),.navbar-link.is-active:not(:focus):not(:hover){background-color:rgba(0,0,0,0)}.navbar-item.has-dropdown:focus .navbar-link,.navbar-item.has-dropdown:hover .navbar-link,.navbar-item.has-dropdown.is-active .navbar-link{background-color:#fafafa}}.hero.is-fullheight-with-navbar{min-height:calc(100vh - 3.25rem)}.pagination{font-size:1rem;margin:-.25rem}.pagination.is-small,#documenter .docs-sidebar form.docs-search>input.pagination{font-size:.75rem}.pagination.is-medium{font-size:1.25rem}.pagination.is-large{font-size:1.5rem}.pagination.is-rounded .pagination-previous,#documenter .docs-sidebar form.docs-search>input.pagination .pagination-previous,.pagination.is-rounded .pagination-next,#documenter .docs-sidebar form.docs-search>input.pagination .pagination-next{padding-left:1em;padding-right:1em;border-radius:9999px}.pagination.is-rounded .pagination-link,#documenter .docs-sidebar form.docs-search>input.pagination .pagination-link{border-radius:9999px}.pagination,.pagination-list{align-items:center;display:flex;justify-content:center;text-align:center}.pagination-previous,.pagination-next,.pagination-link,.pagination-ellipsis{font-size:1em;justify-content:center;margin:.25rem;padding-left:.5em;padding-right:.5em;text-align:center}.pagination-previous,.pagination-next,.pagination-link{border-color:#dbdbdb;color:#222;min-width:2.5em}.pagination-previous:hover,.pagination-next:hover,.pagination-link:hover{border-color:#b5b5b5;color:#363636}.pagination-previous:focus,.pagination-next:focus,.pagination-link:focus{border-color:#3c5dcd}.pagination-previous:active,.pagination-next:active,.pagination-link:active{box-shadow:inset 0 1px 2px rgba(10,10,10,0.2)}.pagination-previous[disabled],.pagination-previous.is-disabled,.pagination-next[disabled],.pagination-next.is-disabled,.pagination-link[disabled],.pagination-link.is-disabled{background-color:#dbdbdb;border-color:#dbdbdb;box-shadow:none;color:#6b6b6b;opacity:0.5}.pagination-previous,.pagination-next{padding-left:.75em;padding-right:.75em;white-space:nowrap}.pagination-link.is-current{background-color:#2e63b8;border-color:#2e63b8;color:#fff}.pagination-ellipsis{color:#b5b5b5;pointer-events:none}.pagination-list{flex-wrap:wrap}.pagination-list li{list-style:none}@media screen and (max-width: 768px){.pagination{flex-wrap:wrap}.pagination-previous,.pagination-next{flex-grow:1;flex-shrink:1}.pagination-list li{flex-grow:1;flex-shrink:1}}@media screen and (min-width: 769px),print{.pagination-list{flex-grow:1;flex-shrink:1;justify-content:flex-start;order:1}.pagination-previous,.pagination-next,.pagination-link,.pagination-ellipsis{margin-bottom:0;margin-top:0}.pagination-previous{order:2}.pagination-next{order:3}.pagination{justify-content:space-between;margin-bottom:0;margin-top:0}.pagination.is-centered .pagination-previous{order:1}.pagination.is-centered .pagination-list{justify-content:center;order:2}.pagination.is-centered .pagination-next{order:3}.pagination.is-right .pagination-previous{order:1}.pagination.is-right .pagination-next{order:2}.pagination.is-right .pagination-list{justify-content:flex-end;order:3}}.panel{border-radius:6px;box-shadow:#bbb;font-size:1rem}.panel:not(:last-child){margin-bottom:1.5rem}.panel.is-white .panel-heading{background-color:#fff;color:#0a0a0a}.panel.is-white .panel-tabs a.is-active{border-bottom-color:#fff}.panel.is-white .panel-block.is-active .panel-icon{color:#fff}.panel.is-black .panel-heading{background-color:#0a0a0a;color:#fff}.panel.is-black .panel-tabs a.is-active{border-bottom-color:#0a0a0a}.panel.is-black .panel-block.is-active .panel-icon{color:#0a0a0a}.panel.is-light .panel-heading{background-color:#f5f5f5;color:rgba(0,0,0,0.7)}.panel.is-light .panel-tabs a.is-active{border-bottom-color:#f5f5f5}.panel.is-light .panel-block.is-active .panel-icon{color:#f5f5f5}.panel.is-dark .panel-heading,.content kbd.panel .panel-heading{background-color:#363636;color:#fff}.panel.is-dark .panel-tabs a.is-active,.content kbd.panel .panel-tabs a.is-active{border-bottom-color:#363636}.panel.is-dark .panel-block.is-active .panel-icon,.content kbd.panel .panel-block.is-active .panel-icon{color:#363636}.panel.is-primary .panel-heading,.docstring>section>a.panel.docs-sourcelink .panel-heading{background-color:#4eb5de;color:#fff}.panel.is-primary .panel-tabs a.is-active,.docstring>section>a.panel.docs-sourcelink .panel-tabs a.is-active{border-bottom-color:#4eb5de}.panel.is-primary .panel-block.is-active .panel-icon,.docstring>section>a.panel.docs-sourcelink .panel-block.is-active .panel-icon{color:#4eb5de}.panel.is-link .panel-heading{background-color:#2e63b8;color:#fff}.panel.is-link .panel-tabs a.is-active{border-bottom-color:#2e63b8}.panel.is-link .panel-block.is-active .panel-icon{color:#2e63b8}.panel.is-info .panel-heading{background-color:#209cee;color:#fff}.panel.is-info .panel-tabs a.is-active{border-bottom-color:#209cee}.panel.is-info .panel-block.is-active .panel-icon{color:#209cee}.panel.is-success .panel-heading{background-color:#22c35b;color:#fff}.panel.is-success .panel-tabs a.is-active{border-bottom-color:#22c35b}.panel.is-success .panel-block.is-active .panel-icon{color:#22c35b}.panel.is-warning .panel-heading{background-color:#ffdd57;color:rgba(0,0,0,0.7)}.panel.is-warning .panel-tabs a.is-active{border-bottom-color:#ffdd57}.panel.is-warning .panel-block.is-active .panel-icon{color:#ffdd57}.panel.is-danger .panel-heading{background-color:#da0b00;color:#fff}.panel.is-danger .panel-tabs a.is-active{border-bottom-color:#da0b00}.panel.is-danger .panel-block.is-active .panel-icon{color:#da0b00}.panel-tabs:not(:last-child),.panel-block:not(:last-child){border-bottom:1px solid #ededed}.panel-heading{background-color:#ededed;border-radius:6px 6px 0 0;color:#222;font-size:1.25em;font-weight:700;line-height:1.25;padding:0.75em 1em}.panel-tabs{align-items:flex-end;display:flex;font-size:.875em;justify-content:center}.panel-tabs a{border-bottom:1px solid #dbdbdb;margin-bottom:-1px;padding:0.5em}.panel-tabs a.is-active{border-bottom-color:#4a4a4a;color:#363636}.panel-list a{color:#222}.panel-list a:hover{color:#2e63b8}.panel-block{align-items:center;color:#222;display:flex;justify-content:flex-start;padding:0.5em 0.75em}.panel-block input[type="checkbox"]{margin-right:.75em}.panel-block>.control{flex-grow:1;flex-shrink:1;width:100%}.panel-block.is-wrapped{flex-wrap:wrap}.panel-block.is-active{border-left-color:#2e63b8;color:#363636}.panel-block.is-active .panel-icon{color:#2e63b8}.panel-block:last-child{border-bottom-left-radius:6px;border-bottom-right-radius:6px}a.panel-block,label.panel-block{cursor:pointer}a.panel-block:hover,label.panel-block:hover{background-color:#f5f5f5}.panel-icon{display:inline-block;font-size:14px;height:1em;line-height:1em;text-align:center;vertical-align:top;width:1em;color:#6b6b6b;margin-right:.75em}.panel-icon .fa{font-size:inherit;line-height:inherit}.tabs{-webkit-overflow-scrolling:touch;align-items:stretch;display:flex;font-size:1rem;justify-content:space-between;overflow:hidden;overflow-x:auto;white-space:nowrap}.tabs a{align-items:center;border-bottom-color:#dbdbdb;border-bottom-style:solid;border-bottom-width:1px;color:#222;display:flex;justify-content:center;margin-bottom:-1px;padding:0.5em 1em;vertical-align:top}.tabs a:hover{border-bottom-color:#222;color:#222}.tabs li{display:block}.tabs li.is-active a{border-bottom-color:#2e63b8;color:#2e63b8}.tabs ul{align-items:center;border-bottom-color:#dbdbdb;border-bottom-style:solid;border-bottom-width:1px;display:flex;flex-grow:1;flex-shrink:0;justify-content:flex-start}.tabs ul.is-left{padding-right:0.75em}.tabs ul.is-center{flex:none;justify-content:center;padding-left:0.75em;padding-right:0.75em}.tabs ul.is-right{justify-content:flex-end;padding-left:0.75em}.tabs .icon:first-child{margin-right:.5em}.tabs .icon:last-child{margin-left:.5em}.tabs.is-centered ul{justify-content:center}.tabs.is-right ul{justify-content:flex-end}.tabs.is-boxed a{border:1px solid transparent;border-radius:4px 4px 0 0}.tabs.is-boxed a:hover{background-color:#f5f5f5;border-bottom-color:#dbdbdb}.tabs.is-boxed li.is-active a{background-color:#fff;border-color:#dbdbdb;border-bottom-color:rgba(0,0,0,0) !important}.tabs.is-fullwidth li{flex-grow:1;flex-shrink:0}.tabs.is-toggle a{border-color:#dbdbdb;border-style:solid;border-width:1px;margin-bottom:0;position:relative}.tabs.is-toggle a:hover{background-color:#f5f5f5;border-color:#b5b5b5;z-index:2}.tabs.is-toggle li+li{margin-left:-1px}.tabs.is-toggle li:first-child a{border-top-left-radius:4px;border-bottom-left-radius:4px}.tabs.is-toggle li:last-child a{border-top-right-radius:4px;border-bottom-right-radius:4px}.tabs.is-toggle li.is-active a{background-color:#2e63b8;border-color:#2e63b8;color:#fff;z-index:1}.tabs.is-toggle ul{border-bottom:none}.tabs.is-toggle.is-toggle-rounded li:first-child a{border-bottom-left-radius:9999px;border-top-left-radius:9999px;padding-left:1.25em}.tabs.is-toggle.is-toggle-rounded li:last-child a{border-bottom-right-radius:9999px;border-top-right-radius:9999px;padding-right:1.25em}.tabs.is-small,#documenter .docs-sidebar form.docs-search>input.tabs{font-size:.75rem}.tabs.is-medium{font-size:1.25rem}.tabs.is-large{font-size:1.5rem}.column{display:block;flex-basis:0;flex-grow:1;flex-shrink:1;padding:.75rem}.columns.is-mobile>.column.is-narrow{flex:none;width:unset}.columns.is-mobile>.column.is-full{flex:none;width:100%}.columns.is-mobile>.column.is-three-quarters{flex:none;width:75%}.columns.is-mobile>.column.is-two-thirds{flex:none;width:66.6666%}.columns.is-mobile>.column.is-half{flex:none;width:50%}.columns.is-mobile>.column.is-one-third{flex:none;width:33.3333%}.columns.is-mobile>.column.is-one-quarter{flex:none;width:25%}.columns.is-mobile>.column.is-one-fifth{flex:none;width:20%}.columns.is-mobile>.column.is-two-fifths{flex:none;width:40%}.columns.is-mobile>.column.is-three-fifths{flex:none;width:60%}.columns.is-mobile>.column.is-four-fifths{flex:none;width:80%}.columns.is-mobile>.column.is-offset-three-quarters{margin-left:75%}.columns.is-mobile>.column.is-offset-two-thirds{margin-left:66.6666%}.columns.is-mobile>.column.is-offset-half{margin-left:50%}.columns.is-mobile>.column.is-offset-one-third{margin-left:33.3333%}.columns.is-mobile>.column.is-offset-one-quarter{margin-left:25%}.columns.is-mobile>.column.is-offset-one-fifth{margin-left:20%}.columns.is-mobile>.column.is-offset-two-fifths{margin-left:40%}.columns.is-mobile>.column.is-offset-three-fifths{margin-left:60%}.columns.is-mobile>.column.is-offset-four-fifths{margin-left:80%}.columns.is-mobile>.column.is-0{flex:none;width:0%}.columns.is-mobile>.column.is-offset-0{margin-left:0%}.columns.is-mobile>.column.is-1{flex:none;width:8.33333337%}.columns.is-mobile>.column.is-offset-1{margin-left:8.33333337%}.columns.is-mobile>.column.is-2{flex:none;width:16.66666674%}.columns.is-mobile>.column.is-offset-2{margin-left:16.66666674%}.columns.is-mobile>.column.is-3{flex:none;width:25%}.columns.is-mobile>.column.is-offset-3{margin-left:25%}.columns.is-mobile>.column.is-4{flex:none;width:33.33333337%}.columns.is-mobile>.column.is-offset-4{margin-left:33.33333337%}.columns.is-mobile>.column.is-5{flex:none;width:41.66666674%}.columns.is-mobile>.column.is-offset-5{margin-left:41.66666674%}.columns.is-mobile>.column.is-6{flex:none;width:50%}.columns.is-mobile>.column.is-offset-6{margin-left:50%}.columns.is-mobile>.column.is-7{flex:none;width:58.33333337%}.columns.is-mobile>.column.is-offset-7{margin-left:58.33333337%}.columns.is-mobile>.column.is-8{flex:none;width:66.66666674%}.columns.is-mobile>.column.is-offset-8{margin-left:66.66666674%}.columns.is-mobile>.column.is-9{flex:none;width:75%}.columns.is-mobile>.column.is-offset-9{margin-left:75%}.columns.is-mobile>.column.is-10{flex:none;width:83.33333337%}.columns.is-mobile>.column.is-offset-10{margin-left:83.33333337%}.columns.is-mobile>.column.is-11{flex:none;width:91.66666674%}.columns.is-mobile>.column.is-offset-11{margin-left:91.66666674%}.columns.is-mobile>.column.is-12{flex:none;width:100%}.columns.is-mobile>.column.is-offset-12{margin-left:100%}@media screen and (max-width: 768px){.column.is-narrow-mobile{flex:none;width:unset}.column.is-full-mobile{flex:none;width:100%}.column.is-three-quarters-mobile{flex:none;width:75%}.column.is-two-thirds-mobile{flex:none;width:66.6666%}.column.is-half-mobile{flex:none;width:50%}.column.is-one-third-mobile{flex:none;width:33.3333%}.column.is-one-quarter-mobile{flex:none;width:25%}.column.is-one-fifth-mobile{flex:none;width:20%}.column.is-two-fifths-mobile{flex:none;width:40%}.column.is-three-fifths-mobile{flex:none;width:60%}.column.is-four-fifths-mobile{flex:none;width:80%}.column.is-offset-three-quarters-mobile{margin-left:75%}.column.is-offset-two-thirds-mobile{margin-left:66.6666%}.column.is-offset-half-mobile{margin-left:50%}.column.is-offset-one-third-mobile{margin-left:33.3333%}.column.is-offset-one-quarter-mobile{margin-left:25%}.column.is-offset-one-fifth-mobile{margin-left:20%}.column.is-offset-two-fifths-mobile{margin-left:40%}.column.is-offset-three-fifths-mobile{margin-left:60%}.column.is-offset-four-fifths-mobile{margin-left:80%}.column.is-0-mobile{flex:none;width:0%}.column.is-offset-0-mobile{margin-left:0%}.column.is-1-mobile{flex:none;width:8.33333337%}.column.is-offset-1-mobile{margin-left:8.33333337%}.column.is-2-mobile{flex:none;width:16.66666674%}.column.is-offset-2-mobile{margin-left:16.66666674%}.column.is-3-mobile{flex:none;width:25%}.column.is-offset-3-mobile{margin-left:25%}.column.is-4-mobile{flex:none;width:33.33333337%}.column.is-offset-4-mobile{margin-left:33.33333337%}.column.is-5-mobile{flex:none;width:41.66666674%}.column.is-offset-5-mobile{margin-left:41.66666674%}.column.is-6-mobile{flex:none;width:50%}.column.is-offset-6-mobile{margin-left:50%}.column.is-7-mobile{flex:none;width:58.33333337%}.column.is-offset-7-mobile{margin-left:58.33333337%}.column.is-8-mobile{flex:none;width:66.66666674%}.column.is-offset-8-mobile{margin-left:66.66666674%}.column.is-9-mobile{flex:none;width:75%}.column.is-offset-9-mobile{margin-left:75%}.column.is-10-mobile{flex:none;width:83.33333337%}.column.is-offset-10-mobile{margin-left:83.33333337%}.column.is-11-mobile{flex:none;width:91.66666674%}.column.is-offset-11-mobile{margin-left:91.66666674%}.column.is-12-mobile{flex:none;width:100%}.column.is-offset-12-mobile{margin-left:100%}}@media screen and (min-width: 769px),print{.column.is-narrow,.column.is-narrow-tablet{flex:none;width:unset}.column.is-full,.column.is-full-tablet{flex:none;width:100%}.column.is-three-quarters,.column.is-three-quarters-tablet{flex:none;width:75%}.column.is-two-thirds,.column.is-two-thirds-tablet{flex:none;width:66.6666%}.column.is-half,.column.is-half-tablet{flex:none;width:50%}.column.is-one-third,.column.is-one-third-tablet{flex:none;width:33.3333%}.column.is-one-quarter,.column.is-one-quarter-tablet{flex:none;width:25%}.column.is-one-fifth,.column.is-one-fifth-tablet{flex:none;width:20%}.column.is-two-fifths,.column.is-two-fifths-tablet{flex:none;width:40%}.column.is-three-fifths,.column.is-three-fifths-tablet{flex:none;width:60%}.column.is-four-fifths,.column.is-four-fifths-tablet{flex:none;width:80%}.column.is-offset-three-quarters,.column.is-offset-three-quarters-tablet{margin-left:75%}.column.is-offset-two-thirds,.column.is-offset-two-thirds-tablet{margin-left:66.6666%}.column.is-offset-half,.column.is-offset-half-tablet{margin-left:50%}.column.is-offset-one-third,.column.is-offset-one-third-tablet{margin-left:33.3333%}.column.is-offset-one-quarter,.column.is-offset-one-quarter-tablet{margin-left:25%}.column.is-offset-one-fifth,.column.is-offset-one-fifth-tablet{margin-left:20%}.column.is-offset-two-fifths,.column.is-offset-two-fifths-tablet{margin-left:40%}.column.is-offset-three-fifths,.column.is-offset-three-fifths-tablet{margin-left:60%}.column.is-offset-four-fifths,.column.is-offset-four-fifths-tablet{margin-left:80%}.column.is-0,.column.is-0-tablet{flex:none;width:0%}.column.is-offset-0,.column.is-offset-0-tablet{margin-left:0%}.column.is-1,.column.is-1-tablet{flex:none;width:8.33333337%}.column.is-offset-1,.column.is-offset-1-tablet{margin-left:8.33333337%}.column.is-2,.column.is-2-tablet{flex:none;width:16.66666674%}.column.is-offset-2,.column.is-offset-2-tablet{margin-left:16.66666674%}.column.is-3,.column.is-3-tablet{flex:none;width:25%}.column.is-offset-3,.column.is-offset-3-tablet{margin-left:25%}.column.is-4,.column.is-4-tablet{flex:none;width:33.33333337%}.column.is-offset-4,.column.is-offset-4-tablet{margin-left:33.33333337%}.column.is-5,.column.is-5-tablet{flex:none;width:41.66666674%}.column.is-offset-5,.column.is-offset-5-tablet{margin-left:41.66666674%}.column.is-6,.column.is-6-tablet{flex:none;width:50%}.column.is-offset-6,.column.is-offset-6-tablet{margin-left:50%}.column.is-7,.column.is-7-tablet{flex:none;width:58.33333337%}.column.is-offset-7,.column.is-offset-7-tablet{margin-left:58.33333337%}.column.is-8,.column.is-8-tablet{flex:none;width:66.66666674%}.column.is-offset-8,.column.is-offset-8-tablet{margin-left:66.66666674%}.column.is-9,.column.is-9-tablet{flex:none;width:75%}.column.is-offset-9,.column.is-offset-9-tablet{margin-left:75%}.column.is-10,.column.is-10-tablet{flex:none;width:83.33333337%}.column.is-offset-10,.column.is-offset-10-tablet{margin-left:83.33333337%}.column.is-11,.column.is-11-tablet{flex:none;width:91.66666674%}.column.is-offset-11,.column.is-offset-11-tablet{margin-left:91.66666674%}.column.is-12,.column.is-12-tablet{flex:none;width:100%}.column.is-offset-12,.column.is-offset-12-tablet{margin-left:100%}}@media screen and (max-width: 1055px){.column.is-narrow-touch{flex:none;width:unset}.column.is-full-touch{flex:none;width:100%}.column.is-three-quarters-touch{flex:none;width:75%}.column.is-two-thirds-touch{flex:none;width:66.6666%}.column.is-half-touch{flex:none;width:50%}.column.is-one-third-touch{flex:none;width:33.3333%}.column.is-one-quarter-touch{flex:none;width:25%}.column.is-one-fifth-touch{flex:none;width:20%}.column.is-two-fifths-touch{flex:none;width:40%}.column.is-three-fifths-touch{flex:none;width:60%}.column.is-four-fifths-touch{flex:none;width:80%}.column.is-offset-three-quarters-touch{margin-left:75%}.column.is-offset-two-thirds-touch{margin-left:66.6666%}.column.is-offset-half-touch{margin-left:50%}.column.is-offset-one-third-touch{margin-left:33.3333%}.column.is-offset-one-quarter-touch{margin-left:25%}.column.is-offset-one-fifth-touch{margin-left:20%}.column.is-offset-two-fifths-touch{margin-left:40%}.column.is-offset-three-fifths-touch{margin-left:60%}.column.is-offset-four-fifths-touch{margin-left:80%}.column.is-0-touch{flex:none;width:0%}.column.is-offset-0-touch{margin-left:0%}.column.is-1-touch{flex:none;width:8.33333337%}.column.is-offset-1-touch{margin-left:8.33333337%}.column.is-2-touch{flex:none;width:16.66666674%}.column.is-offset-2-touch{margin-left:16.66666674%}.column.is-3-touch{flex:none;width:25%}.column.is-offset-3-touch{margin-left:25%}.column.is-4-touch{flex:none;width:33.33333337%}.column.is-offset-4-touch{margin-left:33.33333337%}.column.is-5-touch{flex:none;width:41.66666674%}.column.is-offset-5-touch{margin-left:41.66666674%}.column.is-6-touch{flex:none;width:50%}.column.is-offset-6-touch{margin-left:50%}.column.is-7-touch{flex:none;width:58.33333337%}.column.is-offset-7-touch{margin-left:58.33333337%}.column.is-8-touch{flex:none;width:66.66666674%}.column.is-offset-8-touch{margin-left:66.66666674%}.column.is-9-touch{flex:none;width:75%}.column.is-offset-9-touch{margin-left:75%}.column.is-10-touch{flex:none;width:83.33333337%}.column.is-offset-10-touch{margin-left:83.33333337%}.column.is-11-touch{flex:none;width:91.66666674%}.column.is-offset-11-touch{margin-left:91.66666674%}.column.is-12-touch{flex:none;width:100%}.column.is-offset-12-touch{margin-left:100%}}@media screen and (min-width: 1056px){.column.is-narrow-desktop{flex:none;width:unset}.column.is-full-desktop{flex:none;width:100%}.column.is-three-quarters-desktop{flex:none;width:75%}.column.is-two-thirds-desktop{flex:none;width:66.6666%}.column.is-half-desktop{flex:none;width:50%}.column.is-one-third-desktop{flex:none;width:33.3333%}.column.is-one-quarter-desktop{flex:none;width:25%}.column.is-one-fifth-desktop{flex:none;width:20%}.column.is-two-fifths-desktop{flex:none;width:40%}.column.is-three-fifths-desktop{flex:none;width:60%}.column.is-four-fifths-desktop{flex:none;width:80%}.column.is-offset-three-quarters-desktop{margin-left:75%}.column.is-offset-two-thirds-desktop{margin-left:66.6666%}.column.is-offset-half-desktop{margin-left:50%}.column.is-offset-one-third-desktop{margin-left:33.3333%}.column.is-offset-one-quarter-desktop{margin-left:25%}.column.is-offset-one-fifth-desktop{margin-left:20%}.column.is-offset-two-fifths-desktop{margin-left:40%}.column.is-offset-three-fifths-desktop{margin-left:60%}.column.is-offset-four-fifths-desktop{margin-left:80%}.column.is-0-desktop{flex:none;width:0%}.column.is-offset-0-desktop{margin-left:0%}.column.is-1-desktop{flex:none;width:8.33333337%}.column.is-offset-1-desktop{margin-left:8.33333337%}.column.is-2-desktop{flex:none;width:16.66666674%}.column.is-offset-2-desktop{margin-left:16.66666674%}.column.is-3-desktop{flex:none;width:25%}.column.is-offset-3-desktop{margin-left:25%}.column.is-4-desktop{flex:none;width:33.33333337%}.column.is-offset-4-desktop{margin-left:33.33333337%}.column.is-5-desktop{flex:none;width:41.66666674%}.column.is-offset-5-desktop{margin-left:41.66666674%}.column.is-6-desktop{flex:none;width:50%}.column.is-offset-6-desktop{margin-left:50%}.column.is-7-desktop{flex:none;width:58.33333337%}.column.is-offset-7-desktop{margin-left:58.33333337%}.column.is-8-desktop{flex:none;width:66.66666674%}.column.is-offset-8-desktop{margin-left:66.66666674%}.column.is-9-desktop{flex:none;width:75%}.column.is-offset-9-desktop{margin-left:75%}.column.is-10-desktop{flex:none;width:83.33333337%}.column.is-offset-10-desktop{margin-left:83.33333337%}.column.is-11-desktop{flex:none;width:91.66666674%}.column.is-offset-11-desktop{margin-left:91.66666674%}.column.is-12-desktop{flex:none;width:100%}.column.is-offset-12-desktop{margin-left:100%}}@media screen and (min-width: 1216px){.column.is-narrow-widescreen{flex:none;width:unset}.column.is-full-widescreen{flex:none;width:100%}.column.is-three-quarters-widescreen{flex:none;width:75%}.column.is-two-thirds-widescreen{flex:none;width:66.6666%}.column.is-half-widescreen{flex:none;width:50%}.column.is-one-third-widescreen{flex:none;width:33.3333%}.column.is-one-quarter-widescreen{flex:none;width:25%}.column.is-one-fifth-widescreen{flex:none;width:20%}.column.is-two-fifths-widescreen{flex:none;width:40%}.column.is-three-fifths-widescreen{flex:none;width:60%}.column.is-four-fifths-widescreen{flex:none;width:80%}.column.is-offset-three-quarters-widescreen{margin-left:75%}.column.is-offset-two-thirds-widescreen{margin-left:66.6666%}.column.is-offset-half-widescreen{margin-left:50%}.column.is-offset-one-third-widescreen{margin-left:33.3333%}.column.is-offset-one-quarter-widescreen{margin-left:25%}.column.is-offset-one-fifth-widescreen{margin-left:20%}.column.is-offset-two-fifths-widescreen{margin-left:40%}.column.is-offset-three-fifths-widescreen{margin-left:60%}.column.is-offset-four-fifths-widescreen{margin-left:80%}.column.is-0-widescreen{flex:none;width:0%}.column.is-offset-0-widescreen{margin-left:0%}.column.is-1-widescreen{flex:none;width:8.33333337%}.column.is-offset-1-widescreen{margin-left:8.33333337%}.column.is-2-widescreen{flex:none;width:16.66666674%}.column.is-offset-2-widescreen{margin-left:16.66666674%}.column.is-3-widescreen{flex:none;width:25%}.column.is-offset-3-widescreen{margin-left:25%}.column.is-4-widescreen{flex:none;width:33.33333337%}.column.is-offset-4-widescreen{margin-left:33.33333337%}.column.is-5-widescreen{flex:none;width:41.66666674%}.column.is-offset-5-widescreen{margin-left:41.66666674%}.column.is-6-widescreen{flex:none;width:50%}.column.is-offset-6-widescreen{margin-left:50%}.column.is-7-widescreen{flex:none;width:58.33333337%}.column.is-offset-7-widescreen{margin-left:58.33333337%}.column.is-8-widescreen{flex:none;width:66.66666674%}.column.is-offset-8-widescreen{margin-left:66.66666674%}.column.is-9-widescreen{flex:none;width:75%}.column.is-offset-9-widescreen{margin-left:75%}.column.is-10-widescreen{flex:none;width:83.33333337%}.column.is-offset-10-widescreen{margin-left:83.33333337%}.column.is-11-widescreen{flex:none;width:91.66666674%}.column.is-offset-11-widescreen{margin-left:91.66666674%}.column.is-12-widescreen{flex:none;width:100%}.column.is-offset-12-widescreen{margin-left:100%}}@media screen and (min-width: 1408px){.column.is-narrow-fullhd{flex:none;width:unset}.column.is-full-fullhd{flex:none;width:100%}.column.is-three-quarters-fullhd{flex:none;width:75%}.column.is-two-thirds-fullhd{flex:none;width:66.6666%}.column.is-half-fullhd{flex:none;width:50%}.column.is-one-third-fullhd{flex:none;width:33.3333%}.column.is-one-quarter-fullhd{flex:none;width:25%}.column.is-one-fifth-fullhd{flex:none;width:20%}.column.is-two-fifths-fullhd{flex:none;width:40%}.column.is-three-fifths-fullhd{flex:none;width:60%}.column.is-four-fifths-fullhd{flex:none;width:80%}.column.is-offset-three-quarters-fullhd{margin-left:75%}.column.is-offset-two-thirds-fullhd{margin-left:66.6666%}.column.is-offset-half-fullhd{margin-left:50%}.column.is-offset-one-third-fullhd{margin-left:33.3333%}.column.is-offset-one-quarter-fullhd{margin-left:25%}.column.is-offset-one-fifth-fullhd{margin-left:20%}.column.is-offset-two-fifths-fullhd{margin-left:40%}.column.is-offset-three-fifths-fullhd{margin-left:60%}.column.is-offset-four-fifths-fullhd{margin-left:80%}.column.is-0-fullhd{flex:none;width:0%}.column.is-offset-0-fullhd{margin-left:0%}.column.is-1-fullhd{flex:none;width:8.33333337%}.column.is-offset-1-fullhd{margin-left:8.33333337%}.column.is-2-fullhd{flex:none;width:16.66666674%}.column.is-offset-2-fullhd{margin-left:16.66666674%}.column.is-3-fullhd{flex:none;width:25%}.column.is-offset-3-fullhd{margin-left:25%}.column.is-4-fullhd{flex:none;width:33.33333337%}.column.is-offset-4-fullhd{margin-left:33.33333337%}.column.is-5-fullhd{flex:none;width:41.66666674%}.column.is-offset-5-fullhd{margin-left:41.66666674%}.column.is-6-fullhd{flex:none;width:50%}.column.is-offset-6-fullhd{margin-left:50%}.column.is-7-fullhd{flex:none;width:58.33333337%}.column.is-offset-7-fullhd{margin-left:58.33333337%}.column.is-8-fullhd{flex:none;width:66.66666674%}.column.is-offset-8-fullhd{margin-left:66.66666674%}.column.is-9-fullhd{flex:none;width:75%}.column.is-offset-9-fullhd{margin-left:75%}.column.is-10-fullhd{flex:none;width:83.33333337%}.column.is-offset-10-fullhd{margin-left:83.33333337%}.column.is-11-fullhd{flex:none;width:91.66666674%}.column.is-offset-11-fullhd{margin-left:91.66666674%}.column.is-12-fullhd{flex:none;width:100%}.column.is-offset-12-fullhd{margin-left:100%}}.columns{margin-left:-.75rem;margin-right:-.75rem;margin-top:-.75rem}.columns:last-child{margin-bottom:-.75rem}.columns:not(:last-child){margin-bottom:calc(1.5rem - .75rem)}.columns.is-centered{justify-content:center}.columns.is-gapless{margin-left:0;margin-right:0;margin-top:0}.columns.is-gapless>.column{margin:0;padding:0 !important}.columns.is-gapless:not(:last-child){margin-bottom:1.5rem}.columns.is-gapless:last-child{margin-bottom:0}.columns.is-mobile{display:flex}.columns.is-multiline{flex-wrap:wrap}.columns.is-vcentered{align-items:center}@media screen and (min-width: 769px),print{.columns:not(.is-desktop){display:flex}}@media screen and (min-width: 1056px){.columns.is-desktop{display:flex}}.columns.is-variable{--columnGap: 0.75rem;margin-left:calc(-1 * var(--columnGap));margin-right:calc(-1 * var(--columnGap))}.columns.is-variable>.column{padding-left:var(--columnGap);padding-right:var(--columnGap)}.columns.is-variable.is-0{--columnGap: 0rem}@media screen and (max-width: 768px){.columns.is-variable.is-0-mobile{--columnGap: 0rem}}@media screen and (min-width: 769px),print{.columns.is-variable.is-0-tablet{--columnGap: 0rem}}@media screen and (min-width: 769px) and (max-width: 1055px){.columns.is-variable.is-0-tablet-only{--columnGap: 0rem}}@media screen and (max-width: 1055px){.columns.is-variable.is-0-touch{--columnGap: 0rem}}@media screen and (min-width: 1056px){.columns.is-variable.is-0-desktop{--columnGap: 0rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){.columns.is-variable.is-0-desktop-only{--columnGap: 0rem}}@media screen and (min-width: 1216px){.columns.is-variable.is-0-widescreen{--columnGap: 0rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){.columns.is-variable.is-0-widescreen-only{--columnGap: 0rem}}@media screen and (min-width: 1408px){.columns.is-variable.is-0-fullhd{--columnGap: 0rem}}.columns.is-variable.is-1{--columnGap: .25rem}@media screen and (max-width: 768px){.columns.is-variable.is-1-mobile{--columnGap: .25rem}}@media screen and (min-width: 769px),print{.columns.is-variable.is-1-tablet{--columnGap: .25rem}}@media screen and (min-width: 769px) and (max-width: 1055px){.columns.is-variable.is-1-tablet-only{--columnGap: .25rem}}@media screen and (max-width: 1055px){.columns.is-variable.is-1-touch{--columnGap: .25rem}}@media screen and (min-width: 1056px){.columns.is-variable.is-1-desktop{--columnGap: .25rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){.columns.is-variable.is-1-desktop-only{--columnGap: .25rem}}@media screen and (min-width: 1216px){.columns.is-variable.is-1-widescreen{--columnGap: .25rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){.columns.is-variable.is-1-widescreen-only{--columnGap: .25rem}}@media screen and (min-width: 1408px){.columns.is-variable.is-1-fullhd{--columnGap: .25rem}}.columns.is-variable.is-2{--columnGap: .5rem}@media screen and (max-width: 768px){.columns.is-variable.is-2-mobile{--columnGap: .5rem}}@media screen and (min-width: 769px),print{.columns.is-variable.is-2-tablet{--columnGap: .5rem}}@media screen and (min-width: 769px) and (max-width: 1055px){.columns.is-variable.is-2-tablet-only{--columnGap: .5rem}}@media screen and (max-width: 1055px){.columns.is-variable.is-2-touch{--columnGap: .5rem}}@media screen and (min-width: 1056px){.columns.is-variable.is-2-desktop{--columnGap: .5rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){.columns.is-variable.is-2-desktop-only{--columnGap: .5rem}}@media screen and (min-width: 1216px){.columns.is-variable.is-2-widescreen{--columnGap: .5rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){.columns.is-variable.is-2-widescreen-only{--columnGap: .5rem}}@media screen and (min-width: 1408px){.columns.is-variable.is-2-fullhd{--columnGap: .5rem}}.columns.is-variable.is-3{--columnGap: .75rem}@media screen and (max-width: 768px){.columns.is-variable.is-3-mobile{--columnGap: .75rem}}@media screen and (min-width: 769px),print{.columns.is-variable.is-3-tablet{--columnGap: .75rem}}@media screen and (min-width: 769px) and (max-width: 1055px){.columns.is-variable.is-3-tablet-only{--columnGap: .75rem}}@media screen and (max-width: 1055px){.columns.is-variable.is-3-touch{--columnGap: .75rem}}@media screen and (min-width: 1056px){.columns.is-variable.is-3-desktop{--columnGap: .75rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){.columns.is-variable.is-3-desktop-only{--columnGap: .75rem}}@media screen and (min-width: 1216px){.columns.is-variable.is-3-widescreen{--columnGap: .75rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){.columns.is-variable.is-3-widescreen-only{--columnGap: .75rem}}@media screen and (min-width: 1408px){.columns.is-variable.is-3-fullhd{--columnGap: .75rem}}.columns.is-variable.is-4{--columnGap: 1rem}@media screen and (max-width: 768px){.columns.is-variable.is-4-mobile{--columnGap: 1rem}}@media screen and (min-width: 769px),print{.columns.is-variable.is-4-tablet{--columnGap: 1rem}}@media screen and (min-width: 769px) and (max-width: 1055px){.columns.is-variable.is-4-tablet-only{--columnGap: 1rem}}@media screen and (max-width: 1055px){.columns.is-variable.is-4-touch{--columnGap: 1rem}}@media screen and (min-width: 1056px){.columns.is-variable.is-4-desktop{--columnGap: 1rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){.columns.is-variable.is-4-desktop-only{--columnGap: 1rem}}@media screen and (min-width: 1216px){.columns.is-variable.is-4-widescreen{--columnGap: 1rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){.columns.is-variable.is-4-widescreen-only{--columnGap: 1rem}}@media screen and (min-width: 1408px){.columns.is-variable.is-4-fullhd{--columnGap: 1rem}}.columns.is-variable.is-5{--columnGap: 1.25rem}@media screen and (max-width: 768px){.columns.is-variable.is-5-mobile{--columnGap: 1.25rem}}@media screen and (min-width: 769px),print{.columns.is-variable.is-5-tablet{--columnGap: 1.25rem}}@media screen and (min-width: 769px) and (max-width: 1055px){.columns.is-variable.is-5-tablet-only{--columnGap: 1.25rem}}@media screen and (max-width: 1055px){.columns.is-variable.is-5-touch{--columnGap: 1.25rem}}@media screen and (min-width: 1056px){.columns.is-variable.is-5-desktop{--columnGap: 1.25rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){.columns.is-variable.is-5-desktop-only{--columnGap: 1.25rem}}@media screen and (min-width: 1216px){.columns.is-variable.is-5-widescreen{--columnGap: 1.25rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){.columns.is-variable.is-5-widescreen-only{--columnGap: 1.25rem}}@media screen and (min-width: 1408px){.columns.is-variable.is-5-fullhd{--columnGap: 1.25rem}}.columns.is-variable.is-6{--columnGap: 1.5rem}@media screen and (max-width: 768px){.columns.is-variable.is-6-mobile{--columnGap: 1.5rem}}@media screen and (min-width: 769px),print{.columns.is-variable.is-6-tablet{--columnGap: 1.5rem}}@media screen and (min-width: 769px) and (max-width: 1055px){.columns.is-variable.is-6-tablet-only{--columnGap: 1.5rem}}@media screen and (max-width: 1055px){.columns.is-variable.is-6-touch{--columnGap: 1.5rem}}@media screen and (min-width: 1056px){.columns.is-variable.is-6-desktop{--columnGap: 1.5rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){.columns.is-variable.is-6-desktop-only{--columnGap: 1.5rem}}@media screen and (min-width: 1216px){.columns.is-variable.is-6-widescreen{--columnGap: 1.5rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){.columns.is-variable.is-6-widescreen-only{--columnGap: 1.5rem}}@media screen and (min-width: 1408px){.columns.is-variable.is-6-fullhd{--columnGap: 1.5rem}}.columns.is-variable.is-7{--columnGap: 1.75rem}@media screen and (max-width: 768px){.columns.is-variable.is-7-mobile{--columnGap: 1.75rem}}@media screen and (min-width: 769px),print{.columns.is-variable.is-7-tablet{--columnGap: 1.75rem}}@media screen and (min-width: 769px) and (max-width: 1055px){.columns.is-variable.is-7-tablet-only{--columnGap: 1.75rem}}@media screen and (max-width: 1055px){.columns.is-variable.is-7-touch{--columnGap: 1.75rem}}@media screen and (min-width: 1056px){.columns.is-variable.is-7-desktop{--columnGap: 1.75rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){.columns.is-variable.is-7-desktop-only{--columnGap: 1.75rem}}@media screen and (min-width: 1216px){.columns.is-variable.is-7-widescreen{--columnGap: 1.75rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){.columns.is-variable.is-7-widescreen-only{--columnGap: 1.75rem}}@media screen and (min-width: 1408px){.columns.is-variable.is-7-fullhd{--columnGap: 1.75rem}}.columns.is-variable.is-8{--columnGap: 2rem}@media screen and (max-width: 768px){.columns.is-variable.is-8-mobile{--columnGap: 2rem}}@media screen and (min-width: 769px),print{.columns.is-variable.is-8-tablet{--columnGap: 2rem}}@media screen and (min-width: 769px) and (max-width: 1055px){.columns.is-variable.is-8-tablet-only{--columnGap: 2rem}}@media screen and (max-width: 1055px){.columns.is-variable.is-8-touch{--columnGap: 2rem}}@media screen and (min-width: 1056px){.columns.is-variable.is-8-desktop{--columnGap: 2rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){.columns.is-variable.is-8-desktop-only{--columnGap: 2rem}}@media screen and (min-width: 1216px){.columns.is-variable.is-8-widescreen{--columnGap: 2rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){.columns.is-variable.is-8-widescreen-only{--columnGap: 2rem}}@media screen and (min-width: 1408px){.columns.is-variable.is-8-fullhd{--columnGap: 2rem}}.tile{align-items:stretch;display:block;flex-basis:0;flex-grow:1;flex-shrink:1;min-height:min-content}.tile.is-ancestor{margin-left:-.75rem;margin-right:-.75rem;margin-top:-.75rem}.tile.is-ancestor:last-child{margin-bottom:-.75rem}.tile.is-ancestor:not(:last-child){margin-bottom:.75rem}.tile.is-child{margin:0 !important}.tile.is-parent{padding:.75rem}.tile.is-vertical{flex-direction:column}.tile.is-vertical>.tile.is-child:not(:last-child){margin-bottom:1.5rem !important}@media screen and (min-width: 769px),print{.tile:not(.is-child){display:flex}.tile.is-1{flex:none;width:8.33333337%}.tile.is-2{flex:none;width:16.66666674%}.tile.is-3{flex:none;width:25%}.tile.is-4{flex:none;width:33.33333337%}.tile.is-5{flex:none;width:41.66666674%}.tile.is-6{flex:none;width:50%}.tile.is-7{flex:none;width:58.33333337%}.tile.is-8{flex:none;width:66.66666674%}.tile.is-9{flex:none;width:75%}.tile.is-10{flex:none;width:83.33333337%}.tile.is-11{flex:none;width:91.66666674%}.tile.is-12{flex:none;width:100%}}.hero{align-items:stretch;display:flex;flex-direction:column;justify-content:space-between}.hero .navbar{background:none}.hero .tabs ul{border-bottom:none}.hero.is-white{background-color:#fff;color:#0a0a0a}.hero.is-white a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-white strong{color:inherit}.hero.is-white .title{color:#0a0a0a}.hero.is-white .subtitle{color:rgba(10,10,10,0.9)}.hero.is-white .subtitle a:not(.button),.hero.is-white .subtitle strong{color:#0a0a0a}@media screen and (max-width: 1055px){.hero.is-white .navbar-menu{background-color:#fff}}.hero.is-white .navbar-item,.hero.is-white .navbar-link{color:rgba(10,10,10,0.7)}.hero.is-white a.navbar-item:hover,.hero.is-white a.navbar-item.is-active,.hero.is-white .navbar-link:hover,.hero.is-white .navbar-link.is-active{background-color:#f2f2f2;color:#0a0a0a}.hero.is-white .tabs a{color:#0a0a0a;opacity:0.9}.hero.is-white .tabs a:hover{opacity:1}.hero.is-white .tabs li.is-active a{color:#fff !important;opacity:1}.hero.is-white .tabs.is-boxed a,.hero.is-white .tabs.is-toggle a{color:#0a0a0a}.hero.is-white .tabs.is-boxed a:hover,.hero.is-white .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}.hero.is-white .tabs.is-boxed li.is-active a,.hero.is-white .tabs.is-boxed li.is-active a:hover,.hero.is-white .tabs.is-toggle li.is-active a,.hero.is-white .tabs.is-toggle li.is-active a:hover{background-color:#0a0a0a;border-color:#0a0a0a;color:#fff}.hero.is-white.is-bold{background-image:linear-gradient(141deg, #e8e3e4 0%, #fff 71%, #fff 100%)}@media screen and (max-width: 768px){.hero.is-white.is-bold .navbar-menu{background-image:linear-gradient(141deg, #e8e3e4 0%, #fff 71%, #fff 100%)}}.hero.is-black{background-color:#0a0a0a;color:#fff}.hero.is-black a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-black strong{color:inherit}.hero.is-black .title{color:#fff}.hero.is-black .subtitle{color:rgba(255,255,255,0.9)}.hero.is-black .subtitle a:not(.button),.hero.is-black .subtitle strong{color:#fff}@media screen and (max-width: 1055px){.hero.is-black .navbar-menu{background-color:#0a0a0a}}.hero.is-black .navbar-item,.hero.is-black .navbar-link{color:rgba(255,255,255,0.7)}.hero.is-black a.navbar-item:hover,.hero.is-black a.navbar-item.is-active,.hero.is-black .navbar-link:hover,.hero.is-black .navbar-link.is-active{background-color:#000;color:#fff}.hero.is-black .tabs a{color:#fff;opacity:0.9}.hero.is-black .tabs a:hover{opacity:1}.hero.is-black .tabs li.is-active a{color:#0a0a0a !important;opacity:1}.hero.is-black .tabs.is-boxed a,.hero.is-black .tabs.is-toggle a{color:#fff}.hero.is-black .tabs.is-boxed a:hover,.hero.is-black .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}.hero.is-black .tabs.is-boxed li.is-active a,.hero.is-black .tabs.is-boxed li.is-active a:hover,.hero.is-black .tabs.is-toggle li.is-active a,.hero.is-black .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#0a0a0a}.hero.is-black.is-bold{background-image:linear-gradient(141deg, #000 0%, #0a0a0a 71%, #181616 100%)}@media screen and (max-width: 768px){.hero.is-black.is-bold .navbar-menu{background-image:linear-gradient(141deg, #000 0%, #0a0a0a 71%, #181616 100%)}}.hero.is-light{background-color:#f5f5f5;color:rgba(0,0,0,0.7)}.hero.is-light a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-light strong{color:inherit}.hero.is-light .title{color:rgba(0,0,0,0.7)}.hero.is-light .subtitle{color:rgba(0,0,0,0.9)}.hero.is-light .subtitle a:not(.button),.hero.is-light .subtitle strong{color:rgba(0,0,0,0.7)}@media screen and (max-width: 1055px){.hero.is-light .navbar-menu{background-color:#f5f5f5}}.hero.is-light .navbar-item,.hero.is-light .navbar-link{color:rgba(0,0,0,0.7)}.hero.is-light a.navbar-item:hover,.hero.is-light a.navbar-item.is-active,.hero.is-light .navbar-link:hover,.hero.is-light .navbar-link.is-active{background-color:#e8e8e8;color:rgba(0,0,0,0.7)}.hero.is-light .tabs a{color:rgba(0,0,0,0.7);opacity:0.9}.hero.is-light .tabs a:hover{opacity:1}.hero.is-light .tabs li.is-active a{color:#f5f5f5 !important;opacity:1}.hero.is-light .tabs.is-boxed a,.hero.is-light .tabs.is-toggle a{color:rgba(0,0,0,0.7)}.hero.is-light .tabs.is-boxed a:hover,.hero.is-light .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}.hero.is-light .tabs.is-boxed li.is-active a,.hero.is-light .tabs.is-boxed li.is-active a:hover,.hero.is-light .tabs.is-toggle li.is-active a,.hero.is-light .tabs.is-toggle li.is-active a:hover{background-color:rgba(0,0,0,0.7);border-color:rgba(0,0,0,0.7);color:#f5f5f5}.hero.is-light.is-bold{background-image:linear-gradient(141deg, #dfd8d9 0%, #f5f5f5 71%, #fff 100%)}@media screen and (max-width: 768px){.hero.is-light.is-bold .navbar-menu{background-image:linear-gradient(141deg, #dfd8d9 0%, #f5f5f5 71%, #fff 100%)}}.hero.is-dark,.content kbd.hero{background-color:#363636;color:#fff}.hero.is-dark a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.content kbd.hero a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-dark strong,.content kbd.hero strong{color:inherit}.hero.is-dark .title,.content kbd.hero .title{color:#fff}.hero.is-dark .subtitle,.content kbd.hero .subtitle{color:rgba(255,255,255,0.9)}.hero.is-dark .subtitle a:not(.button),.content kbd.hero .subtitle a:not(.button),.hero.is-dark .subtitle strong,.content kbd.hero .subtitle strong{color:#fff}@media screen and (max-width: 1055px){.hero.is-dark .navbar-menu,.content kbd.hero .navbar-menu{background-color:#363636}}.hero.is-dark .navbar-item,.content kbd.hero .navbar-item,.hero.is-dark .navbar-link,.content kbd.hero .navbar-link{color:rgba(255,255,255,0.7)}.hero.is-dark a.navbar-item:hover,.content kbd.hero a.navbar-item:hover,.hero.is-dark a.navbar-item.is-active,.content kbd.hero a.navbar-item.is-active,.hero.is-dark .navbar-link:hover,.content kbd.hero .navbar-link:hover,.hero.is-dark .navbar-link.is-active,.content kbd.hero .navbar-link.is-active{background-color:#292929;color:#fff}.hero.is-dark .tabs a,.content kbd.hero .tabs a{color:#fff;opacity:0.9}.hero.is-dark .tabs a:hover,.content kbd.hero .tabs a:hover{opacity:1}.hero.is-dark .tabs li.is-active a,.content kbd.hero .tabs li.is-active a{color:#363636 !important;opacity:1}.hero.is-dark .tabs.is-boxed a,.content kbd.hero .tabs.is-boxed a,.hero.is-dark .tabs.is-toggle a,.content kbd.hero .tabs.is-toggle a{color:#fff}.hero.is-dark .tabs.is-boxed a:hover,.content kbd.hero .tabs.is-boxed a:hover,.hero.is-dark .tabs.is-toggle a:hover,.content kbd.hero .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}.hero.is-dark .tabs.is-boxed li.is-active a,.content kbd.hero .tabs.is-boxed li.is-active a,.hero.is-dark .tabs.is-boxed li.is-active a:hover,.hero.is-dark .tabs.is-toggle li.is-active a,.content kbd.hero .tabs.is-toggle li.is-active a,.hero.is-dark .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#363636}.hero.is-dark.is-bold,.content kbd.hero.is-bold{background-image:linear-gradient(141deg, #1f191a 0%, #363636 71%, #46403f 100%)}@media screen and (max-width: 768px){.hero.is-dark.is-bold .navbar-menu,.content kbd.hero.is-bold .navbar-menu{background-image:linear-gradient(141deg, #1f191a 0%, #363636 71%, #46403f 100%)}}.hero.is-primary,.docstring>section>a.hero.docs-sourcelink{background-color:#4eb5de;color:#fff}.hero.is-primary a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.docstring>section>a.hero.docs-sourcelink a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-primary strong,.docstring>section>a.hero.docs-sourcelink strong{color:inherit}.hero.is-primary .title,.docstring>section>a.hero.docs-sourcelink .title{color:#fff}.hero.is-primary .subtitle,.docstring>section>a.hero.docs-sourcelink .subtitle{color:rgba(255,255,255,0.9)}.hero.is-primary .subtitle a:not(.button),.docstring>section>a.hero.docs-sourcelink .subtitle a:not(.button),.hero.is-primary .subtitle strong,.docstring>section>a.hero.docs-sourcelink .subtitle strong{color:#fff}@media screen and (max-width: 1055px){.hero.is-primary .navbar-menu,.docstring>section>a.hero.docs-sourcelink .navbar-menu{background-color:#4eb5de}}.hero.is-primary .navbar-item,.docstring>section>a.hero.docs-sourcelink .navbar-item,.hero.is-primary .navbar-link,.docstring>section>a.hero.docs-sourcelink .navbar-link{color:rgba(255,255,255,0.7)}.hero.is-primary a.navbar-item:hover,.docstring>section>a.hero.docs-sourcelink a.navbar-item:hover,.hero.is-primary a.navbar-item.is-active,.docstring>section>a.hero.docs-sourcelink a.navbar-item.is-active,.hero.is-primary .navbar-link:hover,.docstring>section>a.hero.docs-sourcelink .navbar-link:hover,.hero.is-primary .navbar-link.is-active,.docstring>section>a.hero.docs-sourcelink .navbar-link.is-active{background-color:#39acda;color:#fff}.hero.is-primary .tabs a,.docstring>section>a.hero.docs-sourcelink .tabs a{color:#fff;opacity:0.9}.hero.is-primary .tabs a:hover,.docstring>section>a.hero.docs-sourcelink .tabs a:hover{opacity:1}.hero.is-primary .tabs li.is-active a,.docstring>section>a.hero.docs-sourcelink .tabs li.is-active a{color:#4eb5de !important;opacity:1}.hero.is-primary .tabs.is-boxed a,.docstring>section>a.hero.docs-sourcelink .tabs.is-boxed a,.hero.is-primary .tabs.is-toggle a,.docstring>section>a.hero.docs-sourcelink .tabs.is-toggle a{color:#fff}.hero.is-primary .tabs.is-boxed a:hover,.docstring>section>a.hero.docs-sourcelink .tabs.is-boxed a:hover,.hero.is-primary .tabs.is-toggle a:hover,.docstring>section>a.hero.docs-sourcelink .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}.hero.is-primary .tabs.is-boxed li.is-active a,.docstring>section>a.hero.docs-sourcelink .tabs.is-boxed li.is-active a,.hero.is-primary .tabs.is-boxed li.is-active a:hover,.hero.is-primary .tabs.is-toggle li.is-active a,.docstring>section>a.hero.docs-sourcelink .tabs.is-toggle li.is-active a,.hero.is-primary .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#4eb5de}.hero.is-primary.is-bold,.docstring>section>a.hero.is-bold.docs-sourcelink{background-image:linear-gradient(141deg, #1bc7de 0%, #4eb5de 71%, #5fa9e7 100%)}@media screen and (max-width: 768px){.hero.is-primary.is-bold .navbar-menu,.docstring>section>a.hero.is-bold.docs-sourcelink .navbar-menu{background-image:linear-gradient(141deg, #1bc7de 0%, #4eb5de 71%, #5fa9e7 100%)}}.hero.is-link{background-color:#2e63b8;color:#fff}.hero.is-link a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-link strong{color:inherit}.hero.is-link .title{color:#fff}.hero.is-link .subtitle{color:rgba(255,255,255,0.9)}.hero.is-link .subtitle a:not(.button),.hero.is-link .subtitle strong{color:#fff}@media screen and (max-width: 1055px){.hero.is-link .navbar-menu{background-color:#2e63b8}}.hero.is-link .navbar-item,.hero.is-link .navbar-link{color:rgba(255,255,255,0.7)}.hero.is-link a.navbar-item:hover,.hero.is-link a.navbar-item.is-active,.hero.is-link .navbar-link:hover,.hero.is-link .navbar-link.is-active{background-color:#2958a4;color:#fff}.hero.is-link .tabs a{color:#fff;opacity:0.9}.hero.is-link .tabs a:hover{opacity:1}.hero.is-link .tabs li.is-active a{color:#2e63b8 !important;opacity:1}.hero.is-link .tabs.is-boxed a,.hero.is-link .tabs.is-toggle a{color:#fff}.hero.is-link .tabs.is-boxed a:hover,.hero.is-link .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}.hero.is-link .tabs.is-boxed li.is-active a,.hero.is-link .tabs.is-boxed li.is-active a:hover,.hero.is-link .tabs.is-toggle li.is-active a,.hero.is-link .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#2e63b8}.hero.is-link.is-bold{background-image:linear-gradient(141deg, #1b6098 0%, #2e63b8 71%, #2d51d2 100%)}@media screen and (max-width: 768px){.hero.is-link.is-bold .navbar-menu{background-image:linear-gradient(141deg, #1b6098 0%, #2e63b8 71%, #2d51d2 100%)}}.hero.is-info{background-color:#209cee;color:#fff}.hero.is-info a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-info strong{color:inherit}.hero.is-info .title{color:#fff}.hero.is-info .subtitle{color:rgba(255,255,255,0.9)}.hero.is-info .subtitle a:not(.button),.hero.is-info .subtitle strong{color:#fff}@media screen and (max-width: 1055px){.hero.is-info .navbar-menu{background-color:#209cee}}.hero.is-info .navbar-item,.hero.is-info .navbar-link{color:rgba(255,255,255,0.7)}.hero.is-info a.navbar-item:hover,.hero.is-info a.navbar-item.is-active,.hero.is-info .navbar-link:hover,.hero.is-info .navbar-link.is-active{background-color:#1190e3;color:#fff}.hero.is-info .tabs a{color:#fff;opacity:0.9}.hero.is-info .tabs a:hover{opacity:1}.hero.is-info .tabs li.is-active a{color:#209cee !important;opacity:1}.hero.is-info .tabs.is-boxed a,.hero.is-info .tabs.is-toggle a{color:#fff}.hero.is-info .tabs.is-boxed a:hover,.hero.is-info .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}.hero.is-info .tabs.is-boxed li.is-active a,.hero.is-info .tabs.is-boxed li.is-active a:hover,.hero.is-info .tabs.is-toggle li.is-active a,.hero.is-info .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#209cee}.hero.is-info.is-bold{background-image:linear-gradient(141deg, #05a6d6 0%, #209cee 71%, #3287f5 100%)}@media screen and (max-width: 768px){.hero.is-info.is-bold .navbar-menu{background-image:linear-gradient(141deg, #05a6d6 0%, #209cee 71%, #3287f5 100%)}}.hero.is-success{background-color:#22c35b;color:#fff}.hero.is-success a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-success strong{color:inherit}.hero.is-success .title{color:#fff}.hero.is-success .subtitle{color:rgba(255,255,255,0.9)}.hero.is-success .subtitle a:not(.button),.hero.is-success .subtitle strong{color:#fff}@media screen and (max-width: 1055px){.hero.is-success .navbar-menu{background-color:#22c35b}}.hero.is-success .navbar-item,.hero.is-success .navbar-link{color:rgba(255,255,255,0.7)}.hero.is-success a.navbar-item:hover,.hero.is-success a.navbar-item.is-active,.hero.is-success .navbar-link:hover,.hero.is-success .navbar-link.is-active{background-color:#1ead51;color:#fff}.hero.is-success .tabs a{color:#fff;opacity:0.9}.hero.is-success .tabs a:hover{opacity:1}.hero.is-success .tabs li.is-active a{color:#22c35b !important;opacity:1}.hero.is-success .tabs.is-boxed a,.hero.is-success .tabs.is-toggle a{color:#fff}.hero.is-success .tabs.is-boxed a:hover,.hero.is-success .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}.hero.is-success .tabs.is-boxed li.is-active a,.hero.is-success .tabs.is-boxed li.is-active a:hover,.hero.is-success .tabs.is-toggle li.is-active a,.hero.is-success .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#22c35b}.hero.is-success.is-bold{background-image:linear-gradient(141deg, #12a02c 0%, #22c35b 71%, #1fdf83 100%)}@media screen and (max-width: 768px){.hero.is-success.is-bold .navbar-menu{background-image:linear-gradient(141deg, #12a02c 0%, #22c35b 71%, #1fdf83 100%)}}.hero.is-warning{background-color:#ffdd57;color:rgba(0,0,0,0.7)}.hero.is-warning a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-warning strong{color:inherit}.hero.is-warning .title{color:rgba(0,0,0,0.7)}.hero.is-warning .subtitle{color:rgba(0,0,0,0.9)}.hero.is-warning .subtitle a:not(.button),.hero.is-warning .subtitle strong{color:rgba(0,0,0,0.7)}@media screen and (max-width: 1055px){.hero.is-warning .navbar-menu{background-color:#ffdd57}}.hero.is-warning .navbar-item,.hero.is-warning .navbar-link{color:rgba(0,0,0,0.7)}.hero.is-warning a.navbar-item:hover,.hero.is-warning a.navbar-item.is-active,.hero.is-warning .navbar-link:hover,.hero.is-warning .navbar-link.is-active{background-color:#ffd83e;color:rgba(0,0,0,0.7)}.hero.is-warning .tabs a{color:rgba(0,0,0,0.7);opacity:0.9}.hero.is-warning .tabs a:hover{opacity:1}.hero.is-warning .tabs li.is-active a{color:#ffdd57 !important;opacity:1}.hero.is-warning .tabs.is-boxed a,.hero.is-warning .tabs.is-toggle a{color:rgba(0,0,0,0.7)}.hero.is-warning .tabs.is-boxed a:hover,.hero.is-warning .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}.hero.is-warning .tabs.is-boxed li.is-active a,.hero.is-warning .tabs.is-boxed li.is-active a:hover,.hero.is-warning .tabs.is-toggle li.is-active a,.hero.is-warning .tabs.is-toggle li.is-active a:hover{background-color:rgba(0,0,0,0.7);border-color:rgba(0,0,0,0.7);color:#ffdd57}.hero.is-warning.is-bold{background-image:linear-gradient(141deg, #ffae24 0%, #ffdd57 71%, #fffa71 100%)}@media screen and (max-width: 768px){.hero.is-warning.is-bold .navbar-menu{background-image:linear-gradient(141deg, #ffae24 0%, #ffdd57 71%, #fffa71 100%)}}.hero.is-danger{background-color:#da0b00;color:#fff}.hero.is-danger a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-danger strong{color:inherit}.hero.is-danger .title{color:#fff}.hero.is-danger .subtitle{color:rgba(255,255,255,0.9)}.hero.is-danger .subtitle a:not(.button),.hero.is-danger .subtitle strong{color:#fff}@media screen and (max-width: 1055px){.hero.is-danger .navbar-menu{background-color:#da0b00}}.hero.is-danger .navbar-item,.hero.is-danger .navbar-link{color:rgba(255,255,255,0.7)}.hero.is-danger a.navbar-item:hover,.hero.is-danger a.navbar-item.is-active,.hero.is-danger .navbar-link:hover,.hero.is-danger .navbar-link.is-active{background-color:#c10a00;color:#fff}.hero.is-danger .tabs a{color:#fff;opacity:0.9}.hero.is-danger .tabs a:hover{opacity:1}.hero.is-danger .tabs li.is-active a{color:#da0b00 !important;opacity:1}.hero.is-danger .tabs.is-boxed a,.hero.is-danger .tabs.is-toggle a{color:#fff}.hero.is-danger .tabs.is-boxed a:hover,.hero.is-danger .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}.hero.is-danger .tabs.is-boxed li.is-active a,.hero.is-danger .tabs.is-boxed li.is-active a:hover,.hero.is-danger .tabs.is-toggle li.is-active a,.hero.is-danger .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#da0b00}.hero.is-danger.is-bold{background-image:linear-gradient(141deg, #a70013 0%, #da0b00 71%, #f43500 100%)}@media screen and (max-width: 768px){.hero.is-danger.is-bold .navbar-menu{background-image:linear-gradient(141deg, #a70013 0%, #da0b00 71%, #f43500 100%)}}.hero.is-small .hero-body,#documenter .docs-sidebar form.docs-search>input.hero .hero-body{padding:1.5rem}@media screen and (min-width: 769px),print{.hero.is-medium .hero-body{padding:9rem 4.5rem}}@media screen and (min-width: 769px),print{.hero.is-large .hero-body{padding:18rem 6rem}}.hero.is-halfheight .hero-body,.hero.is-fullheight .hero-body,.hero.is-fullheight-with-navbar .hero-body{align-items:center;display:flex}.hero.is-halfheight .hero-body>.container,.hero.is-fullheight .hero-body>.container,.hero.is-fullheight-with-navbar .hero-body>.container{flex-grow:1;flex-shrink:1}.hero.is-halfheight{min-height:50vh}.hero.is-fullheight{min-height:100vh}.hero-video{overflow:hidden}.hero-video video{left:50%;min-height:100%;min-width:100%;position:absolute;top:50%;transform:translate3d(-50%, -50%, 0)}.hero-video.is-transparent{opacity:0.3}@media screen and (max-width: 768px){.hero-video{display:none}}.hero-buttons{margin-top:1.5rem}@media screen and (max-width: 768px){.hero-buttons .button{display:flex}.hero-buttons .button:not(:last-child){margin-bottom:0.75rem}}@media screen and (min-width: 769px),print{.hero-buttons{display:flex;justify-content:center}.hero-buttons .button:not(:last-child){margin-right:1.5rem}}.hero-head,.hero-foot{flex-grow:0;flex-shrink:0}.hero-body{flex-grow:1;flex-shrink:0;padding:3rem 1.5rem}@media screen and (min-width: 769px),print{.hero-body{padding:3rem 3rem}}.section{padding:3rem 1.5rem}@media screen and (min-width: 1056px){.section{padding:3rem 3rem}.section.is-medium{padding:9rem 4.5rem}.section.is-large{padding:18rem 6rem}}.footer{background-color:#fafafa;padding:3rem 1.5rem 6rem}h1 .docs-heading-anchor,h1 .docs-heading-anchor:hover,h1 .docs-heading-anchor:visited,h2 .docs-heading-anchor,h2 .docs-heading-anchor:hover,h2 .docs-heading-anchor:visited,h3 .docs-heading-anchor,h3 .docs-heading-anchor:hover,h3 .docs-heading-anchor:visited,h4 .docs-heading-anchor,h4 .docs-heading-anchor:hover,h4 .docs-heading-anchor:visited,h5 .docs-heading-anchor,h5 .docs-heading-anchor:hover,h5 .docs-heading-anchor:visited,h6 .docs-heading-anchor,h6 .docs-heading-anchor:hover,h6 .docs-heading-anchor:visited{color:#222}h1 .docs-heading-anchor-permalink,h2 .docs-heading-anchor-permalink,h3 .docs-heading-anchor-permalink,h4 .docs-heading-anchor-permalink,h5 .docs-heading-anchor-permalink,h6 .docs-heading-anchor-permalink{visibility:hidden;vertical-align:middle;margin-left:0.5em;font-size:0.7rem}h1 .docs-heading-anchor-permalink::before,h2 .docs-heading-anchor-permalink::before,h3 .docs-heading-anchor-permalink::before,h4 .docs-heading-anchor-permalink::before,h5 .docs-heading-anchor-permalink::before,h6 .docs-heading-anchor-permalink::before{font-family:"Font Awesome 6 Free";font-weight:900;content:"\f0c1"}h1:hover .docs-heading-anchor-permalink,h2:hover .docs-heading-anchor-permalink,h3:hover .docs-heading-anchor-permalink,h4:hover .docs-heading-anchor-permalink,h5:hover .docs-heading-anchor-permalink,h6:hover .docs-heading-anchor-permalink{visibility:visible}.docs-dark-only{display:none !important}pre{position:relative;overflow:hidden}pre code,pre code.hljs{padding:0 .75rem !important;overflow:auto;display:block}pre code:first-of-type,pre code.hljs:first-of-type{padding-top:0.5rem !important}pre code:last-of-type,pre code.hljs:last-of-type{padding-bottom:0.5rem !important}pre .copy-button{opacity:0.2;transition:opacity 0.2s;position:absolute;right:0em;top:0em;padding:0.5em;width:2.5em;height:2.5em;background:transparent;border:none;font-family:"Font Awesome 6 Free";color:#222;cursor:pointer;text-align:center}pre .copy-button:focus,pre .copy-button:hover{opacity:1;background:rgba(34,34,34,0.1);color:#2e63b8}pre .copy-button.success{color:#259a12;opacity:1}pre .copy-button.error{color:#cb3c33;opacity:1}pre:hover .copy-button{opacity:1}.admonition{background-color:#b5b5b5;border-style:solid;border-width:1px;border-color:#363636;border-radius:4px;font-size:1rem}.admonition strong{color:currentColor}.admonition.is-small,#documenter .docs-sidebar form.docs-search>input.admonition{font-size:.75rem}.admonition.is-medium{font-size:1.25rem}.admonition.is-large{font-size:1.5rem}.admonition.is-default{background-color:#b5b5b5;border-color:#363636}.admonition.is-default>.admonition-header{background-color:#363636;color:#fff}.admonition.is-default>.admonition-body{color:#fff}.admonition.is-info{background-color:#def0fc;border-color:#209cee}.admonition.is-info>.admonition-header{background-color:#209cee;color:#fff}.admonition.is-info>.admonition-body{color:rgba(0,0,0,0.7)}.admonition.is-success{background-color:#bdf4d1;border-color:#22c35b}.admonition.is-success>.admonition-header{background-color:#22c35b;color:#fff}.admonition.is-success>.admonition-body{color:rgba(0,0,0,0.7)}.admonition.is-warning{background-color:#fff3c5;border-color:#ffdd57}.admonition.is-warning>.admonition-header{background-color:#ffdd57;color:rgba(0,0,0,0.7)}.admonition.is-warning>.admonition-body{color:rgba(0,0,0,0.7)}.admonition.is-danger{background-color:#ffaba7;border-color:#da0b00}.admonition.is-danger>.admonition-header{background-color:#da0b00;color:#fff}.admonition.is-danger>.admonition-body{color:rgba(0,0,0,0.7)}.admonition.is-compat{background-color:#bdeff5;border-color:#1db5c9}.admonition.is-compat>.admonition-header{background-color:#1db5c9;color:#fff}.admonition.is-compat>.admonition-body{color:rgba(0,0,0,0.7)}.admonition-header{color:#fff;background-color:#363636;align-items:center;font-weight:700;justify-content:space-between;line-height:1.25;padding:0.5rem .75rem;position:relative}.admonition-header:before{font-family:"Font Awesome 6 Free";font-weight:900;margin-right:.75rem;content:"\f06a"}details.admonition.is-details>.admonition-header{list-style:none}details.admonition.is-details>.admonition-header:before{font-family:"Font Awesome 6 Free";font-weight:900;content:"\f055"}details.admonition.is-details[open]>.admonition-header:before{font-family:"Font Awesome 6 Free";font-weight:900;content:"\f056"}.admonition-body{color:#222;padding:0.5rem .75rem}.admonition-body pre{background-color:#f5f5f5}.admonition-body code{background-color:rgba(0,0,0,0.05)}.docstring{margin-bottom:1em;background-color:rgba(0,0,0,0);border:1px solid #dbdbdb;box-shadow:2px 2px 3px rgba(10,10,10,0.1);max-width:100%}.docstring>header{cursor:pointer;display:flex;flex-grow:1;align-items:stretch;padding:0.5rem .75rem;background-color:#f5f5f5;box-shadow:0 0.125em 0.25em rgba(10,10,10,0.1);box-shadow:none;border-bottom:1px solid #dbdbdb;overflow:auto}.docstring>header code{background-color:transparent}.docstring>header .docstring-article-toggle-button{min-width:1.1rem;padding:0.2rem 0.2rem 0.2rem 0}.docstring>header .docstring-binding{margin-right:0.3em}.docstring>header .docstring-category{margin-left:0.3em}.docstring>section{position:relative;padding:.75rem .75rem;border-bottom:1px solid #dbdbdb}.docstring>section:last-child{border-bottom:none}.docstring>section>a.docs-sourcelink{transition:opacity 0.3s;opacity:0;position:absolute;right:.375rem;bottom:.375rem}.docstring>section>a.docs-sourcelink:focus{opacity:1 !important}.docstring:hover>section>a.docs-sourcelink{opacity:0.2}.docstring:focus-within>section>a.docs-sourcelink{opacity:0.2}.docstring>section:hover a.docs-sourcelink{opacity:1}.documenter-example-output{background-color:#fff}.outdated-warning-overlay{position:fixed;top:0;left:0;right:0;box-shadow:0 0 10px rgba(0,0,0,0.3);z-index:999;background-color:#ffaba7;color:rgba(0,0,0,0.7);border-bottom:3px solid #da0b00;padding:10px 35px;text-align:center;font-size:15px}.outdated-warning-overlay .outdated-warning-closer{position:absolute;top:calc(50% - 10px);right:18px;cursor:pointer;width:12px}.outdated-warning-overlay a{color:#2e63b8}.outdated-warning-overlay a:hover{color:#363636}.content pre{border:1px solid #dbdbdb}.content code{font-weight:inherit}.content a code{color:#2e63b8}.content h1 code,.content h2 code,.content h3 code,.content h4 code,.content h5 code,.content h6 code{color:#222}.content table{display:block;width:initial;max-width:100%;overflow-x:auto}.content blockquote>ul:first-child,.content blockquote>ol:first-child,.content .admonition-body>ul:first-child,.content .admonition-body>ol:first-child{margin-top:0}pre,code{font-variant-ligatures:no-contextual}.breadcrumb a.is-disabled{cursor:default;pointer-events:none}.breadcrumb a.is-disabled,.breadcrumb a.is-disabled:hover{color:#222}.hljs{background:initial !important}.katex .katex-mathml{top:0;right:0}.katex-display,mjx-container,.MathJax_Display{margin:0.5em 0 !important}html{-moz-osx-font-smoothing:auto;-webkit-font-smoothing:auto}li.no-marker{list-style:none}#documenter .docs-main>article{overflow-wrap:break-word}#documenter .docs-main>article .math-container{overflow-x:auto;overflow-y:hidden}@media screen and (min-width: 1056px){#documenter .docs-main{max-width:52rem;margin-left:20rem;padding-right:1rem}}@media screen and (max-width: 1055px){#documenter .docs-main{width:100%}#documenter .docs-main>article{max-width:52rem;margin-left:auto;margin-right:auto;margin-bottom:1rem;padding:0 1rem}#documenter .docs-main>header,#documenter .docs-main>nav{max-width:100%;width:100%;margin:0}}#documenter .docs-main header.docs-navbar{background-color:#fff;border-bottom:1px solid #dbdbdb;z-index:2;min-height:4rem;margin-bottom:1rem;display:flex}#documenter .docs-main header.docs-navbar .breadcrumb{flex-grow:1;overflow-x:hidden}#documenter .docs-main header.docs-navbar .docs-sidebar-button{display:block;font-size:1.5rem;padding-bottom:0.1rem;margin-right:1rem}#documenter .docs-main header.docs-navbar .docs-right{display:flex;white-space:nowrap;gap:1rem;align-items:center}#documenter .docs-main header.docs-navbar .docs-right .docs-icon,#documenter .docs-main header.docs-navbar .docs-right .docs-label{display:inline-block}#documenter .docs-main header.docs-navbar .docs-right .docs-label{padding:0;margin-left:0.3em}@media screen and (max-width: 1055px){#documenter .docs-main header.docs-navbar .docs-right .docs-navbar-link{margin-left:0.4rem;margin-right:0.4rem}}#documenter .docs-main header.docs-navbar>*{margin:auto 0}@media screen and (max-width: 1055px){#documenter .docs-main header.docs-navbar{position:sticky;top:0;padding:0 1rem;transition-property:top, box-shadow;-webkit-transition-property:top, box-shadow;transition-duration:0.3s;-webkit-transition-duration:0.3s}#documenter .docs-main header.docs-navbar.headroom--not-top{box-shadow:.2rem 0rem .4rem #bbb;transition-duration:0.7s;-webkit-transition-duration:0.7s}#documenter .docs-main header.docs-navbar.headroom--unpinned.headroom--not-top.headroom--not-bottom{top:-4.5rem;transition-duration:0.7s;-webkit-transition-duration:0.7s}}#documenter .docs-main section.footnotes{border-top:1px solid #dbdbdb}#documenter .docs-main section.footnotes li .tag:first-child,#documenter .docs-main section.footnotes li .docstring>section>a.docs-sourcelink:first-child,#documenter .docs-main section.footnotes li .content kbd:first-child,.content #documenter .docs-main section.footnotes li kbd:first-child{margin-right:1em;margin-bottom:0.4em}#documenter .docs-main .docs-footer{display:flex;flex-wrap:wrap;margin-left:0;margin-right:0;border-top:1px solid #dbdbdb;padding-top:1rem;padding-bottom:1rem}@media screen and (max-width: 1055px){#documenter .docs-main .docs-footer{padding-left:1rem;padding-right:1rem}}#documenter .docs-main .docs-footer .docs-footer-nextpage,#documenter .docs-main .docs-footer .docs-footer-prevpage{flex-grow:1}#documenter .docs-main .docs-footer .docs-footer-nextpage{text-align:right}#documenter .docs-main .docs-footer .flexbox-break{flex-basis:100%;height:0}#documenter .docs-main .docs-footer .footer-message{font-size:0.8em;margin:0.5em auto 0 auto;text-align:center}#documenter .docs-sidebar{display:flex;flex-direction:column;color:#0a0a0a;background-color:#f5f5f5;border-right:1px solid #dbdbdb;padding:0;flex:0 0 18rem;z-index:5;font-size:1rem;position:fixed;left:-18rem;width:18rem;height:100%;transition:left 0.3s}#documenter .docs-sidebar.visible{left:0;box-shadow:.4rem 0rem .8rem #bbb}@media screen and (min-width: 1056px){#documenter .docs-sidebar.visible{box-shadow:none}}@media screen and (min-width: 1056px){#documenter .docs-sidebar{left:0;top:0}}#documenter .docs-sidebar .docs-logo{margin-top:1rem;padding:0 1rem}#documenter .docs-sidebar .docs-logo>img{max-height:6rem;margin:auto}#documenter .docs-sidebar .docs-package-name{flex-shrink:0;font-size:1.5rem;font-weight:700;text-align:center;white-space:nowrap;overflow:hidden;padding:0.5rem 0}#documenter .docs-sidebar .docs-package-name .docs-autofit{max-width:16.2rem}#documenter .docs-sidebar .docs-package-name a,#documenter .docs-sidebar .docs-package-name a:hover{color:#0a0a0a}#documenter .docs-sidebar .docs-version-selector{border-top:1px solid #dbdbdb;display:none;padding:0.5rem}#documenter .docs-sidebar .docs-version-selector.visible{display:flex}#documenter .docs-sidebar ul.docs-menu{flex-grow:1;user-select:none;border-top:1px solid #dbdbdb;padding-bottom:1.5rem}#documenter .docs-sidebar ul.docs-menu>li>.tocitem{font-weight:bold}#documenter .docs-sidebar ul.docs-menu>li li{font-size:.95rem;margin-left:1em;border-left:1px solid #dbdbdb}#documenter .docs-sidebar ul.docs-menu input.collapse-toggle{display:none}#documenter .docs-sidebar ul.docs-menu ul.collapsed{display:none}#documenter .docs-sidebar ul.docs-menu input:checked~ul.collapsed{display:block}#documenter .docs-sidebar ul.docs-menu label.tocitem{display:flex}#documenter .docs-sidebar ul.docs-menu label.tocitem .docs-label{flex-grow:2}#documenter .docs-sidebar ul.docs-menu label.tocitem .docs-chevron{display:inline-block;font-style:normal;font-variant:normal;text-rendering:auto;line-height:1;font-size:.75rem;margin-left:1rem;margin-top:auto;margin-bottom:auto}#documenter .docs-sidebar ul.docs-menu label.tocitem .docs-chevron::before{font-family:"Font Awesome 6 Free";font-weight:900;content:"\f054"}#documenter .docs-sidebar ul.docs-menu input:checked~label.tocitem .docs-chevron::before{content:"\f078"}#documenter .docs-sidebar ul.docs-menu .tocitem{display:block;padding:0.5rem 0.5rem}#documenter .docs-sidebar ul.docs-menu .tocitem,#documenter .docs-sidebar ul.docs-menu .tocitem:hover{color:#0a0a0a;background:#f5f5f5}#documenter .docs-sidebar ul.docs-menu a.tocitem:hover,#documenter .docs-sidebar ul.docs-menu label.tocitem:hover{color:#0a0a0a;background-color:#ebebeb}#documenter .docs-sidebar ul.docs-menu li.is-active{border-top:1px solid #dbdbdb;border-bottom:1px solid #dbdbdb;background-color:#fff}#documenter .docs-sidebar ul.docs-menu li.is-active .tocitem,#documenter .docs-sidebar ul.docs-menu li.is-active .tocitem:hover{background-color:#fff;color:#0a0a0a}#documenter .docs-sidebar ul.docs-menu li.is-active ul.internal .tocitem:hover{background-color:#ebebeb;color:#0a0a0a}#documenter .docs-sidebar ul.docs-menu>li.is-active:first-child{border-top:none}#documenter .docs-sidebar ul.docs-menu ul.internal{margin:0 0.5rem 0.5rem;border-top:1px solid #dbdbdb}#documenter .docs-sidebar ul.docs-menu ul.internal li{font-size:.85rem;border-left:none;margin-left:0;margin-top:0.5rem}#documenter .docs-sidebar ul.docs-menu ul.internal .tocitem{width:100%;padding:0}#documenter .docs-sidebar ul.docs-menu ul.internal .tocitem::before{content:"⚬";margin-right:0.4em}#documenter .docs-sidebar form.docs-search{margin:auto;margin-top:0.5rem;margin-bottom:0.5rem}#documenter .docs-sidebar form.docs-search>input{width:14.4rem}#documenter .docs-sidebar #documenter-search-query{color:#707070;width:14.4rem;box-shadow:inset 0 1px 2px rgba(10,10,10,0.1)}@media screen and (min-width: 1056px){#documenter .docs-sidebar ul.docs-menu{overflow-y:auto;-webkit-overflow-scroll:touch}#documenter .docs-sidebar ul.docs-menu::-webkit-scrollbar{width:.3rem;background:none}#documenter .docs-sidebar ul.docs-menu::-webkit-scrollbar-thumb{border-radius:5px 0px 0px 5px;background:#e0e0e0}#documenter .docs-sidebar ul.docs-menu::-webkit-scrollbar-thumb:hover{background:#ccc}}@media screen and (max-width: 1055px){#documenter .docs-sidebar{overflow-y:auto;-webkit-overflow-scroll:touch}#documenter .docs-sidebar::-webkit-scrollbar{width:.3rem;background:none}#documenter .docs-sidebar::-webkit-scrollbar-thumb{border-radius:5px 0px 0px 5px;background:#e0e0e0}#documenter .docs-sidebar::-webkit-scrollbar-thumb:hover{background:#ccc}}kbd.search-modal-key-hints{border-radius:0.25rem;border:1px solid rgba(0,0,0,0.6);box-shadow:0 2px 0 1px rgba(0,0,0,0.6);cursor:default;font-size:0.9rem;line-height:1.5;min-width:0.75rem;text-align:center;padding:0.1rem 0.3rem;position:relative;top:-1px}.search-min-width-50{min-width:50%}.search-min-height-100{min-height:100%}.search-modal-card-body{max-height:calc(100vh - 15rem)}.search-result-link{border-radius:0.7em;transition:all 300ms}.search-result-link:hover,.search-result-link:focus{background-color:rgba(0,128,128,0.1)}.search-result-link .property-search-result-badge,.search-result-link .search-filter{transition:all 300ms}.property-search-result-badge,.search-filter{padding:0.15em 0.5em;font-size:0.8em;font-style:italic;text-transform:none !important;line-height:1.5;color:#f5f5f5;background-color:rgba(51,65,85,0.501961);border-radius:0.6rem}.search-result-link:hover .property-search-result-badge,.search-result-link:hover .search-filter,.search-result-link:focus .property-search-result-badge,.search-result-link:focus .search-filter{color:#f1f5f9;background-color:#333}.search-filter{color:#333;background-color:#f5f5f5;transition:all 300ms}.search-filter:hover,.search-filter:focus{color:#333}.search-filter-selected{color:#f5f5f5;background-color:rgba(139,0,139,0.5)}.search-filter-selected:hover,.search-filter-selected:focus{color:#f5f5f5}.search-result-highlight{background-color:#ffdd57;color:black}.search-divider{border-bottom:1px solid #dbdbdb}.search-result-title{width:85%;color:#333}.search-result-code-title{font-size:0.875rem;font-family:"JuliaMono","SFMono-Regular","Menlo","Consolas","Liberation Mono","DejaVu Sans Mono",monospace}#search-modal .modal-card-body::-webkit-scrollbar,#search-modal .filter-tabs::-webkit-scrollbar{height:10px;width:10px;background-color:transparent}#search-modal .modal-card-body::-webkit-scrollbar-thumb,#search-modal .filter-tabs::-webkit-scrollbar-thumb{background-color:gray;border-radius:1rem}#search-modal .modal-card-body::-webkit-scrollbar-track,#search-modal .filter-tabs::-webkit-scrollbar-track{-webkit-box-shadow:inset 0 0 6px rgba(0,0,0,0.6);background-color:transparent}.w-100{width:100%}.gap-2{gap:0.5rem}.gap-4{gap:1rem}.gap-8{gap:2rem}.ansi span.sgr1{font-weight:bolder}.ansi span.sgr2{font-weight:lighter}.ansi span.sgr3{font-style:italic}.ansi span.sgr4{text-decoration:underline}.ansi span.sgr7{color:#fff;background-color:#222}.ansi span.sgr8{color:transparent}.ansi span.sgr8 span{color:transparent}.ansi span.sgr9{text-decoration:line-through}.ansi span.sgr30{color:#242424}.ansi span.sgr31{color:#a7201f}.ansi span.sgr32{color:#066f00}.ansi span.sgr33{color:#856b00}.ansi span.sgr34{color:#2149b0}.ansi span.sgr35{color:#7d4498}.ansi span.sgr36{color:#007989}.ansi span.sgr37{color:gray}.ansi span.sgr40{background-color:#242424}.ansi span.sgr41{background-color:#a7201f}.ansi span.sgr42{background-color:#066f00}.ansi span.sgr43{background-color:#856b00}.ansi span.sgr44{background-color:#2149b0}.ansi span.sgr45{background-color:#7d4498}.ansi span.sgr46{background-color:#007989}.ansi span.sgr47{background-color:gray}.ansi span.sgr90{color:#616161}.ansi span.sgr91{color:#cb3c33}.ansi span.sgr92{color:#0e8300}.ansi span.sgr93{color:#a98800}.ansi span.sgr94{color:#3c5dcd}.ansi span.sgr95{color:#9256af}.ansi span.sgr96{color:#008fa3}.ansi span.sgr97{color:#f5f5f5}.ansi span.sgr100{background-color:#616161}.ansi span.sgr101{background-color:#cb3c33}.ansi span.sgr102{background-color:#0e8300}.ansi span.sgr103{background-color:#a98800}.ansi span.sgr104{background-color:#3c5dcd}.ansi span.sgr105{background-color:#9256af}.ansi span.sgr106{background-color:#008fa3}.ansi span.sgr107{background-color:#f5f5f5}code.language-julia-repl>span.hljs-meta{color:#066f00;font-weight:bolder}/*! Theme: Default Description: Original highlight.js style Author: (c) Ivan Sagalaev @@ -6,4 +6,4 @@ Website: https://highlightjs.org/ License: see project LICENSE Touched: 2021 -*/pre code.hljs{display:block;overflow-x:auto}code.hljs{padding:3px 5px}.hljs{background:#F0F0F0;color:#444}.hljs-comment{color:#888888}.hljs-tag,.hljs-punctuation{color:#444a}.hljs-tag .hljs-name,.hljs-tag .hljs-attr{color:#444}.hljs-keyword,.hljs-attribute,.hljs-selector-tag,.hljs-meta .hljs-keyword,.hljs-doctag,.hljs-name{font-weight:bold}.hljs-type,.hljs-string,.hljs-number,.hljs-selector-id,.hljs-selector-class,.hljs-quote,.hljs-template-tag,.hljs-deletion{color:#880000}.hljs-title,.hljs-section{color:#880000;font-weight:bold}.hljs-regexp,.hljs-symbol,.hljs-variable,.hljs-template-variable,.hljs-link,.hljs-selector-attr,.hljs-operator,.hljs-selector-pseudo{color:#BC6060}.hljs-literal{color:#78A960}.hljs-built_in,.hljs-bullet,.hljs-code,.hljs-addition{color:#397300}.hljs-meta{color:#1f7199}.hljs-meta .hljs-string{color:#4d99bf}.hljs-emphasis{font-style:italic}.hljs-strong{font-weight:bold} +*/pre code.hljs{display:block;overflow-x:auto;padding:1em}code.hljs{padding:3px 5px}.hljs{background:#F3F3F3;color:#444}.hljs-comment{color:#697070}.hljs-tag,.hljs-punctuation{color:#444a}.hljs-tag .hljs-name,.hljs-tag .hljs-attr{color:#444}.hljs-keyword,.hljs-attribute,.hljs-selector-tag,.hljs-meta .hljs-keyword,.hljs-doctag,.hljs-name{font-weight:bold}.hljs-type,.hljs-string,.hljs-number,.hljs-selector-id,.hljs-selector-class,.hljs-quote,.hljs-template-tag,.hljs-deletion{color:#880000}.hljs-title,.hljs-section{color:#880000;font-weight:bold}.hljs-regexp,.hljs-symbol,.hljs-variable,.hljs-template-variable,.hljs-link,.hljs-selector-attr,.hljs-operator,.hljs-selector-pseudo{color:#ab5656}.hljs-literal{color:#695}.hljs-built_in,.hljs-bullet,.hljs-code,.hljs-addition{color:#397300}.hljs-meta{color:#1f7199}.hljs-meta .hljs-string{color:#38a}.hljs-emphasis{font-style:italic}.hljs-strong{font-weight:bold}.gap-4{gap:1rem} diff --git a/v1.7.2/assets/themeswap.js b/v1.7.2/assets/themeswap.js index c58e993e3..9f5eebe6a 100644 --- a/v1.7.2/assets/themeswap.js +++ b/v1.7.2/assets/themeswap.js @@ -1,20 +1,17 @@ // Small function to quickly swap out themes. Gets put into the tag.. function set_theme_from_local_storage() { - // Intialize the theme to null, which means default + // Initialize the theme to null, which means default var theme = null; // If the browser supports the localstorage and is not disabled then try to get the // documenter theme - if(window.localStorage != null) { + if (window.localStorage != null) { // Get the user-picked theme from localStorage. May be `null`, which means the default // theme. - theme = window.localStorage.getItem("documenter-theme"); + theme = window.localStorage.getItem("documenter-theme"); } - // Check if the browser supports user color preference - var darkPreference = false; // Check if the users preference is for dark color scheme - if(window.matchMedia('(prefers-color-scheme: dark)').matches === true) { - darkPreference = true; - } + var darkPreference = + window.matchMedia("(prefers-color-scheme: dark)").matches === true; // Initialize a few variables for the loop: // // - active: will contain the index of the theme that should be active. Note that there @@ -24,43 +21,64 @@ function set_theme_from_local_storage() { // // - disabled: style sheets that should be disabled (i.e. all the theme style sheets // that are not the currently active theme) - var active = null; var disabled = []; var darkTheme = null; + var active = null; + var disabled = []; + var primaryLightTheme = null; + var primaryDarkTheme = null; for (var i = 0; i < document.styleSheets.length; i++) { var ss = document.styleSheets[i]; // The tag of each style sheet is expected to have a data-theme-name attribute // which must contain the name of the theme. The names in localStorage much match this. var themename = ss.ownerNode.getAttribute("data-theme-name"); // attribute not set => non-theme stylesheet => ignore - if(themename === null) continue; + if (themename === null) continue; // To distinguish the default (primary) theme, it needs to have the data-theme-primary // attribute set. - var isprimary = (ss.ownerNode.getAttribute("data-theme-primary") !== null); - // Check if the theme is primary dark theme - var isDarkTheme = (ss.ownerNode.getAttribute("data-theme-primary-dark") !== null); - // If ss is for dark theme then set the value of darkTheme to the name of the theme - if(isDarkTheme) darkTheme = themename; + if (ss.ownerNode.getAttribute("data-theme-primary") !== null) { + primaryLightTheme = themename; + } + // Check if the theme is primary dark theme so that we could store its name in darkTheme + if (ss.ownerNode.getAttribute("data-theme-primary-dark") !== null) { + primaryDarkTheme = themename; + } // If we find a matching theme (and it's not the default), we'll set active to non-null - if(themename === theme) active = i; + if (themename === theme) active = i; // Store the style sheets of inactive themes so that we could disable them - if(themename !== theme) disabled.push(ss); + if (themename !== theme) disabled.push(ss); } - if(active !== null) { + var activeTheme = null; + if (active !== null) { // If we did find an active theme, we'll (1) add the theme--$(theme) class to - document.getElementsByTagName('html')[0].className = "theme--" + theme; - // and (2) disable all the other theme stylesheets - disabled.forEach(function(ss){ - ss.disabled = true; - }); + document.getElementsByTagName("html")[0].className = "theme--" + theme; + activeTheme = theme; + } else { + // If we did _not_ find an active theme, then we need to fall back to the primary theme + // which can either be dark or light, depending on the user's OS preference. + var activeTheme = darkPreference ? primaryDarkTheme : primaryLightTheme; + // In case it somehow happens that the relevant primary theme was not found in the + // preceding loop, we abort without doing anything. + if (activeTheme === null) { + console.error("Unable to determine primary theme."); + return; + } + // When switching to the primary light theme, then we must not have a class name + // for the tag. That's only for non-primary or the primary dark theme. + if (darkPreference) { + document.getElementsByTagName("html")[0].className = + "theme--" + activeTheme; + } else { + document.getElementsByTagName("html")[0].className = ""; + } } - else if(darkTheme !== null && darkPreference === true) { - // If we did find an active theme, we'll (1) add the theme--$(theme) class to - document.getElementsByTagName('html')[0].className = "theme--" + darkTheme; - // and (2) disable all the other theme stylesheets - disabled.forEach(function(ss){ - if (ss.ownerNode.getAttribute("data-theme-name") !== darkTheme) { - ss.disabled = true; - } - }); + for (var i = 0; i < document.styleSheets.length; i++) { + var ss = document.styleSheets[i]; + // The tag of each style sheet is expected to have a data-theme-name attribute + // which must contain the name of the theme. The names in localStorage much match this. + var themename = ss.ownerNode.getAttribute("data-theme-name"); + // attribute not set => non-theme stylesheet => ignore + if (themename === null) continue; + // we'll disable all the stylesheets, except for the active one + ss.disabled = !(themename == activeTheme); } } set_theme_from_local_storage(); diff --git a/v1.7.2/assets/warner.js b/v1.7.2/assets/warner.js index 5531c8851..3f6f5d008 100644 --- a/v1.7.2/assets/warner.js +++ b/v1.7.2/assets/warner.js @@ -1,49 +1,52 @@ -function maybeAddWarning () { - // DOCUMENTER_NEWEST is defined in versions.js, DOCUMENTER_CURRENT_VERSION and DOCUMENTER_STABLE - // in siteinfo.js. - // If either of these are undefined something went horribly wrong, so we abort. - if ( - window.DOCUMENTER_NEWEST === undefined || - window.DOCUMENTER_CURRENT_VERSION === undefined || - window.DOCUMENTER_STABLE === undefined - ) { - return - }; +function maybeAddWarning() { + // DOCUMENTER_NEWEST is defined in versions.js, DOCUMENTER_CURRENT_VERSION and DOCUMENTER_STABLE + // in siteinfo.js. + // If either of these are undefined something went horribly wrong, so we abort. + if ( + window.DOCUMENTER_NEWEST === undefined || + window.DOCUMENTER_CURRENT_VERSION === undefined || + window.DOCUMENTER_STABLE === undefined + ) { + return; + } - // Current version is not a version number, so we can't tell if it's the newest version. Abort. - if (!/v(\d+\.)*\d+/.test(window.DOCUMENTER_CURRENT_VERSION)) { - return - }; + // Current version is not a version number, so we can't tell if it's the newest version. Abort. + if (!/v(\d+\.)*\d+/.test(window.DOCUMENTER_CURRENT_VERSION)) { + return; + } - // Current version is newest version, so no need to add a warning. - if (window.DOCUMENTER_NEWEST === window.DOCUMENTER_CURRENT_VERSION) { - return - }; + // Current version is newest version, so no need to add a warning. + if (window.DOCUMENTER_NEWEST === window.DOCUMENTER_CURRENT_VERSION) { + return; + } - // Add a noindex meta tag (unless one exists) so that search engines don't index this version of the docs. - if (document.body.querySelector('meta[name="robots"]') === null) { - const meta = document.createElement('meta'); - meta.name = 'robots'; - meta.content = 'noindex'; + // Add a noindex meta tag (unless one exists) so that search engines don't index this version of the docs. + if (document.body.querySelector('meta[name="robots"]') === null) { + const meta = document.createElement("meta"); + meta.name = "robots"; + meta.content = "noindex"; - document.getElementsByTagName('head')[0].appendChild(meta); - }; + document.getElementsByTagName("head")[0].appendChild(meta); + } - const div = document.createElement('div'); - div.classList.add('outdated-warning-overlay'); - const closer = document.createElement('button'); - closer.classList.add('outdated-warning-closer', 'delete'); - closer.addEventListener('click', function () { - document.body.removeChild(div); - }); - const href = window.documenterBaseURL + '/../' + window.DOCUMENTER_STABLE; - div.innerHTML = 'This documentation is not for the latest stable release, but for either the development version or an older release.
    Click here to go to the documentation for the latest stable release.'; - div.appendChild(closer); - document.body.appendChild(div); -}; + const div = document.createElement("div"); + div.classList.add("outdated-warning-overlay"); + const closer = document.createElement("button"); + closer.classList.add("outdated-warning-closer", "delete"); + closer.addEventListener("click", function () { + document.body.removeChild(div); + }); + const href = window.documenterBaseURL + "/../" + window.DOCUMENTER_STABLE; + div.innerHTML = + 'This documentation is not for the latest stable release, but for either the development version or an older release.
    Click here to go to the documentation for the latest stable release.'; + div.appendChild(closer); + document.body.appendChild(div); +} -if (document.readyState === 'loading') { - document.addEventListener('DOMContentLoaded', maybeAddWarning); +if (document.readyState === "loading") { + document.addEventListener("DOMContentLoaded", maybeAddWarning); } else { - maybeAddWarning(); -}; + maybeAddWarning(); +} diff --git a/v1.7.2/contributing/index.html b/v1.7.2/contributing/index.html index 490b5b5d3..c9b807b84 100644 --- a/v1.7.2/contributing/index.html +++ b/v1.7.2/contributing/index.html @@ -1,2 +1,2 @@ -Contributing · Rocket.jl

    Contribution guidelines

    We welcome all possible contributors. This page details the some of the guidelines that should be followed when contributing to this package.

    Reporting bugs

    We track bugs using GitHub issues. We encourage you to write complete, specific, reproducible bug reports. Mention the versions of Julia and Rocket.jl for which you observe unexpected behavior. Please provide a concise description of the problem and complement it with code snippets, test cases, screenshots, tracebacks or any other information that you consider relevant. This will help us to replicate the problem and narrow the search space for solutions.

    Suggesting features

    We welcome new feature proposals. However, before submitting a feature request, consider a few things:

    • Does the feature require changes in the core Rocket.jl code? If it doesn't (for example, you would like to add a operator for a particular application), consider making a separate repository for your extensions.
    • If you would like to add an implementation of a feature that changes a lot in the core Rocket.jl code, please open an issue on GitHub and describe your proposal first. This will allow us to discuss your proposal with you before you invest your time in implementing something that may be difficult to merge later on.

    Contributing code

    Installing Rocket

    We suggest that you use the dev command from the new Julia package manager to install Rocket.jl for development purposes. To work on your fork of Rocket.jl, use your fork's URL address in the dev command, for example:

    ] dev git@github.com:your_username/Rocket.jl.git

    The dev command clones Rocket.jl to ~/.julia/dev/Rocket. All local changes to Rocket code will be reflected in imported code.

    Note

    It is also might be useful to install Revise.jl package as it allows you to modify code and use the changes without restarting Julia.

    Committing code

    We use the standard GitHub Flow workflow where all contributions are added through pull requests. In order to contribute, first fork the repository, then commit your contributions to your fork, and then create a pull request on the master branch of the Rocket.jl repository.

    Before opening a pull request, please make sure that all tests pass without failing! All demos (can be found in /demo/ directory) have to run without errors as well.

    Style conventions

    We use default Julia style guide. We list here a few important points and our modifications to the Julia style guide:

    • Use 4 spaces for indentation
    • Type names use UpperCamelCase. For example: ArrayObservable, MapOperator, etc..
    • Function names are lowercase with underscores, when necessary. For example: next!, subscribe!, as_actor, etc..
    • Variable names and function arguments use snake_case
    • The name of a method that modifies its argument(s) must end in !

    Unit tests

    We use the test-driven development (TDD) methodology for Rocket.jl development. The test coverage should be as complete as possible. Please make sure that you write tests for each piece of code that you want to add.

    All unit tests are located in the /test/ directory. The /test/ directory follows the structure of the /src/ directory. Each test file should have following filename format: test_*.jl. Some tests are also present in jldoctest docs annotations directly in the source code. See Julia's documentation about doctests.

    The tests can be evaluated by running following command in the Julia REPL:

    ] test Rocket
    +Contributing · Rocket.jl

    Contribution guidelines

    We welcome all possible contributors. This page details the some of the guidelines that should be followed when contributing to this package.

    Reporting bugs

    We track bugs using GitHub issues. We encourage you to write complete, specific, reproducible bug reports. Mention the versions of Julia and Rocket.jl for which you observe unexpected behavior. Please provide a concise description of the problem and complement it with code snippets, test cases, screenshots, tracebacks or any other information that you consider relevant. This will help us to replicate the problem and narrow the search space for solutions.

    Suggesting features

    We welcome new feature proposals. However, before submitting a feature request, consider a few things:

    • Does the feature require changes in the core Rocket.jl code? If it doesn't (for example, you would like to add a operator for a particular application), consider making a separate repository for your extensions.
    • If you would like to add an implementation of a feature that changes a lot in the core Rocket.jl code, please open an issue on GitHub and describe your proposal first. This will allow us to discuss your proposal with you before you invest your time in implementing something that may be difficult to merge later on.

    Contributing code

    Installing Rocket

    We suggest that you use the dev command from the new Julia package manager to install Rocket.jl for development purposes. To work on your fork of Rocket.jl, use your fork's URL address in the dev command, for example:

    ] dev git@github.com:your_username/Rocket.jl.git

    The dev command clones Rocket.jl to ~/.julia/dev/Rocket. All local changes to Rocket code will be reflected in imported code.

    Note

    It is also might be useful to install Revise.jl package as it allows you to modify code and use the changes without restarting Julia.

    Committing code

    We use the standard GitHub Flow workflow where all contributions are added through pull requests. In order to contribute, first fork the repository, then commit your contributions to your fork, and then create a pull request on the master branch of the Rocket.jl repository.

    Before opening a pull request, please make sure that all tests pass without failing! All demos (can be found in /demo/ directory) have to run without errors as well.

    Style conventions

    We use default Julia style guide. We list here a few important points and our modifications to the Julia style guide:

    • Use 4 spaces for indentation
    • Type names use UpperCamelCase. For example: ArrayObservable, MapOperator, etc..
    • Function names are lowercase with underscores, when necessary. For example: next!, subscribe!, as_actor, etc..
    • Variable names and function arguments use snake_case
    • The name of a method that modifies its argument(s) must end in !

    Unit tests

    We use the test-driven development (TDD) methodology for Rocket.jl development. The test coverage should be as complete as possible. Please make sure that you write tests for each piece of code that you want to add.

    All unit tests are located in the /test/ directory. The /test/ directory follows the structure of the /src/ directory. Each test file should have following filename format: test_*.jl. Some tests are also present in jldoctest docs annotations directly in the source code. See Julia's documentation about doctests.

    The tests can be evaluated by running following command in the Julia REPL:

    ] test Rocket
    diff --git a/v1.7.2/getting-started/index.html b/v1.7.2/getting-started/index.html index 700dfc8dd..47897b53a 100644 --- a/v1.7.2/getting-started/index.html +++ b/v1.7.2/getting-started/index.html @@ -1,5 +1,5 @@ -Getting started · Rocket.jl

    Getting started

    Rocket.jl is a Julia package for reactive programming that makes it easier to work with asynchronous data. It is inspired by the RxJS and ReactiveX communities.

    In order to combine good performance with a convenient API, Rocket.jl employs Observer patterns, Actor models and Functional programming.

    Installation

    Install Rocket.jl through the Julia package manager:

    ] add Rocket

    Concepts

    Rocket.jl has been designed with a focus on performance and modularity.

    The essential concepts in Rocket.jl are:

    • Observable: represents a collection of future messages (data or/and events).
    • Actor: is an object that knows how to react on incoming messages delivered by the Observable.
    • Subscription: represents a teardown logic that is useful for cancelling the execution of an Observable.
    • Operator: an object that deals with collection operations, such as map, filter, reduce, etc.
    • Subject: the way of multicasting a message to multiple Observers.

    First example

    Conventionally, arrays are used for processing data.

    for value in array_of_values
    +Getting started · Rocket.jl

    Getting started

    Rocket.jl is a Julia package for reactive programming that makes it easier to work with asynchronous data. It is inspired by the RxJS and ReactiveX communities.

    In order to combine good performance with a convenient API, Rocket.jl employs Observer patterns, Actor models and Functional programming.

    Installation

    Install Rocket.jl through the Julia package manager:

    ] add Rocket

    Concepts

    Rocket.jl has been designed with a focus on performance and modularity.

    The essential concepts in Rocket.jl are:

    • Observable: represents a collection of future messages (data or/and events).
    • Actor: is an object that knows how to react on incoming messages delivered by the Observable.
    • Subscription: represents a teardown logic that is useful for cancelling the execution of an Observable.
    • Operator: an object that deals with collection operations, such as map, filter, reduce, etc.
    • Subject: the way of multicasting a message to multiple Observers.

    First example

    Conventionally, arrays are used for processing data.

    for value in array_of_values
         doSomethingWithMyData(value)
     end

    In contrast, Rocket.jl uses observables.

    subscription = subscribe!(source_of_values, lambda(
         on_next     = (data)  -> doSomethingWithMyData(data),
    @@ -19,4 +19,4 @@
     Rocket.on_error!(actor::StoreActor, error)             = doSomethingWithAnError(error)
     Rocket.on_complete!(actor::StoreActor)                 = println("Completed: $(actor.values)")

    For debugging purposes you can use a general LambdaActor actor or just pass a function object as an actor in subscribe! function..

    Operators

    What makes Rocket.jl powerful is its ability to help you process, transform and modify the messages that flow through your observables, using Operators.

    subscribe!(squared_int_values |> map(Int, (d) -> d ^ 2), lambda(
         on_next = (data) -> println(data)
    -))
    +))
    diff --git a/v1.7.2/index.html b/v1.7.2/index.html index 9ee90a00b..ae2ef1d58 100644 --- a/v1.7.2/index.html +++ b/v1.7.2/index.html @@ -1,2 +1,2 @@ -Home · Rocket.jl

    Rocket.jl Documentation

    Welcome to the documentation for Rocket.jl.

    This documentation is an adaptation of the RxJS library documentation.

    Table of Contents

    Index

    +Home · Rocket.jl

    Rocket.jl Documentation

    Welcome to the documentation for Rocket.jl.

    This documentation is an adaptation of the RxJS library documentation.

    Table of Contents

    Index

    diff --git a/v1.7.2/observables/about/index.html b/v1.7.2/observables/about/index.html index a87314263..b6f29b152 100644 --- a/v1.7.2/observables/about/index.html +++ b/v1.7.2/observables/about/index.html @@ -1,5 +1,5 @@ -Observable · Rocket.jl

    Observables

    Observables are lazy Push collections of multiple values. They fill the missing spot in the following table:

    TypeSingleMutliple
    PullFunctionIterator
    PushPromiseObservable

    First example

    For example, the following code specifies an Observable that pushes the values 1, 2, 3 immediately (synchronously) when subscribed to, and the value 4 after one second has passed since subscription.

    using Rocket
    +Observable · Rocket.jl

    Observables

    Observables are lazy Push collections of multiple values. They fill the missing spot in the following table:

    TypeSingleMultiple
    PullFunctionIterator
    PushPromiseObservable

    First example

    For example, the following code specifies an Observable that pushes the values 1, 2, 3 immediately (synchronously) when subscribed to, and the value 4 after one second has passed since subscription.

    using Rocket
     
     source = make(Int) do actor
         next!(actor, 1)
    @@ -53,11 +53,11 @@
             next!(actor, 0)
             complete!(actor)
         end
    -end

    Assume we have a function foo and some observable:

    • Function call foo(args...) means "give me one value synchronously" (push strategy)
    • In contrast subscription to an observable with subscribe(observable, ...) means "notify me about any amount of values, either synchronously or asynchronously" (pull strategy)

    When a new value is available in an observable we say that the observable emits or generates an update. Values that are generated by an observable are sometimes also called future values, because there is no principled way to predict when an observable will generate a new value. In some programming languages, observables are referred to as generators or streams and we will use all three terms interchangeably.

    Anatomy of an Observable

    Observables are (1) created using creation operators (it is also possible to build an Observable from scratch with custom logic); (2) subscribed to with an Actor; (3) execute to deliver next! / error! / complete! notifications to the Actor, and (4) their execution may be disposed. These four aspects are all encoded in an Observable instance, but some of these aspects are related to other types, such as Subscribable and Subscription.

    The core responsibilities of an Observable are:

    • Creating Observables
    • Subscribing to Observables
    • Executing the Observable
    • Disposing Observables

    Creating Observables

    You can create an Observable in various ways using Creation operators. You can also build an Observable from scratch. To see how you can build an Observable with custom logic, consult the API Section.

    Subscribing to Observables

    The Observable source in the example can be subscribed to.

    using Rocket
    +end

    Assume we have a function foo and some observable:

    • Function call foo(args...) means "give me one value synchronously" (pull strategy)
    • In contrast subscription to an observable with subscribe(observable, ...) means "notify me about any amount of values, either synchronously or asynchronously" (push strategy)

    When a new value is available in an observable we say that the observable emits or generates an update. Values that are generated by an observable are sometimes also called future values, because there is no principled way to predict when an observable will generate a new value. In some programming languages, observables are referred to as generators or streams and we will use all three terms interchangeably.

    Anatomy of an Observable

    Observables are (1) created using creation operators (it is also possible to build an Observable from scratch with custom logic); (2) subscribed to with an Actor; (3) execute to deliver next! / error! / complete! notifications to the Actor, and (4) their execution may be disposed. These four aspects are all encoded in an Observable instance, but some of these aspects are related to other types, such as Subscribable and Subscription.

    The core responsibilities of an Observable are:

    • Creating Observables
    • Subscribing to Observables
    • Executing the Observable
    • Disposing Observables

    Creating Observables

    You can create an Observable in various ways using Creation operators. You can also build an Observable from scratch. To see how you can build an Observable with custom logic, consult the API Section.

    Subscribing to Observables

    The Observable source in the example can be subscribed to.

    using Rocket
     
     subscribe!(source, lambda(
         on_next = (d) -> println(d)
    -))

    This example shows how subscribe calls are not shared among multiple Actors of the same Observable. When calling subscribe! with an Actor, the function on_subscribe! that is attached to this particular Observable is executed for that given actor. Each call to subscribe! triggers its own independent setup for that given actor.

    Note

    Subscribing to an Observable is like calling a function, providing callbacks where the data will be delivered to.

    subscribe! function also supports multiple subscriptions at once. If the input argument to the subscribe! function is a tuple or a vector, it will first check that all of the arguments are valid source objects and actors and if its true will subscribe from each of them individually.

    
    +))

    This example shows how subscribe calls are not shared among multiple Actors of the same Observable. When calling subscribe! with an Actor, the function on_subscribe! that is attached to this particular Observable is executed for that given actor. Each call to subscribe! triggers its own independent setup for that given actor.

    Note

    Subscribing to an Observable is like calling a function, providing callbacks where the data will be delivered to.

    The subscribe! function also supports multiple subscriptions at once. If the input argument to the subscribe! function is a tuple or a vector, it will first check that all of the arguments are valid source objects and actors and if its true will subscribe from each of them individually.

    
     source1 = Subject(Int)
     source2 = Subject(Int)
     
    @@ -91,4 +91,4 @@
             error!(actor, e)
         end
     end
    -

    Disposing Observable Executions

    It is common for an Actor to abort execution of an Observable Execution. Once the Actor is done receiving values, it may stop the execution in order to free computation power or memory resources.

    When subscribe! is called, the Actor gets attached to the newly created Observable execution. This call also returns an object, the Subscription:

    subscription = subscribe!(source, actor)

    The Subscription represents the ongoing execution, and has a minimal API that allows you to cancel the execution. Read more about Subscription type here.

    With

    unsubscribe!(subscription)

    you can cancel the ongoing execution.

    Note

    subscribe! returns a Subscription that represents the ongoing execution. Simply call unsubscribe! on the Subscription to cancel the execution.

    +

    Disposing Observable Executions

    It is common for an Actor to abort execution of an Observable Execution. Once the Actor is done receiving values, it may stop the execution in order to free computation power or memory resources.

    When subscribe! is called, the Actor gets attached to the newly created Observable execution. This call also returns an object, the Subscription:

    subscription = subscribe!(source, actor)

    The Subscription represents the ongoing execution, and has a minimal API that allows you to cancel the execution. Read more about Subscription type here.

    With

    unsubscribe!(subscription)

    you can cancel the ongoing execution.

    Note

    subscribe! returns a Subscription that represents the ongoing execution. Simply call unsubscribe! on the Subscription to cancel the execution.

    diff --git a/v1.7.2/observables/types/array/index.html b/v1.7.2/observables/types/array/index.html index 62adb737f..f9bbe6b2b 100644 --- a/v1.7.2/observables/types/array/index.html +++ b/v1.7.2/observables/types/array/index.html @@ -1,5 +1,5 @@ -Array · Rocket.jl

    Array Observable

    Rocket.fromFunction
    from(x; scheduler::H = AsapScheduler()) where { H <: AbstractScheduler }
    +Array · Rocket.jl

    Array Observable

    Rocket.fromFunction
    from(x; scheduler::H = AsapScheduler()) where { H <: AbstractScheduler }
     from(a::Vector{D}; scheduler::H = AsapScheduler()) where { D, H <: AbstractScheduler }

    Creation operator for the ArrayObservable that emits either a single value if x has a Scalar trait specification or a collection of values if x has a NonScalar trait specification. Throws an ErrorException if x has UndefinedScalarness trait type. To specify scalarness for arbitrary type T some can implement an additional method for scalarness(::Type{<:MyType}) function and to specify scalarness behavior. Optionally accepts custom scheduler-like object to schedule messages delivery.

    Arguments

    • x: an object to be wrapped into array of values
    • scheduler: optional, scheduler-like object

    For an object x to be a valid input for a from operator it must implement Rocket.scalarness(::Type{ <: T }) method which should return either Rocket.Scalar or Rocket.NonScalar objects. In first case from operator will treat x as a single scalar value and will wrap it into a vector while in the second case from operator will convert x object into an array using collect function.

    For arbitrary iterable objects consider using iterable creation operator.

    Note

    from operators creates a copy of x using collect on a given object.

    Examples

    using Rocket
     
     source = from([ 0, 1, 2 ])
    @@ -56,4 +56,4 @@
     [LogActor] Data: d
     [LogActor] Data: !
     [LogActor] Completed
    -

    See also: ArrayObservable, subscribe!, logger, iterable

    source
    Rocket.ArrayObservableType
    ArrayObservable{D, H}(values::Vector{D}, scheduler::H) where { D, H }

    ArrayObservable wraps a regular Julia array into an observable. Uses scheduler object to schedule messages delivery.

    Constructor arguments

    • values: array of values to be wrapped
    • scheduler: Scheduler-like object

    See also: Subscribable, from

    source
    +

    See also: ArrayObservable, subscribe!, logger, iterable

    source
    Rocket.ArrayObservableType
    ArrayObservable{D, H}(values::Vector{D}, scheduler::H) where { D, H }

    ArrayObservable wraps a regular Julia array into an observable. Uses scheduler object to schedule messages delivery.

    Constructor arguments

    • values: array of values to be wrapped
    • scheduler: Scheduler-like object

    See also: Subscribable, from

    source
    diff --git a/v1.7.2/observables/types/collected/index.html b/v1.7.2/observables/types/collected/index.html index 61ebbf5a2..d8e63f1f3 100644 --- a/v1.7.2/observables/types/collected/index.html +++ b/v1.7.2/observables/types/collected/index.html @@ -1,5 +1,5 @@ -Collected · Rocket.jl

    Collected Observable

    Rocket.collectLatestFunction
    collectLatest(sources::S, mappingFn::F = copy) where { S, F }
    +Collected · Rocket.jl

    Collected Observable

    Rocket.collectLatestFunction
    collectLatest(sources::S, mappingFn::F = copy) where { S, F }
     collectLatest(::Type{T}, ::Type{R}, sources::S, mappingFn::F = copy)

    Collects values from multible Observables and emits it in one single array every time each inner Observable has a new value. Reemits errors from inner observables. Completes when all inner observables completes.

    Arguments

    • sources: input sources
    • mappingFn: optional mappingFn applied to an array of emited values, copy by default, should return a Vector

    Note: collectLatest completes immediately if sources are empty.

    Optional arguments

    • ::Type{T}: optional type of emmiting values of inner observables
    • ::Type{R}: optional return type after applying mappingFn to a vector of values

    Examples

    using Rocket
     
     collected = collectLatest([ of(1), from([ 1, 2 ]) ])
    @@ -11,4 +11,4 @@
     
     [LogActor] Data: [1, 1]
     [LogActor] Data: [1, 2]
    -[LogActor] Completed

    See also: Subscribable, subscribe!, combineLatest

    source

    Description

    collectLatest collects the values from all Observables in its vector argument. This is done by subscribing to each Observable in order and, whenever an Observable emits, collecting a vector of the most recent values from each Observable (in order). If you pass n Observables to collectLatest, the returned Observable will always emit an ordered vector of n values.

    To ensure that the output vector has a consistent length, collectLatest waits for all input Observables to emit at least once before it starts emitting results. This means that if some Observable emits values before other Observables started emitting, all these values but the last will be lost. On the other hand, if some Observable does not emit a value but completes, the resulting Observable will complete simultaneously without emitting anything. Furthermore, if some input Observable does not emit any value and never completes, collectLatest will also never emit and never complete.

    If at least one Observable was passed to collectLatest and all passed Observables emitted, then the resulting Observable will complete when all combined streams complete. So even if some Observable completes, the result of collectLatest will still emit values when the other Observables do. In case of a completed Observable, its value will now remain to be the last emitted value. On the other hand, if any Observable errors, collectLatest will also immediately error.

    +[LogActor] Completed

    See also: Subscribable, subscribe!, combineLatest

    source

    Description

    collectLatest collects the values from all Observables in its vector argument. This is done by subscribing to each Observable in order and, whenever an Observable emits, collecting a vector of the most recent values from each Observable (in order). If you pass n Observables to collectLatest, the returned Observable will always emit an ordered vector of n values.

    To ensure that the output vector has a consistent length, collectLatest waits for all input Observables to emit at least once before it starts emitting results. This means that if some Observable emits values before other Observables started emitting, all these values but the last will be lost. On the other hand, if some Observable does not emit a value but completes, the resulting Observable will complete simultaneously without emitting anything. Furthermore, if some input Observable does not emit any value and never completes, collectLatest will also never emit and never complete.

    If at least one Observable was passed to collectLatest and all passed Observables emitted, then the resulting Observable will complete when all combined streams complete. So even if some Observable completes, the result of collectLatest will still emit values when the other Observables do. In case of a completed Observable, its value will now remain to be the last emitted value. On the other hand, if any Observable errors, collectLatest will also immediately error.

    diff --git a/v1.7.2/observables/types/combined/index.html b/v1.7.2/observables/types/combined/index.html index 7de771518..cd0fc5516 100644 --- a/v1.7.2/observables/types/combined/index.html +++ b/v1.7.2/observables/types/combined/index.html @@ -1,5 +1,5 @@ -Combined · Rocket.jl

    Combined Observable

    Rocket.combineLatestFunction
    combineLatest(sources...; strategy = PushEach())
    +Combined · Rocket.jl

    Combined Observable

    Rocket.combineLatestFunction
    combineLatest(sources...; strategy = PushEach())
     combineLatest(sources::S, strategy::G = PushEach()) where { S <: Tuple, U }

    Combines multiple Observables to create an Observable whose values are calculated from the latest values of each of its input Observables. Accept optimal update strategy object.

    Arguments

    • sources: input sources
    • strategy: optional update strategy for batching new values together

    Note: combineLatest() completes immediately if sources are empty.

    Examples

    using Rocket
     
     latest = combineLatest(of(1), from(2:5))
    @@ -23,4 +23,4 @@
     # output
     
     [LogActor] Data: (1, 2)
    -[LogActor] Completed

    See also: Subscribable, subscribe!, PushEach, PushEachBut, PushNew, PushNewBut, PushStrategy

    source

    Description

    combineLatest combines the values from all Observables in its arguments. This is done by subscribing to each Observable in order and, whenever an Observable emits, collecting a tuple of the most recent values from each Observable (in order). If you pass n Observables to combineLatest, the returned Observable will always emit an ordered tuple of n values.

    To ensure that the output tuple has a consistent length, combineLatest waits for all input Observables to emit at least once before it starts emitting results. This means that if some Observable emits values before other Observables started emitting, all these values but the last will be lost. On the other hand, if some Observable does not emit a value but completes, the resulting Observable will complete simultaneously without emitting anything. Furthermore, if some input Observable does not emit any value and never completes, combineLatest will also never emit and never complete.

    If at least one Observable was passed to combineLatest and all passed Observables emitted, then the resulting Observable will complete when all combined streams complete. So even if some Observable completes, the result of combineLatest will still emit values when the other Observables do. In case of a completed Observable, its value will now remain to be the last emitted value. On the other hand, if any Observable errors, combineLatest will also immediately error.

    It is possible to change default update/complete strategy behaviour with an optional strategy object.

    +[LogActor] Completed

    See also: Subscribable, subscribe!, PushEach, PushEachBut, PushNew, PushNewBut, PushStrategy

    source

    Description

    combineLatest combines the values from all Observables in its arguments. This is done by subscribing to each Observable in order and, whenever an Observable emits, collecting a tuple of the most recent values from each Observable (in order). If you pass n Observables to combineLatest, the returned Observable will always emit an ordered tuple of n values.

    To ensure that the output tuple has a consistent length, combineLatest waits for all input Observables to emit at least once before it starts emitting results. This means that if some Observable emits values before other Observables started emitting, all these values but the last will be lost. On the other hand, if some Observable does not emit a value but completes, the resulting Observable will complete simultaneously without emitting anything. Furthermore, if some input Observable does not emit any value and never completes, combineLatest will also never emit and never complete.

    If at least one Observable was passed to combineLatest and all passed Observables emitted, then the resulting Observable will complete when all combined streams complete. So even if some Observable completes, the result of combineLatest will still emit values when the other Observables do. In case of a completed Observable, its value will now remain to be the last emitted value. On the other hand, if any Observable errors, combineLatest will also immediately error.

    It is possible to change default update/complete strategy behaviour with an optional strategy object.

    diff --git a/v1.7.2/observables/types/combined_updates/index.html b/v1.7.2/observables/types/combined_updates/index.html index af0c633a2..046e90153 100644 --- a/v1.7.2/observables/types/combined_updates/index.html +++ b/v1.7.2/observables/types/combined_updates/index.html @@ -1,3 +1,3 @@ -Combined Updates · Rocket.jl

    CombinedUpdates Observable

    Rocket.combineLatestUpdatesFunction
    combineLatestUpdates(sources...; strategy = PushEach())
    -combineLatestUpdates(sources::S, strategy::G = PushEach()) where { S <: Tuple, U }

    combineLatestUpdates is a more effiecient version of combineLatest(sources) + map_to(sources) operators chain.

    Arguments

    • sources: input sources
    • strategy: optional update strategy for batching new values together

    Note: combineLatestUpdates() completes immediately if sources are empty.

    See also: Subscribable, subscribe!, PushEach, PushEachBut, PushNew, PushNewBut, PushStrategy

    source
    +Combined Updates · Rocket.jl

    CombinedUpdates Observable

    Rocket.combineLatestUpdatesFunction
    combineLatestUpdates(sources...; strategy = PushEach())
    +combineLatestUpdates(sources::S, strategy::G = PushEach()) where { S <: Tuple, U }

    combineLatestUpdates is a more effiecient version of combineLatest(sources) + map_to(sources) operators chain.

    Arguments

    • sources: input sources
    • strategy: optional update strategy for batching new values together

    Note: combineLatestUpdates() completes immediately if sources are empty.

    See also: Subscribable, subscribe!, PushEach, PushEachBut, PushNew, PushNewBut, PushStrategy

    source
    diff --git a/v1.7.2/observables/types/completed/index.html b/v1.7.2/observables/types/completed/index.html index 37211ea91..e398dadc1 100644 --- a/v1.7.2/observables/types/completed/index.html +++ b/v1.7.2/observables/types/completed/index.html @@ -1,5 +1,5 @@ -Completed · Rocket.jl

    Completed Observable

    Rocket.completedFunction
    completed(::Type{T} = Any; scheduler::H = AsapScheduler()) where { T, H <: AbstractScheduler }

    Creation operator for the CompletedObservable that emits no items to the Actor and immediately sends a complete notification on subscription.

    Arguments

    • T: type of output data source, optional, Any is the default
    • scheduler: optional, scheduler-like object

    Examples

    using Rocket
    +Completed · Rocket.jl

    Completed Observable

    Rocket.completedFunction
    completed(::Type{T} = Any; scheduler::H = AsapScheduler()) where { T, H <: AbstractScheduler }

    Creation operator for the CompletedObservable that emits no items to the Actor and immediately sends a complete notification on subscription.

    Arguments

    • T: type of output data source, optional, Any is the default
    • scheduler: optional, scheduler-like object

    Examples

    using Rocket
     
     source = completed(Int)
     subscribe!(source, logger())
    @@ -8,4 +8,4 @@
     # output
     
     [LogActor] Completed
    -

    See also: CompletedObservable, subscribe!, logger

    source
    Rocket.CompletedObservableType
    CompletedObservable{D, H}(scheduler::H)

    Observable that emits no items to the Actor and just sends a complete notification on subscription.

    Constructor arguments

    • scheduler: Scheduler-like object

    See also: Subscribable, completed

    source
    +

    See also: CompletedObservable, subscribe!, logger

    source
    Rocket.CompletedObservableType
    CompletedObservable{D, H}(scheduler::H)

    Observable that emits no items to the Actor and just sends a complete notification on subscription.

    Constructor arguments

    • scheduler: Scheduler-like object

    See also: Subscribable, completed

    source
    diff --git a/v1.7.2/observables/types/concat/index.html b/v1.7.2/observables/types/concat/index.html index 0436b50f3..b98fc2c0f 100644 --- a/v1.7.2/observables/types/concat/index.html +++ b/v1.7.2/observables/types/concat/index.html @@ -1,5 +1,5 @@ -Concat · Rocket.jl

    Concat Observable

    Rocket.concatFunction
    concat(sources...)
    +Concat · Rocket.jl

    Concat Observable

    Rocket.concatFunction
    concat(sources...)
     concat(sources::S) where { S <: Tuple }

    Combines multiple Observables to create an Observable which sequentially emits all values from given Observable and then moves on to the next. All values of each passed Observable merged into a single Observable, in order, in serial fashion.

    Arguments

    • sources: input sources

    Examples

    using Rocket
     
     source1 = of(1)
    @@ -22,4 +22,4 @@
     # output
     [LogActor] Data: 1
     [LogActor] Data: 2
    -[LogActor] Completed

    See also: Subscribable, subscribe!

    source
    +[LogActor] Completed

    See also: Subscribable, subscribe!

    source
    diff --git a/v1.7.2/observables/types/connectable/index.html b/v1.7.2/observables/types/connectable/index.html index 4c431595a..6250fb0a9 100644 --- a/v1.7.2/observables/types/connectable/index.html +++ b/v1.7.2/observables/types/connectable/index.html @@ -1,5 +1,5 @@ -Connectable · Rocket.jl

    Connectable Observable

    Rocket.connectableFunction
    connectable(subject::J, source::S) where J where S

    Creates a ConnectableObservable with a given subject object and a source observable.

    Example

    using Rocket
    +Connectable · Rocket.jl

    Connectable Observable

    Rocket.connectableFunction
    connectable(subject::J, source::S) where J where S

    Creates a ConnectableObservable with a given subject object and a source observable.

    Example

    using Rocket
     
     c = connectable(Subject(Int; scheduler = AsapScheduler()), from(1:3))
     
    @@ -14,4 +14,4 @@
     [LogActor] Data: 2
     [LogActor] Data: 3
     [LogActor] Completed
    -

    See also: ConnectableObservable, connect, subscribe!

    source
    Rocket.connectFunction
    connect(connectable::ConnectableObservable)

    When connect is called, the subject passed to the multicast operator is subscribed to the source and the subject’s observers receive the multicast notifications, which fits our basic mental model of stream multicasting. Returns a subscription.

    See also: connectable, ConnectableObservable

    source
    Rocket.ConnectableObservableType
    ConnectableObservable{D}(subject, source)

    A connectable observable encapsulates the multicasting infrastructure with provided subject, but does not immediately subscribe to the source. It subscribes to the source when its connect method is called.

    See also: connect, Subscribable

    source
    +

    See also: ConnectableObservable, connect, subscribe!

    source
    Rocket.connectFunction
    connect(connectable::ConnectableObservable)

    When connect is called, the subject passed to the multicast operator is subscribed to the source and the subject’s observers receive the multicast notifications, which fits our basic mental model of stream multicasting. Returns a subscription.

    See also: connectable, ConnectableObservable

    source
    Rocket.ConnectableObservableType
    ConnectableObservable{D}(subject, source)

    A connectable observable encapsulates the multicasting infrastructure with provided subject, but does not immediately subscribe to the source. It subscribes to the source when its connect method is called.

    See also: connect, Subscribable

    source
    diff --git a/v1.7.2/observables/types/defer/index.html b/v1.7.2/observables/types/defer/index.html index 8380febe0..7020ca6cb 100644 --- a/v1.7.2/observables/types/defer/index.html +++ b/v1.7.2/observables/types/defer/index.html @@ -1,5 +1,5 @@ -Defer · Rocket.jl

    Defer Observable

    Rocket.deferFunction
    defer(::Type{D}, factoryFn::F) where { D, F <: Function }

    Creates an Observable that, on subscribe, calls an Observable factory to make an Observable for each new Observer.

    Arguments

    • T: type of output data source, created by the factoryFn
    • factoryFn: the Observable factory function to invoke for each Observer that subscribes to the output Observable

    Examples

    using Rocket
    +Defer · Rocket.jl

    Defer Observable

    Rocket.deferFunction
    defer(::Type{D}, factoryFn::F) where { D, F <: Function }

    Creates an Observable that, on subscribe, calls an Observable factory to make an Observable for each new Observer.

    Arguments

    • T: type of output data source, created by the factoryFn
    • factoryFn: the Observable factory function to invoke for each Observer that subscribes to the output Observable

    Examples

    using Rocket
     
     source = defer(Int, () -> from([ 1, 2, 3 ]))
     
    @@ -10,4 +10,4 @@
     [LogActor] Data: 1
     [LogActor] Data: 2
     [LogActor] Data: 3
    -[LogActor] Completed

    See also: Subscribable, subscribe!, logger

    source

    Description

    defer allows you to create the Observable only when the Actor subscribes, and create a fresh Observable for each Actor. It waits until an Actor subscribes to it, and then it generates an Observable, typically with an Observable factory function. It does this afresh for each subscriber, so although each subscriber may think it is subscribing to the same Observable, in fact each subscriber gets its own individual Observable.

    +[LogActor] Completed

    See also: Subscribable, subscribe!, logger

    source

    Description

    defer allows you to create the Observable only when the Actor subscribes, and create a fresh Observable for each Actor. It waits until an Actor subscribes to it, and then it generates an Observable, typically with an Observable factory function. It does this afresh for each subscriber, so although each subscriber may think it is subscribing to the same Observable, in fact each subscriber gets its own individual Observable.

    diff --git a/v1.7.2/observables/types/faulted/index.html b/v1.7.2/observables/types/faulted/index.html index 340a38335..91301cb0c 100644 --- a/v1.7.2/observables/types/faulted/index.html +++ b/v1.7.2/observables/types/faulted/index.html @@ -1,5 +1,5 @@ -Faulted · Rocket.jl

    Faulted Observable

    Rocket.faultedFunction
    faulted(err; scheduler::H = AsapScheduler())            where { H <: AbstractScheduler }
    +Faulted · Rocket.jl

    Faulted Observable

    Rocket.faultedFunction
    faulted(err; scheduler::H = AsapScheduler())            where { H <: AbstractScheduler }
     faulted(::Type{T}, err; scheduler::H = AsapScheduler()) where { T, H <: AbstractScheduler }

    Creation operator for the FaultedObservable that emits no items to the Actor and immediately sends an error notification.

    Arguments

    • err: the particular Error to pass to the error notification.
    • T: type of output data source, optional, Any by default
    • scheduler: optional, scheduler-like object

    Examples

    using Rocket
     
     source = faulted("Error!")
    @@ -9,4 +9,4 @@
     # output
     
     [LogActor] Error: Error!
    -

    See also: FaultedObservable, subscribe!

    source
    Rocket.FaultedObservableType
    FaultedObservable{D, H}(err, scheduler::H)

    Observable that emits no items to the Actor and just sends an error notification on subscription.

    Constructor arguments

    • err: error to emit on subscription
    • scheduler: scheduler-like object

    See also: faulted

    source
    +

    See also: FaultedObservable, subscribe!

    source
    Rocket.FaultedObservableType
    FaultedObservable{D, H}(err, scheduler::H)

    Observable that emits no items to the Actor and just sends an error notification on subscription.

    Constructor arguments

    • err: error to emit on subscription
    • scheduler: scheduler-like object

    See also: faulted

    source
    diff --git a/v1.7.2/observables/types/file/index.html b/v1.7.2/observables/types/file/index.html index 22ff6f6d0..3cebade9d 100644 --- a/v1.7.2/observables/types/file/index.html +++ b/v1.7.2/observables/types/file/index.html @@ -1,2 +1,2 @@ -File · Rocket.jl
    +File · Rocket.jl
    diff --git a/v1.7.2/observables/types/function/index.html b/v1.7.2/observables/types/function/index.html index 9e1f231e6..bb4cb2a45 100644 --- a/v1.7.2/observables/types/function/index.html +++ b/v1.7.2/observables/types/function/index.html @@ -1,5 +1,5 @@ -Function · Rocket.jl

    Function Observable

    Rocket.makeFunction
    make(f::Function, type::Type{D})

    Creation operator for the FunctionObservable.

    Arguments

    • f: function to be invoked on subscription
    • type: type of data in observable

    Examples

    using Rocket
    +Function · Rocket.jl

    Function Observable

    Rocket.makeFunction
    make(f::Function, type::Type{D})

    Creation operator for the FunctionObservable.

    Arguments

    • f: function to be invoked on subscription
    • type: type of data in observable

    Examples

    using Rocket
     
     source = make(Int) do actor
         next!(actor, 0)
    @@ -30,13 +30,4 @@
     
     # output
     
    -[LogActor] Data: 0

    See also: FunctionObservable, subscribe!, logger

    source
    Rocket.FunctionObservableType
    FunctionObservable{D}(f::F)
    -
    -FunctionObservable wraps a callback `f`, which is called when the Observable is initially subscribed to.
    -This function is given an Actor, to which new values can be nexted (with `next!(actor, data)`),
    -or an `error!` method can be called to raise an error, or `complete!` can be called to notify of a successful completion.
    -
    -# Arguments
    -- `f::F`: function to be invoked on subscription
    -
    -See also: [`Subscribable`](@ref), [`make`](@ref)
    source
    +[LogActor] Data: 0

    See also: FunctionObservable, subscribe!, logger

    source
    Rocket.FunctionObservableType
    FunctionObservable{D}(f::F)

    FunctionObservable wraps a callback f, which is called when the Observable is initially subscribed to. This function is given an Actor, to which new values can be nexted (with next!(actor, data)), or an error! method can be called to raise an error, or complete! can be called to notify of a successful completion.

    Arguments

    • f::F: function to be invoked on subscription

    See also: Subscribable, make

    source
    diff --git a/v1.7.2/observables/types/generate/index.html b/v1.7.2/observables/types/generate/index.html index b1e0eeb41..6bd90d7b5 100644 --- a/v1.7.2/observables/types/generate/index.html +++ b/v1.7.2/observables/types/generate/index.html @@ -1,5 +1,5 @@ -Generate · Rocket.jl

    Generate Observable

    Rocket.generateFunction
    generate(initial::D, condition::C, iterator::I; scheduler::H = AsapScheduler()) where { D, C, I, H <: AbstractScheduler }

    Generates an observable sequence by running a state-driven loop producing the sequence's elements, using the specified scheduler to send out observer messages.

    Arguments

    • initial: initial state
    • condition: condition to terminate generation (upon returning false)
    • iterator: iteration step function
    • scheduler: optional, scheduler-like object

    Note

    iterator object should return objects of the same type as initial.

    Examples

    using Rocket
    +Generate · Rocket.jl

    Generate Observable

    Rocket.generateFunction
    generate(initial::D, condition::C, iterator::I; scheduler::H = AsapScheduler()) where { D, C, I, H <: AbstractScheduler }

    Generates an observable sequence by running a state-driven loop producing the sequence's elements, using the specified scheduler to send out observer messages.

    Arguments

    • initial: initial state
    • condition: condition to terminate generation (upon returning false)
    • iterator: iteration step function
    • scheduler: optional, scheduler-like object

    Note

    iterator object should return objects of the same type as initial.

    Examples

    using Rocket
     
     source = generate(1, x -> x < 3, x -> x + 1)
     subscribe!(source, logger())
    @@ -8,4 +8,4 @@
     # output
     [LogActor] Data: 1
     [LogActor] Data: 2
    -[LogActor] Completed

    See also: ScheduledSubscribable, subscribe!

    source
    +[LogActor] Completed

    See also: ScheduledSubscribable, subscribe!

    source
    diff --git a/v1.7.2/observables/types/interval/index.html b/v1.7.2/observables/types/interval/index.html index 34a0966d5..4c4cbca5b 100644 --- a/v1.7.2/observables/types/interval/index.html +++ b/v1.7.2/observables/types/interval/index.html @@ -1,5 +1,5 @@ -Interval · Rocket.jl

    Interval Observable

    Rocket.intervalFunction
    interval(period::Union{Int, Nothing} = nothing)

    Creation operator for the TimerObservable. interval returns an Observable that emits an infinite sequence of ascending integers, with a constant interval of time of your choosing between those emissions. The first emission is not sent immediately, but only after the first period has passed.

    Arguments

    • interval: the interval size in milliseconds

    Examples

    using Rocket
    +Interval · Rocket.jl

    Interval Observable

    Rocket.intervalFunction
    interval(period::Union{Int, Nothing} = nothing)

    Creation operator for the TimerObservable. interval returns an Observable that emits an infinite sequence of ascending integers, with a constant interval of time of your choosing between those emissions. The first emission is not sent immediately, but only after the first period has passed.

    Arguments

    • interval: the interval size in milliseconds

    Examples

    using Rocket
     
     source = interval(50)
     
    @@ -22,4 +22,4 @@
     [LogActor] Data: 3
     [LogActor] Data: 8
     [LogActor] Data: 9
    -[LogActor] Data: 10

    See also: timer, TimerObservable, Subscribable

    source
    +[LogActor] Data: 10

    See also: timer, TimerObservable, Subscribable

    source
    diff --git a/v1.7.2/observables/types/iterable/index.html b/v1.7.2/observables/types/iterable/index.html index 8306dcbd0..d11be5cf3 100644 --- a/v1.7.2/observables/types/iterable/index.html +++ b/v1.7.2/observables/types/iterable/index.html @@ -1,5 +1,5 @@ -Iterable · Rocket.jl

    Iterable Observable

    Rocket.iterableFunction
    iterable(iterator; scheduler::H = AsapScheduler()) where { H <: AbstractScheduler }

    Creation operator for the IterableObservable that wraps given iterator into an observable object.

    Arguments

    • iterator: an iterator object to be wrapped an observable
    • scheduler: optional, scheduler-like object

    Note

    iterable operators does not create a copy of iterator. Any changes in the iterator object might be visible in the created observable. For side-effects free behavior consider using from creation operator which creates a copy of a given object with a collect function.

    Examples

    using Rocket
    +Iterable · Rocket.jl

    Iterable Observable

    Rocket.iterableFunction
    iterable(iterator; scheduler::H = AsapScheduler()) where { H <: AbstractScheduler }

    Creation operator for the IterableObservable that wraps given iterator into an observable object.

    Arguments

    • iterator: an iterator object to be wrapped an observable
    • scheduler: optional, scheduler-like object

    Note

    iterable operators does not create a copy of iterator. Any changes in the iterator object might be visible in the created observable. For side-effects free behavior consider using from creation operator which creates a copy of a given object with a collect function.

    Examples

    using Rocket
     
     source = iterable([ 0, 1, 2 ])
     subscribe!(source, logger())
    @@ -23,4 +23,4 @@
     [LogActor] Data: l
     [LogActor] Data: l
     [LogActor] Data: o
    -[LogActor] Completed

    See also: ScheduledSubscribable, subscribe!, from

    source
    +[LogActor] Completed

    See also: ScheduledSubscribable, subscribe!, from

    source
    diff --git a/v1.7.2/observables/types/labeled/index.html b/v1.7.2/observables/types/labeled/index.html index 86b16e559..2c41c4865 100644 --- a/v1.7.2/observables/types/labeled/index.html +++ b/v1.7.2/observables/types/labeled/index.html @@ -1,5 +1,5 @@ -Labeled · Rocket.jl

    Labeled Observable

    Rocket.labeledFunction
    labeled(names::Val, stream)

    Creation operator for the LabeledObservable that wraps given stream, that produces Tuple values into a NamedTuple with given names.

    Arguments

    • names: a Val object that contains a tuple of symbols
    • stream: an observable that emits a Tuple, length of the Tuple events must be equal to the length of the names argument

    Examples

    using Rocket
    +Labeled · Rocket.jl

    Labeled Observable

    Rocket.labeledFunction
    labeled(names::Val, stream)

    Creation operator for the LabeledObservable that wraps given stream, that produces Tuple values into a NamedTuple with given names.

    Arguments

    • names: a Val object that contains a tuple of symbols
    • stream: an observable that emits a Tuple, length of the Tuple events must be equal to the length of the names argument

    Examples

    using Rocket
     
     source = labeled(Val((:x, :y)), from([ (1, 2), (2, 3), (3, 4) ]))
     subscribe!(source, logger())
    @@ -10,4 +10,4 @@
     [LogActor] Data: (x = 1, y = 2)
     [LogActor] Data: (x = 2, y = 3)
     [LogActor] Data: (x = 3, y = 4)
    -[LogActor] Completed

    See also: ScheduledSubscribable, subscribe!, from

    source
    +[LogActor] Completed

    See also: ScheduledSubscribable, subscribe!, from

    source
    diff --git a/v1.7.2/observables/types/merged/index.html b/v1.7.2/observables/types/merged/index.html index 63a0518b1..67856553a 100644 --- a/v1.7.2/observables/types/merged/index.html +++ b/v1.7.2/observables/types/merged/index.html @@ -1,5 +1,5 @@ -Merged · Rocket.jl

    Merged Observable

    Rocket.mergedFunction
    merged(sources::T) where { T <: Tuple }

    Creation operator for the MergeObservable with a given sources collected in a tuple. merge subscribes to each given input Observable (as arguments), and simply forwards (without doing any transformation) all the values from all the input Observables to the output Observable. The output Observable only completes once all input Observables have completed. Any error delivered by an input Observable will be immediately emitted on the output Observable.

    Examples

    using Rocket
    +Merged · Rocket.jl

    Merged Observable

    Rocket.mergedFunction
    merged(sources::T) where { T <: Tuple }

    Creation operator for the MergeObservable with a given sources collected in a tuple. merge subscribes to each given input Observable (as arguments), and simply forwards (without doing any transformation) all the values from all the input Observables to the output Observable. The output Observable only completes once all input Observables have completed. Any error delivered by an input Observable will be immediately emitted on the output Observable.

    Examples

    using Rocket
     
     observable = merged((from(1:4), of(2.0), from("Hello")))
     
    @@ -43,4 +43,4 @@
     [LogActor] Data: l
     [LogActor] Data: o
     [LogActor] Data: 1
    -[LogActor] Completed

    See also: Subscribable

    source
    +[LogActor] Completed

    See also: Subscribable

    source
    diff --git a/v1.7.2/observables/types/network/index.html b/v1.7.2/observables/types/network/index.html index 2e9c70b5c..36541c3f8 100644 --- a/v1.7.2/observables/types/network/index.html +++ b/v1.7.2/observables/types/network/index.html @@ -1,6 +1,6 @@ -Network · Rocket.jl

    Network Observable

    Rocket.networkFunction
    network(::Type{D}, port::Int)             where D
    +Network · Rocket.jl

    Network Observable

    Rocket.networkFunction
    network(::Type{D}, port::Int)             where D
     network(::Type{D}, address::A, port::Int) where { D, A <: IPAddr }
     
     network(::Type{Vector{D}}, port::Int, buffer_size::Int)             where D
    -network(::Type{Vector{D}}, address::A, port::Int, buffer_size::Int) where { D, A <: IPAddr }

    Creation operator for the NetworkObservable that emits messages from the server with specified address and port arguments.

    See also: NetworkObservable, subscribe!

    source
    +network(::Type{Vector{D}}, address::A, port::Int, buffer_size::Int) where { D, A <: IPAddr }

    Creation operator for the NetworkObservable that emits messages from the server with specified address and port arguments.

    See also: NetworkObservable, subscribe!

    source
    diff --git a/v1.7.2/observables/types/never/index.html b/v1.7.2/observables/types/never/index.html index 78afe7f11..aab81e561 100644 --- a/v1.7.2/observables/types/never/index.html +++ b/v1.7.2/observables/types/never/index.html @@ -1,9 +1,9 @@ -Never · Rocket.jl

    Never Observable

    Rocket.neverFunction
    never(T = Any)

    Creation operator for the NeverObservable that emits neither values nor errors nor the completion notification. It can be used for testing purposes or for composing with other Observables. Please note that by never emitting a complete notification, this Observable keeps the subscription from being disposed automatically. Subscriptions need to be manually disposed.

    Arguments

    • T: Type of Observable data, optional, Any is the default

    Examples

    using Rocket
    +Never · Rocket.jl

    Never Observable

    Rocket.neverFunction
    never(T = Any)

    Creation operator for the NeverObservable that emits neither values nor errors nor the completion notification. It can be used for testing purposes or for composing with other Observables. Please note that by never emitting a complete notification, this Observable keeps the subscription from being disposed automatically. Subscriptions need to be manually disposed.

    Arguments

    • T: Type of Observable data, optional, Any is the default

    Examples

    using Rocket
     
     source = never()
     subscribe!(source, logger())
     ;
     
     # output
    -

    See also: NeverObservable, subscribe!, logger

    source
    +

    See also: NeverObservable, subscribe!, logger

    source
    diff --git a/v1.7.2/observables/types/proxy/index.html b/v1.7.2/observables/types/proxy/index.html index f9ee61684..268f482af 100644 --- a/v1.7.2/observables/types/proxy/index.html +++ b/v1.7.2/observables/types/proxy/index.html @@ -1,5 +1,5 @@ -Proxy · Rocket.jl

    Proxy Observable

    ProxyObservable might help to create a custom operator. It wraps either source and/or actor with their proxied versions providing additional custom logic for on_subscribe! and/or for on_next!, on_error!, on_complete! methods.

    Rocket.proxyFunction
    proxy(::Type{L}, source, proxy) where L

    Creation operator for the ProxyObservable with a given source and proxy objects.

    Example

    using Rocket
    +Proxy · Rocket.jl

    Proxy Observable

    ProxyObservable might help to create a custom operator. It wraps either source and/or actor with their proxied versions providing additional custom logic for on_subscribe! and/or for on_next!, on_error!, on_complete! methods.

    Rocket.proxyFunction
    proxy(::Type{L}, source, proxy) where L

    Creation operator for the ProxyObservable with a given source and proxy objects.

    Example

    using Rocket
     
     source = from(1:5)
     
    @@ -27,4 +27,4 @@
     [LogActor] Data: 9
     [LogActor] Data: 16
     [LogActor] Data: 25
    -[LogActor] Completed

    See also: ProxyObservable, ActorProxy, SourceProxy, ActorSourceProxy

    source
    Rocket.ActorProxyType
    ActorProxy

    Can be used as a super type for common proxy object. Automatically specifies ValidActorProxy trait behavior. Each ActorProxy must implement its own method for actor_proxy!(::Type, proxy, actor) function which have to return a valid actor object.

    See also: proxy, actor_proxy!

    source
    Rocket.SourceProxyType
    SourceProxy

    Can be used as a super type for common proxy object. Automatically specifies ValidSourceProxy trait behavior. Each SourceProxy must implement its own method for source_proxy!(::Type, proxy, source) function which have to return a valid subscribable object.

    See also: proxy, source_proxy!

    source
    Rocket.ActorSourceProxyType
    ActorSourceProxy

    Can be used as a super type for common proxy object. Automatically specifies ValidActorSourceProxy trait behavior. Each ActorSourceProxy must implement its own method for source_proxy!(::Type, proxy, source) function which have to return a valid subscribable object and also for actor_proxy!(::Type, proxy, actor) function which have to return a valid actor object..

    See also: proxy, actor_proxy!, source_proxy!

    source
    Rocket.actor_proxy!Function
    actor_proxy!(::Type, proxy, actor)

    This is function is used to wrap an actor with its proxied version given a particular proxy object. Must return another actor. Each valid ActorProxy and ActorSourceProxy must implement its own method for actor_proxy! function. The first argument is the same as the type of data of the connected proxy observable.

    See also: proxy, ActorProxy, ActorSourceProxy

    source
    Rocket.source_proxy!Function
    source_proxy!(::Type, proxy, source)

    This is function is used to wrap a source with its proxied version given a particular proxy object. Must return another Observable. Each valid SourceProxy and ActorSourceProxy must implement its own method for source_proxy! function. The first argument is the same as the type of data of the connected proxy observable.

    See also: proxy, SourceProxy, ActorSourceProxy

    source
    +[LogActor] Completed

    See also: ProxyObservable, ActorProxy, SourceProxy, ActorSourceProxy

    source
    Rocket.ActorProxyType
    ActorProxy

    Can be used as a super type for common proxy object. Automatically specifies ValidActorProxy trait behavior. Each ActorProxy must implement its own method for actor_proxy!(::Type, proxy, actor) function which have to return a valid actor object.

    See also: proxy, actor_proxy!

    source
    Rocket.SourceProxyType
    SourceProxy

    Can be used as a super type for common proxy object. Automatically specifies ValidSourceProxy trait behavior. Each SourceProxy must implement its own method for source_proxy!(::Type, proxy, source) function which have to return a valid subscribable object.

    See also: proxy, source_proxy!

    source
    Rocket.ActorSourceProxyType
    ActorSourceProxy

    Can be used as a super type for common proxy object. Automatically specifies ValidActorSourceProxy trait behavior. Each ActorSourceProxy must implement its own method for source_proxy!(::Type, proxy, source) function which have to return a valid subscribable object and also for actor_proxy!(::Type, proxy, actor) function which have to return a valid actor object..

    See also: proxy, actor_proxy!, source_proxy!

    source
    Rocket.actor_proxy!Function
    actor_proxy!(::Type, proxy, actor)

    This is function is used to wrap an actor with its proxied version given a particular proxy object. Must return another actor. Each valid ActorProxy and ActorSourceProxy must implement its own method for actor_proxy! function. The first argument is the same as the type of data of the connected proxy observable.

    See also: proxy, ActorProxy, ActorSourceProxy

    source
    Rocket.source_proxy!Function
    source_proxy!(::Type, proxy, source)

    This is function is used to wrap a source with its proxied version given a particular proxy object. Must return another Observable. Each valid SourceProxy and ActorSourceProxy must implement its own method for source_proxy! function. The first argument is the same as the type of data of the connected proxy observable.

    See also: proxy, SourceProxy, ActorSourceProxy

    source
    diff --git a/v1.7.2/observables/types/race/index.html b/v1.7.2/observables/types/race/index.html index bb6d308a8..f81356204 100644 --- a/v1.7.2/observables/types/race/index.html +++ b/v1.7.2/observables/types/race/index.html @@ -1,5 +1,5 @@ -Race · Rocket.jl

    Race Observable

    Rocket.raceFunction
    race(sources...)
    +Race · Rocket.jl

    Race Observable

    Rocket.raceFunction
    race(sources...)
     race(sources::S) where { S <: Tuple }

    Combines multiple Observables to create an Observable that mirrors the output of the first Observable to emit an item. Essentially it subscribes to the observable that was the first to start emitting.

    Arguments

    • sources: input sources

    Examples

    using Rocket
     
     source1 = of(1)
    @@ -20,4 +20,4 @@
     
     # output
     [LogActor] Data: 2
    -[LogActor] Completed

    See also: Subscribable, subscribe!

    source
    +[LogActor] Completed

    See also: Subscribable, subscribe!

    source
    diff --git a/v1.7.2/observables/types/single/index.html b/v1.7.2/observables/types/single/index.html index f2f6f9217..dc9e71d5a 100644 --- a/v1.7.2/observables/types/single/index.html +++ b/v1.7.2/observables/types/single/index.html @@ -1,5 +1,5 @@ -Single · Rocket.jl

    Single Observable

    Rocket.ofFunction
    of(x; scheduler::H = AsapScheduler()) where { H <: AbstractScheduler }

    Creation operator for the SingleObservable that emits a single value x and then completes.

    Arguments

    • x: value to be emmited before completion

    Examples

    using Rocket
    +Single · Rocket.jl

    Single Observable

    Rocket.ofFunction
    of(x; scheduler::H = AsapScheduler()) where { H <: AbstractScheduler }

    Creation operator for the SingleObservable that emits a single value x and then completes.

    Arguments

    • x: value to be emmited before completion

    Examples

    using Rocket
     
     source = of(1)
     subscribe!(source, logger())
    @@ -9,4 +9,4 @@
     
     [LogActor] Data: 1
     [LogActor] Completed
    -

    See also: SingleObservable, subscribe!, logger

    source
    Rocket.SingleObservableType
    SingleObservable{D, H}(value::D, scheduler::H)

    SingleObservable wraps single value of type D into a observable.

    Constructor arguments

    • value: a single value to emit
    • scheduler: scheduler-like object

    See also: of, Subscribable

    source
    +

    See also: SingleObservable, subscribe!, logger

    source
    Rocket.SingleObservableType
    SingleObservable{D, H}(value::D, scheduler::H)

    SingleObservable wraps single value of type D into a observable.

    Constructor arguments

    • value: a single value to emit
    • scheduler: scheduler-like object

    See also: of, Subscribable

    source
    diff --git a/v1.7.2/observables/types/timer/index.html b/v1.7.2/observables/types/timer/index.html index 55e794a55..802161fb6 100644 --- a/v1.7.2/observables/types/timer/index.html +++ b/v1.7.2/observables/types/timer/index.html @@ -1,5 +1,5 @@ -Timer · Rocket.jl

    Timer Observable

    Rocket.timerFunction
    timer(delay::Int)
    +Timer · Rocket.jl

    Timer Observable

    Rocket.timerFunction
    timer(delay::Int)
     timer(delay::Int, period::Int)

    Creation operator for the TimerObservable. Its like interval(@ref), but you can specify when should the emissions start. timer returns an Observable that emits an infinite sequence of ascending integers, with a constant interval of time, period of your choosing between those emissions. The first emission happens after the specified delay. If period is not specified, the output Observable emits only one value, 0. Otherwise, it emits an infinite sequence.

    Arguments

    • delay: the initial delay time specified as an integer denoting milliseconds to wait before emitting the first value of 0.
    • period: the minimum period of time between emissions of the subsequent numbers (in milliseconds).

    Examples

    using Rocket
     
     source = timer(0, 50)
    @@ -16,4 +16,4 @@
     
     [LogActor] Data: 2
     [LogActor] Data: 3
    -

    See also: interval, TimerObservable, subscribe!, logger

    source
    Rocket.TimerObservableType
    TimerObservable

    An Observable that starts emitting after an delay and emits ever increasing numbers after each period of time thereafter.

    Parameters

    • delay: The initial delay time specified as an integer denoting milliseconds to wait before emitting the first value of 0`.
    • period: The minimum period of time in milliseconds between emissions of the subsequent numbers.

    See also: timer, Subscribable

    source
    +

    See also: interval, TimerObservable, subscribe!, logger

    source
    Rocket.TimerObservableType
    TimerObservable

    An Observable that starts emitting after an delay and emits ever increasing numbers after each period of time thereafter.

    Parameters

    • delay: The initial delay time specified as an integer denoting milliseconds to wait before emitting the first value of 0`.
    • period: The minimum period of time in milliseconds between emissions of the subsequent numbers.

    See also: timer, Subscribable

    source
    diff --git a/v1.7.2/observables/types/zipped/index.html b/v1.7.2/observables/types/zipped/index.html index eeddc99b3..1aeff7017 100644 --- a/v1.7.2/observables/types/zipped/index.html +++ b/v1.7.2/observables/types/zipped/index.html @@ -1,5 +1,5 @@ -Zipped · Rocket.jl

    Zipped Observable

    Rocket.zippedFunction
    zipped(sources...)

    Combines multiple Observables to create an Observable whose values are calculated from the values, in order, of each of its input Observables.

    Arguments

    • sources: input sources

    Examples

    using Rocket
    +Zipped · Rocket.jl

    Zipped Observable

    Rocket.zippedFunction
    zipped(sources...)

    Combines multiple Observables to create an Observable whose values are calculated from the values, in order, of each of its input Observables.

    Arguments

    • sources: input sources

    Examples

    using Rocket
     
     source = zipped(of(1), from(2:5))
     
    @@ -30,4 +30,4 @@
     
     # output
     
    -[LogActor] Completed

    See also: Subscribable, subscribe!

    source
    +[LogActor] Completed

    See also: Subscribable, subscribe!

    source
    diff --git a/v1.7.2/operators/about/index.html b/v1.7.2/operators/about/index.html index 5a41f4bc8..16e1d386a 100644 --- a/v1.7.2/operators/about/index.html +++ b/v1.7.2/operators/about/index.html @@ -1,5 +1,5 @@ -Operator · Rocket.jl

    Operators

    Even though the Observable is the foundation, reactive extensions is mostly useful because of its operators. Operators are the essential pieces that allow complex asynchronous code to be easily composed in a declarative manner.

    What are operators?

    There are two kinds of operators:

    Pipeable operators

    Pipeable Operators are the kind that can be piped to Observables using the syntax source |> operator(). These include the filter() and map() operators. When called, operators do not change the existing Observable instance. Instead, they return a new Observable, whose subscription logic is based on the first Observable.

    Note

    A Pipeable Operator is a function that takes an Observable as its input and returns another Observable. It is a pure operation: the previous Observable remains unmodified.

    A Pipeable Operator is essentially a pure callable object that accepts one Observable as input and returns another Observable as output. Subscribing to the output Observable will also subscribe to the input Observable.

    For example, the operator called map() is analogous to the Array method of the same name. Just like the array method map((d) -> d ^ 2, [ 1, 2, 3 ]) yields [ 1, 4, 9 ], the Observable emits 1, 4, 9:

    source = from([ 1, 2, 3 ])
    +Operator · Rocket.jl

    Operators

    Even though the Observable is the foundation, reactive extensions are mostly useful because of their operators. Operators are the essential pieces that allow complex asynchronous code to be easily composed in a declarative manner.

    What are operators?

    There are two kinds of operators:

    Pipeable operators

    Pipeable Operators are the kind that can be piped to Observables using the syntax source |> operator(). These include the filter() and map() operators. When called, operators do not change the existing Observable instance. Instead, they return a new Observable, whose subscription logic is based on the first Observable.

    Note

    A Pipeable Operator is a function that takes an Observable as its input and returns another Observable. It is a pure operation: the previous Observable remains unmodified.

    A Pipeable Operator is essentially a pure callable object that accepts one Observable as input and returns another Observable as output. Subscribing to the output Observable will also subscribe to the input Observable.

    For example, the operator called map() is analogous to the Array method of the same name. Just like the array method map((d) -> d ^ 2, [ 1, 2, 3 ]) yields [ 1, 4, 9 ], the Observable emits 1, 4, 9:

    source = from([ 1, 2, 3 ])
     subscribe!(source |> map(Int, (d) -> d ^ 2), lambda(
         on_next = (d) -> println(d)
     ))
    @@ -55,4 +55,4 @@
     
     // Logs
     // [LogActor] Data: 20
    -// [LogActor] Completed

    For stylistic reasons, on_call!(operator, source) is never used in practice - even if there is only one operator. Instead, source |> operator() is generally preferred.

    +// [LogActor] Completed

    For stylistic reasons, on_call!(operator, source) is never used in practice - even if there is only one operator. Instead, source |> operator() is generally preferred.

    diff --git a/v1.7.2/operators/all/index.html b/v1.7.2/operators/all/index.html index caaa236c2..cd1855f35 100644 --- a/v1.7.2/operators/all/index.html +++ b/v1.7.2/operators/all/index.html @@ -1,2 +1,2 @@ -All · Rocket.jl
    +All · Rocket.jl
    diff --git a/v1.7.2/operators/creation/about/index.html b/v1.7.2/operators/creation/about/index.html index 52b5f5974..b1a0a30e5 100644 --- a/v1.7.2/operators/creation/about/index.html +++ b/v1.7.2/operators/creation/about/index.html @@ -1,2 +1,2 @@ -Creation · Rocket.jl
    +Creation · Rocket.jl
    diff --git a/v1.7.2/operators/errors/about/index.html b/v1.7.2/operators/errors/about/index.html index 16f59b7cd..695da30e2 100644 --- a/v1.7.2/operators/errors/about/index.html +++ b/v1.7.2/operators/errors/about/index.html @@ -1,2 +1,2 @@ -About error handling operators · Rocket.jl
    +About error handling operators · Rocket.jl
    diff --git a/v1.7.2/operators/errors/catch_error/index.html b/v1.7.2/operators/errors/catch_error/index.html index 2dead2eca..dbff6b3d7 100644 --- a/v1.7.2/operators/errors/catch_error/index.html +++ b/v1.7.2/operators/errors/catch_error/index.html @@ -1,5 +1,5 @@ -catch_error · Rocket.jl

    Catch Error Operator

    Rocket.catch_errorFunction
    catch_error(selectorFn::F) where F

    Creates a CatchErrorOperator, which catches errors on the observable to be handled by returning a new observable or throwing an error.

    Arguments:

    • selectorFn::F: a callable object that takes as arguments err, which is the error, and caught, which is the source observable, in case you'd like to "retry" that observable by returning it again. Whatever observable is returned by the selector will be used to continue the observable chain.

    Producing

    Stream of type <: Subscribable{L} where L refers to type of source stream

    Examples

    using Rocket
    +catch_error · Rocket.jl

    Catch Error Operator

    Rocket.catch_errorFunction
    catch_error(selectorFn::F) where F

    Creates a CatchErrorOperator, which catches errors on the observable to be handled by returning a new observable or throwing an error.

    Arguments:

    • selectorFn::F: a callable object that takes as arguments err, which is the error, and caught, which is the source observable, in case you'd like to "retry" that observable by returning it again. Whatever observable is returned by the selector will be used to continue the observable chain.

    Producing

    Stream of type <: Subscribable{L} where L refers to type of source stream

    Examples

    using Rocket
     
     source = from(1:5) |> safe() |> map(Int, (d) -> d == 4 ? error(4) : d) |> catch_error((err, obs) -> of(1))
     
    @@ -11,4 +11,4 @@
     [LogActor] Data: 2
     [LogActor] Data: 3
     [LogActor] Data: 1
    -[LogActor] Completed

    See also: AbstractOperator, InferableOperator, rerun, logger, safe

    source

    See also

    Operators

    +[LogActor] Completed

    See also: AbstractOperator, InferableOperator, rerun, logger, safe

    source

    See also

    Operators

    diff --git a/v1.7.2/operators/errors/error_if/index.html b/v1.7.2/operators/errors/error_if/index.html index f677ef034..382ea0a88 100644 --- a/v1.7.2/operators/errors/error_if/index.html +++ b/v1.7.2/operators/errors/error_if/index.html @@ -1,5 +1,5 @@ -error_if · Rocket.jl

    Error If Operator

    Rocket.error_ifFunction
    error_if(checkFn, errorFn)

    Creates an error_if operator, which performs a check for every emission on the source Observable with checkFn. If checkFn returns true, the operator sends an error event and unsubscribes from the observable.

    Arguments

    • checkFn: check function with (data) -> Bool signature
    • errorFn: error object generating function with (data) -> Any signature, optional

    Producing

    Stream of type <: Subscribable{L} where L refers to type of source stream

    Examples

    using Rocket
    +error_if · Rocket.jl

    Error If Operator

    Rocket.error_ifFunction
    error_if(checkFn, errorFn)

    Creates an error_if operator, which performs a check for every emission on the source Observable with checkFn. If checkFn returns true, the operator sends an error event and unsubscribes from the observable.

    Arguments

    • checkFn: check function with (data) -> Bool signature
    • errorFn: error object generating function with (data) -> Any signature, optional

    Producing

    Stream of type <: Subscribable{L} where L refers to type of source stream

    Examples

    using Rocket
     
     source = from([1, 2, 3]) |> error_if((data) -> data > 2, (data) -> "CustomError")
     
    @@ -13,4 +13,4 @@
     # output
     Next: 1
     Next: 2
    -Error: CustomError

    See also: error_if_not, error_if_empty, default_if_empty, lambda

    source

    See also

    Operators

    +Error: CustomError

    See also: error_if_not, error_if_empty, default_if_empty, lambda

    source

    See also

    Operators

    diff --git a/v1.7.2/operators/errors/error_if_not/index.html b/v1.7.2/operators/errors/error_if_not/index.html index ccaf058cd..1e74e473e 100644 --- a/v1.7.2/operators/errors/error_if_not/index.html +++ b/v1.7.2/operators/errors/error_if_not/index.html @@ -1,5 +1,5 @@ -error_if_not · Rocket.jl

    Error If Not Operator

    Note: error_if_not is an alias for error_if operator with inverted checkFn.

    Rocket.error_if_notFunction
    error_if_not(checkFn, errorFn)

    Creates an error_if_not operator, which performs a check for every emission on the source Observable with checkFn. If checkFn returns false, the operator sends an error event and unsubscribes from the observable.

    Note: error_if_not is an alias for error_if operator with inverted checkFn.

    Arguments

    • checkFn: check function with (data) -> Bool signature
    • errorFn: error object generating function with (data) -> Any signature, optional

    Producing

    Stream of type <: Subscribable{L} where L refers to type of source stream

    Examples

    using Rocket
    +error_if_not · Rocket.jl

    Error If Not Operator

    Note: error_if_not is an alias for error_if operator with inverted checkFn.

    Rocket.error_if_notFunction
    error_if_not(checkFn, errorFn)

    Creates an error_if_not operator, which performs a check for every emission on the source Observable with checkFn. If checkFn returns false, the operator sends an error event and unsubscribes from the observable.

    Note: error_if_not is an alias for error_if operator with inverted checkFn.

    Arguments

    • checkFn: check function with (data) -> Bool signature
    • errorFn: error object generating function with (data) -> Any signature, optional

    Producing

    Stream of type <: Subscribable{L} where L refers to type of source stream

    Examples

    using Rocket
     
     source = from([1, 2, 3]) |> error_if_not((data) -> data < 2, (data) -> "CustomError")
     
    @@ -12,4 +12,4 @@
     
     # output
     Next: 1
    -Error: CustomError

    See also: error_if, error_if_empty, default_if_empty, logger

    source

    See also

    Operators

    +Error: CustomError

    See also: error_if, error_if_empty, default_if_empty, logger

    source

    See also

    Operators

    diff --git a/v1.7.2/operators/errors/rerun/index.html b/v1.7.2/operators/errors/rerun/index.html index 235903c84..04b1979f3 100644 --- a/v1.7.2/operators/errors/rerun/index.html +++ b/v1.7.2/operators/errors/rerun/index.html @@ -1,5 +1,5 @@ -rerun · Rocket.jl

    Rerun Operator

    Rocket.rerunFunction
    rerun(count::Int = -1)

    Returns an Observable that mirrors the source Observable with the exception of an error. If the source Observable calls error, this method will resubscribe to the source Observable for a maximum of count resubscriptions (given as a number parameter) rather than propagating the error call.

    Arguments:

    • count::Int: Number of retry attempts before failing. Optional. Default is -1.

    Producing

    Stream of type <: Subscribable{L} where L refers to type of source stream

    Examples

    using Rocket
    +rerun · Rocket.jl

    Rerun Operator

    Rocket.rerunFunction
    rerun(count::Int = -1)

    Returns an Observable that mirrors the source Observable with the exception of an error. If the source Observable calls error, this method will resubscribe to the source Observable for a maximum of count resubscriptions (given as a number parameter) rather than propagating the error call.

    Arguments:

    • count::Int: Number of retry attempts before failing. Optional. Default is -1.

    Producing

    Stream of type <: Subscribable{L} where L refers to type of source stream

    Examples

    using Rocket
     
     source = from(1:3) |> safe() |> map(Int, (d) -> d > 1 ? error("Error") : d) |> rerun(3)
     
    @@ -11,4 +11,4 @@
     [LogActor] Data: 1
     [LogActor] Data: 1
     [LogActor] Data: 1
    -[LogActor] Error: ErrorException("Error")

    See also: AbstractOperator, InferableOperator, catch_error, logger, safe

    source

    Description

    Any and all items emitted by the source Observable will be emitted by the resulting Observable, even those emitted during failed subscriptions. For example, if an Observable fails at first but emits [1, 2] then succeeds the second time and emits: [1, 2, 3, 4, 5] then the complete stream of emissions and notifications would be: [1, 2, 1, 2, 3, 4, 5, complete].

    See also

    Operators

    +[LogActor] Error: ErrorException("Error")

    See also: AbstractOperator, InferableOperator, catch_error, logger, safe

    source

    Description

    Any and all items emitted by the source Observable will be emitted by the resulting Observable, even those emitted during failed subscriptions. For example, if an Observable fails at first but emits [1, 2] then succeeds the second time and emits: [1, 2, 3, 4, 5] then the complete stream of emissions and notifications would be: [1, 2, 1, 2, 3, 4, 5, complete].

    See also

    Operators

    diff --git a/v1.7.2/operators/filtering/about/index.html b/v1.7.2/operators/filtering/about/index.html index 36ab16091..cf5bb51c0 100644 --- a/v1.7.2/operators/filtering/about/index.html +++ b/v1.7.2/operators/filtering/about/index.html @@ -1,2 +1,2 @@ -About filtering operators · Rocket.jl
    +About filtering operators · Rocket.jl
    diff --git a/v1.7.2/operators/filtering/filter/index.html b/v1.7.2/operators/filtering/filter/index.html index d32988b6e..72e6c1644 100644 --- a/v1.7.2/operators/filtering/filter/index.html +++ b/v1.7.2/operators/filtering/filter/index.html @@ -1,5 +1,5 @@ -filter · Rocket.jl

    Filter Operator

    Base.filterFunction
    filter(filterFn::F) where { F <: Function }

    Creates a filter operator, which filters items of the source Observable by emitting only those that satisfy a specified filterFn predicate.

    Producing

    Stream of type <: Subscribable{L} where L refers to type of source stream

    Arguments

    • filterFn::F: predicate function with (data::T) -> Bool signature

    Examples

    using Rocket
    +filter · Rocket.jl

    Filter Operator

    Base.filterFunction
    filter(filterFn::F) where { F <: Function }

    Creates a filter operator, which filters items of the source Observable by emitting only those that satisfy a specified filterFn predicate.

    Producing

    Stream of type <: Subscribable{L} where L refers to type of source stream

    Arguments

    • filterFn::F: predicate function with (data::T) -> Bool signature

    Examples

    using Rocket
     
     source = from([ 1, 2, 3, 4, 5, 6 ])
     subscribe!(source |> filter((d) -> d % 2 == 0), logger())
    @@ -10,4 +10,4 @@
     [LogActor] Data: 2
     [LogActor] Data: 4
     [LogActor] Data: 6
    -[LogActor] Completed

    See also: AbstractOperator, InferableOperator, ProxyObservable, logger

    source

    Description

    Like filter(f, array), this operator takes values from the source Observable, passes them through a predicate function and only emits those values that yielded true.

    See also

    Operators

    +[LogActor] Completed

    See also: AbstractOperator, InferableOperator, ProxyObservable, logger

    source

    Description

    Like filter(f, array), this operator takes values from the source Observable, passes them through a predicate function and only emits those values that yielded true.

    See also

    Operators

    diff --git a/v1.7.2/operators/filtering/filter_type/index.html b/v1.7.2/operators/filtering/filter_type/index.html index 56c469fc9..8018acc59 100644 --- a/v1.7.2/operators/filtering/filter_type/index.html +++ b/v1.7.2/operators/filtering/filter_type/index.html @@ -1,5 +1,5 @@ -filter_type · Rocket.jl

    FilterType Operator

    Rocket.filter_typeFunction
    filter_type(type::Type{ T }) where { T }

    Creates a filter_type operator, which filters items of the source Observable by emitting only those that match a specified T type with a <: operator. This operator is a more efficient version of filter(v -> v <: T) |> map(T, v -> v) operators chain.

    Producing

    Stream of type <: Subscribable{ T } where T refers to type argument

    Examples

    using Rocket
    +filter_type · Rocket.jl

    FilterType Operator

    Rocket.filter_typeFunction
    filter_type(type::Type{ T }) where { T }

    Creates a filter_type operator, which filters items of the source Observable by emitting only those that match a specified T type with a <: operator. This operator is a more efficient version of filter(v -> v <: T) |> map(T, v -> v) operators chain.

    Producing

    Stream of type <: Subscribable{ T } where T refers to type argument

    Examples

    using Rocket
     
     source = from(Real[ 1, 2.0, 3, 4.0, 5, 6.0 ])
     subscribe!(source |> filter_type(Int), logger())
    @@ -10,4 +10,4 @@
     [LogActor] Data: 1
     [LogActor] Data: 3
     [LogActor] Data: 5
    -[LogActor] Completed

    See also: AbstractOperator, InferableOperator, ProxyObservable, logger

    source

    See also

    Operators

    +[LogActor] Completed

    See also: AbstractOperator, InferableOperator, ProxyObservable, logger

    source

    See also

    Operators

    diff --git a/v1.7.2/operators/filtering/find/index.html b/v1.7.2/operators/filtering/find/index.html index f88690649..ea8791579 100644 --- a/v1.7.2/operators/filtering/find/index.html +++ b/v1.7.2/operators/filtering/find/index.html @@ -1,5 +1,5 @@ -find · Rocket.jl

    Find operator

    Rocket.findFunction
    find(conditionFn::F) where { F <: Function }

    Creates a find operator, which emits only the first value emitted by the source Observable that meets some condition.

    Producing

    Stream of type <: Subscribable{L} where L refers to type of source stream

    Arguments

    • conditionFn::F: condition function with (data::T) -> Bool signature

    Examples

    using Rocket
    +find · Rocket.jl

    Find operator

    Rocket.findFunction
    find(conditionFn::F) where { F <: Function }

    Creates a find operator, which emits only the first value emitted by the source Observable that meets some condition.

    Producing

    Stream of type <: Subscribable{L} where L refers to type of source stream

    Arguments

    • conditionFn::F: condition function with (data::T) -> Bool signature

    Examples

    using Rocket
     
     source = from([ 1, 2, 3, 4, 5, 6, 7, 8 ])
     subscribe!(source |> find((d) -> d % 2 == 0), logger())
    @@ -8,4 +8,4 @@
     # output
     
     [LogActor] Data: 2
    -[LogActor] Completed

    See also: AbstractOperator, InferableOperator, ProxyObservable, logger

    source

    Description

    find searches for the first item in the source Observable that matches the specified condition embodied by the predicate, and returns the first occurrence in the source. Does not emit an error if a valid value is not found.

    See also

    Operators, take

    +[LogActor] Completed

    See also: AbstractOperator, InferableOperator, ProxyObservable, logger

    source

    Description

    find searches for the first item in the source Observable that matches the specified condition embodied by the predicate, and returns the first occurrence in the source. Does not emit an error if a valid value is not found.

    See also

    Operators, take

    diff --git a/v1.7.2/operators/filtering/find_index/index.html b/v1.7.2/operators/filtering/find_index/index.html index f639aba1a..515b04d94 100644 --- a/v1.7.2/operators/filtering/find_index/index.html +++ b/v1.7.2/operators/filtering/find_index/index.html @@ -1,5 +1,5 @@ -find_index · Rocket.jl

    Find Index operator

    Rocket.find_indexFunction
    find_index(conditionFn::F) where { F <: Function }

    Creates a find operator, which emits only the index of the first value emitted by the source Observable that meets some condition. Indices are 1-based.

    Producing

    Stream of type <: Subscribable{L} where L refers to type of source stream

    Arguments

    • conditionFn::F: condition function with (data::T) -> Bool signature

    Examples

    using Rocket
    +find_index · Rocket.jl

    Find Index operator

    Rocket.find_indexFunction
    find_index(conditionFn::F) where { F <: Function }

    Creates a find operator, which emits only the index of the first value emitted by the source Observable that meets some condition. Indices are 1-based.

    Producing

    Stream of type <: Subscribable{L} where L refers to type of source stream

    Arguments

    • conditionFn::F: condition function with (data::T) -> Bool signature

    Examples

    using Rocket
     
     source = from([ 0, 1, 2, 3, 4, 5, 6, 7, 8 ])
     subscribe!(source |> find_index((d) -> d !== 0 && d % 2 == 0), logger())
    @@ -8,4 +8,4 @@
     # output
     
     [LogActor] Data: 3
    -[LogActor] Completed

    See also: find, AbstractOperator, InferableOperator, ProxyObservable, logger

    source

    Description

    It's like find, but emits the index of the found value, not the value itself.

    See also

    Operators, take

    +[LogActor] Completed

    See also: find, AbstractOperator, InferableOperator, ProxyObservable, logger

    source

    Description

    It's like find, but emits the index of the found value, not the value itself.

    See also

    Operators, take

    diff --git a/v1.7.2/operators/filtering/first/index.html b/v1.7.2/operators/filtering/first/index.html index 499f82997..f7a6ab111 100644 --- a/v1.7.2/operators/filtering/first/index.html +++ b/v1.7.2/operators/filtering/first/index.html @@ -1,5 +1,5 @@ -first · Rocket.jl

    First operator

    Base.firstFunction
    first(; default = nothing)

    Creates a first operator, which returns an Observable that emits only the first value emitted by the source Observable. Sends FirstNotFoundException error message if a given source completes without emitting a single value.

    Arguments

    • default: an optional default value to provide if no values were emitted

    Producing

    Stream of type <: Subscribable{L} where L refers to type of source stream

    Examples

    using Rocket
    +first · Rocket.jl

    First operator

    Base.firstFunction
    first(; default = nothing)

    Creates a first operator, which returns an Observable that emits only the first value emitted by the source Observable. Sends FirstNotFoundException error message if a given source completes without emitting a single value.

    Arguments

    • default: an optional default value to provide if no values were emitted

    Producing

    Stream of type <: Subscribable{L} where L refers to type of source stream

    Examples

    using Rocket
     
     source       = from(1:100)
     subscription = subscribe!(source |> first(), logger())
    @@ -8,4 +8,4 @@
     # output
     
     [LogActor] Data: 1
    -[LogActor] Completed

    See also: take, logger

    source

    Description

    An alias for take(1) operator.

    See also

    Operators, take

    +[LogActor] Completed

    See also: take, logger

    source

    Description

    An alias for take(1) operator.

    See also

    Operators, take

    diff --git a/v1.7.2/operators/filtering/ignore/index.html b/v1.7.2/operators/filtering/ignore/index.html index c80db25aa..de46e3a5c 100644 --- a/v1.7.2/operators/filtering/ignore/index.html +++ b/v1.7.2/operators/filtering/ignore/index.html @@ -1,5 +1,5 @@ -ignore · Rocket.jl

    Ignore operator

    Rocket.ignoreFunction
    ignore(count::Int)

    Creates a ignore operator, which returns an Observable that skips the first count items emitted by the source Observable.

    Arguments

    • count::Int: the number of times, items emitted by source Observable should be skipped.

    Producing

    Stream of type <: Subscribable{L} where L refers to type of source stream

    Examples

    using Rocket
    +ignore · Rocket.jl

    Ignore operator

    Rocket.ignoreFunction
    ignore(count::Int)

    Creates a ignore operator, which returns an Observable that skips the first count items emitted by the source Observable.

    Arguments

    • count::Int: the number of times, items emitted by source Observable should be skipped.

    Producing

    Stream of type <: Subscribable{L} where L refers to type of source stream

    Examples

    using Rocket
     
     source = from(1:5)
     
    @@ -11,4 +11,4 @@
     [LogActor] Data: 3
     [LogActor] Data: 4
     [LogActor] Data: 5
    -[LogActor] Completed

    See also: AbstractOperator, InferableOperator, ProxyObservable, logger

    source

    See also

    Operators

    +[LogActor] Completed

    See also: AbstractOperator, InferableOperator, ProxyObservable, logger

    source

    See also

    Operators

    diff --git a/v1.7.2/operators/filtering/last/index.html b/v1.7.2/operators/filtering/last/index.html index 435c4475d..193280f0b 100644 --- a/v1.7.2/operators/filtering/last/index.html +++ b/v1.7.2/operators/filtering/last/index.html @@ -1,5 +1,5 @@ -last · Rocket.jl

    Last Operator

    Base.lastFunction
    last(; default = nothing)

    Creates a last operator, which returns an Observable that emits only the last item emitted by the source Observable. Sends LastNotFoundException error message if a given source completes without emitting a single value.

    Arguments

    • default: an optional default value to provide if no values were emitted

    Producing

    Stream of type <: Subscribable{L} where L refers to type of source stream

    Examples

    using Rocket
    +last · Rocket.jl

    Last Operator

    Base.lastFunction
    last(; default = nothing)

    Creates a last operator, which returns an Observable that emits only the last item emitted by the source Observable. Sends LastNotFoundException error message if a given source completes without emitting a single value.

    Arguments

    • default: an optional default value to provide if no values were emitted

    Producing

    Stream of type <: Subscribable{L} where L refers to type of source stream

    Examples

    using Rocket
     
     source = from([ 1, 2, 3 ])
     subscribe!(source |> last(), logger())
    @@ -27,4 +27,4 @@
     # output
     
     [LogActor] Data: 1
    -[LogActor] Completed

    See also: AbstractOperator, InferableOperator, ProxyObservable, logger

    source

    Description

    last operator returns an Observable that emits only the last item emitted by the source Observable.

    See also

    Operators

    +[LogActor] Completed

    See also: AbstractOperator, InferableOperator, ProxyObservable, logger

    source

    Description

    last operator returns an Observable that emits only the last item emitted by the source Observable.

    See also

    Operators

    diff --git a/v1.7.2/operators/filtering/some/index.html b/v1.7.2/operators/filtering/some/index.html index bf8596b0e..fcfffeb3e 100644 --- a/v1.7.2/operators/filtering/some/index.html +++ b/v1.7.2/operators/filtering/some/index.html @@ -1,5 +1,5 @@ -some · Rocket.jl

    Some Operator

    Rocket.someFunction
    some()

    Creates a some operator, which filters out nothing items by the source Observable by emitting only those that not equal to nothing.

    Producing

    Stream of type <: Subscribable{L} where L refers to type of source stream <: Subscribable{Union{L, Nothing}}

    Examples

    using Rocket
    +some · Rocket.jl

    Some Operator

    Rocket.someFunction
    some()

    Creates a some operator, which filters out nothing items by the source Observable by emitting only those that not equal to nothing.

    Producing

    Stream of type <: Subscribable{L} where L refers to type of source stream <: Subscribable{Union{L, Nothing}}

    Examples

    using Rocket
     
     source = from([ 1, nothing, 3 ])
     subscribe!(source |> some(), logger())
    @@ -10,4 +10,4 @@
     [LogActor] Data: 1
     [LogActor] Data: 3
     [LogActor] Completed
    -

    See also: AbstractOperator, InferableOperator, ProxyObservable, max, min, logger

    source

    Description

    This operator takes values from the source Observable and only emits those values that are not nothing.

    See also

    Operators, filter

    +

    See also: AbstractOperator, InferableOperator, ProxyObservable, max, min, logger

    source

    Description

    This operator takes values from the source Observable and only emits those values that are not nothing.

    See also

    Operators, filter

    diff --git a/v1.7.2/operators/filtering/take/index.html b/v1.7.2/operators/filtering/take/index.html index 03a111bfe..c267edec2 100644 --- a/v1.7.2/operators/filtering/take/index.html +++ b/v1.7.2/operators/filtering/take/index.html @@ -1,5 +1,5 @@ -take · Rocket.jl

    Take Operator

    Rocket.takeFunction
    take(maxcount::Int)

    Creates a take operator, which returns an Observable that emits only the first maxcount values emitted by the source Observable.

    Arguments

    • maxcount::Int: the maximum number of next values to emit.

    Producing

    Stream of type <: Subscribable{L} where L refers to type of source stream

    Examples

    using Rocket
    +take · Rocket.jl

    Take Operator

    Rocket.takeFunction
    take(maxcount::Int)

    Creates a take operator, which returns an Observable that emits only the first maxcount values emitted by the source Observable.

    Arguments

    • maxcount::Int: the maximum number of next values to emit.

    Producing

    Stream of type <: Subscribable{L} where L refers to type of source stream

    Examples

    using Rocket
     
     source = from([ i for i in 1:100 ])
     
    @@ -13,4 +13,4 @@
     [LogActor] Data: 3
     [LogActor] Data: 4
     [LogActor] Data: 5
    -[LogActor] Completed

    See also: AbstractOperator, InferableOperator, ProxyObservable, logger

    source

    Description

    take returns an Observable that emits only the first count values emitted by the source Observable. If the source emits fewer than count values, then all of its values are emitted. Afterwards, the Observable completes regardless of whether the source completed.

    See also

    Operators

    +[LogActor] Completed

    See also: AbstractOperator, InferableOperator, ProxyObservable, logger

    source

    Description

    take returns an Observable that emits only the first count values emitted by the source Observable. If the source emits fewer than count values, then all of its values are emitted. Afterwards, the Observable completes regardless of whether the source completed.

    See also

    Operators

    diff --git a/v1.7.2/operators/filtering/take_until/index.html b/v1.7.2/operators/filtering/take_until/index.html index c2610ae7e..aedee148c 100644 --- a/v1.7.2/operators/filtering/take_until/index.html +++ b/v1.7.2/operators/filtering/take_until/index.html @@ -1,5 +1,5 @@ -take_until · Rocket.jl

    TakeUntil Operator

    Rocket.take_untilFunction
    take_until(notifier::S)

    Creates a take operator, which returns an Observable that emits the values emitted by the source Observable until a notifier Observable emits a value or a completion event.

    Arguments

    • notifier::S: The Observable whose first emitted value will cause the output Observable of take_until to stop emitting values from the source Observable.

    Producing

    Stream of type <: Subscribable{L} where L refers to type of source stream

    Examples

    using Rocket
    +take_until · Rocket.jl

    TakeUntil Operator

    Rocket.take_untilFunction
    take_until(notifier::S)

    Creates a take operator, which returns an Observable that emits the values emitted by the source Observable until a notifier Observable emits a value or a completion event.

    Arguments

    • notifier::S: The Observable whose first emitted value will cause the output Observable of take_until to stop emitting values from the source Observable.

    Producing

    Stream of type <: Subscribable{L} where L refers to type of source stream

    Examples

    using Rocket
     
     source = interval(100) |> take_until(timer(1000))
     
    @@ -29,4 +29,4 @@
     [LogActor] Data: 0
     [LogActor] Data: 1
     [LogActor] Data: 2
    -[LogActor] Completed

    See also: AbstractOperator, InferableOperator, ProxyObservable, logger

    source

    Description

    take_until subscribes and begins mirroring the source Observable. It also monitors a second Observable, notifier that you provide. If the notifier emits a value, the output Observable stops mirroring the source Observable and completes. If the notifier doesn't emit any value and completes then take_until also completes.

    See also

    Operators

    +[LogActor] Completed

    See also: AbstractOperator, InferableOperator, ProxyObservable, logger

    source

    Description

    take_until subscribes and begins mirroring the source Observable. It also monitors a second Observable, notifier that you provide. If the notifier emits a value, the output Observable stops mirroring the source Observable and completes. If the notifier doesn't emit any value and completes then take_until also completes.

    See also

    Operators

    diff --git a/v1.7.2/operators/join/about/index.html b/v1.7.2/operators/join/about/index.html index e42971444..7db7d5c95 100644 --- a/v1.7.2/operators/join/about/index.html +++ b/v1.7.2/operators/join/about/index.html @@ -1,2 +1,2 @@ -Join category · Rocket.jl

    Join category

    There are operators for different purposes, and they may be categorized as: creation, transformation, filtering, joining, multicasting, error handling, utility, etc. In the following list you will find all the operators organized in join category.

    See also

    Operators

    +Join category · Rocket.jl

    Join category

    There are operators for different purposes, and they may be categorized as: creation, transformation, filtering, joining, multicasting, error handling, utility, etc. In the following list you will find all the operators organized in join category.

    See also

    Operators

    diff --git a/v1.7.2/operators/join/with_latest/index.html b/v1.7.2/operators/join/with_latest/index.html index 90ae236ab..2ac8ae8d6 100644 --- a/v1.7.2/operators/join/with_latest/index.html +++ b/v1.7.2/operators/join/with_latest/index.html @@ -1,5 +1,5 @@ -with_latest · Rocket.jl

    WithLatest Operator

    Rocket.with_latestFunction
    with_latest(sources...)

    Creates a with_latest operator, which combines the source Observable with other Observables to create an Observable whose values are calculated from the latest values of each, only when the source emits.

    Examples

    using Rocket
    +with_latest · Rocket.jl

    WithLatest Operator

    Rocket.with_latestFunction
    with_latest(sources...)

    Creates a with_latest operator, which combines the source Observable with other Observables to create an Observable whose values are calculated from the latest values of each, only when the source emits.

    Examples

    using Rocket
     
     source = of(1)
     subscribe!(source |> with_latest(from(1:5)), logger())
    @@ -8,4 +8,4 @@
     # output
     
     [LogActor] Data: (1, 5)
    -[LogActor] Completed

    See also: AbstractOperator, InferableOperator

    source

    See also

    Operators

    +[LogActor] Completed

    See also: AbstractOperator, InferableOperator

    source

    See also

    Operators

    diff --git a/v1.7.2/operators/mathematical/about/index.html b/v1.7.2/operators/mathematical/about/index.html index efc52dd8c..a140486da 100644 --- a/v1.7.2/operators/mathematical/about/index.html +++ b/v1.7.2/operators/mathematical/about/index.html @@ -1,2 +1,2 @@ -About mathematical operators · Rocket.jl
    +About mathematical operators · Rocket.jl
    diff --git a/v1.7.2/operators/mathematical/count/index.html b/v1.7.2/operators/mathematical/count/index.html index 8b6d9ab3c..b65ba81d9 100644 --- a/v1.7.2/operators/mathematical/count/index.html +++ b/v1.7.2/operators/mathematical/count/index.html @@ -1,5 +1,5 @@ -count · Rocket.jl

    Count Operator

    Base.countFunction
    count()

    Creates a count operator, which counts the number of emissions on the source and emits that number when the source completes.

    Producing

    Stream of type <: Subscribable{Int}

    Examples

    using Rocket
    +count · Rocket.jl

    Count Operator

    Base.countFunction
    count()

    Creates a count operator, which counts the number of emissions on the source and emits that number when the source completes.

    Producing

    Stream of type <: Subscribable{Int}

    Examples

    using Rocket
     
     source = from([ i for i in 1:42 ])
     subscribe!(source |> count(), logger())
    @@ -9,7 +9,7 @@
     
     [LogActor] Data: 42
     [LogActor] Completed
    -

    See also: AbstractOperator, RightTypedOperator, ProxyObservable, logger

    source

    Description

    count transforms an Observable that emits values into an Observable that emits a single value that represents the number of values emitted by the source Observable. If the source Observable terminates with an error, count will pass this error notification along without emitting a value first. If the source Observable does not terminate at all, count will neither emit a value nor terminate.

    Example

    Counts how many values source Observable have emitted before the complete event happened

    using Rocket
    +

    See also: AbstractOperator, RightTypedOperator, ProxyObservable, logger

    source

    Description

    count transforms an Observable that emits values into an Observable that emits a single value that represents the number of values emitted by the source Observable. If the source Observable terminates with an error, count will pass this error notification along without emitting a value first. If the source Observable does not terminate at all, count will neither emit a value nor terminate.

    Example

    Counts how many values source Observable have emitted before the complete event happened

    using Rocket
     
     source = from([ i for i in 1:42 ])
     subscribe!(source |> count(), logger())
    @@ -17,4 +17,4 @@
     # output
     
     [LogActor] Data: 42
    -[LogActor] Completed

    See also

    Operators

    +[LogActor] Completed

    See also

    Operators

    diff --git a/v1.7.2/operators/mathematical/max/index.html b/v1.7.2/operators/mathematical/max/index.html index fa7624052..b5c22a297 100644 --- a/v1.7.2/operators/mathematical/max/index.html +++ b/v1.7.2/operators/mathematical/max/index.html @@ -1,5 +1,5 @@ -max · Rocket.jl

    Max Operator

    Base.maxFunction
    max(; from = nothing)

    Creates a max operator, which emits a single item: the item with the largest value.

    Arguments

    • from: optional initial maximum value, if nothing first item from the source will be used as initial instead

    Producing

    Stream of type <: Subscribable{Union{L, Nothing}} where L refers to type of source stream

    Examples

    using Rocket
    +max · Rocket.jl

    Max Operator

    Base.maxFunction
    max(; from = nothing)

    Creates a max operator, which emits a single item: the item with the largest value.

    Arguments

    • from: optional initial maximum value, if nothing first item from the source will be used as initial instead

    Producing

    Stream of type <: Subscribable{Union{L, Nothing}} where L refers to type of source stream

    Examples

    using Rocket
     
     source = from([ i for i in 1:42 ])
     subscribe!(source |> max(), logger())
    @@ -9,4 +9,4 @@
     
     [LogActor] Data: 42
     [LogActor] Completed
    -

    See also: AbstractOperator, InferableOperator, ProxyObservable, logger

    source

    Description

    The max operator operates on an Observable of similar objects. When the source Observable completes, it emits the item with the largest value.

    See also

    Operators

    +

    See also: AbstractOperator, InferableOperator, ProxyObservable, logger

    source

    Description

    The max operator operates on an Observable of similar objects. When the source Observable completes, it emits the item with the largest value.

    See also

    Operators

    diff --git a/v1.7.2/operators/mathematical/min/index.html b/v1.7.2/operators/mathematical/min/index.html index 96512a4bb..67192f6dc 100644 --- a/v1.7.2/operators/mathematical/min/index.html +++ b/v1.7.2/operators/mathematical/min/index.html @@ -1,5 +1,5 @@ -min · Rocket.jl

    Min Operator

    Base.minFunction
    min(; from = nothing)

    Creates a min operator, which emits a single item: the item with the smallest value.

    Arguments

    • from: optional initial minimal value, if nothing first item from the source will be used as initial instead

    Producing

    Stream of type <: Subscribable{Union{L, Nothing}} where L refers to type of source stream

    Examples

    using Rocket
    +min · Rocket.jl

    Min Operator

    Base.minFunction
    min(; from = nothing)

    Creates a min operator, which emits a single item: the item with the smallest value.

    Arguments

    • from: optional initial minimal value, if nothing first item from the source will be used as initial instead

    Producing

    Stream of type <: Subscribable{Union{L, Nothing}} where L refers to type of source stream

    Examples

    using Rocket
     
     source = from([ i for i in 1:42 ])
     subscribe!(source |> min(), logger())
    @@ -9,4 +9,4 @@
     
     [LogActor] Data: 1
     [LogActor] Completed
    -

    See also: AbstractOperator, InferableOperator, ProxyObservable, logger

    source

    Description

    The min operator operates on an Observable of similar objects. When source Observable completes, it emits the item with the smallest value.

    See also

    Operators

    +

    See also: AbstractOperator, InferableOperator, ProxyObservable, logger

    source

    Description

    The min operator operates on an Observable of similar objects. When source Observable completes, it emits the item with the smallest value.

    See also

    Operators

    diff --git a/v1.7.2/operators/mathematical/reduce/index.html b/v1.7.2/operators/mathematical/reduce/index.html index 4e87afebc..030699f95 100644 --- a/v1.7.2/operators/mathematical/reduce/index.html +++ b/v1.7.2/operators/mathematical/reduce/index.html @@ -1,5 +1,5 @@ -reduce · Rocket.jl

    Reduce Operator

    Base.reduceFunction
    reduce(::Type{R}, reduceFn::Function, seed::R) where R
    +reduce · Rocket.jl

    Reduce Operator

    Base.reduceFunction
    reduce(::Type{R}, reduceFn::Function, seed::R) where R
     reduce(reduceFn::F) where { F <: Function }

    Creates a reduce operator, which applies a given accumulator reduceFn function over the source Observable, and returns the accumulated result when the source completes, given an optional seed value. If a seed value is specified, then that value will be used as the initial value for the accumulator. If no seed value is specified, the first item of the source is used as the seed.

    Arguments

    • ::Type{R}: the type of data of transformed value
    • reduceFn::Function: transformation function with (data::T, current::R) -> R signature
    • seed::R: optional seed accumulation value

    Producing

    Stream of type <: Subscribable{R}

    Examples

    using Rocket
     
     source = from([ i for i in 1:10 ])
    @@ -20,4 +20,4 @@
     
     [LogActor] Data: 903
     [LogActor] Completed
    -

    See also: AbstractOperator, RightTypedOperator, ProxyObservable, logger

    source

    Description

    reduce applies an accumulator function to each value of the source Observable (from the past) and reduces it to a single value that is emitted by the output Observable. Note that reduce will only emit one value, only when the source Observable completes. It is equivalent to applying scan followed by last.

    It returns an Observable that applies a specified accumulator function to each item emitted by the source Observable. If a seed value is specified, then that value will be used as the initial value of the accumulator. If no seed value is specified, the first item of the source is used as the seed.

    See also

    Operators, scan, last

    +

    See also: AbstractOperator, RightTypedOperator, ProxyObservable, logger

    source

    Description

    reduce applies an accumulator function to each value of the source Observable (from the past) and reduces it to a single value that is emitted by the output Observable. Note that reduce will only emit one value, only when the source Observable completes. It is equivalent to applying scan followed by last.

    It returns an Observable that applies a specified accumulator function to each item emitted by the source Observable. If a seed value is specified, then that value will be used as the initial value of the accumulator. If no seed value is specified, the first item of the source is used as the seed.

    See also

    Operators, scan, last

    diff --git a/v1.7.2/operators/mathematical/sum/index.html b/v1.7.2/operators/mathematical/sum/index.html index 56c9546b7..225b03ba2 100644 --- a/v1.7.2/operators/mathematical/sum/index.html +++ b/v1.7.2/operators/mathematical/sum/index.html @@ -1,5 +1,5 @@ -sum · Rocket.jl

    Sum Operator

    Base.sumFunction
    sum(; from = nothing)

    Creates a sum operator, which applies a sum accumulator function over the source Observable, and returns the accumulated result when the source completes, given an optional initial value.

    The sum operator is similar to reduce(T, T, +) (see reduce).

    Arguments

    • from: optional initial accumulation value, if nothing first value will be used instead

    Producing

    Stream of type <: Subscribable{L} where L refers to type of source stream

    Examples

    using Rocket
    +sum · Rocket.jl

    Sum Operator

    Base.sumFunction
    sum(; from = nothing)

    Creates a sum operator, which applies a sum accumulator function over the source Observable, and returns the accumulated result when the source completes, given an optional initial value.

    The sum operator is similar to reduce(T, T, +) (see reduce).

    Arguments

    • from: optional initial accumulation value, if nothing first value will be used instead

    Producing

    Stream of type <: Subscribable{L} where L refers to type of source stream

    Examples

    using Rocket
     
     source = from([ i for i in 1:42 ])
     subscribe!(source |> sum(), logger())
    @@ -19,4 +19,4 @@
     
     [LogActor] Data: 1000
     [LogActor] Completed
    -

    See also: AbstractOperator, InferableOperator, ProxyObservable, reduce, logger

    source

    Description

    sum operates on an Observable of objects on which + is defined. When the source Observable completes, it emits the sum of all previous items. The sum operator is similar to reduce(T, T, +) (see reduce).

    See also

    Operators, reduce

    +

    See also: AbstractOperator, InferableOperator, ProxyObservable, reduce, logger

    source

    Description

    sum operates on an Observable of objects on which + is defined. When the source Observable completes, it emits the sum of all previous items. The sum operator is similar to reduce(T, T, +) (see reduce).

    See also

    Operators, reduce

    diff --git a/v1.7.2/operators/multicasting/about/index.html b/v1.7.2/operators/multicasting/about/index.html index 6abcbf16c..6f68696ec 100644 --- a/v1.7.2/operators/multicasting/about/index.html +++ b/v1.7.2/operators/multicasting/about/index.html @@ -1,2 +1,2 @@ -About multicasting operators · Rocket.jl
    +About multicasting operators · Rocket.jl
    diff --git a/v1.7.2/operators/multicasting/multicast/index.html b/v1.7.2/operators/multicasting/multicast/index.html index fb9cf091b..d9aaa5ccb 100644 --- a/v1.7.2/operators/multicasting/multicast/index.html +++ b/v1.7.2/operators/multicasting/multicast/index.html @@ -1,5 +1,5 @@ -multicast · Rocket.jl

    Multicast Operator

    Rocket.multicastFunction
    multicast(subject::S) where S
    +multicast · Rocket.jl

    Multicast Operator

    Rocket.multicastFunction
    multicast(subject::S) where S
     multicast(factory::F) where { F <: AbstractSubjectFactory }

    The multicast()operator takes a Subject and uses it to share the source execution. It returns what’s known as aConnectableObservable`, which has a connect() method. It has one simple job - subscribes to the source with the provided subject.

    Example

    using Rocket
     
     subject = Subject(Int)
    @@ -30,4 +30,4 @@
     [1] Data: 5
     [2] Data: 5
     [1] Completed
    -[2] Completed

    See also: ConnectableObservable, Subject, share, publish

    source

    See also

    Operators

    +[2] Completed

    See also: ConnectableObservable, Subject, share, publish

    source

    See also

    Operators

    diff --git a/v1.7.2/operators/multicasting/publish/index.html b/v1.7.2/operators/multicasting/publish/index.html index 1f795f80a..fe4a3a297 100644 --- a/v1.7.2/operators/multicasting/publish/index.html +++ b/v1.7.2/operators/multicasting/publish/index.html @@ -1,2 +1,2 @@ -publish · Rocket.jl

    Publish Operators

    See also

    Operators

    +publish · Rocket.jl

    Publish Operators

    See also

    Operators

    diff --git a/v1.7.2/operators/multicasting/share/index.html b/v1.7.2/operators/multicasting/share/index.html index b4f0ff229..94d720d48 100644 --- a/v1.7.2/operators/multicasting/share/index.html +++ b/v1.7.2/operators/multicasting/share/index.html @@ -1,2 +1,2 @@ -share · Rocket.jl

    Share Operators

    See also

    Operators

    +share · Rocket.jl

    Share Operators

    See also

    Operators

    diff --git a/v1.7.2/operators/transformation/about/index.html b/v1.7.2/operators/transformation/about/index.html index 67b04e133..bf17123d1 100644 --- a/v1.7.2/operators/transformation/about/index.html +++ b/v1.7.2/operators/transformation/about/index.html @@ -1,2 +1,2 @@ -About transformation operators · Rocket.jl
    +About transformation operators · Rocket.jl
    diff --git a/v1.7.2/operators/transformation/accumulated/index.html b/v1.7.2/operators/transformation/accumulated/index.html index 6ea35ca4c..f4d8aca6a 100644 --- a/v1.7.2/operators/transformation/accumulated/index.html +++ b/v1.7.2/operators/transformation/accumulated/index.html @@ -1,5 +1,5 @@ -accumulated · Rocket.jl

    Accumulated Operator

    Rocket.accumulatedFunction
    accumulated()

    Creates an accumulated operator, which returns an Observable that emits the current item with all of the previous items emitted by the source Observable in one single ordered array.

    Producing

    Stream of type <: Subscribable{Vector{L}} where L refers to type of source stream

    Examples

    using Rocket
    +accumulated · Rocket.jl

    Accumulated Operator

    Rocket.accumulatedFunction
    accumulated()

    Creates an accumulated operator, which returns an Observable that emits the current item with all of the previous items emitted by the source Observable in one single ordered array.

    Producing

    Stream of type <: Subscribable{Vector{L}} where L refers to type of source stream

    Examples

    using Rocket
     
     source = from([ 1, 2, 3 ])
     subscribe!(source |> accumulated(), logger())
    @@ -20,4 +20,4 @@
     # output
     
     [LogActor] Data: [1]
    -[LogActor] Completed

    See also: AbstractOperator, InferableOperator, ProxyObservable, logger

    source

    Description

    Combines all values emitted by the source, using an accumulator function that joins a new source value with the all past values emmited into one single array. This is similar to scan with vcat accumulation function.

    See also

    Operators

    +[LogActor] Completed

    See also: AbstractOperator, InferableOperator, ProxyObservable, logger

    source

    Description

    Combines all values emitted by the source, using an accumulator function that joins a new source value with the all past values emmited into one single array. This is similar to scan with vcat accumulation function.

    See also

    Operators

    diff --git a/v1.7.2/operators/transformation/concat_map/index.html b/v1.7.2/operators/transformation/concat_map/index.html index 7ded87e89..2a9f1230a 100644 --- a/v1.7.2/operators/transformation/concat_map/index.html +++ b/v1.7.2/operators/transformation/concat_map/index.html @@ -1,5 +1,5 @@ -concat_map · Rocket.jl

    ConcatMap Operator

    Rocket.concat_mapFunction
    concat_map(::Type{R}, mappingFn::F = identity) where { R, F <: Function }

    Creates a concat_map operator, which returns an Observable that emits the result of applying the projection function to each item emitted by the source Observable and taking values from each projected inner Observable sequentially. Essentialy it projects each source value to an Observable which is merged in the output Observable, in a serialized fashion waiting for each one to complete before merging the next.

    Arguments

    • ::Type{R}: the type of data of output Observables after projection with mappingFn
    • mappingFn::F: projection function with (data) -> Observable{R} signature

    Producing

    Stream of type <: Subscribable{R}

    Examples

    using Rocket
    +concat_map · Rocket.jl

    ConcatMap Operator

    Rocket.concat_mapFunction
    concat_map(::Type{R}, mappingFn::F = identity) where { R, F <: Function }

    Creates a concat_map operator, which returns an Observable that emits the result of applying the projection function to each item emitted by the source Observable and taking values from each projected inner Observable sequentially. Essentialy it projects each source value to an Observable which is merged in the output Observable, in a serialized fashion waiting for each one to complete before merging the next.

    Arguments

    • ::Type{R}: the type of data of output Observables after projection with mappingFn
    • mappingFn::F: projection function with (data) -> Observable{R} signature

    Producing

    Stream of type <: Subscribable{R}

    Examples

    using Rocket
     
     source = from([ 0, 0 ]) |> concat_map(Int, d -> from([ 1, 2, 3 ], scheduler = AsyncScheduler(0)))
     subscribe!(source, logger())
    @@ -13,4 +13,4 @@
     [LogActor] Data: 1
     [LogActor] Data: 2
     [LogActor] Data: 3
    -[LogActor] Completed

    See also: AbstractOperator, RightTypedOperator, ProxyObservable, logger

    source

    Description

    Returns an Observable that emits items based on applying a function that you supply to each item emitted by the source Observable, where that function returns an (so-called "inner") Observable. Each new inner Observable is concatenated with the previous inner Observable.

    Warning

    If source values arrive endlessly and faster than their corresponding inner Observables can complete, it will result in memory issues as inner Observables amass in an unbounded buffer waiting for their turn to be subscribed to.

    Note

    concat_map is equivalent to merge_map with concurrency parameter set to 1.

    See also

    Operators, merge_map

    +[LogActor] Completed

    See also: AbstractOperator, RightTypedOperator, ProxyObservable, logger

    source

    Description

    Returns an Observable that emits items based on applying a function that you supply to each item emitted by the source Observable, where that function returns an (so-called "inner") Observable. Each new inner Observable is concatenated with the previous inner Observable.

    Warning

    If source values arrive endlessly and faster than their corresponding inner Observables can complete, it will result in memory issues as inner Observables amass in an unbounded buffer waiting for their turn to be subscribed to.

    Note

    concat_map is equivalent to merge_map with concurrency parameter set to 1.

    See also

    Operators, merge_map

    diff --git a/v1.7.2/operators/transformation/concat_map_to/index.html b/v1.7.2/operators/transformation/concat_map_to/index.html index d3a4ee91e..28459b6a8 100644 --- a/v1.7.2/operators/transformation/concat_map_to/index.html +++ b/v1.7.2/operators/transformation/concat_map_to/index.html @@ -1,5 +1,5 @@ -concat_map_to · Rocket.jl

    ConcatMapTo Operator

    Rocket.concat_map_toFunction
    switch_map_to(inner_observable)

    Creates a switch_map_to operator, which returns an observable of values merged together by joining the passed observable with itself, one after the other, for each value emitted from the source. Essentially it projects each source value to the same Observable which is merged multiple times in a serialized fashion on the output Observable.

    Arguments

    • inner_observable: an Observable to replace each value from the source Observable.

    Producing

    Stream of type <: Subscribable{R} where R refers to the eltype of inner_observable

    Examples

    using Rocket
    +concat_map_to · Rocket.jl

    ConcatMapTo Operator

    Rocket.concat_map_toFunction
    switch_map_to(inner_observable)

    Creates a switch_map_to operator, which returns an observable of values merged together by joining the passed observable with itself, one after the other, for each value emitted from the source. Essentially it projects each source value to the same Observable which is merged multiple times in a serialized fashion on the output Observable.

    Arguments

    • inner_observable: an Observable to replace each value from the source Observable.

    Producing

    Stream of type <: Subscribable{R} where R refers to the eltype of inner_observable

    Examples

    using Rocket
     
     source = from([ 0, 0, 0 ])
     subscribe!(source |> concat_map_to(from([ 1, 2, 3 ])), logger())
    @@ -16,4 +16,4 @@
     [LogActor] Data: 1
     [LogActor] Data: 2
     [LogActor] Data: 3
    -[LogActor] Completed

    See also: concat_map, AbstractOperator, RightTypedOperator, ProxyObservable, logger

    source
    Note

    concat_map_to is equivalent to concat_map with mappingFn set to (_) -> inner_observable.

    See also

    Operators, concat_map

    +[LogActor] Completed

    See also: concat_map, AbstractOperator, RightTypedOperator, ProxyObservable, logger

    source
    Note

    concat_map_to is equivalent to concat_map with mappingFn set to (_) -> inner_observable.

    See also

    Operators, concat_map

    diff --git a/v1.7.2/operators/transformation/enumerate/index.html b/v1.7.2/operators/transformation/enumerate/index.html index 310cd2433..95d8c36b8 100644 --- a/v1.7.2/operators/transformation/enumerate/index.html +++ b/v1.7.2/operators/transformation/enumerate/index.html @@ -1,5 +1,5 @@ -enumerate · Rocket.jl

    Enumerate Operator

    Base.Iterators.enumerateFunction
    enumerate()

    Creates an enumerate operator, which converts each value emitted by the source Observable into a tuple of its order number and the value itself.

    The enumerate operator is similar to scan(Tuple{Int, Int}, (d, c) -> (d, c[2] + 1), (0, 0)) (see scan).

    Producing

    Stream of type <: Subscribable{Tuple{Int, L}} where L refers to type of source stream

    Examples

    using Rocket
    +enumerate · Rocket.jl

    Enumerate Operator

    Base.Iterators.enumerateFunction
    enumerate()

    Creates an enumerate operator, which converts each value emitted by the source Observable into a tuple of its order number and the value itself.

    The enumerate operator is similar to scan(Tuple{Int, Int}, (d, c) -> (d, c[2] + 1), (0, 0)) (see scan).

    Producing

    Stream of type <: Subscribable{Tuple{Int, L}} where L refers to type of source stream

    Examples

    using Rocket
     
     source = from([ 0 for _ in 1:3 ])
     subscribe!(source |> enumerate(), logger())
    @@ -11,7 +11,7 @@
     [LogActor] Data: (2, 0)
     [LogActor] Data: (3, 0)
     [LogActor] Completed
    -

    See also: AbstractOperator, InferableOperator, ProxyObservable, scan, map, logger

    source

    Description

    enumerate returns an Observable that converts each value emitted by the source Observable into a tuple of its order number and the value itself.

    Example

    Get a value from the source with its order number

    using Rocket
    +

    See also: AbstractOperator, InferableOperator, ProxyObservable, scan, map, logger

    source

    Description

    enumerate returns an Observable that converts each value emitted by the source Observable into a tuple of its order number and the value itself.

    Example

    Get a value from the source with its order number

    using Rocket
     
     source = from([ 0.0, 0.2, 0.4, 0.6, 0.8, 1.0 ])
     subscribe!(source |> enumerate(), logger())
    @@ -24,4 +24,4 @@
     [LogActor] Data: (0.6, 4)
     [LogActor] Data: (0.8, 5)
     [LogActor] Data: (1.0, 6)
    -[LogActor] Completed

    See also

    Operators, scan

    +[LogActor] Completed

    See also

    Operators, scan

    diff --git a/v1.7.2/operators/transformation/exhaust_map/index.html b/v1.7.2/operators/transformation/exhaust_map/index.html index 6079093fd..2bca71a55 100644 --- a/v1.7.2/operators/transformation/exhaust_map/index.html +++ b/v1.7.2/operators/transformation/exhaust_map/index.html @@ -1,5 +1,5 @@ -exhaust_map · Rocket.jl

    ExhaustMap Operator

    Rocket.exhaust_mapFunction
    exhaust_map(::Type{R}, mappingFn::F = identity) where { R, F <: Function }

    Creates a exhaust_map operator, which returns an Observable containing projected Observables of each item of the source, ignoring projected Observables that start before their preceding Observable has completed. Essentially it projects each source value to an Observable which is merged in the output Observable only if the previous projected Observable has completed.

    Arguments

    • ::Type{R}: the type of data of output Observables after projection with mappingFn
    • mappingFn::F: projection function with (data) -> Observable{R} signature

    Producing

    Stream of type <: Subscribable{R}

    Examples

    using Rocket
    +exhaust_map · Rocket.jl

    ExhaustMap Operator

    Rocket.exhaust_mapFunction
    exhaust_map(::Type{R}, mappingFn::F = identity) where { R, F <: Function }

    Creates a exhaust_map operator, which returns an Observable containing projected Observables of each item of the source, ignoring projected Observables that start before their preceding Observable has completed. Essentially it projects each source value to an Observable which is merged in the output Observable only if the previous projected Observable has completed.

    Arguments

    • ::Type{R}: the type of data of output Observables after projection with mappingFn
    • mappingFn::F: projection function with (data) -> Observable{R} signature

    Producing

    Stream of type <: Subscribable{R}

    Examples

    using Rocket
     
     source = from([ 0, 0 ]) |> async() |> exhaust_map(Int, d -> from([ 1, 2 ]) |> async())
     subscribe!(source, logger())
    @@ -9,4 +9,4 @@
     
     [LogActor] Data: 1
     [LogActor] Data: 2
    -[LogActor] Completed

    See also: AbstractOperator, RightTypedOperator, ProxyObservable, logger

    source

    See also

    Operators

    +[LogActor] Completed

    See also: AbstractOperator, RightTypedOperator, ProxyObservable, logger

    source

    See also

    Operators

    diff --git a/v1.7.2/operators/transformation/lowercase/index.html b/v1.7.2/operators/transformation/lowercase/index.html index a2327e304..8c1eddf73 100644 --- a/v1.7.2/operators/transformation/lowercase/index.html +++ b/v1.7.2/operators/transformation/lowercase/index.html @@ -1,5 +1,5 @@ -lowercase · Rocket.jl

    Lowercase Operator

    Base.Unicode.lowercaseFunction
    lowercase()

    Creates an lowercase operator, which forces each value to be in lower case

    Producing

    Stream of type <: Subscribable{L} where L referes to type of data of input Observable

    Examples

    using Rocket
    +lowercase · Rocket.jl

    Lowercase Operator

    Base.Unicode.lowercaseFunction
    lowercase()

    Creates an lowercase operator, which forces each value to be in lower case

    Producing

    Stream of type <: Subscribable{L} where L referes to type of data of input Observable

    Examples

    using Rocket
     
     source = of("Hello, world!")
     subscribe!(source |> lowercase(), logger())
    @@ -8,4 +8,4 @@
     # output
     
     [LogActor] Data: hello, world!
    -[LogActor] Completed

    See also: AbstractOperator, InferableOperator, ProxyObservable, logger

    source

    See also

    Operators, map, uppercase

    +[LogActor] Completed

    See also: AbstractOperator, InferableOperator, ProxyObservable, logger

    source

    See also

    Operators, map, uppercase

    diff --git a/v1.7.2/operators/transformation/map/index.html b/v1.7.2/operators/transformation/map/index.html index d92f09ed8..ba53d4624 100644 --- a/v1.7.2/operators/transformation/map/index.html +++ b/v1.7.2/operators/transformation/map/index.html @@ -1,5 +1,5 @@ -map · Rocket.jl

    Map Operator

    Base.mapFunction
    map(::Type{R}, mappingFn::F) where { F <: Function }

    Creates a map operator, which applies a given mappingFn to each value emmited by the source Observable, and emits the resulting values as an Observable. You have to specify output R type after mappingFn projection.

    Arguments

    • ::Type{R}: the type of data of transformed value, may be or may not be the same as source type
    • mappingFn::Function: transformation function with (data::L) -> R signature, where L is type of data in input source

    Producing

    Stream of type <: Subscribable{R}

    Examples

    using Rocket
    +map · Rocket.jl

    Map Operator

    Base.mapFunction
    map(::Type{R}, mappingFn::F) where { F <: Function }

    Creates a map operator, which applies a given mappingFn to each value emmited by the source Observable, and emits the resulting values as an Observable. You have to specify output R type after mappingFn projection.

    Arguments

    • ::Type{R}: the type of data of transformed value, may be or may not be the same as source type
    • mappingFn::Function: transformation function with (data::L) -> R signature, where L is type of data in input source

    Producing

    Stream of type <: Subscribable{R}

    Examples

    using Rocket
     
     source = from([ 1, 2, 3 ])
     subscribe!(source |> map(Int, (d) -> d ^ 2), logger())
    @@ -10,7 +10,7 @@
     [LogActor] Data: 1
     [LogActor] Data: 4
     [LogActor] Data: 9
    -[LogActor] Completed

    See also: AbstractOperator, RightTypedOperator, ProxyObservable, logger

    source

    Description

    The map operator, similar to map(f, array), applies a function to each value from the source. It's important to note that the function f is expected to be pure and without any side effects. The map operator is designed to create a copy of the original observable for each new subscriber. It independently executes the f function for each subscriber and doesn't share the resulting value. This might be inconvenient when f involves complex calculations or side effects.

    using Rocket
    +[LogActor] Completed

    See also: AbstractOperator, RightTypedOperator, ProxyObservable, logger

    source

    Description

    The map operator, similar to map(f, array), applies a function to each value from the source. It's important to note that the function f is expected to be pure and without any side effects. The map operator is designed to create a copy of the original observable for each new subscriber. It independently executes the f function for each subscriber and doesn't share the resulting value. This might be inconvenient when f involves complex calculations or side effects.

    using Rocket
     
     function f(x)
         println("Function `f` called") # Assume heavy calculations or side-effects
    @@ -72,4 +72,4 @@
     [LogActor] Data: 2
     Function `f` called
     [LogActor] Data: 3
    -[LogActor] Completed

    See also

    Operators

    +[LogActor] Completed

    See also

    Operators

    diff --git a/v1.7.2/operators/transformation/map_to/index.html b/v1.7.2/operators/transformation/map_to/index.html index 88498a3dc..65e37563e 100644 --- a/v1.7.2/operators/transformation/map_to/index.html +++ b/v1.7.2/operators/transformation/map_to/index.html @@ -1,5 +1,5 @@ -map_to · Rocket.jl

    MapTo Operator

    Rocket.map_toFunction
    map_to(value::T) where T

    Creates a map operator, which emits the given constant value on the output Observable every time the source Observable emits a value.

    Arguments

    • value::T: the constant value to map each source value to

    Producing

    Stream of type <: Subscribable{T}

    Examples

    using Rocket
    +map_to · Rocket.jl

    MapTo Operator

    Rocket.map_toFunction
    map_to(value::T) where T

    Creates a map operator, which emits the given constant value on the output Observable every time the source Observable emits a value.

    Arguments

    • value::T: the constant value to map each source value to

    Producing

    Stream of type <: Subscribable{T}

    Examples

    using Rocket
     
     source = from([ 1, 2, 3 ])
     subscribe!(source |> map_to('a'), logger())
    @@ -10,4 +10,4 @@
     [LogActor] Data: a
     [LogActor] Data: a
     [LogActor] Data: a
    -[LogActor] Completed

    See also: map, AbstractOperator, RightTypedOperator, ProxyObservable, logger

    source

    Description

    Takes a constant value as argument, and emits that whenever the source Observable emits a value. In other words, ignores the actual source value, and simply uses the emission moment to know when to emit the given value.

    See also

    Operators

    +[LogActor] Completed

    See also: map, AbstractOperator, RightTypedOperator, ProxyObservable, logger

    source

    Description

    Takes a constant value as argument, and emits that whenever the source Observable emits a value. In other words, ignores the actual source value, and simply uses the emission moment to know when to emit the given value.

    See also

    Operators

    diff --git a/v1.7.2/operators/transformation/merge_map/index.html b/v1.7.2/operators/transformation/merge_map/index.html index 2e566d369..549b2e9f7 100644 --- a/v1.7.2/operators/transformation/merge_map/index.html +++ b/v1.7.2/operators/transformation/merge_map/index.html @@ -1,5 +1,5 @@ -merge_map · Rocket.jl

    MergeMap Operator

    Rocket.merge_mapFunction
    merge_map(::Type{R}, mappingFn::F = identity; concurrent::Int = typemax(Int)) where { R, F <: Function }

    Creates a merge_map operator, which returns an Observable that emits the result of applying the projection function mappingFn to each item emitted by the source Observable and merging the results of the Observables obtained from this transformation.

    Arguments

    • ::Type{R}: the type of data of output Observables after projection with mappingFn
    • mappingFn::F: projection function with (data) -> Observable{R} signature
    • concurrent::Int: optional, default is typemax(Int), maximum number of input Observables being subscribed to concurrently

    Producing

    Stream of type <: Subscribable{R}

    Examples

    using Rocket
    +merge_map · Rocket.jl

    MergeMap Operator

    Rocket.merge_mapFunction
    merge_map(::Type{R}, mappingFn::F = identity; concurrent::Int = typemax(Int)) where { R, F <: Function }

    Creates a merge_map operator, which returns an Observable that emits the result of applying the projection function mappingFn to each item emitted by the source Observable and merging the results of the Observables obtained from this transformation.

    Arguments

    • ::Type{R}: the type of data of output Observables after projection with mappingFn
    • mappingFn::F: projection function with (data) -> Observable{R} signature
    • concurrent::Int: optional, default is typemax(Int), maximum number of input Observables being subscribed to concurrently

    Producing

    Stream of type <: Subscribable{R}

    Examples

    using Rocket
     
     source = from([ 0, 0 ]) |> merge_map(Int, d -> from([ 1, 2, 3 ], scheduler = AsyncScheduler(0)))
     subscribe!(source, logger())
    @@ -13,4 +13,4 @@
     [LogActor] Data: 2
     [LogActor] Data: 3
     [LogActor] Data: 3
    -[LogActor] Completed

    See also: AbstractOperator, RightTypedOperator, ProxyObservable, logger

    source

    See also

    Operators

    +[LogActor] Completed

    See also: AbstractOperator, RightTypedOperator, ProxyObservable, logger

    source

    See also

    Operators

    diff --git a/v1.7.2/operators/transformation/override/index.html b/v1.7.2/operators/transformation/override/index.html index 0d24f1e10..1aef9051a 100644 --- a/v1.7.2/operators/transformation/override/index.html +++ b/v1.7.2/operators/transformation/override/index.html @@ -1,5 +1,5 @@ -override · Rocket.jl

    Override Operator

    Rocket.overrideFunction
    override(handler::OverrideHandler)

    Creates an override operator that overrides each emission from source observable with value provided in handler. If handler contains nothing source observable emits as usual. For constant override see map_to. Use Rocket.setvalue! to set new value for handler.

    Producing

    Stream of type <: Subscribable{Union{L, T}} where L refers to the type of source stream and T referes to the type of handler's value

    Examples

    using Rocket 
    +override · Rocket.jl

    Override Operator

    Rocket.overrideFunction
    override(handler::OverrideHandler)

    Creates an override operator that overrides each emission from source observable with value provided in handler. If handler contains nothing source observable emits as usual. For constant override see map_to. Use Rocket.setvalue! to set new value for handler.

    Producing

    Stream of type <: Subscribable{Union{L, T}} where L refers to the type of source stream and T referes to the type of handler's value

    Examples

    using Rocket 
     
     subject = Subject(Int)
     handler = OverrideHandler(Int, -1)
    @@ -29,5 +29,5 @@
     [LogActor] Data: 3
     [LogActor] Data: 4
     [LogActor] Data: -2
    -[LogActor] Data: -2

    See also: OverrideHandler

    source

    See also

    Operators

    +[LogActor] Data: -2

    See also: OverrideHandler

    source

    See also

    Operators

    diff --git a/v1.7.2/operators/transformation/pairwise/index.html b/v1.7.2/operators/transformation/pairwise/index.html index 67ea03b97..d40ba0b47 100644 --- a/v1.7.2/operators/transformation/pairwise/index.html +++ b/v1.7.2/operators/transformation/pairwise/index.html @@ -1,5 +1,5 @@ -pairwise · Rocket.jl

    Pairwise Operator

    Rocket.pairwiseFunction
    pairwise([ initial ])

    Creates a pairwise operator, which groups pairs of consecutive emissions together and emits them as a tuple of two values. Accepts optional initial seed value to start pairing from.

    using Rocket
    +pairwise · Rocket.jl

    Pairwise Operator

    Rocket.pairwiseFunction
    pairwise([ initial ])

    Creates a pairwise operator, which groups pairs of consecutive emissions together and emits them as a tuple of two values. Accepts optional initial seed value to start pairing from.

    using Rocket
     
     source = from(1:5) |> pairwise()
     
    @@ -26,4 +26,4 @@
     [LogActor] Data: (2, 3)
     [LogActor] Data: (3, 4)
     [LogActor] Data: (4, 5)
    -[LogActor] Completed

    See also: AbstractOperator, InferableOperator, logger

    source

    See also

    Operators

    +[LogActor] Completed

    See also: AbstractOperator, InferableOperator, logger

    source

    See also

    Operators

    diff --git a/v1.7.2/operators/transformation/scan/index.html b/v1.7.2/operators/transformation/scan/index.html index 31fb41070..dceced860 100644 --- a/v1.7.2/operators/transformation/scan/index.html +++ b/v1.7.2/operators/transformation/scan/index.html @@ -1,5 +1,5 @@ -scan · Rocket.jl

    Scan Operator

    Rocket.scanFunction
    scan(::Type{R}, scanFn::F, seed::R) where { R, F <: Function }
    +scan · Rocket.jl

    Scan Operator

    Rocket.scanFunction
    scan(::Type{R}, scanFn::F, seed::R) where { R, F <: Function }
     scan(scanFn::F) where { F <: Function }

    Creates a scan operator, which applies a given accumulator scanFn function to each value emmited by the source Observable, and returns each intermediate result with an optional seed value. If a seed value is specified, then that value will be used as the initial value for the accumulator. If no seed value is specified, the first item of the source is used as the seed.

    Arguments

    • ::Type{R}: the type of data of transformed value, may be or may not be the same as type of input source
    • scanFn::Function: accumulator function with (data::T, current::R) -> R signature
    • seed::R: optional initial value for accumulator function

    Producing

    Stream of type <: Subscribable{R}

    Examples

    using Rocket
     
     source = from([ 1, 2, 3 ])
    @@ -24,4 +24,4 @@
     [LogActor] Data: [1, 2]
     [LogActor] Data: [1, 2, 3]
     [LogActor] Completed
    -

    See also: AbstractOperator, RightTypedOperator, ProxyObservable, reduce, logger

    source

    Description

    Combines all values emitted by the source, using an accumulator function that joins a new source value with the past accumulation. This is similar to reduce, but emits the intermediate accumulations.

    Returns an Observable that applies a specified accumulator function to each item emitted by the source Observable. If a seed value is specified, then that value will be used as the initial value for the accumulator. If no seed value is specified, the first item of the source is used as the seed.

    See also

    Operators

    +

    See also: AbstractOperator, RightTypedOperator, ProxyObservable, reduce, logger

    source

    Description

    Combines all values emitted by the source, using an accumulator function that joins a new source value with the past accumulation. This is similar to reduce, but emits the intermediate accumulations.

    Returns an Observable that applies a specified accumulator function to each item emitted by the source Observable. If a seed value is specified, then that value will be used as the initial value for the accumulator. If no seed value is specified, the first item of the source is used as the seed.

    See also

    Operators

    diff --git a/v1.7.2/operators/transformation/start_with/index.html b/v1.7.2/operators/transformation/start_with/index.html index 5a301d8bb..41b3423c1 100644 --- a/v1.7.2/operators/transformation/start_with/index.html +++ b/v1.7.2/operators/transformation/start_with/index.html @@ -1,5 +1,5 @@ -start_with · Rocket.jl

    StartWith Operator

    Rocket.start_withFunction
    start_with(object::O) where O

    Creates a start_with operator, which forces an observable to emit given object as a first value.

    Producing

    Stream of type <: Subscribable{Union{L, O}} where L refers to type of source stream <: Subscribable{L}

    Examples

    using Rocket
    +start_with · Rocket.jl

    StartWith Operator

    Rocket.start_withFunction
    start_with(object::O) where O

    Creates a start_with operator, which forces an observable to emit given object as a first value.

    Producing

    Stream of type <: Subscribable{Union{L, O}} where L refers to type of source stream <: Subscribable{L}

    Examples

    using Rocket
     
     source = from(1:3) |> start_with(0)
     subscribe!(source, logger())
    @@ -11,4 +11,4 @@
     [LogActor] Data: 1
     [LogActor] Data: 2
     [LogActor] Data: 3
    -[LogActor] Completed

    See also: AbstractOperator, InferableOperator, ProxyObservable, logger

    source

    See also

    Operators

    +[LogActor] Completed

    See also: AbstractOperator, InferableOperator, ProxyObservable, logger

    source

    See also

    Operators

    diff --git a/v1.7.2/operators/transformation/substitute/index.html b/v1.7.2/operators/transformation/substitute/index.html index 9fcd905ac..37d6fecdc 100644 --- a/v1.7.2/operators/transformation/substitute/index.html +++ b/v1.7.2/operators/transformation/substitute/index.html @@ -1,5 +1,5 @@ -substitute · Rocket.jl

    Substitute Operator

    Rocket.substituteFunction
    substitute(::Type{T}, mapFn::F, handler::SubstituteHandler) where { T, F <: Function }

    This operator forces observable to substitute each emmited value with the latest computed value with the corresponding handler and release! function. After release! on handler substitute operator computes new value with mapFn but does not emit it until next emission from source observable. Always calls mapFn on first value from source observable.

    Producing

    Stream of type <: Subscribable{T}

    Examples

    using Rocket
    +substitute · Rocket.jl

    Substitute Operator

    Rocket.substituteFunction
    substitute(::Type{T}, mapFn::F, handler::SubstituteHandler) where { T, F <: Function }

    This operator forces observable to substitute each emmited value with the latest computed value with the corresponding handler and release! function. After release! on handler substitute operator computes new value with mapFn but does not emit it until next emission from source observable. Always calls mapFn on first value from source observable.

    Producing

    Stream of type <: Subscribable{T}

    Examples

    using Rocket
     
     subject = Subject(Int)
     
    @@ -28,4 +28,4 @@
     [LogActor] Data: i = 1
     [LogActor] Data: i = 3
     [LogActor] Data: i = 3
    -[LogActor] Data: i = 3

    See also: SubstituteHandler

    source

    See also

    Operators

    +[LogActor] Data: i = 3

    See also: SubstituteHandler

    source

    See also

    Operators

    diff --git a/v1.7.2/operators/transformation/switch_map/index.html b/v1.7.2/operators/transformation/switch_map/index.html index fdc4af4a7..6c60f17b6 100644 --- a/v1.7.2/operators/transformation/switch_map/index.html +++ b/v1.7.2/operators/transformation/switch_map/index.html @@ -1,5 +1,5 @@ -switch_map · Rocket.jl

    SwitchMap Operator

    Rocket.switch_mapFunction
    switch_map(::Type{R}, mappingFn::F = identity) where { R, F <: Function }

    Creates a switch_map operator, which returns an Observable that emits items based on applying a function mappingFn that you supply to each item emitted by the source Observable, where that function returns an (so-called "inner") Observable. Each time it observes one of these inner Observables, the output Observable begins emitting the items emitted by that inner Observable. When a new inner Observable is emitted, switch_map stops emitting items from the earlier-emitted inner Observable and begins emitting items from the new one. It continues to behave like this for subsequent inner Observables.

    Arguments

    • ::Type{R}: the type of data of output Observables after projection with mappingFn
    • mappingFn::F: projection function with (data) -> Observable{R} signature

    Producing

    Stream of type <: Subscribable{R}

    Examples

    using Rocket
    +switch_map · Rocket.jl

    SwitchMap Operator

    Rocket.switch_mapFunction
    switch_map(::Type{R}, mappingFn::F = identity) where { R, F <: Function }

    Creates a switch_map operator, which returns an Observable that emits items based on applying a function mappingFn that you supply to each item emitted by the source Observable, where that function returns an (so-called "inner") Observable. Each time it observes one of these inner Observables, the output Observable begins emitting the items emitted by that inner Observable. When a new inner Observable is emitted, switch_map stops emitting items from the earlier-emitted inner Observable and begins emitting items from the new one. It continues to behave like this for subsequent inner Observables.

    Arguments

    • ::Type{R}: the type of data of output Observables after projection with mappingFn
    • mappingFn::F: projection function with (data) -> Observable{R} signature

    Producing

    Stream of type <: Subscribable{R}

    Examples

    using Rocket
     
     source = from([ of(1), of(2), of(3) ])
     subscribe!(source |> switch_map(Int), logger())
    @@ -21,4 +21,4 @@
     [LogActor] Data: 1.0
     [LogActor] Data: 4.0
     [LogActor] Data: 9.0
    -[LogActor] Completed

    See also: AbstractOperator, RightTypedOperator, ProxyObservable, logger

    source

    See also

    Operators

    +[LogActor] Completed

    See also: AbstractOperator, RightTypedOperator, ProxyObservable, logger

    source

    See also

    Operators

    diff --git a/v1.7.2/operators/transformation/switch_map_to/index.html b/v1.7.2/operators/transformation/switch_map_to/index.html index a3d2b5400..b1623e9fd 100644 --- a/v1.7.2/operators/transformation/switch_map_to/index.html +++ b/v1.7.2/operators/transformation/switch_map_to/index.html @@ -1,5 +1,5 @@ -switch_map_to · Rocket.jl

    SwitchMapTo Operator

    Rocket.switch_map_toFunction
    switch_map_to(inner_observable)

    Creates a switch_map_to operator, which projects each source value to the same Observable which is flattened multiple times with switch_map in the output Observable.

    Arguments

    • inner_observable: an Observable to replace each value from the source Observable.

    Producing

    Stream of type <: Subscribable{R} where R refers to the eltype of inner_observable

    Examples

    using Rocket
    +switch_map_to · Rocket.jl

    SwitchMapTo Operator

    Rocket.switch_map_toFunction
    switch_map_to(inner_observable)

    Creates a switch_map_to operator, which projects each source value to the same Observable which is flattened multiple times with switch_map in the output Observable.

    Arguments

    • inner_observable: an Observable to replace each value from the source Observable.

    Producing

    Stream of type <: Subscribable{R} where R refers to the eltype of inner_observable

    Examples

    using Rocket
     
     source = from([ 0, 0, 0 ])
     subscribe!(source |> switch_map_to(from([ 1, 2, 3 ])), logger())
    @@ -16,4 +16,4 @@
     [LogActor] Data: 1
     [LogActor] Data: 2
     [LogActor] Data: 3
    -[LogActor] Completed

    See also: switch_map, AbstractOperator, RightTypedOperator, ProxyObservable, logger

    source
    Note

    switch_map_to is equivalent to switch_map with mappingFn set to (_) -> inner_observable.

    See also

    Operators

    +[LogActor] Completed

    See also: switch_map, AbstractOperator, RightTypedOperator, ProxyObservable, logger

    source
    Note

    switch_map_to is equivalent to switch_map with mappingFn set to (_) -> inner_observable.

    See also

    Operators

    diff --git a/v1.7.2/operators/transformation/to_array/index.html b/v1.7.2/operators/transformation/to_array/index.html index 1aa46c2d2..84a83279b 100644 --- a/v1.7.2/operators/transformation/to_array/index.html +++ b/v1.7.2/operators/transformation/to_array/index.html @@ -1,5 +1,5 @@ -to_array · Rocket.jl

    Uppercase Operator

    Rocket.to_arrayFunction
    to_array()

    Creates a to_array operator, which reduces all values into a single array and returns this result when the source completes.

    Producing

    Stream of type <: Subscribable{Vector{L}} where L refers to type of source stream

    Examples

    using Rocket
    +to_array · Rocket.jl

    Uppercase Operator

    Rocket.to_arrayFunction
    to_array()

    Creates a to_array operator, which reduces all values into a single array and returns this result when the source completes.

    Producing

    Stream of type <: Subscribable{Vector{L}} where L refers to type of source stream

    Examples

    using Rocket
     
     source = from([ 1, 2, 3 ])
     subscribe!(source |> to_array(), logger())
    @@ -9,4 +9,4 @@
     
     [LogActor] Data: [1, 2, 3]
     [LogActor] Completed
    -

    See also: AbstractOperator, InferableOperator, ProxyObservable, logger

    source

    See also

    Operators, map, lowercase

    +

    See also: AbstractOperator, InferableOperator, ProxyObservable, logger

    source

    See also

    Operators, map, lowercase

    diff --git a/v1.7.2/operators/transformation/uppercase/index.html b/v1.7.2/operators/transformation/uppercase/index.html index f3b559e45..92b98ca76 100644 --- a/v1.7.2/operators/transformation/uppercase/index.html +++ b/v1.7.2/operators/transformation/uppercase/index.html @@ -1,5 +1,5 @@ -uppercase · Rocket.jl

    Uppercase Operator

    Base.Unicode.uppercaseFunction
    uppercase()

    Creates an uppercase operator, which forces each value to be in upper case

    Producing

    Stream of type <: Subscribable{L} where L referes to type of data of input Observable

    Examples

    using Rocket
    +uppercase · Rocket.jl

    Uppercase Operator

    Base.Unicode.uppercaseFunction
    uppercase()

    Creates an uppercase operator, which forces each value to be in upper case

    Producing

    Stream of type <: Subscribable{L} where L referes to type of data of input Observable

    Examples

    using Rocket
     
     source = of("Hello, world!")
     subscribe!(source |> uppercase(), logger())
    @@ -8,4 +8,4 @@
     # output
     
     [LogActor] Data: HELLO, WORLD!
    -[LogActor] Completed

    See also: AbstractOperator, InferableOperator, ProxyObservable, logger

    source

    See also

    Operators, map, lowercase

    +[LogActor] Completed

    See also: AbstractOperator, InferableOperator, ProxyObservable, logger

    source

    See also

    Operators, map, lowercase

    diff --git a/v1.7.2/operators/utility/about/index.html b/v1.7.2/operators/utility/about/index.html index efc9a0623..32188d13f 100644 --- a/v1.7.2/operators/utility/about/index.html +++ b/v1.7.2/operators/utility/about/index.html @@ -1,2 +1,2 @@ -About utility operators · Rocket.jl
    +About utility operators · Rocket.jl
    diff --git a/v1.7.2/operators/utility/async/index.html b/v1.7.2/operators/utility/async/index.html index 5314c2d02..025540cbf 100644 --- a/v1.7.2/operators/utility/async/index.html +++ b/v1.7.2/operators/utility/async/index.html @@ -1,2 +1,2 @@ -async · Rocket.jl
    +async · Rocket.jl
    diff --git a/v1.7.2/operators/utility/default_if_empty/index.html b/v1.7.2/operators/utility/default_if_empty/index.html index 00a122007..a206a309e 100644 --- a/v1.7.2/operators/utility/default_if_empty/index.html +++ b/v1.7.2/operators/utility/default_if_empty/index.html @@ -1,5 +1,5 @@ -default_if_empty · Rocket.jl

    DefaultIfEmpty Operator

    Rocket.default_if_emptyFunction
    default_if_empty(value::T)
    +default_if_empty · Rocket.jl

    DefaultIfEmpty Operator

    Rocket.default_if_emptyFunction
    default_if_empty(value::T)
     default_if_empty(callback::Function)

    Creates a default_if_empty operator, which emits a given value if the source Observable completes without emitting any next value, otherwise mirrors the source Observable. Optionally accepts a zero-argument callback that will be executed to generate default value. Note: Callback function's output is always converted to the eltype of the original observable.

    using Rocket
     
     source = completed(Int) |> default_if_empty(0)
    @@ -18,4 +18,4 @@
     
     # output
     [LogActor] Data: 42
    -[LogActor] Completed

    See also: AbstractOperator, InferableOperator, logger, map

    source

    Description

    default_if_empty emits the values emitted by the source Observable or a specified default value if the source Observable is empty (completes without having emitted any next value).

    See also

    Operators

    +[LogActor] Completed

    See also: AbstractOperator, InferableOperator, logger, map

    source

    Description

    default_if_empty emits the values emitted by the source Observable or a specified default value if the source Observable is empty (completes without having emitted any next value).

    See also

    Operators

    diff --git a/v1.7.2/operators/utility/delay/index.html b/v1.7.2/operators/utility/delay/index.html index 798f90885..ced2f7064 100644 --- a/v1.7.2/operators/utility/delay/index.html +++ b/v1.7.2/operators/utility/delay/index.html @@ -1,5 +1,5 @@ -delay · Rocket.jl

    Delay Operator

    Rocket.delayFunction
    delay(delay::Int)

    Creates a delay operator, which delays the emission of items from the source Observable by a given timeout.

    Arguments:

    • delay::Int: the delay duration in milliseconds (a number) until which the emission of the source items is delayed.

    Producing

    Stream of type <: Subscribable{L} where L refers to type of source stream

    See also: AbstractOperator, InferableOperator, ProxyObservable

    source

    Description

    Delays the emission of items from the source Observable by a given timeout

    Example

    Delay every value with 1 second to the output

    using Rocket
    +delay · Rocket.jl

    Delay Operator

    Rocket.delayFunction
    delay(delay::Int)

    Creates a delay operator, which delays the emission of items from the source Observable by a given timeout.

    Arguments:

    • delay::Int: the delay duration in milliseconds (a number) until which the emission of the source items is delayed.

    Producing

    Stream of type <: Subscribable{L} where L refers to type of source stream

    See also: AbstractOperator, InferableOperator, ProxyObservable

    source

    Description

    Delays the emission of items from the source Observable by a given timeout

    Example

    Delay every value with 1 second to the output

    using Rocket
     using Dates
     
     source = from([ 1, 2, 3 ])
    @@ -14,4 +14,4 @@
     03:43: 1
     03:43: 2
     03:43: 3
    -

    See also

    Operators

    +

    See also

    Operators

    diff --git a/v1.7.2/operators/utility/discontinue/index.html b/v1.7.2/operators/utility/discontinue/index.html index 5c401db45..89e5459fb 100644 --- a/v1.7.2/operators/utility/discontinue/index.html +++ b/v1.7.2/operators/utility/discontinue/index.html @@ -1,5 +1,5 @@ -discontinue · Rocket.jl

    Discontinue Operator

    Rocket.discontinueFunction
    discontinue()

    Creates an operator, which prevents an emitting of self-depending messages and breaks a possible infinite loop. Does nothing if observable scheduled asynchronously.

    Producing

    Stream of type <: Subscribable{L} where L refers to type of source stream

    Examples

    using Rocket
    +discontinue · Rocket.jl

    Discontinue Operator

    Rocket.discontinueFunction
    discontinue()

    Creates an operator, which prevents an emitting of self-depending messages and breaks a possible infinite loop. Does nothing if observable scheduled asynchronously.

    Producing

    Stream of type <: Subscribable{L} where L refers to type of source stream

    Examples

    using Rocket
     
     s = BehaviorSubject(0)
     
    @@ -10,4 +10,4 @@
     # output
     
     [LogActor] Data: 0
    -[LogActor] Data: 1

    See also: AbstractOperator, RightTypedOperator, ProxyObservable, logger

    source

    See also

    Operators

    +[LogActor] Data: 1

    See also: AbstractOperator, RightTypedOperator, ProxyObservable, logger

    source

    See also

    Operators

    diff --git a/v1.7.2/operators/utility/error_if_empty/index.html b/v1.7.2/operators/utility/error_if_empty/index.html index 10b0177bd..14198f18c 100644 --- a/v1.7.2/operators/utility/error_if_empty/index.html +++ b/v1.7.2/operators/utility/error_if_empty/index.html @@ -1,5 +1,5 @@ -error_if_empty · Rocket.jl

    ErrorIfEmpty Operator

    Rocket.error_if_emptyFunction
    error_if_empty(err)

    Creates a error_if_empty operator, which emits a given error if the source Observable completes without emitting any next value, otherwise mirrors the source Observable.

    using Rocket
    +error_if_empty · Rocket.jl

    ErrorIfEmpty Operator

    Rocket.error_if_emptyFunction
    error_if_empty(err)

    Creates a error_if_empty operator, which emits a given error if the source Observable completes without emitting any next value, otherwise mirrors the source Observable.

    using Rocket
     
     source = completed(Int) |> error_if_empty("Empty")
     
    @@ -7,4 +7,4 @@
     ;
     
     # output
    -[LogActor] Error: Empty

    See also: AbstractOperator, InferableOperator, logger, map

    source

    Description

    error_if_empty emits the values emitted by the source Observable or a specified error message if the source Observable is empty (completes without having emitted any next value).

    See also

    Operators

    +[LogActor] Error: Empty

    See also: AbstractOperator, InferableOperator, logger, map

    source

    Description

    error_if_empty emits the values emitted by the source Observable or a specified error message if the source Observable is empty (completes without having emitted any next value).

    See also

    Operators

    diff --git a/v1.7.2/operators/utility/limit_subscribers/index.html b/v1.7.2/operators/utility/limit_subscribers/index.html index 091033e48..020190e38 100644 --- a/v1.7.2/operators/utility/limit_subscribers/index.html +++ b/v1.7.2/operators/utility/limit_subscribers/index.html @@ -1,13 +1,13 @@ -limit_subscribers · Rocket.jl

    LimitSubscribers Operator

    Rocket.LimitSubscribersGuardType
    LimitSubscribersGuard(limit::Int = 1, exclusive = true)

    Guard structure used in limit_subscribers operator.

    Arguments

    • limit: number of concurrent subscribers
    • exclusive: boolean flag, which indicates whenever this guard can be shared with other observables in other limit_subscribers operator. If set to true, reusing this guard in a different limit_subscribers operator for other observable will result in automatic unsubscription of all present actors.

    Note

    This structure is useful in Pluto.jl notebooks in particular, allowing for automatic subscription/unsubscription of observables.

    Example

    
    +limit_subscribers · Rocket.jl

    LimitSubscribers Operator

    Rocket.LimitSubscribersGuardType
    LimitSubscribersGuard(limit::Int = 1, exclusive = true)

    Guard structure used in limit_subscribers operator.

    Arguments

    • limit: number of concurrent subscribers
    • exclusive: boolean flag, which indicates whenever this guard can be shared with other observables in other limit_subscribers operator. If set to true, reusing this guard in a different limit_subscribers operator for other observable will result in automatic unsubscription of all present actors.

    Note

    This structure is useful in Pluto.jl notebooks in particular, allowing for automatic subscription/unsubscription of observables.

    Example

    
     # Cell 1
     guard = LimitSubscribersGuard()
     
     # Cell 2
    -subscription = subscribe!(some_stream |> limit_subscribers(guard), logger())

    See also: limit_subscribers, subscribe!

    source
    Rocket.limit_subscribersFunction
    limit_subscribers(limit::Int = 1, exclusive::Bool = true)
     limit_subscribers(guard::LimitSubscribersGuard)

    Creates an operator that limits number of concurrent actors to the given observable. On new subscription, if limit is exceeded, oldest actor is automatically unsubscribed and receives a completion event.

    Arguments

    • limit: number of concurrent subscribers
    • exclusive: boolean flag, which indicates whenever this guard can be shared with other observables in other limit_subscribers operator. If set to true, reusing this guard in a different limit_subscribers operator for other observable will result in automatic unsubscription of all present actors.

    Note

    This structure is useful in Pluto.jl notebooks in particular, allowing for automatic subscription/unsubscription of observables.

    Example

    
     # Cell 1
     guard = LimitSubscribersGuard()
     
     # Cell 2
    -subscription = subscribe!(some_stream |> limit_subscribers(guard), logger())

    See also: LimitSubscribersGuard

    source

    See also

    Operators

    +subscription = subscribe!(some_stream |> limit_subscribers(guard), logger())

    See also: LimitSubscribersGuard

    source

    See also

    Operators

    diff --git a/v1.7.2/operators/utility/noop/index.html b/v1.7.2/operators/utility/noop/index.html index 7e3b359fa..2b11019ba 100644 --- a/v1.7.2/operators/utility/noop/index.html +++ b/v1.7.2/operators/utility/noop/index.html @@ -1,5 +1,5 @@ -noop · Rocket.jl

    Noop Operator

    Rocket.noopFunction
    noop()

    Creates a noop operator, which does nothing, but breaks operator composition type inference checking procedure for Julia's compiler. It might be useful for very long chain of operators, because Julia tries to statically infer data types at compile-time for the whole chain and can run into StackOverflow issues.

    using Rocket
    +noop · Rocket.jl

    Noop Operator

    Rocket.noopFunction
    noop()

    Creates a noop operator, which does nothing, but breaks operator composition type inference checking procedure for Julia's compiler. It might be useful for very long chain of operators, because Julia tries to statically infer data types at compile-time for the whole chain and can run into StackOverflow issues.

    using Rocket
     
     # foo() block to enforce local scope for scope variable
     function foo()
    @@ -22,4 +22,4 @@
     [LogActor] Data: 1003
     [LogActor] Data: 1004
     [LogActor] Data: 1005
    -[LogActor] Completed

    See also: AbstractOperator, InferableOperator, logger, map

    source

    See also

    Operators

    +[LogActor] Completed

    See also: AbstractOperator, InferableOperator, logger, map

    source

    See also

    Operators

    diff --git a/v1.7.2/operators/utility/ref_count/index.html b/v1.7.2/operators/utility/ref_count/index.html index 503b163ca..78d6dba66 100644 --- a/v1.7.2/operators/utility/ref_count/index.html +++ b/v1.7.2/operators/utility/ref_count/index.html @@ -1,5 +1,5 @@ -ref_count · Rocket.jl

    Ref Count Operator

    Rocket.ref_countFunction
    ref_count()

    Make a ConnectableObservable behave like a ordinary observable and automates the way you can connect to it. Internally it counts the subscriptions to the observable and subscribes (only once) to the source if the number of subscriptions is larger than 0. If the number of subscriptions is smaller than 1, it unsubscribes from the source. This way you can make sure that everything before the published refCount has only a single subscription independently of the number of subscribers to the target observable.

    Note that using the share operator is exactly the same as using the publish operator (making the observable hot) and the ref_count() operator in a sequence.

    Example

    using Rocket
    +ref_count · Rocket.jl

    Ref Count Operator

    Rocket.ref_countFunction
    ref_count()

    Make a ConnectableObservable behave like a ordinary observable and automates the way you can connect to it. Internally it counts the subscriptions to the observable and subscribes (only once) to the source if the number of subscriptions is larger than 0. If the number of subscriptions is smaller than 1, it unsubscribes from the source. This way you can make sure that everything before the published refCount has only a single subscription independently of the number of subscribers to the target observable.

    Note that using the share operator is exactly the same as using the publish operator (making the observable hot) and the ref_count() operator in a sequence.

    Example

    using Rocket
     
     subject = Subject(Int, scheduler = AsapScheduler())
     source  = from(1:5) |> multicast(subject) |> ref_count()
    @@ -21,4 +21,4 @@
     [1] Data: 4
     [1] Data: 5
     [1] Completed
    -[2] Completed

    See also: AbstractOperator, publish, multicast, share

    source

    See also

    Operators

    +[2] Completed

    See also: AbstractOperator, publish, multicast, share

    source

    See also

    Operators

    diff --git a/v1.7.2/operators/utility/safe/index.html b/v1.7.2/operators/utility/safe/index.html index 33e527fa3..2369e7156 100644 --- a/v1.7.2/operators/utility/safe/index.html +++ b/v1.7.2/operators/utility/safe/index.html @@ -1,2 +1,2 @@ -safe · Rocket.jl
    +safe · Rocket.jl
    diff --git a/v1.7.2/operators/utility/skip_complete/index.html b/v1.7.2/operators/utility/skip_complete/index.html index 3a8703cda..1833167a2 100644 --- a/v1.7.2/operators/utility/skip_complete/index.html +++ b/v1.7.2/operators/utility/skip_complete/index.html @@ -1,5 +1,5 @@ -skip_complete · Rocket.jl

    SkipComplete Operator

    Rocket.skip_completeFunction
    skip_complete()

    Creates a skip_complete operator, which filters out complete event by the source Observable by emitting only next and error messages.

    Producing

    Stream of type <: Subscribable{L} where L refers to type of source stream

    Examples

    using Rocket
    +skip_complete · Rocket.jl

    SkipComplete Operator

    Rocket.skip_completeFunction
    skip_complete()

    Creates a skip_complete operator, which filters out complete event by the source Observable by emitting only next and error messages.

    Producing

    Stream of type <: Subscribable{L} where L refers to type of source stream

    Examples

    using Rocket
     
     source = from([ 1, 2, 3 ])
     subscribe!(source |> skip_complete(), logger())
    @@ -9,4 +9,4 @@
     [LogActor] Data: 1
     [LogActor] Data: 2
     [LogActor] Data: 3
    -

    See also: AbstractOperator, InferableOperator, ProxyObservable, skip_error, skip_next, logger

    source

    See also

    Operators

    +

    See also: AbstractOperator, InferableOperator, ProxyObservable, skip_error, skip_next, logger

    source

    See also

    Operators

    diff --git a/v1.7.2/operators/utility/skip_error/index.html b/v1.7.2/operators/utility/skip_error/index.html index b0fe27df1..aaeb0ab5d 100644 --- a/v1.7.2/operators/utility/skip_error/index.html +++ b/v1.7.2/operators/utility/skip_error/index.html @@ -1,9 +1,9 @@ -skip_error · Rocket.jl

    SkipError Operator

    Rocket.skip_errorFunction
    skip_error()

    Creates a skip_error operator, which filters out error event by the source Observable by emitting only next and complete messages.

    Producing

    Stream of type <: Subscribable{L} where L refers to type of source stream

    Examples

    using Rocket
    +skip_error · Rocket.jl
    +

    See also: AbstractOperator, InferableOperator, ProxyObservable, skip_error, skip_complete, logger

    source

    See also

    Operators

    diff --git a/v1.7.2/operators/utility/skip_next/index.html b/v1.7.2/operators/utility/skip_next/index.html index 5c505e1c1..8293a0bb7 100644 --- a/v1.7.2/operators/utility/skip_next/index.html +++ b/v1.7.2/operators/utility/skip_next/index.html @@ -1,5 +1,5 @@ -skip_next · Rocket.jl

    SkipNext Operator

    Rocket.skip_nextFunction
    skip_next()

    Creates a skip_next operator, which filters out all next messages by the source Observable by emitting only error and complete messages.

    Producing

    Stream of type <: Subscribable{L} where L refers to type of source stream

    Examples

    using Rocket
    +skip_next · Rocket.jl

    SkipNext Operator

    Rocket.skip_nextFunction
    skip_next()

    Creates a skip_next operator, which filters out all next messages by the source Observable by emitting only error and complete messages.

    Producing

    Stream of type <: Subscribable{L} where L refers to type of source stream

    Examples

    using Rocket
     
     source = from([ 1, 2, 3 ])
     subscribe!(source |> skip_next(), logger())
    @@ -7,4 +7,4 @@
     
     # output
     [LogActor] Completed
    -

    See also: AbstractOperator, InferableOperator, ProxyObservable, skip_error, skip_complete, logger

    source

    See also

    Operators

    +

    See also: AbstractOperator, InferableOperator, ProxyObservable, skip_error, skip_complete, logger

    source

    See also

    Operators

    diff --git a/v1.7.2/operators/utility/tap/index.html b/v1.7.2/operators/utility/tap/index.html index 64eb831d2..de6cc2e43 100644 --- a/v1.7.2/operators/utility/tap/index.html +++ b/v1.7.2/operators/utility/tap/index.html @@ -1,5 +1,5 @@ -tap · Rocket.jl

    Tap Operator

    Rocket.tapFunction
    tap(tapFn::F) where { F <: Function }

    Creates a tap operator, which performs a side effect for every emission on the source Observable, but return an Observable that is identical to the source.

    Arguments

    • tapFn::Function: side-effect tap function with (data) -> Nothing signature

    Producing

    Stream of type <: Subscribable{L} where L refers to type of source stream

    Examples

    using Rocket
    +tap · Rocket.jl

    Tap Operator

    Rocket.tapFunction
    tap(tapFn::F) where { F <: Function }

    Creates a tap operator, which performs a side effect for every emission on the source Observable, but return an Observable that is identical to the source.

    Arguments

    • tapFn::Function: side-effect tap function with (data) -> Nothing signature

    Producing

    Stream of type <: Subscribable{L} where L refers to type of source stream

    Examples

    using Rocket
     
     source = from([ 1, 2, 3 ])
     subscribe!(source |> tap((d) -> println("In tap: $d")), logger())
    @@ -14,4 +14,4 @@
     In tap: 3
     [LogActor] Data: 3
     [LogActor] Completed
    -

    See also: tap_on_subscribe, tap_on_complete, logger

    source

    Description

    Returns an Observable that resembles the source Observable, but modifies it so that the provided Observer is called to perform a side effect for every value emitted by the source.

    This operator is useful for debugging your Observables, verifying correct values, or performing other side effects.

    Note: this operator differs from a subscribe on the Observable. If the Observable returned by tap is not subscribed, the side effects specified by the Observer will never happen. tap therefore simply spies on existing execution, it does not trigger an execution to happen like subscribe does.

    See also

    Operators

    +

    See also: tap_on_subscribe, tap_on_complete, logger

    source

    Description

    Returns an Observable that resembles the source Observable, but modifies it so that the provided Observer is called to perform a side effect for every value emitted by the source.

    This operator is useful for debugging your Observables, verifying correct values, or performing other side effects.

    Note: this operator differs from a subscribe on the Observable. If the Observable returned by tap is not subscribed, the side effects specified by the Observer will never happen. tap therefore simply spies on existing execution, it does not trigger an execution to happen like subscribe does.

    See also

    Operators

    diff --git a/v1.7.2/operators/utility/tap_on_complete/index.html b/v1.7.2/operators/utility/tap_on_complete/index.html index 84e242d73..61af1dd82 100644 --- a/v1.7.2/operators/utility/tap_on_complete/index.html +++ b/v1.7.2/operators/utility/tap_on_complete/index.html @@ -1,5 +1,5 @@ -tap_on_complete · Rocket.jl

    TapOnComplete Operator

    Rocket.tap_on_completeFunction
    tap_on_complete(tapFn::F) where { F <: Function }

    Creates a tap operator, which performs a side effect for only complete emission on the source Observable, but return an Observable that is identical to the source.

    Arguments

    • tapFn::Function: side-effect tap function with () -> Nothing signature

    Producing

    Stream of type <: Subscribable{L} where L refers to type of source stream

    Examples

    using Rocket
    +tap_on_complete · Rocket.jl

    TapOnComplete Operator

    Rocket.tap_on_completeFunction
    tap_on_complete(tapFn::F) where { F <: Function }

    Creates a tap operator, which performs a side effect for only complete emission on the source Observable, but return an Observable that is identical to the source.

    Arguments

    • tapFn::Function: side-effect tap function with () -> Nothing signature

    Producing

    Stream of type <: Subscribable{L} where L refers to type of source stream

    Examples

    using Rocket
     
     source = from([ 1, 2, 3 ])
     subscribe!(source |> tap_on_complete(() -> println("Complete event received")), logger())
    @@ -12,4 +12,4 @@
     [LogActor] Data: 3
     [LogActor] Completed
     Complete event received
    -

    See also: tap_on_subscribe, tap, logger

    source

    Description

    Returns an Observable that resembles the source Observable, but modifies it so that the provided Observer is called to perform a side effect on complete event emission by the source.

    This operator is useful for debugging your Observables, verifying correctness, or performing other side effects.

    Note: this operator differs from a subscribe on the Observable. If the Observable returned by tap_on_complete is not subscribed, the side effects specified by the Observer will never happen. tap_on_complete therefore simply spies on future execution, it does not trigger an execution to happen like subscribe does.

    See also

    Operators

    +

    See also: tap_on_subscribe, tap, logger

    source

    Description

    Returns an Observable that resembles the source Observable, but modifies it so that the provided Observer is called to perform a side effect on complete event emission by the source.

    This operator is useful for debugging your Observables, verifying correctness, or performing other side effects.

    Note: this operator differs from a subscribe on the Observable. If the Observable returned by tap_on_complete is not subscribed, the side effects specified by the Observer will never happen. tap_on_complete therefore simply spies on future execution, it does not trigger an execution to happen like subscribe does.

    See also

    Operators

    diff --git a/v1.7.2/operators/utility/tap_on_subscribe/index.html b/v1.7.2/operators/utility/tap_on_subscribe/index.html index ad0f25499..52c9faaf4 100644 --- a/v1.7.2/operators/utility/tap_on_subscribe/index.html +++ b/v1.7.2/operators/utility/tap_on_subscribe/index.html @@ -1,5 +1,5 @@ -tap_on_subscribe · Rocket.jl

    TapOnSubscribe Operator

    Rocket.tap_on_subscribeFunction
    tap_on_subscribe(tapFn::F, strategy::S = TapBeforeSubscription()) where { F <: Function }

    Creates a tap operator, which performs a side effect on the subscription on the source Observable, but return an Observable that is identical to the source.

    Arguments

    • tapFn::Function: side-effect tap function with () -> Nothing signature
    • strategy: (optional), specifies the order of a side-effect and an actual subscription, uses TapBeforeSubscription by default

    Producing

    Stream of type <: Subscribable{L} where L refers to type of source stream

    Examples

    using Rocket
    +tap_on_subscribe · Rocket.jl

    TapOnSubscribe Operator

    Rocket.tap_on_subscribeFunction
    tap_on_subscribe(tapFn::F, strategy::S = TapBeforeSubscription()) where { F <: Function }

    Creates a tap operator, which performs a side effect on the subscription on the source Observable, but return an Observable that is identical to the source.

    Arguments

    • tapFn::Function: side-effect tap function with () -> Nothing signature
    • strategy: (optional), specifies the order of a side-effect and an actual subscription, uses TapBeforeSubscription by default

    Producing

    Stream of type <: Subscribable{L} where L refers to type of source stream

    Examples

    using Rocket
     
     source = from([ 1, 2, 3 ])
     subscribe!(source |> tap_on_subscribe(() -> println("Someone subscribed")), logger())
    @@ -23,4 +23,4 @@
     [LogActor] Data: 2
     [LogActor] Data: 3
     [LogActor] Completed
    -Someone subscribed

    See also: TapBeforeSubscription, TapAfterSubscription, tap, tap_on_unsubscribe, tap_on_complete, logger

    source

    Description

    Returns an Observable that resembles the source Observable, but modifies it so that the provided Observer is called to perform a side effect on subscription to the source.

    This operator is useful for debugging your Observables, verifying correctness, or performing other side effects.

    Note: this operator differs from a subscribe on the Observable. If the Observable returned by tap_on_subscribe is not subscribed, the side effects specified by the Observer will never happen. tap_on_subscribe therefore simply spies on future execution, it does not trigger an execution to happen like subscribe does.

    See also

    Operators

    +Someone subscribed

    See also: TapBeforeSubscription, TapAfterSubscription, tap, tap_on_unsubscribe, tap_on_complete, logger

    source

    Description

    Returns an Observable that resembles the source Observable, but modifies it so that the provided Observer is called to perform a side effect on subscription to the source.

    This operator is useful for debugging your Observables, verifying correctness, or performing other side effects.

    Note: this operator differs from a subscribe on the Observable. If the Observable returned by tap_on_subscribe is not subscribed, the side effects specified by the Observer will never happen. tap_on_subscribe therefore simply spies on future execution, it does not trigger an execution to happen like subscribe does.

    See also

    Operators

    diff --git a/v1.7.2/operators/utility/tap_on_unsubscribe/index.html b/v1.7.2/operators/utility/tap_on_unsubscribe/index.html index b3b2e8a69..4171f92fa 100644 --- a/v1.7.2/operators/utility/tap_on_unsubscribe/index.html +++ b/v1.7.2/operators/utility/tap_on_unsubscribe/index.html @@ -1,5 +1,5 @@ -tap_on_unsubscribe · Rocket.jl

    TapOnUnsubscribe Operator

    Rocket.tap_on_unsubscribeFunction
    tap_on_unsubscribe(tapFn::F, strategy::S = TapBeforeUnsubscription()) where { F <: Function }

    Creates a tap operator, which performs a side effect on the unsubscription on the source Observable, but return an Observable that is identical to the source. Tap callback triggers only once.

    Arguments

    • tapFn::Function: side-effect tap function with () -> Nothing signature
    • strategy: (optional), specifies the order of a side-effect and an actual unsubscription, uses TapBeforeUnsubscription by default

    Producing

    Stream of type <: Subscribable{L} where L refers to type of source stream

    Examples

    using Rocket
    +tap_on_unsubscribe · Rocket.jl

    TapOnUnsubscribe Operator

    Rocket.tap_on_unsubscribeFunction
    tap_on_unsubscribe(tapFn::F, strategy::S = TapBeforeUnsubscription()) where { F <: Function }

    Creates a tap operator, which performs a side effect on the unsubscription on the source Observable, but return an Observable that is identical to the source. Tap callback triggers only once.

    Arguments

    • tapFn::Function: side-effect tap function with () -> Nothing signature
    • strategy: (optional), specifies the order of a side-effect and an actual unsubscription, uses TapBeforeUnsubscription by default

    Producing

    Stream of type <: Subscribable{L} where L refers to type of source stream

    Examples

    using Rocket
     
     source = from([ 1, 2, 3 ])
     subscription = subscribe!(source |> tap_on_unsubscribe(() -> println("Someone unsubscribed")), logger())
    @@ -12,4 +12,4 @@
     [LogActor] Data: 2
     [LogActor] Data: 3
     [LogActor] Completed
    -Someone unsubscribed

    See also: TapBeforeUnsubscription, TapAfterUnsubscription, tap, tap_on_subscribe, tap_on_complete, logger

    source

    Description

    Returns an Observable that resembles the source Observable, but modifies it so that the provided Observer is called to perform a side effect on unsubscription from the source.

    This operator is useful for debugging your Observables, verifying correctness, or performing other side effects.

    See also

    Operators

    +Someone unsubscribed

    See also: TapBeforeUnsubscription, TapAfterUnsubscription, tap, tap_on_subscribe, tap_on_complete, logger

    source

    Description

    Returns an Observable that resembles the source Observable, but modifies it so that the provided Observer is called to perform a side effect on unsubscription from the source.

    This operator is useful for debugging your Observables, verifying correctness, or performing other side effects.

    See also

    Operators

    diff --git a/v1.7.2/search/index.html b/v1.7.2/search/index.html deleted file mode 100644 index d4caa94fc..000000000 --- a/v1.7.2/search/index.html +++ /dev/null @@ -1,2 +0,0 @@ - -Search · Rocket.jl

    Loading search...

      diff --git a/v1.7.2/search_index.js b/v1.7.2/search_index.js index c3a0d1fc8..15ea339f3 100644 --- a/v1.7.2/search_index.js +++ b/v1.7.2/search_index.js @@ -1,3 +1,3 @@ var documenterSearchIndex = {"docs": -[{"location":"operators/utility/skip_complete/#operator_skip_complete","page":"skip_complete","title":"SkipComplete Operator","text":"","category":"section"},{"location":"operators/utility/skip_complete/","page":"skip_complete","title":"skip_complete","text":"skip_complete","category":"page"},{"location":"operators/utility/skip_complete/#Rocket.skip_complete","page":"skip_complete","title":"Rocket.skip_complete","text":"skip_complete()\n\nCreates a skip_complete operator, which filters out complete event by the source Observable by emitting only next and error messages.\n\nProducing\n\nStream of type <: Subscribable{L} where L refers to type of source stream\n\nExamples\n\nusing Rocket\n\nsource = from([ 1, 2, 3 ])\nsubscribe!(source |> skip_complete(), logger())\n;\n\n# output\n[LogActor] Data: 1\n[LogActor] Data: 2\n[LogActor] Data: 3\n\n\nSee also: AbstractOperator, InferableOperator, ProxyObservable, skip_error, skip_next, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/utility/skip_complete/#See-also","page":"skip_complete","title":"See also","text":"","category":"section"},{"location":"operators/utility/skip_complete/","page":"skip_complete","title":"skip_complete","text":"Operators","category":"page"},{"location":"operators/transformation/start_with/#operator_start_with","page":"start_with","title":"StartWith Operator","text":"","category":"section"},{"location":"operators/transformation/start_with/","page":"start_with","title":"start_with","text":"start_with","category":"page"},{"location":"operators/transformation/start_with/#Rocket.start_with","page":"start_with","title":"Rocket.start_with","text":"start_with(object::O) where O\n\nCreates a start_with operator, which forces an observable to emit given object as a first value.\n\nProducing\n\nStream of type <: Subscribable{Union{L, O}} where L refers to type of source stream <: Subscribable{L}\n\nExamples\n\nusing Rocket\n\nsource = from(1:3) |> start_with(0)\nsubscribe!(source, logger())\n;\n\n# output\n\n[LogActor] Data: 0\n[LogActor] Data: 1\n[LogActor] Data: 2\n[LogActor] Data: 3\n[LogActor] Completed\n\nSee also: AbstractOperator, InferableOperator, ProxyObservable, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/transformation/start_with/#See-also","page":"start_with","title":"See also","text":"","category":"section"},{"location":"operators/transformation/start_with/","page":"start_with","title":"start_with","text":"Operators","category":"page"},{"location":"actors/types/server/#actor_server","page":"Server","title":"Server actor","text":"","category":"section"},{"location":"actors/types/server/","page":"Server","title":"Server","text":"server","category":"page"},{"location":"actors/types/server/#Rocket.server","page":"Server","title":"Rocket.server","text":"server(port::Int)\nserver(address::A, port::Int) where { A <: IPAddr }\nserver(::Type{D}, port::Int)\nserver(::Type{D}, address::A, port::Int) where { A <: IPAddr }\n\nCreation operator for the ServerActor actor.\n\nSee also: AbstractActor\n\n\n\n\n\n","category":"function"},{"location":"actors/types/server/","page":"Server","title":"Server","text":"ServerActor","category":"page"},{"location":"actors/types/server/#Rocket.ServerActor","page":"Server","title":"Rocket.ServerActor","text":"ServerActor{D, Address, Port}() where D\n\nThe ServerActor sends all next!/error!/complete! events to the local network listeners with specified Address and Port parameters via TCPSocket.\n\nSee also: Actor, server\n\n\n\n\n\n","category":"type"},{"location":"operators/transformation/exhaust_map/#operator_exhaust_map","page":"exhaust_map","title":"ExhaustMap Operator","text":"","category":"section"},{"location":"operators/transformation/exhaust_map/","page":"exhaust_map","title":"exhaust_map","text":"exhaust_map","category":"page"},{"location":"operators/transformation/exhaust_map/#Rocket.exhaust_map","page":"exhaust_map","title":"Rocket.exhaust_map","text":"exhaust_map(::Type{R}, mappingFn::F = identity) where { R, F <: Function }\n\nCreates a exhaust_map operator, which returns an Observable containing projected Observables of each item of the source, ignoring projected Observables that start before their preceding Observable has completed. Essentially it projects each source value to an Observable which is merged in the output Observable only if the previous projected Observable has completed.\n\nArguments\n\n::Type{R}: the type of data of output Observables after projection with mappingFn\nmappingFn::F: projection function with (data) -> Observable{R} signature\n\nProducing\n\nStream of type <: Subscribable{R}\n\nExamples\n\nusing Rocket\n\nsource = from([ 0, 0 ]) |> async() |> exhaust_map(Int, d -> from([ 1, 2 ]) |> async())\nsubscribe!(source, logger())\n;\n\n# output\n\n[LogActor] Data: 1\n[LogActor] Data: 2\n[LogActor] Completed\n\nSee also: AbstractOperator, RightTypedOperator, ProxyObservable, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/transformation/exhaust_map/#See-also","page":"exhaust_map","title":"See also","text":"","category":"section"},{"location":"operators/transformation/exhaust_map/","page":"exhaust_map","title":"exhaust_map","text":"Operators","category":"page"},{"location":"operators/utility/ref_count/#operator_ref_count","page":"ref_count","title":"Ref Count Operator","text":"","category":"section"},{"location":"operators/utility/ref_count/","page":"ref_count","title":"ref_count","text":"ref_count","category":"page"},{"location":"operators/utility/ref_count/#Rocket.ref_count","page":"ref_count","title":"Rocket.ref_count","text":"ref_count()\n\nMake a ConnectableObservable behave like a ordinary observable and automates the way you can connect to it. Internally it counts the subscriptions to the observable and subscribes (only once) to the source if the number of subscriptions is larger than 0. If the number of subscriptions is smaller than 1, it unsubscribes from the source. This way you can make sure that everything before the published refCount has only a single subscription independently of the number of subscribers to the target observable.\n\nNote that using the share operator is exactly the same as using the publish operator (making the observable hot) and the ref_count() operator in a sequence.\n\nExample\n\nusing Rocket\n\nsubject = Subject(Int, scheduler = AsapScheduler())\nsource = from(1:5) |> multicast(subject) |> ref_count()\n\nactor1 = logger(\"1\")\nactor2 = logger(\"2\")\n\nsubscription1 = subscribe!(source, actor1)\nsubscription2 = subscribe!(source, actor2)\n\nunsubscribe!(subscription1)\nunsubscribe!(subscription2)\n;\n\n# output\n[1] Data: 1\n[1] Data: 2\n[1] Data: 3\n[1] Data: 4\n[1] Data: 5\n[1] Completed\n[2] Completed\n\nSee also: AbstractOperator, publish, multicast, share\n\n\n\n\n\n","category":"function"},{"location":"operators/utility/ref_count/#See-also","page":"ref_count","title":"See also","text":"","category":"section"},{"location":"operators/utility/ref_count/","page":"ref_count","title":"ref_count","text":"Operators","category":"page"},{"location":"actors/types/keep/#actor_keep","page":"Keep","title":"Keep actor","text":"","category":"section"},{"location":"actors/types/keep/","page":"Keep","title":"Keep","text":"keep","category":"page"},{"location":"actors/types/keep/#Rocket.keep","page":"Keep","title":"Rocket.keep","text":"keep(::Type{T}) where T\n\nArguments\n\n::Type{T}: Type of keep data\n\nCreation operator for the KeepActor actor.\n\nExamples\n\nusing Rocket\n\nactor = keep(Int)\nactor isa KeepActor{Int}\n\n# output\ntrue\n\nSee also: KeepActor, AbstractActor\n\n\n\n\n\n","category":"function"},{"location":"actors/types/keep/","page":"Keep","title":"Keep","text":"KeepActor","category":"page"},{"location":"actors/types/keep/#Rocket.KeepActor","page":"Keep","title":"Rocket.KeepActor","text":"KeepActor{D}() where D\n\nKeep actor provides a storage actor. It saves all incoming successful next events in a values array, throws an ErrorException on error! event and does nothing on completion event.\n\nExamples\n\nusing Rocket\n\nsource = from(1:5)\nactor = keep(Int)\n\nsubscribe!(source, actor)\nshow(getvalues(actor))\n\n# output\n[1, 2, 3, 4, 5]\n\nSee also: Actor, keep\n\n\n\n\n\n","category":"type"},{"location":"observables/types/collected/#observable_collected","page":"Collected","title":"Collected Observable","text":"","category":"section"},{"location":"observables/types/collected/","page":"Collected","title":"Collected","text":"collectLatest","category":"page"},{"location":"observables/types/collected/#Rocket.collectLatest","page":"Collected","title":"Rocket.collectLatest","text":"collectLatest(sources::S, mappingFn::F = copy) where { S, F }\ncollectLatest(::Type{T}, ::Type{R}, sources::S, mappingFn::F = copy)\n\nCollects values from multible Observables and emits it in one single array every time each inner Observable has a new value. Reemits errors from inner observables. Completes when all inner observables completes.\n\nArguments\n\nsources: input sources\nmappingFn: optional mappingFn applied to an array of emited values, copy by default, should return a Vector\n\nNote: collectLatest completes immediately if sources are empty.\n\nOptional arguments\n\n::Type{T}: optional type of emmiting values of inner observables\n::Type{R}: optional return type after applying mappingFn to a vector of values\n\nExamples\n\nusing Rocket\n\ncollected = collectLatest([ of(1), from([ 1, 2 ]) ])\n\nsubscribe!(collected, logger())\n;\n\n# output\n\n[LogActor] Data: [1, 1]\n[LogActor] Data: [1, 2]\n[LogActor] Completed\n\nSee also: Subscribable, subscribe!, combineLatest\n\n\n\n\n\n","category":"function"},{"location":"observables/types/collected/#Description","page":"Collected","title":"Description","text":"","category":"section"},{"location":"observables/types/collected/","page":"Collected","title":"Collected","text":"collectLatest collects the values from all Observables in its vector argument. This is done by subscribing to each Observable in order and, whenever an Observable emits, collecting a vector of the most recent values from each Observable (in order). If you pass n Observables to collectLatest, the returned Observable will always emit an ordered vector of n values.","category":"page"},{"location":"observables/types/collected/","page":"Collected","title":"Collected","text":"To ensure that the output vector has a consistent length, collectLatest waits for all input Observables to emit at least once before it starts emitting results. This means that if some Observable emits values before other Observables started emitting, all these values but the last will be lost. On the other hand, if some Observable does not emit a value but completes, the resulting Observable will complete simultaneously without emitting anything. Furthermore, if some input Observable does not emit any value and never completes, collectLatest will also never emit and never complete.","category":"page"},{"location":"observables/types/collected/","page":"Collected","title":"Collected","text":"If at least one Observable was passed to collectLatest and all passed Observables emitted, then the resulting Observable will complete when all combined streams complete. So even if some Observable completes, the result of collectLatest will still emit values when the other Observables do. In case of a completed Observable, its value will now remain to be the last emitted value. On the other hand, if any Observable errors, collectLatest will also immediately error.","category":"page"},{"location":"observables/types/defer/#observable_defer","page":"Defer","title":"Defer Observable","text":"","category":"section"},{"location":"observables/types/defer/","page":"Defer","title":"Defer","text":"defer","category":"page"},{"location":"observables/types/defer/#Rocket.defer","page":"Defer","title":"Rocket.defer","text":"defer(::Type{D}, factoryFn::F) where { D, F <: Function }\n\nCreates an Observable that, on subscribe, calls an Observable factory to make an Observable for each new Observer.\n\nArguments\n\nT: type of output data source, created by the factoryFn\nfactoryFn: the Observable factory function to invoke for each Observer that subscribes to the output Observable\n\nExamples\n\nusing Rocket\n\nsource = defer(Int, () -> from([ 1, 2, 3 ]))\n\nsubscribe!(source, logger())\n;\n\n# output\n[LogActor] Data: 1\n[LogActor] Data: 2\n[LogActor] Data: 3\n[LogActor] Completed\n\nSee also: Subscribable, subscribe!, logger\n\n\n\n\n\n","category":"function"},{"location":"observables/types/defer/#Description","page":"Defer","title":"Description","text":"","category":"section"},{"location":"observables/types/defer/","page":"Defer","title":"Defer","text":"defer allows you to create the Observable only when the Actor subscribes, and create a fresh Observable for each Actor. It waits until an Actor subscribes to it, and then it generates an Observable, typically with an Observable factory function. It does this afresh for each subscriber, so although each subscriber may think it is subscribing to the same Observable, in fact each subscriber gets its own individual Observable.","category":"page"},{"location":"operators/filtering/last/#operator_last","page":"last","title":"Last Operator","text":"","category":"section"},{"location":"operators/filtering/last/","page":"last","title":"last","text":"last","category":"page"},{"location":"operators/filtering/last/#Base.last","page":"last","title":"Base.last","text":"last(; default = nothing)\n\nCreates a last operator, which returns an Observable that emits only the last item emitted by the source Observable. Sends LastNotFoundException error message if a given source completes without emitting a single value.\n\nArguments\n\ndefault: an optional default value to provide if no values were emitted\n\nProducing\n\nStream of type <: Subscribable{L} where L refers to type of source stream\n\nExamples\n\nusing Rocket\n\nsource = from([ 1, 2, 3 ])\nsubscribe!(source |> last(), logger())\n;\n\n# output\n\n[LogActor] Data: 3\n[LogActor] Completed\n\n\nusing Rocket\n\nsource = from(Int[])\nsubscribe!(source |> last() |> catch_error((err, obs) -> of(1)), logger())\n;\n\n# output\n\n[LogActor] Data: 1\n[LogActor] Completed\n\nusing Rocket\n\nsource = from(Int[])\nsubscribe!(source |> last(default = 1), logger())\n;\n\n# output\n\n[LogActor] Data: 1\n[LogActor] Completed\n\nSee also: AbstractOperator, InferableOperator, ProxyObservable, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/filtering/last/#Description","page":"last","title":"Description","text":"","category":"section"},{"location":"operators/filtering/last/","page":"last","title":"last","text":"last operator returns an Observable that emits only the last item emitted by the source Observable.","category":"page"},{"location":"operators/filtering/last/#See-also","page":"last","title":"See also","text":"","category":"section"},{"location":"operators/filtering/last/","page":"last","title":"last","text":"Operators","category":"page"},{"location":"operators/utility/tap_on_subscribe/#operator_tap_on_subscribe","page":"tap_on_subscribe","title":"TapOnSubscribe Operator","text":"","category":"section"},{"location":"operators/utility/tap_on_subscribe/","page":"tap_on_subscribe","title":"tap_on_subscribe","text":"TapBeforeSubscription\nTapAfterSubscription\ntap_on_subscribe","category":"page"},{"location":"operators/utility/tap_on_subscribe/#Rocket.TapBeforeSubscription","page":"tap_on_subscribe","title":"Rocket.TapBeforeSubscription","text":"TapBeforeSubscription\n\nOne of the strategies for tap_on_subscribe operator. With TapBeforeSubscription tap callback will be called before actual subscription.\n\nSee also: tap_on_subscribe, TapAfterSubscription\n\n\n\n\n\n","category":"type"},{"location":"operators/utility/tap_on_subscribe/#Rocket.TapAfterSubscription","page":"tap_on_subscribe","title":"Rocket.TapAfterSubscription","text":"TapAfterSubscription\n\nOne of the strategies for tap_on_subscribe operator. With TapBeforeSubscription tap callback will be called after actual subscription.\n\nSee also: tap_on_subscribe, TapBeforeSubscription\n\n\n\n\n\n","category":"type"},{"location":"operators/utility/tap_on_subscribe/#Rocket.tap_on_subscribe","page":"tap_on_subscribe","title":"Rocket.tap_on_subscribe","text":"tap_on_subscribe(tapFn::F, strategy::S = TapBeforeSubscription()) where { F <: Function }\n\nCreates a tap operator, which performs a side effect on the subscription on the source Observable, but return an Observable that is identical to the source.\n\nArguments\n\ntapFn::Function: side-effect tap function with () -> Nothing signature\nstrategy: (optional), specifies the order of a side-effect and an actual subscription, uses TapBeforeSubscription by default\n\nProducing\n\nStream of type <: Subscribable{L} where L refers to type of source stream\n\nExamples\n\nusing Rocket\n\nsource = from([ 1, 2, 3 ])\nsubscribe!(source |> tap_on_subscribe(() -> println(\"Someone subscribed\")), logger())\n;\n\n# output\n\nSomeone subscribed\n[LogActor] Data: 1\n[LogActor] Data: 2\n[LogActor] Data: 3\n[LogActor] Completed\n\nusing Rocket\n\nsource = from([ 1, 2, 3 ])\nsubscribe!(source |> tap_on_subscribe(() -> println(\"Someone subscribed\"), TapAfterSubscription()), logger())\n;\n\n# output\n\n[LogActor] Data: 1\n[LogActor] Data: 2\n[LogActor] Data: 3\n[LogActor] Completed\nSomeone subscribed\n\nSee also: TapBeforeSubscription, TapAfterSubscription, tap, tap_on_unsubscribe, tap_on_complete, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/utility/tap_on_subscribe/#Description","page":"tap_on_subscribe","title":"Description","text":"","category":"section"},{"location":"operators/utility/tap_on_subscribe/","page":"tap_on_subscribe","title":"tap_on_subscribe","text":"Returns an Observable that resembles the source Observable, but modifies it so that the provided Observer is called to perform a side effect on subscription to the source.","category":"page"},{"location":"operators/utility/tap_on_subscribe/","page":"tap_on_subscribe","title":"tap_on_subscribe","text":"This operator is useful for debugging your Observables, verifying correctness, or performing other side effects.","category":"page"},{"location":"operators/utility/tap_on_subscribe/","page":"tap_on_subscribe","title":"tap_on_subscribe","text":"Note: this operator differs from a subscribe on the Observable. If the Observable returned by tap_on_subscribe is not subscribed, the side effects specified by the Observer will never happen. tap_on_subscribe therefore simply spies on future execution, it does not trigger an execution to happen like subscribe does.","category":"page"},{"location":"operators/utility/tap_on_subscribe/#See-also","page":"tap_on_subscribe","title":"See also","text":"","category":"section"},{"location":"operators/utility/tap_on_subscribe/","page":"tap_on_subscribe","title":"tap_on_subscribe","text":"Operators","category":"page"},{"location":"operators/utility/safe/#operator_safe","page":"safe","title":"Safe Operator","text":"","category":"section"},{"location":"operators/utility/safe/","page":"safe","title":"safe","text":"safe","category":"page"},{"location":"operators/utility/safe/#Rocket.safe","page":"safe","title":"Rocket.safe","text":"safe()\n\nCreates a SafeOperator, which wraps on_subscribe! and each next!, error! and complete! callbacks into try-catch block.\n\nProducing\n\nStream of type <: Subscribable{L} where L refers to type of source stream\n\nSee also: AbstractOperator, InferableOperator, ProxyObservable, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/utility/safe/#See-also","page":"safe","title":"See also","text":"","category":"section"},{"location":"operators/utility/safe/","page":"safe","title":"safe","text":"Operators","category":"page"},{"location":"operators/utility/skip_next/#operator_skip_next","page":"skip_next","title":"SkipNext Operator","text":"","category":"section"},{"location":"operators/utility/skip_next/","page":"skip_next","title":"skip_next","text":"skip_next","category":"page"},{"location":"operators/utility/skip_next/#Rocket.skip_next","page":"skip_next","title":"Rocket.skip_next","text":"skip_next()\n\nCreates a skip_next operator, which filters out all next messages by the source Observable by emitting only error and complete messages.\n\nProducing\n\nStream of type <: Subscribable{L} where L refers to type of source stream\n\nExamples\n\nusing Rocket\n\nsource = from([ 1, 2, 3 ])\nsubscribe!(source |> skip_next(), logger())\n;\n\n# output\n[LogActor] Completed\n\n\nSee also: AbstractOperator, InferableOperator, ProxyObservable, skip_error, skip_complete, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/utility/skip_next/#See-also","page":"skip_next","title":"See also","text":"","category":"section"},{"location":"operators/utility/skip_next/","page":"skip_next","title":"skip_next","text":"Operators","category":"page"},{"location":"operators/transformation/switch_map/#operator_switch_map","page":"switch_map","title":"SwitchMap Operator","text":"","category":"section"},{"location":"operators/transformation/switch_map/","page":"switch_map","title":"switch_map","text":"switch_map","category":"page"},{"location":"operators/transformation/switch_map/#Rocket.switch_map","page":"switch_map","title":"Rocket.switch_map","text":"switch_map(::Type{R}, mappingFn::F = identity) where { R, F <: Function }\n\nCreates a switch_map operator, which returns an Observable that emits items based on applying a function mappingFn that you supply to each item emitted by the source Observable, where that function returns an (so-called \"inner\") Observable. Each time it observes one of these inner Observables, the output Observable begins emitting the items emitted by that inner Observable. When a new inner Observable is emitted, switch_map stops emitting items from the earlier-emitted inner Observable and begins emitting items from the new one. It continues to behave like this for subsequent inner Observables.\n\nArguments\n\n::Type{R}: the type of data of output Observables after projection with mappingFn\nmappingFn::F: projection function with (data) -> Observable{R} signature\n\nProducing\n\nStream of type <: Subscribable{R}\n\nExamples\n\nusing Rocket\n\nsource = from([ of(1), of(2), of(3) ])\nsubscribe!(source |> switch_map(Int), logger())\n;\n\n# output\n\n[LogActor] Data: 1\n[LogActor] Data: 2\n[LogActor] Data: 3\n[LogActor] Completed\n\nusing Rocket\n\nsource = from([ 1, 2, 3 ])\nsubscribe!(source |> switch_map(Float64, (d) -> of(convert(Float64, d ^ 2))), logger())\n;\n\n# output\n\n[LogActor] Data: 1.0\n[LogActor] Data: 4.0\n[LogActor] Data: 9.0\n[LogActor] Completed\n\nSee also: AbstractOperator, RightTypedOperator, ProxyObservable, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/transformation/switch_map/#See-also","page":"switch_map","title":"See also","text":"","category":"section"},{"location":"operators/transformation/switch_map/","page":"switch_map","title":"switch_map","text":"Operators","category":"page"},{"location":"api/actors/#actors_api","page":"Actors","title":"Actors API","text":"","category":"section"},{"location":"api/actors/#How-to-create-a-custom-Actor","page":"Actors","title":"How to create a custom Actor","text":"","category":"section"},{"location":"api/actors/","page":"Actors","title":"Actors","text":"At first custom actor should implement a custom method for the as_actor function. Rocket.jl also provides a number of helper actor abstract types with predefined as_actor method behavior (see Traits API section).","category":"page"},{"location":"api/actors/","page":"Actors","title":"Actors","text":"using Rocket\n\nstruct MyCustomActor end\n\nas_actor(::Type{<:MyCustomActor}) = Rocket.BaseActorTrait{Int}()\n","category":"page"},{"location":"api/actors/","page":"Actors","title":"Actors","text":"or","category":"page"},{"location":"api/actors/","page":"Actors","title":"Actors","text":"using Rocket\n\nstruct MyCustomActor <: Actor{Int} end # Automatically specifies BaseActorTrait{Int} behavior.","category":"page"},{"location":"api/actors/","page":"Actors","title":"Actors","text":"Additionally custom actor must provide a custom methods for on_next!, on_error! and/or on_complete! functions. Depending on specified actor trait behavior some methods may or may not be optional.","category":"page"},{"location":"api/actors/","page":"Actors","title":"Actors","text":"using Rocket\n\nstruct MyCustomActor <: Actor{Int} end\n\nRocket.on_next!(actor::MyCustomActor, data::Int) = # custom logic here\nRocket.on_error!(actor::MyCustomActor, err) = # custom logic here\nRocket.on_complete!(actor::MyCustomActor) = # custom logic here","category":"page"},{"location":"api/actors/","page":"Actors","title":"Actors","text":"or","category":"page"},{"location":"api/actors/","page":"Actors","title":"Actors","text":"using Rocket\n\nstruct MyCustomCompletionActor <: CompletionActor{Int} end\n\nRocket.on_complete!(actor::MyCustomCompletionActor) = # custom logic here","category":"page"},{"location":"api/actors/#actors_api_traits","page":"Actors","title":"Traits","text":"","category":"section"},{"location":"api/actors/","page":"Actors","title":"Actors","text":"as_actor\nActorTrait\nBaseActorTrait\nNextActorTrait\nErrorActorTrait\nCompletionActorTrait\nInvalidActorTrait","category":"page"},{"location":"api/actors/#Rocket.as_actor","page":"Actors","title":"Rocket.as_actor","text":"as_actor(any)\n\nThis function checks actor trait behavior specification. May be used explicitly to specify actor trait behavior for any object.\n\nSee also: ActorTrait\n\n\n\n\n\n","category":"function"},{"location":"api/actors/#Rocket.ActorTrait","page":"Actors","title":"Rocket.ActorTrait","text":"Abstract type for all possible actor traits\n\nSee also: BaseActorTrait, NextActorTrait, ErrorActorTrait, CompletionActorTrait, InvalidActorTrait\n\n\n\n\n\n","category":"type"},{"location":"api/actors/#Rocket.BaseActorTrait","page":"Actors","title":"Rocket.BaseActorTrait","text":"Base actor trait specifies actor to listen for all next!, error! and complete! events. BaseActorTrait is a subtype of ActorTrait.\n\nSee also: Actor\n\n\n\n\n\n","category":"type"},{"location":"api/actors/#Rocket.NextActorTrait","page":"Actors","title":"Rocket.NextActorTrait","text":"Next actor trait specifies actor to listen for next! events only. NextActorTrait is a subtype of ActorTrait.\n\nSee also: NextActor\n\n\n\n\n\n","category":"type"},{"location":"api/actors/#Rocket.ErrorActorTrait","page":"Actors","title":"Rocket.ErrorActorTrait","text":"Error actor trait specifies actor to listen for error! events only. ErrorActorTrait is a subtype of ActorTrait.\n\nSee also: ErrorActor\n\n\n\n\n\n","category":"type"},{"location":"api/actors/#Rocket.CompletionActorTrait","page":"Actors","title":"Rocket.CompletionActorTrait","text":"Completion actor trait specifies actor to listen for complete! events only. CompletionActorTrait is a subtype of ActorTrait.\n\nSee also: CompletionActor\n\n\n\n\n\n","category":"type"},{"location":"api/actors/#Rocket.InvalidActorTrait","page":"Actors","title":"Rocket.InvalidActorTrait","text":"Default actor trait behavior for any object. Actor with such a trait specificaion cannot be used as a valid actor in subscribe! function. Doing so will raise an error. InvalidActorTrait is a subtype of ActorTrait.\n\nSee also: ActorTrait\n\n\n\n\n\n","category":"type"},{"location":"api/actors/#Types","page":"Actors","title":"Types","text":"","category":"section"},{"location":"api/actors/","page":"Actors","title":"Actors","text":"AbstractActor\nActor\nNextActor\nErrorActor\nCompletionActor","category":"page"},{"location":"api/actors/#Rocket.AbstractActor","page":"Actors","title":"Rocket.AbstractActor","text":"Supertype type for Actor, NextActor, ErrorActor and CompletionActor types.\n\nSee also: Actor, NextActor, ErrorActor, CompletionActor\n\n\n\n\n\n","category":"type"},{"location":"api/actors/#Rocket.Actor","page":"Actors","title":"Rocket.Actor","text":"Can be used as a super type for common actor. Automatically specifies a BaseActorTrait trait behavior. Every Actor must implement its own methods for on_next!(actor, data), on_error!(actor, err) and on_complete!(actor) functions. Actor is a subtype of AbstractActor type.\n\nExamples\n\nusing Rocket\n\nstruct MyActor <: Actor{String} end\n\nRocket.as_actor(MyActor)\n\n# output\n\nBaseActorTrait{String}()\n\nSee also: AbstractActor, as_actor, BaseActorTrait, ActorTrait, on_next!, on_error!, on_complete!\n\n\n\n\n\n","category":"type"},{"location":"api/actors/#Rocket.NextActor","page":"Actors","title":"Rocket.NextActor","text":"Can be used as a super type for \"next-only\" actor. Automatically specifies a NextActorTrait trait behavior. Every NextActor must implement its own methods for on_next!(actor, data) function only. NextActor is a subtype of AbstractActor type.\n\nExamples\n\nusing Rocket\n\nstruct MyNextActor <: NextActor{String} end\n\nRocket.as_actor(MyNextActor)\n\n# output\n\nNextActorTrait{String}()\n\nSee also: AbstractActor, as_actor, NextActorTrait, ActorTrait, on_next!\n\n\n\n\n\n","category":"type"},{"location":"api/actors/#Rocket.ErrorActor","page":"Actors","title":"Rocket.ErrorActor","text":"Can be used as a super type for \"error-only\" actor. Automatically specifies a ErrorActorTrait trait behavior. Every ErrorActor must implement its own methods for on_error!(actor, err) function only. ErrorActor is a subtype of AbstractActor type.\n\nExamples\n\nusing Rocket\n\nstruct MyErrorActor <: ErrorActor{String} end\n\nRocket.as_actor(MyErrorActor)\n\n# output\n\nErrorActorTrait{String}()\n\nSee also: AbstractActor, as_actor, ErrorActorTrait, ActorTrait, on_error!\n\n\n\n\n\n","category":"type"},{"location":"api/actors/#Rocket.CompletionActor","page":"Actors","title":"Rocket.CompletionActor","text":"Can be used as a super type for \"completion-only\" actor. Automatically specifies a CompletionActorTrait trait behavior. Every CompletionActor must implement its own methods for on_complete!(actor) function only. CompletionActor is a subtype of AbstractActor type.\n\nExamples\n\nusing Rocket\n\nstruct MyCompletionActor <: CompletionActor{String} end\n\nRocket.as_actor(MyCompletionActor)\n\n# output\n\nCompletionActorTrait{String}()\n\nSee also: AbstractActor, as_actor, CompletionActorTrait, ActorTrait, on_complete!\n\n\n\n\n\n","category":"type"},{"location":"api/actors/#Events","page":"Actors","title":"Events","text":"","category":"section"},{"location":"api/actors/","page":"Actors","title":"Actors","text":"next!\nerror!\ncomplete!","category":"page"},{"location":"api/actors/#Rocket.next!","page":"Actors","title":"Rocket.next!","text":"next!(actor, data)\nnext!(actor, data, scheduler)\n\nThis function is used to deliver a \"next\" event to an actor with some data. Takes optional scheduler object to schedule execution of data delivery.\n\nSee also: AbstractActor, on_next!\n\n\n\n\n\n","category":"function"},{"location":"api/actors/#Rocket.error!","page":"Actors","title":"Rocket.error!","text":"error!(actor, err)\nerror!(actor, err, scheduler)\n\nThis function is used to deliver a \"error\" event to an actor with some err. Takes optional scheduler object to schedule execution of error delivery.\n\nSee also: AbstractActor, on_error!\n\n\n\n\n\n","category":"function"},{"location":"api/actors/#Rocket.complete!","page":"Actors","title":"Rocket.complete!","text":"complete!(actor)\ncomplete!(actor, scheduler)\n\nThis function is used to deliver a \"complete\" event to an actor. Takes optional scheduler object to schedule execution of complete event delivery.\n\nSee also: AbstractActor, on_complete!\n\n\n\n\n\n","category":"function"},{"location":"api/actors/","page":"Actors","title":"Actors","text":"on_next!\non_error!\non_complete!","category":"page"},{"location":"api/actors/#Rocket.on_next!","page":"Actors","title":"Rocket.on_next!","text":"on_next!(actor, data)\n\nBoth Actor and NextActor objects must implement its own method for on_next! function which will be called on \"next\" event.\n\nSee also: Actor, NextActor\n\n\n\n\n\n","category":"function"},{"location":"api/actors/#Rocket.on_error!","page":"Actors","title":"Rocket.on_error!","text":"on_error!(actor, err)\n\nBoth Actor and ErrorActor objects must implement its own method for on_error! function which will be called on \"error\" event.\n\nSee also: Actor, ErrorActor\n\n\n\n\n\n","category":"function"},{"location":"api/actors/#Rocket.on_complete!","page":"Actors","title":"Rocket.on_complete!","text":"on_complete!(actor)\n\nBoth Actor and CompletionActor objects must implement its own method for on_complete! function which will be called on \"complete\" event.\n\nSee also: Actor, CompletionActor\n\n\n\n\n\n","category":"function"},{"location":"api/actors/#Factory","page":"Actors","title":"Factory","text":"","category":"section"},{"location":"api/actors/","page":"Actors","title":"Actors","text":"AbstractActorFactory\ncreate_actor\nMissingCreateActorFactoryImplementationError","category":"page"},{"location":"api/actors/#Rocket.AbstractActorFactory","page":"Actors","title":"Rocket.AbstractActorFactory","text":"Abstract type for all possible actor factories\n\nSee also: Actor\n\n\n\n\n\n","category":"type"},{"location":"api/actors/#Rocket.create_actor","page":"Actors","title":"Rocket.create_actor","text":"create_actor(::Type{L}, factory::F) where { L, F <: AbstractActorFactory }\n\nActor creator function for a given factory F. Should be implemented explicitly for any AbstractActorFactory object\n\nSee also: AbstractActorFactory, MissingCreateActorFactoryImplementationError\n\n\n\n\n\n","category":"function"},{"location":"api/actors/#Rocket.MissingCreateActorFactoryImplementationError","page":"Actors","title":"Rocket.MissingCreateActorFactoryImplementationError","text":"This error will be throw if Julia cannot find specific method of 'create_actor()' function for given actor factory\n\nSee also: AbstractActorFactory, create_actor\n\n\n\n\n\n","category":"type"},{"location":"api/actors/#Errors","page":"Actors","title":"Errors","text":"","category":"section"},{"location":"api/actors/","page":"Actors","title":"Actors","text":"InvalidActorTraitUsageError\nInconsistentSourceActorDataTypesError\nMissingDataArgumentInNextCall\nMissingErrorArgumentInErrorCall\nExtraArgumentInCompleteCall\nMissingOnNextImplementationError\nMissingOnErrorImplementationError\nMissingOnCompleteImplementationError","category":"page"},{"location":"api/actors/#Rocket.InvalidActorTraitUsageError","page":"Actors","title":"Rocket.InvalidActorTraitUsageError","text":"This error will be thrown if next!, error! or complete! functions are called with invalid actor object\n\nSee also: next!, error!, complete!, InvalidActorTrait\n\n\n\n\n\n","category":"type"},{"location":"api/actors/#Rocket.InconsistentSourceActorDataTypesError","page":"Actors","title":"Rocket.InconsistentSourceActorDataTypesError","text":"This error will be thrown if next! function is called with inconsistent data type\n\nSee also: AbstractActor, Subscribable, next!\n\n\n\n\n\n","category":"type"},{"location":"api/actors/#Rocket.MissingDataArgumentInNextCall","page":"Actors","title":"Rocket.MissingDataArgumentInNextCall","text":"This error will be thrown if next! function is called without data argument\n\nSee also: next!\n\n\n\n\n\n","category":"type"},{"location":"api/actors/#Rocket.MissingErrorArgumentInErrorCall","page":"Actors","title":"Rocket.MissingErrorArgumentInErrorCall","text":"This error will be thrown if error! function is called without err argument\n\nSee also: error!\n\n\n\n\n\n","category":"type"},{"location":"api/actors/#Rocket.ExtraArgumentInCompleteCall","page":"Actors","title":"Rocket.ExtraArgumentInCompleteCall","text":"This error will be thrown if complete! function is called with extra data/err argument\n\nSee also: complete!\n\n\n\n\n\n","category":"type"},{"location":"api/actors/#Rocket.MissingOnNextImplementationError","page":"Actors","title":"Rocket.MissingOnNextImplementationError","text":"This error will be thrown if Julia cannot find specific method of 'on_next!()' function for given actor and data\n\nSee also: on_next!\n\n\n\n\n\n","category":"type"},{"location":"api/actors/#Rocket.MissingOnErrorImplementationError","page":"Actors","title":"Rocket.MissingOnErrorImplementationError","text":"This error will be thrown if Julia cannot find specific method of 'on_error!()' function for given actor\n\nSee also: on_error!\n\n\n\n\n\n","category":"type"},{"location":"api/actors/#Rocket.MissingOnCompleteImplementationError","page":"Actors","title":"Rocket.MissingOnCompleteImplementationError","text":"This error will be thrown if Julia cannot find specific method of 'on_complete!()' function for given actor and data\n\nSee also: on_next!\n\n\n\n\n\n","category":"type"},{"location":"observables/types/array/#observable_array","page":"Array","title":"Array Observable","text":"","category":"section"},{"location":"observables/types/array/","page":"Array","title":"Array","text":"from","category":"page"},{"location":"observables/types/array/#Rocket.from","page":"Array","title":"Rocket.from","text":"from(x; scheduler::H = AsapScheduler()) where { H <: AbstractScheduler }\nfrom(a::Vector{D}; scheduler::H = AsapScheduler()) where { D, H <: AbstractScheduler }\n\nCreation operator for the ArrayObservable that emits either a single value if x has a Scalar trait specification or a collection of values if x has a NonScalar trait specification. Throws an ErrorException if x has UndefinedScalarness trait type. To specify scalarness for arbitrary type T some can implement an additional method for scalarness(::Type{<:MyType}) function and to specify scalarness behavior. Optionally accepts custom scheduler-like object to schedule messages delivery.\n\nArguments\n\nx: an object to be wrapped into array of values\nscheduler: optional, scheduler-like object\n\nFor an object x to be a valid input for a from operator it must implement Rocket.scalarness(::Type{ <: T }) method which should return either Rocket.Scalar or Rocket.NonScalar objects. In first case from operator will treat x as a single scalar value and will wrap it into a vector while in the second case from operator will convert x object into an array using collect function.\n\nFor arbitrary iterable objects consider using iterable creation operator.\n\nNote\n\nfrom operators creates a copy of x using collect on a given object.\n\nExamples\n\nusing Rocket\n\nsource = from([ 0, 1, 2 ])\nsubscribe!(source, logger())\n;\n\n# output\n\n[LogActor] Data: 0\n[LogActor] Data: 1\n[LogActor] Data: 2\n[LogActor] Completed\n\n\nusing Rocket\n\nsource = from(( 0, 1, 2 ))\nsubscribe!(source, logger())\n;\n\n# output\n\n[LogActor] Data: 0\n[LogActor] Data: 1\n[LogActor] Data: 2\n[LogActor] Completed\n\n\nusing Rocket\n\nsource = from(0)\nsubscribe!(source, logger())\n;\n\n# output\n\n[LogActor] Data: 0\n[LogActor] Completed\n\n\nusing Rocket\n\nsource = from(\"Hello, world!\")\nsubscribe!(source, logger())\n;\n\n# output\n\n[LogActor] Data: H\n[LogActor] Data: e\n[LogActor] Data: l\n[LogActor] Data: l\n[LogActor] Data: o\n[LogActor] Data: ,\n[LogActor] Data:\n[LogActor] Data: w\n[LogActor] Data: o\n[LogActor] Data: r\n[LogActor] Data: l\n[LogActor] Data: d\n[LogActor] Data: !\n[LogActor] Completed\n\n\nSee also: ArrayObservable, subscribe!, logger, iterable\n\n\n\n\n\n","category":"function"},{"location":"observables/types/array/","page":"Array","title":"Array","text":"ArrayObservable","category":"page"},{"location":"observables/types/array/#Rocket.ArrayObservable","page":"Array","title":"Rocket.ArrayObservable","text":"ArrayObservable{D, H}(values::Vector{D}, scheduler::H) where { D, H }\n\nArrayObservable wraps a regular Julia array into an observable. Uses scheduler object to schedule messages delivery.\n\nConstructor arguments\n\nvalues: array of values to be wrapped\nscheduler: Scheduler-like object\n\nSee also: Subscribable, from\n\n\n\n\n\n","category":"type"},{"location":"api/teardown/#teardown_api","page":"Teardown","title":"Teardown API","text":"","category":"section"},{"location":"api/teardown/","page":"Teardown","title":"Teardown","text":"Any subscription-like object should implement a valid teardown logic.","category":"page"},{"location":"api/teardown/#Example","page":"Teardown","title":"Example","text":"","category":"section"},{"location":"api/teardown/","page":"Teardown","title":"Teardown","text":"using Rocket\n\nstruct MuCustomSubscription <: Teardown\n # some fields here\nend\n\nRocket.as_teardown(::Type{<:MuCustomSubscription}) = UnsubscribableTeardownLogic()\n\nfunction on_unsubscribe!(subscription::MyCustomSubscription)\n # dispose resources here\nend","category":"page"},{"location":"api/teardown/#Traits","page":"Teardown","title":"Traits","text":"","category":"section"},{"location":"api/teardown/","page":"Teardown","title":"Teardown","text":"TeardownLogic\nas_teardown\nUnsubscribableTeardownLogic\non_unsubscribe!\nCallableTeardownLogic\nVoidTeardownLogic\nInvalidTeardownLogic","category":"page"},{"location":"api/teardown/#Rocket.TeardownLogic","page":"Teardown","title":"Rocket.TeardownLogic","text":"Abstract type for all possible teardown logic traits.\n\nSee also: UnsubscribableTeardownLogic, CallableTeardownLogic, VoidTeardownLogic, InvalidTeardownLogic\n\n\n\n\n\n","category":"type"},{"location":"api/teardown/#Rocket.as_teardown","page":"Teardown","title":"Rocket.as_teardown","text":"as_teardown(::Type)\n\nThis function checks teardown trait behavior specification. Should be used explicitly to specify teardown logic trait behavior for any object.\n\nExamples\n\nusing Rocket\n\nstruct MySubscription <: Teardown end\n\nRocket.as_teardown(::Type{<:MySubscription}) = UnsubscribableTeardownLogic()\nRocket.on_unsubscribe!(s::MySubscription) = println(\"Unsubscribed!\")\n\nsubscription = MySubscription()\nunsubscribe!(subscription)\n;\n\n# output\n\nUnsubscribed!\n\nSee also: Teardown, TeardownLogic\n\n\n\n\n\n","category":"function"},{"location":"api/teardown/#Rocket.UnsubscribableTeardownLogic","page":"Teardown","title":"Rocket.UnsubscribableTeardownLogic","text":"Unsubscribable teardown logic trait behavior. Unsubscribable teardown object must define its own method for on_unsubscribe!() function which will be invoked when actor decides to unsubscribe! from Observable.\n\nSee also: TeardownLogic, on_unsubscribe!, unsubscribe!\n\n\n\n\n\n","category":"type"},{"location":"api/teardown/#Rocket.on_unsubscribe!","page":"Teardown","title":"Rocket.on_unsubscribe!","text":"on_unsubscribe!(teardown)\n\nEach valid teardown object with UnsubscribableTeardownLogic trait behavior must implement its own method for on_unsubscribe!() function which will be invoked when actor decides to unsubscribe! from Observable.\n\nSee also: Teardown, TeardownLogic, UnsubscribableTeardownLogic\n\n\n\n\n\n","category":"function"},{"location":"api/teardown/#Rocket.CallableTeardownLogic","page":"Teardown","title":"Rocket.CallableTeardownLogic","text":"Callable teardown logic trait behavior. Callable teardown object must be callable (insert meme with a surprised Pikachu here).\n\nSee also: TeardownLogic, on_unsubscribe!, unsubscribe!\n\n\n\n\n\n","category":"type"},{"location":"api/teardown/#Rocket.VoidTeardownLogic","page":"Teardown","title":"Rocket.VoidTeardownLogic","text":"Void teardown logic trait behavior. Void teardown object does nothing in unsubscribe! and may not define any additional methods.\n\nSee also: TeardownLogic, on_unsubscribe!, unsubscribe!\n\n\n\n\n\n","category":"type"},{"location":"api/teardown/#Rocket.InvalidTeardownLogic","page":"Teardown","title":"Rocket.InvalidTeardownLogic","text":"Default teardown logic trait behavour. Invalid teardwon object cannot be used in unsubscribe! function. Doing so will raise an error.\n\nSee also: TeardownLogic, on_unsubscribe!, unsubscribe!\n\n\n\n\n\n","category":"type"},{"location":"api/teardown/#Types","page":"Teardown","title":"Types","text":"","category":"section"},{"location":"api/teardown/","page":"Teardown","title":"Teardown","text":"Teardown\nunsubscribe!","category":"page"},{"location":"api/teardown/#Rocket.Teardown","page":"Teardown","title":"Rocket.Teardown","text":"Abstract type for any teardown object. Each teardown object must be a subtype of Teardown.\n\nSee also: TeardownLogic\n\n\n\n\n\n","category":"type"},{"location":"api/teardown/#Rocket.unsubscribe!","page":"Teardown","title":"Rocket.unsubscribe!","text":"unsubscribe!(subscription)\nunsubscribe!(subscriptions::Tuple)\nunsubscribe!(subscriptions::AbstractVector)\n\nunsubscribe! function is used to cancel Observable execution and to dispose any kind of resources used during an Observable execution. If the input argument to the unsubscribe! function is either a tuple or a vector, it will first check that all of the arguments are valid subscription objects and if its true will unsubscribe from each of them individually. \n\nSee also: Teardown, TeardownLogic, on_unsubscribe!\n\n\n\n\n\n","category":"function"},{"location":"api/teardown/#Errors","page":"Teardown","title":"Errors","text":"","category":"section"},{"location":"api/teardown/","page":"Teardown","title":"Teardown","text":"InvalidTeardownLogicTraitUsageError\nInvalidMultipleTeardownLogicTraitUsageError\nMissingOnUnsubscribeImplementationError","category":"page"},{"location":"api/teardown/#Rocket.InvalidTeardownLogicTraitUsageError","page":"Teardown","title":"Rocket.InvalidTeardownLogicTraitUsageError","text":"This error will be thrown if unsubscribe! function is called with invalid teardown object.\n\nSee also: unsubscribe!\n\n\n\n\n\n","category":"type"},{"location":"api/teardown/#Rocket.InvalidMultipleTeardownLogicTraitUsageError","page":"Teardown","title":"Rocket.InvalidMultipleTeardownLogicTraitUsageError","text":"This error will be thrown if unsubscribe! function is called with a tuple with invalid teardown object in it.\n\nSee also: unsubscribe!\n\n\n\n\n\n","category":"type"},{"location":"api/teardown/#Rocket.MissingOnUnsubscribeImplementationError","page":"Teardown","title":"Rocket.MissingOnUnsubscribeImplementationError","text":"This error will be thrown if Julia cannot find specific method of on_unsubscribe!() function for given teardown object.\n\nSee also: on_unsubscribe!\n\n\n\n\n\n","category":"type"},{"location":"operators/transformation/accumulated/#operator_accumulated","page":"accumulated","title":"Accumulated Operator","text":"","category":"section"},{"location":"operators/transformation/accumulated/","page":"accumulated","title":"accumulated","text":"accumulated","category":"page"},{"location":"operators/transformation/accumulated/#Rocket.accumulated","page":"accumulated","title":"Rocket.accumulated","text":"accumulated()\n\nCreates an accumulated operator, which returns an Observable that emits the current item with all of the previous items emitted by the source Observable in one single ordered array.\n\nProducing\n\nStream of type <: Subscribable{Vector{L}} where L refers to type of source stream\n\nExamples\n\nusing Rocket\n\nsource = from([ 1, 2, 3 ])\nsubscribe!(source |> accumulated(), logger())\n;\n\n# output\n\n[LogActor] Data: [1]\n[LogActor] Data: [1, 2]\n[LogActor] Data: [1, 2, 3]\n[LogActor] Completed\n\n\nusing Rocket\n\nsource = of(1)\nsubscribe!(source |> accumulated(), logger())\n;\n\n# output\n\n[LogActor] Data: [1]\n[LogActor] Completed\n\nSee also: AbstractOperator, InferableOperator, ProxyObservable, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/transformation/accumulated/#Description","page":"accumulated","title":"Description","text":"","category":"section"},{"location":"operators/transformation/accumulated/","page":"accumulated","title":"accumulated","text":"Combines all values emitted by the source, using an accumulator function that joins a new source value with the all past values emmited into one single array. This is similar to scan with vcat accumulation function.","category":"page"},{"location":"operators/transformation/accumulated/#See-also","page":"accumulated","title":"See also","text":"","category":"section"},{"location":"operators/transformation/accumulated/","page":"accumulated","title":"accumulated","text":"Operators","category":"page"},{"location":"operators/mathematical/max/#operator_max","page":"max","title":"Max Operator","text":"","category":"section"},{"location":"operators/mathematical/max/","page":"max","title":"max","text":"max","category":"page"},{"location":"operators/mathematical/max/#Base.max","page":"max","title":"Base.max","text":"max(; from = nothing)\n\nCreates a max operator, which emits a single item: the item with the largest value.\n\nArguments\n\nfrom: optional initial maximum value, if nothing first item from the source will be used as initial instead\n\nProducing\n\nStream of type <: Subscribable{Union{L, Nothing}} where L refers to type of source stream\n\nExamples\n\nusing Rocket\n\nsource = from([ i for i in 1:42 ])\nsubscribe!(source |> max(), logger())\n;\n\n# output\n\n[LogActor] Data: 42\n[LogActor] Completed\n\n\nSee also: AbstractOperator, InferableOperator, ProxyObservable, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/mathematical/max/#Description","page":"max","title":"Description","text":"","category":"section"},{"location":"operators/mathematical/max/","page":"max","title":"max","text":"The max operator operates on an Observable of similar objects. When the source Observable completes, it emits the item with the largest value.","category":"page"},{"location":"operators/mathematical/max/#See-also","page":"max","title":"See also","text":"","category":"section"},{"location":"operators/mathematical/max/","page":"max","title":"max","text":"Operators","category":"page"},{"location":"operators/errors/catch_error/#operator_catch_error","page":"catch_error","title":"Catch Error Operator","text":"","category":"section"},{"location":"operators/errors/catch_error/","page":"catch_error","title":"catch_error","text":"catch_error","category":"page"},{"location":"operators/errors/catch_error/#Rocket.catch_error","page":"catch_error","title":"Rocket.catch_error","text":"catch_error(selectorFn::F) where F\n\nCreates a CatchErrorOperator, which catches errors on the observable to be handled by returning a new observable or throwing an error.\n\nArguments:\n\nselectorFn::F: a callable object that takes as arguments err, which is the error, and caught, which is the source observable, in case you'd like to \"retry\" that observable by returning it again. Whatever observable is returned by the selector will be used to continue the observable chain.\n\nProducing\n\nStream of type <: Subscribable{L} where L refers to type of source stream\n\nExamples\n\nusing Rocket\n\nsource = from(1:5) |> safe() |> map(Int, (d) -> d == 4 ? error(4) : d) |> catch_error((err, obs) -> of(1))\n\nsubscribe!(source, logger())\n;\n\n# output\n[LogActor] Data: 1\n[LogActor] Data: 2\n[LogActor] Data: 3\n[LogActor] Data: 1\n[LogActor] Completed\n\nSee also: AbstractOperator, InferableOperator, rerun, logger, safe\n\n\n\n\n\n","category":"function"},{"location":"operators/errors/catch_error/#See-also","page":"catch_error","title":"See also","text":"","category":"section"},{"location":"operators/errors/catch_error/","page":"catch_error","title":"catch_error","text":"Operators","category":"page"},{"location":"operators/about/#section_operators","page":"Operator","title":"Operators","text":"","category":"section"},{"location":"operators/about/","page":"Operator","title":"Operator","text":"Even though the Observable is the foundation, reactive extensions is mostly useful because of its operators. Operators are the essential pieces that allow complex asynchronous code to be easily composed in a declarative manner.","category":"page"},{"location":"operators/about/#what_are_operators","page":"Operator","title":"What are operators?","text":"","category":"section"},{"location":"operators/about/","page":"Operator","title":"Operator","text":"There are two kinds of operators:","category":"page"},{"location":"operators/about/#Pipeable-operators","page":"Operator","title":"Pipeable operators","text":"","category":"section"},{"location":"operators/about/","page":"Operator","title":"Operator","text":"Pipeable Operators are the kind that can be piped to Observables using the syntax source |> operator(). These include the filter() and map() operators. When called, operators do not change the existing Observable instance. Instead, they return a new Observable, whose subscription logic is based on the first Observable.","category":"page"},{"location":"operators/about/","page":"Operator","title":"Operator","text":"note: Note\nA Pipeable Operator is a function that takes an Observable as its input and returns another Observable. It is a pure operation: the previous Observable remains unmodified.","category":"page"},{"location":"operators/about/","page":"Operator","title":"Operator","text":"A Pipeable Operator is essentially a pure callable object that accepts one Observable as input and returns another Observable as output. Subscribing to the output Observable will also subscribe to the input Observable.","category":"page"},{"location":"operators/about/","page":"Operator","title":"Operator","text":"For example, the operator called map() is analogous to the Array method of the same name. Just like the array method map((d) -> d ^ 2, [ 1, 2, 3 ]) yields [ 1, 4, 9 ], the Observable emits 1, 4, 9:","category":"page"},{"location":"operators/about/","page":"Operator","title":"Operator","text":"source = from([ 1, 2, 3 ])\nsubscribe!(source |> map(Int, (d) -> d ^ 2), lambda(\n on_next = (d) -> println(d)\n))\n\n// Logs:\n// 1\n// 4\n// 9","category":"page"},{"location":"operators/about/","page":"Operator","title":"Operator","text":"Another useful operator is first():","category":"page"},{"location":"operators/about/","page":"Operator","title":"Operator","text":"source = from([ 1, 2, 3 ])\nsubscribe!(source |> first(), lambda(\n on_next = (d) -> println(d),\n on_complete = () -> \"Completed\"\n))\n\n// Logs:\n// 1\n// Completed","category":"page"},{"location":"operators/about/#Creation-operators","page":"Operator","title":"Creation operators","text":"","category":"section"},{"location":"operators/about/","page":"Operator","title":"Operator","text":"Distinct from pipeable operators, creation operators are functions that can be used to create an Observable with some common predefined behavior or by joining other Observables. For example: from([ 1, 2, 3 ]) creates an observable that will sequentially emit 1, 2, and 3.","category":"page"},{"location":"operators/about/","page":"Operator","title":"Operator","text":"source = from([ 1, 2, 3 ])\nsubscribe!(source, lambda(\n on_next = (d) -> println(\"Value: $d\"),\n on_error = (e) -> println(\"Oh no, error: $e\")\n on_complete = () -> println(\"Completed\")\n))\n\n// Logs:\n// Value: 1\n// Value: 2\n// Value: 3\n// Completed","category":"page"},{"location":"operators/about/#Operators-piping","page":"Operator","title":"Operators piping","text":"","category":"section"},{"location":"operators/about/","page":"Operator","title":"Operator","text":"Pipeable operators are special objects that can be used like ordinary functions with on_call!(operator, source). In practice however they tend to accumulate and quickly grow unreadable: on_call!(operator1, on_call!(operator2, on_call!(operator3, source))). Therefore, Rocket.jl overloads |> for operators and Observables:","category":"page"},{"location":"operators/about/","page":"Operator","title":"Operator","text":"using Rocket\n\nsource = from(1:100) |> filter((d) -> d % 2 === 0) |> map(Int, (d) -> d ^ 2) |> sum()\n\nsubscribe!(source, logger())\n\n// Logs\n// [LogActor] Data: 171700\n// [LogActor] Completed","category":"page"},{"location":"operators/about/","page":"Operator","title":"Operator","text":"It is also possible to create an operator composition with + or |>. It might be useful to create an alias for some often used operator chain","category":"page"},{"location":"operators/about/","page":"Operator","title":"Operator","text":"using Rocket\n\nmapAndFilter = map(Int, d -> d ^ 2) + filter(d -> d % 2 == 0) \n\nsource = from(1:5) |> mapAndFilter\n\nsubscribe!(source, logger())\n\n// Logs\n// [LogActor] Data: 4\n// [LogActor] Data: 16\n// [LogActor] Completed\n\nmapAndFilterAndSum = mapAndFilter + sum()\n\nsource = from(1:5) |> mapAndFilterAndSum\n\nsubscribe!(source, logger())\n\n// Logs\n// [LogActor] Data: 20\n// [LogActor] Completed","category":"page"},{"location":"operators/about/","page":"Operator","title":"Operator","text":"For stylistic reasons, on_call!(operator, source) is never used in practice - even if there is only one operator. Instead, source |> operator() is generally preferred.","category":"page"},{"location":"observables/types/iterable/#observable_iterable","page":"Iterable","title":"Iterable Observable","text":"","category":"section"},{"location":"observables/types/iterable/","page":"Iterable","title":"Iterable","text":"iterable","category":"page"},{"location":"observables/types/iterable/#Rocket.iterable","page":"Iterable","title":"Rocket.iterable","text":"iterable(iterator; scheduler::H = AsapScheduler()) where { H <: AbstractScheduler }\n\nCreation operator for the IterableObservable that wraps given iterator into an observable object.\n\nArguments\n\niterator: an iterator object to be wrapped an observable\nscheduler: optional, scheduler-like object\n\nNote\n\niterable operators does not create a copy of iterator. Any changes in the iterator object might be visible in the created observable. For side-effects free behavior consider using from creation operator which creates a copy of a given object with a collect function.\n\nExamples\n\nusing Rocket\n\nsource = iterable([ 0, 1, 2 ])\nsubscribe!(source, logger())\n;\n\n# output\n\n[LogActor] Data: 0\n[LogActor] Data: 1\n[LogActor] Data: 2\n[LogActor] Completed\n\nusing Rocket\n\nsource = iterable(\"Hello\")\nsubscribe!(source, logger())\n;\n\n# output\n\n[LogActor] Data: H\n[LogActor] Data: e\n[LogActor] Data: l\n[LogActor] Data: l\n[LogActor] Data: o\n[LogActor] Completed\n\nSee also: ScheduledSubscribable, subscribe!, from\n\n\n\n\n\n","category":"function"},{"location":"observables/types/generate/#observable_generate","page":"Generate","title":"Generate Observable","text":"","category":"section"},{"location":"observables/types/generate/","page":"Generate","title":"Generate","text":"generate","category":"page"},{"location":"observables/types/generate/#Rocket.generate","page":"Generate","title":"Rocket.generate","text":"generate(initial::D, condition::C, iterator::I; scheduler::H = AsapScheduler()) where { D, C, I, H <: AbstractScheduler }\n\nGenerates an observable sequence by running a state-driven loop producing the sequence's elements, using the specified scheduler to send out observer messages.\n\nArguments\n\ninitial: initial state\ncondition: condition to terminate generation (upon returning false)\niterator: iteration step function\nscheduler: optional, scheduler-like object\n\nNote\n\niterator object should return objects of the same type as initial.\n\nExamples\n\nusing Rocket\n\nsource = generate(1, x -> x < 3, x -> x + 1)\nsubscribe!(source, logger())\n;\n\n# output\n[LogActor] Data: 1\n[LogActor] Data: 2\n[LogActor] Completed\n\nSee also: ScheduledSubscribable, subscribe!\n\n\n\n\n\n","category":"function"},{"location":"operators/filtering/ignore/#operator_ignore","page":"ignore","title":"Ignore operator","text":"","category":"section"},{"location":"operators/filtering/ignore/","page":"ignore","title":"ignore","text":"ignore","category":"page"},{"location":"operators/filtering/ignore/#Rocket.ignore","page":"ignore","title":"Rocket.ignore","text":"ignore(count::Int)\n\nCreates a ignore operator, which returns an Observable that skips the first count items emitted by the source Observable.\n\nArguments\n\ncount::Int: the number of times, items emitted by source Observable should be skipped.\n\nProducing\n\nStream of type <: Subscribable{L} where L refers to type of source stream\n\nExamples\n\nusing Rocket\n\nsource = from(1:5)\n\nsubscribe!(source |> ignore(2), logger())\n;\n\n# output\n\n[LogActor] Data: 3\n[LogActor] Data: 4\n[LogActor] Data: 5\n[LogActor] Completed\n\nSee also: AbstractOperator, InferableOperator, ProxyObservable, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/filtering/ignore/#See-also","page":"ignore","title":"See also","text":"","category":"section"},{"location":"operators/filtering/ignore/","page":"ignore","title":"ignore","text":"Operators","category":"page"},{"location":"subjects/types/replay/#subject_replay","page":"Replay","title":"ReplaySubject","text":"","category":"section"},{"location":"subjects/types/replay/","page":"Replay","title":"Replay","text":"ReplaySubject\nReplaySubjectFactory","category":"page"},{"location":"subjects/types/replay/#Rocket.ReplaySubject","page":"Replay","title":"Rocket.ReplaySubject","text":"ReplaySubject(::Type{D}, size::Int) where D\nReplaySubject(::Type{D}, size::Int, factory::F) where { D, F <: AbstractSubjectFactory }\nReplaySubject(::Type{D}, size::Int, subject::S) where { D, S }\n\nA variant of Subject that \"replays\" or emits old values to new subscribers. It buffers a set number of values and will emit those values immediately to any new subscribers in addition to emitting new values to existing subscribers.\n\nSee also: ReplaySubjectFactory, Subject, SubjectFactory\n\n\n\n\n\n","category":"function"},{"location":"subjects/types/replay/#Rocket.ReplaySubjectFactory","page":"Replay","title":"Rocket.ReplaySubjectFactory","text":"ReplaySubjectFactory(size::Int, factory::F) where { F <: AbstractSubjectFactory }\nReplaySubjectFactory(size::Int; scheduler::H = AsapScheduler()) where { H <: AbstractScheduler }\n\nA variant of SubjectFactory that creates an instance of ReplaySubject.\n\nSee also: SubjectFactory, AbstractSubjectFactory, ReplaySubject, Subject\n\n\n\n\n\n","category":"function"},{"location":"subjects/types/replay/#Description","page":"Replay","title":"Description","text":"","category":"section"},{"location":"subjects/types/replay/","page":"Replay","title":"Replay","text":"A ReplaySubject is similar to a BehaviorSubject in that it can send old values to new subscribers, but it can also record a part of the Observable execution.","category":"page"},{"location":"subjects/types/replay/","page":"Replay","title":"Replay","text":"note: Note\nA ReplaySubject records multiple values from the Observable execution and replays them to new subscribers.","category":"page"},{"location":"subjects/types/replay/#Examples","page":"Replay","title":"Examples","text":"","category":"section"},{"location":"subjects/types/replay/","page":"Replay","title":"Replay","text":"When creating a ReplaySubject, you can specify how many values to replay:","category":"page"},{"location":"subjects/types/replay/","page":"Replay","title":"Replay","text":"using Rocket\n\nsubject = ReplaySubject(Int, 3) # buffer 3 values for new subscribers\n\nsubscription1 = subscribe!(subject, logger(\"1\"))\n\nnext!(subject, 1)\nnext!(subject, 2)\nnext!(subject, 3)\nnext!(subject, 4)\n\nsubscription2 = subscribe!(subject, logger(\"2\"))\n\nnext!(subject, 5)\n\nunsubscribe!(subscription1)\nunsubscribe!(subscription2)\n\n// Logs\n// [1] Data: 1\n// [1] Data: 2\n// [1] Data: 3\n// [1] Data: 4\n// [2] Data: 2\n// [2] Data: 3\n// [2] Data: 4\n// [1] Data: 5\n// [2] Data: 5","category":"page"},{"location":"observables/about/#section_observables","page":"Observable","title":"Observables","text":"","category":"section"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"Observables are lazy Push collections of multiple values. They fill the missing spot in the following table:","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"Type Single Mutliple\nPull Function Iterator\nPush Promise Observable","category":"page"},{"location":"observables/about/#First-example","page":"Observable","title":"First example","text":"","category":"section"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"For example, the following code specifies an Observable that pushes the values 1, 2, 3 immediately (synchronously) when subscribed to, and the value 4 after one second has passed since subscription.","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"using Rocket\n\nsource = make(Int) do actor\n next!(actor, 1)\n next!(actor, 2)\n next!(actor, 3)\n setTimeout(1000) do\n next!(actor, 4)\n complete!(actor)\n end\nend","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"To invoke the Observable and inspect these values, we need to subscribe to it. It is important to note that observables are lazy collections which means they don't emit anything until someone subscribes to it. Every subscription spawns its own independent execution of observable. There are some exceptions to this rule, e.g. Subjects and some operators (share(), etc..) which may change this behaviour","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"using Rocket\n\nsource = make(Int) do actor\n next!(actor, 1)\n next!(actor, 2)\n next!(actor, 3)\n setTimeout(1000) do\n next!(actor, 4)\n complete!(actor)\n end\nend\n\nprintln(\"Just before subscribe\")\nsubscribe!(source, lambda(\n on_next = (d) -> println(d),\n on_complete = () -> println(\"Completed\")\n))\nprintln(\"Just after subscribe\")\n\n# Logs\n# Just before subscribe\n# 1\n# 2\n# 3\n# Just after subscribe\n# 4\n# Completed","category":"page"},{"location":"observables/about/#Pull-vs-Push","page":"Observable","title":"Pull vs Push","text":"","category":"section"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"Pull and Push are two different protocols that describe how a data Producer communicates with a data Consumer.","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"In a Pull system, the Consumer determines when it receives data from the Producer. The Producer itself is unaware of when the data are delivered to the Consumer.","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"Every Julia Function is a Pull system. The function is a Producer of data, and the code that calls the function is consuming data by \"pulling\" a return value from the call.","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"Type PRODUCER CONSUMER\nPull Passive: produces data when requested. Active: decides when data is requested.\nPush Active: produces data at its own pace. Passive: reacts to received data.","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"In Push systems, the Producer determines when to send data to the Consumer. The Consumer is unaware of when it will receive that data.","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"Futures and promises are the most common type of Push systems today. A Promise (the Producer) delivers a resolved value to registered callbacks (the Consumers). Unlike functions, it is the Promise that determines precisely when a value is \"pushed\" to the callbacks.","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"Rocket.jl introduces Observables, a new Push system for Julia. An Observable is a Producer of multiple values, \"pushing\" them to Observers (Consumers or Actors).","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"A Function is a lazily evaluated computation that synchronously returns a single value on invocation.\nA Generator is a lazily evaluated computation that synchronously returns zero to (potentially) infinite values on iteration.\nA Promise is a computation that may (or may not) eventually return a single value.\nAn Observable is a lazily evaluated computation that can synchronously or asynchronously return zero to (potentially) infinite values from the time it's invoked.","category":"page"},{"location":"observables/about/#Observables-as-generalizations-of-functions","page":"Observable","title":"Observables as generalizations of functions","text":"","category":"section"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"In contrast to functions, Observables can \"return\" multiple values over time. For example, functions can't do this:","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"function foo()\n println(\"Hello!\")\n return 0\n return 1 # Dead code, will never happen\nend","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"Observables, however, can do this:","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"using Rocket\n\nfoo = make(Int) do actor\n next!(actor, 0)\n next!(actor, 1)\n complete!(actor)\nend\n","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"Observables can also \"return\" values asynchronously after some time:","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"using Rocket\n\nfoo = make(Int) do actor\n setTimeout(1000) do\n next!(actor, 0)\n complete!(actor)\n end\nend","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"Assume we have a function foo and some observable:","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"Function call foo(args...) means \"give me one value synchronously\" (push strategy)\nIn contrast subscription to an observable with subscribe(observable, ...) means \"notify me about any amount of values, either synchronously or asynchronously\" (pull strategy)","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"When a new value is available in an observable we say that the observable emits or generates an update. Values that are generated by an observable are sometimes also called future values, because there is no principled way to predict when an observable will generate a new value. In some programming languages, observables are referred to as generators or streams and we will use all three terms interchangeably.","category":"page"},{"location":"observables/about/#Anatomy-of-an-Observable","page":"Observable","title":"Anatomy of an Observable","text":"","category":"section"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"Observables are (1) created using creation operators (it is also possible to build an Observable from scratch with custom logic); (2) subscribed to with an Actor; (3) execute to deliver next! / error! / complete! notifications to the Actor, and (4) their execution may be disposed. These four aspects are all encoded in an Observable instance, but some of these aspects are related to other types, such as Subscribable and Subscription.","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"The core responsibilities of an Observable are:","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"Creating Observables\nSubscribing to Observables\nExecuting the Observable\nDisposing Observables","category":"page"},{"location":"observables/about/#Creating-Observables","page":"Observable","title":"Creating Observables","text":"","category":"section"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"You can create an Observable in various ways using Creation operators. You can also build an Observable from scratch. To see how you can build an Observable with custom logic, consult the API Section.","category":"page"},{"location":"observables/about/#Subscribing-to-Observables","page":"Observable","title":"Subscribing to Observables","text":"","category":"section"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"The Observable source in the example can be subscribed to.","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"using Rocket\n\nsubscribe!(source, lambda(\n on_next = (d) -> println(d)\n))","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"This example shows how subscribe calls are not shared among multiple Actors of the same Observable. When calling subscribe! with an Actor, the function on_subscribe! that is attached to this particular Observable is executed for that given actor. Each call to subscribe! triggers its own independent setup for that given actor.","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"note: Note\nSubscribing to an Observable is like calling a function, providing callbacks where the data will be delivered to.","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"subscribe! function also supports multiple subscriptions at once. If the input argument to the subscribe! function is a tuple or a vector, it will first check that all of the arguments are valid source objects and actors and if its true will subscribe from each of them individually.","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"\nsource1 = Subject(Int)\nsource2 = Subject(Int)\n\nsubscriptions = subscribe!([\n (source1, logger()),\n (source2, logger()),\n])\n\n# Later on\n# unsubscribe!(subscriptions)\n","category":"page"},{"location":"observables/about/#Executing-Observables","page":"Observable","title":"Executing Observables","text":"","category":"section"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"The execution produces multiple values over time, either synchronously or asynchronously.","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"An Observable Execution can deliver three types of notifications:","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"Next: sends a value, such as an Int, String, Dict, etc.;\nError: sends any error as a value;\nComplete: does not send a value.","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"\"Next\" notifications are the most important and most common type: they represent actual data being delivered to an subscriber. \"Error\" and \"Complete\" notifications terminate the Observable Execution.","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"note: Note\nIn an Observable Execution, any number of Next notifications may be delivered. However, once a single Error or Complete notification is delivered, nothing else can be delivered afterwards.","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"The following is an example of an Observable execution that delivers three Next notifications and subsequently completes:","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"using Rocket\n\nsource = make(Int) do actor\n next!(actor, 1)\n next!(actor, 2)\n next!(actor, 3)\n complete!(actor)\nend\n\n# or the same with creation operator\n\nsource = from([ 1, 2, 3 ])","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"It is advised to wrap any code in subscribe by a try/catch block that delivers an Error notification upon an exception:","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"using Rocket\n\nsource = make(Int) do actor\n try\n next!(actor, 1)\n next!(actor, 2)\n next!(actor, 3)\n complete!(actor)\n catch e\n error!(actor, e)\n end\nend\n","category":"page"},{"location":"observables/about/#Disposing-Observable-Executions","page":"Observable","title":"Disposing Observable Executions","text":"","category":"section"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"It is common for an Actor to abort execution of an Observable Execution. Once the Actor is done receiving values, it may stop the execution in order to free computation power or memory resources.","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"When subscribe! is called, the Actor gets attached to the newly created Observable execution. This call also returns an object, the Subscription:","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"subscription = subscribe!(source, actor)","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"The Subscription represents the ongoing execution, and has a minimal API that allows you to cancel the execution. Read more about Subscription type here.","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"With","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"unsubscribe!(subscription)","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"you can cancel the ongoing execution.","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"note: Note\nsubscribe! returns a Subscription that represents the ongoing execution. Simply call unsubscribe! on the Subscription to cancel the execution.","category":"page"},{"location":"actors/types/circularkeep/#actor_circularkeep","page":"CircularKeep","title":"CircularKeep actor","text":"","category":"section"},{"location":"actors/types/circularkeep/","page":"CircularKeep","title":"CircularKeep","text":"circularkeep","category":"page"},{"location":"actors/types/circularkeep/#Rocket.circularkeep","page":"CircularKeep","title":"Rocket.circularkeep","text":"circularkeep(::Type{T}, capacity::Int) where T\n\nArguments\n\n::Type{T}: Type of keep data\ncapacity::Int: circular buffer capacity\n\nCreation operator for the CircularKeepActor actor.\n\nExamples\n\nusing Rocket\n\nactor = circularkeep(Int, 3)\nactor isa CircularKeepActor{Int}\n\n# output\ntrue\n\nSee also: CircularKeepActor, AbstractActor\n\n\n\n\n\n","category":"function"},{"location":"actors/types/circularkeep/","page":"CircularKeep","title":"CircularKeep","text":"CircularKeepActor","category":"page"},{"location":"actors/types/circularkeep/#Rocket.CircularKeepActor","page":"CircularKeep","title":"Rocket.CircularKeepActor","text":"CirucalKeepActor{D}() where D\n\nCircual keep actor is similar to keep actor, but uses CircularBuffer as a storage. It saves all incoming successful next events in a values circular buffer, throws an ErrorException on error! event and does nothing on completion event.\n\nExamples\n\nusing Rocket\n\nsource = from(1:5)\nactor = circularkeep(Int, 3)\n\nsubscribe!(source, actor)\nshow(getvalues(actor))\n\n# output\n[3, 4, 5]\n\nSee also: Actor, keep, circularkeep\n\n\n\n\n\n","category":"type"},{"location":"operators/utility/default_if_empty/#operator_ref_default_if_empty","page":"default_if_empty","title":"DefaultIfEmpty Operator","text":"","category":"section"},{"location":"operators/utility/default_if_empty/","page":"default_if_empty","title":"default_if_empty","text":"default_if_empty","category":"page"},{"location":"operators/utility/default_if_empty/#Rocket.default_if_empty","page":"default_if_empty","title":"Rocket.default_if_empty","text":"default_if_empty(value::T)\ndefault_if_empty(callback::Function)\n\nCreates a default_if_empty operator, which emits a given value if the source Observable completes without emitting any next value, otherwise mirrors the source Observable. Optionally accepts a zero-argument callback that will be executed to generate default value. Note: Callback function's output is always converted to the eltype of the original observable.\n\nusing Rocket\n\nsource = completed(Int) |> default_if_empty(0)\n\nsubscribe!(source, logger())\n;\n\n# output\n[LogActor] Data: 0\n[LogActor] Completed\n\nusing Rocket\n\nsource = completed(Int) |> default_if_empty(() -> 42)\n\nsubscribe!(source, logger())\n;\n\n# output\n[LogActor] Data: 42\n[LogActor] Completed\n\nSee also: AbstractOperator, InferableOperator, logger, map\n\n\n\n\n\n","category":"function"},{"location":"operators/utility/default_if_empty/#Description","page":"default_if_empty","title":"Description","text":"","category":"section"},{"location":"operators/utility/default_if_empty/","page":"default_if_empty","title":"default_if_empty","text":"default_if_empty emits the values emitted by the source Observable or a specified default value if the source Observable is empty (completes without having emitted any next value).","category":"page"},{"location":"operators/utility/default_if_empty/#See-also","page":"default_if_empty","title":"See also","text":"","category":"section"},{"location":"operators/utility/default_if_empty/","page":"default_if_empty","title":"default_if_empty","text":"Operators","category":"page"},{"location":"observables/types/never/#observable_never","page":"Never","title":"Never Observable","text":"","category":"section"},{"location":"observables/types/never/","page":"Never","title":"Never","text":"never","category":"page"},{"location":"observables/types/never/#Rocket.never","page":"Never","title":"Rocket.never","text":"never(T = Any)\n\nCreation operator for the NeverObservable that emits neither values nor errors nor the completion notification. It can be used for testing purposes or for composing with other Observables. Please note that by never emitting a complete notification, this Observable keeps the subscription from being disposed automatically. Subscriptions need to be manually disposed.\n\nArguments\n\nT: Type of Observable data, optional, Any is the default\n\nExamples\n\nusing Rocket\n\nsource = never()\nsubscribe!(source, logger())\n;\n\n# output\n\n\nSee also: NeverObservable, subscribe!, logger\n\n\n\n\n\n","category":"function"},{"location":"observables/types/never/","page":"Never","title":"Never","text":"NeverObservable","category":"page"},{"location":"observables/types/never/#Rocket.NeverObservable","page":"Never","title":"Rocket.NeverObservable","text":"NeverObservable{D}()\n\nAn Observable that emits no items to the Observer and never completes.\n\nType parameters\n\nD: Type of Observable data\n\nSee also: Subscribable, never\n\n\n\n\n\n","category":"type"},{"location":"operators/utility/about/#Utility-category","page":"About utility operators","title":"Utility category","text":"","category":"section"},{"location":"operators/utility/about/","page":"About utility operators","title":"About utility operators","text":"There are operators for different purposes, and they may be categorized as: creation, transformation, filtering, joining, multicasting, error handling, utility, etc. In the following list you will find all the operators organized in utility category.","category":"page"},{"location":"operators/utility/about/","page":"About utility operators","title":"About utility operators","text":"tap\ntap_on_subscribe\ntap_on_unsubscribe\ntap_on_complete\ndelay\nsafe\nnoop\nref_count\nasync\ndefault_if_empty\nerror_if_empty\nskip_next\nskip_error\nskip_complete\ndiscontinue\nlimit_subscribers","category":"page"},{"location":"operators/utility/about/#See-also","page":"About utility operators","title":"See also","text":"","category":"section"},{"location":"operators/utility/about/","page":"About utility operators","title":"About utility operators","text":"Operators","category":"page"},{"location":"operators/all/#operators_list","page":"All","title":"List of all available operators","text":"","category":"section"},{"location":"operators/all/","page":"All","title":"All","text":"There are operators for different purposes, and they may be categorized as: creation, transformation, filtering, joining, multicasting, error handling, utility, etc.","category":"page"},{"location":"operators/all/#Creation-operators","page":"All","title":"Creation operators","text":"","category":"section"},{"location":"operators/all/","page":"All","title":"All","text":"make\nof\nfrom\niterable\nfaulted\nnever\ncompleted\ntimer\ninterval\nproxy\nfile\ncombined\nrace\nconnectable\nmerged\nconcat\ngenerate\nnetwork\ndefer\nzipped","category":"page"},{"location":"operators/all/#Transformation-operators","page":"All","title":"Transformation operators","text":"","category":"section"},{"location":"operators/all/","page":"All","title":"All","text":"map\nmap_to\nscan\naccumulated\nenumerate\nuppercase\nlowercase\nto_array\nswitch_map\nswitch_map_to\nmerge_map\nconcat_map\nconcat_map_to\nexhaust_map\nstart_with\npairwise\nsubstitute\noverride","category":"page"},{"location":"operators/all/#Filtering-operators","page":"All","title":"Filtering operators","text":"","category":"section"},{"location":"operators/all/","page":"All","title":"All","text":"filter\nfilter_type\nsome\ntake\ntake_until\nfirst\nlast\nfind\nfind_index\nignore","category":"page"},{"location":"operators/all/#Mathematical-and-Aggregate-operators","page":"All","title":"Mathematical and Aggregate operators","text":"","category":"section"},{"location":"operators/all/","page":"All","title":"All","text":"count\nmax\nmin\nreduce\nsum","category":"page"},{"location":"operators/all/#Error-handling-operators","page":"All","title":"Error handling operators","text":"","category":"section"},{"location":"operators/all/","page":"All","title":"All","text":"catch_error\nrerun\nerror_if\nerror_if_not","category":"page"},{"location":"operators/all/#Join-operator","page":"All","title":"Join operator","text":"","category":"section"},{"location":"operators/all/","page":"All","title":"All","text":"with_latest","category":"page"},{"location":"operators/all/#Multicasting-operators","page":"All","title":"Multicasting operators","text":"","category":"section"},{"location":"operators/all/","page":"All","title":"All","text":"multicast\npublish\npublish_behavior\npublish_replay\nshare\nshare_replay","category":"page"},{"location":"operators/all/#Utility-operators","page":"All","title":"Utility operators","text":"","category":"section"},{"location":"operators/all/","page":"All","title":"All","text":"tap\ntap_on_subscribe\ntap_on_unsubscribe\ntap_on_complete\ndelay\nsafe\nnoop\nref_count\nasync\ndefault_if_empty\nerror_if_empty\nskip_next\nskip_error\nskip_complete\ndiscontinue\nlimit_subscribers","category":"page"},{"location":"observables/types/concat/#observable_concat","page":"Concat","title":"Concat Observable","text":"","category":"section"},{"location":"observables/types/concat/","page":"Concat","title":"Concat","text":"concat","category":"page"},{"location":"observables/types/concat/#Rocket.concat","page":"Concat","title":"Rocket.concat","text":"concat(sources...)\nconcat(sources::S) where { S <: Tuple }\n\nCombines multiple Observables to create an Observable which sequentially emits all values from given Observable and then moves on to the next. All values of each passed Observable merged into a single Observable, in order, in serial fashion.\n\nArguments\n\nsources: input sources\n\nExamples\n\nusing Rocket\n\nsource1 = of(1)\nsource2 = of(2)\n\nsubscribe!(concat(source1, source2), logger())\n;\n\n# output\n[LogActor] Data: 1\n[LogActor] Data: 2\n[LogActor] Completed\n\nusing Rocket\n\nsource1 = of(1) |> async()\nsource2 = of(2)\n\nsubscribe!(concat(source1, source2), logger())\n;\n\n# output\n[LogActor] Data: 1\n[LogActor] Data: 2\n[LogActor] Completed\n\nSee also: Subscribable, subscribe!\n\n\n\n\n\n","category":"function"},{"location":"observables/types/labeled/#observable_labeled","page":"Labeled","title":"Labeled Observable","text":"","category":"section"},{"location":"observables/types/labeled/","page":"Labeled","title":"Labeled","text":"labeled","category":"page"},{"location":"observables/types/labeled/#Rocket.labeled","page":"Labeled","title":"Rocket.labeled","text":"labeled(names::Val, stream)\n\nCreation operator for the LabeledObservable that wraps given stream, that produces Tuple values into a NamedTuple with given names.\n\nArguments\n\nnames: a Val object that contains a tuple of symbols\nstream: an observable that emits a Tuple, length of the Tuple events must be equal to the length of the names argument\n\nExamples\n\nusing Rocket\n\nsource = labeled(Val((:x, :y)), from([ (1, 2), (2, 3), (3, 4) ]))\nsubscribe!(source, logger())\n;\n\n# output\n\n[LogActor] Data: (x = 1, y = 2)\n[LogActor] Data: (x = 2, y = 3)\n[LogActor] Data: (x = 3, y = 4)\n[LogActor] Completed\n\nSee also: ScheduledSubscribable, subscribe!, from\n\n\n\n\n\n","category":"function"},{"location":"observables/types/labeled/","page":"Labeled","title":"Labeled","text":"LabeledObservable","category":"page"},{"location":"observables/types/labeled/#Rocket.LabeledObservable","page":"Labeled","title":"Rocket.LabeledObservable","text":"LabeledObservable{D, S}()\n\nAn Observable that emits NamesTuple items from a source Observable that emits Tuple items.\n\nSee also: Subscribable, labeled\n\n\n\n\n\n","category":"type"},{"location":"actors/types/lambda/#actor_lambda","page":"Lambda","title":"Lambda actor","text":"","category":"section"},{"location":"actors/types/lambda/","page":"Lambda","title":"Lambda","text":"lambda","category":"page"},{"location":"actors/types/lambda/#Rocket.lambda","page":"Lambda","title":"Rocket.lambda","text":"lambda(; on_next = nothing, on_error = nothing, on_complete = nothing)\nlambda(::Type{T}; on_next = nothing, on_error = nothing, on_complete = nothing) where T\n\nCreation operator for the 'LambdaActor' actor.\n\nExamples\n\nusing Rocket\n\nactor = lambda(Int; on_next = (d) -> println(d))\nactor isa LambdaActor{Int}\n\n# output\ntrue\n\nSee also: LambdaActor, AbstractActor\n\n\n\n\n\n","category":"function"},{"location":"actors/types/lambda/","page":"Lambda","title":"Lambda","text":"LambdaActor","category":"page"},{"location":"actors/types/lambda/#Rocket.LambdaActor","page":"Lambda","title":"Rocket.LambdaActor","text":"LambdaActor{D, N, E, C}(on_next::N, on_error::E, on_complete::C) where D\n\nLambda actor wraps on_next, on_error, on_complete callbacks for data, error and complete events. Should not be used explicitly, use lambda creation operator instead.\n\nConstructor arguments\n\non_next: Callback for data event. Optional. Default is nothing.\non_error: Callback for error event. Optional. Default is nothing.\non_complete: Callback for complete event. Optional. Default is nothing.\n\nSee also: Actor, lambda\n\n\n\n\n\n","category":"type"},{"location":"operators/utility/error_if_empty/#operator_ref_error_if_empty","page":"error_if_empty","title":"ErrorIfEmpty Operator","text":"","category":"section"},{"location":"operators/utility/error_if_empty/","page":"error_if_empty","title":"error_if_empty","text":"error_if_empty","category":"page"},{"location":"operators/utility/error_if_empty/#Rocket.error_if_empty","page":"error_if_empty","title":"Rocket.error_if_empty","text":"error_if_empty(err)\n\nCreates a error_if_empty operator, which emits a given error if the source Observable completes without emitting any next value, otherwise mirrors the source Observable.\n\nusing Rocket\n\nsource = completed(Int) |> error_if_empty(\"Empty\")\n\nsubscribe!(source, logger())\n;\n\n# output\n[LogActor] Error: Empty\n\nSee also: AbstractOperator, InferableOperator, logger, map\n\n\n\n\n\n","category":"function"},{"location":"operators/utility/error_if_empty/#Description","page":"error_if_empty","title":"Description","text":"","category":"section"},{"location":"operators/utility/error_if_empty/","page":"error_if_empty","title":"error_if_empty","text":"error_if_empty emits the values emitted by the source Observable or a specified error message if the source Observable is empty (completes without having emitted any next value).","category":"page"},{"location":"operators/utility/error_if_empty/#See-also","page":"error_if_empty","title":"See also","text":"","category":"section"},{"location":"operators/utility/error_if_empty/","page":"error_if_empty","title":"error_if_empty","text":"Operators","category":"page"},{"location":"subjects/types/subject/#subject","page":"Subject","title":"Subject","text":"","category":"section"},{"location":"subjects/types/subject/","page":"Subject","title":"Subject","text":"Subject\nSubjectFactory","category":"page"},{"location":"subjects/types/subject/#Rocket.Subject","page":"Subject","title":"Rocket.Subject","text":"Subject(::Type{D}; scheduler::H = AsapScheduler())\n\nA Subject is a special type of Observable that allows values to be multicasted to many Observers. Subjects are like EventEmitters. Every Subject is an Observable and an Actor. You can subscribe to a Subject, and you can call next! to feed values as well as error! and complete!.\n\nNote: By convention, every actor subscribed to a Subject observable is not allowed to throw exceptions during next!, error! and complete! calls. Doing so would lead to undefined behaviour. Use safe() operator to bypass this rule. \n\nSee also: SubjectFactory, ReplaySubject, BehaviorSubject, safe\n\n\n\n\n\n","category":"type"},{"location":"subjects/types/subject/#Rocket.SubjectFactory","page":"Subject","title":"Rocket.SubjectFactory","text":"SubjectFactory(scheduler::H) where { H <: AbstractScheduler }\n\nA base subject factory that creates an instance of Subject with specified scheduler.\n\nSee also: AbstractSubjectFactory, Subject\n\n\n\n\n\n","category":"type"},{"location":"subjects/types/subject/#Description","page":"Subject","title":"Description","text":"","category":"section"},{"location":"subjects/types/subject/","page":"Subject","title":"Subject","text":"Every Subject is an Observable. Given a Subject, you can subscribe to it, providing an Actor, which will start receiving values normally. From the perspective of the Observer, it cannot tell whether the Observable execution is coming from a plain unicast Observable or a Subject.","category":"page"},{"location":"subjects/types/subject/","page":"Subject","title":"Subject","text":"Internally to the Subject, subscribe does not invoke a new execution that delivers values. It simply registers the given Observer in a list of Observers.","category":"page"},{"location":"subjects/types/subject/","page":"Subject","title":"Subject","text":"Every Subject is an Actor. It is an object with the methods next!, error!, and complete!. To feed a new value to the Subject, just call next!(subject, theValue), and it will be multicasted to the Actors registered to listen to the Subject.","category":"page"},{"location":"subjects/types/subject/","page":"Subject","title":"Subject","text":"note: Note\nBy convention, every actor subscribed to a Subject observable is not allowed to throw exceptions during next!, error! and complete! calls. Doing so would lead to undefined behaviour. Use safe() operator to bypass this rule. ","category":"page"},{"location":"subjects/types/subject/#Examples","page":"Subject","title":"Examples","text":"","category":"section"},{"location":"subjects/types/subject/","page":"Subject","title":"Subject","text":"In the following example, the BehaviorSubject is initialized with the value 0 which the first Observer receives when it subscribes. The second Observer receives the value 2 even though it subscribed after the value 2 was sent.","category":"page"},{"location":"subjects/types/subject/","page":"Subject","title":"Subject","text":"using Rocket\n\nsubject = Subject(Int)\n\nsubscription1 = subscribe!(subject, logger(\"1\"))\n\nnext!(subject, 1)\nnext!(subject, 2)\n\nsubscription2 = subscribe!(subject, logger(\"2\"))\n\nnext!(subject, 3)\n\nunsubscribe!(subscription1)\nunsubscribe!(subscription2)\n\n// Logs\n// [1] Data: 1\n// [1] Data: 2\n// [1] Data: 3\n// [2] Data: 3","category":"page"},{"location":"utils/#Utils","page":"Utils","title":"Utils","text":"","category":"section"},{"location":"utils/","page":"Utils","title":"Utils","text":"setTimeout\nRocket.combined_type\nRocket.union_type","category":"page"},{"location":"utils/#Rocket.setTimeout","page":"Utils","title":"Rocket.setTimeout","text":"setTimeout(f::Function, timeout::Int)\n\nCreates a Task which will asynchornously invoke fucntion f after specified timeout time in milliseconds.\n\nArguments\n\nf::Function, function to be invoked asynchronously\ntimeout::Int, timeout in milliseconds\n\nExamples\n\nusing Rocket\nusing Dates\n\nprintln(\"Before: \", Dates.format(now(), \"MM:SS\"))\nsetTimeout(1000) do\n println(\"Inside: \", Dates.format(now(), \"MM:SS\"))\nend\nprintln(\"Right after: \", Dates.format(now(), \"MM:SS\"))\n;\n\n# Logs\n# Before: 20:59\n# Right after: 20:59\n# Inside: 21:00\n\n\n\n\n\n","category":"function"},{"location":"utils/#Rocket.combined_type","page":"Utils","title":"Rocket.combined_type","text":"combined_type(sources)\n\nReturns a Tuple el-type of observable el-types in sources argument in the same order\n\n\n\n\n\n","category":"function"},{"location":"utils/#Rocket.union_type","page":"Utils","title":"Rocket.union_type","text":"union_type(sources)\n\nReturns a Union el-type of observable el-types in sources argument\n\n\n\n\n\n","category":"function"},{"location":"utils/#Helpers","page":"Utils","title":"Helpers","text":"","category":"section"},{"location":"utils/","page":"Utils","title":"Utils","text":"Rocket.@MStorage\nRocket.setstorage!","category":"page"},{"location":"utils/#Rocket.@MStorage","page":"Utils","title":"Rocket.@MStorage","text":"@MStorage(n::Int)\n\nHelper function to generate tuple-like structure MStorageN, but with mutable fields and empty constructor. It is possible then to take a snapshot(::MStorage) which returns a tuple with the same types and values from storage. Some operators and observables use pregenerated MStorage to instatiate uninitialized mutable storage in case when stream is allowed to not emit any values before completion.\n\nGenerated structure layout\n\nstruct MStorageN{V1, V2, ..., VN}\n v1 :: V1\n v2 :: V2\n ...\n vn :: VN\nend\n\nSee also: setstorage!\n\n\n\n\n\n","category":"macro"},{"location":"utils/#Rocket.setstorage!","page":"Utils","title":"Rocket.setstorage!","text":"setstorage!(s, v, ::Val{I}) where I\n\nThis function can be used to set a new value v for storage s with a given value v and index I. Using parametrized Val{I} for indexing ensures for index to be resolved at compile-time and if-else branch optimization.\n\nSee also: @MStorage\n\n\n\n\n\n","category":"function"},{"location":"observables/types/completed/#observable_completed","page":"Completed","title":"Completed Observable","text":"","category":"section"},{"location":"observables/types/completed/","page":"Completed","title":"Completed","text":"completed","category":"page"},{"location":"observables/types/completed/#Rocket.completed","page":"Completed","title":"Rocket.completed","text":"completed(::Type{T} = Any; scheduler::H = AsapScheduler()) where { T, H <: AbstractScheduler }\n\nCreation operator for the CompletedObservable that emits no items to the Actor and immediately sends a complete notification on subscription.\n\nArguments\n\nT: type of output data source, optional, Any is the default\nscheduler: optional, scheduler-like object\n\nExamples\n\nusing Rocket\n\nsource = completed(Int)\nsubscribe!(source, logger())\n;\n\n# output\n\n[LogActor] Completed\n\n\nSee also: CompletedObservable, subscribe!, logger\n\n\n\n\n\n","category":"function"},{"location":"observables/types/completed/","page":"Completed","title":"Completed","text":"CompletedObservable","category":"page"},{"location":"observables/types/completed/#Rocket.CompletedObservable","page":"Completed","title":"Rocket.CompletedObservable","text":"CompletedObservable{D, H}(scheduler::H)\n\nObservable that emits no items to the Actor and just sends a complete notification on subscription.\n\nConstructor arguments\n\nscheduler: Scheduler-like object\n\nSee also: Subscribable, completed\n\n\n\n\n\n","category":"type"},{"location":"operators/utility/tap/#operator_tap","page":"tap","title":"Tap Operator","text":"","category":"section"},{"location":"operators/utility/tap/","page":"tap","title":"tap","text":"tap","category":"page"},{"location":"operators/utility/tap/#Rocket.tap","page":"tap","title":"Rocket.tap","text":"tap(tapFn::F) where { F <: Function }\n\nCreates a tap operator, which performs a side effect for every emission on the source Observable, but return an Observable that is identical to the source.\n\nArguments\n\ntapFn::Function: side-effect tap function with (data) -> Nothing signature\n\nProducing\n\nStream of type <: Subscribable{L} where L refers to type of source stream\n\nExamples\n\nusing Rocket\n\nsource = from([ 1, 2, 3 ])\nsubscribe!(source |> tap((d) -> println(\"In tap: $d\")), logger())\n;\n\n# output\n\nIn tap: 1\n[LogActor] Data: 1\nIn tap: 2\n[LogActor] Data: 2\nIn tap: 3\n[LogActor] Data: 3\n[LogActor] Completed\n\n\nSee also: tap_on_subscribe, tap_on_complete, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/utility/tap/#Description","page":"tap","title":"Description","text":"","category":"section"},{"location":"operators/utility/tap/","page":"tap","title":"tap","text":"Returns an Observable that resembles the source Observable, but modifies it so that the provided Observer is called to perform a side effect for every value emitted by the source.","category":"page"},{"location":"operators/utility/tap/","page":"tap","title":"tap","text":"This operator is useful for debugging your Observables, verifying correct values, or performing other side effects.","category":"page"},{"location":"operators/utility/tap/","page":"tap","title":"tap","text":"Note: this operator differs from a subscribe on the Observable. If the Observable returned by tap is not subscribed, the side effects specified by the Observer will never happen. tap therefore simply spies on existing execution, it does not trigger an execution to happen like subscribe does.","category":"page"},{"location":"operators/utility/tap/#See-also","page":"tap","title":"See also","text":"","category":"section"},{"location":"operators/utility/tap/","page":"tap","title":"tap","text":"Operators","category":"page"},{"location":"observables/types/network/#observable_network","page":"Network","title":"Network Observable","text":"","category":"section"},{"location":"observables/types/network/","page":"Network","title":"Network","text":"network","category":"page"},{"location":"observables/types/network/#Rocket.network","page":"Network","title":"Rocket.network","text":"network(::Type{D}, port::Int) where D\nnetwork(::Type{D}, address::A, port::Int) where { D, A <: IPAddr }\n\nnetwork(::Type{Vector{D}}, port::Int, buffer_size::Int) where D\nnetwork(::Type{Vector{D}}, address::A, port::Int, buffer_size::Int) where { D, A <: IPAddr }\n\nCreation operator for the NetworkObservable that emits messages from the server with specified address and port arguments.\n\nSee also: NetworkObservable, subscribe!\n\n\n\n\n\n","category":"function"},{"location":"observables/types/network/","page":"Network","title":"Network","text":"NetworkObservable","category":"page"},{"location":"observables/types/network/#Rocket.NetworkObservable","page":"Network","title":"Rocket.NetworkObservable","text":"NetworkObservable{D, Address, Port, S}()\n\nNetworkObservable listens for the messages of type D from remote server with specified Address and Port parameters.\n\nSee also: network, Subscribable\n\n\n\n\n\n","category":"type"},{"location":"observables/types/function/#observable_function","page":"Function","title":"Function Observable","text":"","category":"section"},{"location":"observables/types/function/","page":"Function","title":"Function","text":"make","category":"page"},{"location":"observables/types/function/#Rocket.make","page":"Function","title":"Rocket.make","text":"make(f::Function, type::Type{D})\n\nCreation operator for the FunctionObservable.\n\nArguments\n\nf: function to be invoked on subscription\ntype: type of data in observable\n\nExamples\n\nusing Rocket\n\nsource = make(Int) do actor\n next!(actor, 0)\n complete!(actor)\nend\n\nsubscription = subscribe!(source, logger());\nunsubscribe!(subscription)\n;\n\n# output\n\n[LogActor] Data: 0\n[LogActor] Completed\n\n\nusing Rocket\n\nsource = make(Int) do actor\n next!(actor, 0)\n setTimeout(100) do\n next!(actor, 1)\n complete!(actor)\n end\nend\n\nsubscription = subscribe!(source, logger())\nunsubscribe!(subscription)\n;\n\n# output\n\n[LogActor] Data: 0\n\nSee also: FunctionObservable, subscribe!, logger\n\n\n\n\n\n","category":"function"},{"location":"observables/types/function/","page":"Function","title":"Function","text":"FunctionObservable","category":"page"},{"location":"observables/types/function/#Rocket.FunctionObservable","page":"Function","title":"Rocket.FunctionObservable","text":"FunctionObservable{D}(f::F)\n\nFunctionObservable wraps a callback `f`, which is called when the Observable is initially subscribed to.\nThis function is given an Actor, to which new values can be nexted (with `next!(actor, data)`),\nor an `error!` method can be called to raise an error, or `complete!` can be called to notify of a successful completion.\n\n# Arguments\n- `f::F`: function to be invoked on subscription\n\nSee also: [`Subscribable`](@ref), [`make`](@ref)\n\n\n\n\n\n","category":"type"},{"location":"observables/types/race/#observable_race","page":"Race","title":"Race Observable","text":"","category":"section"},{"location":"observables/types/race/","page":"Race","title":"Race","text":"race","category":"page"},{"location":"observables/types/race/#Rocket.race","page":"Race","title":"Rocket.race","text":"race(sources...)\nrace(sources::S) where { S <: Tuple }\n\nCombines multiple Observables to create an Observable that mirrors the output of the first Observable to emit an item. Essentially it subscribes to the observable that was the first to start emitting.\n\nArguments\n\nsources: input sources\n\nExamples\n\nusing Rocket\n\nsource1 = of(1)\nsource2 = of(2)\n\nsubscribe!(race(source1, source2), logger())\n;\n\n# output\n[LogActor] Data: 1\n[LogActor] Completed\n\nusing Rocket\n\nsource1 = of(1) |> async()\nsource2 = of(2)\n\nsubscribe!(race(source1, source2), logger())\n;\n\n# output\n[LogActor] Data: 2\n[LogActor] Completed\n\nSee also: Subscribable, subscribe!\n\n\n\n\n\n","category":"function"},{"location":"operators/transformation/concat_map_to/#operator_concat_map_to","page":"concat_map_to","title":"ConcatMapTo Operator","text":"","category":"section"},{"location":"operators/transformation/concat_map_to/","page":"concat_map_to","title":"concat_map_to","text":"concat_map_to","category":"page"},{"location":"operators/transformation/concat_map_to/#Rocket.concat_map_to","page":"concat_map_to","title":"Rocket.concat_map_to","text":"switch_map_to(inner_observable)\n\nCreates a switch_map_to operator, which returns an observable of values merged together by joining the passed observable with itself, one after the other, for each value emitted from the source. Essentially it projects each source value to the same Observable which is merged multiple times in a serialized fashion on the output Observable.\n\nArguments\n\ninner_observable: an Observable to replace each value from the source Observable.\n\nProducing\n\nStream of type <: Subscribable{R} where R refers to the eltype of inner_observable\n\nExamples\n\nusing Rocket\n\nsource = from([ 0, 0, 0 ])\nsubscribe!(source |> concat_map_to(from([ 1, 2, 3 ])), logger())\n;\n\n# output\n\n[LogActor] Data: 1\n[LogActor] Data: 2\n[LogActor] Data: 3\n[LogActor] Data: 1\n[LogActor] Data: 2\n[LogActor] Data: 3\n[LogActor] Data: 1\n[LogActor] Data: 2\n[LogActor] Data: 3\n[LogActor] Completed\n\nSee also: concat_map, AbstractOperator, RightTypedOperator, ProxyObservable, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/transformation/concat_map_to/","page":"concat_map_to","title":"concat_map_to","text":"note: Note\nconcat_map_to is equivalent to concat_map with mappingFn set to (_) -> inner_observable.","category":"page"},{"location":"operators/transformation/concat_map_to/#See-also","page":"concat_map_to","title":"See also","text":"","category":"section"},{"location":"operators/transformation/concat_map_to/","page":"concat_map_to","title":"concat_map_to","text":"Operators, concat_map","category":"page"},{"location":"operators/errors/error_if_not/#operator_error_if_not","page":"error_if_not","title":"Error If Not Operator","text":"","category":"section"},{"location":"operators/errors/error_if_not/","page":"error_if_not","title":"error_if_not","text":"Note: error_if_not is an alias for error_if operator with inverted checkFn.","category":"page"},{"location":"operators/errors/error_if_not/","page":"error_if_not","title":"error_if_not","text":"error_if_not","category":"page"},{"location":"operators/errors/error_if_not/#Rocket.error_if_not","page":"error_if_not","title":"Rocket.error_if_not","text":"error_if_not(checkFn, errorFn)\n\nCreates an error_if_not operator, which performs a check for every emission on the source Observable with checkFn. If checkFn returns false, the operator sends an error event and unsubscribes from the observable.\n\nNote: error_if_not is an alias for error_if operator with inverted checkFn.\n\nArguments\n\ncheckFn: check function with (data) -> Bool signature\nerrorFn: error object generating function with (data) -> Any signature, optional\n\nProducing\n\nStream of type <: Subscribable{L} where L refers to type of source stream\n\nExamples\n\nusing Rocket\n\nsource = from([1, 2, 3]) |> error_if_not((data) -> data < 2, (data) -> \"CustomError\")\n\nsubscription = subscribe!(source, lambda(\n on_next = (d) -> println(\"Next: \", d),\n on_error = (e) -> println(\"Error: \", e),\n on_complete = () -> println(\"Completed\")\n))\n;\n\n# output\nNext: 1\nError: CustomError\n\nSee also: error_if, error_if_empty, default_if_empty, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/errors/error_if_not/#See-also","page":"error_if_not","title":"See also","text":"","category":"section"},{"location":"operators/errors/error_if_not/","page":"error_if_not","title":"error_if_not","text":"Operators","category":"page"},{"location":"todo/#TODO","page":"TODO","title":"TODO","text":"","category":"section"},{"location":"todo/","page":"TODO","title":"TODO","text":"This package in under development and some features of the reactive framework not yet implemented.","category":"page"},{"location":"operators/mathematical/count/#operator_count","page":"count","title":"Count Operator","text":"","category":"section"},{"location":"operators/mathematical/count/","page":"count","title":"count","text":"count","category":"page"},{"location":"operators/mathematical/count/#Base.count","page":"count","title":"Base.count","text":"count()\n\nCreates a count operator, which counts the number of emissions on the source and emits that number when the source completes.\n\nProducing\n\nStream of type <: Subscribable{Int}\n\nExamples\n\nusing Rocket\n\nsource = from([ i for i in 1:42 ])\nsubscribe!(source |> count(), logger())\n;\n\n# output\n\n[LogActor] Data: 42\n[LogActor] Completed\n\n\nSee also: AbstractOperator, RightTypedOperator, ProxyObservable, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/mathematical/count/#Description","page":"count","title":"Description","text":"","category":"section"},{"location":"operators/mathematical/count/","page":"count","title":"count","text":"count transforms an Observable that emits values into an Observable that emits a single value that represents the number of values emitted by the source Observable. If the source Observable terminates with an error, count will pass this error notification along without emitting a value first. If the source Observable does not terminate at all, count will neither emit a value nor terminate.","category":"page"},{"location":"operators/mathematical/count/#Example","page":"count","title":"Example","text":"","category":"section"},{"location":"operators/mathematical/count/","page":"count","title":"count","text":"Counts how many values source Observable have emitted before the complete event happened","category":"page"},{"location":"operators/mathematical/count/","page":"count","title":"count","text":"using Rocket\n\nsource = from([ i for i in 1:42 ])\nsubscribe!(source |> count(), logger())\n\n# output\n\n[LogActor] Data: 42\n[LogActor] Completed","category":"page"},{"location":"operators/mathematical/count/#See-also","page":"count","title":"See also","text":"","category":"section"},{"location":"operators/mathematical/count/","page":"count","title":"count","text":"Operators","category":"page"},{"location":"operators/transformation/map_to/#operator_map_to","page":"map_to","title":"MapTo Operator","text":"","category":"section"},{"location":"operators/transformation/map_to/","page":"map_to","title":"map_to","text":"map_to","category":"page"},{"location":"operators/transformation/map_to/#Rocket.map_to","page":"map_to","title":"Rocket.map_to","text":"map_to(value::T) where T\n\nCreates a map operator, which emits the given constant value on the output Observable every time the source Observable emits a value.\n\nArguments\n\nvalue::T: the constant value to map each source value to\n\nProducing\n\nStream of type <: Subscribable{T}\n\nExamples\n\nusing Rocket\n\nsource = from([ 1, 2, 3 ])\nsubscribe!(source |> map_to('a'), logger())\n;\n\n# output\n\n[LogActor] Data: a\n[LogActor] Data: a\n[LogActor] Data: a\n[LogActor] Completed\n\nSee also: map, AbstractOperator, RightTypedOperator, ProxyObservable, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/transformation/map_to/#Description","page":"map_to","title":"Description","text":"","category":"section"},{"location":"operators/transformation/map_to/","page":"map_to","title":"map_to","text":"Takes a constant value as argument, and emits that whenever the source Observable emits a value. In other words, ignores the actual source value, and simply uses the emission moment to know when to emit the given value.","category":"page"},{"location":"operators/transformation/map_to/#See-also","page":"map_to","title":"See also","text":"","category":"section"},{"location":"operators/transformation/map_to/","page":"map_to","title":"map_to","text":"Operators","category":"page"},{"location":"observables/types/merged/#observable_merged","page":"Merged","title":"Merged Observable","text":"","category":"section"},{"location":"observables/types/merged/","page":"Merged","title":"Merged","text":"merged","category":"page"},{"location":"observables/types/merged/#Rocket.merged","page":"Merged","title":"Rocket.merged","text":"merged(sources::T) where { T <: Tuple }\n\nCreation operator for the MergeObservable with a given sources collected in a tuple. merge subscribes to each given input Observable (as arguments), and simply forwards (without doing any transformation) all the values from all the input Observables to the output Observable. The output Observable only completes once all input Observables have completed. Any error delivered by an input Observable will be immediately emitted on the output Observable.\n\nExamples\n\nusing Rocket\n\nobservable = merged((from(1:4), of(2.0), from(\"Hello\")))\n\nsubscribe!(observable, logger())\n;\n\n# output\n[LogActor] Data: 1\n[LogActor] Data: 2\n[LogActor] Data: 3\n[LogActor] Data: 4\n[LogActor] Data: 2.0\n[LogActor] Data: H\n[LogActor] Data: e\n[LogActor] Data: l\n[LogActor] Data: l\n[LogActor] Data: o\n[LogActor] Completed\n\nusing Rocket\n\nsubject = Subject(Int, scheduler = AsyncScheduler())\n\nobservable = merged((subject, of(2.0), from(\"Hello\")))\n\nactor = sync(logger())\n\nsubscribe!(observable, actor)\n\nsetTimeout(200) do\n next!(subject, 1)\n complete!(subject)\nend\n\nwait(actor)\n;\n\n# output\n[LogActor] Data: 2.0\n[LogActor] Data: H\n[LogActor] Data: e\n[LogActor] Data: l\n[LogActor] Data: l\n[LogActor] Data: o\n[LogActor] Data: 1\n[LogActor] Completed\n\nSee also: Subscribable\n\n\n\n\n\n","category":"function"},{"location":"operators/transformation/uppercase/#operator_uppercase","page":"uppercase","title":"Uppercase Operator","text":"","category":"section"},{"location":"operators/transformation/uppercase/","page":"uppercase","title":"uppercase","text":"uppercase","category":"page"},{"location":"operators/transformation/uppercase/#Base.Unicode.uppercase","page":"uppercase","title":"Base.Unicode.uppercase","text":"uppercase()\n\nCreates an uppercase operator, which forces each value to be in upper case\n\nProducing\n\nStream of type <: Subscribable{L} where L referes to type of data of input Observable\n\nExamples\n\nusing Rocket\n\nsource = of(\"Hello, world!\")\nsubscribe!(source |> uppercase(), logger())\n;\n\n# output\n\n[LogActor] Data: HELLO, WORLD!\n[LogActor] Completed\n\nSee also: AbstractOperator, InferableOperator, ProxyObservable, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/transformation/uppercase/#See-also","page":"uppercase","title":"See also","text":"","category":"section"},{"location":"operators/transformation/uppercase/","page":"uppercase","title":"uppercase","text":"Operators, map, lowercase","category":"page"},{"location":"observables/types/file/#observable_file","page":"File","title":"File Observable","text":"","category":"section"},{"location":"observables/types/file/","page":"File","title":"File","text":"file","category":"page"},{"location":"observables/types/file/#Rocket.file","page":"File","title":"Rocket.file","text":"file(path::String)\n\nCreation operator for the SyncFileObservable with a given path.\n\nSee also: SyncFileObservable\n\n\n\n\n\n","category":"function"},{"location":"observables/types/file/","page":"File","title":"File","text":"SyncFileObservable","category":"page"},{"location":"observables/types/file/#Rocket.SyncFileObservable","page":"File","title":"Rocket.SyncFileObservable","text":"SyncFileObservable(path::String)\n\nFile observable, which synchronously emits content of the file line by line as a String objects on subscription.\n\nSee also: file, Subscribable\n\n\n\n\n\n","category":"type"},{"location":"operators/mathematical/reduce/#operator_reduce","page":"reduce","title":"Reduce Operator","text":"","category":"section"},{"location":"operators/mathematical/reduce/","page":"reduce","title":"reduce","text":"reduce","category":"page"},{"location":"operators/mathematical/reduce/#Base.reduce","page":"reduce","title":"Base.reduce","text":"reduce(::Type{R}, reduceFn::Function, seed::R) where R\nreduce(reduceFn::F) where { F <: Function }\n\nCreates a reduce operator, which applies a given accumulator reduceFn function over the source Observable, and returns the accumulated result when the source completes, given an optional seed value. If a seed value is specified, then that value will be used as the initial value for the accumulator. If no seed value is specified, the first item of the source is used as the seed.\n\nArguments\n\n::Type{R}: the type of data of transformed value\nreduceFn::Function: transformation function with (data::T, current::R) -> R signature\nseed::R: optional seed accumulation value\n\nProducing\n\nStream of type <: Subscribable{R}\n\nExamples\n\nusing Rocket\n\nsource = from([ i for i in 1:10 ])\nsubscribe!(source |> reduce(Vector{Int}, (d, c) -> [ c..., d ], Int[]), logger())\n;\n\n# output\n\n[LogActor] Data: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]\n[LogActor] Completed\n\n\nusing Rocket\n\nsource = from([ i for i in 1:42 ])\nsubscribe!(source |> reduce(+), logger())\n;\n\n# output\n\n[LogActor] Data: 903\n[LogActor] Completed\n\n\nSee also: AbstractOperator, RightTypedOperator, ProxyObservable, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/mathematical/reduce/#Description","page":"reduce","title":"Description","text":"","category":"section"},{"location":"operators/mathematical/reduce/","page":"reduce","title":"reduce","text":"reduce applies an accumulator function to each value of the source Observable (from the past) and reduces it to a single value that is emitted by the output Observable. Note that reduce will only emit one value, only when the source Observable completes. It is equivalent to applying scan followed by last.","category":"page"},{"location":"operators/mathematical/reduce/","page":"reduce","title":"reduce","text":"It returns an Observable that applies a specified accumulator function to each item emitted by the source Observable. If a seed value is specified, then that value will be used as the initial value of the accumulator. If no seed value is specified, the first item of the source is used as the seed.","category":"page"},{"location":"operators/mathematical/reduce/#See-also","page":"reduce","title":"See also","text":"","category":"section"},{"location":"operators/mathematical/reduce/","page":"reduce","title":"reduce","text":"Operators, scan, last","category":"page"},{"location":"operators/filtering/some/#operator_some","page":"some","title":"Some Operator","text":"","category":"section"},{"location":"operators/filtering/some/","page":"some","title":"some","text":"some","category":"page"},{"location":"operators/filtering/some/#Rocket.some","page":"some","title":"Rocket.some","text":"some()\n\nCreates a some operator, which filters out nothing items by the source Observable by emitting only those that not equal to nothing.\n\nProducing\n\nStream of type <: Subscribable{L} where L refers to type of source stream <: Subscribable{Union{L, Nothing}}\n\nExamples\n\nusing Rocket\n\nsource = from([ 1, nothing, 3 ])\nsubscribe!(source |> some(), logger())\n;\n\n# output\n\n[LogActor] Data: 1\n[LogActor] Data: 3\n[LogActor] Completed\n\n\nSee also: AbstractOperator, InferableOperator, ProxyObservable, max, min, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/filtering/some/#Description","page":"some","title":"Description","text":"","category":"section"},{"location":"operators/filtering/some/","page":"some","title":"some","text":"This operator takes values from the source Observable and only emits those values that are not nothing.","category":"page"},{"location":"operators/filtering/some/#See-also","page":"some","title":"See also","text":"","category":"section"},{"location":"operators/filtering/some/","page":"some","title":"some","text":"Operators, filter","category":"page"},{"location":"actors/types/storage/#actor_storage","page":"Storage","title":"Storage actor","text":"","category":"section"},{"location":"actors/types/storage/","page":"Storage","title":"Storage","text":"storage","category":"page"},{"location":"actors/types/storage/#Rocket.storage","page":"Storage","title":"Rocket.storage","text":"storage(::Type{T}) where T\n\nArguments\n\n::Type{T}: Type of storage data\n\nCreation operator for the StorageActor actor.\n\nExamples\n\nusing Rocket\n\nactor = storage(Int)\nactor isa StorageActor{Int}\n\n# output\ntrue\n\nSee also: StorageActor, AbstractActor\n\n\n\n\n\n","category":"function"},{"location":"actors/types/storage/","page":"Storage","title":"Storage","text":"StorageActor","category":"page"},{"location":"actors/types/storage/#Rocket.StorageActor","page":"Storage","title":"Rocket.StorageActor","text":"StorageActor{D}() where D\n\nStorage actor provides an actor that stores a single (last) value passed to the next! callback. It saves last incoming successful next event in the value field, throws an ErrorException on error! event and does nothing on completion event. Before any events value initialised with nothing.\n\nExamples\n\nusing Rocket\n\nsource = from(1:5)\nactor = storage(Int)\n\nsubscribe!(source, actor)\nshow(getvalues(actor))\n\n# output\n5\n\nSee also: Actor, storage\n\n\n\n\n\n","category":"type"},{"location":"operators/multicasting/publish/#operator_publish","page":"publish","title":"Publish Operators","text":"","category":"section"},{"location":"operators/multicasting/publish/","page":"publish","title":"publish","text":"publish\npublish_behavior\npublish_replay\npublish_recent","category":"page"},{"location":"operators/multicasting/publish/#Rocket.publish","page":"publish","title":"Rocket.publish","text":"publish(; scheduler::H = AsapScheduler()) where { H <: AbstractScheduler }\n\npublish() is a shortcut for multicast(SubjectFactory())\n\nSee also: AbstractOperator, multicast, SubjectFactory\n\n\n\n\n\n","category":"function"},{"location":"operators/multicasting/publish/#Rocket.publish_behavior","page":"publish","title":"Rocket.publish_behavior","text":"publish_behavior(default; scheduler::H = AsapScheduler()) where { H <: AbstractScheduler }\n\npublish_behavior(default) is a shortcut for multicast(BehaviorSubjectFactory(default))\n\nSee also: AbstractOperator, multicast, BehaviorSubjectFactory\n\n\n\n\n\n","category":"function"},{"location":"operators/multicasting/publish/#Rocket.publish_replay","page":"publish","title":"Rocket.publish_replay","text":"publish_replay(size::Int; scheduler::H = AsapScheduler()) where { H <: AbstractScheduler }\n\npublish_replay(size) is a shortcut for multicast(ReplaySubjectFactory(size))\n\nSee also: AbstractOperator, multicast, ReplaySubjectFactory\n\n\n\n\n\n","category":"function"},{"location":"operators/multicasting/publish/#Rocket.publish_recent","page":"publish","title":"Rocket.publish_recent","text":"publish_recent(; scheduler::H = AsapScheduler()) where { H <: AbstractScheduler }\n\npublish_recent(size) is a shortcut for multicast(RecentSubjectFactory())\n\nSee also: AbstractOperator, multicast, RecentSubjectFactory\n\n\n\n\n\n","category":"function"},{"location":"operators/multicasting/publish/#See-also","page":"publish","title":"See also","text":"","category":"section"},{"location":"operators/multicasting/publish/","page":"publish","title":"publish","text":"Operators","category":"page"},{"location":"#Rocket.jl-Documentation","page":"Home","title":"Rocket.jl Documentation","text":"","category":"section"},{"location":"","page":"Home","title":"Home","text":"Welcome to the documentation for Rocket.jl.","category":"page"},{"location":"","page":"Home","title":"Home","text":"This documentation is an adaptation of the RxJS library documentation.","category":"page"},{"location":"#Table-of-Contents","page":"Home","title":"Table of Contents","text":"","category":"section"},{"location":"","page":"Home","title":"Home","text":"Pages = [\n \"getting-started.md\",\n \"observables/about.md\",\n \"actors/about.md\",\n \"teardown/about.md\",\n \"operators/about.md\",\n \"operators/piping.md\",\n \"operators/create-new-operator.md\",\n \"operators/high-order.md\",\n \"todo.md\",\n \"contributing.md\",\n \"utils.md\"\n]\nDepth = 2","category":"page"},{"location":"#Index","page":"Home","title":"Index","text":"","category":"section"},{"location":"","page":"Home","title":"Home","text":"","category":"page"},{"location":"actors/types/logger/#actor_logger","page":"Logger","title":"Logger actor","text":"","category":"section"},{"location":"actors/types/logger/","page":"Logger","title":"Logger","text":"logger","category":"page"},{"location":"actors/types/logger/#Rocket.logger","page":"Logger","title":"Rocket.logger","text":"logger([ io::IO ], name::String = \"LogActor\")\nlogger(::Type{T}, [ io::IO ], name::String = \"LogActor\") where T\n\nCreation operator for the LoggerActor actor.\n\nExamples\n\nusing Rocket\n\nsource = from([ 0, 1, 2 ])\nsubscribe!(source, logger())\n;\n\n# output\n\n[LogActor] Data: 0\n[LogActor] Data: 1\n[LogActor] Data: 2\n[LogActor] Completed\n\nusing Rocket\n\nsource = from([ 0, 1, 2 ])\nsubscribe!(source, logger(\"CustomName\"))\n;\n\n# output\n\n[CustomName] Data: 0\n[CustomName] Data: 1\n[CustomName] Data: 2\n[CustomName] Completed\n\nusing Rocket\n\nbuffer = IOBuffer()\n\nsource = from([ 0, 1, 2 ])\nsubscribe!(source, logger(buffer, \"CustomBuffer\"))\n;\n\nprint(String(take!(buffer)))\n# output\n\n[CustomBuffer] Data: 0\n[CustomBuffer] Data: 1\n[CustomBuffer] Data: 2\n[CustomBuffer] Completed\n\nSee also: LoggerActor, AbstractActor\n\n\n\n\n\n","category":"function"},{"location":"actors/types/logger/","page":"Logger","title":"Logger","text":"LoggerActor","category":"page"},{"location":"actors/types/logger/#Rocket.LoggerActor","page":"Logger","title":"Rocket.LoggerActor","text":"LoggerActor{D}(name::String = \"LogActor\", io::O) where { D, O }\n\nThe LoggerActor logs all next!/error!/complete! events that are sent from an Observable.\n\nConstructor arguments\n\nname: name of the logger. Optional. Default is LogActor.\nio: io stream to log in, maybe nothing to write to stdout\n\nSee also: Actor, logger\n\n\n\n\n\n","category":"type"},{"location":"operators/multicasting/about/#Multicasting-category","page":"About multicasting operators","title":"Multicasting category","text":"","category":"section"},{"location":"operators/multicasting/about/","page":"About multicasting operators","title":"About multicasting operators","text":"There are operators for different purposes, and they may be categorized as: creation, transformation, filtering, joining, multicasting, error handling, utility, etc. In the following list you will find all the operators organized in multicasting category.","category":"page"},{"location":"operators/multicasting/about/","page":"About multicasting operators","title":"About multicasting operators","text":"multicast\npublish\npublish_behavior\npublish_replay\nshare\nshare_replay","category":"page"},{"location":"operators/multicasting/about/#See-also","page":"About multicasting operators","title":"See also","text":"","category":"section"},{"location":"operators/multicasting/about/","page":"About multicasting operators","title":"About multicasting operators","text":"Operators","category":"page"},{"location":"observables/types/zipped/#observable_zipped","page":"Zipped","title":"Zipped Observable","text":"","category":"section"},{"location":"observables/types/zipped/","page":"Zipped","title":"Zipped","text":"zipped","category":"page"},{"location":"observables/types/zipped/#Rocket.zipped","page":"Zipped","title":"Rocket.zipped","text":"zipped(sources...)\n\nCombines multiple Observables to create an Observable whose values are calculated from the values, in order, of each of its input Observables.\n\nArguments\n\nsources: input sources\n\nExamples\n\nusing Rocket\n\nsource = zipped(of(1), from(2:5))\n\nsubscribe!(source, logger())\n;\n\n# output\n\n[LogActor] Data: (1, 2)\n[LogActor] Completed\n\nusing Rocket\n\nsource = zipped(from(1:3), from(1:5))\n\nsubscribe!(source, logger())\n;\n\n# output\n\n[LogActor] Data: (1, 1)\n[LogActor] Data: (2, 2)\n[LogActor] Data: (3, 3)\n[LogActor] Completed\n\nusing Rocket\n\nsource = zipped(completed(), of(0.0))\n\nsubscribe!(source, logger())\n;\n\n# output\n\n[LogActor] Completed\n\nSee also: Subscribable, subscribe!\n\n\n\n\n\n","category":"function"},{"location":"contributing/#Contribution-guidelines","page":"Contributing","title":"Contribution guidelines","text":"","category":"section"},{"location":"contributing/","page":"Contributing","title":"Contributing","text":"We welcome all possible contributors. This page details the some of the guidelines that should be followed when contributing to this package.","category":"page"},{"location":"contributing/#Reporting-bugs","page":"Contributing","title":"Reporting bugs","text":"","category":"section"},{"location":"contributing/","page":"Contributing","title":"Contributing","text":"We track bugs using GitHub issues. We encourage you to write complete, specific, reproducible bug reports. Mention the versions of Julia and Rocket.jl for which you observe unexpected behavior. Please provide a concise description of the problem and complement it with code snippets, test cases, screenshots, tracebacks or any other information that you consider relevant. This will help us to replicate the problem and narrow the search space for solutions.","category":"page"},{"location":"contributing/#Suggesting-features","page":"Contributing","title":"Suggesting features","text":"","category":"section"},{"location":"contributing/","page":"Contributing","title":"Contributing","text":"We welcome new feature proposals. However, before submitting a feature request, consider a few things:","category":"page"},{"location":"contributing/","page":"Contributing","title":"Contributing","text":"Does the feature require changes in the core Rocket.jl code? If it doesn't (for example, you would like to add a operator for a particular application), consider making a separate repository for your extensions.\nIf you would like to add an implementation of a feature that changes a lot in the core Rocket.jl code, please open an issue on GitHub and describe your proposal first. This will allow us to discuss your proposal with you before you invest your time in implementing something that may be difficult to merge later on.","category":"page"},{"location":"contributing/#Contributing-code","page":"Contributing","title":"Contributing code","text":"","category":"section"},{"location":"contributing/#Installing-Rocket","page":"Contributing","title":"Installing Rocket","text":"","category":"section"},{"location":"contributing/","page":"Contributing","title":"Contributing","text":"We suggest that you use the dev command from the new Julia package manager to install Rocket.jl for development purposes. To work on your fork of Rocket.jl, use your fork's URL address in the dev command, for example:","category":"page"},{"location":"contributing/","page":"Contributing","title":"Contributing","text":"] dev git@github.com:your_username/Rocket.jl.git","category":"page"},{"location":"contributing/","page":"Contributing","title":"Contributing","text":"The dev command clones Rocket.jl to ~/.julia/dev/Rocket. All local changes to Rocket code will be reflected in imported code.","category":"page"},{"location":"contributing/","page":"Contributing","title":"Contributing","text":"note: Note\nIt is also might be useful to install Revise.jl package as it allows you to modify code and use the changes without restarting Julia.","category":"page"},{"location":"contributing/#Committing-code","page":"Contributing","title":"Committing code","text":"","category":"section"},{"location":"contributing/","page":"Contributing","title":"Contributing","text":"We use the standard GitHub Flow workflow where all contributions are added through pull requests. In order to contribute, first fork the repository, then commit your contributions to your fork, and then create a pull request on the master branch of the Rocket.jl repository.","category":"page"},{"location":"contributing/","page":"Contributing","title":"Contributing","text":"Before opening a pull request, please make sure that all tests pass without failing! All demos (can be found in /demo/ directory) have to run without errors as well.","category":"page"},{"location":"contributing/#Style-conventions","page":"Contributing","title":"Style conventions","text":"","category":"section"},{"location":"contributing/","page":"Contributing","title":"Contributing","text":"We use default Julia style guide. We list here a few important points and our modifications to the Julia style guide:","category":"page"},{"location":"contributing/","page":"Contributing","title":"Contributing","text":"Use 4 spaces for indentation\nType names use UpperCamelCase. For example: ArrayObservable, MapOperator, etc..\nFunction names are lowercase with underscores, when necessary. For example: next!, subscribe!, as_actor, etc..\nVariable names and function arguments use snake_case\nThe name of a method that modifies its argument(s) must end in !","category":"page"},{"location":"contributing/#Unit-tests","page":"Contributing","title":"Unit tests","text":"","category":"section"},{"location":"contributing/","page":"Contributing","title":"Contributing","text":"We use the test-driven development (TDD) methodology for Rocket.jl development. The test coverage should be as complete as possible. Please make sure that you write tests for each piece of code that you want to add.","category":"page"},{"location":"contributing/","page":"Contributing","title":"Contributing","text":"All unit tests are located in the /test/ directory. The /test/ directory follows the structure of the /src/ directory. Each test file should have following filename format: test_*.jl. Some tests are also present in jldoctest docs annotations directly in the source code. See Julia's documentation about doctests.","category":"page"},{"location":"contributing/","page":"Contributing","title":"Contributing","text":"The tests can be evaluated by running following command in the Julia REPL:","category":"page"},{"location":"contributing/","page":"Contributing","title":"Contributing","text":"] test Rocket","category":"page"},{"location":"operators/transformation/override/#operator_override","page":"override","title":"Override Operator","text":"","category":"section"},{"location":"operators/transformation/override/","page":"override","title":"override","text":"override\nOverrideHandler","category":"page"},{"location":"operators/transformation/override/#Rocket.override","page":"override","title":"Rocket.override","text":"override(handler::OverrideHandler)\n\nCreates an override operator that overrides each emission from source observable with value provided in handler. If handler contains nothing source observable emits as usual. For constant override see map_to. Use Rocket.setvalue! to set new value for handler.\n\nProducing\n\nStream of type <: Subscribable{Union{L, T}} where L refers to the type of source stream and T referes to the type of handler's value\n\nExamples\n\nusing Rocket \n\nsubject = Subject(Int)\nhandler = OverrideHandler(Int, -1)\n\nsource = subject |> override(handler)\n\nsubscription = subscribe!(source, logger())\n\nnext!(subject, 1)\nnext!(subject, 2)\n\nRocket.setvalue!(handler, nothing)\n\nnext!(subject, 3)\nnext!(subject, 4)\n\nRocket.setvalue!(handler, -2)\n\nnext!(subject, 5)\nnext!(subject, 6)\n\nunsubscribe!(subscription)\n\n# output\n[LogActor] Data: -1\n[LogActor] Data: -1\n[LogActor] Data: 3\n[LogActor] Data: 4\n[LogActor] Data: -2\n[LogActor] Data: -2\n\nSee also: OverrideHandler\n\n\n\n\n\n","category":"function"},{"location":"operators/transformation/override/#Rocket.OverrideHandler","page":"override","title":"Rocket.OverrideHandler","text":"OverrideHandler(::Type{T}, value::Union{Nothing, T}) where T\nOverrideHandler(::Type{T}) where T\n\nHandler used in substitute operator.\n\nSee also: substitute\n\n\n\n\n\n","category":"type"},{"location":"operators/transformation/override/#See-also","page":"override","title":"See also","text":"","category":"section"},{"location":"operators/transformation/override/","page":"override","title":"override","text":"Operators","category":"page"},{"location":"operators/filtering/find/#operator_find","page":"find","title":"Find operator","text":"","category":"section"},{"location":"operators/filtering/find/","page":"find","title":"find","text":"find","category":"page"},{"location":"operators/filtering/find/#Rocket.find","page":"find","title":"Rocket.find","text":"find(conditionFn::F) where { F <: Function }\n\nCreates a find operator, which emits only the first value emitted by the source Observable that meets some condition.\n\nProducing\n\nStream of type <: Subscribable{L} where L refers to type of source stream\n\nArguments\n\nconditionFn::F: condition function with (data::T) -> Bool signature\n\nExamples\n\nusing Rocket\n\nsource = from([ 1, 2, 3, 4, 5, 6, 7, 8 ])\nsubscribe!(source |> find((d) -> d % 2 == 0), logger())\n;\n\n# output\n\n[LogActor] Data: 2\n[LogActor] Completed\n\nSee also: AbstractOperator, InferableOperator, ProxyObservable, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/filtering/find/#Description","page":"find","title":"Description","text":"","category":"section"},{"location":"operators/filtering/find/","page":"find","title":"find","text":"find searches for the first item in the source Observable that matches the specified condition embodied by the predicate, and returns the first occurrence in the source. Does not emit an error if a valid value is not found.","category":"page"},{"location":"operators/filtering/find/#See-also","page":"find","title":"See also","text":"","category":"section"},{"location":"operators/filtering/find/","page":"find","title":"find","text":"Operators, take","category":"page"},{"location":"operators/utility/discontinue/#operator_discontinue","page":"discontinue","title":"Discontinue Operator","text":"","category":"section"},{"location":"operators/utility/discontinue/","page":"discontinue","title":"discontinue","text":"discontinue","category":"page"},{"location":"operators/utility/discontinue/#Rocket.discontinue","page":"discontinue","title":"Rocket.discontinue","text":"discontinue()\n\nCreates an operator, which prevents an emitting of self-depending messages and breaks a possible infinite loop. Does nothing if observable scheduled asynchronously.\n\nProducing\n\nStream of type <: Subscribable{L} where L refers to type of source stream\n\nExamples\n\nusing Rocket\n\ns = BehaviorSubject(0)\n\nsubscription1 = subscribe!(s, logger())\nsubscription2 = subscribe!(s |> map(Int, d -> d + 1) |> discontinue(), s)\n;\n\n# output\n\n[LogActor] Data: 0\n[LogActor] Data: 1\n\nSee also: AbstractOperator, RightTypedOperator, ProxyObservable, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/utility/discontinue/#See-also","page":"discontinue","title":"See also","text":"","category":"section"},{"location":"operators/utility/discontinue/","page":"discontinue","title":"discontinue","text":"Operators","category":"page"},{"location":"teardown/about/#section_subscription","page":"Subscription","title":"Subscription","text":"","category":"section"},{"location":"teardown/about/","page":"Subscription","title":"Subscription","text":"A Subscription represents a disposable resource, usually the execution of an Observable. A Subscription has one important method: unsubscribe!(teardown), which takes some teardown logic object as one argument and disposes the resource held by the subscription.","category":"page"},{"location":"teardown/about/","page":"Subscription","title":"Subscription","text":"using Rocket\n\nsource = Subject(Int)\n\nnext!(source, 0) # Logs nothing as there is no subscribers\n\nsubscription = subscribe!(source, logger())\n\nnext!(source, 1) # Logs [LogActor] Data: 1 into standard output\n\nunsubscribe!(subscription)\n\nnext!(source, 2) # Logs nothing as a single one actor has unsubscribed","category":"page"},{"location":"teardown/about/","page":"Subscription","title":"Subscription","text":"note: Note\nA Subscription essentially just has its own specific method for unsubscribe!() function which releases resources or cancel Observable executions. Any Observable has to return a valid Teardown object.","category":"page"},{"location":"teardown/about/","page":"Subscription","title":"Subscription","text":"unsubscribe! function also supports multiple unsubscriptions at once. If the input argument to the unsubscribe! function is either a tuple or a vector, it will first check that all of the arguments are valid subscription objects and if its true will unsubscribe from each of them individually.","category":"page"},{"location":"teardown/about/","page":"Subscription","title":"Subscription","text":"\nsource = Subject(Int)\n\nsubscription1 = subscribe!(source, logger())\nsubscription2 = subscribe!(source, logger())\n\nunsubscribe!((subscription1, subscription2))\n\n# or similarly\n# unsubscribe!([ subscription1, subscription2 ])\n","category":"page"},{"location":"teardown/about/","page":"Subscription","title":"Subscription","text":"For more information about subscription and teardown logic see the API Section","category":"page"},{"location":"operators/transformation/switch_map_to/#operator_switch_map_to","page":"switch_map_to","title":"SwitchMapTo Operator","text":"","category":"section"},{"location":"operators/transformation/switch_map_to/","page":"switch_map_to","title":"switch_map_to","text":"switch_map_to","category":"page"},{"location":"operators/transformation/switch_map_to/#Rocket.switch_map_to","page":"switch_map_to","title":"Rocket.switch_map_to","text":"switch_map_to(inner_observable)\n\nCreates a switch_map_to operator, which projects each source value to the same Observable which is flattened multiple times with switch_map in the output Observable.\n\nArguments\n\ninner_observable: an Observable to replace each value from the source Observable.\n\nProducing\n\nStream of type <: Subscribable{R} where R refers to the eltype of inner_observable\n\nExamples\n\nusing Rocket\n\nsource = from([ 0, 0, 0 ])\nsubscribe!(source |> switch_map_to(from([ 1, 2, 3 ])), logger())\n;\n\n# output\n\n[LogActor] Data: 1\n[LogActor] Data: 2\n[LogActor] Data: 3\n[LogActor] Data: 1\n[LogActor] Data: 2\n[LogActor] Data: 3\n[LogActor] Data: 1\n[LogActor] Data: 2\n[LogActor] Data: 3\n[LogActor] Completed\n\nSee also: switch_map, AbstractOperator, RightTypedOperator, ProxyObservable, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/transformation/switch_map_to/","page":"switch_map_to","title":"switch_map_to","text":"note: Note\nswitch_map_to is equivalent to switch_map with mappingFn set to (_) -> inner_observable.","category":"page"},{"location":"operators/transformation/switch_map_to/#See-also","page":"switch_map_to","title":"See also","text":"","category":"section"},{"location":"operators/transformation/switch_map_to/","page":"switch_map_to","title":"switch_map_to","text":"Operators","category":"page"},{"location":"operators/errors/rerun/#operator_rerun","page":"rerun","title":"Rerun Operator","text":"","category":"section"},{"location":"operators/errors/rerun/","page":"rerun","title":"rerun","text":"rerun","category":"page"},{"location":"operators/errors/rerun/#Rocket.rerun","page":"rerun","title":"Rocket.rerun","text":"rerun(count::Int = -1)\n\nReturns an Observable that mirrors the source Observable with the exception of an error. If the source Observable calls error, this method will resubscribe to the source Observable for a maximum of count resubscriptions (given as a number parameter) rather than propagating the error call.\n\nArguments:\n\ncount::Int: Number of retry attempts before failing. Optional. Default is -1.\n\nProducing\n\nStream of type <: Subscribable{L} where L refers to type of source stream\n\nExamples\n\nusing Rocket\n\nsource = from(1:3) |> safe() |> map(Int, (d) -> d > 1 ? error(\"Error\") : d) |> rerun(3)\n\nsubscribe!(source, logger())\n;\n\n# output\n[LogActor] Data: 1\n[LogActor] Data: 1\n[LogActor] Data: 1\n[LogActor] Data: 1\n[LogActor] Error: ErrorException(\"Error\")\n\nSee also: AbstractOperator, InferableOperator, catch_error, logger, safe\n\n\n\n\n\n","category":"function"},{"location":"operators/errors/rerun/#Description","page":"rerun","title":"Description","text":"","category":"section"},{"location":"operators/errors/rerun/","page":"rerun","title":"rerun","text":"Any and all items emitted by the source Observable will be emitted by the resulting Observable, even those emitted during failed subscriptions. For example, if an Observable fails at first but emits [1, 2] then succeeds the second time and emits: [1, 2, 3, 4, 5] then the complete stream of emissions and notifications would be: [1, 2, 1, 2, 3, 4, 5, complete].","category":"page"},{"location":"operators/errors/rerun/#See-also","page":"rerun","title":"See also","text":"","category":"section"},{"location":"operators/errors/rerun/","page":"rerun","title":"rerun","text":"Operators","category":"page"},{"location":"observables/types/timer/#observable_timer","page":"Timer","title":"Timer Observable","text":"","category":"section"},{"location":"observables/types/timer/","page":"Timer","title":"Timer","text":"timer","category":"page"},{"location":"observables/types/timer/#Rocket.timer","page":"Timer","title":"Rocket.timer","text":"timer(delay::Int)\ntimer(delay::Int, period::Int)\n\nCreation operator for the TimerObservable. Its like interval(@ref), but you can specify when should the emissions start. timer returns an Observable that emits an infinite sequence of ascending integers, with a constant interval of time, period of your choosing between those emissions. The first emission happens after the specified delay. If period is not specified, the output Observable emits only one value, 0. Otherwise, it emits an infinite sequence.\n\nArguments\n\ndelay: the initial delay time specified as an integer denoting milliseconds to wait before emitting the first value of 0.\nperiod: the minimum period of time between emissions of the subsequent numbers (in milliseconds).\n\nExamples\n\nusing Rocket\n\nsource = timer(0, 50)\n\nsleep(0.075)\nsubscription = subscribe!(source, logger())\nsleep(0.105)\nunsubscribe!(subscription)\n\nclose(source)\n;\n\n# output\n\n[LogActor] Data: 2\n[LogActor] Data: 3\n\n\nSee also: interval, TimerObservable, subscribe!, logger\n\n\n\n\n\n","category":"function"},{"location":"observables/types/timer/","page":"Timer","title":"Timer","text":"TimerObservable","category":"page"},{"location":"observables/types/timer/#Rocket.TimerObservable","page":"Timer","title":"Rocket.TimerObservable","text":"TimerObservable\n\nAn Observable that starts emitting after an delay and emits ever increasing numbers after each period of time thereafter.\n\nParameters\n\ndelay: The initial delay time specified as an integer denoting milliseconds to wait before emitting the first value of 0`.\nperiod: The minimum period of time in milliseconds between emissions of the subsequent numbers.\n\nSee also: timer, Subscribable\n\n\n\n\n\n","category":"type"},{"location":"actors/about/#section_actors","page":"Actor","title":"Actors","text":"","category":"section"},{"location":"actors/about/","page":"Actor","title":"Actor","text":"An Actor is the most primitive unit of computation: it receives a message and performs a computation.","category":"page"},{"location":"actors/about/","page":"Actor","title":"Actor","text":"An actor is analogous to an object in an object-oriented languages. An object receives a message (a method call) and does something depending on which message it receives (the method we are calling). The main difference is that actors are completely isolated from each other, and they will never share memory. It’s also worth mentioning that an actor can maintain a private state that should never be changed directly by another actor.","category":"page"},{"location":"actors/about/","page":"Actor","title":"Actor","text":"For a quick introduction to Actor models, see this article.","category":"page"},{"location":"actors/about/","page":"Actor","title":"Actor","text":"The API of Rocket.jl's Actors is similar to RxJS subscribers.","category":"page"},{"location":"actors/about/#First-example","page":"Actor","title":"First example","text":"","category":"section"},{"location":"actors/about/","page":"Actor","title":"Actor","text":"The following example implements an Actor that retains each received value from an Observable.","category":"page"},{"location":"actors/about/","page":"Actor","title":"Actor","text":"using Rocket\n\nstruct CustomKeepActor <: Actor{Int}\n values::Vector{Int}\n\n CustomKeepActor() = new(Vector{Int}())\nend\n\nRocket.on_next!(actor::CustomKeepActor, data::Int) = push!(actor.values, data)\nRocket.on_error!(actor::CustomKeepActor, err) = error(err)\nRocket.on_complete!(actor::CustomKeepActor) = println(\"Completed!\")\n\nsource = from([ 1, 2, 3 ])\nkeep_actor = CustomKeepActor()\nsubscribe!(source, keep_actor)\n\n# Logs\n# Completed!\n\nprintln(keep_actor.values)\n\n# Logs\n# [1, 2, 3]","category":"page"},{"location":"actors/about/","page":"Actor","title":"Actor","text":"An actor may be not interested in the values itself, but merely the completion of an event. In this case, Rocket.jl provides a CompletionActor abstract type. See also NextActor and ErrorActor.","category":"page"},{"location":"actors/about/","page":"Actor","title":"Actor","text":"using Rocket\n\nstruct CompletionNotificationActor <: CompletionActor{Int} end\n\nRocket.on_complete!(::CompletionNotificationActor) = println(\"Completed!\")\n\nsource = from([ 1, 2, 3 ])\nsubscribe!(source, CompletionNotificationActor());\n\n# Logs\n# Completed","category":"page"},{"location":"actors/about/","page":"Actor","title":"Actor","text":"It is also possible to use Julia's multiple dispatch feature and dispatch on type of the event","category":"page"},{"location":"actors/about/","page":"Actor","title":"Actor","text":"using Rocket\n\nstruct MyCustomActor <: NextActor{Any} end\n\nRocket.on_next!(::MyCustomActor, data::Int) = println(\"Int: $data\")\nRocket.on_next!(::MyCustomActor, data::Float64) = println(\"Float64: $data\")\nRocket.on_next!(::MyCustomActor, data) = println(\"Something else: $data\")\n\nsource = from([ 1, 1.0, \"string\" ])\nsubscribe!(source, MyCustomActor());\n\n# Logs\n# Int: 1\n# Float64: 1.0\n# Something else: string\n","category":"page"},{"location":"actors/about/#Lambda-actor","page":"Actor","title":"Lambda actor","text":"","category":"section"},{"location":"actors/about/","page":"Actor","title":"Actor","text":"For debugging purposes it may be convenient to work with a LambdaActor. This provides an interface that defines callbacks for \"next\", \"error\" and \"complete\" events. But this generic actor does not allow to dispatch on type of the event.","category":"page"},{"location":"actors/about/","page":"Actor","title":"Actor","text":"using Rocket\n\nsource = from([1, 2, 3])\n\nsubscribe!(source, lambda(\n on_next = (d) -> println(d),\n on_error = (e) -> error(e),\n on_complete = () -> println(\"Completed\")\n))\n\n# Logs\n# 1\n# 2\n# 3\n# Completed","category":"page"},{"location":"actors/about/#Function-actor","page":"Actor","title":"Function actor","text":"","category":"section"},{"location":"actors/about/","page":"Actor","title":"Actor","text":"Sometimes it is convenient to pass only on_next callback. Rocket.jl provides a FunctionActor which automatically converts any function object passed in the subscribe! function to a proper actor which listens only for data events, throws an exception on error event and ignores completion message.","category":"page"},{"location":"actors/about/","page":"Actor","title":"Actor","text":"using Rocket\n\nsource = from([1, 2, 3])\n\nsubscribe!(source, (d) -> println(d))\n\n# Logs\n# 1\n# 2\n# 3","category":"page"},{"location":"observables/types/single/#observable_single","page":"Single","title":"Single Observable","text":"","category":"section"},{"location":"observables/types/single/","page":"Single","title":"Single","text":"of","category":"page"},{"location":"observables/types/single/#Rocket.of","page":"Single","title":"Rocket.of","text":"of(x; scheduler::H = AsapScheduler()) where { H <: AbstractScheduler }\n\nCreation operator for the SingleObservable that emits a single value x and then completes.\n\nArguments\n\nx: value to be emmited before completion\n\nExamples\n\nusing Rocket\n\nsource = of(1)\nsubscribe!(source, logger())\n;\n\n# output\n\n[LogActor] Data: 1\n[LogActor] Completed\n\n\nSee also: SingleObservable, subscribe!, logger\n\n\n\n\n\n","category":"function"},{"location":"observables/types/single/","page":"Single","title":"Single","text":"SingleObservable","category":"page"},{"location":"observables/types/single/#Rocket.SingleObservable","page":"Single","title":"Rocket.SingleObservable","text":"SingleObservable{D, H}(value::D, scheduler::H)\n\nSingleObservable wraps single value of type D into a observable.\n\nConstructor arguments\n\nvalue: a single value to emit\nscheduler: scheduler-like object\n\nSee also: of, Subscribable\n\n\n\n\n\n","category":"type"},{"location":"observables/types/interval/#observable_interval","page":"Interval","title":"Interval Observable","text":"","category":"section"},{"location":"observables/types/interval/","page":"Interval","title":"Interval","text":"interval","category":"page"},{"location":"observables/types/interval/#Rocket.interval","page":"Interval","title":"Rocket.interval","text":"interval(period::Union{Int, Nothing} = nothing)\n\nCreation operator for the TimerObservable. interval returns an Observable that emits an infinite sequence of ascending integers, with a constant interval of time of your choosing between those emissions. The first emission is not sent immediately, but only after the first period has passed.\n\nArguments\n\ninterval: the interval size in milliseconds\n\nExamples\n\nusing Rocket\n\nsource = interval(50)\n\nsubscription = subscribe!(source, logger())\nsleep(0.215)\nunsubscribe!(subscription)\nsleep(0.215)\nsubscription = subscribe!(source, logger())\nsleep(0.185)\nunsubscribe!(subscription)\n\nclose(source)\n;\n\n# output\n\n[LogActor] Data: 0\n[LogActor] Data: 1\n[LogActor] Data: 2\n[LogActor] Data: 3\n[LogActor] Data: 8\n[LogActor] Data: 9\n[LogActor] Data: 10\n\nSee also: timer, TimerObservable, Subscribable\n\n\n\n\n\n","category":"function"},{"location":"operators/filtering/take_until/#operator_take_until","page":"take_until","title":"TakeUntil Operator","text":"","category":"section"},{"location":"operators/filtering/take_until/","page":"take_until","title":"take_until","text":"take_until","category":"page"},{"location":"operators/filtering/take_until/#Rocket.take_until","page":"take_until","title":"Rocket.take_until","text":"take_until(notifier::S)\n\nCreates a take operator, which returns an Observable that emits the values emitted by the source Observable until a notifier Observable emits a value or a completion event.\n\nArguments\n\nnotifier::S: The Observable whose first emitted value will cause the output Observable of take_until to stop emitting values from the source Observable.\n\nProducing\n\nStream of type <: Subscribable{L} where L refers to type of source stream\n\nExamples\n\nusing Rocket\n\nsource = interval(100) |> take_until(timer(1000))\n\nsubscribe!(source, logger())\n;\n\n# output\n\n[LogActor] Data: 0\n[LogActor] Data: 1\n[LogActor] Data: 2\n[LogActor] Data: 3\n[LogActor] Data: 4\n[LogActor] Data: 5\n[LogActor] Data: 6\n[LogActor] Data: 7\n[LogActor] Data: 8\n[LogActor] Completed\n\nusing Rocket \n\nsource = interval(100)\n\nsubscribe!(source |> take_until(source |> filter(i -> i == 3)), logger())\n;\n\n# output \n\n[LogActor] Data: 0\n[LogActor] Data: 1\n[LogActor] Data: 2\n[LogActor] Completed\n\nSee also: AbstractOperator, InferableOperator, ProxyObservable, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/filtering/take_until/#Description","page":"take_until","title":"Description","text":"","category":"section"},{"location":"operators/filtering/take_until/","page":"take_until","title":"take_until","text":"take_until subscribes and begins mirroring the source Observable. It also monitors a second Observable, notifier that you provide. If the notifier emits a value, the output Observable stops mirroring the source Observable and completes. If the notifier doesn't emit any value and completes then take_until also completes.","category":"page"},{"location":"operators/filtering/take_until/#See-also","page":"take_until","title":"See also","text":"","category":"section"},{"location":"operators/filtering/take_until/","page":"take_until","title":"take_until","text":"Operators","category":"page"},{"location":"operators/multicasting/share/#operator_share","page":"share","title":"Share Operators","text":"","category":"section"},{"location":"operators/multicasting/share/","page":"share","title":"share","text":"share\nshare_replay\nshare_recent","category":"page"},{"location":"operators/multicasting/share/#Rocket.share","page":"share","title":"Rocket.share","text":"share(; scheduler::H = AsapScheduler()) where { H <: AbstractScheduler }\n\nshare() is a shortcut for publish() + ref_count()\n\nSee also: AbstractOperator, multicast, publish, ref_count\n\n\n\n\n\n","category":"function"},{"location":"operators/multicasting/share/#Rocket.share_replay","page":"share","title":"Rocket.share_replay","text":"share_replay(size::Int; scheduler::H = AsapScheduler()) where { H <: AbstractScheduler }\n\nshare_replay(size) is a shortcut for publish_replay(size) + ref_count()\n\nSee also: AbstractOperator, multicast, publish, publish_replay, ref_count\n\n\n\n\n\n","category":"function"},{"location":"operators/multicasting/share/#Rocket.share_recent","page":"share","title":"Rocket.share_recent","text":"share_recent(; scheduler::H = AsapScheduler()) where { H <: AbstractScheduler }\n\nshare_recent() is a shortcut for publish_recent() + ref_count()\n\nSee also: AbstractOperator, multicast, publish, publish_recent, ref_count\n\n\n\n\n\n","category":"function"},{"location":"operators/multicasting/share/#See-also","page":"share","title":"See also","text":"","category":"section"},{"location":"operators/multicasting/share/","page":"share","title":"share","text":"Operators","category":"page"},{"location":"operators/transformation/concat_map/#operator_concat_map","page":"concat_map","title":"ConcatMap Operator","text":"","category":"section"},{"location":"operators/transformation/concat_map/","page":"concat_map","title":"concat_map","text":"concat_map","category":"page"},{"location":"operators/transformation/concat_map/#Rocket.concat_map","page":"concat_map","title":"Rocket.concat_map","text":"concat_map(::Type{R}, mappingFn::F = identity) where { R, F <: Function }\n\nCreates a concat_map operator, which returns an Observable that emits the result of applying the projection function to each item emitted by the source Observable and taking values from each projected inner Observable sequentially. Essentialy it projects each source value to an Observable which is merged in the output Observable, in a serialized fashion waiting for each one to complete before merging the next.\n\nArguments\n\n::Type{R}: the type of data of output Observables after projection with mappingFn\nmappingFn::F: projection function with (data) -> Observable{R} signature\n\nProducing\n\nStream of type <: Subscribable{R}\n\nExamples\n\nusing Rocket\n\nsource = from([ 0, 0 ]) |> concat_map(Int, d -> from([ 1, 2, 3 ], scheduler = AsyncScheduler(0)))\nsubscribe!(source, logger())\n;\n\n# output\n\n[LogActor] Data: 1\n[LogActor] Data: 2\n[LogActor] Data: 3\n[LogActor] Data: 1\n[LogActor] Data: 2\n[LogActor] Data: 3\n[LogActor] Completed\n\nSee also: AbstractOperator, RightTypedOperator, ProxyObservable, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/transformation/concat_map/#Description","page":"concat_map","title":"Description","text":"","category":"section"},{"location":"operators/transformation/concat_map/","page":"concat_map","title":"concat_map","text":"Returns an Observable that emits items based on applying a function that you supply to each item emitted by the source Observable, where that function returns an (so-called \"inner\") Observable. Each new inner Observable is concatenated with the previous inner Observable.","category":"page"},{"location":"operators/transformation/concat_map/","page":"concat_map","title":"concat_map","text":"warning: Warning\nIf source values arrive endlessly and faster than their corresponding inner Observables can complete, it will result in memory issues as inner Observables amass in an unbounded buffer waiting for their turn to be subscribed to.","category":"page"},{"location":"operators/transformation/concat_map/","page":"concat_map","title":"concat_map","text":"note: Note\nconcat_map is equivalent to merge_map with concurrency parameter set to 1.","category":"page"},{"location":"operators/transformation/concat_map/#See-also","page":"concat_map","title":"See also","text":"","category":"section"},{"location":"operators/transformation/concat_map/","page":"concat_map","title":"concat_map","text":"Operators, merge_map","category":"page"},{"location":"subjects/types/pending/#subject_pending","page":"Pending","title":"PendingSubject","text":"","category":"section"},{"location":"subjects/types/pending/","page":"Pending","title":"Pending","text":"PendingSubject\nPendingSubjectFactory","category":"page"},{"location":"subjects/types/pending/#Rocket.PendingSubject","page":"Pending","title":"Rocket.PendingSubject","text":"PendingSubject(::Type{D}) where D\nPendingSubject(::Type{D}, factory::F) where { D, F <: AbstractFactory }\nPendingSubject(::Type{D}, subject::S) where { D, S }\n\nA variant of Subject that emits its last value on completion. Reemits last value on further subscriptions and then completes.\n\nSee also: PendingSubjectFactory, Subject, SubjectFactory\n\n\n\n\n\n","category":"function"},{"location":"subjects/types/pending/#Rocket.PendingSubjectFactory","page":"Pending","title":"Rocket.PendingSubjectFactory","text":"PendingSubjectFactory(factory::F) where { F <: AbstractSubjectFactory }\nPendingSubjectFactory(; scheduler::H = AsapScheduler()) where { H <: AbstractScheduler }\n\nA variant of SubjectFactory that creates an instance of PendingSubject.\n\nSee also: SubjectFactory, AbstractSubjectFactory, PendingSubject, Subject\n\n\n\n\n\n","category":"function"},{"location":"subjects/types/pending/#Description","page":"Pending","title":"Description","text":"","category":"section"},{"location":"subjects/types/pending/","page":"Pending","title":"Pending","text":"A variant of Subject that only emits a value when it completes. It will emit its latest value to all its observers on completion. It will reemit its latest value to all new observers on further subscription and then complete. It is not possible to overwrite last value after completion.","category":"page"},{"location":"subjects/types/pending/#Examples","page":"Pending","title":"Examples","text":"","category":"section"},{"location":"subjects/types/pending/","page":"Pending","title":"Pending","text":"using Rocket\n\nsubject = PendingSubject(Int)\n\nsubscription1 = subscribe!(subject, logger(\"1\"))\n\nnext!(subject, 1) # Nothing is logged\nnext!(subject, 2) # Nothing is logged\n\nsubscription2 = subscribe!(subject, logger(\"2\"))\n\nnext!(subject, 3) # Nothing is logged\n\ncomplete!(subject)\n\nsubscription3 = subscribe!(subject, logger(\"3\"))\n\n[1] Data: 3\n[2] Data: 3\n[1] Completed\n[2] Completed\n[3] Data: 3\n[3] Completed","category":"page"},{"location":"operators/filtering/filter_type/#operator_filter_type","page":"filter_type","title":"FilterType Operator","text":"","category":"section"},{"location":"operators/filtering/filter_type/","page":"filter_type","title":"filter_type","text":"filter_type","category":"page"},{"location":"operators/filtering/filter_type/#Rocket.filter_type","page":"filter_type","title":"Rocket.filter_type","text":"filter_type(type::Type{ T }) where { T }\n\nCreates a filter_type operator, which filters items of the source Observable by emitting only those that match a specified T type with a <: operator. This operator is a more efficient version of filter(v -> v <: T) |> map(T, v -> v) operators chain.\n\nProducing\n\nStream of type <: Subscribable{ T } where T refers to type argument\n\nExamples\n\nusing Rocket\n\nsource = from(Real[ 1, 2.0, 3, 4.0, 5, 6.0 ])\nsubscribe!(source |> filter_type(Int), logger())\n;\n\n# output\n\n[LogActor] Data: 1\n[LogActor] Data: 3\n[LogActor] Data: 5\n[LogActor] Completed\n\nSee also: AbstractOperator, InferableOperator, ProxyObservable, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/filtering/filter_type/#See-also","page":"filter_type","title":"See also","text":"","category":"section"},{"location":"operators/filtering/filter_type/","page":"filter_type","title":"filter_type","text":"Operators","category":"page"},{"location":"operators/filtering/filter/#operator_filter","page":"filter","title":"Filter Operator","text":"","category":"section"},{"location":"operators/filtering/filter/","page":"filter","title":"filter","text":"filter","category":"page"},{"location":"operators/filtering/filter/#Base.filter","page":"filter","title":"Base.filter","text":"filter(filterFn::F) where { F <: Function }\n\nCreates a filter operator, which filters items of the source Observable by emitting only those that satisfy a specified filterFn predicate.\n\nProducing\n\nStream of type <: Subscribable{L} where L refers to type of source stream\n\nArguments\n\nfilterFn::F: predicate function with (data::T) -> Bool signature\n\nExamples\n\nusing Rocket\n\nsource = from([ 1, 2, 3, 4, 5, 6 ])\nsubscribe!(source |> filter((d) -> d % 2 == 0), logger())\n;\n\n# output\n\n[LogActor] Data: 2\n[LogActor] Data: 4\n[LogActor] Data: 6\n[LogActor] Completed\n\nSee also: AbstractOperator, InferableOperator, ProxyObservable, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/filtering/filter/#Description","page":"filter","title":"Description","text":"","category":"section"},{"location":"operators/filtering/filter/","page":"filter","title":"filter","text":"Like filter(f, array), this operator takes values from the source Observable, passes them through a predicate function and only emits those values that yielded true.","category":"page"},{"location":"operators/filtering/filter/#See-also","page":"filter","title":"See also","text":"","category":"section"},{"location":"operators/filtering/filter/","page":"filter","title":"filter","text":"Operators","category":"page"},{"location":"operators/join/with_latest/#operator_with_latest","page":"with_latest","title":"WithLatest Operator","text":"","category":"section"},{"location":"operators/join/with_latest/","page":"with_latest","title":"with_latest","text":"with_latest","category":"page"},{"location":"operators/join/with_latest/#Rocket.with_latest","page":"with_latest","title":"Rocket.with_latest","text":"with_latest(sources...)\n\nCreates a with_latest operator, which combines the source Observable with other Observables to create an Observable whose values are calculated from the latest values of each, only when the source emits.\n\nExamples\n\nusing Rocket\n\nsource = of(1)\nsubscribe!(source |> with_latest(from(1:5)), logger())\n;\n\n# output\n\n[LogActor] Data: (1, 5)\n[LogActor] Completed\n\nSee also: AbstractOperator, InferableOperator\n\n\n\n\n\n","category":"function"},{"location":"operators/join/with_latest/#See-also","page":"with_latest","title":"See also","text":"","category":"section"},{"location":"operators/join/with_latest/","page":"with_latest","title":"with_latest","text":"Operators","category":"page"},{"location":"operators/join/about/#Join-category","page":"Join category","title":"Join category","text":"","category":"section"},{"location":"operators/join/about/","page":"Join category","title":"Join category","text":"There are operators for different purposes, and they may be categorized as: creation, transformation, filtering, joining, multicasting, error handling, utility, etc. In the following list you will find all the operators organized in join category.","category":"page"},{"location":"operators/join/about/","page":"Join category","title":"Join category","text":"with_latest","category":"page"},{"location":"operators/join/about/#See-also","page":"Join category","title":"See also","text":"","category":"section"},{"location":"operators/join/about/","page":"Join category","title":"Join category","text":"Operators","category":"page"},{"location":"subjects/types/behavior/#subject_behavior","page":"Behavior","title":"BehaviorSubject","text":"","category":"section"},{"location":"subjects/types/behavior/","page":"Behavior","title":"Behavior","text":"BehaviorSubject\nBehaviorSubjectFactory","category":"page"},{"location":"subjects/types/behavior/#Rocket.BehaviorSubject","page":"Behavior","title":"Rocket.BehaviorSubject","text":"BehaviorSubject(value::D) where D\nBehaviorSubject(::Type{D}, value) where D\nBehaviorSubject(::Type{D}, value, factory::F) where { D, F <: AbstractSubjectFactory }\nBehaviorSubject(::Type{D}, value, subject::S) where { D, S }\n\nA variant of Subject that requires an initial value and emits its current value whenever it is subscribed to.\n\nSee also: BehaviorSubjectFactory, Subject, SubjectFactory\n\n\n\n\n\n","category":"function"},{"location":"subjects/types/behavior/#Rocket.BehaviorSubjectFactory","page":"Behavior","title":"Rocket.BehaviorSubjectFactory","text":"BehaviorSubjectFactory(default, factory::F) where { F <: AbstractSubjectFactory }\nBehaviorSubjectFactory(default; scheduler::H = AsapScheduler()) where { H <: AbstractScheduler }\n\nA variant of SubjectFactory that creates an instance of ReplaySubject.\n\nSee also: SubjectFactory, AbstractSubjectFactory, BehaviorSubject, Subject\n\n\n\n\n\n","category":"function"},{"location":"subjects/types/behavior/#Description","page":"Behavior","title":"Description","text":"","category":"section"},{"location":"subjects/types/behavior/","page":"Behavior","title":"Behavior","text":"One of the variants of Subjects is the BehaviorSubject, which has a notion of \"the current value\". It stores the latest value emitted to its consumers, and whenever a new Observer subscribes, it will immediately receive the \"current value\" from the BehaviorSubject.","category":"page"},{"location":"subjects/types/behavior/","page":"Behavior","title":"Behavior","text":"note: Note\nBehaviorSubjects are useful for representing \"values over time\". For instance, an event stream of birthdays is a Subject, but the stream of a person's age would be a BehaviorSubject.","category":"page"},{"location":"subjects/types/behavior/#Examples","page":"Behavior","title":"Examples","text":"","category":"section"},{"location":"subjects/types/behavior/","page":"Behavior","title":"Behavior","text":"In the following example, the BehaviorSubject is initialized with the value 0 which the first Observer receives when it subscribes. The second Observer receives the value 2 even though it subscribed after the value 2 was sent.","category":"page"},{"location":"subjects/types/behavior/","page":"Behavior","title":"Behavior","text":"using Rocket\n\nsubject = BehaviorSubject(Int, 0)\n\nsubscription1 = subscribe!(subject, logger(\"1\"))\n\nnext!(subject, 1)\nnext!(subject, 2)\n\nsubscription2 = subscribe!(subject, logger(\"2\"))\n\nnext!(subject, 3)\n\nunsubscribe!(subscription1)\nunsubscribe!(subscription2)\n\n// Logs\n// [1] Data: 0\n// [1] Data: 1\n// [1] Data: 2\n// [2] Data: 2\n// [1] Data: 3\n// [2] Data: 3","category":"page"},{"location":"api/operators/#operators_api","page":"Operators","title":"Operators API","text":"","category":"section"},{"location":"api/operators/#How-to-create-a-custom-operator","page":"Operators","title":"How to create a custom operator","text":"","category":"section"},{"location":"api/operators/","page":"Operators","title":"Operators","text":"If you need to write an operator that cannot be made from a combination of existing operators, then you can write a custom operator from scratch.","category":"page"},{"location":"api/operators/","page":"Operators","title":"Operators","text":"Each operator (e.g. MyFancyOperator) needs to either be (1) a subtype of one of abstract OperatorTrait trait types, or (2) define a","category":"page"},{"location":"api/operators/","page":"Operators","title":"Operators","text":"Rocket.as_operator(::Type{<:MyFancyOperator}) = TypedOperatorTrait{T, R}()\n# or\nRocket.as_operator(::Type{<:MyFancyOperator}) = InferableOperatorTrait()","category":"page"},{"location":"api/operators/","page":"Operators","title":"Operators","text":"trait behavior.","category":"page"},{"location":"api/operators/","page":"Operators","title":"Operators","text":"In addition, an operator must implement a specific method for on_call! function with custom logic which has to return another Observable as a result of applying MyFancyOperator to a source.","category":"page"},{"location":"api/operators/","page":"Operators","title":"Operators","text":"Rocket.on_call!(::Type{L}, ::Type{R}, operator::MyFancyOperator, source) where L = # some custom logic here\n\n# or\n# for inferable trait types you have to specify 'right' type with Rocket.operator_right which should specify a type of data of produced Observable\n\nRocket.on_call(::Type{L}, ::Type{R}, operator::MyFancyOperator, source) where L = # some custom logic here\nRocket.operator_right(::MyFancyOperator, ::Type{L}) where L = R # where R should be an actual type, Int or even L itself e.g.\n","category":"page"},{"location":"api/operators/","page":"Operators","title":"Operators","text":"note: Note\nIt is not allowed to modify the source Observable in any way; you have to return a new observable.","category":"page"},{"location":"api/operators/","page":"Operators","title":"Operators","text":"See more examples on custom operators in Traits API section","category":"page"},{"location":"api/operators/","page":"Operators","title":"Operators","text":"note: Note\nIt might be useful to return a ProxyObservable from an on_call! function. ProxyObservable is a special Observable which proxying actors with the source and/or source with actors.","category":"page"},{"location":"api/operators/#operators_api_traits","page":"Operators","title":"Traits","text":"","category":"section"},{"location":"api/operators/","page":"Operators","title":"Operators","text":"OperatorTrait\nas_operator\nTypedOperatorTrait\nLeftTypedOperatorTrait\nRightTypedOperatorTrait\nInferableOperatorTrait\nInvalidOperatorTrait","category":"page"},{"location":"api/operators/#Rocket.OperatorTrait","page":"Operators","title":"Rocket.OperatorTrait","text":"Abstract type for all possible operator traits\n\nSee also: TypedOperatorTrait, LeftTypedOperatorTrait, RightTypedOperatorTrait, InferableOperatorTrait, InvalidOperatorTrait,\n\n\n\n\n\n","category":"type"},{"location":"api/operators/#Rocket.as_operator","page":"Operators","title":"Rocket.as_operator","text":"as_operator(any)\n\nThis function checks operator trait behavior. May be used explicitly to specify operator trait behavior for any object.\n\nSee also: OperatorTrait, AbstractOperator\n\n\n\n\n\n","category":"function"},{"location":"api/operators/#Rocket.TypedOperatorTrait","page":"Operators","title":"Rocket.TypedOperatorTrait","text":"Typed operator trait specifies operator to be statically typed with input and output data types. Typed operator with input type L and output type R can only operate on input Observable with data type L and will always produce an Observable with data type R.\n\nExamples\n\nusing Rocket\n\nstruct MyTypedOperator <: TypedOperator{Int, Int} end\n\nfunction Rocket.on_call!(::Type{Int}, ::Type{Int}, op::MyTypedOperator, source)\n return proxy(Int, source, MyTypedOperatorProxy())\nend\n\nstruct MyTypedOperatorProxy <: ActorProxy end\n\nRocket.actor_proxy!(::Type{Int}, ::MyTypedOperatorProxy, actor::A) where A = MyTypedOperatorProxiedActor{A}(actor)\n\nstruct MyTypedOperatorProxiedActor{A} <: Actor{Int}\n actor :: A\nend\n\nfunction Rocket.on_next!(actor::MyTypedOperatorProxiedActor, data::Int)\n # Do something with a data and/or redirect it to actor.actor\n next!(actor.actor, data + 1)\nend\n\nRocket.on_error!(actor::MyTypedOperatorProxiedActor, err) = error!(actor.actor, err)\nRocket.on_complete!(actor::MyTypedOperatorProxiedActor) = complete!(actor.actor)\n\nsource = from([ 0, 1, 2 ])\nsubscribe!(source |> MyTypedOperator(), logger())\n;\n\n# output\n\n[LogActor] Data: 1\n[LogActor] Data: 2\n[LogActor] Data: 3\n[LogActor] Completed\n\nSee also: OperatorTrait, TypedOperator, OperatorTrait, ProxyObservable, ActorProxy, logger\n\n\n\n\n\n","category":"type"},{"location":"api/operators/#Rocket.LeftTypedOperatorTrait","page":"Operators","title":"Rocket.LeftTypedOperatorTrait","text":"Left typed operator trait specifies operator to be statically typed with input data type. To infer output data type this object should specify a special function operator_right(operator, ::Type{L}) where L which will be used to infer output data type. Left typed operator with input type L can only operate on input Observable with data type L and will always produce an Observable with data type inferred from operator_right(operator, ::Type{L}).\n\nExamples\n\nusing Rocket\n\nstruct CountIntegersOperator <: LeftTypedOperator{Int} end\n\nfunction Rocket.on_call!(::Type{Int}, ::Type{Tuple{Int, Int}}, op::CountIntegersOperator, source)\n return proxy(Tuple{Int, Int}, source, CountIntegersOperatorProxy())\nend\n\nRocket.operator_right(::CountIntegersOperator, ::Type{Int}) = Tuple{Int, Int}\n\nstruct CountIntegersOperatorProxy <: ActorProxy end\n\nRocket.actor_proxy!(::Type{Tuple{Int, Int}}, ::CountIntegersOperatorProxy, actor::A) where A = CountIntegersProxiedActor{A}(0, actor)\n\nmutable struct CountIntegersProxiedActor{A} <: Actor{Int}\n current :: Int\n actor :: A\nend\n\nfunction Rocket.on_next!(actor::CountIntegersProxiedActor, data::Int)\n current = actor.current\n actor.current += 1\n next!(actor.actor, (current, data)) # e.g.\nend\n\nRocket.on_error!(actor::CountIntegersProxiedActor, err) = error!(actor.actor, err)\nRocket.on_complete!(actor::CountIntegersProxiedActor) = complete!(actor.actor)\n\nsource = from([ 0, 0, 0 ])\nsubscribe!(source |> CountIntegersOperator(), logger())\n;\n\n# output\n\n[LogActor] Data: (0, 0)\n[LogActor] Data: (1, 0)\n[LogActor] Data: (2, 0)\n[LogActor] Completed\n\nSee also: OperatorTrait, LeftTypedOperator, operator_right, OperatorTrait, ProxyObservable, ActorProxy, enumerate, logger\n\n\n\n\n\n","category":"type"},{"location":"api/operators/#Rocket.RightTypedOperatorTrait","page":"Operators","title":"Rocket.RightTypedOperatorTrait","text":"Right typed operator trait specifies operator to be statically typed with output data type. It can operate on input Observable with any data type L but will always produce an Observable with data type R.\n\nExamples\n\nusing Rocket\n\nstruct ConvertToFloatOperator <: RightTypedOperator{Float64} end\n\nfunction Rocket.on_call!(::Type{L}, ::Type{Float64}, op::ConvertToFloatOperator, source) where L\n return proxy(Float64, source, ConvertToFloatProxy{L}())\nend\n\nstruct ConvertToFloatProxy{L} <: ActorProxy end\n\nfunction Rocket.actor_proxy!(::Type{Float64}, proxy::ConvertToFloatProxy{L}, actor::A) where { L, A }\n return ConvertToFloatProxyActor{L, A}(actor)\nend\n\nstruct ConvertToFloatProxyActor{L, A} <: Actor{L}\n actor :: A\nend\n\nfunction Rocket.on_next!(actor::ConvertToFloatProxyActor{L}, data::L) where L\n next!(actor.actor, convert(Float64, data)) # e.g.\nend\n\nRocket.on_error!(actor::ConvertToFloatProxyActor, err) = error!(actor.actor, err)\nRocket.on_complete!(actor::ConvertToFloatProxyActor) = complete!(actor.actor)\n\nsource = from([ 1, 2, 3 ])\nsubscribe!(source |> ConvertToFloatOperator(), logger())\n;\n\n# output\n\n[LogActor] Data: 1.0\n[LogActor] Data: 2.0\n[LogActor] Data: 3.0\n[LogActor] Completed\n\nSee also: OperatorTrait, RightTypedOperator, OperatorTrait, ProxyObservable, ActorProxy, logger\n\n\n\n\n\n","category":"type"},{"location":"api/operators/#Rocket.InferableOperatorTrait","page":"Operators","title":"Rocket.InferableOperatorTrait","text":"Inferable operator trait specifies operator to be statically typed neither with input data type nor with output data type. To infer output data type this object should specify a special function operator_right(operator, ::Type{L}) where L where L is input data type which will be used to infer output data type.\n\nusing Rocket\n\nstruct IdentityOperator <: InferableOperator end\n\nfunction Rocket.on_call!(::Type{L}, ::Type{L}, op::IdentityOperator, source) where L\n return proxy(L, source, IdentityProxy())\nend\n\nstruct IdentityProxy <: ActorProxy end\n\nRocket.operator_right(::IdentityOperator, ::Type{L}) where L = L\n\nRocket.actor_proxy!(::Type{L}, proxy::IdentityProxy, actor::A) where L where A = IdentityProxyActor{L, A}(actor)\n\nstruct IdentityProxyActor{L, A} <: Actor{L}\n actor :: A\nend\n\nfunction Rocket.on_next!(actor::IdentityProxyActor{L}, data::L) where L\n next!(actor.actor, data) # e.g.\nend\n\nRocket.on_error!(actor::IdentityProxyActor, err) = error!(actor.actor, err)\nRocket.on_complete!(actor::IdentityProxyActor) = complete!(actor.actor)\n\nsource = from([ 1, 2, 3 ])\nsubscribe!(source |> IdentityOperator(), logger())\n\nsource = from([ 1.0, 2.0, 3.0 ])\nsubscribe!(source |> IdentityOperator(), logger())\n;\n\n# output\n\n[LogActor] Data: 1\n[LogActor] Data: 2\n[LogActor] Data: 3\n[LogActor] Completed\n[LogActor] Data: 1.0\n[LogActor] Data: 2.0\n[LogActor] Data: 3.0\n[LogActor] Completed\n\n\nSee also: OperatorTrait, InferableOperator, operator_right, OperatorTrait, ProxyObservable, ActorProxy, logger\n\n\n\n\n\n","category":"type"},{"location":"api/operators/#Rocket.InvalidOperatorTrait","page":"Operators","title":"Rocket.InvalidOperatorTrait","text":"InvalidOperatorTrait trait specifies special 'invalid' behavior and types with such a trait specification cannot be used as an operator for an observable stream. By default any type has InvalidOperatorTrait trait specification\n\nSee also: OperatorTrait\n\n\n\n\n\n","category":"type"},{"location":"api/operators/#Types","page":"Operators","title":"Types","text":"","category":"section"},{"location":"api/operators/","page":"Operators","title":"Operators","text":"AbstractOperator\nTypedOperator\nLeftTypedOperator\nRightTypedOperator\nInferableOperator\non_call!\noperator_right\nOperatorsComposition","category":"page"},{"location":"api/operators/#Rocket.AbstractOperator","page":"Operators","title":"Rocket.AbstractOperator","text":"Supertype for all operators\n\nSee also: TypedOperator, LeftTypedOperator, RightTypedOperator, InferableOperator\n\n\n\n\n\n","category":"type"},{"location":"api/operators/#Rocket.TypedOperator","page":"Operators","title":"Rocket.TypedOperator","text":"Can be used as a supertype for any operator. Automatically specifies TypedOperatorTrait behavior.\n\nExamples\n\nusing Rocket\n\nstruct MyOperator <: TypedOperator{Float64,String} end\n\nas_operator(MyOperator) === TypedOperatorTrait{Float64,String}()\n\n# output\ntrue\n\nSee also: AbstractOperator, TypedOperatorTrait\n\n\n\n\n\n","category":"type"},{"location":"api/operators/#Rocket.LeftTypedOperator","page":"Operators","title":"Rocket.LeftTypedOperator","text":"Can be used as a supertype for any operator. Automatically specifies LeftTypedOperatorTrait behavior.\n\nExamples\n\nusing Rocket\n\nstruct MyOperator <: LeftTypedOperator{Float64} end\n\nas_operator(MyOperator) === LeftTypedOperatorTrait{Float64}()\n\n# output\ntrue\n\nSee also: AbstractOperator, LeftTypedOperatorTrait, operator_right\n\n\n\n\n\n","category":"type"},{"location":"api/operators/#Rocket.RightTypedOperator","page":"Operators","title":"Rocket.RightTypedOperator","text":"Can be used as a supertype for any operator. Automatically specifies RightTypedOperatorTrait behavior.\n\nExamples\n\nusing Rocket\n\nstruct MyOperator <: RightTypedOperator{Float64} end\n\nas_operator(MyOperator) === RightTypedOperatorTrait{Float64}()\n\n# output\ntrue\n\nSee also: AbstractOperator, RightTypedOperatorTrait\n\n\n\n\n\n","category":"type"},{"location":"api/operators/#Rocket.InferableOperator","page":"Operators","title":"Rocket.InferableOperator","text":"Can be used as a supertype for any operator. Automatically specifies InferableOperatorTrait behavior.\n\nExamples\n\nusing Rocket\n\nstruct MyOperator <: InferableOperator end\n\nas_operator(MyOperator) === InferableOperatorTrait()\n\n# output\ntrue\n\nSee also: AbstractOperator, InferableOperatorTrait, operator_right\n\n\n\n\n\n","category":"type"},{"location":"api/operators/#Rocket.on_call!","page":"Operators","title":"Rocket.on_call!","text":"on_call!(::Type, ::Type, operator, source)\n\nEach operator must implement its own method for on_call! function. This function is used to invoke operator on some Observable and to produce another Observable with new logic (operator specific).\n\nSee also: AbstractOperator\n\n\n\n\n\n","category":"function"},{"location":"api/operators/#Rocket.operator_right","page":"Operators","title":"Rocket.operator_right","text":"operator_right(operator, L)\n\nBoth LeftTypedOperator and InferableOperator must implement its own method for operator_right function. This function is used to infer type of data of output Observable given the type of data of input Observable.\n\nSee also: AbstractOperator, LeftTypedOperator, InferableOperator\n\n\n\n\n\n","category":"function"},{"location":"api/operators/#Rocket.OperatorsComposition","page":"Operators","title":"Rocket.OperatorsComposition","text":"OperatorsComposition(operators)\n\nOperatorsComposition is an object which helps to create a composition of multiple operators. To create a composition of two or more operators overloaded + or |> can be used.\n\nusing Rocket\n\ncomposition = map(Int, (d) -> d ^ 2) + filter(d -> d % 2 == 0)\n\nsource = from(1:5) |> composition\n\nsubscribe!(source, logger())\n;\n\n# output\n\n[LogActor] Data: 4\n[LogActor] Data: 16\n[LogActor] Completed\n\nusing Rocket\n\ncomposition = map(Int, (d) -> d ^ 2) |> filter(d -> d % 2 == 0)\n\nsource = from(1:5) |> composition\n\nsubscribe!(source, logger())\n;\n\n# output\n\n[LogActor] Data: 4\n[LogActor] Data: 16\n[LogActor] Completed\n\n\n\n\n\n","category":"type"},{"location":"api/operators/#Errors","page":"Operators","title":"Errors","text":"","category":"section"},{"location":"api/operators/","page":"Operators","title":"Operators","text":"InvalidOperatorTraitUsageError\nInconsistentSourceOperatorDataTypesError\nMissingOnCallImplementationError\nMissingOperatorRightImplementationError","category":"page"},{"location":"api/operators/#Rocket.InvalidOperatorTraitUsageError","page":"Operators","title":"Rocket.InvalidOperatorTraitUsageError","text":"This error will be thrown if |> pipe operator is called with invalid operator object\n\nSee also: on_call!\n\n\n\n\n\n","category":"type"},{"location":"api/operators/#Rocket.InconsistentSourceOperatorDataTypesError","page":"Operators","title":"Rocket.InconsistentSourceOperatorDataTypesError","text":"This error will be thrown if |> pipe operator is called with inconsistent data type\n\nSee also: on_call!\n\n\n\n\n\n","category":"type"},{"location":"api/operators/#Rocket.MissingOnCallImplementationError","page":"Operators","title":"Rocket.MissingOnCallImplementationError","text":"This error will be thrown if Julia cannot find specific method of on_call! function for a given operator.\n\nSee also: on_call!\n\n\n\n\n\n","category":"type"},{"location":"api/operators/#Rocket.MissingOperatorRightImplementationError","page":"Operators","title":"Rocket.MissingOperatorRightImplementationError","text":"This error will be thrown if Julia cannot find specific method of operator_right function for a given operator.\n\nSee also: operator_right\n\n\n\n\n\n","category":"type"},{"location":"observables/types/faulted/#observable_faulted","page":"Faulted","title":"Faulted Observable","text":"","category":"section"},{"location":"observables/types/faulted/","page":"Faulted","title":"Faulted","text":"faulted","category":"page"},{"location":"observables/types/faulted/#Rocket.faulted","page":"Faulted","title":"Rocket.faulted","text":"faulted(err; scheduler::H = AsapScheduler()) where { H <: AbstractScheduler }\nfaulted(::Type{T}, err; scheduler::H = AsapScheduler()) where { T, H <: AbstractScheduler }\n\nCreation operator for the FaultedObservable that emits no items to the Actor and immediately sends an error notification.\n\nArguments\n\nerr: the particular Error to pass to the error notification.\nT: type of output data source, optional, Any by default\nscheduler: optional, scheduler-like object\n\nExamples\n\nusing Rocket\n\nsource = faulted(\"Error!\")\nsubscribe!(source, logger())\n;\n\n# output\n\n[LogActor] Error: Error!\n\n\nSee also: FaultedObservable, subscribe!\n\n\n\n\n\n","category":"function"},{"location":"observables/types/faulted/","page":"Faulted","title":"Faulted","text":"FaultedObservable","category":"page"},{"location":"observables/types/faulted/#Rocket.FaultedObservable","page":"Faulted","title":"Rocket.FaultedObservable","text":"FaultedObservable{D, H}(err, scheduler::H)\n\nObservable that emits no items to the Actor and just sends an error notification on subscription.\n\nConstructor arguments\n\nerr: error to emit on subscription\nscheduler: scheduler-like object\n\nSee also: faulted\n\n\n\n\n\n","category":"type"},{"location":"operators/multicasting/multicast/#operator_multicast","page":"multicast","title":"Multicast Operator","text":"","category":"section"},{"location":"operators/multicasting/multicast/","page":"multicast","title":"multicast","text":"multicast","category":"page"},{"location":"operators/multicasting/multicast/#Rocket.multicast","page":"multicast","title":"Rocket.multicast","text":"multicast(subject::S) where S\nmulticast(factory::F) where { F <: AbstractSubjectFactory }\n\nThe multicast()operator takes a Subject and uses it to share the source execution. It returns what’s known as aConnectableObservable`, which has a connect() method. It has one simple job - subscribes to the source with the provided subject.\n\nExample\n\nusing Rocket\n\nsubject = Subject(Int)\nsource = from(1:5) |> multicast(subject)\n\nactor1 = logger(\"1\")\nactor2 = logger(\"2\")\n\nsubscription1 = subscribe!(source, actor1)\nsubscription2 = subscribe!(source, actor2)\n\nconnect(source)\n\nunsubscribe!(subscription1)\nunsubscribe!(subscription2)\n;\n\n# output\n\n[1] Data: 1\n[2] Data: 1\n[1] Data: 2\n[2] Data: 2\n[1] Data: 3\n[2] Data: 3\n[1] Data: 4\n[2] Data: 4\n[1] Data: 5\n[2] Data: 5\n[1] Completed\n[2] Completed\n\nSee also: ConnectableObservable, Subject, share, publish\n\n\n\n\n\n","category":"function"},{"location":"operators/multicasting/multicast/#See-also","page":"multicast","title":"See also","text":"","category":"section"},{"location":"operators/multicasting/multicast/","page":"multicast","title":"multicast","text":"Operators","category":"page"},{"location":"operators/transformation/map/#operator_map","page":"map","title":"Map Operator","text":"","category":"section"},{"location":"operators/transformation/map/","page":"map","title":"map","text":"map","category":"page"},{"location":"operators/transformation/map/#Base.map","page":"map","title":"Base.map","text":"map(::Type{R}, mappingFn::F) where { F <: Function }\n\nCreates a map operator, which applies a given mappingFn to each value emmited by the source Observable, and emits the resulting values as an Observable. You have to specify output R type after mappingFn projection.\n\nArguments\n\n::Type{R}: the type of data of transformed value, may be or may not be the same as source type\nmappingFn::Function: transformation function with (data::L) -> R signature, where L is type of data in input source\n\nProducing\n\nStream of type <: Subscribable{R}\n\nExamples\n\nusing Rocket\n\nsource = from([ 1, 2, 3 ])\nsubscribe!(source |> map(Int, (d) -> d ^ 2), logger())\n;\n\n# output\n\n[LogActor] Data: 1\n[LogActor] Data: 4\n[LogActor] Data: 9\n[LogActor] Completed\n\nSee also: AbstractOperator, RightTypedOperator, ProxyObservable, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/transformation/map/#Description","page":"map","title":"Description","text":"","category":"section"},{"location":"operators/transformation/map/","page":"map","title":"map","text":"The map operator, similar to map(f, array), applies a function to each value from the source. It's important to note that the function f is expected to be pure and without any side effects. The map operator is designed to create a copy of the original observable for each new subscriber. It independently executes the f function for each subscriber and doesn't share the resulting value. This might be inconvenient when f involves complex calculations or side effects.","category":"page"},{"location":"operators/transformation/map/","page":"map","title":"map","text":"using Rocket\n\nfunction f(x)\n println(\"Function `f` called\") # Assume heavy calculations or side-effects\n return x + 1\nend\n\nsubject = Subject(Int)\n\nmapped = subject |> map(Int, f)\n\nsubscription1 = subscribe!(mapped, logger())\nsubscription2 = subscribe!(mapped, logger())\n\nnext!(subject, 1)\n\nunsubscribe!(subscription1)\nunsubscribe!(subscription2)\nnothing #hide","category":"page"},{"location":"operators/transformation/map/","page":"map","title":"map","text":"In the example, you'll observe that \"Function f called\" is displayed twice. This happens because each subscriber receives their individual, distinct version of the modified data. To alter this behavior, one can utilize the share() operator. This operator creates only a single copy of the modified observable and shares the computed results.","category":"page"},{"location":"operators/transformation/map/","page":"map","title":"map","text":"mapped_and_shared = mapped |> share()\n\nsubscription1 = subscribe!(mapped_and_shared, logger())\nsubscription2 = subscribe!(mapped_and_shared, logger())\n\nnext!(subject, 1)\n\nunsubscribe!(subscription1)\nunsubscribe!(subscription2)\nnothing #hide","category":"page"},{"location":"operators/transformation/map/","page":"map","title":"map","text":"In this example, \"Function f called\" appears only once, and the computed value is shared between the two subscribers. Note, however, that this behaviour might be confusing in cases where the first subscribers completes the observable till its completion stage. For example:","category":"page"},{"location":"operators/transformation/map/","page":"map","title":"map","text":"mapped_and_shared = from([ 0, 1, 2 ]) |> map(Int, f) |> share()\n\nsubscription1 = subscribe!(mapped_and_shared, logger())\nsubscription2 = subscribe!(mapped_and_shared, logger())\n\nunsubscribe!(subscription1)\nunsubscribe!(subscription2)\nnothing #hide","category":"page"},{"location":"operators/transformation/map/","page":"map","title":"map","text":"In this scenario, the second subscriber doesn't receive any values because the first subscriber exhausts the single shared observable. Once the shared observable is used up, it doesn't produce any further values. This doesn't occur without the share() operator.","category":"page"},{"location":"operators/transformation/map/","page":"map","title":"map","text":"mapped = from([ 0, 1, 2 ]) |> map(Int, f)\n\nsubscription1 = subscribe!(mapped, logger())\nsubscription2 = subscribe!(mapped, logger())\n\nunsubscribe!(subscription1)\nunsubscribe!(subscription2)\nnothing #hide","category":"page"},{"location":"operators/transformation/map/#See-also","page":"map","title":"See also","text":"","category":"section"},{"location":"operators/transformation/map/","page":"map","title":"map","text":"Operators","category":"page"},{"location":"operators/utility/tap_on_complete/#operator_tap_on_complete","page":"tap_on_complete","title":"TapOnComplete Operator","text":"","category":"section"},{"location":"operators/utility/tap_on_complete/","page":"tap_on_complete","title":"tap_on_complete","text":"tap_on_complete","category":"page"},{"location":"operators/utility/tap_on_complete/#Rocket.tap_on_complete","page":"tap_on_complete","title":"Rocket.tap_on_complete","text":"tap_on_complete(tapFn::F) where { F <: Function }\n\nCreates a tap operator, which performs a side effect for only complete emission on the source Observable, but return an Observable that is identical to the source.\n\nArguments\n\ntapFn::Function: side-effect tap function with () -> Nothing signature\n\nProducing\n\nStream of type <: Subscribable{L} where L refers to type of source stream\n\nExamples\n\nusing Rocket\n\nsource = from([ 1, 2, 3 ])\nsubscribe!(source |> tap_on_complete(() -> println(\"Complete event received\")), logger())\n;\n\n# output\n\n[LogActor] Data: 1\n[LogActor] Data: 2\n[LogActor] Data: 3\n[LogActor] Completed\nComplete event received\n\n\nSee also: tap_on_subscribe, tap, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/utility/tap_on_complete/#Description","page":"tap_on_complete","title":"Description","text":"","category":"section"},{"location":"operators/utility/tap_on_complete/","page":"tap_on_complete","title":"tap_on_complete","text":"Returns an Observable that resembles the source Observable, but modifies it so that the provided Observer is called to perform a side effect on complete event emission by the source.","category":"page"},{"location":"operators/utility/tap_on_complete/","page":"tap_on_complete","title":"tap_on_complete","text":"This operator is useful for debugging your Observables, verifying correctness, or performing other side effects.","category":"page"},{"location":"operators/utility/tap_on_complete/","page":"tap_on_complete","title":"tap_on_complete","text":"Note: this operator differs from a subscribe on the Observable. If the Observable returned by tap_on_complete is not subscribed, the side effects specified by the Observer will never happen. tap_on_complete therefore simply spies on future execution, it does not trigger an execution to happen like subscribe does.","category":"page"},{"location":"operators/utility/tap_on_complete/#See-also","page":"tap_on_complete","title":"See also","text":"","category":"section"},{"location":"operators/utility/tap_on_complete/","page":"tap_on_complete","title":"tap_on_complete","text":"Operators","category":"page"},{"location":"observables/types/combined_updates/#observable_combined_updates","page":"Combined Updates","title":"CombinedUpdates Observable","text":"","category":"section"},{"location":"observables/types/combined_updates/","page":"Combined Updates","title":"Combined Updates","text":"combineLatestUpdates","category":"page"},{"location":"observables/types/combined_updates/#Rocket.combineLatestUpdates","page":"Combined Updates","title":"Rocket.combineLatestUpdates","text":"combineLatestUpdates(sources...; strategy = PushEach())\ncombineLatestUpdates(sources::S, strategy::G = PushEach()) where { S <: Tuple, U }\n\ncombineLatestUpdates is a more effiecient version of combineLatest(sources) + map_to(sources) operators chain.\n\nArguments\n\nsources: input sources\nstrategy: optional update strategy for batching new values together\n\nNote: combineLatestUpdates() completes immediately if sources are empty.\n\nSee also: Subscribable, subscribe!, PushEach, PushEachBut, PushNew, PushNewBut, PushStrategy\n\n\n\n\n\n","category":"function"},{"location":"observables/types/combined/#observable_combined","page":"Combined","title":"Combined Observable","text":"","category":"section"},{"location":"observables/types/combined/","page":"Combined","title":"Combined","text":"combineLatest\nPushEach\nPushEachBut\nPushNew\nPushNewBut\nPushStrategy","category":"page"},{"location":"observables/types/combined/#Rocket.combineLatest","page":"Combined","title":"Rocket.combineLatest","text":"combineLatest(sources...; strategy = PushEach())\ncombineLatest(sources::S, strategy::G = PushEach()) where { S <: Tuple, U }\n\nCombines multiple Observables to create an Observable whose values are calculated from the latest values of each of its input Observables. Accept optimal update strategy object.\n\nArguments\n\nsources: input sources\nstrategy: optional update strategy for batching new values together\n\nNote: combineLatest() completes immediately if sources are empty.\n\nExamples\n\nusing Rocket\n\nlatest = combineLatest(of(1), from(2:5))\n\nsubscribe!(latest, logger())\n;\n\n# output\n\n[LogActor] Data: (1, 2)\n[LogActor] Data: (1, 3)\n[LogActor] Data: (1, 4)\n[LogActor] Data: (1, 5)\n[LogActor] Completed\n\nusing Rocket\n\nlatest = combineLatest(of(1) |> async(0), from(2:5) |> async(0), strategy = PushNew())\n\nsubscribe!(latest, logger())\n;\n\n# output\n\n[LogActor] Data: (1, 2)\n[LogActor] Completed\n\nSee also: Subscribable, subscribe!, PushEach, PushEachBut, PushNew, PushNewBut, PushStrategy\n\n\n\n\n\n","category":"function"},{"location":"observables/types/combined/#Rocket.PushEach","page":"Combined","title":"Rocket.PushEach","text":"PushEach\n\nPushEach update strategy specifies the strategy to emit new value each time an inner observable emit a new value\n\nSee also: combineLatest, PushEachBut, PushNew, PushNewBut, PushStrategy\n\n\n\n\n\n","category":"type"},{"location":"observables/types/combined/#Rocket.PushEachBut","page":"Combined","title":"Rocket.PushEachBut","text":"PushEachBut{I}\n\nPushEachBut update strategy specifies the strategy to emit new value if and only if an inner observable with index I have a new value\n\nSee also: combineLatest, PushEach, PushNew, PushNewBut, PushStrategy\n\n\n\n\n\n","category":"type"},{"location":"observables/types/combined/#Rocket.PushNew","page":"Combined","title":"Rocket.PushNew","text":"PushNew\n\nPushNew update strategy specifies the strategy to emit new value if and only if all inner observables have a new value\n\nSee also: combineLatest, PushEach, PushEachBut, PushNewBut, PushStrategy\n\n\n\n\n\n","category":"type"},{"location":"observables/types/combined/#Rocket.PushNewBut","page":"Combined","title":"Rocket.PushNewBut","text":"PushNewBut{I}\n\nPushNewBut{I} update strategy specifies the strategy to emit new value if and only if all inner observables except with index I have a new value\n\nSee also: combineLatest, PushEach, PushEachBut, PushNew, PushStrategy\n\n\n\n\n\n","category":"type"},{"location":"observables/types/combined/#Rocket.PushStrategy","page":"Combined","title":"Rocket.PushStrategy","text":"PushStrategy(strategy::BitArray{1})\n\nPushStrategy update strategy specifies the strategy to emit new value if and only if all inner observables with index such that strategy[index] = false have a new value\n\nSee also: combineLatest, PushEach, PushEachBut, PushNew, PushNewBut, collectLatest\n\n\n\n\n\n","category":"type"},{"location":"observables/types/combined/#Description","page":"Combined","title":"Description","text":"","category":"section"},{"location":"observables/types/combined/","page":"Combined","title":"Combined","text":"combineLatest combines the values from all Observables in its arguments. This is done by subscribing to each Observable in order and, whenever an Observable emits, collecting a tuple of the most recent values from each Observable (in order). If you pass n Observables to combineLatest, the returned Observable will always emit an ordered tuple of n values.","category":"page"},{"location":"observables/types/combined/","page":"Combined","title":"Combined","text":"To ensure that the output tuple has a consistent length, combineLatest waits for all input Observables to emit at least once before it starts emitting results. This means that if some Observable emits values before other Observables started emitting, all these values but the last will be lost. On the other hand, if some Observable does not emit a value but completes, the resulting Observable will complete simultaneously without emitting anything. Furthermore, if some input Observable does not emit any value and never completes, combineLatest will also never emit and never complete.","category":"page"},{"location":"observables/types/combined/","page":"Combined","title":"Combined","text":"If at least one Observable was passed to combineLatest and all passed Observables emitted, then the resulting Observable will complete when all combined streams complete. So even if some Observable completes, the result of combineLatest will still emit values when the other Observables do. In case of a completed Observable, its value will now remain to be the last emitted value. On the other hand, if any Observable errors, combineLatest will also immediately error.","category":"page"},{"location":"observables/types/combined/","page":"Combined","title":"Combined","text":"It is possible to change default update/complete strategy behaviour with an optional strategy object.","category":"page"},{"location":"operators/filtering/about/#Filtering-category","page":"About filtering operators","title":"Filtering category","text":"","category":"section"},{"location":"operators/filtering/about/","page":"About filtering operators","title":"About filtering operators","text":"There are operators for different purposes, and they may be categorized as: creation, transformation, filtering, joining, multicasting, error handling, utility, etc. In the following list you will find all the operators organized in filtering category.","category":"page"},{"location":"operators/filtering/about/","page":"About filtering operators","title":"About filtering operators","text":"filter\nfilter_type\ntake\ntake_until\nfirst\nlast\nfind\nfind_index\nignore","category":"page"},{"location":"operators/filtering/about/#See-also","page":"About filtering operators","title":"See also","text":"","category":"section"},{"location":"operators/filtering/about/","page":"About filtering operators","title":"About filtering operators","text":"Operators","category":"page"},{"location":"observables/types/connectable/#observable_connectable","page":"Connectable","title":"Connectable Observable","text":"","category":"section"},{"location":"observables/types/connectable/","page":"Connectable","title":"Connectable","text":"connectable","category":"page"},{"location":"observables/types/connectable/#Rocket.connectable","page":"Connectable","title":"Rocket.connectable","text":"connectable(subject::J, source::S) where J where S\n\nCreates a ConnectableObservable with a given subject object and a source observable.\n\nExample\n\nusing Rocket\n\nc = connectable(Subject(Int; scheduler = AsapScheduler()), from(1:3))\n\nsubscribe!(c, logger());\n\nconnect(c);\n;\n\n# output\n\n[LogActor] Data: 1\n[LogActor] Data: 2\n[LogActor] Data: 3\n[LogActor] Completed\n\n\nSee also: ConnectableObservable, connect, subscribe!\n\n\n\n\n\n","category":"function"},{"location":"observables/types/connectable/","page":"Connectable","title":"Connectable","text":"connect","category":"page"},{"location":"observables/types/connectable/#Rocket.connect","page":"Connectable","title":"Rocket.connect","text":"connect(connectable::ConnectableObservable)\n\nWhen connect is called, the subject passed to the multicast operator is subscribed to the source and the subject’s observers receive the multicast notifications, which fits our basic mental model of stream multicasting. Returns a subscription.\n\nSee also: connectable, ConnectableObservable\n\n\n\n\n\n","category":"function"},{"location":"observables/types/connectable/","page":"Connectable","title":"Connectable","text":"ConnectableObservable","category":"page"},{"location":"observables/types/connectable/#Rocket.ConnectableObservable","page":"Connectable","title":"Rocket.ConnectableObservable","text":"ConnectableObservable{D}(subject, source)\n\nA connectable observable encapsulates the multicasting infrastructure with provided subject, but does not immediately subscribe to the source. It subscribes to the source when its connect method is called.\n\nSee also: connect, Subscribable\n\n\n\n\n\n","category":"type"},{"location":"operators/utility/tap_on_unsubscribe/#operator_tap_on_unsubscribe","page":"tap_on_unsubscribe","title":"TapOnUnsubscribe Operator","text":"","category":"section"},{"location":"operators/utility/tap_on_unsubscribe/","page":"tap_on_unsubscribe","title":"tap_on_unsubscribe","text":"TapBeforeUnsubscription\nTapAfterUnsubscription\ntap_on_unsubscribe","category":"page"},{"location":"operators/utility/tap_on_unsubscribe/#Rocket.TapBeforeUnsubscription","page":"tap_on_unsubscribe","title":"Rocket.TapBeforeUnsubscription","text":"TapBeforeUnsubscription\n\nOne of the strategies for tap_on_unsubscribe operator. With TapBeforeUnubscription tap callback will be called before actual unsubscription.\n\nSee also: tap_on_unsubscribe, TapAfterUnsubscription\n\n\n\n\n\n","category":"type"},{"location":"operators/utility/tap_on_unsubscribe/#Rocket.TapAfterUnsubscription","page":"tap_on_unsubscribe","title":"Rocket.TapAfterUnsubscription","text":"TapAfterUnsubscription\n\nOne of the strategies for tap_on_unsubscribe operator. With TapBeforeUnsubscription tap callback will be called after actual unsubscription.\n\nSee also: tap_on_unsubscribe, TapBeforeUnsubscription\n\n\n\n\n\n","category":"type"},{"location":"operators/utility/tap_on_unsubscribe/#Rocket.tap_on_unsubscribe","page":"tap_on_unsubscribe","title":"Rocket.tap_on_unsubscribe","text":"tap_on_unsubscribe(tapFn::F, strategy::S = TapBeforeUnsubscription()) where { F <: Function }\n\nCreates a tap operator, which performs a side effect on the unsubscription on the source Observable, but return an Observable that is identical to the source. Tap callback triggers only once.\n\nArguments\n\ntapFn::Function: side-effect tap function with () -> Nothing signature\nstrategy: (optional), specifies the order of a side-effect and an actual unsubscription, uses TapBeforeUnsubscription by default\n\nProducing\n\nStream of type <: Subscribable{L} where L refers to type of source stream\n\nExamples\n\nusing Rocket\n\nsource = from([ 1, 2, 3 ])\nsubscription = subscribe!(source |> tap_on_unsubscribe(() -> println(\"Someone unsubscribed\")), logger())\nunsubscribe!(subscription)\n;\n\n# output\n\n[LogActor] Data: 1\n[LogActor] Data: 2\n[LogActor] Data: 3\n[LogActor] Completed\nSomeone unsubscribed\n\nSee also: TapBeforeUnsubscription, TapAfterUnsubscription, tap, tap_on_subscribe, tap_on_complete, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/utility/tap_on_unsubscribe/#Description","page":"tap_on_unsubscribe","title":"Description","text":"","category":"section"},{"location":"operators/utility/tap_on_unsubscribe/","page":"tap_on_unsubscribe","title":"tap_on_unsubscribe","text":"Returns an Observable that resembles the source Observable, but modifies it so that the provided Observer is called to perform a side effect on unsubscription from the source.","category":"page"},{"location":"operators/utility/tap_on_unsubscribe/","page":"tap_on_unsubscribe","title":"tap_on_unsubscribe","text":"This operator is useful for debugging your Observables, verifying correctness, or performing other side effects.","category":"page"},{"location":"operators/utility/tap_on_unsubscribe/#See-also","page":"tap_on_unsubscribe","title":"See also","text":"","category":"section"},{"location":"operators/utility/tap_on_unsubscribe/","page":"tap_on_unsubscribe","title":"tap_on_unsubscribe","text":"Operators","category":"page"},{"location":"operators/errors/about/#Error-handling-category","page":"About error handling operators","title":"Error handling category","text":"","category":"section"},{"location":"operators/errors/about/","page":"About error handling operators","title":"About error handling operators","text":"There are operators for different purposes, and they may be categorized as: creation, transformation, filtering, joining, multicasting, error handling, utility, etc. In the following list you will find all the operators organized in error handling category.","category":"page"},{"location":"operators/errors/about/","page":"About error handling operators","title":"About error handling operators","text":"catch_error\nrerun\nerror_if\nerror_if_not","category":"page"},{"location":"operators/errors/about/#See-also","page":"About error handling operators","title":"See also","text":"","category":"section"},{"location":"operators/errors/about/","page":"About error handling operators","title":"About error handling operators","text":"Operators","category":"page"},{"location":"operators/utility/delay/#operator_delay","page":"delay","title":"Delay Operator","text":"","category":"section"},{"location":"operators/utility/delay/","page":"delay","title":"delay","text":"delay","category":"page"},{"location":"operators/utility/delay/#Rocket.delay","page":"delay","title":"Rocket.delay","text":"delay(delay::Int)\n\nCreates a delay operator, which delays the emission of items from the source Observable by a given timeout.\n\nArguments:\n\ndelay::Int: the delay duration in milliseconds (a number) until which the emission of the source items is delayed.\n\nProducing\n\nStream of type <: Subscribable{L} where L refers to type of source stream\n\nSee also: AbstractOperator, InferableOperator, ProxyObservable\n\n\n\n\n\n","category":"function"},{"location":"operators/utility/delay/#Description","page":"delay","title":"Description","text":"","category":"section"},{"location":"operators/utility/delay/","page":"delay","title":"delay","text":"Delays the emission of items from the source Observable by a given timeout","category":"page"},{"location":"operators/utility/delay/#Example","page":"delay","title":"Example","text":"","category":"section"},{"location":"operators/utility/delay/","page":"delay","title":"delay","text":"Delay every value with 1 second to the output","category":"page"},{"location":"operators/utility/delay/","page":"delay","title":"delay","text":"using Rocket\nusing Dates\n\nsource = from([ 1, 2, 3 ])\nprintln(Dates.format(now(), \"MM:SS\"))\nsubscription = subscribe!(source |> delay(2000), lambda(\n on_next = (d) -> println(\"$(Dates.format(now(), \"MM:SS\")): $d\")\n));\n\n# output\n\n03:41\n03:43: 1\n03:43: 2\n03:43: 3\n","category":"page"},{"location":"operators/utility/delay/#See-also","page":"delay","title":"See also","text":"","category":"section"},{"location":"operators/utility/delay/","page":"delay","title":"delay","text":"Operators","category":"page"},{"location":"operators/filtering/take/#operator_take","page":"take","title":"Take Operator","text":"","category":"section"},{"location":"operators/filtering/take/","page":"take","title":"take","text":"take","category":"page"},{"location":"operators/filtering/take/#Rocket.take","page":"take","title":"Rocket.take","text":"take(maxcount::Int)\n\nCreates a take operator, which returns an Observable that emits only the first maxcount values emitted by the source Observable.\n\nArguments\n\nmaxcount::Int: the maximum number of next values to emit.\n\nProducing\n\nStream of type <: Subscribable{L} where L refers to type of source stream\n\nExamples\n\nusing Rocket\n\nsource = from([ i for i in 1:100 ])\n\nsubscribe!(source |> take(5), logger())\n;\n\n# output\n\n[LogActor] Data: 1\n[LogActor] Data: 2\n[LogActor] Data: 3\n[LogActor] Data: 4\n[LogActor] Data: 5\n[LogActor] Completed\n\nSee also: AbstractOperator, InferableOperator, ProxyObservable, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/filtering/take/#Description","page":"take","title":"Description","text":"","category":"section"},{"location":"operators/filtering/take/","page":"take","title":"take","text":"take returns an Observable that emits only the first count values emitted by the source Observable. If the source emits fewer than count values, then all of its values are emitted. Afterwards, the Observable completes regardless of whether the source completed.","category":"page"},{"location":"operators/filtering/take/#See-also","page":"take","title":"See also","text":"","category":"section"},{"location":"operators/filtering/take/","page":"take","title":"take","text":"Operators","category":"page"},{"location":"operators/transformation/scan/#operator_scan","page":"scan","title":"Scan Operator","text":"","category":"section"},{"location":"operators/transformation/scan/","page":"scan","title":"scan","text":"scan","category":"page"},{"location":"operators/transformation/scan/#Rocket.scan","page":"scan","title":"Rocket.scan","text":"scan(::Type{R}, scanFn::F, seed::R) where { R, F <: Function }\nscan(scanFn::F) where { F <: Function }\n\nCreates a scan operator, which applies a given accumulator scanFn function to each value emmited by the source Observable, and returns each intermediate result with an optional seed value. If a seed value is specified, then that value will be used as the initial value for the accumulator. If no seed value is specified, the first item of the source is used as the seed.\n\nArguments\n\n::Type{R}: the type of data of transformed value, may be or may not be the same as type of input source\nscanFn::Function: accumulator function with (data::T, current::R) -> R signature\nseed::R: optional initial value for accumulator function\n\nProducing\n\nStream of type <: Subscribable{R}\n\nExamples\n\nusing Rocket\n\nsource = from([ 1, 2, 3 ])\nsubscribe!(source |> scan(+), logger())\n;\n\n# output\n\n[LogActor] Data: 1\n[LogActor] Data: 3\n[LogActor] Data: 6\n[LogActor] Completed\n\n\nusing Rocket\n\nsource = from([ 1, 2, 3 ])\nsubscribe!(source |> scan(Vector{Int}, (d, c) -> [ c..., d ], Int[]), logger())\n;\n\n# output\n\n[LogActor] Data: [1]\n[LogActor] Data: [1, 2]\n[LogActor] Data: [1, 2, 3]\n[LogActor] Completed\n\n\nSee also: AbstractOperator, RightTypedOperator, ProxyObservable, reduce, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/transformation/scan/#Description","page":"scan","title":"Description","text":"","category":"section"},{"location":"operators/transformation/scan/","page":"scan","title":"scan","text":"Combines all values emitted by the source, using an accumulator function that joins a new source value with the past accumulation. This is similar to reduce, but emits the intermediate accumulations.","category":"page"},{"location":"operators/transformation/scan/","page":"scan","title":"scan","text":"Returns an Observable that applies a specified accumulator function to each item emitted by the source Observable. If a seed value is specified, then that value will be used as the initial value for the accumulator. If no seed value is specified, the first item of the source is used as the seed.","category":"page"},{"location":"operators/transformation/scan/#See-also","page":"scan","title":"See also","text":"","category":"section"},{"location":"operators/transformation/scan/","page":"scan","title":"scan","text":"Operators","category":"page"},{"location":"actors/types/buffer/#actor_buffer","page":"Buffer","title":"Buffer actor","text":"","category":"section"},{"location":"actors/types/buffer/","page":"Buffer","title":"Buffer","text":"buffer","category":"page"},{"location":"actors/types/buffer/#Rocket.buffer","page":"Buffer","title":"Rocket.buffer","text":"buffer(::Type{T}, size::Int) where T\n\nArguments\n\n::Type{T}: Type of data in buffer\nsize::Int: size of buffer\n\nCreation operator for the BufferActor actor.\n\nExamples\n\nusing Rocket\n\nactor = buffer(Int, 3)\nactor isa BufferActor{Int}\n\n# output\ntrue\n\nSee also: BufferActor, AbstractActor\n\n\n\n\n\n","category":"function"},{"location":"actors/types/buffer/","page":"Buffer","title":"Buffer","text":"BufferActor","category":"page"},{"location":"actors/types/buffer/#Rocket.BufferActor","page":"Buffer","title":"Rocket.BufferActor","text":"BufferActor{D}() where D\n\nBuffer actor provides a storage actor. It copies last incoming successful next events in a values array, throws an ErrorException on error! event and does nothing on completion event. Note: Actor does not check the size of incoming data.\n\nExamples\n\nusing Rocket\n\nsource = of([ 1, 2, 3 ])\nactor = buffer(Int, 3)\n\nsubscribe!(source, actor)\nshow(getvalues(actor))\n\n# output\n[1, 2, 3]\n\nSee also: Actor, buffer\n\n\n\n\n\n","category":"type"},{"location":"operators/creation/about/#Creation-category","page":"Creation","title":"Creation category","text":"","category":"section"},{"location":"operators/creation/about/","page":"Creation","title":"Creation","text":"There are operators for different purposes, and they may be categorized as: creation, transformation, filtering, joining, multicasting, error handling, utility, etc. In the following list you will find all the operators organized in creation category.","category":"page"},{"location":"operators/creation/about/","page":"Creation","title":"Creation","text":"make\nof\nfrom\niterable\nfaulted\nnever\ncompleted\ntimer\ninterval\nproxy\nfile\ncombined\nrace\nconnectable\nmerged\nconcat\ngenerate\nnetwork\ndefer\nzipped","category":"page"},{"location":"operators/creation/about/#See-also","page":"Creation","title":"See also","text":"","category":"section"},{"location":"operators/creation/about/","page":"Creation","title":"Creation","text":"Operators","category":"page"},{"location":"subjects/types/recent/#subject_recent","page":"Recent","title":"RecentSubject","text":"","category":"section"},{"location":"subjects/types/recent/","page":"Recent","title":"Recent","text":"RecentSubject\nRecentSubjectFactory","category":"page"},{"location":"subjects/types/recent/#Rocket.RecentSubject","page":"Recent","title":"Rocket.RecentSubject","text":"RecentSubject(::Type{D}) where D\nRecentSubject(::Type{D}, factory::F) where { D, F <: AbstractSubjectFactory }\nRecentSubject(::Type{D}, subject::S) where { D, S }\n\nA variant of Subject that emits its recent value whenever it is subscribed to.\n\nSee also: RecentSubjectFactory, Subject, SubjectFactory\n\n\n\n\n\n","category":"function"},{"location":"subjects/types/recent/#Rocket.RecentSubjectFactory","page":"Recent","title":"Rocket.RecentSubjectFactory","text":"RecentSubjectFactory(factory::F) where { F <: AbstractSubjectFactory }\nRecentSubjectFactory(; scheduler::H = AsapScheduler()) where { H <: AbstractScheduler }\n\nA variant of SubjectFactory that creates an instance of RecentSubject.\n\nSee also: SubjectFactory, AbstractSubjectFactory, RecentSubject, Subject\n\n\n\n\n\n","category":"function"},{"location":"subjects/types/recent/#Description","page":"Recent","title":"Description","text":"","category":"section"},{"location":"subjects/types/recent/","page":"Recent","title":"Recent","text":"One of the variants of Subjects is the RecentSubject, which has a notion of \"the recent value\". It stores the latest value emitted to its consumers, and whenever a new Observer subscribes, it will immediately receive the \"recent value\" from the RecentSubject.","category":"page"},{"location":"subjects/types/recent/","page":"Recent","title":"Recent","text":"note: Note\nRecentSubjects is a more efficient version of ReplaySubjects with replay size equal to one.","category":"page"},{"location":"subjects/types/recent/#Examples","page":"Recent","title":"Examples","text":"","category":"section"},{"location":"subjects/types/recent/","page":"Recent","title":"Recent","text":"In the following example, after RecentSubject is initialized the first Observer receives nothing when it subscribes. The second Observer receives the value 2 even though it subscribed after the value 2 was sent.","category":"page"},{"location":"subjects/types/recent/","page":"Recent","title":"Recent","text":"using Rocket\n\nsubject = RecentSubject(Int)\n\nsubscription1 = subscribe!(subject, logger(\"1\"))\n\nnext!(subject, 1)\nnext!(subject, 2)\n\nsubscription2 = subscribe!(subject, logger(\"2\"))\n\nnext!(subject, 3)\n\nunsubscribe!(subscription1)\nunsubscribe!(subscription2)\n\n// Logs\n// [1] Data: 1\n// [1] Data: 2\n// [2] Data: 2\n// [1] Data: 3\n// [2] Data: 3","category":"page"},{"location":"operators/utility/noop/#operator_noop","page":"noop","title":"Noop Operator","text":"","category":"section"},{"location":"operators/utility/noop/","page":"noop","title":"noop","text":"noop","category":"page"},{"location":"operators/utility/noop/#Rocket.noop","page":"noop","title":"Rocket.noop","text":"noop()\n\nCreates a noop operator, which does nothing, but breaks operator composition type inference checking procedure for Julia's compiler. It might be useful for very long chain of operators, because Julia tries to statically infer data types at compile-time for the whole chain and can run into StackOverflow issues.\n\nusing Rocket\n\n# foo() block to enforce local scope for scope variable\nfunction foo()\n source = from(1:5)\n\n for i in 1:1000\n source = source |> map(Int, d -> d + 1) |> noop()\n end\n\n subscribe!(source, logger())\nend\n\nfoo()\n;\n\n# output\n\n[LogActor] Data: 1001\n[LogActor] Data: 1002\n[LogActor] Data: 1003\n[LogActor] Data: 1004\n[LogActor] Data: 1005\n[LogActor] Completed\n\nSee also: AbstractOperator, InferableOperator, logger, map\n\n\n\n\n\n","category":"function"},{"location":"operators/utility/noop/#See-also","page":"noop","title":"See also","text":"","category":"section"},{"location":"operators/utility/noop/","page":"noop","title":"noop","text":"Operators","category":"page"},{"location":"getting-started/#Getting-started","page":"Getting started","title":"Getting started","text":"","category":"section"},{"location":"getting-started/","page":"Getting started","title":"Getting started","text":"Rocket.jl is a Julia package for reactive programming that makes it easier to work with asynchronous data. It is inspired by the RxJS and ReactiveX communities.","category":"page"},{"location":"getting-started/","page":"Getting started","title":"Getting started","text":"In order to combine good performance with a convenient API, Rocket.jl employs Observer patterns, Actor models and Functional programming.","category":"page"},{"location":"getting-started/#Installation","page":"Getting started","title":"Installation","text":"","category":"section"},{"location":"getting-started/","page":"Getting started","title":"Getting started","text":"Install Rocket.jl through the Julia package manager:","category":"page"},{"location":"getting-started/","page":"Getting started","title":"Getting started","text":"] add Rocket","category":"page"},{"location":"getting-started/#Concepts","page":"Getting started","title":"Concepts","text":"","category":"section"},{"location":"getting-started/","page":"Getting started","title":"Getting started","text":"Rocket.jl has been designed with a focus on performance and modularity.","category":"page"},{"location":"getting-started/","page":"Getting started","title":"Getting started","text":"The essential concepts in Rocket.jl are:","category":"page"},{"location":"getting-started/","page":"Getting started","title":"Getting started","text":"Observable: represents a collection of future messages (data or/and events).\nActor: is an object that knows how to react on incoming messages delivered by the Observable.\nSubscription: represents a teardown logic that is useful for cancelling the execution of an Observable.\nOperator: an object that deals with collection operations, such as map, filter, reduce, etc.\nSubject: the way of multicasting a message to multiple Observers.","category":"page"},{"location":"getting-started/#First-example","page":"Getting started","title":"First example","text":"","category":"section"},{"location":"getting-started/","page":"Getting started","title":"Getting started","text":"Conventionally, arrays are used for processing data.","category":"page"},{"location":"getting-started/","page":"Getting started","title":"Getting started","text":"for value in array_of_values\n doSomethingWithMyData(value)\nend","category":"page"},{"location":"getting-started/","page":"Getting started","title":"Getting started","text":"In contrast, Rocket.jl uses observables.","category":"page"},{"location":"getting-started/","page":"Getting started","title":"Getting started","text":"subscription = subscribe!(source_of_values, lambda(\n on_next = (data) -> doSomethingWithMyData(data),\n on_error = (error) -> doSomethingWithAnError(error),\n on_complete = () -> println(\"Completed!\")\n))","category":"page"},{"location":"getting-started/","page":"Getting started","title":"Getting started","text":"At some point in time you may decide to stop listening for new messages.","category":"page"},{"location":"getting-started/","page":"Getting started","title":"Getting started","text":"unsubscribe!(subscription)","category":"page"},{"location":"getting-started/#Actors","page":"Getting started","title":"Actors","text":"","category":"section"},{"location":"getting-started/","page":"Getting started","title":"Getting started","text":"In order to process messages from an observable you will need to define an Actor that knows how to react to incoming messages.","category":"page"},{"location":"getting-started/","page":"Getting started","title":"Getting started","text":"struct MyActor <: Rocket.Actor{Int} end\n\nRocket.on_next!(actor::MyActor, data::Int) = doSomethingWithMyData(data)\nRocket.on_error!(actor::MyActor, error) = doSomethingWithAnError(error)\nRocket.on_complete!(actor::MyActor) = println(\"Completed!\")","category":"page"},{"location":"getting-started/","page":"Getting started","title":"Getting started","text":"An actor can also have its own local state.","category":"page"},{"location":"getting-started/","page":"Getting started","title":"Getting started","text":"struct StoreActor{D} <: Rocket.Actor{D}\n values :: Vector{D}\n\n StoreActor{D}() where D = new(Vector{D}())\nend\n\nRocket.on_next!(actor::StoreActor{D}, data::D) where D = push!(actor.values, data)\nRocket.on_error!(actor::StoreActor, error) = doSomethingWithAnError(error)\nRocket.on_complete!(actor::StoreActor) = println(\"Completed: $(actor.values)\")","category":"page"},{"location":"getting-started/","page":"Getting started","title":"Getting started","text":"For debugging purposes you can use a general LambdaActor actor or just pass a function object as an actor in subscribe! function..","category":"page"},{"location":"getting-started/#Operators","page":"Getting started","title":"Operators","text":"","category":"section"},{"location":"getting-started/","page":"Getting started","title":"Getting started","text":"What makes Rocket.jl powerful is its ability to help you process, transform and modify the messages that flow through your observables, using Operators.","category":"page"},{"location":"getting-started/","page":"Getting started","title":"Getting started","text":"subscribe!(squared_int_values |> map(Int, (d) -> d ^ 2), lambda(\n on_next = (data) -> println(data)\n))","category":"page"},{"location":"operators/transformation/pairwise/#operator_pairwise","page":"pairwise","title":"Pairwise Operator","text":"","category":"section"},{"location":"operators/transformation/pairwise/","page":"pairwise","title":"pairwise","text":"pairwise","category":"page"},{"location":"operators/transformation/pairwise/#Rocket.pairwise","page":"pairwise","title":"Rocket.pairwise","text":"pairwise([ initial ])\n\nCreates a pairwise operator, which groups pairs of consecutive emissions together and emits them as a tuple of two values. Accepts optional initial seed value to start pairing from.\n\nusing Rocket\n\nsource = from(1:5) |> pairwise()\n\nsubscribe!(source, logger())\n;\n\n# output\n\n[LogActor] Data: (1, 2)\n[LogActor] Data: (2, 3)\n[LogActor] Data: (3, 4)\n[LogActor] Data: (4, 5)\n[LogActor] Completed\n\nusing Rocket\n\nsource = from(1:5) |> pairwise(0)\n\nsubscribe!(source, logger())\n;\n\n# output\n\n[LogActor] Data: (0, 1)\n[LogActor] Data: (1, 2)\n[LogActor] Data: (2, 3)\n[LogActor] Data: (3, 4)\n[LogActor] Data: (4, 5)\n[LogActor] Completed\n\nSee also: AbstractOperator, InferableOperator, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/transformation/pairwise/#See-also","page":"pairwise","title":"See also","text":"","category":"section"},{"location":"operators/transformation/pairwise/","page":"pairwise","title":"pairwise","text":"Operators","category":"page"},{"location":"operators/filtering/first/#operator_first","page":"first","title":"First operator","text":"","category":"section"},{"location":"operators/filtering/first/","page":"first","title":"first","text":"first","category":"page"},{"location":"operators/filtering/first/#Base.first","page":"first","title":"Base.first","text":"first(; default = nothing)\n\nCreates a first operator, which returns an Observable that emits only the first value emitted by the source Observable. Sends FirstNotFoundException error message if a given source completes without emitting a single value.\n\nArguments\n\ndefault: an optional default value to provide if no values were emitted\n\nProducing\n\nStream of type <: Subscribable{L} where L refers to type of source stream\n\nExamples\n\nusing Rocket\n\nsource = from(1:100)\nsubscription = subscribe!(source |> first(), logger())\n;\n\n# output\n\n[LogActor] Data: 1\n[LogActor] Completed\n\nSee also: take, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/filtering/first/#Description","page":"first","title":"Description","text":"","category":"section"},{"location":"operators/filtering/first/","page":"first","title":"first","text":"An alias for take(1) operator.","category":"page"},{"location":"operators/filtering/first/#See-also","page":"first","title":"See also","text":"","category":"section"},{"location":"operators/filtering/first/","page":"first","title":"first","text":"Operators, take","category":"page"},{"location":"actors/types/function/#actor_function","page":"Function","title":"Function actor","text":"","category":"section"},{"location":"actors/types/function/","page":"Function","title":"Function","text":"FunctionActor","category":"page"},{"location":"actors/types/function/#Rocket.FunctionActor","page":"Function","title":"Rocket.FunctionActor","text":"FunctionActor{D} <: Actor{D}\n\nFunctionActor provides a simple interface to use a single function as a next! callback, error! callback throws an ErrorException and complete! callback does nothing. Should not be used explicitly because it will be created automatically when passing a Function object as an actor in subscribe! function.\n\nExamples\n\nusing Rocket\n\nsource = from(1:5)\nsubscribe!(source, (t) -> println(t))\n;\n\n# output\n1\n2\n3\n4\n5\n\nSee also: Actor, subscribe!\n\n\n\n\n\n","category":"type"},{"location":"operators/mathematical/min/#operator_min","page":"min","title":"Min Operator","text":"","category":"section"},{"location":"operators/mathematical/min/","page":"min","title":"min","text":"min","category":"page"},{"location":"operators/mathematical/min/#Base.min","page":"min","title":"Base.min","text":"min(; from = nothing)\n\nCreates a min operator, which emits a single item: the item with the smallest value.\n\nArguments\n\nfrom: optional initial minimal value, if nothing first item from the source will be used as initial instead\n\nProducing\n\nStream of type <: Subscribable{Union{L, Nothing}} where L refers to type of source stream\n\nExamples\n\nusing Rocket\n\nsource = from([ i for i in 1:42 ])\nsubscribe!(source |> min(), logger())\n;\n\n# output\n\n[LogActor] Data: 1\n[LogActor] Completed\n\n\nSee also: AbstractOperator, InferableOperator, ProxyObservable, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/mathematical/min/#Description","page":"min","title":"Description","text":"","category":"section"},{"location":"operators/mathematical/min/","page":"min","title":"min","text":"The min operator operates on an Observable of similar objects. When source Observable completes, it emits the item with the smallest value.","category":"page"},{"location":"operators/mathematical/min/#See-also","page":"min","title":"See also","text":"","category":"section"},{"location":"operators/mathematical/min/","page":"min","title":"min","text":"Operators","category":"page"},{"location":"operators/errors/error_if/#operator_error_if","page":"error_if","title":"Error If Operator","text":"","category":"section"},{"location":"operators/errors/error_if/","page":"error_if","title":"error_if","text":"error_if","category":"page"},{"location":"operators/errors/error_if/#Rocket.error_if","page":"error_if","title":"Rocket.error_if","text":"error_if(checkFn, errorFn)\n\nCreates an error_if operator, which performs a check for every emission on the source Observable with checkFn. If checkFn returns true, the operator sends an error event and unsubscribes from the observable.\n\nArguments\n\ncheckFn: check function with (data) -> Bool signature\nerrorFn: error object generating function with (data) -> Any signature, optional\n\nProducing\n\nStream of type <: Subscribable{L} where L refers to type of source stream\n\nExamples\n\nusing Rocket\n\nsource = from([1, 2, 3]) |> error_if((data) -> data > 2, (data) -> \"CustomError\")\n\nsubscription = subscribe!(source, lambda(\n on_next = (d) -> println(\"Next: \", d),\n on_error = (e) -> println(\"Error: \", e),\n on_complete = () -> println(\"Completed\")\n))\n;\n\n# output\nNext: 1\nNext: 2\nError: CustomError\n\nSee also: error_if_not, error_if_empty, default_if_empty, lambda\n\n\n\n\n\n","category":"function"},{"location":"operators/errors/error_if/#See-also","page":"error_if","title":"See also","text":"","category":"section"},{"location":"operators/errors/error_if/","page":"error_if","title":"error_if","text":"Operators","category":"page"},{"location":"subjects/about/#section_subjects","page":"Subject","title":"About subjects","text":"","category":"section"},{"location":"subjects/about/","page":"Subject","title":"Subject","text":"An Rocket.jl Subject is a special type of Observable that allows values to be multicasted to many Actors. While plain Observables are unicast (each subscribed Actor owns an independent execution of the Observable), Subjects are multicast.","category":"page"},{"location":"subjects/about/","page":"Subject","title":"Subject","text":"note: Note\nA Subject is like an Observable, but can multicast to many Actors. Subjects are like event emitters: they maintain a registry of many listeners.","category":"page"},{"location":"subjects/about/","page":"Subject","title":"Subject","text":"Every Subject is an Observable. Given a Subject, you can subscribe to it, providing an Actor, which will start receiving values normally. From the perspective of the Actor, it cannot tell whether the Observable execution is coming from a plain unicast Observable or a Subject.","category":"page"},{"location":"subjects/about/","page":"Subject","title":"Subject","text":"Internally to the Subject, subscribe does not invoke a new execution that delivers values. Instead, it simply registers the given Actor in a list of Actors.","category":"page"},{"location":"subjects/about/","page":"Subject","title":"Subject","text":"Every Subject is an Actor itself. It is an object with the methods next!, error!, and complete!. Call next!(subject, theValue) to feed a new value to the Subject, and it will be multicasted to the Actors that listen to the Subject.","category":"page"},{"location":"subjects/about/","page":"Subject","title":"Subject","text":"In the example below, we have two Observers attached to a Subject, and we feed some values to the Subject:","category":"page"},{"location":"subjects/about/","page":"Subject","title":"Subject","text":"using Rocket\n\nsource = Subject(Int)\n\nsubscription1 = subscribe!(source, lambda(\n on_next = (d) -> println(\"Actor 1: $d\")\n))\n\nsubscription2 = subscribe!(source, lambda(\n on_next = (d) -> println(\"Actor 2: $d\")\n))\n\nnext!(source, 0)\n\n# Logs\n# Actor 1: 0\n# Actor 2: 0\n\nunsubscribe!(subscription1)\nunsubscribe!(subscription2)\n","category":"page"},{"location":"subjects/about/","page":"Subject","title":"Subject","text":"Since a Subject is an actor, this also means you may provide a Subject as the argument to the subscribe of any Observable:","category":"page"},{"location":"subjects/about/","page":"Subject","title":"Subject","text":"using Rocket\n\nsource = Subject(Int)\n\nsubscription1 = subscribe!(source, lambda(\n on_next = (d) -> println(\"Actor 1: $d\")\n))\n\nsubscription2 = subscribe!(source, lambda(\n on_next = (d) -> println(\"Actor 2: $d\")\n))\n\nother_source = from([ 1, 2, 3 ])\nsubscribe!(other_source, source);\n\n# Logs\n# Actor 1: 1\n# Actor 2: 1\n# Actor 1: 2\n# Actor 2: 2\n# Actor 1: 3\n# Actor 2: 3","category":"page"},{"location":"subjects/about/","page":"Subject","title":"Subject","text":"Here, we essentially convert a unicast Observable execution to multicast, through the Subject. This demonstrates how Subjects offer a unique way to share Observable execution with multiple Observers.","category":"page"},{"location":"subjects/about/#Schedulers","page":"Subject","title":"Schedulers","text":"","category":"section"},{"location":"subjects/about/","page":"Subject","title":"Subject","text":"Subject (and some other observables) uses scheduler objects to schedule message delivery to their listeners.","category":"page"},{"location":"subjects/about/#Synchronous-scheduler","page":"Subject","title":"Synchronous scheduler","text":"","category":"section"},{"location":"subjects/about/","page":"Subject","title":"Subject","text":"One of the variants of schedulers is the AsapScheduler, which delivers every message synchronously. AsapScheduler is a default scheduler for all Subject objects.","category":"page"},{"location":"subjects/about/","page":"Subject","title":"Subject","text":"AsapScheduler","category":"page"},{"location":"subjects/about/#Rocket.AsapScheduler","page":"Subject","title":"Rocket.AsapScheduler","text":"AsapScheduler\n\nAsapScheduler executes scheduled actions as soon as possible and does not introduce any additional logic. AsapScheduler is a default scheduler for almost all observables.\n\n\n\n\n\n","category":"type"},{"location":"subjects/about/","page":"Subject","title":"Subject","text":"using Rocket\n\nsubject = Subject(Int, scheduler = AsapScheduler())\n\nsubscription1 = subscribe!(subject, logger(\"Actor 1\"))\n\nprintln(\"Before next\")\nnext!(subject, 1)\nnext!(subject, 2)\nprintln(\"After next\")\n\nsubscription2 = subscribe!(subject, logger(\"Actor 2\"))\n\nnext!(subject, 3)\n\n# Logs\n# Before next\n# [Actor 1] Data: 1\n# [Actor 1] Data: 2\n# After next\n# [Actor 1] Data: 3\n# [Actor 2] Data: 3","category":"page"},{"location":"subjects/about/#Asynchronous-Scheduler","page":"Subject","title":"Asynchronous Scheduler","text":"","category":"section"},{"location":"subjects/about/","page":"Subject","title":"Subject","text":"An AsyncScheduler is similar to a AsapScheduler. Both allows for Subject to scheduler their messages for multiple listeners, but a AsyncScheduler delivers all messages asynchronously (but still ordered) using a Julia's built-in Task object.","category":"page"},{"location":"subjects/about/","page":"Subject","title":"Subject","text":"AsyncScheduler","category":"page"},{"location":"subjects/about/#Rocket.AsyncScheduler","page":"Subject","title":"Rocket.AsyncScheduler","text":"AsyncScheduler\n\nAsyncScheduler executes scheduled actions asynchronously and uses Channel object to order different actions on a single asynchronous task\n\n\n\n\n\n","category":"type"},{"location":"subjects/about/","page":"Subject","title":"Subject","text":"using Rocket\n\nsubject = Subject(Int, scheduler = AsyncScheduler())\n\nsubscription1 = subscribe!(subject, logger(\"Actor 1\"))\n\nprintln(\"Before next\")\nnext!(subject, 1)\nnext!(subject, 2)\nprintln(\"After next\")\n\nsubscription2 = subscribe!(subject, logger(\"Actor 2\"))\n\nnext!(subject, 3)\n\n# Logs\n# Before next\n# After next\n# [Actor 1] Data: 1\n# [Actor 1] Data: 2\n# [Actor 1] Data: 3\n# [Actor 2] Data: 3\n","category":"page"},{"location":"operators/filtering/find_index/#operator_find_index","page":"find_index","title":"Find Index operator","text":"","category":"section"},{"location":"operators/filtering/find_index/","page":"find_index","title":"find_index","text":"find_index","category":"page"},{"location":"operators/filtering/find_index/#Rocket.find_index","page":"find_index","title":"Rocket.find_index","text":"find_index(conditionFn::F) where { F <: Function }\n\nCreates a find operator, which emits only the index of the first value emitted by the source Observable that meets some condition. Indices are 1-based.\n\nProducing\n\nStream of type <: Subscribable{L} where L refers to type of source stream\n\nArguments\n\nconditionFn::F: condition function with (data::T) -> Bool signature\n\nExamples\n\nusing Rocket\n\nsource = from([ 0, 1, 2, 3, 4, 5, 6, 7, 8 ])\nsubscribe!(source |> find_index((d) -> d !== 0 && d % 2 == 0), logger())\n;\n\n# output\n\n[LogActor] Data: 3\n[LogActor] Completed\n\nSee also: find, AbstractOperator, InferableOperator, ProxyObservable, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/filtering/find_index/#Description","page":"find_index","title":"Description","text":"","category":"section"},{"location":"operators/filtering/find_index/","page":"find_index","title":"find_index","text":"It's like find, but emits the index of the found value, not the value itself.","category":"page"},{"location":"operators/filtering/find_index/#See-also","page":"find_index","title":"See also","text":"","category":"section"},{"location":"operators/filtering/find_index/","page":"find_index","title":"find_index","text":"Operators, take","category":"page"},{"location":"api/subjects/#subjects_api","page":"Subjects","title":"Subjects API","text":"","category":"section"},{"location":"api/subjects/#Traits","page":"Subjects","title":"Traits","text":"","category":"section"},{"location":"api/subjects/","page":"Subjects","title":"Subjects","text":"SubjectTrait\nas_subject \nValidSubjectTrait\nInvalidSubjectTrait\nAbstractSubject","category":"page"},{"location":"api/subjects/#Rocket.SubjectTrait","page":"Subjects","title":"Rocket.SubjectTrait","text":"Abstract type for all possible subject traits\n\nSee also: ValidSubjectTrait, InvalidSubjectTrait, as_subject\n\n\n\n\n\n","category":"type"},{"location":"api/subjects/#Rocket.as_subject","page":"Subjects","title":"Rocket.as_subject","text":"as_subject(::Type)\n\nThis function checks subject trait behavior specification. Should be used explicitly to specify subject trait behavior for any object type.\n\nSee also: SubjectTrait\n\n\n\n\n\n","category":"function"},{"location":"api/subjects/#Rocket.ValidSubjectTrait","page":"Subjects","title":"Rocket.ValidSubjectTrait","text":"Valid subject trait behavior\n\nSee also: SubjectTrait\n\n\n\n\n\n","category":"type"},{"location":"api/subjects/#Rocket.InvalidSubjectTrait","page":"Subjects","title":"Rocket.InvalidSubjectTrait","text":"Default subject trait behavior for all types.\n\nSee also: SubjectTrait\n\n\n\n\n\n","category":"type"},{"location":"api/subjects/#Rocket.AbstractSubject","page":"Subjects","title":"Rocket.AbstractSubject","text":"Supertype for Subject types. Automatically specifies ValidSubject, SimpleSubscribableTrait and BaseActorTrait traits.\n\nSee also: Subject, ValidSubjectTrait, SimpleSubscribableTrait, BaseActorTrait\n\n\n\n\n\n","category":"type"},{"location":"api/subjects/#Factory","page":"Subjects","title":"Factory","text":"","category":"section"},{"location":"api/subjects/","page":"Subjects","title":"Subjects","text":"AbstractSubjectFactory\ncreate_subject","category":"page"},{"location":"api/subjects/#Rocket.AbstractSubjectFactory","page":"Subjects","title":"Rocket.AbstractSubjectFactory","text":"Abstract type for all possible subject factories\n\nSee also: SubjectTrait, ValidSubjectTrait, InvalidSubjectTrait\n\n\n\n\n\n","category":"type"},{"location":"api/subjects/#Rocket.create_subject","page":"Subjects","title":"Rocket.create_subject","text":"create_subject(::Type{L}, factory::F) where L where { F <: AbstractSubjectFactory }\n\nActor creator function for a given factory F. Should be implemented explicitly for any AbstractActorFactory object\n\nSee also: AbstractSubjectFactory, MissingCreateActorFactoryImplementationError\n\n\n\n\n\n","category":"function"},{"location":"api/subjects/#Errors","page":"Subjects","title":"Errors","text":"","category":"section"},{"location":"api/subjects/","page":"Subjects","title":"Subjects","text":"InvalidSubjectTraitUsageError\nInconsistentSubjectDataTypesError","category":"page"},{"location":"api/subjects/#Rocket.InvalidSubjectTraitUsageError","page":"Subjects","title":"Rocket.InvalidSubjectTraitUsageError","text":"InvalidSubject usage error\n\nSee also: as_subject\n\n\n\n\n\n","category":"type"},{"location":"api/subjects/#Rocket.InconsistentSubjectDataTypesError","page":"Subjects","title":"Rocket.InconsistentSubjectDataTypesError","text":"InconsistentSubjectDataTypesError\n\nSee also: as_subject\n\n\n\n\n\n","category":"type"},{"location":"operators/transformation/lowercase/#operator_lowercase","page":"lowercase","title":"Lowercase Operator","text":"","category":"section"},{"location":"operators/transformation/lowercase/","page":"lowercase","title":"lowercase","text":"lowercase","category":"page"},{"location":"operators/transformation/lowercase/#Base.Unicode.lowercase","page":"lowercase","title":"Base.Unicode.lowercase","text":"lowercase()\n\nCreates an lowercase operator, which forces each value to be in lower case\n\nProducing\n\nStream of type <: Subscribable{L} where L referes to type of data of input Observable\n\nExamples\n\nusing Rocket\n\nsource = of(\"Hello, world!\")\nsubscribe!(source |> lowercase(), logger())\n;\n\n# output\n\n[LogActor] Data: hello, world!\n[LogActor] Completed\n\nSee also: AbstractOperator, InferableOperator, ProxyObservable, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/transformation/lowercase/#See-also","page":"lowercase","title":"See also","text":"","category":"section"},{"location":"operators/transformation/lowercase/","page":"lowercase","title":"lowercase","text":"Operators, map, uppercase","category":"page"},{"location":"operators/transformation/merge_map/#operator_merge_map","page":"merge_map","title":"MergeMap Operator","text":"","category":"section"},{"location":"operators/transformation/merge_map/","page":"merge_map","title":"merge_map","text":"merge_map","category":"page"},{"location":"operators/transformation/merge_map/#Rocket.merge_map","page":"merge_map","title":"Rocket.merge_map","text":"merge_map(::Type{R}, mappingFn::F = identity; concurrent::Int = typemax(Int)) where { R, F <: Function }\n\nCreates a merge_map operator, which returns an Observable that emits the result of applying the projection function mappingFn to each item emitted by the source Observable and merging the results of the Observables obtained from this transformation.\n\nArguments\n\n::Type{R}: the type of data of output Observables after projection with mappingFn\nmappingFn::F: projection function with (data) -> Observable{R} signature\nconcurrent::Int: optional, default is typemax(Int), maximum number of input Observables being subscribed to concurrently\n\nProducing\n\nStream of type <: Subscribable{R}\n\nExamples\n\nusing Rocket\n\nsource = from([ 0, 0 ]) |> merge_map(Int, d -> from([ 1, 2, 3 ], scheduler = AsyncScheduler(0)))\nsubscribe!(source, logger())\n;\n\n# output\n\n[LogActor] Data: 1\n[LogActor] Data: 1\n[LogActor] Data: 2\n[LogActor] Data: 2\n[LogActor] Data: 3\n[LogActor] Data: 3\n[LogActor] Completed\n\nSee also: AbstractOperator, RightTypedOperator, ProxyObservable, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/transformation/merge_map/#See-also","page":"merge_map","title":"See also","text":"","category":"section"},{"location":"operators/transformation/merge_map/","page":"merge_map","title":"merge_map","text":"Operators","category":"page"},{"location":"teardown/types/void/#teardown_void","page":"Void","title":"Void Teardown","text":"","category":"section"},{"location":"teardown/types/void/","page":"Void","title":"Void","text":"VoidTeardown\nvoidTeardown","category":"page"},{"location":"teardown/types/void/#Rocket.VoidTeardown","page":"Void","title":"Rocket.VoidTeardown","text":"VoidTeardown()\n\nVoidTeardown object does nothing on unsubscription. It is usefull for synchronous observables and observables which cannot be cancelled after execution.\n\nSee also: Teardown, VoidTeardownLogic\n\n\n\n\n\n","category":"type"},{"location":"teardown/types/void/#Rocket.voidTeardown","page":"Void","title":"Rocket.voidTeardown","text":"voidTeardown\n\nAn instance of VoidTeardown singleton object.\n\nSee also: VoidTeardown\n\n\n\n\n\n","category":"constant"},{"location":"operators/transformation/substitute/#operator_substitute","page":"substitute","title":"Substitute Operator","text":"","category":"section"},{"location":"operators/transformation/substitute/","page":"substitute","title":"substitute","text":"substitute\nSubstituteHandler","category":"page"},{"location":"operators/transformation/substitute/#Rocket.substitute","page":"substitute","title":"Rocket.substitute","text":"substitute(::Type{T}, mapFn::F, handler::SubstituteHandler) where { T, F <: Function }\n\nThis operator forces observable to substitute each emmited value with the latest computed value with the corresponding handler and release! function. After release! on handler substitute operator computes new value with mapFn but does not emit it until next emission from source observable. Always calls mapFn on first value from source observable.\n\nProducing\n\nStream of type <: Subscribable{T} \n\nExamples\n\nusing Rocket\n\nsubject = Subject(Int)\n\nhandler = SubstituteHandler()\nsource = subject |> substitute(String, i -> string(\"i = \", i), handler)\n\nsubscription = subscribe!(source, logger())\n\nnext!(subject, 1)\nnext!(subject, 2)\nnext!(subject, 3)\n\nrelease!(handler)\n\nnext!(subject, 4)\nnext!(subject, 5)\nnext!(subject, 6)\n\nunsubscribe!(subscription)\n;\n\n# output\n\n[LogActor] Data: i = 1\n[LogActor] Data: i = 1\n[LogActor] Data: i = 1\n[LogActor] Data: i = 3\n[LogActor] Data: i = 3\n[LogActor] Data: i = 3\n\nSee also: SubstituteHandler\n\n\n\n\n\n","category":"function"},{"location":"operators/transformation/substitute/#Rocket.SubstituteHandler","page":"substitute","title":"Rocket.SubstituteHandler","text":"SubstituteHandler()\n\nhandler used to release! new values in substitute operator.\n\nSee also: substitute\n\n\n\n\n\n","category":"type"},{"location":"operators/transformation/substitute/#See-also","page":"substitute","title":"See also","text":"","category":"section"},{"location":"operators/transformation/substitute/","page":"substitute","title":"substitute","text":"Operators","category":"page"},{"location":"operators/mathematical/about/#Mathematical-and-Aggregate-category","page":"About mathematical operators","title":"Mathematical and Aggregate category","text":"","category":"section"},{"location":"operators/mathematical/about/","page":"About mathematical operators","title":"About mathematical operators","text":"There are operators for different purposes, and they may be categorized as: creation, transformation, filtering, joining, multicasting, error handling, utility, etc. In the following list you will find all the operators organized in mathematical and aggregate category.","category":"page"},{"location":"operators/mathematical/about/","page":"About mathematical operators","title":"About mathematical operators","text":"count\nmax\nmin\nreduce\nsum","category":"page"},{"location":"operators/mathematical/about/#See-also","page":"About mathematical operators","title":"See also","text":"","category":"section"},{"location":"operators/mathematical/about/","page":"About mathematical operators","title":"About mathematical operators","text":"Operators","category":"page"},{"location":"operators/utility/async/#operator_ref_async","page":"async","title":"Async Operator","text":"","category":"section"},{"location":"operators/utility/async/","page":"async","title":"async","text":"async","category":"page"},{"location":"operators/utility/async/#Rocket.async","page":"async","title":"Rocket.async","text":"async(size::Int = typemax(Int))\n\nCreates an async operator, which sends items from the source Observable asynchronously.\n\nArguments\n\nsize: Asynchronous messages buffer size, default is a typemax(Int)\n\nProducing\n\nStream of type <: Subscribable{L} where L refers to type of source stream\n\nSee also: AbstractOperator, InferableOperator, ProxyObservable\n\n\n\n\n\n","category":"function"},{"location":"operators/utility/async/#See-also","page":"async","title":"See also","text":"","category":"section"},{"location":"operators/utility/async/","page":"async","title":"async","text":"Operators","category":"page"},{"location":"operators/transformation/enumerate/#operator_enumerate","page":"enumerate","title":"Enumerate Operator","text":"","category":"section"},{"location":"operators/transformation/enumerate/","page":"enumerate","title":"enumerate","text":"enumerate","category":"page"},{"location":"operators/transformation/enumerate/#Base.Iterators.enumerate","page":"enumerate","title":"Base.Iterators.enumerate","text":"enumerate()\n\nCreates an enumerate operator, which converts each value emitted by the source Observable into a tuple of its order number and the value itself.\n\nThe enumerate operator is similar to scan(Tuple{Int, Int}, (d, c) -> (d, c[2] + 1), (0, 0)) (see scan).\n\nProducing\n\nStream of type <: Subscribable{Tuple{Int, L}} where L refers to type of source stream\n\nExamples\n\nusing Rocket\n\nsource = from([ 0 for _ in 1:3 ])\nsubscribe!(source |> enumerate(), logger())\n;\n\n# output\n\n[LogActor] Data: (1, 0)\n[LogActor] Data: (2, 0)\n[LogActor] Data: (3, 0)\n[LogActor] Completed\n\n\nSee also: AbstractOperator, InferableOperator, ProxyObservable, scan, map, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/transformation/enumerate/#Description","page":"enumerate","title":"Description","text":"","category":"section"},{"location":"operators/transformation/enumerate/","page":"enumerate","title":"enumerate","text":"enumerate returns an Observable that converts each value emitted by the source Observable into a tuple of its order number and the value itself.","category":"page"},{"location":"operators/transformation/enumerate/#Example","page":"enumerate","title":"Example","text":"","category":"section"},{"location":"operators/transformation/enumerate/","page":"enumerate","title":"enumerate","text":"Get a value from the source with its order number","category":"page"},{"location":"operators/transformation/enumerate/","page":"enumerate","title":"enumerate","text":"using Rocket\n\nsource = from([ 0.0, 0.2, 0.4, 0.6, 0.8, 1.0 ])\nsubscribe!(source |> enumerate(), logger())\n\n# output\n\n[LogActor] Data: (0.0, 1)\n[LogActor] Data: (0.2, 2)\n[LogActor] Data: (0.4, 3)\n[LogActor] Data: (0.6, 4)\n[LogActor] Data: (0.8, 5)\n[LogActor] Data: (1.0, 6)\n[LogActor] Completed","category":"page"},{"location":"operators/transformation/enumerate/#See-also","page":"enumerate","title":"See also","text":"","category":"section"},{"location":"operators/transformation/enumerate/","page":"enumerate","title":"enumerate","text":"Operators, scan","category":"page"},{"location":"actors/types/sync/#actor_sync","page":"Sync","title":"Sync actor","text":"","category":"section"},{"location":"actors/types/sync/","page":"Sync","title":"Sync","text":"sync","category":"page"},{"location":"actors/types/sync/#Rocket.sync","page":"Sync","title":"Rocket.sync","text":"sync(actor::A; withlock::Bool = true, timeout::Int = -1) where A\nsync(factory::F; withlock::Bool = true, timeout::Int = -1) where { F <: AbstractActorFactory }\n\nCreation operator for the SyncActor actor. Accepts optional named timeout argument which specifies maximum number of milliseconds to wait (throws SyncActorTimedOutException() on timeout). Also accepts optional withlock boolean flag indicating that every next!, error! and complete! event should be guarded with ReentrantLock.\n\nExamples\n\nusing Rocket\n\nactor = keep(Int)\nsynced = sync(actor)\n\nsubscribe!(from(0:5, scheduler = AsyncScheduler()), synced)\n\nyield()\n\nwait(synced)\nshow(synced.actor.values)\n\n# output\n[0, 1, 2, 3, 4, 5]\n\nCan also be used with an <: AbstractActorFactory as an argument. In this case sync function will return a special actor factory object, which will store all created actors in array and wrap them with a sync function. wait(sync_factory) method will wait for all of the created actors to be completed in the order of creation (but only once for each of them).\n\nusing Rocket\n\nvalues = Int[]\n\nfactory = lambda(on_next = (d) -> push!(values, d))\nsynced = sync(factory)\n\nsubscribe!(from(0:5, scheduler = AsyncScheduler()), synced)\n\nyield()\n\nwait(synced)\nshow(values)\n\n# output\n[0, 1, 2, 3, 4, 5]\n\nSee also: SyncActor, AbstractActor\n\n\n\n\n\n","category":"function"},{"location":"actors/types/sync/","page":"Sync","title":"Sync","text":"SyncActor","category":"page"},{"location":"actors/types/sync/#Rocket.SyncActor","page":"Sync","title":"Rocket.SyncActor","text":"SyncActor{T, A}(actor::A; withlock::Bool = true, timeout::Int = -1) where { T, A }\n\nSync actor provides a synchronized interface to wait for an actor to be notified with a complete event. By default creates a re-entrant lock for synchronizing next!, error! and complete! events.\n\nSee also: Actor, sync\n\n\n\n\n\n","category":"type"},{"location":"operators/utility/limit_subscribers/#operator_limit_subscribers","page":"limit_subscribers","title":"LimitSubscribers Operator","text":"","category":"section"},{"location":"operators/utility/limit_subscribers/","page":"limit_subscribers","title":"limit_subscribers","text":"LimitSubscribersGuard\nlimit_subscribers","category":"page"},{"location":"operators/utility/limit_subscribers/#Rocket.LimitSubscribersGuard","page":"limit_subscribers","title":"Rocket.LimitSubscribersGuard","text":"LimitSubscribersGuard(limit::Int = 1, exclusive = true)\n\nGuard structure used in limit_subscribers operator.\n\nArguments\n\nlimit: number of concurrent subscribers\nexclusive: boolean flag, which indicates whenever this guard can be shared with other observables in other limit_subscribers operator. If set to true, reusing this guard in a different limit_subscribers operator for other observable will result in automatic unsubscription of all present actors.\n\nNote\n\nThis structure is useful in Pluto.jl notebooks in particular, allowing for automatic subscription/unsubscription of observables.\n\nExample\n\n\n# Cell 1\nguard = LimitSubscribersGuard()\n\n# Cell 2\nsubscription = subscribe!(some_stream |> limit_subscribers(guard), logger())\n\nSee also: limit_subscribers, subscribe!\n\n\n\n\n\n","category":"type"},{"location":"operators/utility/limit_subscribers/#Rocket.limit_subscribers","page":"limit_subscribers","title":"Rocket.limit_subscribers","text":"limit_subscribers(limit::Int = 1, exclusive::Bool = true)\nlimit_subscribers(guard::LimitSubscribersGuard)\n\nCreates an operator that limits number of concurrent actors to the given observable. On new subscription, if limit is exceeded, oldest actor is automatically unsubscribed and receives a completion event.\n\nArguments\n\nlimit: number of concurrent subscribers\nexclusive: boolean flag, which indicates whenever this guard can be shared with other observables in other limit_subscribers operator. If set to true, reusing this guard in a different limit_subscribers operator for other observable will result in automatic unsubscription of all present actors.\n\nNote\n\nThis structure is useful in Pluto.jl notebooks in particular, allowing for automatic subscription/unsubscription of observables.\n\nExample\n\n\n# Cell 1\nguard = LimitSubscribersGuard()\n\n# Cell 2\nsubscription = subscribe!(some_stream |> limit_subscribers(guard), logger())\n\nSee also: LimitSubscribersGuard\n\n\n\n\n\n","category":"function"},{"location":"operators/utility/limit_subscribers/#See-also","page":"limit_subscribers","title":"See also","text":"","category":"section"},{"location":"operators/utility/limit_subscribers/","page":"limit_subscribers","title":"limit_subscribers","text":"Operators","category":"page"},{"location":"operators/utility/skip_error/#operator_skip_error","page":"skip_error","title":"SkipError Operator","text":"","category":"section"},{"location":"operators/utility/skip_error/","page":"skip_error","title":"skip_error","text":"skip_error","category":"page"},{"location":"operators/utility/skip_error/#Rocket.skip_error","page":"skip_error","title":"Rocket.skip_error","text":"skip_error()\n\nCreates a skip_error operator, which filters out error event by the source Observable by emitting only next and complete messages.\n\nProducing\n\nStream of type <: Subscribable{L} where L refers to type of source stream\n\nExamples\n\nusing Rocket\n\nsource = faulted(\"error\")\nsubscribe!(source |> skip_error(), logger())\n;\n\n# output\n\n\nSee also: AbstractOperator, InferableOperator, ProxyObservable, skip_error, skip_complete, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/utility/skip_error/#See-also","page":"skip_error","title":"See also","text":"","category":"section"},{"location":"operators/utility/skip_error/","page":"skip_error","title":"skip_error","text":"Operators","category":"page"},{"location":"api/observables/#observables_api","page":"Observables","title":"Observables API","text":"","category":"section"},{"location":"api/observables/","page":"Observables","title":"Observables","text":"Any observable-like should implement a valid subscribable logic.","category":"page"},{"location":"api/observables/#Traits","page":"Observables","title":"Traits","text":"","category":"section"},{"location":"api/observables/","page":"Observables","title":"Observables","text":"as_subscribable\nSubscribableTrait\nSimpleSubscribableTrait\nScheduledSubscribableTrait\nInvalidSubscribableTrait","category":"page"},{"location":"api/observables/#Rocket.as_subscribable","page":"Observables","title":"Rocket.as_subscribable","text":"as_subscribable(any)\n\nThis function checks subscribable trait behavior specification. Can be used explicitly to specify subscribable trait behavior for any object.\n\nSee also: SubscribableTrait\n\n\n\n\n\n","category":"function"},{"location":"api/observables/#Rocket.SubscribableTrait","page":"Observables","title":"Rocket.SubscribableTrait","text":"Abstract type for all possible subscribable traits\n\nSee also: SimpleSubscribableTrait, ScheduledSubscribableTrait, InvalidSubscribableTrait\n\n\n\n\n\n","category":"type"},{"location":"api/observables/#Rocket.SimpleSubscribableTrait","page":"Observables","title":"Rocket.SimpleSubscribableTrait","text":"Simple subscribable trait behavior. Simple subscribable can be used in subscribe! function and just executes on_subscribe! method for provided subscribable. SimpleSubscribableTrait is a subtype of SubscribableTrait.\n\nSee also: SubscribableTrait, Subscribable, subscribe!, on_subscribe!\n\n\n\n\n\n","category":"type"},{"location":"api/observables/#Rocket.ScheduledSubscribableTrait","page":"Observables","title":"Rocket.ScheduledSubscribableTrait","text":"Scheduled subscribable trait behavior. Scheduled subscribable can be used in subscribe! function and executes on_subscribe! method for provided subscribable with custom scheduling. ScheduledSubscribableTrait is a subtype of SubscribableTrait.\n\nSee also: SubscribableTrait, ScheduledSubscribable, subscribe!, on_subscribe!\n\n\n\n\n\n","category":"type"},{"location":"api/observables/#Rocket.InvalidSubscribableTrait","page":"Observables","title":"Rocket.InvalidSubscribableTrait","text":"Default subscribable trait behavior for all types. Invalid subscribable cannot be used in subscribe! function, doing so will throw an error. InvalidSubscribableTrait is a subtype of SubscribableTrait.\n\nSee also: SubscribableTrait, subscribe!\n\n\n\n\n\n","category":"type"},{"location":"api/observables/#Types","page":"Observables","title":"Types","text":"","category":"section"},{"location":"api/observables/","page":"Observables","title":"Observables","text":"AbstractSubscribable\nSubscribable\nScheduledSubscribable\nsubscribe!\non_subscribe!","category":"page"},{"location":"api/observables/#Rocket.AbstractSubscribable","page":"Observables","title":"Rocket.AbstractSubscribable","text":"Supertype type for Subscribable and ScheduledSubscribable types.\n\nSee also: Subscribable, ScheduledSubscribable\n\n\n\n\n\n","category":"type"},{"location":"api/observables/#Rocket.Subscribable","page":"Observables","title":"Rocket.Subscribable","text":"Super type for any simple subscribable object. Automatically specifies a SimpleSubscribableTrait trait behavior. Objects with specified SimpleSubscribableTrait subscribable trait must implement: on_subscribe!(subscribable, actor) method. Subscribable is a subtype of AbstractSubscribable type.\n\nExamples\n\nusing Rocket\n\nstruct MySubscribable <: Subscribable{String} end\n\nRocket.as_subscribable(MySubscribable)\n\n# output\n\nSimpleSubscribableTrait{String}()\n\nSee also: SubscribableTrait, SimpleSubscribableTrait\n\n\n\n\n\n","category":"type"},{"location":"api/observables/#Rocket.ScheduledSubscribable","page":"Observables","title":"Rocket.ScheduledSubscribable","text":"Super type for any scheduled subscribable object. Automatically specifies a ScheduledSubscribableTrait trait behavior. Objects with specified ScheduledSubscribableTrait subscribable trait must implement: on_subscribe!(subscribable, actor, scheduler) method. ScheduledSubscribable is a subtype of AbstractSubscribable type.\n\nExamples\n\nusing Rocket\n\nstruct MyScheduledSubscribable <: ScheduledSubscribable{String} end\n\nRocket.as_subscribable(MyScheduledSubscribable)\n\n# output\n\nScheduledSubscribableTrait{String}()\n\nSee also: SubscribableTrait, ScheduledSubscribableTrait\n\n\n\n\n\n","category":"type"},{"location":"api/observables/#Rocket.subscribe!","page":"Observables","title":"Rocket.subscribe!","text":"subscribe!(subscribable::T, actor::S) where { T, S }\nsubscribe!(subscribable::T, factory::F) where { T, F <: AbstractActorFactory }\nsubscribe!(subscriptions::Tuple)\nsubscribe!(subscriptions::AbstractVector)\n\nsubscribe! function is used to attach an actor to subscribable. It also checks types of subscribable and actors to be a valid Subscribable and Actor objects respectively. Passing not valid subscribable or/and actor object will throw an error. If the input argument to the subscribe! function is either a tuple or a vector, it will first check that all of the arguments are valid source and actor objects and if its true will subscribe for each of them individually. \n\nArguments\n\nsubscribable: valid subscribable object\nactor: valid actor object\n\nExamples\n\nusing Rocket\n\nsource = from((1, 2, 3))\nsubscribe!(source, logger())\n;\n\n# output\n\n[LogActor] Data: 1\n[LogActor] Data: 2\n[LogActor] Data: 3\n[LogActor] Completed\n\nusing Rocket\n\nsource = from((1, 2, 3))\nsubscribe!(source, 1)\n;\n\n# output\n\nERROR: Type Int64 is not a valid actor type.\n[...]\n\nusing Rocket\n\nsource = from((1, 2, 3))\nsubscribe!(1, logger())\n;\n\n# output\n\nERROR: Type Int64 is not a valid subscribable type.\n[...]\n\nSee also: on_subscribe!, as_subscribable\n\n\n\n\n\n","category":"function"},{"location":"api/observables/#Rocket.on_subscribe!","page":"Observables","title":"Rocket.on_subscribe!","text":"on_subscribe!(subscribable, actor)\non_subscribe!(subscribable, actor, scheduler)\n\nEvery valid subscribable object have to define its own method for on_subscribe! function which specifies subscription logic and has return a valid Teardown object.\n\nObjects with specified SimpleSubscribableTrait subscribable trait must implement: on_subscribe!(subscribable, actor) method. Objects with specified ScheduledSubscribableTrait subscribable trait must implement: on_subscribe!(subscribable, actor, scheduler) method.\n\nArguments\n\nsubscribable: Subscribable object\nactor: Actor object\nscheduler: Scheduler object (only for scheduled subscribables)\n\nExamples\n\nusing Rocket\n\nstruct MySubscribable <: Subscribable{Int} end\n\nfunction Rocket.on_subscribe!(subscribable::MySubscribable, actor)\n next!(actor, 0)\n complete!(actor)\n return voidTeardown\nend\n\nsubscribe!(MySubscribable(), logger())\n;\n\n# output\n\n[LogActor] Data: 0\n[LogActor] Completed\n\nusing Rocket\n\nstruct MyScheduledSubscribable <: ScheduledSubscribable{Int} end\n\nRocket.getscheduler(::MyScheduledSubscribable) = AsapScheduler()\n\nfunction Rocket.on_subscribe!(subscribable::MyScheduledSubscribable, actor, scheduler)\n next!(actor, 0, scheduler)\n complete!(actor, scheduler)\n return voidTeardown\nend\n\nsubscribe!(MyScheduledSubscribable(), logger())\n;\n\n# output\n\n[LogActor] Data: 0\n[LogActor] Completed\n\nSee also: Subscribable, ScheduledSubscribable, SimpleSubscribableTrait, ScheduledSubscribableTrait, Teardown, logger\n\n\n\n\n\n","category":"function"},{"location":"api/observables/#Errors","page":"Observables","title":"Errors","text":"","category":"section"},{"location":"api/observables/","page":"Observables","title":"Observables","text":"InvalidSubscribableTraitUsageError\nInconsistentActorWithSubscribableDataTypesError\nMissingOnSubscribeImplementationError\nMissingOnScheduledSubscribeImplementationError","category":"page"},{"location":"api/observables/#Rocket.InvalidSubscribableTraitUsageError","page":"Observables","title":"Rocket.InvalidSubscribableTraitUsageError","text":"This error will be thrown if subscribe! function is called with invalid subscribable object\n\nSee also: subscribe!\n\n\n\n\n\n","category":"type"},{"location":"api/observables/#Rocket.InconsistentActorWithSubscribableDataTypesError","page":"Observables","title":"Rocket.InconsistentActorWithSubscribableDataTypesError","text":"This error will be thrown if subscribe! function is called with inconsistent subscribable and actor objects\n\nSee also: subscribe!\n\n\n\n\n\n","category":"type"},{"location":"api/observables/#Rocket.MissingOnSubscribeImplementationError","page":"Observables","title":"Rocket.MissingOnSubscribeImplementationError","text":"This error will be thrown if Julia cannot find specific method of 'on_subscribe!()' function for given subscribable and actor\n\nSee also: on_subscribe!\n\n\n\n\n\n","category":"type"},{"location":"api/observables/#Rocket.MissingOnScheduledSubscribeImplementationError","page":"Observables","title":"Rocket.MissingOnScheduledSubscribeImplementationError","text":"This error will be thrown if Julia cannot find specific method of 'on_subscribe!()' function for given subscribable, actor and scheduler\n\nSee also: on_subscribe!\n\n\n\n\n\n","category":"type"},{"location":"operators/mathematical/sum/#operator_sum","page":"sum","title":"Sum Operator","text":"","category":"section"},{"location":"operators/mathematical/sum/","page":"sum","title":"sum","text":"sum","category":"page"},{"location":"operators/mathematical/sum/#Base.sum","page":"sum","title":"Base.sum","text":"sum(; from = nothing)\n\nCreates a sum operator, which applies a sum accumulator function over the source Observable, and returns the accumulated result when the source completes, given an optional initial value.\n\nThe sum operator is similar to reduce(T, T, +) (see reduce).\n\nArguments\n\nfrom: optional initial accumulation value, if nothing first value will be used instead\n\nProducing\n\nStream of type <: Subscribable{L} where L refers to type of source stream\n\nExamples\n\nusing Rocket\n\nsource = from([ i for i in 1:42 ])\nsubscribe!(source |> sum(), logger())\n;\n\n# output\n\n[LogActor] Data: 903\n[LogActor] Completed\n\n\nusing Rocket\n\nsource = from([ i for i in 1:42 ])\nsubscribe!(source |> sum(from = 97), logger())\n;\n\n# output\n\n[LogActor] Data: 1000\n[LogActor] Completed\n\n\nSee also: AbstractOperator, InferableOperator, ProxyObservable, reduce, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/mathematical/sum/#Description","page":"sum","title":"Description","text":"","category":"section"},{"location":"operators/mathematical/sum/","page":"sum","title":"sum","text":"sum operates on an Observable of objects on which + is defined. When the source Observable completes, it emits the sum of all previous items. The sum operator is similar to reduce(T, T, +) (see reduce).","category":"page"},{"location":"operators/mathematical/sum/#See-also","page":"sum","title":"See also","text":"","category":"section"},{"location":"operators/mathematical/sum/","page":"sum","title":"sum","text":"Operators, reduce","category":"page"},{"location":"actors/types/void/#actor_void","page":"Void","title":"Void actor","text":"","category":"section"},{"location":"actors/types/void/","page":"Void","title":"Void","text":"void","category":"page"},{"location":"actors/types/void/#Rocket.void","page":"Void","title":"Rocket.void","text":"void()\nvoid(::Type{T}) where T\n\nCreation operator for the VoidActor actor.\n\nExamples\n\nusing Rocket\n\nactor = void(Int)\nactor isa VoidActor{Int}\n\n# output\ntrue\n\n\nSee also: VoidActor, AbstractActor\n\n\n\n\n\n","category":"function"},{"location":"actors/types/void/","page":"Void","title":"Void","text":"VoidActor","category":"page"},{"location":"actors/types/void/#Rocket.VoidActor","page":"Void","title":"Rocket.VoidActor","text":"VoidActor{D}() where D\n\nVoid actor does nothing with input data, error and complete events, can be useful for debugging (e.g. to start side-effects with tap operator)\n\nExamples\n\nusing Rocket\n\nsource = from([ 0, 1, 2 ])\nactor = VoidActor{Int}()\n\nsubscribe!(source, actor)\n;\n\n# output\n\n\nSee also: Actor, void, tap\n\n\n\n\n\n","category":"type"},{"location":"observables/types/proxy/#observable_proxy","page":"Proxy","title":"Proxy Observable","text":"","category":"section"},{"location":"observables/types/proxy/","page":"Proxy","title":"Proxy","text":"ProxyObservable might help to create a custom operator. It wraps either source and/or actor with their proxied versions providing additional custom logic for on_subscribe! and/or for on_next!, on_error!, on_complete! methods.","category":"page"},{"location":"observables/types/proxy/","page":"Proxy","title":"Proxy","text":"proxy\nProxyObservable","category":"page"},{"location":"observables/types/proxy/#Rocket.proxy","page":"Proxy","title":"Rocket.proxy","text":"proxy(::Type{L}, source, proxy) where L\n\nCreation operator for the ProxyObservable with a given source and proxy objects.\n\nExample\n\nusing Rocket\n\nsource = from(1:5)\n\nstruct MyCustomProxy <: ActorProxy end\n\nstruct MyCustomActor{A} <: Actor{Int}\n actor :: A\nend\n\nRocket.on_next!(actor::MyCustomActor, data::Int) = next!(actor.actor, data ^ 2)\nRocket.on_error!(actor::MyCustomActor, err) = error!(actor.actor, err)\nRocket.on_complete!(actor::MyCustomActor) = complete!(actor.actor)\n\nRocket.actor_proxy!(::Type{Int}, proxy::MyCustomProxy, actor::A) where A = MyCustomActor{A}(actor)\n\nproxied = proxy(Int, source, MyCustomProxy())\n\nsubscribe!(proxied, logger())\n;\n\n# output\n\n[LogActor] Data: 1\n[LogActor] Data: 4\n[LogActor] Data: 9\n[LogActor] Data: 16\n[LogActor] Data: 25\n[LogActor] Completed\n\nSee also: ProxyObservable, ActorProxy, SourceProxy, ActorSourceProxy\n\n\n\n\n\n","category":"function"},{"location":"observables/types/proxy/#Rocket.ProxyObservable","page":"Proxy","title":"Rocket.ProxyObservable","text":"ProxyObservable{L, S, P}(proxied_source::S, proxy::P)\n\nAn interface for proxied Observables.\n\nSee also: proxy\n\n\n\n\n\n","category":"type"},{"location":"observables/types/proxy/","page":"Proxy","title":"Proxy","text":"ActorProxy\nSourceProxy\nActorSourceProxy","category":"page"},{"location":"observables/types/proxy/#Rocket.ActorProxy","page":"Proxy","title":"Rocket.ActorProxy","text":"ActorProxy\n\nCan be used as a super type for common proxy object. Automatically specifies ValidActorProxy trait behavior. Each ActorProxy must implement its own method for actor_proxy!(::Type, proxy, actor) function which have to return a valid actor object.\n\nSee also: proxy, actor_proxy!\n\n\n\n\n\n","category":"type"},{"location":"observables/types/proxy/#Rocket.SourceProxy","page":"Proxy","title":"Rocket.SourceProxy","text":"SourceProxy\n\nCan be used as a super type for common proxy object. Automatically specifies ValidSourceProxy trait behavior. Each SourceProxy must implement its own method for source_proxy!(::Type, proxy, source) function which have to return a valid subscribable object.\n\nSee also: proxy, source_proxy!\n\n\n\n\n\n","category":"type"},{"location":"observables/types/proxy/#Rocket.ActorSourceProxy","page":"Proxy","title":"Rocket.ActorSourceProxy","text":"ActorSourceProxy\n\nCan be used as a super type for common proxy object. Automatically specifies ValidActorSourceProxy trait behavior. Each ActorSourceProxy must implement its own method for source_proxy!(::Type, proxy, source) function which have to return a valid subscribable object and also for actor_proxy!(::Type, proxy, actor) function which have to return a valid actor object..\n\nSee also: proxy, actor_proxy!, source_proxy!\n\n\n\n\n\n","category":"type"},{"location":"observables/types/proxy/","page":"Proxy","title":"Proxy","text":"actor_proxy!\nsource_proxy!","category":"page"},{"location":"observables/types/proxy/#Rocket.actor_proxy!","page":"Proxy","title":"Rocket.actor_proxy!","text":"actor_proxy!(::Type, proxy, actor)\n\nThis is function is used to wrap an actor with its proxied version given a particular proxy object. Must return another actor. Each valid ActorProxy and ActorSourceProxy must implement its own method for actor_proxy! function. The first argument is the same as the type of data of the connected proxy observable.\n\nSee also: proxy, ActorProxy, ActorSourceProxy\n\n\n\n\n\n","category":"function"},{"location":"observables/types/proxy/#Rocket.source_proxy!","page":"Proxy","title":"Rocket.source_proxy!","text":"source_proxy!(::Type, proxy, source)\n\nThis is function is used to wrap a source with its proxied version given a particular proxy object. Must return another Observable. Each valid SourceProxy and ActorSourceProxy must implement its own method for source_proxy! function. The first argument is the same as the type of data of the connected proxy observable.\n\nSee also: proxy, SourceProxy, ActorSourceProxy\n\n\n\n\n\n","category":"function"},{"location":"operators/transformation/to_array/#operator_to_array","page":"to_array","title":"Uppercase Operator","text":"","category":"section"},{"location":"operators/transformation/to_array/","page":"to_array","title":"to_array","text":"to_array","category":"page"},{"location":"operators/transformation/to_array/#Rocket.to_array","page":"to_array","title":"Rocket.to_array","text":"to_array()\n\nCreates a to_array operator, which reduces all values into a single array and returns this result when the source completes.\n\nProducing\n\nStream of type <: Subscribable{Vector{L}} where L refers to type of source stream\n\nExamples\n\nusing Rocket\n\nsource = from([ 1, 2, 3 ])\nsubscribe!(source |> to_array(), logger())\n;\n\n# output\n\n[LogActor] Data: [1, 2, 3]\n[LogActor] Completed\n\n\nSee also: AbstractOperator, InferableOperator, ProxyObservable, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/transformation/to_array/#See-also","page":"to_array","title":"See also","text":"","category":"section"},{"location":"operators/transformation/to_array/","page":"to_array","title":"to_array","text":"Operators, map, lowercase","category":"page"},{"location":"operators/transformation/about/#Transformation-category","page":"About transformation operators","title":"Transformation category","text":"","category":"section"},{"location":"operators/transformation/about/","page":"About transformation operators","title":"About transformation operators","text":"There are operators for different purposes, and they may be categorized as: creation, transformation, filtering, joining, multicasting, error handling, utility, etc. In the following list you will find all the operators organized in transformation category.","category":"page"},{"location":"operators/transformation/about/","page":"About transformation operators","title":"About transformation operators","text":"map\nmap_to\nscan\naccumulated\nenumerate\nuppercase\nlowercase\nto_array\nswitch_map\nswitch_map_to\nmerge_map\nconcat_map\nconcat_map_to\nexhaust_map\nstart_with\npairwise\nsubstitute\noverride","category":"page"},{"location":"operators/transformation/about/#See-also","page":"About transformation operators","title":"See also","text":"","category":"section"},{"location":"operators/transformation/about/","page":"About transformation operators","title":"About transformation operators","text":"Operators","category":"page"}] +[{"location":"operators/utility/skip_complete/#operator_skip_complete","page":"skip_complete","title":"SkipComplete Operator","text":"","category":"section"},{"location":"operators/utility/skip_complete/","page":"skip_complete","title":"skip_complete","text":"skip_complete","category":"page"},{"location":"operators/utility/skip_complete/#Rocket.skip_complete","page":"skip_complete","title":"Rocket.skip_complete","text":"skip_complete()\n\nCreates a skip_complete operator, which filters out complete event by the source Observable by emitting only next and error messages.\n\nProducing\n\nStream of type <: Subscribable{L} where L refers to type of source stream\n\nExamples\n\nusing Rocket\n\nsource = from([ 1, 2, 3 ])\nsubscribe!(source |> skip_complete(), logger())\n;\n\n# output\n[LogActor] Data: 1\n[LogActor] Data: 2\n[LogActor] Data: 3\n\n\nSee also: AbstractOperator, InferableOperator, ProxyObservable, skip_error, skip_next, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/utility/skip_complete/#See-also","page":"skip_complete","title":"See also","text":"","category":"section"},{"location":"operators/utility/skip_complete/","page":"skip_complete","title":"skip_complete","text":"Operators","category":"page"},{"location":"operators/transformation/start_with/#operator_start_with","page":"start_with","title":"StartWith Operator","text":"","category":"section"},{"location":"operators/transformation/start_with/","page":"start_with","title":"start_with","text":"start_with","category":"page"},{"location":"operators/transformation/start_with/#Rocket.start_with","page":"start_with","title":"Rocket.start_with","text":"start_with(object::O) where O\n\nCreates a start_with operator, which forces an observable to emit given object as a first value.\n\nProducing\n\nStream of type <: Subscribable{Union{L, O}} where L refers to type of source stream <: Subscribable{L}\n\nExamples\n\nusing Rocket\n\nsource = from(1:3) |> start_with(0)\nsubscribe!(source, logger())\n;\n\n# output\n\n[LogActor] Data: 0\n[LogActor] Data: 1\n[LogActor] Data: 2\n[LogActor] Data: 3\n[LogActor] Completed\n\nSee also: AbstractOperator, InferableOperator, ProxyObservable, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/transformation/start_with/#See-also","page":"start_with","title":"See also","text":"","category":"section"},{"location":"operators/transformation/start_with/","page":"start_with","title":"start_with","text":"Operators","category":"page"},{"location":"actors/types/server/#actor_server","page":"Server","title":"Server actor","text":"","category":"section"},{"location":"actors/types/server/","page":"Server","title":"Server","text":"server","category":"page"},{"location":"actors/types/server/#Rocket.server","page":"Server","title":"Rocket.server","text":"server(port::Int)\nserver(address::A, port::Int) where { A <: IPAddr }\nserver(::Type{D}, port::Int)\nserver(::Type{D}, address::A, port::Int) where { A <: IPAddr }\n\nCreation operator for the ServerActor actor.\n\nSee also: AbstractActor\n\n\n\n\n\n","category":"function"},{"location":"actors/types/server/","page":"Server","title":"Server","text":"ServerActor","category":"page"},{"location":"actors/types/server/#Rocket.ServerActor","page":"Server","title":"Rocket.ServerActor","text":"ServerActor{D, Address, Port}() where D\n\nThe ServerActor sends all next!/error!/complete! events to the local network listeners with specified Address and Port parameters via TCPSocket.\n\nSee also: Actor, server\n\n\n\n\n\n","category":"type"},{"location":"operators/transformation/exhaust_map/#operator_exhaust_map","page":"exhaust_map","title":"ExhaustMap Operator","text":"","category":"section"},{"location":"operators/transformation/exhaust_map/","page":"exhaust_map","title":"exhaust_map","text":"exhaust_map","category":"page"},{"location":"operators/transformation/exhaust_map/#Rocket.exhaust_map","page":"exhaust_map","title":"Rocket.exhaust_map","text":"exhaust_map(::Type{R}, mappingFn::F = identity) where { R, F <: Function }\n\nCreates a exhaust_map operator, which returns an Observable containing projected Observables of each item of the source, ignoring projected Observables that start before their preceding Observable has completed. Essentially it projects each source value to an Observable which is merged in the output Observable only if the previous projected Observable has completed.\n\nArguments\n\n::Type{R}: the type of data of output Observables after projection with mappingFn\nmappingFn::F: projection function with (data) -> Observable{R} signature\n\nProducing\n\nStream of type <: Subscribable{R}\n\nExamples\n\nusing Rocket\n\nsource = from([ 0, 0 ]) |> async() |> exhaust_map(Int, d -> from([ 1, 2 ]) |> async())\nsubscribe!(source, logger())\n;\n\n# output\n\n[LogActor] Data: 1\n[LogActor] Data: 2\n[LogActor] Completed\n\nSee also: AbstractOperator, RightTypedOperator, ProxyObservable, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/transformation/exhaust_map/#See-also","page":"exhaust_map","title":"See also","text":"","category":"section"},{"location":"operators/transformation/exhaust_map/","page":"exhaust_map","title":"exhaust_map","text":"Operators","category":"page"},{"location":"operators/utility/ref_count/#operator_ref_count","page":"ref_count","title":"Ref Count Operator","text":"","category":"section"},{"location":"operators/utility/ref_count/","page":"ref_count","title":"ref_count","text":"ref_count","category":"page"},{"location":"operators/utility/ref_count/#Rocket.ref_count","page":"ref_count","title":"Rocket.ref_count","text":"ref_count()\n\nMake a ConnectableObservable behave like a ordinary observable and automates the way you can connect to it. Internally it counts the subscriptions to the observable and subscribes (only once) to the source if the number of subscriptions is larger than 0. If the number of subscriptions is smaller than 1, it unsubscribes from the source. This way you can make sure that everything before the published refCount has only a single subscription independently of the number of subscribers to the target observable.\n\nNote that using the share operator is exactly the same as using the publish operator (making the observable hot) and the ref_count() operator in a sequence.\n\nExample\n\nusing Rocket\n\nsubject = Subject(Int, scheduler = AsapScheduler())\nsource = from(1:5) |> multicast(subject) |> ref_count()\n\nactor1 = logger(\"1\")\nactor2 = logger(\"2\")\n\nsubscription1 = subscribe!(source, actor1)\nsubscription2 = subscribe!(source, actor2)\n\nunsubscribe!(subscription1)\nunsubscribe!(subscription2)\n;\n\n# output\n[1] Data: 1\n[1] Data: 2\n[1] Data: 3\n[1] Data: 4\n[1] Data: 5\n[1] Completed\n[2] Completed\n\nSee also: AbstractOperator, publish, multicast, share\n\n\n\n\n\n","category":"function"},{"location":"operators/utility/ref_count/#See-also","page":"ref_count","title":"See also","text":"","category":"section"},{"location":"operators/utility/ref_count/","page":"ref_count","title":"ref_count","text":"Operators","category":"page"},{"location":"actors/types/keep/#actor_keep","page":"Keep","title":"Keep actor","text":"","category":"section"},{"location":"actors/types/keep/","page":"Keep","title":"Keep","text":"keep","category":"page"},{"location":"actors/types/keep/#Rocket.keep","page":"Keep","title":"Rocket.keep","text":"keep(::Type{T}) where T\n\nArguments\n\n::Type{T}: Type of keep data\n\nCreation operator for the KeepActor actor.\n\nExamples\n\nusing Rocket\n\nactor = keep(Int)\nactor isa KeepActor{Int}\n\n# output\ntrue\n\nSee also: KeepActor, AbstractActor\n\n\n\n\n\n","category":"function"},{"location":"actors/types/keep/","page":"Keep","title":"Keep","text":"KeepActor","category":"page"},{"location":"actors/types/keep/#Rocket.KeepActor","page":"Keep","title":"Rocket.KeepActor","text":"KeepActor{D}() where D\n\nKeep actor provides a storage actor. It saves all incoming successful next events in a values array, throws an ErrorException on error! event and does nothing on completion event.\n\nExamples\n\nusing Rocket\n\nsource = from(1:5)\nactor = keep(Int)\n\nsubscribe!(source, actor)\nshow(getvalues(actor))\n\n# output\n[1, 2, 3, 4, 5]\n\nSee also: Actor, keep\n\n\n\n\n\n","category":"type"},{"location":"observables/types/collected/#observable_collected","page":"Collected","title":"Collected Observable","text":"","category":"section"},{"location":"observables/types/collected/","page":"Collected","title":"Collected","text":"collectLatest","category":"page"},{"location":"observables/types/collected/#Rocket.collectLatest","page":"Collected","title":"Rocket.collectLatest","text":"collectLatest(sources::S, mappingFn::F = copy) where { S, F }\ncollectLatest(::Type{T}, ::Type{R}, sources::S, mappingFn::F = copy)\n\nCollects values from multible Observables and emits it in one single array every time each inner Observable has a new value. Reemits errors from inner observables. Completes when all inner observables completes.\n\nArguments\n\nsources: input sources\nmappingFn: optional mappingFn applied to an array of emited values, copy by default, should return a Vector\n\nNote: collectLatest completes immediately if sources are empty.\n\nOptional arguments\n\n::Type{T}: optional type of emmiting values of inner observables\n::Type{R}: optional return type after applying mappingFn to a vector of values\n\nExamples\n\nusing Rocket\n\ncollected = collectLatest([ of(1), from([ 1, 2 ]) ])\n\nsubscribe!(collected, logger())\n;\n\n# output\n\n[LogActor] Data: [1, 1]\n[LogActor] Data: [1, 2]\n[LogActor] Completed\n\nSee also: Subscribable, subscribe!, combineLatest\n\n\n\n\n\n","category":"function"},{"location":"observables/types/collected/#Description","page":"Collected","title":"Description","text":"","category":"section"},{"location":"observables/types/collected/","page":"Collected","title":"Collected","text":"collectLatest collects the values from all Observables in its vector argument. This is done by subscribing to each Observable in order and, whenever an Observable emits, collecting a vector of the most recent values from each Observable (in order). If you pass n Observables to collectLatest, the returned Observable will always emit an ordered vector of n values.","category":"page"},{"location":"observables/types/collected/","page":"Collected","title":"Collected","text":"To ensure that the output vector has a consistent length, collectLatest waits for all input Observables to emit at least once before it starts emitting results. This means that if some Observable emits values before other Observables started emitting, all these values but the last will be lost. On the other hand, if some Observable does not emit a value but completes, the resulting Observable will complete simultaneously without emitting anything. Furthermore, if some input Observable does not emit any value and never completes, collectLatest will also never emit and never complete.","category":"page"},{"location":"observables/types/collected/","page":"Collected","title":"Collected","text":"If at least one Observable was passed to collectLatest and all passed Observables emitted, then the resulting Observable will complete when all combined streams complete. So even if some Observable completes, the result of collectLatest will still emit values when the other Observables do. In case of a completed Observable, its value will now remain to be the last emitted value. On the other hand, if any Observable errors, collectLatest will also immediately error.","category":"page"},{"location":"observables/types/defer/#observable_defer","page":"Defer","title":"Defer Observable","text":"","category":"section"},{"location":"observables/types/defer/","page":"Defer","title":"Defer","text":"defer","category":"page"},{"location":"observables/types/defer/#Rocket.defer","page":"Defer","title":"Rocket.defer","text":"defer(::Type{D}, factoryFn::F) where { D, F <: Function }\n\nCreates an Observable that, on subscribe, calls an Observable factory to make an Observable for each new Observer.\n\nArguments\n\nT: type of output data source, created by the factoryFn\nfactoryFn: the Observable factory function to invoke for each Observer that subscribes to the output Observable\n\nExamples\n\nusing Rocket\n\nsource = defer(Int, () -> from([ 1, 2, 3 ]))\n\nsubscribe!(source, logger())\n;\n\n# output\n[LogActor] Data: 1\n[LogActor] Data: 2\n[LogActor] Data: 3\n[LogActor] Completed\n\nSee also: Subscribable, subscribe!, logger\n\n\n\n\n\n","category":"function"},{"location":"observables/types/defer/#Description","page":"Defer","title":"Description","text":"","category":"section"},{"location":"observables/types/defer/","page":"Defer","title":"Defer","text":"defer allows you to create the Observable only when the Actor subscribes, and create a fresh Observable for each Actor. It waits until an Actor subscribes to it, and then it generates an Observable, typically with an Observable factory function. It does this afresh for each subscriber, so although each subscriber may think it is subscribing to the same Observable, in fact each subscriber gets its own individual Observable.","category":"page"},{"location":"operators/filtering/last/#operator_last","page":"last","title":"Last Operator","text":"","category":"section"},{"location":"operators/filtering/last/","page":"last","title":"last","text":"last","category":"page"},{"location":"operators/filtering/last/#Base.last","page":"last","title":"Base.last","text":"last(; default = nothing)\n\nCreates a last operator, which returns an Observable that emits only the last item emitted by the source Observable. Sends LastNotFoundException error message if a given source completes without emitting a single value.\n\nArguments\n\ndefault: an optional default value to provide if no values were emitted\n\nProducing\n\nStream of type <: Subscribable{L} where L refers to type of source stream\n\nExamples\n\nusing Rocket\n\nsource = from([ 1, 2, 3 ])\nsubscribe!(source |> last(), logger())\n;\n\n# output\n\n[LogActor] Data: 3\n[LogActor] Completed\n\n\nusing Rocket\n\nsource = from(Int[])\nsubscribe!(source |> last() |> catch_error((err, obs) -> of(1)), logger())\n;\n\n# output\n\n[LogActor] Data: 1\n[LogActor] Completed\n\nusing Rocket\n\nsource = from(Int[])\nsubscribe!(source |> last(default = 1), logger())\n;\n\n# output\n\n[LogActor] Data: 1\n[LogActor] Completed\n\nSee also: AbstractOperator, InferableOperator, ProxyObservable, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/filtering/last/#Description","page":"last","title":"Description","text":"","category":"section"},{"location":"operators/filtering/last/","page":"last","title":"last","text":"last operator returns an Observable that emits only the last item emitted by the source Observable.","category":"page"},{"location":"operators/filtering/last/#See-also","page":"last","title":"See also","text":"","category":"section"},{"location":"operators/filtering/last/","page":"last","title":"last","text":"Operators","category":"page"},{"location":"operators/utility/tap_on_subscribe/#operator_tap_on_subscribe","page":"tap_on_subscribe","title":"TapOnSubscribe Operator","text":"","category":"section"},{"location":"operators/utility/tap_on_subscribe/","page":"tap_on_subscribe","title":"tap_on_subscribe","text":"TapBeforeSubscription\nTapAfterSubscription\ntap_on_subscribe","category":"page"},{"location":"operators/utility/tap_on_subscribe/#Rocket.TapBeforeSubscription","page":"tap_on_subscribe","title":"Rocket.TapBeforeSubscription","text":"TapBeforeSubscription\n\nOne of the strategies for tap_on_subscribe operator. With TapBeforeSubscription tap callback will be called before actual subscription.\n\nSee also: tap_on_subscribe, TapAfterSubscription\n\n\n\n\n\n","category":"type"},{"location":"operators/utility/tap_on_subscribe/#Rocket.TapAfterSubscription","page":"tap_on_subscribe","title":"Rocket.TapAfterSubscription","text":"TapAfterSubscription\n\nOne of the strategies for tap_on_subscribe operator. With TapBeforeSubscription tap callback will be called after actual subscription.\n\nSee also: tap_on_subscribe, TapBeforeSubscription\n\n\n\n\n\n","category":"type"},{"location":"operators/utility/tap_on_subscribe/#Rocket.tap_on_subscribe","page":"tap_on_subscribe","title":"Rocket.tap_on_subscribe","text":"tap_on_subscribe(tapFn::F, strategy::S = TapBeforeSubscription()) where { F <: Function }\n\nCreates a tap operator, which performs a side effect on the subscription on the source Observable, but return an Observable that is identical to the source.\n\nArguments\n\ntapFn::Function: side-effect tap function with () -> Nothing signature\nstrategy: (optional), specifies the order of a side-effect and an actual subscription, uses TapBeforeSubscription by default\n\nProducing\n\nStream of type <: Subscribable{L} where L refers to type of source stream\n\nExamples\n\nusing Rocket\n\nsource = from([ 1, 2, 3 ])\nsubscribe!(source |> tap_on_subscribe(() -> println(\"Someone subscribed\")), logger())\n;\n\n# output\n\nSomeone subscribed\n[LogActor] Data: 1\n[LogActor] Data: 2\n[LogActor] Data: 3\n[LogActor] Completed\n\nusing Rocket\n\nsource = from([ 1, 2, 3 ])\nsubscribe!(source |> tap_on_subscribe(() -> println(\"Someone subscribed\"), TapAfterSubscription()), logger())\n;\n\n# output\n\n[LogActor] Data: 1\n[LogActor] Data: 2\n[LogActor] Data: 3\n[LogActor] Completed\nSomeone subscribed\n\nSee also: TapBeforeSubscription, TapAfterSubscription, tap, tap_on_unsubscribe, tap_on_complete, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/utility/tap_on_subscribe/#Description","page":"tap_on_subscribe","title":"Description","text":"","category":"section"},{"location":"operators/utility/tap_on_subscribe/","page":"tap_on_subscribe","title":"tap_on_subscribe","text":"Returns an Observable that resembles the source Observable, but modifies it so that the provided Observer is called to perform a side effect on subscription to the source.","category":"page"},{"location":"operators/utility/tap_on_subscribe/","page":"tap_on_subscribe","title":"tap_on_subscribe","text":"This operator is useful for debugging your Observables, verifying correctness, or performing other side effects.","category":"page"},{"location":"operators/utility/tap_on_subscribe/","page":"tap_on_subscribe","title":"tap_on_subscribe","text":"Note: this operator differs from a subscribe on the Observable. If the Observable returned by tap_on_subscribe is not subscribed, the side effects specified by the Observer will never happen. tap_on_subscribe therefore simply spies on future execution, it does not trigger an execution to happen like subscribe does.","category":"page"},{"location":"operators/utility/tap_on_subscribe/#See-also","page":"tap_on_subscribe","title":"See also","text":"","category":"section"},{"location":"operators/utility/tap_on_subscribe/","page":"tap_on_subscribe","title":"tap_on_subscribe","text":"Operators","category":"page"},{"location":"operators/utility/safe/#operator_safe","page":"safe","title":"Safe Operator","text":"","category":"section"},{"location":"operators/utility/safe/","page":"safe","title":"safe","text":"safe","category":"page"},{"location":"operators/utility/safe/#Rocket.safe","page":"safe","title":"Rocket.safe","text":"safe()\n\nCreates a SafeOperator, which wraps on_subscribe! and each next!, error! and complete! callbacks into try-catch block.\n\nProducing\n\nStream of type <: Subscribable{L} where L refers to type of source stream\n\nSee also: AbstractOperator, InferableOperator, ProxyObservable, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/utility/safe/#See-also","page":"safe","title":"See also","text":"","category":"section"},{"location":"operators/utility/safe/","page":"safe","title":"safe","text":"Operators","category":"page"},{"location":"operators/utility/skip_next/#operator_skip_next","page":"skip_next","title":"SkipNext Operator","text":"","category":"section"},{"location":"operators/utility/skip_next/","page":"skip_next","title":"skip_next","text":"skip_next","category":"page"},{"location":"operators/utility/skip_next/#Rocket.skip_next","page":"skip_next","title":"Rocket.skip_next","text":"skip_next()\n\nCreates a skip_next operator, which filters out all next messages by the source Observable by emitting only error and complete messages.\n\nProducing\n\nStream of type <: Subscribable{L} where L refers to type of source stream\n\nExamples\n\nusing Rocket\n\nsource = from([ 1, 2, 3 ])\nsubscribe!(source |> skip_next(), logger())\n;\n\n# output\n[LogActor] Completed\n\n\nSee also: AbstractOperator, InferableOperator, ProxyObservable, skip_error, skip_complete, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/utility/skip_next/#See-also","page":"skip_next","title":"See also","text":"","category":"section"},{"location":"operators/utility/skip_next/","page":"skip_next","title":"skip_next","text":"Operators","category":"page"},{"location":"operators/transformation/switch_map/#operator_switch_map","page":"switch_map","title":"SwitchMap Operator","text":"","category":"section"},{"location":"operators/transformation/switch_map/","page":"switch_map","title":"switch_map","text":"switch_map","category":"page"},{"location":"operators/transformation/switch_map/#Rocket.switch_map","page":"switch_map","title":"Rocket.switch_map","text":"switch_map(::Type{R}, mappingFn::F = identity) where { R, F <: Function }\n\nCreates a switch_map operator, which returns an Observable that emits items based on applying a function mappingFn that you supply to each item emitted by the source Observable, where that function returns an (so-called \"inner\") Observable. Each time it observes one of these inner Observables, the output Observable begins emitting the items emitted by that inner Observable. When a new inner Observable is emitted, switch_map stops emitting items from the earlier-emitted inner Observable and begins emitting items from the new one. It continues to behave like this for subsequent inner Observables.\n\nArguments\n\n::Type{R}: the type of data of output Observables after projection with mappingFn\nmappingFn::F: projection function with (data) -> Observable{R} signature\n\nProducing\n\nStream of type <: Subscribable{R}\n\nExamples\n\nusing Rocket\n\nsource = from([ of(1), of(2), of(3) ])\nsubscribe!(source |> switch_map(Int), logger())\n;\n\n# output\n\n[LogActor] Data: 1\n[LogActor] Data: 2\n[LogActor] Data: 3\n[LogActor] Completed\n\nusing Rocket\n\nsource = from([ 1, 2, 3 ])\nsubscribe!(source |> switch_map(Float64, (d) -> of(convert(Float64, d ^ 2))), logger())\n;\n\n# output\n\n[LogActor] Data: 1.0\n[LogActor] Data: 4.0\n[LogActor] Data: 9.0\n[LogActor] Completed\n\nSee also: AbstractOperator, RightTypedOperator, ProxyObservable, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/transformation/switch_map/#See-also","page":"switch_map","title":"See also","text":"","category":"section"},{"location":"operators/transformation/switch_map/","page":"switch_map","title":"switch_map","text":"Operators","category":"page"},{"location":"api/actors/#actors_api","page":"Actors","title":"Actors API","text":"","category":"section"},{"location":"api/actors/#How-to-create-a-custom-Actor","page":"Actors","title":"How to create a custom Actor","text":"","category":"section"},{"location":"api/actors/","page":"Actors","title":"Actors","text":"At first custom actor should implement a custom method for the as_actor function. Rocket.jl also provides a number of helper actor abstract types with predefined as_actor method behavior (see Traits API section).","category":"page"},{"location":"api/actors/","page":"Actors","title":"Actors","text":"using Rocket\n\nstruct MyCustomActor end\n\nas_actor(::Type{<:MyCustomActor}) = Rocket.BaseActorTrait{Int}()\n","category":"page"},{"location":"api/actors/","page":"Actors","title":"Actors","text":"or","category":"page"},{"location":"api/actors/","page":"Actors","title":"Actors","text":"using Rocket\n\nstruct MyCustomActor <: Actor{Int} end # Automatically specifies BaseActorTrait{Int} behavior.","category":"page"},{"location":"api/actors/","page":"Actors","title":"Actors","text":"Additionally custom actor must provide a custom methods for on_next!, on_error! and/or on_complete! functions. Depending on specified actor trait behavior some methods may or may not be optional.","category":"page"},{"location":"api/actors/","page":"Actors","title":"Actors","text":"using Rocket\n\nstruct MyCustomActor <: Actor{Int} end\n\nRocket.on_next!(actor::MyCustomActor, data::Int) = # custom logic here\nRocket.on_error!(actor::MyCustomActor, err) = # custom logic here\nRocket.on_complete!(actor::MyCustomActor) = # custom logic here","category":"page"},{"location":"api/actors/","page":"Actors","title":"Actors","text":"or","category":"page"},{"location":"api/actors/","page":"Actors","title":"Actors","text":"using Rocket\n\nstruct MyCustomCompletionActor <: CompletionActor{Int} end\n\nRocket.on_complete!(actor::MyCustomCompletionActor) = # custom logic here","category":"page"},{"location":"api/actors/#actors_api_traits","page":"Actors","title":"Traits","text":"","category":"section"},{"location":"api/actors/","page":"Actors","title":"Actors","text":"as_actor\nActorTrait\nBaseActorTrait\nNextActorTrait\nErrorActorTrait\nCompletionActorTrait\nInvalidActorTrait","category":"page"},{"location":"api/actors/#Rocket.as_actor","page":"Actors","title":"Rocket.as_actor","text":"as_actor(any)\n\nThis function checks actor trait behavior specification. May be used explicitly to specify actor trait behavior for any object.\n\nSee also: ActorTrait\n\n\n\n\n\n","category":"function"},{"location":"api/actors/#Rocket.ActorTrait","page":"Actors","title":"Rocket.ActorTrait","text":"Abstract type for all possible actor traits\n\nSee also: BaseActorTrait, NextActorTrait, ErrorActorTrait, CompletionActorTrait, InvalidActorTrait\n\n\n\n\n\n","category":"type"},{"location":"api/actors/#Rocket.BaseActorTrait","page":"Actors","title":"Rocket.BaseActorTrait","text":"Base actor trait specifies actor to listen for all next!, error! and complete! events. BaseActorTrait is a subtype of ActorTrait.\n\nSee also: Actor\n\n\n\n\n\n","category":"type"},{"location":"api/actors/#Rocket.NextActorTrait","page":"Actors","title":"Rocket.NextActorTrait","text":"Next actor trait specifies actor to listen for next! events only. NextActorTrait is a subtype of ActorTrait.\n\nSee also: NextActor\n\n\n\n\n\n","category":"type"},{"location":"api/actors/#Rocket.ErrorActorTrait","page":"Actors","title":"Rocket.ErrorActorTrait","text":"Error actor trait specifies actor to listen for error! events only. ErrorActorTrait is a subtype of ActorTrait.\n\nSee also: ErrorActor\n\n\n\n\n\n","category":"type"},{"location":"api/actors/#Rocket.CompletionActorTrait","page":"Actors","title":"Rocket.CompletionActorTrait","text":"Completion actor trait specifies actor to listen for complete! events only. CompletionActorTrait is a subtype of ActorTrait.\n\nSee also: CompletionActor\n\n\n\n\n\n","category":"type"},{"location":"api/actors/#Rocket.InvalidActorTrait","page":"Actors","title":"Rocket.InvalidActorTrait","text":"Default actor trait behavior for any object. Actor with such a trait specificaion cannot be used as a valid actor in subscribe! function. Doing so will raise an error. InvalidActorTrait is a subtype of ActorTrait.\n\nSee also: ActorTrait\n\n\n\n\n\n","category":"type"},{"location":"api/actors/#Types","page":"Actors","title":"Types","text":"","category":"section"},{"location":"api/actors/","page":"Actors","title":"Actors","text":"AbstractActor\nActor\nNextActor\nErrorActor\nCompletionActor","category":"page"},{"location":"api/actors/#Rocket.AbstractActor","page":"Actors","title":"Rocket.AbstractActor","text":"Supertype type for Actor, NextActor, ErrorActor and CompletionActor types.\n\nSee also: Actor, NextActor, ErrorActor, CompletionActor\n\n\n\n\n\n","category":"type"},{"location":"api/actors/#Rocket.Actor","page":"Actors","title":"Rocket.Actor","text":"Can be used as a super type for common actor. Automatically specifies a BaseActorTrait trait behavior. Every Actor must implement its own methods for on_next!(actor, data), on_error!(actor, err) and on_complete!(actor) functions. Actor is a subtype of AbstractActor type.\n\nExamples\n\nusing Rocket\n\nstruct MyActor <: Actor{String} end\n\nRocket.as_actor(MyActor)\n\n# output\n\nBaseActorTrait{String}()\n\nSee also: AbstractActor, as_actor, BaseActorTrait, ActorTrait, on_next!, on_error!, on_complete!\n\n\n\n\n\n","category":"type"},{"location":"api/actors/#Rocket.NextActor","page":"Actors","title":"Rocket.NextActor","text":"Can be used as a super type for \"next-only\" actor. Automatically specifies a NextActorTrait trait behavior. Every NextActor must implement its own methods for on_next!(actor, data) function only. NextActor is a subtype of AbstractActor type.\n\nExamples\n\nusing Rocket\n\nstruct MyNextActor <: NextActor{String} end\n\nRocket.as_actor(MyNextActor)\n\n# output\n\nNextActorTrait{String}()\n\nSee also: AbstractActor, as_actor, NextActorTrait, ActorTrait, on_next!\n\n\n\n\n\n","category":"type"},{"location":"api/actors/#Rocket.ErrorActor","page":"Actors","title":"Rocket.ErrorActor","text":"Can be used as a super type for \"error-only\" actor. Automatically specifies a ErrorActorTrait trait behavior. Every ErrorActor must implement its own methods for on_error!(actor, err) function only. ErrorActor is a subtype of AbstractActor type.\n\nExamples\n\nusing Rocket\n\nstruct MyErrorActor <: ErrorActor{String} end\n\nRocket.as_actor(MyErrorActor)\n\n# output\n\nErrorActorTrait{String}()\n\nSee also: AbstractActor, as_actor, ErrorActorTrait, ActorTrait, on_error!\n\n\n\n\n\n","category":"type"},{"location":"api/actors/#Rocket.CompletionActor","page":"Actors","title":"Rocket.CompletionActor","text":"Can be used as a super type for \"completion-only\" actor. Automatically specifies a CompletionActorTrait trait behavior. Every CompletionActor must implement its own methods for on_complete!(actor) function only. CompletionActor is a subtype of AbstractActor type.\n\nExamples\n\nusing Rocket\n\nstruct MyCompletionActor <: CompletionActor{String} end\n\nRocket.as_actor(MyCompletionActor)\n\n# output\n\nCompletionActorTrait{String}()\n\nSee also: AbstractActor, as_actor, CompletionActorTrait, ActorTrait, on_complete!\n\n\n\n\n\n","category":"type"},{"location":"api/actors/#Events","page":"Actors","title":"Events","text":"","category":"section"},{"location":"api/actors/","page":"Actors","title":"Actors","text":"next!\nerror!\ncomplete!","category":"page"},{"location":"api/actors/#Rocket.next!","page":"Actors","title":"Rocket.next!","text":"next!(actor, data)\nnext!(actor, data, scheduler)\n\nThis function is used to deliver a \"next\" event to an actor with some data. Takes optional scheduler object to schedule execution of data delivery.\n\nSee also: AbstractActor, on_next!\n\n\n\n\n\n","category":"function"},{"location":"api/actors/#Rocket.error!","page":"Actors","title":"Rocket.error!","text":"error!(actor, err)\nerror!(actor, err, scheduler)\n\nThis function is used to deliver a \"error\" event to an actor with some err. Takes optional scheduler object to schedule execution of error delivery.\n\nSee also: AbstractActor, on_error!\n\n\n\n\n\n","category":"function"},{"location":"api/actors/#Rocket.complete!","page":"Actors","title":"Rocket.complete!","text":"complete!(actor)\ncomplete!(actor, scheduler)\n\nThis function is used to deliver a \"complete\" event to an actor. Takes optional scheduler object to schedule execution of complete event delivery.\n\nSee also: AbstractActor, on_complete!\n\n\n\n\n\n","category":"function"},{"location":"api/actors/","page":"Actors","title":"Actors","text":"on_next!\non_error!\non_complete!","category":"page"},{"location":"api/actors/#Rocket.on_next!","page":"Actors","title":"Rocket.on_next!","text":"on_next!(actor, data)\n\nBoth Actor and NextActor objects must implement its own method for on_next! function which will be called on \"next\" event.\n\nSee also: Actor, NextActor\n\n\n\n\n\n","category":"function"},{"location":"api/actors/#Rocket.on_error!","page":"Actors","title":"Rocket.on_error!","text":"on_error!(actor, err)\n\nBoth Actor and ErrorActor objects must implement its own method for on_error! function which will be called on \"error\" event.\n\nSee also: Actor, ErrorActor\n\n\n\n\n\n","category":"function"},{"location":"api/actors/#Rocket.on_complete!","page":"Actors","title":"Rocket.on_complete!","text":"on_complete!(actor)\n\nBoth Actor and CompletionActor objects must implement its own method for on_complete! function which will be called on \"complete\" event.\n\nSee also: Actor, CompletionActor\n\n\n\n\n\n","category":"function"},{"location":"api/actors/#Factory","page":"Actors","title":"Factory","text":"","category":"section"},{"location":"api/actors/","page":"Actors","title":"Actors","text":"AbstractActorFactory\ncreate_actor\nMissingCreateActorFactoryImplementationError","category":"page"},{"location":"api/actors/#Rocket.AbstractActorFactory","page":"Actors","title":"Rocket.AbstractActorFactory","text":"Abstract type for all possible actor factories\n\nSee also: Actor\n\n\n\n\n\n","category":"type"},{"location":"api/actors/#Rocket.create_actor","page":"Actors","title":"Rocket.create_actor","text":"create_actor(::Type{L}, factory::F) where { L, F <: AbstractActorFactory }\n\nActor creator function for a given factory F. Should be implemented explicitly for any AbstractActorFactory object\n\nSee also: AbstractActorFactory, MissingCreateActorFactoryImplementationError\n\n\n\n\n\n","category":"function"},{"location":"api/actors/#Rocket.MissingCreateActorFactoryImplementationError","page":"Actors","title":"Rocket.MissingCreateActorFactoryImplementationError","text":"This error will be throw if Julia cannot find specific method of 'create_actor()' function for given actor factory\n\nSee also: AbstractActorFactory, create_actor\n\n\n\n\n\n","category":"type"},{"location":"api/actors/#Errors","page":"Actors","title":"Errors","text":"","category":"section"},{"location":"api/actors/","page":"Actors","title":"Actors","text":"InvalidActorTraitUsageError\nInconsistentSourceActorDataTypesError\nMissingDataArgumentInNextCall\nMissingErrorArgumentInErrorCall\nExtraArgumentInCompleteCall\nMissingOnNextImplementationError\nMissingOnErrorImplementationError\nMissingOnCompleteImplementationError","category":"page"},{"location":"api/actors/#Rocket.InvalidActorTraitUsageError","page":"Actors","title":"Rocket.InvalidActorTraitUsageError","text":"This error will be thrown if next!, error! or complete! functions are called with invalid actor object\n\nSee also: next!, error!, complete!, InvalidActorTrait\n\n\n\n\n\n","category":"type"},{"location":"api/actors/#Rocket.InconsistentSourceActorDataTypesError","page":"Actors","title":"Rocket.InconsistentSourceActorDataTypesError","text":"This error will be thrown if next! function is called with inconsistent data type\n\nSee also: AbstractActor, Subscribable, next!\n\n\n\n\n\n","category":"type"},{"location":"api/actors/#Rocket.MissingDataArgumentInNextCall","page":"Actors","title":"Rocket.MissingDataArgumentInNextCall","text":"This error will be thrown if next! function is called without data argument\n\nSee also: next!\n\n\n\n\n\n","category":"type"},{"location":"api/actors/#Rocket.MissingErrorArgumentInErrorCall","page":"Actors","title":"Rocket.MissingErrorArgumentInErrorCall","text":"This error will be thrown if error! function is called without err argument\n\nSee also: error!\n\n\n\n\n\n","category":"type"},{"location":"api/actors/#Rocket.ExtraArgumentInCompleteCall","page":"Actors","title":"Rocket.ExtraArgumentInCompleteCall","text":"This error will be thrown if complete! function is called with extra data/err argument\n\nSee also: complete!\n\n\n\n\n\n","category":"type"},{"location":"api/actors/#Rocket.MissingOnNextImplementationError","page":"Actors","title":"Rocket.MissingOnNextImplementationError","text":"This error will be thrown if Julia cannot find specific method of 'on_next!()' function for given actor and data\n\nSee also: on_next!\n\n\n\n\n\n","category":"type"},{"location":"api/actors/#Rocket.MissingOnErrorImplementationError","page":"Actors","title":"Rocket.MissingOnErrorImplementationError","text":"This error will be thrown if Julia cannot find specific method of 'on_error!()' function for given actor\n\nSee also: on_error!\n\n\n\n\n\n","category":"type"},{"location":"api/actors/#Rocket.MissingOnCompleteImplementationError","page":"Actors","title":"Rocket.MissingOnCompleteImplementationError","text":"This error will be thrown if Julia cannot find specific method of 'on_complete!()' function for given actor and data\n\nSee also: on_next!\n\n\n\n\n\n","category":"type"},{"location":"observables/types/array/#observable_array","page":"Array","title":"Array Observable","text":"","category":"section"},{"location":"observables/types/array/","page":"Array","title":"Array","text":"from","category":"page"},{"location":"observables/types/array/#Rocket.from","page":"Array","title":"Rocket.from","text":"from(x; scheduler::H = AsapScheduler()) where { H <: AbstractScheduler }\nfrom(a::Vector{D}; scheduler::H = AsapScheduler()) where { D, H <: AbstractScheduler }\n\nCreation operator for the ArrayObservable that emits either a single value if x has a Scalar trait specification or a collection of values if x has a NonScalar trait specification. Throws an ErrorException if x has UndefinedScalarness trait type. To specify scalarness for arbitrary type T some can implement an additional method for scalarness(::Type{<:MyType}) function and to specify scalarness behavior. Optionally accepts custom scheduler-like object to schedule messages delivery.\n\nArguments\n\nx: an object to be wrapped into array of values\nscheduler: optional, scheduler-like object\n\nFor an object x to be a valid input for a from operator it must implement Rocket.scalarness(::Type{ <: T }) method which should return either Rocket.Scalar or Rocket.NonScalar objects. In first case from operator will treat x as a single scalar value and will wrap it into a vector while in the second case from operator will convert x object into an array using collect function.\n\nFor arbitrary iterable objects consider using iterable creation operator.\n\nNote\n\nfrom operators creates a copy of x using collect on a given object.\n\nExamples\n\nusing Rocket\n\nsource = from([ 0, 1, 2 ])\nsubscribe!(source, logger())\n;\n\n# output\n\n[LogActor] Data: 0\n[LogActor] Data: 1\n[LogActor] Data: 2\n[LogActor] Completed\n\n\nusing Rocket\n\nsource = from(( 0, 1, 2 ))\nsubscribe!(source, logger())\n;\n\n# output\n\n[LogActor] Data: 0\n[LogActor] Data: 1\n[LogActor] Data: 2\n[LogActor] Completed\n\n\nusing Rocket\n\nsource = from(0)\nsubscribe!(source, logger())\n;\n\n# output\n\n[LogActor] Data: 0\n[LogActor] Completed\n\n\nusing Rocket\n\nsource = from(\"Hello, world!\")\nsubscribe!(source, logger())\n;\n\n# output\n\n[LogActor] Data: H\n[LogActor] Data: e\n[LogActor] Data: l\n[LogActor] Data: l\n[LogActor] Data: o\n[LogActor] Data: ,\n[LogActor] Data:\n[LogActor] Data: w\n[LogActor] Data: o\n[LogActor] Data: r\n[LogActor] Data: l\n[LogActor] Data: d\n[LogActor] Data: !\n[LogActor] Completed\n\n\nSee also: ArrayObservable, subscribe!, logger, iterable\n\n\n\n\n\n","category":"function"},{"location":"observables/types/array/","page":"Array","title":"Array","text":"ArrayObservable","category":"page"},{"location":"observables/types/array/#Rocket.ArrayObservable","page":"Array","title":"Rocket.ArrayObservable","text":"ArrayObservable{D, H}(values::Vector{D}, scheduler::H) where { D, H }\n\nArrayObservable wraps a regular Julia array into an observable. Uses scheduler object to schedule messages delivery.\n\nConstructor arguments\n\nvalues: array of values to be wrapped\nscheduler: Scheduler-like object\n\nSee also: Subscribable, from\n\n\n\n\n\n","category":"type"},{"location":"api/teardown/#teardown_api","page":"Teardown","title":"Teardown API","text":"","category":"section"},{"location":"api/teardown/","page":"Teardown","title":"Teardown","text":"Any subscription-like object should implement a valid teardown logic.","category":"page"},{"location":"api/teardown/#Example","page":"Teardown","title":"Example","text":"","category":"section"},{"location":"api/teardown/","page":"Teardown","title":"Teardown","text":"using Rocket\n\nstruct MuCustomSubscription <: Teardown\n # some fields here\nend\n\nRocket.as_teardown(::Type{<:MuCustomSubscription}) = UnsubscribableTeardownLogic()\n\nfunction on_unsubscribe!(subscription::MyCustomSubscription)\n # dispose resources here\nend","category":"page"},{"location":"api/teardown/#Traits","page":"Teardown","title":"Traits","text":"","category":"section"},{"location":"api/teardown/","page":"Teardown","title":"Teardown","text":"TeardownLogic\nas_teardown\nUnsubscribableTeardownLogic\non_unsubscribe!\nCallableTeardownLogic\nVoidTeardownLogic\nInvalidTeardownLogic","category":"page"},{"location":"api/teardown/#Rocket.TeardownLogic","page":"Teardown","title":"Rocket.TeardownLogic","text":"Abstract type for all possible teardown logic traits.\n\nSee also: UnsubscribableTeardownLogic, CallableTeardownLogic, VoidTeardownLogic, InvalidTeardownLogic\n\n\n\n\n\n","category":"type"},{"location":"api/teardown/#Rocket.as_teardown","page":"Teardown","title":"Rocket.as_teardown","text":"as_teardown(::Type)\n\nThis function checks teardown trait behavior specification. Should be used explicitly to specify teardown logic trait behavior for any object.\n\nExamples\n\nusing Rocket\n\nstruct MySubscription <: Teardown end\n\nRocket.as_teardown(::Type{<:MySubscription}) = UnsubscribableTeardownLogic()\nRocket.on_unsubscribe!(s::MySubscription) = println(\"Unsubscribed!\")\n\nsubscription = MySubscription()\nunsubscribe!(subscription)\n;\n\n# output\n\nUnsubscribed!\n\nSee also: Teardown, TeardownLogic\n\n\n\n\n\n","category":"function"},{"location":"api/teardown/#Rocket.UnsubscribableTeardownLogic","page":"Teardown","title":"Rocket.UnsubscribableTeardownLogic","text":"Unsubscribable teardown logic trait behavior. Unsubscribable teardown object must define its own method for on_unsubscribe!() function which will be invoked when actor decides to unsubscribe! from Observable.\n\nSee also: TeardownLogic, on_unsubscribe!, unsubscribe!\n\n\n\n\n\n","category":"type"},{"location":"api/teardown/#Rocket.on_unsubscribe!","page":"Teardown","title":"Rocket.on_unsubscribe!","text":"on_unsubscribe!(teardown)\n\nEach valid teardown object with UnsubscribableTeardownLogic trait behavior must implement its own method for on_unsubscribe!() function which will be invoked when actor decides to unsubscribe! from Observable.\n\nSee also: Teardown, TeardownLogic, UnsubscribableTeardownLogic\n\n\n\n\n\n","category":"function"},{"location":"api/teardown/#Rocket.CallableTeardownLogic","page":"Teardown","title":"Rocket.CallableTeardownLogic","text":"Callable teardown logic trait behavior. Callable teardown object must be callable (insert meme with a surprised Pikachu here).\n\nSee also: TeardownLogic, on_unsubscribe!, unsubscribe!\n\n\n\n\n\n","category":"type"},{"location":"api/teardown/#Rocket.VoidTeardownLogic","page":"Teardown","title":"Rocket.VoidTeardownLogic","text":"Void teardown logic trait behavior. Void teardown object does nothing in unsubscribe! and may not define any additional methods.\n\nSee also: TeardownLogic, on_unsubscribe!, unsubscribe!\n\n\n\n\n\n","category":"type"},{"location":"api/teardown/#Rocket.InvalidTeardownLogic","page":"Teardown","title":"Rocket.InvalidTeardownLogic","text":"Default teardown logic trait behavour. Invalid teardwon object cannot be used in unsubscribe! function. Doing so will raise an error.\n\nSee also: TeardownLogic, on_unsubscribe!, unsubscribe!\n\n\n\n\n\n","category":"type"},{"location":"api/teardown/#Types","page":"Teardown","title":"Types","text":"","category":"section"},{"location":"api/teardown/","page":"Teardown","title":"Teardown","text":"Teardown\nunsubscribe!","category":"page"},{"location":"api/teardown/#Rocket.Teardown","page":"Teardown","title":"Rocket.Teardown","text":"Abstract type for any teardown object. Each teardown object must be a subtype of Teardown.\n\nSee also: TeardownLogic\n\n\n\n\n\n","category":"type"},{"location":"api/teardown/#Rocket.unsubscribe!","page":"Teardown","title":"Rocket.unsubscribe!","text":"unsubscribe!(subscription)\nunsubscribe!(subscriptions::Tuple)\nunsubscribe!(subscriptions::AbstractVector)\n\nunsubscribe! function is used to cancel Observable execution and to dispose any kind of resources used during an Observable execution. If the input argument to the unsubscribe! function is either a tuple or a vector, it will first check that all of the arguments are valid subscription objects and if its true will unsubscribe from each of them individually. \n\nSee also: Teardown, TeardownLogic, on_unsubscribe!\n\n\n\n\n\n","category":"function"},{"location":"api/teardown/#Errors","page":"Teardown","title":"Errors","text":"","category":"section"},{"location":"api/teardown/","page":"Teardown","title":"Teardown","text":"InvalidTeardownLogicTraitUsageError\nInvalidMultipleTeardownLogicTraitUsageError\nMissingOnUnsubscribeImplementationError","category":"page"},{"location":"api/teardown/#Rocket.InvalidTeardownLogicTraitUsageError","page":"Teardown","title":"Rocket.InvalidTeardownLogicTraitUsageError","text":"This error will be thrown if unsubscribe! function is called with invalid teardown object.\n\nSee also: unsubscribe!\n\n\n\n\n\n","category":"type"},{"location":"api/teardown/#Rocket.InvalidMultipleTeardownLogicTraitUsageError","page":"Teardown","title":"Rocket.InvalidMultipleTeardownLogicTraitUsageError","text":"This error will be thrown if unsubscribe! function is called with a tuple with invalid teardown object in it.\n\nSee also: unsubscribe!\n\n\n\n\n\n","category":"type"},{"location":"api/teardown/#Rocket.MissingOnUnsubscribeImplementationError","page":"Teardown","title":"Rocket.MissingOnUnsubscribeImplementationError","text":"This error will be thrown if Julia cannot find specific method of on_unsubscribe!() function for given teardown object.\n\nSee also: on_unsubscribe!\n\n\n\n\n\n","category":"type"},{"location":"operators/transformation/accumulated/#operator_accumulated","page":"accumulated","title":"Accumulated Operator","text":"","category":"section"},{"location":"operators/transformation/accumulated/","page":"accumulated","title":"accumulated","text":"accumulated","category":"page"},{"location":"operators/transformation/accumulated/#Rocket.accumulated","page":"accumulated","title":"Rocket.accumulated","text":"accumulated()\n\nCreates an accumulated operator, which returns an Observable that emits the current item with all of the previous items emitted by the source Observable in one single ordered array.\n\nProducing\n\nStream of type <: Subscribable{Vector{L}} where L refers to type of source stream\n\nExamples\n\nusing Rocket\n\nsource = from([ 1, 2, 3 ])\nsubscribe!(source |> accumulated(), logger())\n;\n\n# output\n\n[LogActor] Data: [1]\n[LogActor] Data: [1, 2]\n[LogActor] Data: [1, 2, 3]\n[LogActor] Completed\n\n\nusing Rocket\n\nsource = of(1)\nsubscribe!(source |> accumulated(), logger())\n;\n\n# output\n\n[LogActor] Data: [1]\n[LogActor] Completed\n\nSee also: AbstractOperator, InferableOperator, ProxyObservable, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/transformation/accumulated/#Description","page":"accumulated","title":"Description","text":"","category":"section"},{"location":"operators/transformation/accumulated/","page":"accumulated","title":"accumulated","text":"Combines all values emitted by the source, using an accumulator function that joins a new source value with the all past values emmited into one single array. This is similar to scan with vcat accumulation function.","category":"page"},{"location":"operators/transformation/accumulated/#See-also","page":"accumulated","title":"See also","text":"","category":"section"},{"location":"operators/transformation/accumulated/","page":"accumulated","title":"accumulated","text":"Operators","category":"page"},{"location":"operators/mathematical/max/#operator_max","page":"max","title":"Max Operator","text":"","category":"section"},{"location":"operators/mathematical/max/","page":"max","title":"max","text":"max","category":"page"},{"location":"operators/mathematical/max/#Base.max","page":"max","title":"Base.max","text":"max(; from = nothing)\n\nCreates a max operator, which emits a single item: the item with the largest value.\n\nArguments\n\nfrom: optional initial maximum value, if nothing first item from the source will be used as initial instead\n\nProducing\n\nStream of type <: Subscribable{Union{L, Nothing}} where L refers to type of source stream\n\nExamples\n\nusing Rocket\n\nsource = from([ i for i in 1:42 ])\nsubscribe!(source |> max(), logger())\n;\n\n# output\n\n[LogActor] Data: 42\n[LogActor] Completed\n\n\nSee also: AbstractOperator, InferableOperator, ProxyObservable, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/mathematical/max/#Description","page":"max","title":"Description","text":"","category":"section"},{"location":"operators/mathematical/max/","page":"max","title":"max","text":"The max operator operates on an Observable of similar objects. When the source Observable completes, it emits the item with the largest value.","category":"page"},{"location":"operators/mathematical/max/#See-also","page":"max","title":"See also","text":"","category":"section"},{"location":"operators/mathematical/max/","page":"max","title":"max","text":"Operators","category":"page"},{"location":"operators/errors/catch_error/#operator_catch_error","page":"catch_error","title":"Catch Error Operator","text":"","category":"section"},{"location":"operators/errors/catch_error/","page":"catch_error","title":"catch_error","text":"catch_error","category":"page"},{"location":"operators/errors/catch_error/#Rocket.catch_error","page":"catch_error","title":"Rocket.catch_error","text":"catch_error(selectorFn::F) where F\n\nCreates a CatchErrorOperator, which catches errors on the observable to be handled by returning a new observable or throwing an error.\n\nArguments:\n\nselectorFn::F: a callable object that takes as arguments err, which is the error, and caught, which is the source observable, in case you'd like to \"retry\" that observable by returning it again. Whatever observable is returned by the selector will be used to continue the observable chain.\n\nProducing\n\nStream of type <: Subscribable{L} where L refers to type of source stream\n\nExamples\n\nusing Rocket\n\nsource = from(1:5) |> safe() |> map(Int, (d) -> d == 4 ? error(4) : d) |> catch_error((err, obs) -> of(1))\n\nsubscribe!(source, logger())\n;\n\n# output\n[LogActor] Data: 1\n[LogActor] Data: 2\n[LogActor] Data: 3\n[LogActor] Data: 1\n[LogActor] Completed\n\nSee also: AbstractOperator, InferableOperator, rerun, logger, safe\n\n\n\n\n\n","category":"function"},{"location":"operators/errors/catch_error/#See-also","page":"catch_error","title":"See also","text":"","category":"section"},{"location":"operators/errors/catch_error/","page":"catch_error","title":"catch_error","text":"Operators","category":"page"},{"location":"operators/about/#section_operators","page":"Operator","title":"Operators","text":"","category":"section"},{"location":"operators/about/","page":"Operator","title":"Operator","text":"Even though the Observable is the foundation, reactive extensions are mostly useful because of their operators. Operators are the essential pieces that allow complex asynchronous code to be easily composed in a declarative manner.","category":"page"},{"location":"operators/about/#what_are_operators","page":"Operator","title":"What are operators?","text":"","category":"section"},{"location":"operators/about/","page":"Operator","title":"Operator","text":"There are two kinds of operators:","category":"page"},{"location":"operators/about/#Pipeable-operators","page":"Operator","title":"Pipeable operators","text":"","category":"section"},{"location":"operators/about/","page":"Operator","title":"Operator","text":"Pipeable Operators are the kind that can be piped to Observables using the syntax source |> operator(). These include the filter() and map() operators. When called, operators do not change the existing Observable instance. Instead, they return a new Observable, whose subscription logic is based on the first Observable.","category":"page"},{"location":"operators/about/","page":"Operator","title":"Operator","text":"note: Note\nA Pipeable Operator is a function that takes an Observable as its input and returns another Observable. It is a pure operation: the previous Observable remains unmodified.","category":"page"},{"location":"operators/about/","page":"Operator","title":"Operator","text":"A Pipeable Operator is essentially a pure callable object that accepts one Observable as input and returns another Observable as output. Subscribing to the output Observable will also subscribe to the input Observable.","category":"page"},{"location":"operators/about/","page":"Operator","title":"Operator","text":"For example, the operator called map() is analogous to the Array method of the same name. Just like the array method map((d) -> d ^ 2, [ 1, 2, 3 ]) yields [ 1, 4, 9 ], the Observable emits 1, 4, 9:","category":"page"},{"location":"operators/about/","page":"Operator","title":"Operator","text":"source = from([ 1, 2, 3 ])\nsubscribe!(source |> map(Int, (d) -> d ^ 2), lambda(\n on_next = (d) -> println(d)\n))\n\n// Logs:\n// 1\n// 4\n// 9","category":"page"},{"location":"operators/about/","page":"Operator","title":"Operator","text":"Another useful operator is first():","category":"page"},{"location":"operators/about/","page":"Operator","title":"Operator","text":"source = from([ 1, 2, 3 ])\nsubscribe!(source |> first(), lambda(\n on_next = (d) -> println(d),\n on_complete = () -> \"Completed\"\n))\n\n// Logs:\n// 1\n// Completed","category":"page"},{"location":"operators/about/#Creation-operators","page":"Operator","title":"Creation operators","text":"","category":"section"},{"location":"operators/about/","page":"Operator","title":"Operator","text":"Distinct from pipeable operators, creation operators are functions that can be used to create an Observable with some common predefined behavior or by joining other Observables. For example: from([ 1, 2, 3 ]) creates an observable that will sequentially emit 1, 2, and 3.","category":"page"},{"location":"operators/about/","page":"Operator","title":"Operator","text":"source = from([ 1, 2, 3 ])\nsubscribe!(source, lambda(\n on_next = (d) -> println(\"Value: $d\"),\n on_error = (e) -> println(\"Oh no, error: $e\")\n on_complete = () -> println(\"Completed\")\n))\n\n// Logs:\n// Value: 1\n// Value: 2\n// Value: 3\n// Completed","category":"page"},{"location":"operators/about/#Operators-piping","page":"Operator","title":"Operators piping","text":"","category":"section"},{"location":"operators/about/","page":"Operator","title":"Operator","text":"Pipeable operators are special objects that can be used like ordinary functions with on_call!(operator, source). In practice however they tend to accumulate and quickly grow unreadable: on_call!(operator1, on_call!(operator2, on_call!(operator3, source))). Therefore, Rocket.jl overloads |> for operators and Observables:","category":"page"},{"location":"operators/about/","page":"Operator","title":"Operator","text":"using Rocket\n\nsource = from(1:100) |> filter((d) -> d % 2 === 0) |> map(Int, (d) -> d ^ 2) |> sum()\n\nsubscribe!(source, logger())\n\n// Logs\n// [LogActor] Data: 171700\n// [LogActor] Completed","category":"page"},{"location":"operators/about/","page":"Operator","title":"Operator","text":"It is also possible to create an operator composition with + or |>. It might be useful to create an alias for some often used operator chain","category":"page"},{"location":"operators/about/","page":"Operator","title":"Operator","text":"using Rocket\n\nmapAndFilter = map(Int, d -> d ^ 2) + filter(d -> d % 2 == 0) \n\nsource = from(1:5) |> mapAndFilter\n\nsubscribe!(source, logger())\n\n// Logs\n// [LogActor] Data: 4\n// [LogActor] Data: 16\n// [LogActor] Completed\n\nmapAndFilterAndSum = mapAndFilter + sum()\n\nsource = from(1:5) |> mapAndFilterAndSum\n\nsubscribe!(source, logger())\n\n// Logs\n// [LogActor] Data: 20\n// [LogActor] Completed","category":"page"},{"location":"operators/about/","page":"Operator","title":"Operator","text":"For stylistic reasons, on_call!(operator, source) is never used in practice - even if there is only one operator. Instead, source |> operator() is generally preferred.","category":"page"},{"location":"observables/types/iterable/#observable_iterable","page":"Iterable","title":"Iterable Observable","text":"","category":"section"},{"location":"observables/types/iterable/","page":"Iterable","title":"Iterable","text":"iterable","category":"page"},{"location":"observables/types/iterable/#Rocket.iterable","page":"Iterable","title":"Rocket.iterable","text":"iterable(iterator; scheduler::H = AsapScheduler()) where { H <: AbstractScheduler }\n\nCreation operator for the IterableObservable that wraps given iterator into an observable object.\n\nArguments\n\niterator: an iterator object to be wrapped an observable\nscheduler: optional, scheduler-like object\n\nNote\n\niterable operators does not create a copy of iterator. Any changes in the iterator object might be visible in the created observable. For side-effects free behavior consider using from creation operator which creates a copy of a given object with a collect function.\n\nExamples\n\nusing Rocket\n\nsource = iterable([ 0, 1, 2 ])\nsubscribe!(source, logger())\n;\n\n# output\n\n[LogActor] Data: 0\n[LogActor] Data: 1\n[LogActor] Data: 2\n[LogActor] Completed\n\nusing Rocket\n\nsource = iterable(\"Hello\")\nsubscribe!(source, logger())\n;\n\n# output\n\n[LogActor] Data: H\n[LogActor] Data: e\n[LogActor] Data: l\n[LogActor] Data: l\n[LogActor] Data: o\n[LogActor] Completed\n\nSee also: ScheduledSubscribable, subscribe!, from\n\n\n\n\n\n","category":"function"},{"location":"observables/types/generate/#observable_generate","page":"Generate","title":"Generate Observable","text":"","category":"section"},{"location":"observables/types/generate/","page":"Generate","title":"Generate","text":"generate","category":"page"},{"location":"observables/types/generate/#Rocket.generate","page":"Generate","title":"Rocket.generate","text":"generate(initial::D, condition::C, iterator::I; scheduler::H = AsapScheduler()) where { D, C, I, H <: AbstractScheduler }\n\nGenerates an observable sequence by running a state-driven loop producing the sequence's elements, using the specified scheduler to send out observer messages.\n\nArguments\n\ninitial: initial state\ncondition: condition to terminate generation (upon returning false)\niterator: iteration step function\nscheduler: optional, scheduler-like object\n\nNote\n\niterator object should return objects of the same type as initial.\n\nExamples\n\nusing Rocket\n\nsource = generate(1, x -> x < 3, x -> x + 1)\nsubscribe!(source, logger())\n;\n\n# output\n[LogActor] Data: 1\n[LogActor] Data: 2\n[LogActor] Completed\n\nSee also: ScheduledSubscribable, subscribe!\n\n\n\n\n\n","category":"function"},{"location":"operators/filtering/ignore/#operator_ignore","page":"ignore","title":"Ignore operator","text":"","category":"section"},{"location":"operators/filtering/ignore/","page":"ignore","title":"ignore","text":"ignore","category":"page"},{"location":"operators/filtering/ignore/#Rocket.ignore","page":"ignore","title":"Rocket.ignore","text":"ignore(count::Int)\n\nCreates a ignore operator, which returns an Observable that skips the first count items emitted by the source Observable.\n\nArguments\n\ncount::Int: the number of times, items emitted by source Observable should be skipped.\n\nProducing\n\nStream of type <: Subscribable{L} where L refers to type of source stream\n\nExamples\n\nusing Rocket\n\nsource = from(1:5)\n\nsubscribe!(source |> ignore(2), logger())\n;\n\n# output\n\n[LogActor] Data: 3\n[LogActor] Data: 4\n[LogActor] Data: 5\n[LogActor] Completed\n\nSee also: AbstractOperator, InferableOperator, ProxyObservable, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/filtering/ignore/#See-also","page":"ignore","title":"See also","text":"","category":"section"},{"location":"operators/filtering/ignore/","page":"ignore","title":"ignore","text":"Operators","category":"page"},{"location":"subjects/types/replay/#subject_replay","page":"Replay","title":"ReplaySubject","text":"","category":"section"},{"location":"subjects/types/replay/","page":"Replay","title":"Replay","text":"ReplaySubject\nReplaySubjectFactory","category":"page"},{"location":"subjects/types/replay/#Rocket.ReplaySubject","page":"Replay","title":"Rocket.ReplaySubject","text":"ReplaySubject(::Type{D}, size::Int) where D\nReplaySubject(::Type{D}, size::Int, factory::F) where { D, F <: AbstractSubjectFactory }\nReplaySubject(::Type{D}, size::Int, subject::S) where { D, S }\n\nA variant of Subject that \"replays\" or emits old values to new subscribers. It buffers a set number of values and will emit those values immediately to any new subscribers in addition to emitting new values to existing subscribers.\n\nSee also: ReplaySubjectFactory, Subject, SubjectFactory\n\n\n\n\n\n","category":"function"},{"location":"subjects/types/replay/#Rocket.ReplaySubjectFactory","page":"Replay","title":"Rocket.ReplaySubjectFactory","text":"ReplaySubjectFactory(size::Int, factory::F) where { F <: AbstractSubjectFactory }\nReplaySubjectFactory(size::Int; scheduler::H = AsapScheduler()) where { H <: AbstractScheduler }\n\nA variant of SubjectFactory that creates an instance of ReplaySubject.\n\nSee also: SubjectFactory, AbstractSubjectFactory, ReplaySubject, Subject\n\n\n\n\n\n","category":"function"},{"location":"subjects/types/replay/#Description","page":"Replay","title":"Description","text":"","category":"section"},{"location":"subjects/types/replay/","page":"Replay","title":"Replay","text":"A ReplaySubject is similar to a BehaviorSubject in that it can send old values to new subscribers, but it can also record a part of the Observable execution.","category":"page"},{"location":"subjects/types/replay/","page":"Replay","title":"Replay","text":"note: Note\nA ReplaySubject records multiple values from the Observable execution and replays them to new subscribers.","category":"page"},{"location":"subjects/types/replay/#Examples","page":"Replay","title":"Examples","text":"","category":"section"},{"location":"subjects/types/replay/","page":"Replay","title":"Replay","text":"When creating a ReplaySubject, you can specify how many values to replay:","category":"page"},{"location":"subjects/types/replay/","page":"Replay","title":"Replay","text":"using Rocket\n\nsubject = ReplaySubject(Int, 3) # buffer 3 values for new subscribers\n\nsubscription1 = subscribe!(subject, logger(\"1\"))\n\nnext!(subject, 1)\nnext!(subject, 2)\nnext!(subject, 3)\nnext!(subject, 4)\n\nsubscription2 = subscribe!(subject, logger(\"2\"))\n\nnext!(subject, 5)\n\nunsubscribe!(subscription1)\nunsubscribe!(subscription2)\n\n// Logs\n// [1] Data: 1\n// [1] Data: 2\n// [1] Data: 3\n// [1] Data: 4\n// [2] Data: 2\n// [2] Data: 3\n// [2] Data: 4\n// [1] Data: 5\n// [2] Data: 5","category":"page"},{"location":"observables/about/#section_observables","page":"Observable","title":"Observables","text":"","category":"section"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"Observables are lazy Push collections of multiple values. They fill the missing spot in the following table:","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"Type Single Multiple\nPull Function Iterator\nPush Promise Observable","category":"page"},{"location":"observables/about/#First-example","page":"Observable","title":"First example","text":"","category":"section"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"For example, the following code specifies an Observable that pushes the values 1, 2, 3 immediately (synchronously) when subscribed to, and the value 4 after one second has passed since subscription.","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"using Rocket\n\nsource = make(Int) do actor\n next!(actor, 1)\n next!(actor, 2)\n next!(actor, 3)\n setTimeout(1000) do\n next!(actor, 4)\n complete!(actor)\n end\nend","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"To invoke the Observable and inspect these values, we need to subscribe to it. It is important to note that observables are lazy collections which means they don't emit anything until someone subscribes to it. Every subscription spawns its own independent execution of observable. There are some exceptions to this rule, e.g. Subjects and some operators (share(), etc..) which may change this behaviour","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"using Rocket\n\nsource = make(Int) do actor\n next!(actor, 1)\n next!(actor, 2)\n next!(actor, 3)\n setTimeout(1000) do\n next!(actor, 4)\n complete!(actor)\n end\nend\n\nprintln(\"Just before subscribe\")\nsubscribe!(source, lambda(\n on_next = (d) -> println(d),\n on_complete = () -> println(\"Completed\")\n))\nprintln(\"Just after subscribe\")\n\n# Logs\n# Just before subscribe\n# 1\n# 2\n# 3\n# Just after subscribe\n# 4\n# Completed","category":"page"},{"location":"observables/about/#Pull-vs-Push","page":"Observable","title":"Pull vs Push","text":"","category":"section"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"Pull and Push are two different protocols that describe how a data Producer communicates with a data Consumer.","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"In a Pull system, the Consumer determines when it receives data from the Producer. The Producer itself is unaware of when the data are delivered to the Consumer.","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"Every Julia Function is a Pull system. The function is a Producer of data, and the code that calls the function is consuming data by \"pulling\" a return value from the call.","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"Type PRODUCER CONSUMER\nPull Passive: produces data when requested. Active: decides when data is requested.\nPush Active: produces data at its own pace. Passive: reacts to received data.","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"In Push systems, the Producer determines when to send data to the Consumer. The Consumer is unaware of when it will receive that data.","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"Futures and promises are the most common type of Push systems today. A Promise (the Producer) delivers a resolved value to registered callbacks (the Consumers). Unlike functions, it is the Promise that determines precisely when a value is \"pushed\" to the callbacks.","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"Rocket.jl introduces Observables, a new Push system for Julia. An Observable is a Producer of multiple values, \"pushing\" them to Observers (Consumers or Actors).","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"A Function is a lazily evaluated computation that synchronously returns a single value on invocation.\nA Generator is a lazily evaluated computation that synchronously returns zero to (potentially) infinite values on iteration.\nA Promise is a computation that may (or may not) eventually return a single value.\nAn Observable is a lazily evaluated computation that can synchronously or asynchronously return zero to (potentially) infinite values from the time it's invoked.","category":"page"},{"location":"observables/about/#Observables-as-generalizations-of-functions","page":"Observable","title":"Observables as generalizations of functions","text":"","category":"section"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"In contrast to functions, Observables can \"return\" multiple values over time. For example, functions can't do this:","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"function foo()\n println(\"Hello!\")\n return 0\n return 1 # Dead code, will never happen\nend","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"Observables, however, can do this:","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"using Rocket\n\nfoo = make(Int) do actor\n next!(actor, 0)\n next!(actor, 1)\n complete!(actor)\nend\n","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"Observables can also \"return\" values asynchronously after some time:","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"using Rocket\n\nfoo = make(Int) do actor\n setTimeout(1000) do\n next!(actor, 0)\n complete!(actor)\n end\nend","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"Assume we have a function foo and some observable:","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"Function call foo(args...) means \"give me one value synchronously\" (pull strategy)\nIn contrast subscription to an observable with subscribe(observable, ...) means \"notify me about any amount of values, either synchronously or asynchronously\" (push strategy)","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"When a new value is available in an observable we say that the observable emits or generates an update. Values that are generated by an observable are sometimes also called future values, because there is no principled way to predict when an observable will generate a new value. In some programming languages, observables are referred to as generators or streams and we will use all three terms interchangeably.","category":"page"},{"location":"observables/about/#Anatomy-of-an-Observable","page":"Observable","title":"Anatomy of an Observable","text":"","category":"section"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"Observables are (1) created using creation operators (it is also possible to build an Observable from scratch with custom logic); (2) subscribed to with an Actor; (3) execute to deliver next! / error! / complete! notifications to the Actor, and (4) their execution may be disposed. These four aspects are all encoded in an Observable instance, but some of these aspects are related to other types, such as Subscribable and Subscription.","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"The core responsibilities of an Observable are:","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"Creating Observables\nSubscribing to Observables\nExecuting the Observable\nDisposing Observables","category":"page"},{"location":"observables/about/#Creating-Observables","page":"Observable","title":"Creating Observables","text":"","category":"section"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"You can create an Observable in various ways using Creation operators. You can also build an Observable from scratch. To see how you can build an Observable with custom logic, consult the API Section.","category":"page"},{"location":"observables/about/#Subscribing-to-Observables","page":"Observable","title":"Subscribing to Observables","text":"","category":"section"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"The Observable source in the example can be subscribed to.","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"using Rocket\n\nsubscribe!(source, lambda(\n on_next = (d) -> println(d)\n))","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"This example shows how subscribe calls are not shared among multiple Actors of the same Observable. When calling subscribe! with an Actor, the function on_subscribe! that is attached to this particular Observable is executed for that given actor. Each call to subscribe! triggers its own independent setup for that given actor.","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"note: Note\nSubscribing to an Observable is like calling a function, providing callbacks where the data will be delivered to.","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"The subscribe! function also supports multiple subscriptions at once. If the input argument to the subscribe! function is a tuple or a vector, it will first check that all of the arguments are valid source objects and actors and if its true will subscribe from each of them individually.","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"\nsource1 = Subject(Int)\nsource2 = Subject(Int)\n\nsubscriptions = subscribe!([\n (source1, logger()),\n (source2, logger()),\n])\n\n# Later on\n# unsubscribe!(subscriptions)\n","category":"page"},{"location":"observables/about/#Executing-Observables","page":"Observable","title":"Executing Observables","text":"","category":"section"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"The execution produces multiple values over time, either synchronously or asynchronously.","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"An Observable Execution can deliver three types of notifications:","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"Next: sends a value, such as an Int, String, Dict, etc.;\nError: sends any error as a value;\nComplete: does not send a value.","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"\"Next\" notifications are the most important and most common type: they represent actual data being delivered to an subscriber. \"Error\" and \"Complete\" notifications terminate the Observable Execution.","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"note: Note\nIn an Observable Execution, any number of Next notifications may be delivered. However, once a single Error or Complete notification is delivered, nothing else can be delivered afterwards.","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"The following is an example of an Observable execution that delivers three Next notifications and subsequently completes:","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"using Rocket\n\nsource = make(Int) do actor\n next!(actor, 1)\n next!(actor, 2)\n next!(actor, 3)\n complete!(actor)\nend\n\n# or the same with creation operator\n\nsource = from([ 1, 2, 3 ])","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"It is advised to wrap any code in subscribe by a try/catch block that delivers an Error notification upon an exception:","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"using Rocket\n\nsource = make(Int) do actor\n try\n next!(actor, 1)\n next!(actor, 2)\n next!(actor, 3)\n complete!(actor)\n catch e\n error!(actor, e)\n end\nend\n","category":"page"},{"location":"observables/about/#Disposing-Observable-Executions","page":"Observable","title":"Disposing Observable Executions","text":"","category":"section"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"It is common for an Actor to abort execution of an Observable Execution. Once the Actor is done receiving values, it may stop the execution in order to free computation power or memory resources.","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"When subscribe! is called, the Actor gets attached to the newly created Observable execution. This call also returns an object, the Subscription:","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"subscription = subscribe!(source, actor)","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"The Subscription represents the ongoing execution, and has a minimal API that allows you to cancel the execution. Read more about Subscription type here.","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"With","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"unsubscribe!(subscription)","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"you can cancel the ongoing execution.","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"note: Note\nsubscribe! returns a Subscription that represents the ongoing execution. Simply call unsubscribe! on the Subscription to cancel the execution.","category":"page"},{"location":"actors/types/circularkeep/#actor_circularkeep","page":"CircularKeep","title":"CircularKeep actor","text":"","category":"section"},{"location":"actors/types/circularkeep/","page":"CircularKeep","title":"CircularKeep","text":"circularkeep","category":"page"},{"location":"actors/types/circularkeep/#Rocket.circularkeep","page":"CircularKeep","title":"Rocket.circularkeep","text":"circularkeep(::Type{T}, capacity::Int) where T\n\nArguments\n\n::Type{T}: Type of keep data\ncapacity::Int: circular buffer capacity\n\nCreation operator for the CircularKeepActor actor.\n\nExamples\n\nusing Rocket\n\nactor = circularkeep(Int, 3)\nactor isa CircularKeepActor{Int}\n\n# output\ntrue\n\nSee also: CircularKeepActor, AbstractActor\n\n\n\n\n\n","category":"function"},{"location":"actors/types/circularkeep/","page":"CircularKeep","title":"CircularKeep","text":"CircularKeepActor","category":"page"},{"location":"actors/types/circularkeep/#Rocket.CircularKeepActor","page":"CircularKeep","title":"Rocket.CircularKeepActor","text":"CirucalKeepActor{D}() where D\n\nCircual keep actor is similar to keep actor, but uses CircularBuffer as a storage. It saves all incoming successful next events in a values circular buffer, throws an ErrorException on error! event and does nothing on completion event.\n\nExamples\n\nusing Rocket\n\nsource = from(1:5)\nactor = circularkeep(Int, 3)\n\nsubscribe!(source, actor)\nshow(getvalues(actor))\n\n# output\n[3, 4, 5]\n\nSee also: Actor, keep, circularkeep\n\n\n\n\n\n","category":"type"},{"location":"operators/utility/default_if_empty/#operator_ref_default_if_empty","page":"default_if_empty","title":"DefaultIfEmpty Operator","text":"","category":"section"},{"location":"operators/utility/default_if_empty/","page":"default_if_empty","title":"default_if_empty","text":"default_if_empty","category":"page"},{"location":"operators/utility/default_if_empty/#Rocket.default_if_empty","page":"default_if_empty","title":"Rocket.default_if_empty","text":"default_if_empty(value::T)\ndefault_if_empty(callback::Function)\n\nCreates a default_if_empty operator, which emits a given value if the source Observable completes without emitting any next value, otherwise mirrors the source Observable. Optionally accepts a zero-argument callback that will be executed to generate default value. Note: Callback function's output is always converted to the eltype of the original observable.\n\nusing Rocket\n\nsource = completed(Int) |> default_if_empty(0)\n\nsubscribe!(source, logger())\n;\n\n# output\n[LogActor] Data: 0\n[LogActor] Completed\n\nusing Rocket\n\nsource = completed(Int) |> default_if_empty(() -> 42)\n\nsubscribe!(source, logger())\n;\n\n# output\n[LogActor] Data: 42\n[LogActor] Completed\n\nSee also: AbstractOperator, InferableOperator, logger, map\n\n\n\n\n\n","category":"function"},{"location":"operators/utility/default_if_empty/#Description","page":"default_if_empty","title":"Description","text":"","category":"section"},{"location":"operators/utility/default_if_empty/","page":"default_if_empty","title":"default_if_empty","text":"default_if_empty emits the values emitted by the source Observable or a specified default value if the source Observable is empty (completes without having emitted any next value).","category":"page"},{"location":"operators/utility/default_if_empty/#See-also","page":"default_if_empty","title":"See also","text":"","category":"section"},{"location":"operators/utility/default_if_empty/","page":"default_if_empty","title":"default_if_empty","text":"Operators","category":"page"},{"location":"observables/types/never/#observable_never","page":"Never","title":"Never Observable","text":"","category":"section"},{"location":"observables/types/never/","page":"Never","title":"Never","text":"never","category":"page"},{"location":"observables/types/never/#Rocket.never","page":"Never","title":"Rocket.never","text":"never(T = Any)\n\nCreation operator for the NeverObservable that emits neither values nor errors nor the completion notification. It can be used for testing purposes or for composing with other Observables. Please note that by never emitting a complete notification, this Observable keeps the subscription from being disposed automatically. Subscriptions need to be manually disposed.\n\nArguments\n\nT: Type of Observable data, optional, Any is the default\n\nExamples\n\nusing Rocket\n\nsource = never()\nsubscribe!(source, logger())\n;\n\n# output\n\n\nSee also: NeverObservable, subscribe!, logger\n\n\n\n\n\n","category":"function"},{"location":"observables/types/never/","page":"Never","title":"Never","text":"NeverObservable","category":"page"},{"location":"observables/types/never/#Rocket.NeverObservable","page":"Never","title":"Rocket.NeverObservable","text":"NeverObservable{D}()\n\nAn Observable that emits no items to the Observer and never completes.\n\nType parameters\n\nD: Type of Observable data\n\nSee also: Subscribable, never\n\n\n\n\n\n","category":"type"},{"location":"operators/utility/about/#Utility-category","page":"About utility operators","title":"Utility category","text":"","category":"section"},{"location":"operators/utility/about/","page":"About utility operators","title":"About utility operators","text":"There are operators for different purposes, and they may be categorized as: creation, transformation, filtering, joining, multicasting, error handling, utility, etc. In the following list you will find all the operators organized in utility category.","category":"page"},{"location":"operators/utility/about/","page":"About utility operators","title":"About utility operators","text":"tap\ntap_on_subscribe\ntap_on_unsubscribe\ntap_on_complete\ndelay\nsafe\nnoop\nref_count\nasync\ndefault_if_empty\nerror_if_empty\nskip_next\nskip_error\nskip_complete\ndiscontinue\nlimit_subscribers","category":"page"},{"location":"operators/utility/about/#See-also","page":"About utility operators","title":"See also","text":"","category":"section"},{"location":"operators/utility/about/","page":"About utility operators","title":"About utility operators","text":"Operators","category":"page"},{"location":"operators/all/#operators_list","page":"All","title":"List of all available operators","text":"","category":"section"},{"location":"operators/all/","page":"All","title":"All","text":"There are operators for different purposes, and they may be categorized as: creation, transformation, filtering, joining, multicasting, error handling, utility, etc.","category":"page"},{"location":"operators/all/#Creation-operators","page":"All","title":"Creation operators","text":"","category":"section"},{"location":"operators/all/","page":"All","title":"All","text":"make\nof\nfrom\niterable\nfaulted\nnever\ncompleted\ntimer\ninterval\nproxy\nfile\ncombined\nrace\nconnectable\nmerged\nconcat\ngenerate\nnetwork\ndefer\nzipped","category":"page"},{"location":"operators/all/#Transformation-operators","page":"All","title":"Transformation operators","text":"","category":"section"},{"location":"operators/all/","page":"All","title":"All","text":"map\nmap_to\nscan\naccumulated\nenumerate\nuppercase\nlowercase\nto_array\nswitch_map\nswitch_map_to\nmerge_map\nconcat_map\nconcat_map_to\nexhaust_map\nstart_with\npairwise\nsubstitute\noverride","category":"page"},{"location":"operators/all/#Filtering-operators","page":"All","title":"Filtering operators","text":"","category":"section"},{"location":"operators/all/","page":"All","title":"All","text":"filter\nfilter_type\nsome\ntake\ntake_until\nfirst\nlast\nfind\nfind_index\nignore","category":"page"},{"location":"operators/all/#Mathematical-and-Aggregate-operators","page":"All","title":"Mathematical and Aggregate operators","text":"","category":"section"},{"location":"operators/all/","page":"All","title":"All","text":"count\nmax\nmin\nreduce\nsum","category":"page"},{"location":"operators/all/#Error-handling-operators","page":"All","title":"Error handling operators","text":"","category":"section"},{"location":"operators/all/","page":"All","title":"All","text":"catch_error\nrerun\nerror_if\nerror_if_not","category":"page"},{"location":"operators/all/#Join-operator","page":"All","title":"Join operator","text":"","category":"section"},{"location":"operators/all/","page":"All","title":"All","text":"with_latest","category":"page"},{"location":"operators/all/#Multicasting-operators","page":"All","title":"Multicasting operators","text":"","category":"section"},{"location":"operators/all/","page":"All","title":"All","text":"multicast\npublish\npublish_behavior\npublish_replay\nshare\nshare_replay","category":"page"},{"location":"operators/all/#Utility-operators","page":"All","title":"Utility operators","text":"","category":"section"},{"location":"operators/all/","page":"All","title":"All","text":"tap\ntap_on_subscribe\ntap_on_unsubscribe\ntap_on_complete\ndelay\nsafe\nnoop\nref_count\nasync\ndefault_if_empty\nerror_if_empty\nskip_next\nskip_error\nskip_complete\ndiscontinue\nlimit_subscribers","category":"page"},{"location":"observables/types/concat/#observable_concat","page":"Concat","title":"Concat Observable","text":"","category":"section"},{"location":"observables/types/concat/","page":"Concat","title":"Concat","text":"concat","category":"page"},{"location":"observables/types/concat/#Rocket.concat","page":"Concat","title":"Rocket.concat","text":"concat(sources...)\nconcat(sources::S) where { S <: Tuple }\n\nCombines multiple Observables to create an Observable which sequentially emits all values from given Observable and then moves on to the next. All values of each passed Observable merged into a single Observable, in order, in serial fashion.\n\nArguments\n\nsources: input sources\n\nExamples\n\nusing Rocket\n\nsource1 = of(1)\nsource2 = of(2)\n\nsubscribe!(concat(source1, source2), logger())\n;\n\n# output\n[LogActor] Data: 1\n[LogActor] Data: 2\n[LogActor] Completed\n\nusing Rocket\n\nsource1 = of(1) |> async()\nsource2 = of(2)\n\nsubscribe!(concat(source1, source2), logger())\n;\n\n# output\n[LogActor] Data: 1\n[LogActor] Data: 2\n[LogActor] Completed\n\nSee also: Subscribable, subscribe!\n\n\n\n\n\n","category":"function"},{"location":"observables/types/labeled/#observable_labeled","page":"Labeled","title":"Labeled Observable","text":"","category":"section"},{"location":"observables/types/labeled/","page":"Labeled","title":"Labeled","text":"labeled","category":"page"},{"location":"observables/types/labeled/#Rocket.labeled","page":"Labeled","title":"Rocket.labeled","text":"labeled(names::Val, stream)\n\nCreation operator for the LabeledObservable that wraps given stream, that produces Tuple values into a NamedTuple with given names.\n\nArguments\n\nnames: a Val object that contains a tuple of symbols\nstream: an observable that emits a Tuple, length of the Tuple events must be equal to the length of the names argument\n\nExamples\n\nusing Rocket\n\nsource = labeled(Val((:x, :y)), from([ (1, 2), (2, 3), (3, 4) ]))\nsubscribe!(source, logger())\n;\n\n# output\n\n[LogActor] Data: (x = 1, y = 2)\n[LogActor] Data: (x = 2, y = 3)\n[LogActor] Data: (x = 3, y = 4)\n[LogActor] Completed\n\nSee also: ScheduledSubscribable, subscribe!, from\n\n\n\n\n\n","category":"function"},{"location":"observables/types/labeled/","page":"Labeled","title":"Labeled","text":"LabeledObservable","category":"page"},{"location":"observables/types/labeled/#Rocket.LabeledObservable","page":"Labeled","title":"Rocket.LabeledObservable","text":"LabeledObservable{D, S}()\n\nAn Observable that emits NamesTuple items from a source Observable that emits Tuple items.\n\nSee also: Subscribable, labeled\n\n\n\n\n\n","category":"type"},{"location":"actors/types/lambda/#actor_lambda","page":"Lambda","title":"Lambda actor","text":"","category":"section"},{"location":"actors/types/lambda/","page":"Lambda","title":"Lambda","text":"lambda","category":"page"},{"location":"actors/types/lambda/#Rocket.lambda","page":"Lambda","title":"Rocket.lambda","text":"lambda(; on_next = nothing, on_error = nothing, on_complete = nothing)\nlambda(::Type{T}; on_next = nothing, on_error = nothing, on_complete = nothing) where T\n\nCreation operator for the 'LambdaActor' actor.\n\nExamples\n\nusing Rocket\n\nactor = lambda(Int; on_next = (d) -> println(d))\nactor isa LambdaActor{Int}\n\n# output\ntrue\n\nSee also: LambdaActor, AbstractActor\n\n\n\n\n\n","category":"function"},{"location":"actors/types/lambda/","page":"Lambda","title":"Lambda","text":"LambdaActor","category":"page"},{"location":"actors/types/lambda/#Rocket.LambdaActor","page":"Lambda","title":"Rocket.LambdaActor","text":"LambdaActor{D, N, E, C}(on_next::N, on_error::E, on_complete::C) where D\n\nLambda actor wraps on_next, on_error, on_complete callbacks for data, error and complete events. Should not be used explicitly, use lambda creation operator instead.\n\nConstructor arguments\n\non_next: Callback for data event. Optional. Default is nothing.\non_error: Callback for error event. Optional. Default is nothing.\non_complete: Callback for complete event. Optional. Default is nothing.\n\nSee also: Actor, lambda\n\n\n\n\n\n","category":"type"},{"location":"operators/utility/error_if_empty/#operator_ref_error_if_empty","page":"error_if_empty","title":"ErrorIfEmpty Operator","text":"","category":"section"},{"location":"operators/utility/error_if_empty/","page":"error_if_empty","title":"error_if_empty","text":"error_if_empty","category":"page"},{"location":"operators/utility/error_if_empty/#Rocket.error_if_empty","page":"error_if_empty","title":"Rocket.error_if_empty","text":"error_if_empty(err)\n\nCreates a error_if_empty operator, which emits a given error if the source Observable completes without emitting any next value, otherwise mirrors the source Observable.\n\nusing Rocket\n\nsource = completed(Int) |> error_if_empty(\"Empty\")\n\nsubscribe!(source, logger())\n;\n\n# output\n[LogActor] Error: Empty\n\nSee also: AbstractOperator, InferableOperator, logger, map\n\n\n\n\n\n","category":"function"},{"location":"operators/utility/error_if_empty/#Description","page":"error_if_empty","title":"Description","text":"","category":"section"},{"location":"operators/utility/error_if_empty/","page":"error_if_empty","title":"error_if_empty","text":"error_if_empty emits the values emitted by the source Observable or a specified error message if the source Observable is empty (completes without having emitted any next value).","category":"page"},{"location":"operators/utility/error_if_empty/#See-also","page":"error_if_empty","title":"See also","text":"","category":"section"},{"location":"operators/utility/error_if_empty/","page":"error_if_empty","title":"error_if_empty","text":"Operators","category":"page"},{"location":"subjects/types/subject/#subject","page":"Subject","title":"Subject","text":"","category":"section"},{"location":"subjects/types/subject/","page":"Subject","title":"Subject","text":"Subject\nSubjectFactory","category":"page"},{"location":"subjects/types/subject/#Rocket.Subject","page":"Subject","title":"Rocket.Subject","text":"Subject(::Type{D}; scheduler::H = AsapScheduler())\n\nA Subject is a special type of Observable that allows values to be multicasted to many Observers. Subjects are like EventEmitters. Every Subject is an Observable and an Actor. You can subscribe to a Subject, and you can call next! to feed values as well as error! and complete!.\n\nNote: By convention, every actor subscribed to a Subject observable is not allowed to throw exceptions during next!, error! and complete! calls. Doing so would lead to undefined behaviour. Use safe() operator to bypass this rule. \n\nSee also: SubjectFactory, ReplaySubject, BehaviorSubject, safe\n\n\n\n\n\n","category":"type"},{"location":"subjects/types/subject/#Rocket.SubjectFactory","page":"Subject","title":"Rocket.SubjectFactory","text":"SubjectFactory(scheduler::H) where { H <: AbstractScheduler }\n\nA base subject factory that creates an instance of Subject with specified scheduler.\n\nSee also: AbstractSubjectFactory, Subject\n\n\n\n\n\n","category":"type"},{"location":"subjects/types/subject/#Description","page":"Subject","title":"Description","text":"","category":"section"},{"location":"subjects/types/subject/","page":"Subject","title":"Subject","text":"Every Subject is an Observable. Given a Subject, you can subscribe to it, providing an Actor, which will start receiving values normally. From the perspective of the Observer, it cannot tell whether the Observable execution is coming from a plain unicast Observable or a Subject.","category":"page"},{"location":"subjects/types/subject/","page":"Subject","title":"Subject","text":"Internally to the Subject, subscribe does not invoke a new execution that delivers values. It simply registers the given Observer in a list of Observers.","category":"page"},{"location":"subjects/types/subject/","page":"Subject","title":"Subject","text":"Every Subject is an Actor. It is an object with the methods next!, error!, and complete!. To feed a new value to the Subject, just call next!(subject, theValue), and it will be multicasted to the Actors registered to listen to the Subject.","category":"page"},{"location":"subjects/types/subject/","page":"Subject","title":"Subject","text":"note: Note\nBy convention, every actor subscribed to a Subject observable is not allowed to throw exceptions during next!, error! and complete! calls. Doing so would lead to undefined behaviour. Use safe() operator to bypass this rule. ","category":"page"},{"location":"subjects/types/subject/#Examples","page":"Subject","title":"Examples","text":"","category":"section"},{"location":"subjects/types/subject/","page":"Subject","title":"Subject","text":"In the following example, the BehaviorSubject is initialized with the value 0 which the first Observer receives when it subscribes. The second Observer receives the value 2 even though it subscribed after the value 2 was sent.","category":"page"},{"location":"subjects/types/subject/","page":"Subject","title":"Subject","text":"using Rocket\n\nsubject = Subject(Int)\n\nsubscription1 = subscribe!(subject, logger(\"1\"))\n\nnext!(subject, 1)\nnext!(subject, 2)\n\nsubscription2 = subscribe!(subject, logger(\"2\"))\n\nnext!(subject, 3)\n\nunsubscribe!(subscription1)\nunsubscribe!(subscription2)\n\n// Logs\n// [1] Data: 1\n// [1] Data: 2\n// [1] Data: 3\n// [2] Data: 3","category":"page"},{"location":"utils/#Utils","page":"Utils","title":"Utils","text":"","category":"section"},{"location":"utils/","page":"Utils","title":"Utils","text":"setTimeout\nRocket.combined_type\nRocket.union_type","category":"page"},{"location":"utils/#Rocket.setTimeout","page":"Utils","title":"Rocket.setTimeout","text":"setTimeout(f::Function, timeout::Int)\n\nCreates a Task which will asynchornously invoke fucntion f after specified timeout time in milliseconds.\n\nArguments\n\nf::Function, function to be invoked asynchronously\ntimeout::Int, timeout in milliseconds\n\nExamples\n\nusing Rocket\nusing Dates\n\nprintln(\"Before: \", Dates.format(now(), \"MM:SS\"))\nsetTimeout(1000) do\n println(\"Inside: \", Dates.format(now(), \"MM:SS\"))\nend\nprintln(\"Right after: \", Dates.format(now(), \"MM:SS\"))\n;\n\n# Logs\n# Before: 20:59\n# Right after: 20:59\n# Inside: 21:00\n\n\n\n\n\n","category":"function"},{"location":"utils/#Rocket.combined_type","page":"Utils","title":"Rocket.combined_type","text":"combined_type(sources)\n\nReturns a Tuple el-type of observable el-types in sources argument in the same order\n\n\n\n\n\n","category":"function"},{"location":"utils/#Rocket.union_type","page":"Utils","title":"Rocket.union_type","text":"union_type(sources)\n\nReturns a Union el-type of observable el-types in sources argument\n\n\n\n\n\n","category":"function"},{"location":"utils/#Helpers","page":"Utils","title":"Helpers","text":"","category":"section"},{"location":"utils/","page":"Utils","title":"Utils","text":"Rocket.@MStorage\nRocket.setstorage!","category":"page"},{"location":"utils/#Rocket.@MStorage","page":"Utils","title":"Rocket.@MStorage","text":"@MStorage(n::Int)\n\nHelper function to generate tuple-like structure MStorageN, but with mutable fields and empty constructor. It is possible then to take a snapshot(::MStorage) which returns a tuple with the same types and values from storage. Some operators and observables use pregenerated MStorage to instatiate uninitialized mutable storage in case when stream is allowed to not emit any values before completion.\n\nGenerated structure layout\n\nstruct MStorageN{V1, V2, ..., VN}\n v1 :: V1\n v2 :: V2\n ...\n vn :: VN\nend\n\nSee also: setstorage!\n\n\n\n\n\n","category":"macro"},{"location":"utils/#Rocket.setstorage!","page":"Utils","title":"Rocket.setstorage!","text":"setstorage!(s, v, ::Val{I}) where I\n\nThis function can be used to set a new value v for storage s with a given value v and index I. Using parametrized Val{I} for indexing ensures for index to be resolved at compile-time and if-else branch optimization.\n\nSee also: @MStorage\n\n\n\n\n\n","category":"function"},{"location":"observables/types/completed/#observable_completed","page":"Completed","title":"Completed Observable","text":"","category":"section"},{"location":"observables/types/completed/","page":"Completed","title":"Completed","text":"completed","category":"page"},{"location":"observables/types/completed/#Rocket.completed","page":"Completed","title":"Rocket.completed","text":"completed(::Type{T} = Any; scheduler::H = AsapScheduler()) where { T, H <: AbstractScheduler }\n\nCreation operator for the CompletedObservable that emits no items to the Actor and immediately sends a complete notification on subscription.\n\nArguments\n\nT: type of output data source, optional, Any is the default\nscheduler: optional, scheduler-like object\n\nExamples\n\nusing Rocket\n\nsource = completed(Int)\nsubscribe!(source, logger())\n;\n\n# output\n\n[LogActor] Completed\n\n\nSee also: CompletedObservable, subscribe!, logger\n\n\n\n\n\n","category":"function"},{"location":"observables/types/completed/","page":"Completed","title":"Completed","text":"CompletedObservable","category":"page"},{"location":"observables/types/completed/#Rocket.CompletedObservable","page":"Completed","title":"Rocket.CompletedObservable","text":"CompletedObservable{D, H}(scheduler::H)\n\nObservable that emits no items to the Actor and just sends a complete notification on subscription.\n\nConstructor arguments\n\nscheduler: Scheduler-like object\n\nSee also: Subscribable, completed\n\n\n\n\n\n","category":"type"},{"location":"operators/utility/tap/#operator_tap","page":"tap","title":"Tap Operator","text":"","category":"section"},{"location":"operators/utility/tap/","page":"tap","title":"tap","text":"tap","category":"page"},{"location":"operators/utility/tap/#Rocket.tap","page":"tap","title":"Rocket.tap","text":"tap(tapFn::F) where { F <: Function }\n\nCreates a tap operator, which performs a side effect for every emission on the source Observable, but return an Observable that is identical to the source.\n\nArguments\n\ntapFn::Function: side-effect tap function with (data) -> Nothing signature\n\nProducing\n\nStream of type <: Subscribable{L} where L refers to type of source stream\n\nExamples\n\nusing Rocket\n\nsource = from([ 1, 2, 3 ])\nsubscribe!(source |> tap((d) -> println(\"In tap: $d\")), logger())\n;\n\n# output\n\nIn tap: 1\n[LogActor] Data: 1\nIn tap: 2\n[LogActor] Data: 2\nIn tap: 3\n[LogActor] Data: 3\n[LogActor] Completed\n\n\nSee also: tap_on_subscribe, tap_on_complete, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/utility/tap/#Description","page":"tap","title":"Description","text":"","category":"section"},{"location":"operators/utility/tap/","page":"tap","title":"tap","text":"Returns an Observable that resembles the source Observable, but modifies it so that the provided Observer is called to perform a side effect for every value emitted by the source.","category":"page"},{"location":"operators/utility/tap/","page":"tap","title":"tap","text":"This operator is useful for debugging your Observables, verifying correct values, or performing other side effects.","category":"page"},{"location":"operators/utility/tap/","page":"tap","title":"tap","text":"Note: this operator differs from a subscribe on the Observable. If the Observable returned by tap is not subscribed, the side effects specified by the Observer will never happen. tap therefore simply spies on existing execution, it does not trigger an execution to happen like subscribe does.","category":"page"},{"location":"operators/utility/tap/#See-also","page":"tap","title":"See also","text":"","category":"section"},{"location":"operators/utility/tap/","page":"tap","title":"tap","text":"Operators","category":"page"},{"location":"observables/types/network/#observable_network","page":"Network","title":"Network Observable","text":"","category":"section"},{"location":"observables/types/network/","page":"Network","title":"Network","text":"network","category":"page"},{"location":"observables/types/network/#Rocket.network","page":"Network","title":"Rocket.network","text":"network(::Type{D}, port::Int) where D\nnetwork(::Type{D}, address::A, port::Int) where { D, A <: IPAddr }\n\nnetwork(::Type{Vector{D}}, port::Int, buffer_size::Int) where D\nnetwork(::Type{Vector{D}}, address::A, port::Int, buffer_size::Int) where { D, A <: IPAddr }\n\nCreation operator for the NetworkObservable that emits messages from the server with specified address and port arguments.\n\nSee also: NetworkObservable, subscribe!\n\n\n\n\n\n","category":"function"},{"location":"observables/types/network/","page":"Network","title":"Network","text":"NetworkObservable","category":"page"},{"location":"observables/types/network/#Rocket.NetworkObservable","page":"Network","title":"Rocket.NetworkObservable","text":"NetworkObservable{D, Address, Port, S}()\n\nNetworkObservable listens for the messages of type D from remote server with specified Address and Port parameters.\n\nSee also: network, Subscribable\n\n\n\n\n\n","category":"type"},{"location":"observables/types/function/#observable_function","page":"Function","title":"Function Observable","text":"","category":"section"},{"location":"observables/types/function/","page":"Function","title":"Function","text":"make","category":"page"},{"location":"observables/types/function/#Rocket.make","page":"Function","title":"Rocket.make","text":"make(f::Function, type::Type{D})\n\nCreation operator for the FunctionObservable.\n\nArguments\n\nf: function to be invoked on subscription\ntype: type of data in observable\n\nExamples\n\nusing Rocket\n\nsource = make(Int) do actor\n next!(actor, 0)\n complete!(actor)\nend\n\nsubscription = subscribe!(source, logger());\nunsubscribe!(subscription)\n;\n\n# output\n\n[LogActor] Data: 0\n[LogActor] Completed\n\n\nusing Rocket\n\nsource = make(Int) do actor\n next!(actor, 0)\n setTimeout(100) do\n next!(actor, 1)\n complete!(actor)\n end\nend\n\nsubscription = subscribe!(source, logger())\nunsubscribe!(subscription)\n;\n\n# output\n\n[LogActor] Data: 0\n\nSee also: FunctionObservable, subscribe!, logger\n\n\n\n\n\n","category":"function"},{"location":"observables/types/function/","page":"Function","title":"Function","text":"FunctionObservable","category":"page"},{"location":"observables/types/function/#Rocket.FunctionObservable","page":"Function","title":"Rocket.FunctionObservable","text":"FunctionObservable{D}(f::F)\n\nFunctionObservable wraps a callback f, which is called when the Observable is initially subscribed to. This function is given an Actor, to which new values can be nexted (with next!(actor, data)), or an error! method can be called to raise an error, or complete! can be called to notify of a successful completion.\n\nArguments\n\nf::F: function to be invoked on subscription\n\nSee also: Subscribable, make\n\n\n\n\n\n","category":"type"},{"location":"observables/types/race/#observable_race","page":"Race","title":"Race Observable","text":"","category":"section"},{"location":"observables/types/race/","page":"Race","title":"Race","text":"race","category":"page"},{"location":"observables/types/race/#Rocket.race","page":"Race","title":"Rocket.race","text":"race(sources...)\nrace(sources::S) where { S <: Tuple }\n\nCombines multiple Observables to create an Observable that mirrors the output of the first Observable to emit an item. Essentially it subscribes to the observable that was the first to start emitting.\n\nArguments\n\nsources: input sources\n\nExamples\n\nusing Rocket\n\nsource1 = of(1)\nsource2 = of(2)\n\nsubscribe!(race(source1, source2), logger())\n;\n\n# output\n[LogActor] Data: 1\n[LogActor] Completed\n\nusing Rocket\n\nsource1 = of(1) |> async()\nsource2 = of(2)\n\nsubscribe!(race(source1, source2), logger())\n;\n\n# output\n[LogActor] Data: 2\n[LogActor] Completed\n\nSee also: Subscribable, subscribe!\n\n\n\n\n\n","category":"function"},{"location":"operators/transformation/concat_map_to/#operator_concat_map_to","page":"concat_map_to","title":"ConcatMapTo Operator","text":"","category":"section"},{"location":"operators/transformation/concat_map_to/","page":"concat_map_to","title":"concat_map_to","text":"concat_map_to","category":"page"},{"location":"operators/transformation/concat_map_to/#Rocket.concat_map_to","page":"concat_map_to","title":"Rocket.concat_map_to","text":"switch_map_to(inner_observable)\n\nCreates a switch_map_to operator, which returns an observable of values merged together by joining the passed observable with itself, one after the other, for each value emitted from the source. Essentially it projects each source value to the same Observable which is merged multiple times in a serialized fashion on the output Observable.\n\nArguments\n\ninner_observable: an Observable to replace each value from the source Observable.\n\nProducing\n\nStream of type <: Subscribable{R} where R refers to the eltype of inner_observable\n\nExamples\n\nusing Rocket\n\nsource = from([ 0, 0, 0 ])\nsubscribe!(source |> concat_map_to(from([ 1, 2, 3 ])), logger())\n;\n\n# output\n\n[LogActor] Data: 1\n[LogActor] Data: 2\n[LogActor] Data: 3\n[LogActor] Data: 1\n[LogActor] Data: 2\n[LogActor] Data: 3\n[LogActor] Data: 1\n[LogActor] Data: 2\n[LogActor] Data: 3\n[LogActor] Completed\n\nSee also: concat_map, AbstractOperator, RightTypedOperator, ProxyObservable, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/transformation/concat_map_to/","page":"concat_map_to","title":"concat_map_to","text":"note: Note\nconcat_map_to is equivalent to concat_map with mappingFn set to (_) -> inner_observable.","category":"page"},{"location":"operators/transformation/concat_map_to/#See-also","page":"concat_map_to","title":"See also","text":"","category":"section"},{"location":"operators/transformation/concat_map_to/","page":"concat_map_to","title":"concat_map_to","text":"Operators, concat_map","category":"page"},{"location":"operators/errors/error_if_not/#operator_error_if_not","page":"error_if_not","title":"Error If Not Operator","text":"","category":"section"},{"location":"operators/errors/error_if_not/","page":"error_if_not","title":"error_if_not","text":"Note: error_if_not is an alias for error_if operator with inverted checkFn.","category":"page"},{"location":"operators/errors/error_if_not/","page":"error_if_not","title":"error_if_not","text":"error_if_not","category":"page"},{"location":"operators/errors/error_if_not/#Rocket.error_if_not","page":"error_if_not","title":"Rocket.error_if_not","text":"error_if_not(checkFn, errorFn)\n\nCreates an error_if_not operator, which performs a check for every emission on the source Observable with checkFn. If checkFn returns false, the operator sends an error event and unsubscribes from the observable.\n\nNote: error_if_not is an alias for error_if operator with inverted checkFn.\n\nArguments\n\ncheckFn: check function with (data) -> Bool signature\nerrorFn: error object generating function with (data) -> Any signature, optional\n\nProducing\n\nStream of type <: Subscribable{L} where L refers to type of source stream\n\nExamples\n\nusing Rocket\n\nsource = from([1, 2, 3]) |> error_if_not((data) -> data < 2, (data) -> \"CustomError\")\n\nsubscription = subscribe!(source, lambda(\n on_next = (d) -> println(\"Next: \", d),\n on_error = (e) -> println(\"Error: \", e),\n on_complete = () -> println(\"Completed\")\n))\n;\n\n# output\nNext: 1\nError: CustomError\n\nSee also: error_if, error_if_empty, default_if_empty, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/errors/error_if_not/#See-also","page":"error_if_not","title":"See also","text":"","category":"section"},{"location":"operators/errors/error_if_not/","page":"error_if_not","title":"error_if_not","text":"Operators","category":"page"},{"location":"todo/#TODO","page":"TODO","title":"TODO","text":"","category":"section"},{"location":"todo/","page":"TODO","title":"TODO","text":"This package in under development and some features of the reactive framework not yet implemented.","category":"page"},{"location":"operators/mathematical/count/#operator_count","page":"count","title":"Count Operator","text":"","category":"section"},{"location":"operators/mathematical/count/","page":"count","title":"count","text":"count","category":"page"},{"location":"operators/mathematical/count/#Base.count","page":"count","title":"Base.count","text":"count()\n\nCreates a count operator, which counts the number of emissions on the source and emits that number when the source completes.\n\nProducing\n\nStream of type <: Subscribable{Int}\n\nExamples\n\nusing Rocket\n\nsource = from([ i for i in 1:42 ])\nsubscribe!(source |> count(), logger())\n;\n\n# output\n\n[LogActor] Data: 42\n[LogActor] Completed\n\n\nSee also: AbstractOperator, RightTypedOperator, ProxyObservable, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/mathematical/count/#Description","page":"count","title":"Description","text":"","category":"section"},{"location":"operators/mathematical/count/","page":"count","title":"count","text":"count transforms an Observable that emits values into an Observable that emits a single value that represents the number of values emitted by the source Observable. If the source Observable terminates with an error, count will pass this error notification along without emitting a value first. If the source Observable does not terminate at all, count will neither emit a value nor terminate.","category":"page"},{"location":"operators/mathematical/count/#Example","page":"count","title":"Example","text":"","category":"section"},{"location":"operators/mathematical/count/","page":"count","title":"count","text":"Counts how many values source Observable have emitted before the complete event happened","category":"page"},{"location":"operators/mathematical/count/","page":"count","title":"count","text":"using Rocket\n\nsource = from([ i for i in 1:42 ])\nsubscribe!(source |> count(), logger())\n\n# output\n\n[LogActor] Data: 42\n[LogActor] Completed","category":"page"},{"location":"operators/mathematical/count/#See-also","page":"count","title":"See also","text":"","category":"section"},{"location":"operators/mathematical/count/","page":"count","title":"count","text":"Operators","category":"page"},{"location":"operators/transformation/map_to/#operator_map_to","page":"map_to","title":"MapTo Operator","text":"","category":"section"},{"location":"operators/transformation/map_to/","page":"map_to","title":"map_to","text":"map_to","category":"page"},{"location":"operators/transformation/map_to/#Rocket.map_to","page":"map_to","title":"Rocket.map_to","text":"map_to(value::T) where T\n\nCreates a map operator, which emits the given constant value on the output Observable every time the source Observable emits a value.\n\nArguments\n\nvalue::T: the constant value to map each source value to\n\nProducing\n\nStream of type <: Subscribable{T}\n\nExamples\n\nusing Rocket\n\nsource = from([ 1, 2, 3 ])\nsubscribe!(source |> map_to('a'), logger())\n;\n\n# output\n\n[LogActor] Data: a\n[LogActor] Data: a\n[LogActor] Data: a\n[LogActor] Completed\n\nSee also: map, AbstractOperator, RightTypedOperator, ProxyObservable, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/transformation/map_to/#Description","page":"map_to","title":"Description","text":"","category":"section"},{"location":"operators/transformation/map_to/","page":"map_to","title":"map_to","text":"Takes a constant value as argument, and emits that whenever the source Observable emits a value. In other words, ignores the actual source value, and simply uses the emission moment to know when to emit the given value.","category":"page"},{"location":"operators/transformation/map_to/#See-also","page":"map_to","title":"See also","text":"","category":"section"},{"location":"operators/transformation/map_to/","page":"map_to","title":"map_to","text":"Operators","category":"page"},{"location":"observables/types/merged/#observable_merged","page":"Merged","title":"Merged Observable","text":"","category":"section"},{"location":"observables/types/merged/","page":"Merged","title":"Merged","text":"merged","category":"page"},{"location":"observables/types/merged/#Rocket.merged","page":"Merged","title":"Rocket.merged","text":"merged(sources::T) where { T <: Tuple }\n\nCreation operator for the MergeObservable with a given sources collected in a tuple. merge subscribes to each given input Observable (as arguments), and simply forwards (without doing any transformation) all the values from all the input Observables to the output Observable. The output Observable only completes once all input Observables have completed. Any error delivered by an input Observable will be immediately emitted on the output Observable.\n\nExamples\n\nusing Rocket\n\nobservable = merged((from(1:4), of(2.0), from(\"Hello\")))\n\nsubscribe!(observable, logger())\n;\n\n# output\n[LogActor] Data: 1\n[LogActor] Data: 2\n[LogActor] Data: 3\n[LogActor] Data: 4\n[LogActor] Data: 2.0\n[LogActor] Data: H\n[LogActor] Data: e\n[LogActor] Data: l\n[LogActor] Data: l\n[LogActor] Data: o\n[LogActor] Completed\n\nusing Rocket\n\nsubject = Subject(Int, scheduler = AsyncScheduler())\n\nobservable = merged((subject, of(2.0), from(\"Hello\")))\n\nactor = sync(logger())\n\nsubscribe!(observable, actor)\n\nsetTimeout(200) do\n next!(subject, 1)\n complete!(subject)\nend\n\nwait(actor)\n;\n\n# output\n[LogActor] Data: 2.0\n[LogActor] Data: H\n[LogActor] Data: e\n[LogActor] Data: l\n[LogActor] Data: l\n[LogActor] Data: o\n[LogActor] Data: 1\n[LogActor] Completed\n\nSee also: Subscribable\n\n\n\n\n\n","category":"function"},{"location":"operators/transformation/uppercase/#operator_uppercase","page":"uppercase","title":"Uppercase Operator","text":"","category":"section"},{"location":"operators/transformation/uppercase/","page":"uppercase","title":"uppercase","text":"uppercase","category":"page"},{"location":"operators/transformation/uppercase/#Base.Unicode.uppercase","page":"uppercase","title":"Base.Unicode.uppercase","text":"uppercase()\n\nCreates an uppercase operator, which forces each value to be in upper case\n\nProducing\n\nStream of type <: Subscribable{L} where L referes to type of data of input Observable\n\nExamples\n\nusing Rocket\n\nsource = of(\"Hello, world!\")\nsubscribe!(source |> uppercase(), logger())\n;\n\n# output\n\n[LogActor] Data: HELLO, WORLD!\n[LogActor] Completed\n\nSee also: AbstractOperator, InferableOperator, ProxyObservable, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/transformation/uppercase/#See-also","page":"uppercase","title":"See also","text":"","category":"section"},{"location":"operators/transformation/uppercase/","page":"uppercase","title":"uppercase","text":"Operators, map, lowercase","category":"page"},{"location":"observables/types/file/#observable_file","page":"File","title":"File Observable","text":"","category":"section"},{"location":"observables/types/file/","page":"File","title":"File","text":"file","category":"page"},{"location":"observables/types/file/#Rocket.file","page":"File","title":"Rocket.file","text":"file(path::String)\n\nCreation operator for the SyncFileObservable with a given path.\n\nSee also: SyncFileObservable\n\n\n\n\n\n","category":"function"},{"location":"observables/types/file/","page":"File","title":"File","text":"SyncFileObservable","category":"page"},{"location":"observables/types/file/#Rocket.SyncFileObservable","page":"File","title":"Rocket.SyncFileObservable","text":"SyncFileObservable(path::String)\n\nFile observable, which synchronously emits content of the file line by line as a String objects on subscription.\n\nSee also: file, Subscribable\n\n\n\n\n\n","category":"type"},{"location":"operators/mathematical/reduce/#operator_reduce","page":"reduce","title":"Reduce Operator","text":"","category":"section"},{"location":"operators/mathematical/reduce/","page":"reduce","title":"reduce","text":"reduce","category":"page"},{"location":"operators/mathematical/reduce/#Base.reduce","page":"reduce","title":"Base.reduce","text":"reduce(::Type{R}, reduceFn::Function, seed::R) where R\nreduce(reduceFn::F) where { F <: Function }\n\nCreates a reduce operator, which applies a given accumulator reduceFn function over the source Observable, and returns the accumulated result when the source completes, given an optional seed value. If a seed value is specified, then that value will be used as the initial value for the accumulator. If no seed value is specified, the first item of the source is used as the seed.\n\nArguments\n\n::Type{R}: the type of data of transformed value\nreduceFn::Function: transformation function with (data::T, current::R) -> R signature\nseed::R: optional seed accumulation value\n\nProducing\n\nStream of type <: Subscribable{R}\n\nExamples\n\nusing Rocket\n\nsource = from([ i for i in 1:10 ])\nsubscribe!(source |> reduce(Vector{Int}, (d, c) -> [ c..., d ], Int[]), logger())\n;\n\n# output\n\n[LogActor] Data: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]\n[LogActor] Completed\n\n\nusing Rocket\n\nsource = from([ i for i in 1:42 ])\nsubscribe!(source |> reduce(+), logger())\n;\n\n# output\n\n[LogActor] Data: 903\n[LogActor] Completed\n\n\nSee also: AbstractOperator, RightTypedOperator, ProxyObservable, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/mathematical/reduce/#Description","page":"reduce","title":"Description","text":"","category":"section"},{"location":"operators/mathematical/reduce/","page":"reduce","title":"reduce","text":"reduce applies an accumulator function to each value of the source Observable (from the past) and reduces it to a single value that is emitted by the output Observable. Note that reduce will only emit one value, only when the source Observable completes. It is equivalent to applying scan followed by last.","category":"page"},{"location":"operators/mathematical/reduce/","page":"reduce","title":"reduce","text":"It returns an Observable that applies a specified accumulator function to each item emitted by the source Observable. If a seed value is specified, then that value will be used as the initial value of the accumulator. If no seed value is specified, the first item of the source is used as the seed.","category":"page"},{"location":"operators/mathematical/reduce/#See-also","page":"reduce","title":"See also","text":"","category":"section"},{"location":"operators/mathematical/reduce/","page":"reduce","title":"reduce","text":"Operators, scan, last","category":"page"},{"location":"operators/filtering/some/#operator_some","page":"some","title":"Some Operator","text":"","category":"section"},{"location":"operators/filtering/some/","page":"some","title":"some","text":"some","category":"page"},{"location":"operators/filtering/some/#Rocket.some","page":"some","title":"Rocket.some","text":"some()\n\nCreates a some operator, which filters out nothing items by the source Observable by emitting only those that not equal to nothing.\n\nProducing\n\nStream of type <: Subscribable{L} where L refers to type of source stream <: Subscribable{Union{L, Nothing}}\n\nExamples\n\nusing Rocket\n\nsource = from([ 1, nothing, 3 ])\nsubscribe!(source |> some(), logger())\n;\n\n# output\n\n[LogActor] Data: 1\n[LogActor] Data: 3\n[LogActor] Completed\n\n\nSee also: AbstractOperator, InferableOperator, ProxyObservable, max, min, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/filtering/some/#Description","page":"some","title":"Description","text":"","category":"section"},{"location":"operators/filtering/some/","page":"some","title":"some","text":"This operator takes values from the source Observable and only emits those values that are not nothing.","category":"page"},{"location":"operators/filtering/some/#See-also","page":"some","title":"See also","text":"","category":"section"},{"location":"operators/filtering/some/","page":"some","title":"some","text":"Operators, filter","category":"page"},{"location":"actors/types/storage/#actor_storage","page":"Storage","title":"Storage actor","text":"","category":"section"},{"location":"actors/types/storage/","page":"Storage","title":"Storage","text":"storage","category":"page"},{"location":"actors/types/storage/#Rocket.storage","page":"Storage","title":"Rocket.storage","text":"storage(::Type{T}) where T\n\nArguments\n\n::Type{T}: Type of storage data\n\nCreation operator for the StorageActor actor.\n\nExamples\n\nusing Rocket\n\nactor = storage(Int)\nactor isa StorageActor{Int}\n\n# output\ntrue\n\nSee also: StorageActor, AbstractActor\n\n\n\n\n\n","category":"function"},{"location":"actors/types/storage/","page":"Storage","title":"Storage","text":"StorageActor","category":"page"},{"location":"actors/types/storage/#Rocket.StorageActor","page":"Storage","title":"Rocket.StorageActor","text":"StorageActor{D}() where D\n\nStorage actor provides an actor that stores a single (last) value passed to the next! callback. It saves last incoming successful next event in the value field, throws an ErrorException on error! event and does nothing on completion event. Before any events value initialised with nothing.\n\nExamples\n\nusing Rocket\n\nsource = from(1:5)\nactor = storage(Int)\n\nsubscribe!(source, actor)\nshow(getvalues(actor))\n\n# output\n5\n\nSee also: Actor, storage\n\n\n\n\n\n","category":"type"},{"location":"operators/multicasting/publish/#operator_publish","page":"publish","title":"Publish Operators","text":"","category":"section"},{"location":"operators/multicasting/publish/","page":"publish","title":"publish","text":"publish\npublish_behavior\npublish_replay\npublish_recent","category":"page"},{"location":"operators/multicasting/publish/#Rocket.publish","page":"publish","title":"Rocket.publish","text":"publish(; scheduler::H = AsapScheduler()) where { H <: AbstractScheduler }\n\npublish() is a shortcut for multicast(SubjectFactory())\n\nSee also: AbstractOperator, multicast, SubjectFactory\n\n\n\n\n\n","category":"function"},{"location":"operators/multicasting/publish/#Rocket.publish_behavior","page":"publish","title":"Rocket.publish_behavior","text":"publish_behavior(default; scheduler::H = AsapScheduler()) where { H <: AbstractScheduler }\n\npublish_behavior(default) is a shortcut for multicast(BehaviorSubjectFactory(default))\n\nSee also: AbstractOperator, multicast, BehaviorSubjectFactory\n\n\n\n\n\n","category":"function"},{"location":"operators/multicasting/publish/#Rocket.publish_replay","page":"publish","title":"Rocket.publish_replay","text":"publish_replay(size::Int; scheduler::H = AsapScheduler()) where { H <: AbstractScheduler }\n\npublish_replay(size) is a shortcut for multicast(ReplaySubjectFactory(size))\n\nSee also: AbstractOperator, multicast, ReplaySubjectFactory\n\n\n\n\n\n","category":"function"},{"location":"operators/multicasting/publish/#Rocket.publish_recent","page":"publish","title":"Rocket.publish_recent","text":"publish_recent(; scheduler::H = AsapScheduler()) where { H <: AbstractScheduler }\n\npublish_recent(size) is a shortcut for multicast(RecentSubjectFactory())\n\nSee also: AbstractOperator, multicast, RecentSubjectFactory\n\n\n\n\n\n","category":"function"},{"location":"operators/multicasting/publish/#See-also","page":"publish","title":"See also","text":"","category":"section"},{"location":"operators/multicasting/publish/","page":"publish","title":"publish","text":"Operators","category":"page"},{"location":"#Rocket.jl-Documentation","page":"Home","title":"Rocket.jl Documentation","text":"","category":"section"},{"location":"","page":"Home","title":"Home","text":"Welcome to the documentation for Rocket.jl.","category":"page"},{"location":"","page":"Home","title":"Home","text":"This documentation is an adaptation of the RxJS library documentation.","category":"page"},{"location":"#Table-of-Contents","page":"Home","title":"Table of Contents","text":"","category":"section"},{"location":"","page":"Home","title":"Home","text":"Pages = [\n \"getting-started.md\",\n \"observables/about.md\",\n \"actors/about.md\",\n \"teardown/about.md\",\n \"operators/about.md\",\n \"operators/piping.md\",\n \"operators/create-new-operator.md\",\n \"operators/high-order.md\",\n \"todo.md\",\n \"contributing.md\",\n \"utils.md\"\n]\nDepth = 2","category":"page"},{"location":"#Index","page":"Home","title":"Index","text":"","category":"section"},{"location":"","page":"Home","title":"Home","text":"","category":"page"},{"location":"actors/types/logger/#actor_logger","page":"Logger","title":"Logger actor","text":"","category":"section"},{"location":"actors/types/logger/","page":"Logger","title":"Logger","text":"logger","category":"page"},{"location":"actors/types/logger/#Rocket.logger","page":"Logger","title":"Rocket.logger","text":"logger([ io::IO ], name::String = \"LogActor\")\nlogger(::Type{T}, [ io::IO ], name::String = \"LogActor\") where T\n\nCreation operator for the LoggerActor actor.\n\nExamples\n\nusing Rocket\n\nsource = from([ 0, 1, 2 ])\nsubscribe!(source, logger())\n;\n\n# output\n\n[LogActor] Data: 0\n[LogActor] Data: 1\n[LogActor] Data: 2\n[LogActor] Completed\n\nusing Rocket\n\nsource = from([ 0, 1, 2 ])\nsubscribe!(source, logger(\"CustomName\"))\n;\n\n# output\n\n[CustomName] Data: 0\n[CustomName] Data: 1\n[CustomName] Data: 2\n[CustomName] Completed\n\nusing Rocket\n\nbuffer = IOBuffer()\n\nsource = from([ 0, 1, 2 ])\nsubscribe!(source, logger(buffer, \"CustomBuffer\"))\n;\n\nprint(String(take!(buffer)))\n# output\n\n[CustomBuffer] Data: 0\n[CustomBuffer] Data: 1\n[CustomBuffer] Data: 2\n[CustomBuffer] Completed\n\nSee also: LoggerActor, AbstractActor\n\n\n\n\n\n","category":"function"},{"location":"actors/types/logger/","page":"Logger","title":"Logger","text":"LoggerActor","category":"page"},{"location":"actors/types/logger/#Rocket.LoggerActor","page":"Logger","title":"Rocket.LoggerActor","text":"LoggerActor{D}(name::String = \"LogActor\", io::O) where { D, O }\n\nThe LoggerActor logs all next!/error!/complete! events that are sent from an Observable.\n\nConstructor arguments\n\nname: name of the logger. Optional. Default is LogActor.\nio: io stream to log in, maybe nothing to write to stdout\n\nSee also: Actor, logger\n\n\n\n\n\n","category":"type"},{"location":"operators/multicasting/about/#Multicasting-category","page":"About multicasting operators","title":"Multicasting category","text":"","category":"section"},{"location":"operators/multicasting/about/","page":"About multicasting operators","title":"About multicasting operators","text":"There are operators for different purposes, and they may be categorized as: creation, transformation, filtering, joining, multicasting, error handling, utility, etc. In the following list you will find all the operators organized in multicasting category.","category":"page"},{"location":"operators/multicasting/about/","page":"About multicasting operators","title":"About multicasting operators","text":"multicast\npublish\npublish_behavior\npublish_replay\nshare\nshare_replay","category":"page"},{"location":"operators/multicasting/about/#See-also","page":"About multicasting operators","title":"See also","text":"","category":"section"},{"location":"operators/multicasting/about/","page":"About multicasting operators","title":"About multicasting operators","text":"Operators","category":"page"},{"location":"observables/types/zipped/#observable_zipped","page":"Zipped","title":"Zipped Observable","text":"","category":"section"},{"location":"observables/types/zipped/","page":"Zipped","title":"Zipped","text":"zipped","category":"page"},{"location":"observables/types/zipped/#Rocket.zipped","page":"Zipped","title":"Rocket.zipped","text":"zipped(sources...)\n\nCombines multiple Observables to create an Observable whose values are calculated from the values, in order, of each of its input Observables.\n\nArguments\n\nsources: input sources\n\nExamples\n\nusing Rocket\n\nsource = zipped(of(1), from(2:5))\n\nsubscribe!(source, logger())\n;\n\n# output\n\n[LogActor] Data: (1, 2)\n[LogActor] Completed\n\nusing Rocket\n\nsource = zipped(from(1:3), from(1:5))\n\nsubscribe!(source, logger())\n;\n\n# output\n\n[LogActor] Data: (1, 1)\n[LogActor] Data: (2, 2)\n[LogActor] Data: (3, 3)\n[LogActor] Completed\n\nusing Rocket\n\nsource = zipped(completed(), of(0.0))\n\nsubscribe!(source, logger())\n;\n\n# output\n\n[LogActor] Completed\n\nSee also: Subscribable, subscribe!\n\n\n\n\n\n","category":"function"},{"location":"contributing/#Contribution-guidelines","page":"Contributing","title":"Contribution guidelines","text":"","category":"section"},{"location":"contributing/","page":"Contributing","title":"Contributing","text":"We welcome all possible contributors. This page details the some of the guidelines that should be followed when contributing to this package.","category":"page"},{"location":"contributing/#Reporting-bugs","page":"Contributing","title":"Reporting bugs","text":"","category":"section"},{"location":"contributing/","page":"Contributing","title":"Contributing","text":"We track bugs using GitHub issues. We encourage you to write complete, specific, reproducible bug reports. Mention the versions of Julia and Rocket.jl for which you observe unexpected behavior. Please provide a concise description of the problem and complement it with code snippets, test cases, screenshots, tracebacks or any other information that you consider relevant. This will help us to replicate the problem and narrow the search space for solutions.","category":"page"},{"location":"contributing/#Suggesting-features","page":"Contributing","title":"Suggesting features","text":"","category":"section"},{"location":"contributing/","page":"Contributing","title":"Contributing","text":"We welcome new feature proposals. However, before submitting a feature request, consider a few things:","category":"page"},{"location":"contributing/","page":"Contributing","title":"Contributing","text":"Does the feature require changes in the core Rocket.jl code? If it doesn't (for example, you would like to add a operator for a particular application), consider making a separate repository for your extensions.\nIf you would like to add an implementation of a feature that changes a lot in the core Rocket.jl code, please open an issue on GitHub and describe your proposal first. This will allow us to discuss your proposal with you before you invest your time in implementing something that may be difficult to merge later on.","category":"page"},{"location":"contributing/#Contributing-code","page":"Contributing","title":"Contributing code","text":"","category":"section"},{"location":"contributing/#Installing-Rocket","page":"Contributing","title":"Installing Rocket","text":"","category":"section"},{"location":"contributing/","page":"Contributing","title":"Contributing","text":"We suggest that you use the dev command from the new Julia package manager to install Rocket.jl for development purposes. To work on your fork of Rocket.jl, use your fork's URL address in the dev command, for example:","category":"page"},{"location":"contributing/","page":"Contributing","title":"Contributing","text":"] dev git@github.com:your_username/Rocket.jl.git","category":"page"},{"location":"contributing/","page":"Contributing","title":"Contributing","text":"The dev command clones Rocket.jl to ~/.julia/dev/Rocket. All local changes to Rocket code will be reflected in imported code.","category":"page"},{"location":"contributing/","page":"Contributing","title":"Contributing","text":"note: Note\nIt is also might be useful to install Revise.jl package as it allows you to modify code and use the changes without restarting Julia.","category":"page"},{"location":"contributing/#Committing-code","page":"Contributing","title":"Committing code","text":"","category":"section"},{"location":"contributing/","page":"Contributing","title":"Contributing","text":"We use the standard GitHub Flow workflow where all contributions are added through pull requests. In order to contribute, first fork the repository, then commit your contributions to your fork, and then create a pull request on the master branch of the Rocket.jl repository.","category":"page"},{"location":"contributing/","page":"Contributing","title":"Contributing","text":"Before opening a pull request, please make sure that all tests pass without failing! All demos (can be found in /demo/ directory) have to run without errors as well.","category":"page"},{"location":"contributing/#Style-conventions","page":"Contributing","title":"Style conventions","text":"","category":"section"},{"location":"contributing/","page":"Contributing","title":"Contributing","text":"We use default Julia style guide. We list here a few important points and our modifications to the Julia style guide:","category":"page"},{"location":"contributing/","page":"Contributing","title":"Contributing","text":"Use 4 spaces for indentation\nType names use UpperCamelCase. For example: ArrayObservable, MapOperator, etc..\nFunction names are lowercase with underscores, when necessary. For example: next!, subscribe!, as_actor, etc..\nVariable names and function arguments use snake_case\nThe name of a method that modifies its argument(s) must end in !","category":"page"},{"location":"contributing/#Unit-tests","page":"Contributing","title":"Unit tests","text":"","category":"section"},{"location":"contributing/","page":"Contributing","title":"Contributing","text":"We use the test-driven development (TDD) methodology for Rocket.jl development. The test coverage should be as complete as possible. Please make sure that you write tests for each piece of code that you want to add.","category":"page"},{"location":"contributing/","page":"Contributing","title":"Contributing","text":"All unit tests are located in the /test/ directory. The /test/ directory follows the structure of the /src/ directory. Each test file should have following filename format: test_*.jl. Some tests are also present in jldoctest docs annotations directly in the source code. See Julia's documentation about doctests.","category":"page"},{"location":"contributing/","page":"Contributing","title":"Contributing","text":"The tests can be evaluated by running following command in the Julia REPL:","category":"page"},{"location":"contributing/","page":"Contributing","title":"Contributing","text":"] test Rocket","category":"page"},{"location":"operators/transformation/override/#operator_override","page":"override","title":"Override Operator","text":"","category":"section"},{"location":"operators/transformation/override/","page":"override","title":"override","text":"override\nOverrideHandler","category":"page"},{"location":"operators/transformation/override/#Rocket.override","page":"override","title":"Rocket.override","text":"override(handler::OverrideHandler)\n\nCreates an override operator that overrides each emission from source observable with value provided in handler. If handler contains nothing source observable emits as usual. For constant override see map_to. Use Rocket.setvalue! to set new value for handler.\n\nProducing\n\nStream of type <: Subscribable{Union{L, T}} where L refers to the type of source stream and T referes to the type of handler's value\n\nExamples\n\nusing Rocket \n\nsubject = Subject(Int)\nhandler = OverrideHandler(Int, -1)\n\nsource = subject |> override(handler)\n\nsubscription = subscribe!(source, logger())\n\nnext!(subject, 1)\nnext!(subject, 2)\n\nRocket.setvalue!(handler, nothing)\n\nnext!(subject, 3)\nnext!(subject, 4)\n\nRocket.setvalue!(handler, -2)\n\nnext!(subject, 5)\nnext!(subject, 6)\n\nunsubscribe!(subscription)\n\n# output\n[LogActor] Data: -1\n[LogActor] Data: -1\n[LogActor] Data: 3\n[LogActor] Data: 4\n[LogActor] Data: -2\n[LogActor] Data: -2\n\nSee also: OverrideHandler\n\n\n\n\n\n","category":"function"},{"location":"operators/transformation/override/#Rocket.OverrideHandler","page":"override","title":"Rocket.OverrideHandler","text":"OverrideHandler(::Type{T}, value::Union{Nothing, T}) where T\nOverrideHandler(::Type{T}) where T\n\nHandler used in substitute operator.\n\nSee also: substitute\n\n\n\n\n\n","category":"type"},{"location":"operators/transformation/override/#See-also","page":"override","title":"See also","text":"","category":"section"},{"location":"operators/transformation/override/","page":"override","title":"override","text":"Operators","category":"page"},{"location":"operators/filtering/find/#operator_find","page":"find","title":"Find operator","text":"","category":"section"},{"location":"operators/filtering/find/","page":"find","title":"find","text":"find","category":"page"},{"location":"operators/filtering/find/#Rocket.find","page":"find","title":"Rocket.find","text":"find(conditionFn::F) where { F <: Function }\n\nCreates a find operator, which emits only the first value emitted by the source Observable that meets some condition.\n\nProducing\n\nStream of type <: Subscribable{L} where L refers to type of source stream\n\nArguments\n\nconditionFn::F: condition function with (data::T) -> Bool signature\n\nExamples\n\nusing Rocket\n\nsource = from([ 1, 2, 3, 4, 5, 6, 7, 8 ])\nsubscribe!(source |> find((d) -> d % 2 == 0), logger())\n;\n\n# output\n\n[LogActor] Data: 2\n[LogActor] Completed\n\nSee also: AbstractOperator, InferableOperator, ProxyObservable, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/filtering/find/#Description","page":"find","title":"Description","text":"","category":"section"},{"location":"operators/filtering/find/","page":"find","title":"find","text":"find searches for the first item in the source Observable that matches the specified condition embodied by the predicate, and returns the first occurrence in the source. Does not emit an error if a valid value is not found.","category":"page"},{"location":"operators/filtering/find/#See-also","page":"find","title":"See also","text":"","category":"section"},{"location":"operators/filtering/find/","page":"find","title":"find","text":"Operators, take","category":"page"},{"location":"operators/utility/discontinue/#operator_discontinue","page":"discontinue","title":"Discontinue Operator","text":"","category":"section"},{"location":"operators/utility/discontinue/","page":"discontinue","title":"discontinue","text":"discontinue","category":"page"},{"location":"operators/utility/discontinue/#Rocket.discontinue","page":"discontinue","title":"Rocket.discontinue","text":"discontinue()\n\nCreates an operator, which prevents an emitting of self-depending messages and breaks a possible infinite loop. Does nothing if observable scheduled asynchronously.\n\nProducing\n\nStream of type <: Subscribable{L} where L refers to type of source stream\n\nExamples\n\nusing Rocket\n\ns = BehaviorSubject(0)\n\nsubscription1 = subscribe!(s, logger())\nsubscription2 = subscribe!(s |> map(Int, d -> d + 1) |> discontinue(), s)\n;\n\n# output\n\n[LogActor] Data: 0\n[LogActor] Data: 1\n\nSee also: AbstractOperator, RightTypedOperator, ProxyObservable, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/utility/discontinue/#See-also","page":"discontinue","title":"See also","text":"","category":"section"},{"location":"operators/utility/discontinue/","page":"discontinue","title":"discontinue","text":"Operators","category":"page"},{"location":"teardown/about/#section_subscription","page":"Subscription","title":"Subscription","text":"","category":"section"},{"location":"teardown/about/","page":"Subscription","title":"Subscription","text":"A Subscription represents a disposable resource, usually the execution of an Observable. A Subscription has one important method: unsubscribe!(teardown), which takes some teardown logic object as one argument and disposes the resource held by the subscription.","category":"page"},{"location":"teardown/about/","page":"Subscription","title":"Subscription","text":"using Rocket\n\nsource = Subject(Int)\n\nnext!(source, 0) # Logs nothing as there is no subscribers\n\nsubscription = subscribe!(source, logger())\n\nnext!(source, 1) # Logs [LogActor] Data: 1 into standard output\n\nunsubscribe!(subscription)\n\nnext!(source, 2) # Logs nothing as a single one actor has unsubscribed","category":"page"},{"location":"teardown/about/","page":"Subscription","title":"Subscription","text":"note: Note\nA Subscription essentially just has its own specific method for unsubscribe!() function which releases resources or cancel Observable executions. Any Observable has to return a valid Teardown object.","category":"page"},{"location":"teardown/about/","page":"Subscription","title":"Subscription","text":"The unsubscribe! function also supports multiple unsubscriptions at once. If the input argument to the unsubscribe! function is either a tuple or a vector, it will first check that all of the arguments are valid subscription objects and if this is true it will unsubscribe from each of them individually.","category":"page"},{"location":"teardown/about/","page":"Subscription","title":"Subscription","text":"\nsource = Subject(Int)\n\nsubscription1 = subscribe!(source, logger())\nsubscription2 = subscribe!(source, logger())\n\nunsubscribe!((subscription1, subscription2))\n\n# or similarly\n# unsubscribe!([ subscription1, subscription2 ])\n","category":"page"},{"location":"teardown/about/","page":"Subscription","title":"Subscription","text":"For more information about subscription and teardown logic see the API Section","category":"page"},{"location":"operators/transformation/switch_map_to/#operator_switch_map_to","page":"switch_map_to","title":"SwitchMapTo Operator","text":"","category":"section"},{"location":"operators/transformation/switch_map_to/","page":"switch_map_to","title":"switch_map_to","text":"switch_map_to","category":"page"},{"location":"operators/transformation/switch_map_to/#Rocket.switch_map_to","page":"switch_map_to","title":"Rocket.switch_map_to","text":"switch_map_to(inner_observable)\n\nCreates a switch_map_to operator, which projects each source value to the same Observable which is flattened multiple times with switch_map in the output Observable.\n\nArguments\n\ninner_observable: an Observable to replace each value from the source Observable.\n\nProducing\n\nStream of type <: Subscribable{R} where R refers to the eltype of inner_observable\n\nExamples\n\nusing Rocket\n\nsource = from([ 0, 0, 0 ])\nsubscribe!(source |> switch_map_to(from([ 1, 2, 3 ])), logger())\n;\n\n# output\n\n[LogActor] Data: 1\n[LogActor] Data: 2\n[LogActor] Data: 3\n[LogActor] Data: 1\n[LogActor] Data: 2\n[LogActor] Data: 3\n[LogActor] Data: 1\n[LogActor] Data: 2\n[LogActor] Data: 3\n[LogActor] Completed\n\nSee also: switch_map, AbstractOperator, RightTypedOperator, ProxyObservable, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/transformation/switch_map_to/","page":"switch_map_to","title":"switch_map_to","text":"note: Note\nswitch_map_to is equivalent to switch_map with mappingFn set to (_) -> inner_observable.","category":"page"},{"location":"operators/transformation/switch_map_to/#See-also","page":"switch_map_to","title":"See also","text":"","category":"section"},{"location":"operators/transformation/switch_map_to/","page":"switch_map_to","title":"switch_map_to","text":"Operators","category":"page"},{"location":"operators/errors/rerun/#operator_rerun","page":"rerun","title":"Rerun Operator","text":"","category":"section"},{"location":"operators/errors/rerun/","page":"rerun","title":"rerun","text":"rerun","category":"page"},{"location":"operators/errors/rerun/#Rocket.rerun","page":"rerun","title":"Rocket.rerun","text":"rerun(count::Int = -1)\n\nReturns an Observable that mirrors the source Observable with the exception of an error. If the source Observable calls error, this method will resubscribe to the source Observable for a maximum of count resubscriptions (given as a number parameter) rather than propagating the error call.\n\nArguments:\n\ncount::Int: Number of retry attempts before failing. Optional. Default is -1.\n\nProducing\n\nStream of type <: Subscribable{L} where L refers to type of source stream\n\nExamples\n\nusing Rocket\n\nsource = from(1:3) |> safe() |> map(Int, (d) -> d > 1 ? error(\"Error\") : d) |> rerun(3)\n\nsubscribe!(source, logger())\n;\n\n# output\n[LogActor] Data: 1\n[LogActor] Data: 1\n[LogActor] Data: 1\n[LogActor] Data: 1\n[LogActor] Error: ErrorException(\"Error\")\n\nSee also: AbstractOperator, InferableOperator, catch_error, logger, safe\n\n\n\n\n\n","category":"function"},{"location":"operators/errors/rerun/#Description","page":"rerun","title":"Description","text":"","category":"section"},{"location":"operators/errors/rerun/","page":"rerun","title":"rerun","text":"Any and all items emitted by the source Observable will be emitted by the resulting Observable, even those emitted during failed subscriptions. For example, if an Observable fails at first but emits [1, 2] then succeeds the second time and emits: [1, 2, 3, 4, 5] then the complete stream of emissions and notifications would be: [1, 2, 1, 2, 3, 4, 5, complete].","category":"page"},{"location":"operators/errors/rerun/#See-also","page":"rerun","title":"See also","text":"","category":"section"},{"location":"operators/errors/rerun/","page":"rerun","title":"rerun","text":"Operators","category":"page"},{"location":"observables/types/timer/#observable_timer","page":"Timer","title":"Timer Observable","text":"","category":"section"},{"location":"observables/types/timer/","page":"Timer","title":"Timer","text":"timer","category":"page"},{"location":"observables/types/timer/#Rocket.timer","page":"Timer","title":"Rocket.timer","text":"timer(delay::Int)\ntimer(delay::Int, period::Int)\n\nCreation operator for the TimerObservable. Its like interval(@ref), but you can specify when should the emissions start. timer returns an Observable that emits an infinite sequence of ascending integers, with a constant interval of time, period of your choosing between those emissions. The first emission happens after the specified delay. If period is not specified, the output Observable emits only one value, 0. Otherwise, it emits an infinite sequence.\n\nArguments\n\ndelay: the initial delay time specified as an integer denoting milliseconds to wait before emitting the first value of 0.\nperiod: the minimum period of time between emissions of the subsequent numbers (in milliseconds).\n\nExamples\n\nusing Rocket\n\nsource = timer(0, 50)\n\nsleep(0.075)\nsubscription = subscribe!(source, logger())\nsleep(0.105)\nunsubscribe!(subscription)\n\nclose(source)\n;\n\n# output\n\n[LogActor] Data: 2\n[LogActor] Data: 3\n\n\nSee also: interval, TimerObservable, subscribe!, logger\n\n\n\n\n\n","category":"function"},{"location":"observables/types/timer/","page":"Timer","title":"Timer","text":"TimerObservable","category":"page"},{"location":"observables/types/timer/#Rocket.TimerObservable","page":"Timer","title":"Rocket.TimerObservable","text":"TimerObservable\n\nAn Observable that starts emitting after an delay and emits ever increasing numbers after each period of time thereafter.\n\nParameters\n\ndelay: The initial delay time specified as an integer denoting milliseconds to wait before emitting the first value of 0`.\nperiod: The minimum period of time in milliseconds between emissions of the subsequent numbers.\n\nSee also: timer, Subscribable\n\n\n\n\n\n","category":"type"},{"location":"actors/about/#section_actors","page":"Actor","title":"Actors","text":"","category":"section"},{"location":"actors/about/","page":"Actor","title":"Actor","text":"An Actor is the most primitive unit of computation: it receives a message and performs a computation.","category":"page"},{"location":"actors/about/","page":"Actor","title":"Actor","text":"An actor is analogous to an object in an object-oriented languages. An object receives a message (a method call) and does something depending on which message it receives (the method we are calling). The main difference is that actors are completely isolated from each other, and they will never share memory. It’s also worth mentioning that an actor can maintain a private state that should never be changed directly by another actor.","category":"page"},{"location":"actors/about/","page":"Actor","title":"Actor","text":"For a quick introduction to Actor models, see this article.","category":"page"},{"location":"actors/about/","page":"Actor","title":"Actor","text":"The API of Rocket.jl's Actors is similar to RxJS subscribers.","category":"page"},{"location":"actors/about/#First-example","page":"Actor","title":"First example","text":"","category":"section"},{"location":"actors/about/","page":"Actor","title":"Actor","text":"The following example implements an Actor that retains each received value from an Observable.","category":"page"},{"location":"actors/about/","page":"Actor","title":"Actor","text":"using Rocket\n\nstruct CustomKeepActor <: Actor{Int}\n values::Vector{Int}\n\n CustomKeepActor() = new(Vector{Int}())\nend\n\nRocket.on_next!(actor::CustomKeepActor, data::Int) = push!(actor.values, data)\nRocket.on_error!(actor::CustomKeepActor, err) = error(err)\nRocket.on_complete!(actor::CustomKeepActor) = println(\"Completed!\")\n\nsource = from([ 1, 2, 3 ])\nkeep_actor = CustomKeepActor()\nsubscribe!(source, keep_actor)\n\n# Logs\n# Completed!\n\nprintln(keep_actor.values)\n\n# Logs\n# [1, 2, 3]","category":"page"},{"location":"actors/about/","page":"Actor","title":"Actor","text":"An actor may be not interested in the values itself, but merely the completion of an event. In this case, Rocket.jl provides a CompletionActor abstract type. See also NextActor and ErrorActor.","category":"page"},{"location":"actors/about/","page":"Actor","title":"Actor","text":"using Rocket\n\nstruct CompletionNotificationActor <: CompletionActor{Int} end\n\nRocket.on_complete!(::CompletionNotificationActor) = println(\"Completed!\")\n\nsource = from([ 1, 2, 3 ])\nsubscribe!(source, CompletionNotificationActor());\n\n# Logs\n# Completed","category":"page"},{"location":"actors/about/","page":"Actor","title":"Actor","text":"It is also possible to use Julia's multiple dispatch feature and dispatch on type of the event","category":"page"},{"location":"actors/about/","page":"Actor","title":"Actor","text":"using Rocket\n\nstruct MyCustomActor <: NextActor{Any} end\n\nRocket.on_next!(::MyCustomActor, data::Int) = println(\"Int: $data\")\nRocket.on_next!(::MyCustomActor, data::Float64) = println(\"Float64: $data\")\nRocket.on_next!(::MyCustomActor, data) = println(\"Something else: $data\")\n\nsource = from([ 1, 1.0, \"string\" ])\nsubscribe!(source, MyCustomActor());\n\n# Logs\n# Int: 1\n# Float64: 1.0\n# Something else: string\n","category":"page"},{"location":"actors/about/#Lambda-actor","page":"Actor","title":"Lambda actor","text":"","category":"section"},{"location":"actors/about/","page":"Actor","title":"Actor","text":"For debugging purposes it may be convenient to work with a LambdaActor. This provides an interface that defines callbacks for \"next\", \"error\" and \"complete\" events. But this generic actor does not allow to dispatch on the type of the event.","category":"page"},{"location":"actors/about/","page":"Actor","title":"Actor","text":"using Rocket\n\nsource = from([1, 2, 3])\n\nsubscribe!(source, lambda(\n on_next = (d) -> println(d),\n on_error = (e) -> error(e),\n on_complete = () -> println(\"Completed\")\n))\n\n# Logs\n# 1\n# 2\n# 3\n# Completed","category":"page"},{"location":"actors/about/#Function-actor","page":"Actor","title":"Function actor","text":"","category":"section"},{"location":"actors/about/","page":"Actor","title":"Actor","text":"Sometimes it is convenient to pass only on_next callback. Rocket.jl provides a FunctionActor which automatically converts any function object passed in the subscribe! function to a proper actor which listens only for data events, throws an exception on error event and ignores completion message.","category":"page"},{"location":"actors/about/","page":"Actor","title":"Actor","text":"using Rocket\n\nsource = from([1, 2, 3])\n\nsubscribe!(source, (d) -> println(d))\n\n# Logs\n# 1\n# 2\n# 3","category":"page"},{"location":"observables/types/single/#observable_single","page":"Single","title":"Single Observable","text":"","category":"section"},{"location":"observables/types/single/","page":"Single","title":"Single","text":"of","category":"page"},{"location":"observables/types/single/#Rocket.of","page":"Single","title":"Rocket.of","text":"of(x; scheduler::H = AsapScheduler()) where { H <: AbstractScheduler }\n\nCreation operator for the SingleObservable that emits a single value x and then completes.\n\nArguments\n\nx: value to be emmited before completion\n\nExamples\n\nusing Rocket\n\nsource = of(1)\nsubscribe!(source, logger())\n;\n\n# output\n\n[LogActor] Data: 1\n[LogActor] Completed\n\n\nSee also: SingleObservable, subscribe!, logger\n\n\n\n\n\n","category":"function"},{"location":"observables/types/single/","page":"Single","title":"Single","text":"SingleObservable","category":"page"},{"location":"observables/types/single/#Rocket.SingleObservable","page":"Single","title":"Rocket.SingleObservable","text":"SingleObservable{D, H}(value::D, scheduler::H)\n\nSingleObservable wraps single value of type D into a observable.\n\nConstructor arguments\n\nvalue: a single value to emit\nscheduler: scheduler-like object\n\nSee also: of, Subscribable\n\n\n\n\n\n","category":"type"},{"location":"observables/types/interval/#observable_interval","page":"Interval","title":"Interval Observable","text":"","category":"section"},{"location":"observables/types/interval/","page":"Interval","title":"Interval","text":"interval","category":"page"},{"location":"observables/types/interval/#Rocket.interval","page":"Interval","title":"Rocket.interval","text":"interval(period::Union{Int, Nothing} = nothing)\n\nCreation operator for the TimerObservable. interval returns an Observable that emits an infinite sequence of ascending integers, with a constant interval of time of your choosing between those emissions. The first emission is not sent immediately, but only after the first period has passed.\n\nArguments\n\ninterval: the interval size in milliseconds\n\nExamples\n\nusing Rocket\n\nsource = interval(50)\n\nsubscription = subscribe!(source, logger())\nsleep(0.215)\nunsubscribe!(subscription)\nsleep(0.215)\nsubscription = subscribe!(source, logger())\nsleep(0.185)\nunsubscribe!(subscription)\n\nclose(source)\n;\n\n# output\n\n[LogActor] Data: 0\n[LogActor] Data: 1\n[LogActor] Data: 2\n[LogActor] Data: 3\n[LogActor] Data: 8\n[LogActor] Data: 9\n[LogActor] Data: 10\n\nSee also: timer, TimerObservable, Subscribable\n\n\n\n\n\n","category":"function"},{"location":"operators/filtering/take_until/#operator_take_until","page":"take_until","title":"TakeUntil Operator","text":"","category":"section"},{"location":"operators/filtering/take_until/","page":"take_until","title":"take_until","text":"take_until","category":"page"},{"location":"operators/filtering/take_until/#Rocket.take_until","page":"take_until","title":"Rocket.take_until","text":"take_until(notifier::S)\n\nCreates a take operator, which returns an Observable that emits the values emitted by the source Observable until a notifier Observable emits a value or a completion event.\n\nArguments\n\nnotifier::S: The Observable whose first emitted value will cause the output Observable of take_until to stop emitting values from the source Observable.\n\nProducing\n\nStream of type <: Subscribable{L} where L refers to type of source stream\n\nExamples\n\nusing Rocket\n\nsource = interval(100) |> take_until(timer(1000))\n\nsubscribe!(source, logger())\n;\n\n# output\n\n[LogActor] Data: 0\n[LogActor] Data: 1\n[LogActor] Data: 2\n[LogActor] Data: 3\n[LogActor] Data: 4\n[LogActor] Data: 5\n[LogActor] Data: 6\n[LogActor] Data: 7\n[LogActor] Data: 8\n[LogActor] Completed\n\nusing Rocket \n\nsource = interval(100)\n\nsubscribe!(source |> take_until(source |> filter(i -> i == 3)), logger())\n;\n\n# output \n\n[LogActor] Data: 0\n[LogActor] Data: 1\n[LogActor] Data: 2\n[LogActor] Completed\n\nSee also: AbstractOperator, InferableOperator, ProxyObservable, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/filtering/take_until/#Description","page":"take_until","title":"Description","text":"","category":"section"},{"location":"operators/filtering/take_until/","page":"take_until","title":"take_until","text":"take_until subscribes and begins mirroring the source Observable. It also monitors a second Observable, notifier that you provide. If the notifier emits a value, the output Observable stops mirroring the source Observable and completes. If the notifier doesn't emit any value and completes then take_until also completes.","category":"page"},{"location":"operators/filtering/take_until/#See-also","page":"take_until","title":"See also","text":"","category":"section"},{"location":"operators/filtering/take_until/","page":"take_until","title":"take_until","text":"Operators","category":"page"},{"location":"operators/multicasting/share/#operator_share","page":"share","title":"Share Operators","text":"","category":"section"},{"location":"operators/multicasting/share/","page":"share","title":"share","text":"share\nshare_replay\nshare_recent","category":"page"},{"location":"operators/multicasting/share/#Rocket.share","page":"share","title":"Rocket.share","text":"share(; scheduler::H = AsapScheduler()) where { H <: AbstractScheduler }\n\nshare() is a shortcut for publish() + ref_count()\n\nSee also: AbstractOperator, multicast, publish, ref_count\n\n\n\n\n\n","category":"function"},{"location":"operators/multicasting/share/#Rocket.share_replay","page":"share","title":"Rocket.share_replay","text":"share_replay(size::Int; scheduler::H = AsapScheduler()) where { H <: AbstractScheduler }\n\nshare_replay(size) is a shortcut for publish_replay(size) + ref_count()\n\nSee also: AbstractOperator, multicast, publish, publish_replay, ref_count\n\n\n\n\n\n","category":"function"},{"location":"operators/multicasting/share/#Rocket.share_recent","page":"share","title":"Rocket.share_recent","text":"share_recent(; scheduler::H = AsapScheduler()) where { H <: AbstractScheduler }\n\nshare_recent() is a shortcut for publish_recent() + ref_count()\n\nSee also: AbstractOperator, multicast, publish, publish_recent, ref_count\n\n\n\n\n\n","category":"function"},{"location":"operators/multicasting/share/#See-also","page":"share","title":"See also","text":"","category":"section"},{"location":"operators/multicasting/share/","page":"share","title":"share","text":"Operators","category":"page"},{"location":"operators/transformation/concat_map/#operator_concat_map","page":"concat_map","title":"ConcatMap Operator","text":"","category":"section"},{"location":"operators/transformation/concat_map/","page":"concat_map","title":"concat_map","text":"concat_map","category":"page"},{"location":"operators/transformation/concat_map/#Rocket.concat_map","page":"concat_map","title":"Rocket.concat_map","text":"concat_map(::Type{R}, mappingFn::F = identity) where { R, F <: Function }\n\nCreates a concat_map operator, which returns an Observable that emits the result of applying the projection function to each item emitted by the source Observable and taking values from each projected inner Observable sequentially. Essentialy it projects each source value to an Observable which is merged in the output Observable, in a serialized fashion waiting for each one to complete before merging the next.\n\nArguments\n\n::Type{R}: the type of data of output Observables after projection with mappingFn\nmappingFn::F: projection function with (data) -> Observable{R} signature\n\nProducing\n\nStream of type <: Subscribable{R}\n\nExamples\n\nusing Rocket\n\nsource = from([ 0, 0 ]) |> concat_map(Int, d -> from([ 1, 2, 3 ], scheduler = AsyncScheduler(0)))\nsubscribe!(source, logger())\n;\n\n# output\n\n[LogActor] Data: 1\n[LogActor] Data: 2\n[LogActor] Data: 3\n[LogActor] Data: 1\n[LogActor] Data: 2\n[LogActor] Data: 3\n[LogActor] Completed\n\nSee also: AbstractOperator, RightTypedOperator, ProxyObservable, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/transformation/concat_map/#Description","page":"concat_map","title":"Description","text":"","category":"section"},{"location":"operators/transformation/concat_map/","page":"concat_map","title":"concat_map","text":"Returns an Observable that emits items based on applying a function that you supply to each item emitted by the source Observable, where that function returns an (so-called \"inner\") Observable. Each new inner Observable is concatenated with the previous inner Observable.","category":"page"},{"location":"operators/transformation/concat_map/","page":"concat_map","title":"concat_map","text":"warning: Warning\nIf source values arrive endlessly and faster than their corresponding inner Observables can complete, it will result in memory issues as inner Observables amass in an unbounded buffer waiting for their turn to be subscribed to.","category":"page"},{"location":"operators/transformation/concat_map/","page":"concat_map","title":"concat_map","text":"note: Note\nconcat_map is equivalent to merge_map with concurrency parameter set to 1.","category":"page"},{"location":"operators/transformation/concat_map/#See-also","page":"concat_map","title":"See also","text":"","category":"section"},{"location":"operators/transformation/concat_map/","page":"concat_map","title":"concat_map","text":"Operators, merge_map","category":"page"},{"location":"subjects/types/pending/#subject_pending","page":"Pending","title":"PendingSubject","text":"","category":"section"},{"location":"subjects/types/pending/","page":"Pending","title":"Pending","text":"PendingSubject\nPendingSubjectFactory","category":"page"},{"location":"subjects/types/pending/#Rocket.PendingSubject","page":"Pending","title":"Rocket.PendingSubject","text":"PendingSubject(::Type{D}) where D\nPendingSubject(::Type{D}, factory::F) where { D, F <: AbstractFactory }\nPendingSubject(::Type{D}, subject::S) where { D, S }\n\nA variant of Subject that emits its last value on completion. Reemits last value on further subscriptions and then completes.\n\nSee also: PendingSubjectFactory, Subject, SubjectFactory\n\n\n\n\n\n","category":"function"},{"location":"subjects/types/pending/#Rocket.PendingSubjectFactory","page":"Pending","title":"Rocket.PendingSubjectFactory","text":"PendingSubjectFactory(factory::F) where { F <: AbstractSubjectFactory }\nPendingSubjectFactory(; scheduler::H = AsapScheduler()) where { H <: AbstractScheduler }\n\nA variant of SubjectFactory that creates an instance of PendingSubject.\n\nSee also: SubjectFactory, AbstractSubjectFactory, PendingSubject, Subject\n\n\n\n\n\n","category":"function"},{"location":"subjects/types/pending/#Description","page":"Pending","title":"Description","text":"","category":"section"},{"location":"subjects/types/pending/","page":"Pending","title":"Pending","text":"A variant of Subject that only emits a value when it completes. It will emit its latest value to all its observers on completion. It will reemit its latest value to all new observers on further subscription and then complete. It is not possible to overwrite last value after completion.","category":"page"},{"location":"subjects/types/pending/#Examples","page":"Pending","title":"Examples","text":"","category":"section"},{"location":"subjects/types/pending/","page":"Pending","title":"Pending","text":"using Rocket\n\nsubject = PendingSubject(Int)\n\nsubscription1 = subscribe!(subject, logger(\"1\"))\n\nnext!(subject, 1) # Nothing is logged\nnext!(subject, 2) # Nothing is logged\n\nsubscription2 = subscribe!(subject, logger(\"2\"))\n\nnext!(subject, 3) # Nothing is logged\n\ncomplete!(subject)\n\nsubscription3 = subscribe!(subject, logger(\"3\"))\n\n[1] Data: 3\n[2] Data: 3\n[1] Completed\n[2] Completed\n[3] Data: 3\n[3] Completed","category":"page"},{"location":"operators/filtering/filter_type/#operator_filter_type","page":"filter_type","title":"FilterType Operator","text":"","category":"section"},{"location":"operators/filtering/filter_type/","page":"filter_type","title":"filter_type","text":"filter_type","category":"page"},{"location":"operators/filtering/filter_type/#Rocket.filter_type","page":"filter_type","title":"Rocket.filter_type","text":"filter_type(type::Type{ T }) where { T }\n\nCreates a filter_type operator, which filters items of the source Observable by emitting only those that match a specified T type with a <: operator. This operator is a more efficient version of filter(v -> v <: T) |> map(T, v -> v) operators chain.\n\nProducing\n\nStream of type <: Subscribable{ T } where T refers to type argument\n\nExamples\n\nusing Rocket\n\nsource = from(Real[ 1, 2.0, 3, 4.0, 5, 6.0 ])\nsubscribe!(source |> filter_type(Int), logger())\n;\n\n# output\n\n[LogActor] Data: 1\n[LogActor] Data: 3\n[LogActor] Data: 5\n[LogActor] Completed\n\nSee also: AbstractOperator, InferableOperator, ProxyObservable, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/filtering/filter_type/#See-also","page":"filter_type","title":"See also","text":"","category":"section"},{"location":"operators/filtering/filter_type/","page":"filter_type","title":"filter_type","text":"Operators","category":"page"},{"location":"operators/filtering/filter/#operator_filter","page":"filter","title":"Filter Operator","text":"","category":"section"},{"location":"operators/filtering/filter/","page":"filter","title":"filter","text":"filter","category":"page"},{"location":"operators/filtering/filter/#Base.filter","page":"filter","title":"Base.filter","text":"filter(filterFn::F) where { F <: Function }\n\nCreates a filter operator, which filters items of the source Observable by emitting only those that satisfy a specified filterFn predicate.\n\nProducing\n\nStream of type <: Subscribable{L} where L refers to type of source stream\n\nArguments\n\nfilterFn::F: predicate function with (data::T) -> Bool signature\n\nExamples\n\nusing Rocket\n\nsource = from([ 1, 2, 3, 4, 5, 6 ])\nsubscribe!(source |> filter((d) -> d % 2 == 0), logger())\n;\n\n# output\n\n[LogActor] Data: 2\n[LogActor] Data: 4\n[LogActor] Data: 6\n[LogActor] Completed\n\nSee also: AbstractOperator, InferableOperator, ProxyObservable, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/filtering/filter/#Description","page":"filter","title":"Description","text":"","category":"section"},{"location":"operators/filtering/filter/","page":"filter","title":"filter","text":"Like filter(f, array), this operator takes values from the source Observable, passes them through a predicate function and only emits those values that yielded true.","category":"page"},{"location":"operators/filtering/filter/#See-also","page":"filter","title":"See also","text":"","category":"section"},{"location":"operators/filtering/filter/","page":"filter","title":"filter","text":"Operators","category":"page"},{"location":"operators/join/with_latest/#operator_with_latest","page":"with_latest","title":"WithLatest Operator","text":"","category":"section"},{"location":"operators/join/with_latest/","page":"with_latest","title":"with_latest","text":"with_latest","category":"page"},{"location":"operators/join/with_latest/#Rocket.with_latest","page":"with_latest","title":"Rocket.with_latest","text":"with_latest(sources...)\n\nCreates a with_latest operator, which combines the source Observable with other Observables to create an Observable whose values are calculated from the latest values of each, only when the source emits.\n\nExamples\n\nusing Rocket\n\nsource = of(1)\nsubscribe!(source |> with_latest(from(1:5)), logger())\n;\n\n# output\n\n[LogActor] Data: (1, 5)\n[LogActor] Completed\n\nSee also: AbstractOperator, InferableOperator\n\n\n\n\n\n","category":"function"},{"location":"operators/join/with_latest/#See-also","page":"with_latest","title":"See also","text":"","category":"section"},{"location":"operators/join/with_latest/","page":"with_latest","title":"with_latest","text":"Operators","category":"page"},{"location":"operators/join/about/#Join-category","page":"Join category","title":"Join category","text":"","category":"section"},{"location":"operators/join/about/","page":"Join category","title":"Join category","text":"There are operators for different purposes, and they may be categorized as: creation, transformation, filtering, joining, multicasting, error handling, utility, etc. In the following list you will find all the operators organized in join category.","category":"page"},{"location":"operators/join/about/","page":"Join category","title":"Join category","text":"with_latest","category":"page"},{"location":"operators/join/about/#See-also","page":"Join category","title":"See also","text":"","category":"section"},{"location":"operators/join/about/","page":"Join category","title":"Join category","text":"Operators","category":"page"},{"location":"subjects/types/behavior/#subject_behavior","page":"Behavior","title":"BehaviorSubject","text":"","category":"section"},{"location":"subjects/types/behavior/","page":"Behavior","title":"Behavior","text":"BehaviorSubject\nBehaviorSubjectFactory","category":"page"},{"location":"subjects/types/behavior/#Rocket.BehaviorSubject","page":"Behavior","title":"Rocket.BehaviorSubject","text":"BehaviorSubject(value::D) where D\nBehaviorSubject(::Type{D}, value) where D\nBehaviorSubject(::Type{D}, value, factory::F) where { D, F <: AbstractSubjectFactory }\nBehaviorSubject(::Type{D}, value, subject::S) where { D, S }\n\nA variant of Subject that requires an initial value and emits its current value whenever it is subscribed to.\n\nSee also: BehaviorSubjectFactory, Subject, SubjectFactory\n\n\n\n\n\n","category":"function"},{"location":"subjects/types/behavior/#Rocket.BehaviorSubjectFactory","page":"Behavior","title":"Rocket.BehaviorSubjectFactory","text":"BehaviorSubjectFactory(default, factory::F) where { F <: AbstractSubjectFactory }\nBehaviorSubjectFactory(default; scheduler::H = AsapScheduler()) where { H <: AbstractScheduler }\n\nA variant of SubjectFactory that creates an instance of ReplaySubject.\n\nSee also: SubjectFactory, AbstractSubjectFactory, BehaviorSubject, Subject\n\n\n\n\n\n","category":"function"},{"location":"subjects/types/behavior/#Description","page":"Behavior","title":"Description","text":"","category":"section"},{"location":"subjects/types/behavior/","page":"Behavior","title":"Behavior","text":"One of the variants of Subjects is the BehaviorSubject, which has a notion of \"the current value\". It stores the latest value emitted to its consumers, and whenever a new Observer subscribes, it will immediately receive the \"current value\" from the BehaviorSubject.","category":"page"},{"location":"subjects/types/behavior/","page":"Behavior","title":"Behavior","text":"note: Note\nBehaviorSubjects are useful for representing \"values over time\". For instance, an event stream of birthdays is a Subject, but the stream of a person's age would be a BehaviorSubject.","category":"page"},{"location":"subjects/types/behavior/#Examples","page":"Behavior","title":"Examples","text":"","category":"section"},{"location":"subjects/types/behavior/","page":"Behavior","title":"Behavior","text":"In the following example, the BehaviorSubject is initialized with the value 0 which the first Observer receives when it subscribes. The second Observer receives the value 2 even though it subscribed after the value 2 was sent.","category":"page"},{"location":"subjects/types/behavior/","page":"Behavior","title":"Behavior","text":"using Rocket\n\nsubject = BehaviorSubject(Int, 0)\n\nsubscription1 = subscribe!(subject, logger(\"1\"))\n\nnext!(subject, 1)\nnext!(subject, 2)\n\nsubscription2 = subscribe!(subject, logger(\"2\"))\n\nnext!(subject, 3)\n\nunsubscribe!(subscription1)\nunsubscribe!(subscription2)\n\n// Logs\n// [1] Data: 0\n// [1] Data: 1\n// [1] Data: 2\n// [2] Data: 2\n// [1] Data: 3\n// [2] Data: 3","category":"page"},{"location":"api/operators/#operators_api","page":"Operators","title":"Operators API","text":"","category":"section"},{"location":"api/operators/#How-to-create-a-custom-operator","page":"Operators","title":"How to create a custom operator","text":"","category":"section"},{"location":"api/operators/","page":"Operators","title":"Operators","text":"If you need to write an operator that cannot be made from a combination of existing operators, then you can write a custom operator from scratch.","category":"page"},{"location":"api/operators/","page":"Operators","title":"Operators","text":"Each operator (e.g. MyFancyOperator) needs to either be (1) a subtype of one of abstract OperatorTrait trait types, or (2) define a","category":"page"},{"location":"api/operators/","page":"Operators","title":"Operators","text":"Rocket.as_operator(::Type{<:MyFancyOperator}) = TypedOperatorTrait{T, R}()\n# or\nRocket.as_operator(::Type{<:MyFancyOperator}) = InferableOperatorTrait()","category":"page"},{"location":"api/operators/","page":"Operators","title":"Operators","text":"trait behavior.","category":"page"},{"location":"api/operators/","page":"Operators","title":"Operators","text":"In addition, an operator must implement a specific method for on_call! function with custom logic which has to return another Observable as a result of applying MyFancyOperator to a source.","category":"page"},{"location":"api/operators/","page":"Operators","title":"Operators","text":"Rocket.on_call!(::Type{L}, ::Type{R}, operator::MyFancyOperator, source) where L = # some custom logic here\n\n# or\n# for inferable trait types you have to specify 'right' type with Rocket.operator_right which should specify a type of data of produced Observable\n\nRocket.on_call(::Type{L}, ::Type{R}, operator::MyFancyOperator, source) where L = # some custom logic here\nRocket.operator_right(::MyFancyOperator, ::Type{L}) where L = R # where R should be an actual type, Int or even L itself e.g.\n","category":"page"},{"location":"api/operators/","page":"Operators","title":"Operators","text":"note: Note\nIt is not allowed to modify the source Observable in any way; you have to return a new observable.","category":"page"},{"location":"api/operators/","page":"Operators","title":"Operators","text":"See more examples on custom operators in Traits API section","category":"page"},{"location":"api/operators/","page":"Operators","title":"Operators","text":"note: Note\nIt might be useful to return a ProxyObservable from an on_call! function. ProxyObservable is a special Observable which proxying actors with the source and/or source with actors.","category":"page"},{"location":"api/operators/#operators_api_traits","page":"Operators","title":"Traits","text":"","category":"section"},{"location":"api/operators/","page":"Operators","title":"Operators","text":"OperatorTrait\nas_operator\nTypedOperatorTrait\nLeftTypedOperatorTrait\nRightTypedOperatorTrait\nInferableOperatorTrait\nInvalidOperatorTrait","category":"page"},{"location":"api/operators/#Rocket.OperatorTrait","page":"Operators","title":"Rocket.OperatorTrait","text":"Abstract type for all possible operator traits\n\nSee also: TypedOperatorTrait, LeftTypedOperatorTrait, RightTypedOperatorTrait, InferableOperatorTrait, InvalidOperatorTrait,\n\n\n\n\n\n","category":"type"},{"location":"api/operators/#Rocket.as_operator","page":"Operators","title":"Rocket.as_operator","text":"as_operator(any)\n\nThis function checks operator trait behavior. May be used explicitly to specify operator trait behavior for any object.\n\nSee also: OperatorTrait, AbstractOperator\n\n\n\n\n\n","category":"function"},{"location":"api/operators/#Rocket.TypedOperatorTrait","page":"Operators","title":"Rocket.TypedOperatorTrait","text":"Typed operator trait specifies operator to be statically typed with input and output data types. Typed operator with input type L and output type R can only operate on input Observable with data type L and will always produce an Observable with data type R.\n\nExamples\n\nusing Rocket\n\nstruct MyTypedOperator <: TypedOperator{Int, Int} end\n\nfunction Rocket.on_call!(::Type{Int}, ::Type{Int}, op::MyTypedOperator, source)\n return proxy(Int, source, MyTypedOperatorProxy())\nend\n\nstruct MyTypedOperatorProxy <: ActorProxy end\n\nRocket.actor_proxy!(::Type{Int}, ::MyTypedOperatorProxy, actor::A) where A = MyTypedOperatorProxiedActor{A}(actor)\n\nstruct MyTypedOperatorProxiedActor{A} <: Actor{Int}\n actor :: A\nend\n\nfunction Rocket.on_next!(actor::MyTypedOperatorProxiedActor, data::Int)\n # Do something with a data and/or redirect it to actor.actor\n next!(actor.actor, data + 1)\nend\n\nRocket.on_error!(actor::MyTypedOperatorProxiedActor, err) = error!(actor.actor, err)\nRocket.on_complete!(actor::MyTypedOperatorProxiedActor) = complete!(actor.actor)\n\nsource = from([ 0, 1, 2 ])\nsubscribe!(source |> MyTypedOperator(), logger())\n;\n\n# output\n\n[LogActor] Data: 1\n[LogActor] Data: 2\n[LogActor] Data: 3\n[LogActor] Completed\n\nSee also: OperatorTrait, TypedOperator, OperatorTrait, ProxyObservable, ActorProxy, logger\n\n\n\n\n\n","category":"type"},{"location":"api/operators/#Rocket.LeftTypedOperatorTrait","page":"Operators","title":"Rocket.LeftTypedOperatorTrait","text":"Left typed operator trait specifies operator to be statically typed with input data type. To infer output data type this object should specify a special function operator_right(operator, ::Type{L}) where L which will be used to infer output data type. Left typed operator with input type L can only operate on input Observable with data type L and will always produce an Observable with data type inferred from operator_right(operator, ::Type{L}).\n\nExamples\n\nusing Rocket\n\nstruct CountIntegersOperator <: LeftTypedOperator{Int} end\n\nfunction Rocket.on_call!(::Type{Int}, ::Type{Tuple{Int, Int}}, op::CountIntegersOperator, source)\n return proxy(Tuple{Int, Int}, source, CountIntegersOperatorProxy())\nend\n\nRocket.operator_right(::CountIntegersOperator, ::Type{Int}) = Tuple{Int, Int}\n\nstruct CountIntegersOperatorProxy <: ActorProxy end\n\nRocket.actor_proxy!(::Type{Tuple{Int, Int}}, ::CountIntegersOperatorProxy, actor::A) where A = CountIntegersProxiedActor{A}(0, actor)\n\nmutable struct CountIntegersProxiedActor{A} <: Actor{Int}\n current :: Int\n actor :: A\nend\n\nfunction Rocket.on_next!(actor::CountIntegersProxiedActor, data::Int)\n current = actor.current\n actor.current += 1\n next!(actor.actor, (current, data)) # e.g.\nend\n\nRocket.on_error!(actor::CountIntegersProxiedActor, err) = error!(actor.actor, err)\nRocket.on_complete!(actor::CountIntegersProxiedActor) = complete!(actor.actor)\n\nsource = from([ 0, 0, 0 ])\nsubscribe!(source |> CountIntegersOperator(), logger())\n;\n\n# output\n\n[LogActor] Data: (0, 0)\n[LogActor] Data: (1, 0)\n[LogActor] Data: (2, 0)\n[LogActor] Completed\n\nSee also: OperatorTrait, LeftTypedOperator, operator_right, OperatorTrait, ProxyObservable, ActorProxy, enumerate, logger\n\n\n\n\n\n","category":"type"},{"location":"api/operators/#Rocket.RightTypedOperatorTrait","page":"Operators","title":"Rocket.RightTypedOperatorTrait","text":"Right typed operator trait specifies operator to be statically typed with output data type. It can operate on input Observable with any data type L but will always produce an Observable with data type R.\n\nExamples\n\nusing Rocket\n\nstruct ConvertToFloatOperator <: RightTypedOperator{Float64} end\n\nfunction Rocket.on_call!(::Type{L}, ::Type{Float64}, op::ConvertToFloatOperator, source) where L\n return proxy(Float64, source, ConvertToFloatProxy{L}())\nend\n\nstruct ConvertToFloatProxy{L} <: ActorProxy end\n\nfunction Rocket.actor_proxy!(::Type{Float64}, proxy::ConvertToFloatProxy{L}, actor::A) where { L, A }\n return ConvertToFloatProxyActor{L, A}(actor)\nend\n\nstruct ConvertToFloatProxyActor{L, A} <: Actor{L}\n actor :: A\nend\n\nfunction Rocket.on_next!(actor::ConvertToFloatProxyActor{L}, data::L) where L\n next!(actor.actor, convert(Float64, data)) # e.g.\nend\n\nRocket.on_error!(actor::ConvertToFloatProxyActor, err) = error!(actor.actor, err)\nRocket.on_complete!(actor::ConvertToFloatProxyActor) = complete!(actor.actor)\n\nsource = from([ 1, 2, 3 ])\nsubscribe!(source |> ConvertToFloatOperator(), logger())\n;\n\n# output\n\n[LogActor] Data: 1.0\n[LogActor] Data: 2.0\n[LogActor] Data: 3.0\n[LogActor] Completed\n\nSee also: OperatorTrait, RightTypedOperator, OperatorTrait, ProxyObservable, ActorProxy, logger\n\n\n\n\n\n","category":"type"},{"location":"api/operators/#Rocket.InferableOperatorTrait","page":"Operators","title":"Rocket.InferableOperatorTrait","text":"Inferable operator trait specifies operator to be statically typed neither with input data type nor with output data type. To infer output data type this object should specify a special function operator_right(operator, ::Type{L}) where L where L is input data type which will be used to infer output data type.\n\nusing Rocket\n\nstruct IdentityOperator <: InferableOperator end\n\nfunction Rocket.on_call!(::Type{L}, ::Type{L}, op::IdentityOperator, source) where L\n return proxy(L, source, IdentityProxy())\nend\n\nstruct IdentityProxy <: ActorProxy end\n\nRocket.operator_right(::IdentityOperator, ::Type{L}) where L = L\n\nRocket.actor_proxy!(::Type{L}, proxy::IdentityProxy, actor::A) where L where A = IdentityProxyActor{L, A}(actor)\n\nstruct IdentityProxyActor{L, A} <: Actor{L}\n actor :: A\nend\n\nfunction Rocket.on_next!(actor::IdentityProxyActor{L}, data::L) where L\n next!(actor.actor, data) # e.g.\nend\n\nRocket.on_error!(actor::IdentityProxyActor, err) = error!(actor.actor, err)\nRocket.on_complete!(actor::IdentityProxyActor) = complete!(actor.actor)\n\nsource = from([ 1, 2, 3 ])\nsubscribe!(source |> IdentityOperator(), logger())\n\nsource = from([ 1.0, 2.0, 3.0 ])\nsubscribe!(source |> IdentityOperator(), logger())\n;\n\n# output\n\n[LogActor] Data: 1\n[LogActor] Data: 2\n[LogActor] Data: 3\n[LogActor] Completed\n[LogActor] Data: 1.0\n[LogActor] Data: 2.0\n[LogActor] Data: 3.0\n[LogActor] Completed\n\n\nSee also: OperatorTrait, InferableOperator, operator_right, OperatorTrait, ProxyObservable, ActorProxy, logger\n\n\n\n\n\n","category":"type"},{"location":"api/operators/#Rocket.InvalidOperatorTrait","page":"Operators","title":"Rocket.InvalidOperatorTrait","text":"InvalidOperatorTrait trait specifies special 'invalid' behavior and types with such a trait specification cannot be used as an operator for an observable stream. By default any type has InvalidOperatorTrait trait specification\n\nSee also: OperatorTrait\n\n\n\n\n\n","category":"type"},{"location":"api/operators/#Types","page":"Operators","title":"Types","text":"","category":"section"},{"location":"api/operators/","page":"Operators","title":"Operators","text":"AbstractOperator\nTypedOperator\nLeftTypedOperator\nRightTypedOperator\nInferableOperator\non_call!\noperator_right\nOperatorsComposition","category":"page"},{"location":"api/operators/#Rocket.AbstractOperator","page":"Operators","title":"Rocket.AbstractOperator","text":"Supertype for all operators\n\nSee also: TypedOperator, LeftTypedOperator, RightTypedOperator, InferableOperator\n\n\n\n\n\n","category":"type"},{"location":"api/operators/#Rocket.TypedOperator","page":"Operators","title":"Rocket.TypedOperator","text":"Can be used as a supertype for any operator. Automatically specifies TypedOperatorTrait behavior.\n\nExamples\n\nusing Rocket\n\nstruct MyOperator <: TypedOperator{Float64,String} end\n\nas_operator(MyOperator) === TypedOperatorTrait{Float64,String}()\n\n# output\ntrue\n\nSee also: AbstractOperator, TypedOperatorTrait\n\n\n\n\n\n","category":"type"},{"location":"api/operators/#Rocket.LeftTypedOperator","page":"Operators","title":"Rocket.LeftTypedOperator","text":"Can be used as a supertype for any operator. Automatically specifies LeftTypedOperatorTrait behavior.\n\nExamples\n\nusing Rocket\n\nstruct MyOperator <: LeftTypedOperator{Float64} end\n\nas_operator(MyOperator) === LeftTypedOperatorTrait{Float64}()\n\n# output\ntrue\n\nSee also: AbstractOperator, LeftTypedOperatorTrait, operator_right\n\n\n\n\n\n","category":"type"},{"location":"api/operators/#Rocket.RightTypedOperator","page":"Operators","title":"Rocket.RightTypedOperator","text":"Can be used as a supertype for any operator. Automatically specifies RightTypedOperatorTrait behavior.\n\nExamples\n\nusing Rocket\n\nstruct MyOperator <: RightTypedOperator{Float64} end\n\nas_operator(MyOperator) === RightTypedOperatorTrait{Float64}()\n\n# output\ntrue\n\nSee also: AbstractOperator, RightTypedOperatorTrait\n\n\n\n\n\n","category":"type"},{"location":"api/operators/#Rocket.InferableOperator","page":"Operators","title":"Rocket.InferableOperator","text":"Can be used as a supertype for any operator. Automatically specifies InferableOperatorTrait behavior.\n\nExamples\n\nusing Rocket\n\nstruct MyOperator <: InferableOperator end\n\nas_operator(MyOperator) === InferableOperatorTrait()\n\n# output\ntrue\n\nSee also: AbstractOperator, InferableOperatorTrait, operator_right\n\n\n\n\n\n","category":"type"},{"location":"api/operators/#Rocket.on_call!","page":"Operators","title":"Rocket.on_call!","text":"on_call!(::Type, ::Type, operator, source)\n\nEach operator must implement its own method for on_call! function. This function is used to invoke operator on some Observable and to produce another Observable with new logic (operator specific).\n\nSee also: AbstractOperator\n\n\n\n\n\n","category":"function"},{"location":"api/operators/#Rocket.operator_right","page":"Operators","title":"Rocket.operator_right","text":"operator_right(operator, L)\n\nBoth LeftTypedOperator and InferableOperator must implement its own method for operator_right function. This function is used to infer type of data of output Observable given the type of data of input Observable.\n\nSee also: AbstractOperator, LeftTypedOperator, InferableOperator\n\n\n\n\n\n","category":"function"},{"location":"api/operators/#Rocket.OperatorsComposition","page":"Operators","title":"Rocket.OperatorsComposition","text":"OperatorsComposition(operators)\n\nOperatorsComposition is an object which helps to create a composition of multiple operators. To create a composition of two or more operators overloaded + or |> can be used.\n\nusing Rocket\n\ncomposition = map(Int, (d) -> d ^ 2) + filter(d -> d % 2 == 0)\n\nsource = from(1:5) |> composition\n\nsubscribe!(source, logger())\n;\n\n# output\n\n[LogActor] Data: 4\n[LogActor] Data: 16\n[LogActor] Completed\n\nusing Rocket\n\ncomposition = map(Int, (d) -> d ^ 2) |> filter(d -> d % 2 == 0)\n\nsource = from(1:5) |> composition\n\nsubscribe!(source, logger())\n;\n\n# output\n\n[LogActor] Data: 4\n[LogActor] Data: 16\n[LogActor] Completed\n\n\n\n\n\n","category":"type"},{"location":"api/operators/#Errors","page":"Operators","title":"Errors","text":"","category":"section"},{"location":"api/operators/","page":"Operators","title":"Operators","text":"InvalidOperatorTraitUsageError\nInconsistentSourceOperatorDataTypesError\nMissingOnCallImplementationError\nMissingOperatorRightImplementationError","category":"page"},{"location":"api/operators/#Rocket.InvalidOperatorTraitUsageError","page":"Operators","title":"Rocket.InvalidOperatorTraitUsageError","text":"This error will be thrown if |> pipe operator is called with invalid operator object\n\nSee also: on_call!\n\n\n\n\n\n","category":"type"},{"location":"api/operators/#Rocket.InconsistentSourceOperatorDataTypesError","page":"Operators","title":"Rocket.InconsistentSourceOperatorDataTypesError","text":"This error will be thrown if |> pipe operator is called with inconsistent data type\n\nSee also: on_call!\n\n\n\n\n\n","category":"type"},{"location":"api/operators/#Rocket.MissingOnCallImplementationError","page":"Operators","title":"Rocket.MissingOnCallImplementationError","text":"This error will be thrown if Julia cannot find specific method of on_call! function for a given operator.\n\nSee also: on_call!\n\n\n\n\n\n","category":"type"},{"location":"api/operators/#Rocket.MissingOperatorRightImplementationError","page":"Operators","title":"Rocket.MissingOperatorRightImplementationError","text":"This error will be thrown if Julia cannot find specific method of operator_right function for a given operator.\n\nSee also: operator_right\n\n\n\n\n\n","category":"type"},{"location":"observables/types/faulted/#observable_faulted","page":"Faulted","title":"Faulted Observable","text":"","category":"section"},{"location":"observables/types/faulted/","page":"Faulted","title":"Faulted","text":"faulted","category":"page"},{"location":"observables/types/faulted/#Rocket.faulted","page":"Faulted","title":"Rocket.faulted","text":"faulted(err; scheduler::H = AsapScheduler()) where { H <: AbstractScheduler }\nfaulted(::Type{T}, err; scheduler::H = AsapScheduler()) where { T, H <: AbstractScheduler }\n\nCreation operator for the FaultedObservable that emits no items to the Actor and immediately sends an error notification.\n\nArguments\n\nerr: the particular Error to pass to the error notification.\nT: type of output data source, optional, Any by default\nscheduler: optional, scheduler-like object\n\nExamples\n\nusing Rocket\n\nsource = faulted(\"Error!\")\nsubscribe!(source, logger())\n;\n\n# output\n\n[LogActor] Error: Error!\n\n\nSee also: FaultedObservable, subscribe!\n\n\n\n\n\n","category":"function"},{"location":"observables/types/faulted/","page":"Faulted","title":"Faulted","text":"FaultedObservable","category":"page"},{"location":"observables/types/faulted/#Rocket.FaultedObservable","page":"Faulted","title":"Rocket.FaultedObservable","text":"FaultedObservable{D, H}(err, scheduler::H)\n\nObservable that emits no items to the Actor and just sends an error notification on subscription.\n\nConstructor arguments\n\nerr: error to emit on subscription\nscheduler: scheduler-like object\n\nSee also: faulted\n\n\n\n\n\n","category":"type"},{"location":"operators/multicasting/multicast/#operator_multicast","page":"multicast","title":"Multicast Operator","text":"","category":"section"},{"location":"operators/multicasting/multicast/","page":"multicast","title":"multicast","text":"multicast","category":"page"},{"location":"operators/multicasting/multicast/#Rocket.multicast","page":"multicast","title":"Rocket.multicast","text":"multicast(subject::S) where S\nmulticast(factory::F) where { F <: AbstractSubjectFactory }\n\nThe multicast()operator takes a Subject and uses it to share the source execution. It returns what’s known as aConnectableObservable`, which has a connect() method. It has one simple job - subscribes to the source with the provided subject.\n\nExample\n\nusing Rocket\n\nsubject = Subject(Int)\nsource = from(1:5) |> multicast(subject)\n\nactor1 = logger(\"1\")\nactor2 = logger(\"2\")\n\nsubscription1 = subscribe!(source, actor1)\nsubscription2 = subscribe!(source, actor2)\n\nconnect(source)\n\nunsubscribe!(subscription1)\nunsubscribe!(subscription2)\n;\n\n# output\n\n[1] Data: 1\n[2] Data: 1\n[1] Data: 2\n[2] Data: 2\n[1] Data: 3\n[2] Data: 3\n[1] Data: 4\n[2] Data: 4\n[1] Data: 5\n[2] Data: 5\n[1] Completed\n[2] Completed\n\nSee also: ConnectableObservable, Subject, share, publish\n\n\n\n\n\n","category":"function"},{"location":"operators/multicasting/multicast/#See-also","page":"multicast","title":"See also","text":"","category":"section"},{"location":"operators/multicasting/multicast/","page":"multicast","title":"multicast","text":"Operators","category":"page"},{"location":"operators/transformation/map/#operator_map","page":"map","title":"Map Operator","text":"","category":"section"},{"location":"operators/transformation/map/","page":"map","title":"map","text":"map","category":"page"},{"location":"operators/transformation/map/#Base.map","page":"map","title":"Base.map","text":"map(::Type{R}, mappingFn::F) where { F <: Function }\n\nCreates a map operator, which applies a given mappingFn to each value emmited by the source Observable, and emits the resulting values as an Observable. You have to specify output R type after mappingFn projection.\n\nArguments\n\n::Type{R}: the type of data of transformed value, may be or may not be the same as source type\nmappingFn::Function: transformation function with (data::L) -> R signature, where L is type of data in input source\n\nProducing\n\nStream of type <: Subscribable{R}\n\nExamples\n\nusing Rocket\n\nsource = from([ 1, 2, 3 ])\nsubscribe!(source |> map(Int, (d) -> d ^ 2), logger())\n;\n\n# output\n\n[LogActor] Data: 1\n[LogActor] Data: 4\n[LogActor] Data: 9\n[LogActor] Completed\n\nSee also: AbstractOperator, RightTypedOperator, ProxyObservable, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/transformation/map/#Description","page":"map","title":"Description","text":"","category":"section"},{"location":"operators/transformation/map/","page":"map","title":"map","text":"The map operator, similar to map(f, array), applies a function to each value from the source. It's important to note that the function f is expected to be pure and without any side effects. The map operator is designed to create a copy of the original observable for each new subscriber. It independently executes the f function for each subscriber and doesn't share the resulting value. This might be inconvenient when f involves complex calculations or side effects.","category":"page"},{"location":"operators/transformation/map/","page":"map","title":"map","text":"using Rocket\n\nfunction f(x)\n println(\"Function `f` called\") # Assume heavy calculations or side-effects\n return x + 1\nend\n\nsubject = Subject(Int)\n\nmapped = subject |> map(Int, f)\n\nsubscription1 = subscribe!(mapped, logger())\nsubscription2 = subscribe!(mapped, logger())\n\nnext!(subject, 1)\n\nunsubscribe!(subscription1)\nunsubscribe!(subscription2)\nnothing #hide","category":"page"},{"location":"operators/transformation/map/","page":"map","title":"map","text":"In the example, you'll observe that \"Function f called\" is displayed twice. This happens because each subscriber receives their individual, distinct version of the modified data. To alter this behavior, one can utilize the share() operator. This operator creates only a single copy of the modified observable and shares the computed results.","category":"page"},{"location":"operators/transformation/map/","page":"map","title":"map","text":"mapped_and_shared = mapped |> share()\n\nsubscription1 = subscribe!(mapped_and_shared, logger())\nsubscription2 = subscribe!(mapped_and_shared, logger())\n\nnext!(subject, 1)\n\nunsubscribe!(subscription1)\nunsubscribe!(subscription2)\nnothing #hide","category":"page"},{"location":"operators/transformation/map/","page":"map","title":"map","text":"In this example, \"Function f called\" appears only once, and the computed value is shared between the two subscribers. Note, however, that this behaviour might be confusing in cases where the first subscribers completes the observable till its completion stage. For example:","category":"page"},{"location":"operators/transformation/map/","page":"map","title":"map","text":"mapped_and_shared = from([ 0, 1, 2 ]) |> map(Int, f) |> share()\n\nsubscription1 = subscribe!(mapped_and_shared, logger())\nsubscription2 = subscribe!(mapped_and_shared, logger())\n\nunsubscribe!(subscription1)\nunsubscribe!(subscription2)\nnothing #hide","category":"page"},{"location":"operators/transformation/map/","page":"map","title":"map","text":"In this scenario, the second subscriber doesn't receive any values because the first subscriber exhausts the single shared observable. Once the shared observable is used up, it doesn't produce any further values. This doesn't occur without the share() operator.","category":"page"},{"location":"operators/transformation/map/","page":"map","title":"map","text":"mapped = from([ 0, 1, 2 ]) |> map(Int, f)\n\nsubscription1 = subscribe!(mapped, logger())\nsubscription2 = subscribe!(mapped, logger())\n\nunsubscribe!(subscription1)\nunsubscribe!(subscription2)\nnothing #hide","category":"page"},{"location":"operators/transformation/map/#See-also","page":"map","title":"See also","text":"","category":"section"},{"location":"operators/transformation/map/","page":"map","title":"map","text":"Operators","category":"page"},{"location":"operators/utility/tap_on_complete/#operator_tap_on_complete","page":"tap_on_complete","title":"TapOnComplete Operator","text":"","category":"section"},{"location":"operators/utility/tap_on_complete/","page":"tap_on_complete","title":"tap_on_complete","text":"tap_on_complete","category":"page"},{"location":"operators/utility/tap_on_complete/#Rocket.tap_on_complete","page":"tap_on_complete","title":"Rocket.tap_on_complete","text":"tap_on_complete(tapFn::F) where { F <: Function }\n\nCreates a tap operator, which performs a side effect for only complete emission on the source Observable, but return an Observable that is identical to the source.\n\nArguments\n\ntapFn::Function: side-effect tap function with () -> Nothing signature\n\nProducing\n\nStream of type <: Subscribable{L} where L refers to type of source stream\n\nExamples\n\nusing Rocket\n\nsource = from([ 1, 2, 3 ])\nsubscribe!(source |> tap_on_complete(() -> println(\"Complete event received\")), logger())\n;\n\n# output\n\n[LogActor] Data: 1\n[LogActor] Data: 2\n[LogActor] Data: 3\n[LogActor] Completed\nComplete event received\n\n\nSee also: tap_on_subscribe, tap, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/utility/tap_on_complete/#Description","page":"tap_on_complete","title":"Description","text":"","category":"section"},{"location":"operators/utility/tap_on_complete/","page":"tap_on_complete","title":"tap_on_complete","text":"Returns an Observable that resembles the source Observable, but modifies it so that the provided Observer is called to perform a side effect on complete event emission by the source.","category":"page"},{"location":"operators/utility/tap_on_complete/","page":"tap_on_complete","title":"tap_on_complete","text":"This operator is useful for debugging your Observables, verifying correctness, or performing other side effects.","category":"page"},{"location":"operators/utility/tap_on_complete/","page":"tap_on_complete","title":"tap_on_complete","text":"Note: this operator differs from a subscribe on the Observable. If the Observable returned by tap_on_complete is not subscribed, the side effects specified by the Observer will never happen. tap_on_complete therefore simply spies on future execution, it does not trigger an execution to happen like subscribe does.","category":"page"},{"location":"operators/utility/tap_on_complete/#See-also","page":"tap_on_complete","title":"See also","text":"","category":"section"},{"location":"operators/utility/tap_on_complete/","page":"tap_on_complete","title":"tap_on_complete","text":"Operators","category":"page"},{"location":"observables/types/combined_updates/#observable_combined_updates","page":"Combined Updates","title":"CombinedUpdates Observable","text":"","category":"section"},{"location":"observables/types/combined_updates/","page":"Combined Updates","title":"Combined Updates","text":"combineLatestUpdates","category":"page"},{"location":"observables/types/combined_updates/#Rocket.combineLatestUpdates","page":"Combined Updates","title":"Rocket.combineLatestUpdates","text":"combineLatestUpdates(sources...; strategy = PushEach())\ncombineLatestUpdates(sources::S, strategy::G = PushEach()) where { S <: Tuple, U }\n\ncombineLatestUpdates is a more effiecient version of combineLatest(sources) + map_to(sources) operators chain.\n\nArguments\n\nsources: input sources\nstrategy: optional update strategy for batching new values together\n\nNote: combineLatestUpdates() completes immediately if sources are empty.\n\nSee also: Subscribable, subscribe!, PushEach, PushEachBut, PushNew, PushNewBut, PushStrategy\n\n\n\n\n\n","category":"function"},{"location":"observables/types/combined/#observable_combined","page":"Combined","title":"Combined Observable","text":"","category":"section"},{"location":"observables/types/combined/","page":"Combined","title":"Combined","text":"combineLatest\nPushEach\nPushEachBut\nPushNew\nPushNewBut\nPushStrategy","category":"page"},{"location":"observables/types/combined/#Rocket.combineLatest","page":"Combined","title":"Rocket.combineLatest","text":"combineLatest(sources...; strategy = PushEach())\ncombineLatest(sources::S, strategy::G = PushEach()) where { S <: Tuple, U }\n\nCombines multiple Observables to create an Observable whose values are calculated from the latest values of each of its input Observables. Accept optimal update strategy object.\n\nArguments\n\nsources: input sources\nstrategy: optional update strategy for batching new values together\n\nNote: combineLatest() completes immediately if sources are empty.\n\nExamples\n\nusing Rocket\n\nlatest = combineLatest(of(1), from(2:5))\n\nsubscribe!(latest, logger())\n;\n\n# output\n\n[LogActor] Data: (1, 2)\n[LogActor] Data: (1, 3)\n[LogActor] Data: (1, 4)\n[LogActor] Data: (1, 5)\n[LogActor] Completed\n\nusing Rocket\n\nlatest = combineLatest(of(1) |> async(0), from(2:5) |> async(0), strategy = PushNew())\n\nsubscribe!(latest, logger())\n;\n\n# output\n\n[LogActor] Data: (1, 2)\n[LogActor] Completed\n\nSee also: Subscribable, subscribe!, PushEach, PushEachBut, PushNew, PushNewBut, PushStrategy\n\n\n\n\n\n","category":"function"},{"location":"observables/types/combined/#Rocket.PushEach","page":"Combined","title":"Rocket.PushEach","text":"PushEach\n\nPushEach update strategy specifies the strategy to emit new value each time an inner observable emit a new value\n\nSee also: combineLatest, PushEachBut, PushNew, PushNewBut, PushStrategy\n\n\n\n\n\n","category":"type"},{"location":"observables/types/combined/#Rocket.PushEachBut","page":"Combined","title":"Rocket.PushEachBut","text":"PushEachBut{I}\n\nPushEachBut update strategy specifies the strategy to emit new value if and only if an inner observable with index I have a new value\n\nSee also: combineLatest, PushEach, PushNew, PushNewBut, PushStrategy\n\n\n\n\n\n","category":"type"},{"location":"observables/types/combined/#Rocket.PushNew","page":"Combined","title":"Rocket.PushNew","text":"PushNew\n\nPushNew update strategy specifies the strategy to emit new value if and only if all inner observables have a new value\n\nSee also: combineLatest, PushEach, PushEachBut, PushNewBut, PushStrategy\n\n\n\n\n\n","category":"type"},{"location":"observables/types/combined/#Rocket.PushNewBut","page":"Combined","title":"Rocket.PushNewBut","text":"PushNewBut{I}\n\nPushNewBut{I} update strategy specifies the strategy to emit new value if and only if all inner observables except with index I have a new value\n\nSee also: combineLatest, PushEach, PushEachBut, PushNew, PushStrategy\n\n\n\n\n\n","category":"type"},{"location":"observables/types/combined/#Rocket.PushStrategy","page":"Combined","title":"Rocket.PushStrategy","text":"PushStrategy(strategy::BitArray{1})\n\nPushStrategy update strategy specifies the strategy to emit new value if and only if all inner observables with index such that strategy[index] = false have a new value\n\nSee also: combineLatest, PushEach, PushEachBut, PushNew, PushNewBut, collectLatest\n\n\n\n\n\n","category":"type"},{"location":"observables/types/combined/#Description","page":"Combined","title":"Description","text":"","category":"section"},{"location":"observables/types/combined/","page":"Combined","title":"Combined","text":"combineLatest combines the values from all Observables in its arguments. This is done by subscribing to each Observable in order and, whenever an Observable emits, collecting a tuple of the most recent values from each Observable (in order). If you pass n Observables to combineLatest, the returned Observable will always emit an ordered tuple of n values.","category":"page"},{"location":"observables/types/combined/","page":"Combined","title":"Combined","text":"To ensure that the output tuple has a consistent length, combineLatest waits for all input Observables to emit at least once before it starts emitting results. This means that if some Observable emits values before other Observables started emitting, all these values but the last will be lost. On the other hand, if some Observable does not emit a value but completes, the resulting Observable will complete simultaneously without emitting anything. Furthermore, if some input Observable does not emit any value and never completes, combineLatest will also never emit and never complete.","category":"page"},{"location":"observables/types/combined/","page":"Combined","title":"Combined","text":"If at least one Observable was passed to combineLatest and all passed Observables emitted, then the resulting Observable will complete when all combined streams complete. So even if some Observable completes, the result of combineLatest will still emit values when the other Observables do. In case of a completed Observable, its value will now remain to be the last emitted value. On the other hand, if any Observable errors, combineLatest will also immediately error.","category":"page"},{"location":"observables/types/combined/","page":"Combined","title":"Combined","text":"It is possible to change default update/complete strategy behaviour with an optional strategy object.","category":"page"},{"location":"operators/filtering/about/#Filtering-category","page":"About filtering operators","title":"Filtering category","text":"","category":"section"},{"location":"operators/filtering/about/","page":"About filtering operators","title":"About filtering operators","text":"There are operators for different purposes, and they may be categorized as: creation, transformation, filtering, joining, multicasting, error handling, utility, etc. In the following list you will find all the operators organized in filtering category.","category":"page"},{"location":"operators/filtering/about/","page":"About filtering operators","title":"About filtering operators","text":"filter\nfilter_type\ntake\ntake_until\nfirst\nlast\nfind\nfind_index\nignore","category":"page"},{"location":"operators/filtering/about/#See-also","page":"About filtering operators","title":"See also","text":"","category":"section"},{"location":"operators/filtering/about/","page":"About filtering operators","title":"About filtering operators","text":"Operators","category":"page"},{"location":"observables/types/connectable/#observable_connectable","page":"Connectable","title":"Connectable Observable","text":"","category":"section"},{"location":"observables/types/connectable/","page":"Connectable","title":"Connectable","text":"connectable","category":"page"},{"location":"observables/types/connectable/#Rocket.connectable","page":"Connectable","title":"Rocket.connectable","text":"connectable(subject::J, source::S) where J where S\n\nCreates a ConnectableObservable with a given subject object and a source observable.\n\nExample\n\nusing Rocket\n\nc = connectable(Subject(Int; scheduler = AsapScheduler()), from(1:3))\n\nsubscribe!(c, logger());\n\nconnect(c);\n;\n\n# output\n\n[LogActor] Data: 1\n[LogActor] Data: 2\n[LogActor] Data: 3\n[LogActor] Completed\n\n\nSee also: ConnectableObservable, connect, subscribe!\n\n\n\n\n\n","category":"function"},{"location":"observables/types/connectable/","page":"Connectable","title":"Connectable","text":"connect","category":"page"},{"location":"observables/types/connectable/#Rocket.connect","page":"Connectable","title":"Rocket.connect","text":"connect(connectable::ConnectableObservable)\n\nWhen connect is called, the subject passed to the multicast operator is subscribed to the source and the subject’s observers receive the multicast notifications, which fits our basic mental model of stream multicasting. Returns a subscription.\n\nSee also: connectable, ConnectableObservable\n\n\n\n\n\n","category":"function"},{"location":"observables/types/connectable/","page":"Connectable","title":"Connectable","text":"ConnectableObservable","category":"page"},{"location":"observables/types/connectable/#Rocket.ConnectableObservable","page":"Connectable","title":"Rocket.ConnectableObservable","text":"ConnectableObservable{D}(subject, source)\n\nA connectable observable encapsulates the multicasting infrastructure with provided subject, but does not immediately subscribe to the source. It subscribes to the source when its connect method is called.\n\nSee also: connect, Subscribable\n\n\n\n\n\n","category":"type"},{"location":"operators/utility/tap_on_unsubscribe/#operator_tap_on_unsubscribe","page":"tap_on_unsubscribe","title":"TapOnUnsubscribe Operator","text":"","category":"section"},{"location":"operators/utility/tap_on_unsubscribe/","page":"tap_on_unsubscribe","title":"tap_on_unsubscribe","text":"TapBeforeUnsubscription\nTapAfterUnsubscription\ntap_on_unsubscribe","category":"page"},{"location":"operators/utility/tap_on_unsubscribe/#Rocket.TapBeforeUnsubscription","page":"tap_on_unsubscribe","title":"Rocket.TapBeforeUnsubscription","text":"TapBeforeUnsubscription\n\nOne of the strategies for tap_on_unsubscribe operator. With TapBeforeUnubscription tap callback will be called before actual unsubscription.\n\nSee also: tap_on_unsubscribe, TapAfterUnsubscription\n\n\n\n\n\n","category":"type"},{"location":"operators/utility/tap_on_unsubscribe/#Rocket.TapAfterUnsubscription","page":"tap_on_unsubscribe","title":"Rocket.TapAfterUnsubscription","text":"TapAfterUnsubscription\n\nOne of the strategies for tap_on_unsubscribe operator. With TapBeforeUnsubscription tap callback will be called after actual unsubscription.\n\nSee also: tap_on_unsubscribe, TapBeforeUnsubscription\n\n\n\n\n\n","category":"type"},{"location":"operators/utility/tap_on_unsubscribe/#Rocket.tap_on_unsubscribe","page":"tap_on_unsubscribe","title":"Rocket.tap_on_unsubscribe","text":"tap_on_unsubscribe(tapFn::F, strategy::S = TapBeforeUnsubscription()) where { F <: Function }\n\nCreates a tap operator, which performs a side effect on the unsubscription on the source Observable, but return an Observable that is identical to the source. Tap callback triggers only once.\n\nArguments\n\ntapFn::Function: side-effect tap function with () -> Nothing signature\nstrategy: (optional), specifies the order of a side-effect and an actual unsubscription, uses TapBeforeUnsubscription by default\n\nProducing\n\nStream of type <: Subscribable{L} where L refers to type of source stream\n\nExamples\n\nusing Rocket\n\nsource = from([ 1, 2, 3 ])\nsubscription = subscribe!(source |> tap_on_unsubscribe(() -> println(\"Someone unsubscribed\")), logger())\nunsubscribe!(subscription)\n;\n\n# output\n\n[LogActor] Data: 1\n[LogActor] Data: 2\n[LogActor] Data: 3\n[LogActor] Completed\nSomeone unsubscribed\n\nSee also: TapBeforeUnsubscription, TapAfterUnsubscription, tap, tap_on_subscribe, tap_on_complete, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/utility/tap_on_unsubscribe/#Description","page":"tap_on_unsubscribe","title":"Description","text":"","category":"section"},{"location":"operators/utility/tap_on_unsubscribe/","page":"tap_on_unsubscribe","title":"tap_on_unsubscribe","text":"Returns an Observable that resembles the source Observable, but modifies it so that the provided Observer is called to perform a side effect on unsubscription from the source.","category":"page"},{"location":"operators/utility/tap_on_unsubscribe/","page":"tap_on_unsubscribe","title":"tap_on_unsubscribe","text":"This operator is useful for debugging your Observables, verifying correctness, or performing other side effects.","category":"page"},{"location":"operators/utility/tap_on_unsubscribe/#See-also","page":"tap_on_unsubscribe","title":"See also","text":"","category":"section"},{"location":"operators/utility/tap_on_unsubscribe/","page":"tap_on_unsubscribe","title":"tap_on_unsubscribe","text":"Operators","category":"page"},{"location":"operators/errors/about/#Error-handling-category","page":"About error handling operators","title":"Error handling category","text":"","category":"section"},{"location":"operators/errors/about/","page":"About error handling operators","title":"About error handling operators","text":"There are operators for different purposes, and they may be categorized as: creation, transformation, filtering, joining, multicasting, error handling, utility, etc. In the following list you will find all the operators organized in error handling category.","category":"page"},{"location":"operators/errors/about/","page":"About error handling operators","title":"About error handling operators","text":"catch_error\nrerun\nerror_if\nerror_if_not","category":"page"},{"location":"operators/errors/about/#See-also","page":"About error handling operators","title":"See also","text":"","category":"section"},{"location":"operators/errors/about/","page":"About error handling operators","title":"About error handling operators","text":"Operators","category":"page"},{"location":"operators/utility/delay/#operator_delay","page":"delay","title":"Delay Operator","text":"","category":"section"},{"location":"operators/utility/delay/","page":"delay","title":"delay","text":"delay","category":"page"},{"location":"operators/utility/delay/#Rocket.delay","page":"delay","title":"Rocket.delay","text":"delay(delay::Int)\n\nCreates a delay operator, which delays the emission of items from the source Observable by a given timeout.\n\nArguments:\n\ndelay::Int: the delay duration in milliseconds (a number) until which the emission of the source items is delayed.\n\nProducing\n\nStream of type <: Subscribable{L} where L refers to type of source stream\n\nSee also: AbstractOperator, InferableOperator, ProxyObservable\n\n\n\n\n\n","category":"function"},{"location":"operators/utility/delay/#Description","page":"delay","title":"Description","text":"","category":"section"},{"location":"operators/utility/delay/","page":"delay","title":"delay","text":"Delays the emission of items from the source Observable by a given timeout","category":"page"},{"location":"operators/utility/delay/#Example","page":"delay","title":"Example","text":"","category":"section"},{"location":"operators/utility/delay/","page":"delay","title":"delay","text":"Delay every value with 1 second to the output","category":"page"},{"location":"operators/utility/delay/","page":"delay","title":"delay","text":"using Rocket\nusing Dates\n\nsource = from([ 1, 2, 3 ])\nprintln(Dates.format(now(), \"MM:SS\"))\nsubscription = subscribe!(source |> delay(2000), lambda(\n on_next = (d) -> println(\"$(Dates.format(now(), \"MM:SS\")): $d\")\n));\n\n# output\n\n03:41\n03:43: 1\n03:43: 2\n03:43: 3\n","category":"page"},{"location":"operators/utility/delay/#See-also","page":"delay","title":"See also","text":"","category":"section"},{"location":"operators/utility/delay/","page":"delay","title":"delay","text":"Operators","category":"page"},{"location":"operators/filtering/take/#operator_take","page":"take","title":"Take Operator","text":"","category":"section"},{"location":"operators/filtering/take/","page":"take","title":"take","text":"take","category":"page"},{"location":"operators/filtering/take/#Rocket.take","page":"take","title":"Rocket.take","text":"take(maxcount::Int)\n\nCreates a take operator, which returns an Observable that emits only the first maxcount values emitted by the source Observable.\n\nArguments\n\nmaxcount::Int: the maximum number of next values to emit.\n\nProducing\n\nStream of type <: Subscribable{L} where L refers to type of source stream\n\nExamples\n\nusing Rocket\n\nsource = from([ i for i in 1:100 ])\n\nsubscribe!(source |> take(5), logger())\n;\n\n# output\n\n[LogActor] Data: 1\n[LogActor] Data: 2\n[LogActor] Data: 3\n[LogActor] Data: 4\n[LogActor] Data: 5\n[LogActor] Completed\n\nSee also: AbstractOperator, InferableOperator, ProxyObservable, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/filtering/take/#Description","page":"take","title":"Description","text":"","category":"section"},{"location":"operators/filtering/take/","page":"take","title":"take","text":"take returns an Observable that emits only the first count values emitted by the source Observable. If the source emits fewer than count values, then all of its values are emitted. Afterwards, the Observable completes regardless of whether the source completed.","category":"page"},{"location":"operators/filtering/take/#See-also","page":"take","title":"See also","text":"","category":"section"},{"location":"operators/filtering/take/","page":"take","title":"take","text":"Operators","category":"page"},{"location":"operators/transformation/scan/#operator_scan","page":"scan","title":"Scan Operator","text":"","category":"section"},{"location":"operators/transformation/scan/","page":"scan","title":"scan","text":"scan","category":"page"},{"location":"operators/transformation/scan/#Rocket.scan","page":"scan","title":"Rocket.scan","text":"scan(::Type{R}, scanFn::F, seed::R) where { R, F <: Function }\nscan(scanFn::F) where { F <: Function }\n\nCreates a scan operator, which applies a given accumulator scanFn function to each value emmited by the source Observable, and returns each intermediate result with an optional seed value. If a seed value is specified, then that value will be used as the initial value for the accumulator. If no seed value is specified, the first item of the source is used as the seed.\n\nArguments\n\n::Type{R}: the type of data of transformed value, may be or may not be the same as type of input source\nscanFn::Function: accumulator function with (data::T, current::R) -> R signature\nseed::R: optional initial value for accumulator function\n\nProducing\n\nStream of type <: Subscribable{R}\n\nExamples\n\nusing Rocket\n\nsource = from([ 1, 2, 3 ])\nsubscribe!(source |> scan(+), logger())\n;\n\n# output\n\n[LogActor] Data: 1\n[LogActor] Data: 3\n[LogActor] Data: 6\n[LogActor] Completed\n\n\nusing Rocket\n\nsource = from([ 1, 2, 3 ])\nsubscribe!(source |> scan(Vector{Int}, (d, c) -> [ c..., d ], Int[]), logger())\n;\n\n# output\n\n[LogActor] Data: [1]\n[LogActor] Data: [1, 2]\n[LogActor] Data: [1, 2, 3]\n[LogActor] Completed\n\n\nSee also: AbstractOperator, RightTypedOperator, ProxyObservable, reduce, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/transformation/scan/#Description","page":"scan","title":"Description","text":"","category":"section"},{"location":"operators/transformation/scan/","page":"scan","title":"scan","text":"Combines all values emitted by the source, using an accumulator function that joins a new source value with the past accumulation. This is similar to reduce, but emits the intermediate accumulations.","category":"page"},{"location":"operators/transformation/scan/","page":"scan","title":"scan","text":"Returns an Observable that applies a specified accumulator function to each item emitted by the source Observable. If a seed value is specified, then that value will be used as the initial value for the accumulator. If no seed value is specified, the first item of the source is used as the seed.","category":"page"},{"location":"operators/transformation/scan/#See-also","page":"scan","title":"See also","text":"","category":"section"},{"location":"operators/transformation/scan/","page":"scan","title":"scan","text":"Operators","category":"page"},{"location":"actors/types/buffer/#actor_buffer","page":"Buffer","title":"Buffer actor","text":"","category":"section"},{"location":"actors/types/buffer/","page":"Buffer","title":"Buffer","text":"buffer","category":"page"},{"location":"actors/types/buffer/#Rocket.buffer","page":"Buffer","title":"Rocket.buffer","text":"buffer(::Type{T}, size::Int) where T\n\nArguments\n\n::Type{T}: Type of data in buffer\nsize::Int: size of buffer\n\nCreation operator for the BufferActor actor.\n\nExamples\n\nusing Rocket\n\nactor = buffer(Int, 3)\nactor isa BufferActor{Int}\n\n# output\ntrue\n\nSee also: BufferActor, AbstractActor\n\n\n\n\n\n","category":"function"},{"location":"actors/types/buffer/","page":"Buffer","title":"Buffer","text":"BufferActor","category":"page"},{"location":"actors/types/buffer/#Rocket.BufferActor","page":"Buffer","title":"Rocket.BufferActor","text":"BufferActor{D}() where D\n\nBuffer actor provides a storage actor. It copies last incoming successful next events in a values array, throws an ErrorException on error! event and does nothing on completion event. Note: Actor does not check the size of incoming data.\n\nExamples\n\nusing Rocket\n\nsource = of([ 1, 2, 3 ])\nactor = buffer(Int, 3)\n\nsubscribe!(source, actor)\nshow(getvalues(actor))\n\n# output\n[1, 2, 3]\n\nSee also: Actor, buffer\n\n\n\n\n\n","category":"type"},{"location":"operators/creation/about/#Creation-category","page":"Creation","title":"Creation category","text":"","category":"section"},{"location":"operators/creation/about/","page":"Creation","title":"Creation","text":"There are operators for different purposes, and they may be categorized as: creation, transformation, filtering, joining, multicasting, error handling, utility, etc. In the following list you will find all the operators organized in creation category.","category":"page"},{"location":"operators/creation/about/","page":"Creation","title":"Creation","text":"make\nof\nfrom\niterable\nfaulted\nnever\ncompleted\ntimer\ninterval\nproxy\nfile\ncombined\nrace\nconnectable\nmerged\nconcat\ngenerate\nnetwork\ndefer\nzipped","category":"page"},{"location":"operators/creation/about/#See-also","page":"Creation","title":"See also","text":"","category":"section"},{"location":"operators/creation/about/","page":"Creation","title":"Creation","text":"Operators","category":"page"},{"location":"subjects/types/recent/#subject_recent","page":"Recent","title":"RecentSubject","text":"","category":"section"},{"location":"subjects/types/recent/","page":"Recent","title":"Recent","text":"RecentSubject\nRecentSubjectFactory","category":"page"},{"location":"subjects/types/recent/#Rocket.RecentSubject","page":"Recent","title":"Rocket.RecentSubject","text":"RecentSubject(::Type{D}) where D\nRecentSubject(::Type{D}, factory::F) where { D, F <: AbstractSubjectFactory }\nRecentSubject(::Type{D}, subject::S) where { D, S }\n\nA variant of Subject that emits its recent value whenever it is subscribed to.\n\nSee also: RecentSubjectFactory, Subject, SubjectFactory\n\n\n\n\n\n","category":"function"},{"location":"subjects/types/recent/#Rocket.RecentSubjectFactory","page":"Recent","title":"Rocket.RecentSubjectFactory","text":"RecentSubjectFactory(factory::F) where { F <: AbstractSubjectFactory }\nRecentSubjectFactory(; scheduler::H = AsapScheduler()) where { H <: AbstractScheduler }\n\nA variant of SubjectFactory that creates an instance of RecentSubject.\n\nSee also: SubjectFactory, AbstractSubjectFactory, RecentSubject, Subject\n\n\n\n\n\n","category":"function"},{"location":"subjects/types/recent/#Description","page":"Recent","title":"Description","text":"","category":"section"},{"location":"subjects/types/recent/","page":"Recent","title":"Recent","text":"One of the variants of Subjects is the RecentSubject, which has a notion of \"the recent value\". It stores the latest value emitted to its consumers, and whenever a new Observer subscribes, it will immediately receive the \"recent value\" from the RecentSubject.","category":"page"},{"location":"subjects/types/recent/","page":"Recent","title":"Recent","text":"note: Note\nRecentSubjects is a more efficient version of ReplaySubjects with replay size equal to one.","category":"page"},{"location":"subjects/types/recent/#Examples","page":"Recent","title":"Examples","text":"","category":"section"},{"location":"subjects/types/recent/","page":"Recent","title":"Recent","text":"In the following example, after RecentSubject is initialized the first Observer receives nothing when it subscribes. The second Observer receives the value 2 even though it subscribed after the value 2 was sent.","category":"page"},{"location":"subjects/types/recent/","page":"Recent","title":"Recent","text":"using Rocket\n\nsubject = RecentSubject(Int)\n\nsubscription1 = subscribe!(subject, logger(\"1\"))\n\nnext!(subject, 1)\nnext!(subject, 2)\n\nsubscription2 = subscribe!(subject, logger(\"2\"))\n\nnext!(subject, 3)\n\nunsubscribe!(subscription1)\nunsubscribe!(subscription2)\n\n// Logs\n// [1] Data: 1\n// [1] Data: 2\n// [2] Data: 2\n// [1] Data: 3\n// [2] Data: 3","category":"page"},{"location":"operators/utility/noop/#operator_noop","page":"noop","title":"Noop Operator","text":"","category":"section"},{"location":"operators/utility/noop/","page":"noop","title":"noop","text":"noop","category":"page"},{"location":"operators/utility/noop/#Rocket.noop","page":"noop","title":"Rocket.noop","text":"noop()\n\nCreates a noop operator, which does nothing, but breaks operator composition type inference checking procedure for Julia's compiler. It might be useful for very long chain of operators, because Julia tries to statically infer data types at compile-time for the whole chain and can run into StackOverflow issues.\n\nusing Rocket\n\n# foo() block to enforce local scope for scope variable\nfunction foo()\n source = from(1:5)\n\n for i in 1:1000\n source = source |> map(Int, d -> d + 1) |> noop()\n end\n\n subscribe!(source, logger())\nend\n\nfoo()\n;\n\n# output\n\n[LogActor] Data: 1001\n[LogActor] Data: 1002\n[LogActor] Data: 1003\n[LogActor] Data: 1004\n[LogActor] Data: 1005\n[LogActor] Completed\n\nSee also: AbstractOperator, InferableOperator, logger, map\n\n\n\n\n\n","category":"function"},{"location":"operators/utility/noop/#See-also","page":"noop","title":"See also","text":"","category":"section"},{"location":"operators/utility/noop/","page":"noop","title":"noop","text":"Operators","category":"page"},{"location":"getting-started/#Getting-started","page":"Getting started","title":"Getting started","text":"","category":"section"},{"location":"getting-started/","page":"Getting started","title":"Getting started","text":"Rocket.jl is a Julia package for reactive programming that makes it easier to work with asynchronous data. It is inspired by the RxJS and ReactiveX communities.","category":"page"},{"location":"getting-started/","page":"Getting started","title":"Getting started","text":"In order to combine good performance with a convenient API, Rocket.jl employs Observer patterns, Actor models and Functional programming.","category":"page"},{"location":"getting-started/#Installation","page":"Getting started","title":"Installation","text":"","category":"section"},{"location":"getting-started/","page":"Getting started","title":"Getting started","text":"Install Rocket.jl through the Julia package manager:","category":"page"},{"location":"getting-started/","page":"Getting started","title":"Getting started","text":"] add Rocket","category":"page"},{"location":"getting-started/#Concepts","page":"Getting started","title":"Concepts","text":"","category":"section"},{"location":"getting-started/","page":"Getting started","title":"Getting started","text":"Rocket.jl has been designed with a focus on performance and modularity.","category":"page"},{"location":"getting-started/","page":"Getting started","title":"Getting started","text":"The essential concepts in Rocket.jl are:","category":"page"},{"location":"getting-started/","page":"Getting started","title":"Getting started","text":"Observable: represents a collection of future messages (data or/and events).\nActor: is an object that knows how to react on incoming messages delivered by the Observable.\nSubscription: represents a teardown logic that is useful for cancelling the execution of an Observable.\nOperator: an object that deals with collection operations, such as map, filter, reduce, etc.\nSubject: the way of multicasting a message to multiple Observers.","category":"page"},{"location":"getting-started/#First-example","page":"Getting started","title":"First example","text":"","category":"section"},{"location":"getting-started/","page":"Getting started","title":"Getting started","text":"Conventionally, arrays are used for processing data.","category":"page"},{"location":"getting-started/","page":"Getting started","title":"Getting started","text":"for value in array_of_values\n doSomethingWithMyData(value)\nend","category":"page"},{"location":"getting-started/","page":"Getting started","title":"Getting started","text":"In contrast, Rocket.jl uses observables.","category":"page"},{"location":"getting-started/","page":"Getting started","title":"Getting started","text":"subscription = subscribe!(source_of_values, lambda(\n on_next = (data) -> doSomethingWithMyData(data),\n on_error = (error) -> doSomethingWithAnError(error),\n on_complete = () -> println(\"Completed!\")\n))","category":"page"},{"location":"getting-started/","page":"Getting started","title":"Getting started","text":"At some point in time you may decide to stop listening for new messages.","category":"page"},{"location":"getting-started/","page":"Getting started","title":"Getting started","text":"unsubscribe!(subscription)","category":"page"},{"location":"getting-started/#Actors","page":"Getting started","title":"Actors","text":"","category":"section"},{"location":"getting-started/","page":"Getting started","title":"Getting started","text":"In order to process messages from an observable you will need to define an Actor that knows how to react to incoming messages.","category":"page"},{"location":"getting-started/","page":"Getting started","title":"Getting started","text":"struct MyActor <: Rocket.Actor{Int} end\n\nRocket.on_next!(actor::MyActor, data::Int) = doSomethingWithMyData(data)\nRocket.on_error!(actor::MyActor, error) = doSomethingWithAnError(error)\nRocket.on_complete!(actor::MyActor) = println(\"Completed!\")","category":"page"},{"location":"getting-started/","page":"Getting started","title":"Getting started","text":"An actor can also have its own local state.","category":"page"},{"location":"getting-started/","page":"Getting started","title":"Getting started","text":"struct StoreActor{D} <: Rocket.Actor{D}\n values :: Vector{D}\n\n StoreActor{D}() where D = new(Vector{D}())\nend\n\nRocket.on_next!(actor::StoreActor{D}, data::D) where D = push!(actor.values, data)\nRocket.on_error!(actor::StoreActor, error) = doSomethingWithAnError(error)\nRocket.on_complete!(actor::StoreActor) = println(\"Completed: $(actor.values)\")","category":"page"},{"location":"getting-started/","page":"Getting started","title":"Getting started","text":"For debugging purposes you can use a general LambdaActor actor or just pass a function object as an actor in subscribe! function..","category":"page"},{"location":"getting-started/#Operators","page":"Getting started","title":"Operators","text":"","category":"section"},{"location":"getting-started/","page":"Getting started","title":"Getting started","text":"What makes Rocket.jl powerful is its ability to help you process, transform and modify the messages that flow through your observables, using Operators.","category":"page"},{"location":"getting-started/","page":"Getting started","title":"Getting started","text":"subscribe!(squared_int_values |> map(Int, (d) -> d ^ 2), lambda(\n on_next = (data) -> println(data)\n))","category":"page"},{"location":"operators/transformation/pairwise/#operator_pairwise","page":"pairwise","title":"Pairwise Operator","text":"","category":"section"},{"location":"operators/transformation/pairwise/","page":"pairwise","title":"pairwise","text":"pairwise","category":"page"},{"location":"operators/transformation/pairwise/#Rocket.pairwise","page":"pairwise","title":"Rocket.pairwise","text":"pairwise([ initial ])\n\nCreates a pairwise operator, which groups pairs of consecutive emissions together and emits them as a tuple of two values. Accepts optional initial seed value to start pairing from.\n\nusing Rocket\n\nsource = from(1:5) |> pairwise()\n\nsubscribe!(source, logger())\n;\n\n# output\n\n[LogActor] Data: (1, 2)\n[LogActor] Data: (2, 3)\n[LogActor] Data: (3, 4)\n[LogActor] Data: (4, 5)\n[LogActor] Completed\n\nusing Rocket\n\nsource = from(1:5) |> pairwise(0)\n\nsubscribe!(source, logger())\n;\n\n# output\n\n[LogActor] Data: (0, 1)\n[LogActor] Data: (1, 2)\n[LogActor] Data: (2, 3)\n[LogActor] Data: (3, 4)\n[LogActor] Data: (4, 5)\n[LogActor] Completed\n\nSee also: AbstractOperator, InferableOperator, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/transformation/pairwise/#See-also","page":"pairwise","title":"See also","text":"","category":"section"},{"location":"operators/transformation/pairwise/","page":"pairwise","title":"pairwise","text":"Operators","category":"page"},{"location":"operators/filtering/first/#operator_first","page":"first","title":"First operator","text":"","category":"section"},{"location":"operators/filtering/first/","page":"first","title":"first","text":"first","category":"page"},{"location":"operators/filtering/first/#Base.first","page":"first","title":"Base.first","text":"first(; default = nothing)\n\nCreates a first operator, which returns an Observable that emits only the first value emitted by the source Observable. Sends FirstNotFoundException error message if a given source completes without emitting a single value.\n\nArguments\n\ndefault: an optional default value to provide if no values were emitted\n\nProducing\n\nStream of type <: Subscribable{L} where L refers to type of source stream\n\nExamples\n\nusing Rocket\n\nsource = from(1:100)\nsubscription = subscribe!(source |> first(), logger())\n;\n\n# output\n\n[LogActor] Data: 1\n[LogActor] Completed\n\nSee also: take, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/filtering/first/#Description","page":"first","title":"Description","text":"","category":"section"},{"location":"operators/filtering/first/","page":"first","title":"first","text":"An alias for take(1) operator.","category":"page"},{"location":"operators/filtering/first/#See-also","page":"first","title":"See also","text":"","category":"section"},{"location":"operators/filtering/first/","page":"first","title":"first","text":"Operators, take","category":"page"},{"location":"actors/types/function/#actor_function","page":"Function","title":"Function actor","text":"","category":"section"},{"location":"actors/types/function/","page":"Function","title":"Function","text":"FunctionActor","category":"page"},{"location":"actors/types/function/#Rocket.FunctionActor","page":"Function","title":"Rocket.FunctionActor","text":"FunctionActor{D} <: Actor{D}\n\nFunctionActor provides a simple interface to use a single function as a next! callback, error! callback throws an ErrorException and complete! callback does nothing. Should not be used explicitly because it will be created automatically when passing a Function object as an actor in subscribe! function.\n\nExamples\n\nusing Rocket\n\nsource = from(1:5)\nsubscribe!(source, (t) -> println(t))\n;\n\n# output\n1\n2\n3\n4\n5\n\nSee also: Actor, subscribe!\n\n\n\n\n\n","category":"type"},{"location":"operators/mathematical/min/#operator_min","page":"min","title":"Min Operator","text":"","category":"section"},{"location":"operators/mathematical/min/","page":"min","title":"min","text":"min","category":"page"},{"location":"operators/mathematical/min/#Base.min","page":"min","title":"Base.min","text":"min(; from = nothing)\n\nCreates a min operator, which emits a single item: the item with the smallest value.\n\nArguments\n\nfrom: optional initial minimal value, if nothing first item from the source will be used as initial instead\n\nProducing\n\nStream of type <: Subscribable{Union{L, Nothing}} where L refers to type of source stream\n\nExamples\n\nusing Rocket\n\nsource = from([ i for i in 1:42 ])\nsubscribe!(source |> min(), logger())\n;\n\n# output\n\n[LogActor] Data: 1\n[LogActor] Completed\n\n\nSee also: AbstractOperator, InferableOperator, ProxyObservable, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/mathematical/min/#Description","page":"min","title":"Description","text":"","category":"section"},{"location":"operators/mathematical/min/","page":"min","title":"min","text":"The min operator operates on an Observable of similar objects. When source Observable completes, it emits the item with the smallest value.","category":"page"},{"location":"operators/mathematical/min/#See-also","page":"min","title":"See also","text":"","category":"section"},{"location":"operators/mathematical/min/","page":"min","title":"min","text":"Operators","category":"page"},{"location":"operators/errors/error_if/#operator_error_if","page":"error_if","title":"Error If Operator","text":"","category":"section"},{"location":"operators/errors/error_if/","page":"error_if","title":"error_if","text":"error_if","category":"page"},{"location":"operators/errors/error_if/#Rocket.error_if","page":"error_if","title":"Rocket.error_if","text":"error_if(checkFn, errorFn)\n\nCreates an error_if operator, which performs a check for every emission on the source Observable with checkFn. If checkFn returns true, the operator sends an error event and unsubscribes from the observable.\n\nArguments\n\ncheckFn: check function with (data) -> Bool signature\nerrorFn: error object generating function with (data) -> Any signature, optional\n\nProducing\n\nStream of type <: Subscribable{L} where L refers to type of source stream\n\nExamples\n\nusing Rocket\n\nsource = from([1, 2, 3]) |> error_if((data) -> data > 2, (data) -> \"CustomError\")\n\nsubscription = subscribe!(source, lambda(\n on_next = (d) -> println(\"Next: \", d),\n on_error = (e) -> println(\"Error: \", e),\n on_complete = () -> println(\"Completed\")\n))\n;\n\n# output\nNext: 1\nNext: 2\nError: CustomError\n\nSee also: error_if_not, error_if_empty, default_if_empty, lambda\n\n\n\n\n\n","category":"function"},{"location":"operators/errors/error_if/#See-also","page":"error_if","title":"See also","text":"","category":"section"},{"location":"operators/errors/error_if/","page":"error_if","title":"error_if","text":"Operators","category":"page"},{"location":"subjects/about/#section_subjects","page":"Subject","title":"About subjects","text":"","category":"section"},{"location":"subjects/about/","page":"Subject","title":"Subject","text":"A Rocket.jl Subject is a special type of Observable that allows values to be multicasted to many Actors. While plain Observables are unicast (each subscribed Actor owns an independent execution of the Observable), Subjects are multicast.","category":"page"},{"location":"subjects/about/","page":"Subject","title":"Subject","text":"note: Note\nA Subject is like an Observable, but can multicast to many Actors. Subjects are like event emitters: they maintain a registry of many listeners.","category":"page"},{"location":"subjects/about/","page":"Subject","title":"Subject","text":"Every Subject is an Observable. Given a Subject, you can subscribe to it, providing an Actor, which will start receiving values normally. From the perspective of the Actor, it cannot tell whether the Observable execution is coming from a plain unicast Observable or a Subject.","category":"page"},{"location":"subjects/about/","page":"Subject","title":"Subject","text":"Internally to the Subject, subscribe! does not invoke a new execution that delivers values. Instead, it simply registers the given Actor in a list of Actors.","category":"page"},{"location":"subjects/about/","page":"Subject","title":"Subject","text":"Every Subject is an Actor itself. It is an object with the methods next!, error!, and complete!. Call next!(subject, theValue) to feed a new value to the Subject, and it will be multicasted to the Actors that listen to the Subject.","category":"page"},{"location":"subjects/about/","page":"Subject","title":"Subject","text":"In the example below, we have two Observers attached to a Subject, and we feed some values to the Subject:","category":"page"},{"location":"subjects/about/","page":"Subject","title":"Subject","text":"using Rocket\n\nsource = Subject(Int)\n\nsubscription1 = subscribe!(source, lambda(\n on_next = (d) -> println(\"Actor 1: $d\")\n))\n\nsubscription2 = subscribe!(source, lambda(\n on_next = (d) -> println(\"Actor 2: $d\")\n))\n\nnext!(source, 0)\n\n# Logs\n# Actor 1: 0\n# Actor 2: 0\n\nunsubscribe!(subscription1)\nunsubscribe!(subscription2)\n","category":"page"},{"location":"subjects/about/","page":"Subject","title":"Subject","text":"Since a Subject is an actor, this also means you may provide a Subject as the argument to the subscribe of any Observable:","category":"page"},{"location":"subjects/about/","page":"Subject","title":"Subject","text":"using Rocket\n\nsource = Subject(Int)\n\nsubscription1 = subscribe!(source, lambda(\n on_next = (d) -> println(\"Actor 1: $d\")\n))\n\nsubscription2 = subscribe!(source, lambda(\n on_next = (d) -> println(\"Actor 2: $d\")\n))\n\nother_source = from([ 1, 2, 3 ])\nsubscribe!(other_source, source);\n\n# Logs\n# Actor 1: 1\n# Actor 2: 1\n# Actor 1: 2\n# Actor 2: 2\n# Actor 1: 3\n# Actor 2: 3","category":"page"},{"location":"subjects/about/","page":"Subject","title":"Subject","text":"Here, we essentially convert a unicast Observable execution to multicast, through the Subject. This demonstrates how Subjects offer a unique way to share Observable execution with multiple Observers.","category":"page"},{"location":"subjects/about/#Schedulers","page":"Subject","title":"Schedulers","text":"","category":"section"},{"location":"subjects/about/","page":"Subject","title":"Subject","text":"A Subject (and some other observables) uses scheduler objects to schedule message delivery to their listeners.","category":"page"},{"location":"subjects/about/#Synchronous-scheduler","page":"Subject","title":"Synchronous scheduler","text":"","category":"section"},{"location":"subjects/about/","page":"Subject","title":"Subject","text":"One of the variants of schedulers is the AsapScheduler, which delivers every message synchronously. AsapScheduler is a default scheduler for all Subject objects.","category":"page"},{"location":"subjects/about/","page":"Subject","title":"Subject","text":"AsapScheduler","category":"page"},{"location":"subjects/about/#Rocket.AsapScheduler","page":"Subject","title":"Rocket.AsapScheduler","text":"AsapScheduler\n\nAsapScheduler executes scheduled actions as soon as possible and does not introduce any additional logic. AsapScheduler is a default scheduler for almost all observables.\n\n\n\n\n\n","category":"type"},{"location":"subjects/about/","page":"Subject","title":"Subject","text":"using Rocket\n\nsubject = Subject(Int, scheduler = AsapScheduler())\n\nsubscription1 = subscribe!(subject, logger(\"Actor 1\"))\n\nprintln(\"Before next\")\nnext!(subject, 1)\nnext!(subject, 2)\nprintln(\"After next\")\n\nsubscription2 = subscribe!(subject, logger(\"Actor 2\"))\n\nnext!(subject, 3)\n\n# Logs\n# Before next\n# [Actor 1] Data: 1\n# [Actor 1] Data: 2\n# After next\n# [Actor 1] Data: 3\n# [Actor 2] Data: 3","category":"page"},{"location":"subjects/about/#Asynchronous-Scheduler","page":"Subject","title":"Asynchronous Scheduler","text":"","category":"section"},{"location":"subjects/about/","page":"Subject","title":"Subject","text":"An AsyncScheduler is similar to a AsapScheduler. Both allows for Subject to scheduler their messages for multiple listeners, but a AsyncScheduler delivers all messages asynchronously (but still ordered) using a Julia's built-in Task object.","category":"page"},{"location":"subjects/about/","page":"Subject","title":"Subject","text":"AsyncScheduler","category":"page"},{"location":"subjects/about/#Rocket.AsyncScheduler","page":"Subject","title":"Rocket.AsyncScheduler","text":"AsyncScheduler\n\nAsyncScheduler executes scheduled actions asynchronously and uses Channel object to order different actions on a single asynchronous task\n\n\n\n\n\n","category":"type"},{"location":"subjects/about/","page":"Subject","title":"Subject","text":"using Rocket\n\nsubject = Subject(Int, scheduler = AsyncScheduler())\n\nsubscription1 = subscribe!(subject, logger(\"Actor 1\"))\n\nprintln(\"Before next\")\nnext!(subject, 1)\nnext!(subject, 2)\nprintln(\"After next\")\n\nsubscription2 = subscribe!(subject, logger(\"Actor 2\"))\n\nnext!(subject, 3)\n\n# Logs\n# Before next\n# After next\n# [Actor 1] Data: 1\n# [Actor 1] Data: 2\n# [Actor 1] Data: 3\n# [Actor 2] Data: 3\n","category":"page"},{"location":"operators/filtering/find_index/#operator_find_index","page":"find_index","title":"Find Index operator","text":"","category":"section"},{"location":"operators/filtering/find_index/","page":"find_index","title":"find_index","text":"find_index","category":"page"},{"location":"operators/filtering/find_index/#Rocket.find_index","page":"find_index","title":"Rocket.find_index","text":"find_index(conditionFn::F) where { F <: Function }\n\nCreates a find operator, which emits only the index of the first value emitted by the source Observable that meets some condition. Indices are 1-based.\n\nProducing\n\nStream of type <: Subscribable{L} where L refers to type of source stream\n\nArguments\n\nconditionFn::F: condition function with (data::T) -> Bool signature\n\nExamples\n\nusing Rocket\n\nsource = from([ 0, 1, 2, 3, 4, 5, 6, 7, 8 ])\nsubscribe!(source |> find_index((d) -> d !== 0 && d % 2 == 0), logger())\n;\n\n# output\n\n[LogActor] Data: 3\n[LogActor] Completed\n\nSee also: find, AbstractOperator, InferableOperator, ProxyObservable, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/filtering/find_index/#Description","page":"find_index","title":"Description","text":"","category":"section"},{"location":"operators/filtering/find_index/","page":"find_index","title":"find_index","text":"It's like find, but emits the index of the found value, not the value itself.","category":"page"},{"location":"operators/filtering/find_index/#See-also","page":"find_index","title":"See also","text":"","category":"section"},{"location":"operators/filtering/find_index/","page":"find_index","title":"find_index","text":"Operators, take","category":"page"},{"location":"api/subjects/#subjects_api","page":"Subjects","title":"Subjects API","text":"","category":"section"},{"location":"api/subjects/#Traits","page":"Subjects","title":"Traits","text":"","category":"section"},{"location":"api/subjects/","page":"Subjects","title":"Subjects","text":"SubjectTrait\nas_subject \nValidSubjectTrait\nInvalidSubjectTrait\nAbstractSubject","category":"page"},{"location":"api/subjects/#Rocket.SubjectTrait","page":"Subjects","title":"Rocket.SubjectTrait","text":"Abstract type for all possible subject traits\n\nSee also: ValidSubjectTrait, InvalidSubjectTrait, as_subject\n\n\n\n\n\n","category":"type"},{"location":"api/subjects/#Rocket.as_subject","page":"Subjects","title":"Rocket.as_subject","text":"as_subject(::Type)\n\nThis function checks subject trait behavior specification. Should be used explicitly to specify subject trait behavior for any object type.\n\nSee also: SubjectTrait\n\n\n\n\n\n","category":"function"},{"location":"api/subjects/#Rocket.ValidSubjectTrait","page":"Subjects","title":"Rocket.ValidSubjectTrait","text":"Valid subject trait behavior\n\nSee also: SubjectTrait\n\n\n\n\n\n","category":"type"},{"location":"api/subjects/#Rocket.InvalidSubjectTrait","page":"Subjects","title":"Rocket.InvalidSubjectTrait","text":"Default subject trait behavior for all types.\n\nSee also: SubjectTrait\n\n\n\n\n\n","category":"type"},{"location":"api/subjects/#Rocket.AbstractSubject","page":"Subjects","title":"Rocket.AbstractSubject","text":"Supertype for Subject types. Automatically specifies ValidSubject, SimpleSubscribableTrait and BaseActorTrait traits.\n\nSee also: Subject, ValidSubjectTrait, SimpleSubscribableTrait, BaseActorTrait\n\n\n\n\n\n","category":"type"},{"location":"api/subjects/#Factory","page":"Subjects","title":"Factory","text":"","category":"section"},{"location":"api/subjects/","page":"Subjects","title":"Subjects","text":"AbstractSubjectFactory\ncreate_subject","category":"page"},{"location":"api/subjects/#Rocket.AbstractSubjectFactory","page":"Subjects","title":"Rocket.AbstractSubjectFactory","text":"Abstract type for all possible subject factories\n\nSee also: SubjectTrait, ValidSubjectTrait, InvalidSubjectTrait\n\n\n\n\n\n","category":"type"},{"location":"api/subjects/#Rocket.create_subject","page":"Subjects","title":"Rocket.create_subject","text":"create_subject(::Type{L}, factory::F) where L where { F <: AbstractSubjectFactory }\n\nActor creator function for a given factory F. Should be implemented explicitly for any AbstractActorFactory object\n\nSee also: AbstractSubjectFactory, MissingCreateActorFactoryImplementationError\n\n\n\n\n\n","category":"function"},{"location":"api/subjects/#Errors","page":"Subjects","title":"Errors","text":"","category":"section"},{"location":"api/subjects/","page":"Subjects","title":"Subjects","text":"InvalidSubjectTraitUsageError\nInconsistentSubjectDataTypesError","category":"page"},{"location":"api/subjects/#Rocket.InvalidSubjectTraitUsageError","page":"Subjects","title":"Rocket.InvalidSubjectTraitUsageError","text":"InvalidSubject usage error\n\nSee also: as_subject\n\n\n\n\n\n","category":"type"},{"location":"api/subjects/#Rocket.InconsistentSubjectDataTypesError","page":"Subjects","title":"Rocket.InconsistentSubjectDataTypesError","text":"InconsistentSubjectDataTypesError\n\nSee also: as_subject\n\n\n\n\n\n","category":"type"},{"location":"operators/transformation/lowercase/#operator_lowercase","page":"lowercase","title":"Lowercase Operator","text":"","category":"section"},{"location":"operators/transformation/lowercase/","page":"lowercase","title":"lowercase","text":"lowercase","category":"page"},{"location":"operators/transformation/lowercase/#Base.Unicode.lowercase","page":"lowercase","title":"Base.Unicode.lowercase","text":"lowercase()\n\nCreates an lowercase operator, which forces each value to be in lower case\n\nProducing\n\nStream of type <: Subscribable{L} where L referes to type of data of input Observable\n\nExamples\n\nusing Rocket\n\nsource = of(\"Hello, world!\")\nsubscribe!(source |> lowercase(), logger())\n;\n\n# output\n\n[LogActor] Data: hello, world!\n[LogActor] Completed\n\nSee also: AbstractOperator, InferableOperator, ProxyObservable, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/transformation/lowercase/#See-also","page":"lowercase","title":"See also","text":"","category":"section"},{"location":"operators/transformation/lowercase/","page":"lowercase","title":"lowercase","text":"Operators, map, uppercase","category":"page"},{"location":"operators/transformation/merge_map/#operator_merge_map","page":"merge_map","title":"MergeMap Operator","text":"","category":"section"},{"location":"operators/transformation/merge_map/","page":"merge_map","title":"merge_map","text":"merge_map","category":"page"},{"location":"operators/transformation/merge_map/#Rocket.merge_map","page":"merge_map","title":"Rocket.merge_map","text":"merge_map(::Type{R}, mappingFn::F = identity; concurrent::Int = typemax(Int)) where { R, F <: Function }\n\nCreates a merge_map operator, which returns an Observable that emits the result of applying the projection function mappingFn to each item emitted by the source Observable and merging the results of the Observables obtained from this transformation.\n\nArguments\n\n::Type{R}: the type of data of output Observables after projection with mappingFn\nmappingFn::F: projection function with (data) -> Observable{R} signature\nconcurrent::Int: optional, default is typemax(Int), maximum number of input Observables being subscribed to concurrently\n\nProducing\n\nStream of type <: Subscribable{R}\n\nExamples\n\nusing Rocket\n\nsource = from([ 0, 0 ]) |> merge_map(Int, d -> from([ 1, 2, 3 ], scheduler = AsyncScheduler(0)))\nsubscribe!(source, logger())\n;\n\n# output\n\n[LogActor] Data: 1\n[LogActor] Data: 1\n[LogActor] Data: 2\n[LogActor] Data: 2\n[LogActor] Data: 3\n[LogActor] Data: 3\n[LogActor] Completed\n\nSee also: AbstractOperator, RightTypedOperator, ProxyObservable, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/transformation/merge_map/#See-also","page":"merge_map","title":"See also","text":"","category":"section"},{"location":"operators/transformation/merge_map/","page":"merge_map","title":"merge_map","text":"Operators","category":"page"},{"location":"teardown/types/void/#teardown_void","page":"Void","title":"Void Teardown","text":"","category":"section"},{"location":"teardown/types/void/","page":"Void","title":"Void","text":"VoidTeardown\nvoidTeardown","category":"page"},{"location":"teardown/types/void/#Rocket.VoidTeardown","page":"Void","title":"Rocket.VoidTeardown","text":"VoidTeardown()\n\nVoidTeardown object does nothing on unsubscription. It is usefull for synchronous observables and observables which cannot be cancelled after execution.\n\nSee also: Teardown, VoidTeardownLogic\n\n\n\n\n\n","category":"type"},{"location":"teardown/types/void/#Rocket.voidTeardown","page":"Void","title":"Rocket.voidTeardown","text":"voidTeardown\n\nAn instance of VoidTeardown singleton object.\n\nSee also: VoidTeardown\n\n\n\n\n\n","category":"constant"},{"location":"operators/transformation/substitute/#operator_substitute","page":"substitute","title":"Substitute Operator","text":"","category":"section"},{"location":"operators/transformation/substitute/","page":"substitute","title":"substitute","text":"substitute\nSubstituteHandler","category":"page"},{"location":"operators/transformation/substitute/#Rocket.substitute","page":"substitute","title":"Rocket.substitute","text":"substitute(::Type{T}, mapFn::F, handler::SubstituteHandler) where { T, F <: Function }\n\nThis operator forces observable to substitute each emmited value with the latest computed value with the corresponding handler and release! function. After release! on handler substitute operator computes new value with mapFn but does not emit it until next emission from source observable. Always calls mapFn on first value from source observable.\n\nProducing\n\nStream of type <: Subscribable{T} \n\nExamples\n\nusing Rocket\n\nsubject = Subject(Int)\n\nhandler = SubstituteHandler()\nsource = subject |> substitute(String, i -> string(\"i = \", i), handler)\n\nsubscription = subscribe!(source, logger())\n\nnext!(subject, 1)\nnext!(subject, 2)\nnext!(subject, 3)\n\nrelease!(handler)\n\nnext!(subject, 4)\nnext!(subject, 5)\nnext!(subject, 6)\n\nunsubscribe!(subscription)\n;\n\n# output\n\n[LogActor] Data: i = 1\n[LogActor] Data: i = 1\n[LogActor] Data: i = 1\n[LogActor] Data: i = 3\n[LogActor] Data: i = 3\n[LogActor] Data: i = 3\n\nSee also: SubstituteHandler\n\n\n\n\n\n","category":"function"},{"location":"operators/transformation/substitute/#Rocket.SubstituteHandler","page":"substitute","title":"Rocket.SubstituteHandler","text":"SubstituteHandler()\n\nhandler used to release! new values in substitute operator.\n\nSee also: substitute\n\n\n\n\n\n","category":"type"},{"location":"operators/transformation/substitute/#See-also","page":"substitute","title":"See also","text":"","category":"section"},{"location":"operators/transformation/substitute/","page":"substitute","title":"substitute","text":"Operators","category":"page"},{"location":"operators/mathematical/about/#Mathematical-and-Aggregate-category","page":"About mathematical operators","title":"Mathematical and Aggregate category","text":"","category":"section"},{"location":"operators/mathematical/about/","page":"About mathematical operators","title":"About mathematical operators","text":"There are operators for different purposes, and they may be categorized as: creation, transformation, filtering, joining, multicasting, error handling, utility, etc. In the following list you will find all the operators organized in mathematical and aggregate category.","category":"page"},{"location":"operators/mathematical/about/","page":"About mathematical operators","title":"About mathematical operators","text":"count\nmax\nmin\nreduce\nsum","category":"page"},{"location":"operators/mathematical/about/#See-also","page":"About mathematical operators","title":"See also","text":"","category":"section"},{"location":"operators/mathematical/about/","page":"About mathematical operators","title":"About mathematical operators","text":"Operators","category":"page"},{"location":"operators/utility/async/#operator_ref_async","page":"async","title":"Async Operator","text":"","category":"section"},{"location":"operators/utility/async/","page":"async","title":"async","text":"async","category":"page"},{"location":"operators/utility/async/#Rocket.async","page":"async","title":"Rocket.async","text":"async(size::Int = typemax(Int))\n\nCreates an async operator, which sends items from the source Observable asynchronously.\n\nArguments\n\nsize: Asynchronous messages buffer size, default is a typemax(Int)\n\nProducing\n\nStream of type <: Subscribable{L} where L refers to type of source stream\n\nSee also: AbstractOperator, InferableOperator, ProxyObservable\n\n\n\n\n\n","category":"function"},{"location":"operators/utility/async/#See-also","page":"async","title":"See also","text":"","category":"section"},{"location":"operators/utility/async/","page":"async","title":"async","text":"Operators","category":"page"},{"location":"operators/transformation/enumerate/#operator_enumerate","page":"enumerate","title":"Enumerate Operator","text":"","category":"section"},{"location":"operators/transformation/enumerate/","page":"enumerate","title":"enumerate","text":"enumerate","category":"page"},{"location":"operators/transformation/enumerate/#Base.Iterators.enumerate","page":"enumerate","title":"Base.Iterators.enumerate","text":"enumerate()\n\nCreates an enumerate operator, which converts each value emitted by the source Observable into a tuple of its order number and the value itself.\n\nThe enumerate operator is similar to scan(Tuple{Int, Int}, (d, c) -> (d, c[2] + 1), (0, 0)) (see scan).\n\nProducing\n\nStream of type <: Subscribable{Tuple{Int, L}} where L refers to type of source stream\n\nExamples\n\nusing Rocket\n\nsource = from([ 0 for _ in 1:3 ])\nsubscribe!(source |> enumerate(), logger())\n;\n\n# output\n\n[LogActor] Data: (1, 0)\n[LogActor] Data: (2, 0)\n[LogActor] Data: (3, 0)\n[LogActor] Completed\n\n\nSee also: AbstractOperator, InferableOperator, ProxyObservable, scan, map, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/transformation/enumerate/#Description","page":"enumerate","title":"Description","text":"","category":"section"},{"location":"operators/transformation/enumerate/","page":"enumerate","title":"enumerate","text":"enumerate returns an Observable that converts each value emitted by the source Observable into a tuple of its order number and the value itself.","category":"page"},{"location":"operators/transformation/enumerate/#Example","page":"enumerate","title":"Example","text":"","category":"section"},{"location":"operators/transformation/enumerate/","page":"enumerate","title":"enumerate","text":"Get a value from the source with its order number","category":"page"},{"location":"operators/transformation/enumerate/","page":"enumerate","title":"enumerate","text":"using Rocket\n\nsource = from([ 0.0, 0.2, 0.4, 0.6, 0.8, 1.0 ])\nsubscribe!(source |> enumerate(), logger())\n\n# output\n\n[LogActor] Data: (0.0, 1)\n[LogActor] Data: (0.2, 2)\n[LogActor] Data: (0.4, 3)\n[LogActor] Data: (0.6, 4)\n[LogActor] Data: (0.8, 5)\n[LogActor] Data: (1.0, 6)\n[LogActor] Completed","category":"page"},{"location":"operators/transformation/enumerate/#See-also","page":"enumerate","title":"See also","text":"","category":"section"},{"location":"operators/transformation/enumerate/","page":"enumerate","title":"enumerate","text":"Operators, scan","category":"page"},{"location":"actors/types/sync/#actor_sync","page":"Sync","title":"Sync actor","text":"","category":"section"},{"location":"actors/types/sync/","page":"Sync","title":"Sync","text":"sync","category":"page"},{"location":"actors/types/sync/#Rocket.sync","page":"Sync","title":"Rocket.sync","text":"sync(actor::A; withlock::Bool = true, timeout::Int = -1) where A\nsync(factory::F; withlock::Bool = true, timeout::Int = -1) where { F <: AbstractActorFactory }\n\nCreation operator for the SyncActor actor. Accepts optional named timeout argument which specifies maximum number of milliseconds to wait (throws SyncActorTimedOutException() on timeout). Also accepts optional withlock boolean flag indicating that every next!, error! and complete! event should be guarded with ReentrantLock.\n\nExamples\n\nusing Rocket\n\nactor = keep(Int)\nsynced = sync(actor)\n\nsubscribe!(from(0:5, scheduler = AsyncScheduler()), synced)\n\nyield()\n\nwait(synced)\nshow(synced.actor.values)\n\n# output\n[0, 1, 2, 3, 4, 5]\n\nCan also be used with an <: AbstractActorFactory as an argument. In this case sync function will return a special actor factory object, which will store all created actors in array and wrap them with a sync function. wait(sync_factory) method will wait for all of the created actors to be completed in the order of creation (but only once for each of them).\n\nusing Rocket\n\nvalues = Int[]\n\nfactory = lambda(on_next = (d) -> push!(values, d))\nsynced = sync(factory)\n\nsubscribe!(from(0:5, scheduler = AsyncScheduler()), synced)\n\nyield()\n\nwait(synced)\nshow(values)\n\n# output\n[0, 1, 2, 3, 4, 5]\n\nSee also: SyncActor, AbstractActor\n\n\n\n\n\n","category":"function"},{"location":"actors/types/sync/","page":"Sync","title":"Sync","text":"SyncActor","category":"page"},{"location":"actors/types/sync/#Rocket.SyncActor","page":"Sync","title":"Rocket.SyncActor","text":"SyncActor{T, A}(actor::A; withlock::Bool = true, timeout::Int = -1) where { T, A }\n\nSync actor provides a synchronized interface to wait for an actor to be notified with a complete event. By default creates a re-entrant lock for synchronizing next!, error! and complete! events.\n\nSee also: Actor, sync\n\n\n\n\n\n","category":"type"},{"location":"operators/utility/limit_subscribers/#operator_limit_subscribers","page":"limit_subscribers","title":"LimitSubscribers Operator","text":"","category":"section"},{"location":"operators/utility/limit_subscribers/","page":"limit_subscribers","title":"limit_subscribers","text":"LimitSubscribersGuard\nlimit_subscribers","category":"page"},{"location":"operators/utility/limit_subscribers/#Rocket.LimitSubscribersGuard","page":"limit_subscribers","title":"Rocket.LimitSubscribersGuard","text":"LimitSubscribersGuard(limit::Int = 1, exclusive = true)\n\nGuard structure used in limit_subscribers operator.\n\nArguments\n\nlimit: number of concurrent subscribers\nexclusive: boolean flag, which indicates whenever this guard can be shared with other observables in other limit_subscribers operator. If set to true, reusing this guard in a different limit_subscribers operator for other observable will result in automatic unsubscription of all present actors.\n\nNote\n\nThis structure is useful in Pluto.jl notebooks in particular, allowing for automatic subscription/unsubscription of observables.\n\nExample\n\n\n# Cell 1\nguard = LimitSubscribersGuard()\n\n# Cell 2\nsubscription = subscribe!(some_stream |> limit_subscribers(guard), logger())\n\nSee also: limit_subscribers, subscribe!\n\n\n\n\n\n","category":"type"},{"location":"operators/utility/limit_subscribers/#Rocket.limit_subscribers","page":"limit_subscribers","title":"Rocket.limit_subscribers","text":"limit_subscribers(limit::Int = 1, exclusive::Bool = true)\nlimit_subscribers(guard::LimitSubscribersGuard)\n\nCreates an operator that limits number of concurrent actors to the given observable. On new subscription, if limit is exceeded, oldest actor is automatically unsubscribed and receives a completion event.\n\nArguments\n\nlimit: number of concurrent subscribers\nexclusive: boolean flag, which indicates whenever this guard can be shared with other observables in other limit_subscribers operator. If set to true, reusing this guard in a different limit_subscribers operator for other observable will result in automatic unsubscription of all present actors.\n\nNote\n\nThis structure is useful in Pluto.jl notebooks in particular, allowing for automatic subscription/unsubscription of observables.\n\nExample\n\n\n# Cell 1\nguard = LimitSubscribersGuard()\n\n# Cell 2\nsubscription = subscribe!(some_stream |> limit_subscribers(guard), logger())\n\nSee also: LimitSubscribersGuard\n\n\n\n\n\n","category":"function"},{"location":"operators/utility/limit_subscribers/#See-also","page":"limit_subscribers","title":"See also","text":"","category":"section"},{"location":"operators/utility/limit_subscribers/","page":"limit_subscribers","title":"limit_subscribers","text":"Operators","category":"page"},{"location":"operators/utility/skip_error/#operator_skip_error","page":"skip_error","title":"SkipError Operator","text":"","category":"section"},{"location":"operators/utility/skip_error/","page":"skip_error","title":"skip_error","text":"skip_error","category":"page"},{"location":"operators/utility/skip_error/#Rocket.skip_error","page":"skip_error","title":"Rocket.skip_error","text":"skip_error()\n\nCreates a skip_error operator, which filters out error event by the source Observable by emitting only next and complete messages.\n\nProducing\n\nStream of type <: Subscribable{L} where L refers to type of source stream\n\nExamples\n\nusing Rocket\n\nsource = faulted(\"error\")\nsubscribe!(source |> skip_error(), logger())\n;\n\n# output\n\n\nSee also: AbstractOperator, InferableOperator, ProxyObservable, skip_error, skip_complete, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/utility/skip_error/#See-also","page":"skip_error","title":"See also","text":"","category":"section"},{"location":"operators/utility/skip_error/","page":"skip_error","title":"skip_error","text":"Operators","category":"page"},{"location":"api/observables/#observables_api","page":"Observables","title":"Observables API","text":"","category":"section"},{"location":"api/observables/","page":"Observables","title":"Observables","text":"Any observable-like should implement a valid subscribable logic.","category":"page"},{"location":"api/observables/#Traits","page":"Observables","title":"Traits","text":"","category":"section"},{"location":"api/observables/","page":"Observables","title":"Observables","text":"as_subscribable\nSubscribableTrait\nSimpleSubscribableTrait\nScheduledSubscribableTrait\nInvalidSubscribableTrait","category":"page"},{"location":"api/observables/#Rocket.as_subscribable","page":"Observables","title":"Rocket.as_subscribable","text":"as_subscribable(any)\n\nThis function checks subscribable trait behavior specification. Can be used explicitly to specify subscribable trait behavior for any object.\n\nSee also: SubscribableTrait\n\n\n\n\n\n","category":"function"},{"location":"api/observables/#Rocket.SubscribableTrait","page":"Observables","title":"Rocket.SubscribableTrait","text":"Abstract type for all possible subscribable traits\n\nSee also: SimpleSubscribableTrait, ScheduledSubscribableTrait, InvalidSubscribableTrait\n\n\n\n\n\n","category":"type"},{"location":"api/observables/#Rocket.SimpleSubscribableTrait","page":"Observables","title":"Rocket.SimpleSubscribableTrait","text":"Simple subscribable trait behavior. Simple subscribable can be used in subscribe! function and just executes on_subscribe! method for provided subscribable. SimpleSubscribableTrait is a subtype of SubscribableTrait.\n\nSee also: SubscribableTrait, Subscribable, subscribe!, on_subscribe!\n\n\n\n\n\n","category":"type"},{"location":"api/observables/#Rocket.ScheduledSubscribableTrait","page":"Observables","title":"Rocket.ScheduledSubscribableTrait","text":"Scheduled subscribable trait behavior. Scheduled subscribable can be used in subscribe! function and executes on_subscribe! method for provided subscribable with custom scheduling. ScheduledSubscribableTrait is a subtype of SubscribableTrait.\n\nSee also: SubscribableTrait, ScheduledSubscribable, subscribe!, on_subscribe!\n\n\n\n\n\n","category":"type"},{"location":"api/observables/#Rocket.InvalidSubscribableTrait","page":"Observables","title":"Rocket.InvalidSubscribableTrait","text":"Default subscribable trait behavior for all types. Invalid subscribable cannot be used in subscribe! function, doing so will throw an error. InvalidSubscribableTrait is a subtype of SubscribableTrait.\n\nSee also: SubscribableTrait, subscribe!\n\n\n\n\n\n","category":"type"},{"location":"api/observables/#Types","page":"Observables","title":"Types","text":"","category":"section"},{"location":"api/observables/","page":"Observables","title":"Observables","text":"AbstractSubscribable\nSubscribable\nScheduledSubscribable\nsubscribe!\non_subscribe!","category":"page"},{"location":"api/observables/#Rocket.AbstractSubscribable","page":"Observables","title":"Rocket.AbstractSubscribable","text":"Supertype type for Subscribable and ScheduledSubscribable types.\n\nSee also: Subscribable, ScheduledSubscribable\n\n\n\n\n\n","category":"type"},{"location":"api/observables/#Rocket.Subscribable","page":"Observables","title":"Rocket.Subscribable","text":"Super type for any simple subscribable object. Automatically specifies a SimpleSubscribableTrait trait behavior. Objects with specified SimpleSubscribableTrait subscribable trait must implement: on_subscribe!(subscribable, actor) method. Subscribable is a subtype of AbstractSubscribable type.\n\nExamples\n\nusing Rocket\n\nstruct MySubscribable <: Subscribable{String} end\n\nRocket.as_subscribable(MySubscribable)\n\n# output\n\nSimpleSubscribableTrait{String}()\n\nSee also: SubscribableTrait, SimpleSubscribableTrait\n\n\n\n\n\n","category":"type"},{"location":"api/observables/#Rocket.ScheduledSubscribable","page":"Observables","title":"Rocket.ScheduledSubscribable","text":"Super type for any scheduled subscribable object. Automatically specifies a ScheduledSubscribableTrait trait behavior. Objects with specified ScheduledSubscribableTrait subscribable trait must implement: on_subscribe!(subscribable, actor, scheduler) method. ScheduledSubscribable is a subtype of AbstractSubscribable type.\n\nExamples\n\nusing Rocket\n\nstruct MyScheduledSubscribable <: ScheduledSubscribable{String} end\n\nRocket.as_subscribable(MyScheduledSubscribable)\n\n# output\n\nScheduledSubscribableTrait{String}()\n\nSee also: SubscribableTrait, ScheduledSubscribableTrait\n\n\n\n\n\n","category":"type"},{"location":"api/observables/#Rocket.subscribe!","page":"Observables","title":"Rocket.subscribe!","text":"subscribe!(subscribable::T, actor::S) where { T, S }\nsubscribe!(subscribable::T, factory::F) where { T, F <: AbstractActorFactory }\nsubscribe!(subscriptions::Tuple)\nsubscribe!(subscriptions::AbstractVector)\n\nsubscribe! function is used to attach an actor to subscribable. It also checks types of subscribable and actors to be a valid Subscribable and Actor objects respectively. Passing not valid subscribable or/and actor object will throw an error. If the input argument to the subscribe! function is either a tuple or a vector, it will first check that all of the arguments are valid source and actor objects and if its true will subscribe for each of them individually. \n\nArguments\n\nsubscribable: valid subscribable object\nactor: valid actor object\n\nExamples\n\nusing Rocket\n\nsource = from((1, 2, 3))\nsubscribe!(source, logger())\n;\n\n# output\n\n[LogActor] Data: 1\n[LogActor] Data: 2\n[LogActor] Data: 3\n[LogActor] Completed\n\nusing Rocket\n\nsource = from((1, 2, 3))\nsubscribe!(source, 1)\n;\n\n# output\n\nERROR: Type Int64 is not a valid actor type.\n[...]\n\nusing Rocket\n\nsource = from((1, 2, 3))\nsubscribe!(1, logger())\n;\n\n# output\n\nERROR: Type Int64 is not a valid subscribable type.\n[...]\n\nSee also: on_subscribe!, as_subscribable\n\n\n\n\n\n","category":"function"},{"location":"api/observables/#Rocket.on_subscribe!","page":"Observables","title":"Rocket.on_subscribe!","text":"on_subscribe!(subscribable, actor)\non_subscribe!(subscribable, actor, scheduler)\n\nEvery valid subscribable object have to define its own method for on_subscribe! function which specifies subscription logic and has return a valid Teardown object.\n\nObjects with specified SimpleSubscribableTrait subscribable trait must implement: on_subscribe!(subscribable, actor) method. Objects with specified ScheduledSubscribableTrait subscribable trait must implement: on_subscribe!(subscribable, actor, scheduler) method.\n\nArguments\n\nsubscribable: Subscribable object\nactor: Actor object\nscheduler: Scheduler object (only for scheduled subscribables)\n\nExamples\n\nusing Rocket\n\nstruct MySubscribable <: Subscribable{Int} end\n\nfunction Rocket.on_subscribe!(subscribable::MySubscribable, actor)\n next!(actor, 0)\n complete!(actor)\n return voidTeardown\nend\n\nsubscribe!(MySubscribable(), logger())\n;\n\n# output\n\n[LogActor] Data: 0\n[LogActor] Completed\n\nusing Rocket\n\nstruct MyScheduledSubscribable <: ScheduledSubscribable{Int} end\n\nRocket.getscheduler(::MyScheduledSubscribable) = AsapScheduler()\n\nfunction Rocket.on_subscribe!(subscribable::MyScheduledSubscribable, actor, scheduler)\n next!(actor, 0, scheduler)\n complete!(actor, scheduler)\n return voidTeardown\nend\n\nsubscribe!(MyScheduledSubscribable(), logger())\n;\n\n# output\n\n[LogActor] Data: 0\n[LogActor] Completed\n\nSee also: Subscribable, ScheduledSubscribable, SimpleSubscribableTrait, ScheduledSubscribableTrait, Teardown, logger\n\n\n\n\n\n","category":"function"},{"location":"api/observables/#Errors","page":"Observables","title":"Errors","text":"","category":"section"},{"location":"api/observables/","page":"Observables","title":"Observables","text":"InvalidSubscribableTraitUsageError\nInconsistentActorWithSubscribableDataTypesError\nMissingOnSubscribeImplementationError\nMissingOnScheduledSubscribeImplementationError","category":"page"},{"location":"api/observables/#Rocket.InvalidSubscribableTraitUsageError","page":"Observables","title":"Rocket.InvalidSubscribableTraitUsageError","text":"This error will be thrown if subscribe! function is called with invalid subscribable object\n\nSee also: subscribe!\n\n\n\n\n\n","category":"type"},{"location":"api/observables/#Rocket.InconsistentActorWithSubscribableDataTypesError","page":"Observables","title":"Rocket.InconsistentActorWithSubscribableDataTypesError","text":"This error will be thrown if subscribe! function is called with inconsistent subscribable and actor objects\n\nSee also: subscribe!\n\n\n\n\n\n","category":"type"},{"location":"api/observables/#Rocket.MissingOnSubscribeImplementationError","page":"Observables","title":"Rocket.MissingOnSubscribeImplementationError","text":"This error will be thrown if Julia cannot find specific method of 'on_subscribe!()' function for given subscribable and actor\n\nSee also: on_subscribe!\n\n\n\n\n\n","category":"type"},{"location":"api/observables/#Rocket.MissingOnScheduledSubscribeImplementationError","page":"Observables","title":"Rocket.MissingOnScheduledSubscribeImplementationError","text":"This error will be thrown if Julia cannot find specific method of 'on_subscribe!()' function for given subscribable, actor and scheduler\n\nSee also: on_subscribe!\n\n\n\n\n\n","category":"type"},{"location":"operators/mathematical/sum/#operator_sum","page":"sum","title":"Sum Operator","text":"","category":"section"},{"location":"operators/mathematical/sum/","page":"sum","title":"sum","text":"sum","category":"page"},{"location":"operators/mathematical/sum/#Base.sum","page":"sum","title":"Base.sum","text":"sum(; from = nothing)\n\nCreates a sum operator, which applies a sum accumulator function over the source Observable, and returns the accumulated result when the source completes, given an optional initial value.\n\nThe sum operator is similar to reduce(T, T, +) (see reduce).\n\nArguments\n\nfrom: optional initial accumulation value, if nothing first value will be used instead\n\nProducing\n\nStream of type <: Subscribable{L} where L refers to type of source stream\n\nExamples\n\nusing Rocket\n\nsource = from([ i for i in 1:42 ])\nsubscribe!(source |> sum(), logger())\n;\n\n# output\n\n[LogActor] Data: 903\n[LogActor] Completed\n\n\nusing Rocket\n\nsource = from([ i for i in 1:42 ])\nsubscribe!(source |> sum(from = 97), logger())\n;\n\n# output\n\n[LogActor] Data: 1000\n[LogActor] Completed\n\n\nSee also: AbstractOperator, InferableOperator, ProxyObservable, reduce, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/mathematical/sum/#Description","page":"sum","title":"Description","text":"","category":"section"},{"location":"operators/mathematical/sum/","page":"sum","title":"sum","text":"sum operates on an Observable of objects on which + is defined. When the source Observable completes, it emits the sum of all previous items. The sum operator is similar to reduce(T, T, +) (see reduce).","category":"page"},{"location":"operators/mathematical/sum/#See-also","page":"sum","title":"See also","text":"","category":"section"},{"location":"operators/mathematical/sum/","page":"sum","title":"sum","text":"Operators, reduce","category":"page"},{"location":"actors/types/void/#actor_void","page":"Void","title":"Void actor","text":"","category":"section"},{"location":"actors/types/void/","page":"Void","title":"Void","text":"void","category":"page"},{"location":"actors/types/void/#Rocket.void","page":"Void","title":"Rocket.void","text":"void()\nvoid(::Type{T}) where T\n\nCreation operator for the VoidActor actor.\n\nExamples\n\nusing Rocket\n\nactor = void(Int)\nactor isa VoidActor{Int}\n\n# output\ntrue\n\n\nSee also: VoidActor, AbstractActor\n\n\n\n\n\n","category":"function"},{"location":"actors/types/void/","page":"Void","title":"Void","text":"VoidActor","category":"page"},{"location":"actors/types/void/#Rocket.VoidActor","page":"Void","title":"Rocket.VoidActor","text":"VoidActor{D}() where D\n\nVoid actor does nothing with input data, error and complete events, can be useful for debugging (e.g. to start side-effects with tap operator)\n\nExamples\n\nusing Rocket\n\nsource = from([ 0, 1, 2 ])\nactor = VoidActor{Int}()\n\nsubscribe!(source, actor)\n;\n\n# output\n\n\nSee also: Actor, void, tap\n\n\n\n\n\n","category":"type"},{"location":"observables/types/proxy/#observable_proxy","page":"Proxy","title":"Proxy Observable","text":"","category":"section"},{"location":"observables/types/proxy/","page":"Proxy","title":"Proxy","text":"ProxyObservable might help to create a custom operator. It wraps either source and/or actor with their proxied versions providing additional custom logic for on_subscribe! and/or for on_next!, on_error!, on_complete! methods.","category":"page"},{"location":"observables/types/proxy/","page":"Proxy","title":"Proxy","text":"proxy\nProxyObservable","category":"page"},{"location":"observables/types/proxy/#Rocket.proxy","page":"Proxy","title":"Rocket.proxy","text":"proxy(::Type{L}, source, proxy) where L\n\nCreation operator for the ProxyObservable with a given source and proxy objects.\n\nExample\n\nusing Rocket\n\nsource = from(1:5)\n\nstruct MyCustomProxy <: ActorProxy end\n\nstruct MyCustomActor{A} <: Actor{Int}\n actor :: A\nend\n\nRocket.on_next!(actor::MyCustomActor, data::Int) = next!(actor.actor, data ^ 2)\nRocket.on_error!(actor::MyCustomActor, err) = error!(actor.actor, err)\nRocket.on_complete!(actor::MyCustomActor) = complete!(actor.actor)\n\nRocket.actor_proxy!(::Type{Int}, proxy::MyCustomProxy, actor::A) where A = MyCustomActor{A}(actor)\n\nproxied = proxy(Int, source, MyCustomProxy())\n\nsubscribe!(proxied, logger())\n;\n\n# output\n\n[LogActor] Data: 1\n[LogActor] Data: 4\n[LogActor] Data: 9\n[LogActor] Data: 16\n[LogActor] Data: 25\n[LogActor] Completed\n\nSee also: ProxyObservable, ActorProxy, SourceProxy, ActorSourceProxy\n\n\n\n\n\n","category":"function"},{"location":"observables/types/proxy/#Rocket.ProxyObservable","page":"Proxy","title":"Rocket.ProxyObservable","text":"ProxyObservable{L, S, P}(proxied_source::S, proxy::P)\n\nAn interface for proxied Observables.\n\nSee also: proxy\n\n\n\n\n\n","category":"type"},{"location":"observables/types/proxy/","page":"Proxy","title":"Proxy","text":"ActorProxy\nSourceProxy\nActorSourceProxy","category":"page"},{"location":"observables/types/proxy/#Rocket.ActorProxy","page":"Proxy","title":"Rocket.ActorProxy","text":"ActorProxy\n\nCan be used as a super type for common proxy object. Automatically specifies ValidActorProxy trait behavior. Each ActorProxy must implement its own method for actor_proxy!(::Type, proxy, actor) function which have to return a valid actor object.\n\nSee also: proxy, actor_proxy!\n\n\n\n\n\n","category":"type"},{"location":"observables/types/proxy/#Rocket.SourceProxy","page":"Proxy","title":"Rocket.SourceProxy","text":"SourceProxy\n\nCan be used as a super type for common proxy object. Automatically specifies ValidSourceProxy trait behavior. Each SourceProxy must implement its own method for source_proxy!(::Type, proxy, source) function which have to return a valid subscribable object.\n\nSee also: proxy, source_proxy!\n\n\n\n\n\n","category":"type"},{"location":"observables/types/proxy/#Rocket.ActorSourceProxy","page":"Proxy","title":"Rocket.ActorSourceProxy","text":"ActorSourceProxy\n\nCan be used as a super type for common proxy object. Automatically specifies ValidActorSourceProxy trait behavior. Each ActorSourceProxy must implement its own method for source_proxy!(::Type, proxy, source) function which have to return a valid subscribable object and also for actor_proxy!(::Type, proxy, actor) function which have to return a valid actor object..\n\nSee also: proxy, actor_proxy!, source_proxy!\n\n\n\n\n\n","category":"type"},{"location":"observables/types/proxy/","page":"Proxy","title":"Proxy","text":"actor_proxy!\nsource_proxy!","category":"page"},{"location":"observables/types/proxy/#Rocket.actor_proxy!","page":"Proxy","title":"Rocket.actor_proxy!","text":"actor_proxy!(::Type, proxy, actor)\n\nThis is function is used to wrap an actor with its proxied version given a particular proxy object. Must return another actor. Each valid ActorProxy and ActorSourceProxy must implement its own method for actor_proxy! function. The first argument is the same as the type of data of the connected proxy observable.\n\nSee also: proxy, ActorProxy, ActorSourceProxy\n\n\n\n\n\n","category":"function"},{"location":"observables/types/proxy/#Rocket.source_proxy!","page":"Proxy","title":"Rocket.source_proxy!","text":"source_proxy!(::Type, proxy, source)\n\nThis is function is used to wrap a source with its proxied version given a particular proxy object. Must return another Observable. Each valid SourceProxy and ActorSourceProxy must implement its own method for source_proxy! function. The first argument is the same as the type of data of the connected proxy observable.\n\nSee also: proxy, SourceProxy, ActorSourceProxy\n\n\n\n\n\n","category":"function"},{"location":"operators/transformation/to_array/#operator_to_array","page":"to_array","title":"Uppercase Operator","text":"","category":"section"},{"location":"operators/transformation/to_array/","page":"to_array","title":"to_array","text":"to_array","category":"page"},{"location":"operators/transformation/to_array/#Rocket.to_array","page":"to_array","title":"Rocket.to_array","text":"to_array()\n\nCreates a to_array operator, which reduces all values into a single array and returns this result when the source completes.\n\nProducing\n\nStream of type <: Subscribable{Vector{L}} where L refers to type of source stream\n\nExamples\n\nusing Rocket\n\nsource = from([ 1, 2, 3 ])\nsubscribe!(source |> to_array(), logger())\n;\n\n# output\n\n[LogActor] Data: [1, 2, 3]\n[LogActor] Completed\n\n\nSee also: AbstractOperator, InferableOperator, ProxyObservable, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/transformation/to_array/#See-also","page":"to_array","title":"See also","text":"","category":"section"},{"location":"operators/transformation/to_array/","page":"to_array","title":"to_array","text":"Operators, map, lowercase","category":"page"},{"location":"operators/transformation/about/#Transformation-category","page":"About transformation operators","title":"Transformation category","text":"","category":"section"},{"location":"operators/transformation/about/","page":"About transformation operators","title":"About transformation operators","text":"There are operators for different purposes, and they may be categorized as: creation, transformation, filtering, joining, multicasting, error handling, utility, etc. In the following list you will find all the operators organized in transformation category.","category":"page"},{"location":"operators/transformation/about/","page":"About transformation operators","title":"About transformation operators","text":"map\nmap_to\nscan\naccumulated\nenumerate\nuppercase\nlowercase\nto_array\nswitch_map\nswitch_map_to\nmerge_map\nconcat_map\nconcat_map_to\nexhaust_map\nstart_with\npairwise\nsubstitute\noverride","category":"page"},{"location":"operators/transformation/about/#See-also","page":"About transformation operators","title":"See also","text":"","category":"section"},{"location":"operators/transformation/about/","page":"About transformation operators","title":"About transformation operators","text":"Operators","category":"page"}] } diff --git a/v1.7.2/subjects/about/index.html b/v1.7.2/subjects/about/index.html index a5a88d2fa..7318e8ae6 100644 --- a/v1.7.2/subjects/about/index.html +++ b/v1.7.2/subjects/about/index.html @@ -1,5 +1,5 @@ -Subject · Rocket.jl

      About subjects

      An Rocket.jl Subject is a special type of Observable that allows values to be multicasted to many Actors. While plain Observables are unicast (each subscribed Actor owns an independent execution of the Observable), Subjects are multicast.

      Note

      A Subject is like an Observable, but can multicast to many Actors. Subjects are like event emitters: they maintain a registry of many listeners.

      Every Subject is an Observable. Given a Subject, you can subscribe to it, providing an Actor, which will start receiving values normally. From the perspective of the Actor, it cannot tell whether the Observable execution is coming from a plain unicast Observable or a Subject.

      Internally to the Subject, subscribe does not invoke a new execution that delivers values. Instead, it simply registers the given Actor in a list of Actors.

      Every Subject is an Actor itself. It is an object with the methods next!, error!, and complete!. Call next!(subject, theValue) to feed a new value to the Subject, and it will be multicasted to the Actors that listen to the Subject.

      In the example below, we have two Observers attached to a Subject, and we feed some values to the Subject:

      using Rocket
      +Subject · Rocket.jl

      About subjects

      A Rocket.jl Subject is a special type of Observable that allows values to be multicasted to many Actors. While plain Observables are unicast (each subscribed Actor owns an independent execution of the Observable), Subjects are multicast.

      Note

      A Subject is like an Observable, but can multicast to many Actors. Subjects are like event emitters: they maintain a registry of many listeners.

      Every Subject is an Observable. Given a Subject, you can subscribe to it, providing an Actor, which will start receiving values normally. From the perspective of the Actor, it cannot tell whether the Observable execution is coming from a plain unicast Observable or a Subject.

      Internally to the Subject, subscribe! does not invoke a new execution that delivers values. Instead, it simply registers the given Actor in a list of Actors.

      Every Subject is an Actor itself. It is an object with the methods next!, error!, and complete!. Call next!(subject, theValue) to feed a new value to the Subject, and it will be multicasted to the Actors that listen to the Subject.

      In the example below, we have two Observers attached to a Subject, and we feed some values to the Subject:

      using Rocket
       
       source = Subject(Int)
       
      @@ -40,7 +40,7 @@
       # Actor 1: 2
       # Actor 2: 2
       # Actor 1: 3
      -# Actor 2: 3

      Here, we essentially convert a unicast Observable execution to multicast, through the Subject. This demonstrates how Subjects offer a unique way to share Observable execution with multiple Observers.

      Schedulers

      Subject (and some other observables) uses scheduler objects to schedule message delivery to their listeners.

      Synchronous scheduler

      One of the variants of schedulers is the AsapScheduler, which delivers every message synchronously. AsapScheduler is a default scheduler for all Subject objects.

      Rocket.AsapSchedulerType
      AsapScheduler

      AsapScheduler executes scheduled actions as soon as possible and does not introduce any additional logic. AsapScheduler is a default scheduler for almost all observables.

      source
      using Rocket
      +# Actor 2: 3

      Here, we essentially convert a unicast Observable execution to multicast, through the Subject. This demonstrates how Subjects offer a unique way to share Observable execution with multiple Observers.

      Schedulers

      A Subject (and some other observables) uses scheduler objects to schedule message delivery to their listeners.

      Synchronous scheduler

      One of the variants of schedulers is the AsapScheduler, which delivers every message synchronously. AsapScheduler is a default scheduler for all Subject objects.

      Rocket.AsapSchedulerType
      AsapScheduler

      AsapScheduler executes scheduled actions as soon as possible and does not introduce any additional logic. AsapScheduler is a default scheduler for almost all observables.

      source
      using Rocket
       
       subject = Subject(Int, scheduler = AsapScheduler())
       
      @@ -61,7 +61,7 @@
       # [Actor 1] Data: 2
       # After next
       # [Actor 1] Data: 3
      -# [Actor 2] Data: 3

      Asynchronous Scheduler

      An AsyncScheduler is similar to a AsapScheduler. Both allows for Subject to scheduler their messages for multiple listeners, but a AsyncScheduler delivers all messages asynchronously (but still ordered) using a Julia's built-in Task object.

      Rocket.AsyncSchedulerType
      AsyncScheduler

      AsyncScheduler executes scheduled actions asynchronously and uses Channel object to order different actions on a single asynchronous task

      source
      using Rocket
      +# [Actor 2] Data: 3

      Asynchronous Scheduler

      An AsyncScheduler is similar to a AsapScheduler. Both allows for Subject to scheduler their messages for multiple listeners, but a AsyncScheduler delivers all messages asynchronously (but still ordered) using a Julia's built-in Task object.

      Rocket.AsyncSchedulerType
      AsyncScheduler

      AsyncScheduler executes scheduled actions asynchronously and uses Channel object to order different actions on a single asynchronous task

      source
      using Rocket
       
       subject = Subject(Int, scheduler = AsyncScheduler())
       
      @@ -83,4 +83,4 @@
       # [Actor 1] Data: 2
       # [Actor 1] Data: 3
       # [Actor 2] Data: 3
      -
      +
      diff --git a/v1.7.2/subjects/types/behavior/index.html b/v1.7.2/subjects/types/behavior/index.html index eac3b385c..a2fcd8529 100644 --- a/v1.7.2/subjects/types/behavior/index.html +++ b/v1.7.2/subjects/types/behavior/index.html @@ -1,9 +1,9 @@ -Behavior · Rocket.jl

      BehaviorSubject

      Rocket.BehaviorSubjectFunction
      BehaviorSubject(value::D) where D
      +Behavior · Rocket.jl

      BehaviorSubject

      Rocket.BehaviorSubjectFunction
      BehaviorSubject(value::D) where D
       BehaviorSubject(::Type{D}, value) where D
       BehaviorSubject(::Type{D}, value, factory::F) where { D, F <: AbstractSubjectFactory }
      -BehaviorSubject(::Type{D}, value, subject::S) where { D, S }

      A variant of Subject that requires an initial value and emits its current value whenever it is subscribed to.

      See also: BehaviorSubjectFactory, Subject, SubjectFactory

      source

      Description

      One of the variants of Subjects is the BehaviorSubject, which has a notion of "the current value". It stores the latest value emitted to its consumers, and whenever a new Observer subscribes, it will immediately receive the "current value" from the BehaviorSubject.

      Note

      BehaviorSubjects are useful for representing "values over time". For instance, an event stream of birthdays is a Subject, but the stream of a person's age would be a BehaviorSubject.

      Examples

      In the following example, the BehaviorSubject is initialized with the value 0 which the first Observer receives when it subscribes. The second Observer receives the value 2 even though it subscribed after the value 2 was sent.

      using Rocket
      +BehaviorSubject(::Type{D}, value, subject::S) where { D, S }

      A variant of Subject that requires an initial value and emits its current value whenever it is subscribed to.

      See also: BehaviorSubjectFactory, Subject, SubjectFactory

      source

      Description

      One of the variants of Subjects is the BehaviorSubject, which has a notion of "the current value". It stores the latest value emitted to its consumers, and whenever a new Observer subscribes, it will immediately receive the "current value" from the BehaviorSubject.

      Note

      BehaviorSubjects are useful for representing "values over time". For instance, an event stream of birthdays is a Subject, but the stream of a person's age would be a BehaviorSubject.

      Examples

      In the following example, the BehaviorSubject is initialized with the value 0 which the first Observer receives when it subscribes. The second Observer receives the value 2 even though it subscribed after the value 2 was sent.

      using Rocket
       
       subject = BehaviorSubject(Int, 0)
       
      @@ -25,4 +25,4 @@
       // [1] Data: 2
       // [2] Data: 2
       // [1] Data: 3
      -// [2] Data: 3
      +// [2] Data: 3 diff --git a/v1.7.2/subjects/types/pending/index.html b/v1.7.2/subjects/types/pending/index.html index e57216ec0..7f628cd69 100644 --- a/v1.7.2/subjects/types/pending/index.html +++ b/v1.7.2/subjects/types/pending/index.html @@ -1,8 +1,8 @@ -Pending · Rocket.jl

      PendingSubject

      Rocket.PendingSubjectFunction
      PendingSubject(::Type{D}) where D
      +Pending · Rocket.jl

      PendingSubject

      Rocket.PendingSubjectFunction
      PendingSubject(::Type{D}) where D
       PendingSubject(::Type{D}, factory::F) where { D, F <: AbstractFactory }
      -PendingSubject(::Type{D}, subject::S) where { D, S }

      A variant of Subject that emits its last value on completion. Reemits last value on further subscriptions and then completes.

      See also: PendingSubjectFactory, Subject, SubjectFactory

      source

      Description

      A variant of Subject that only emits a value when it completes. It will emit its latest value to all its observers on completion. It will reemit its latest value to all new observers on further subscription and then complete. It is not possible to overwrite last value after completion.

      Examples

      using Rocket
      +PendingSubject(::Type{D}, subject::S) where { D, S }

      A variant of Subject that emits its last value on completion. Reemits last value on further subscriptions and then completes.

      See also: PendingSubjectFactory, Subject, SubjectFactory

      source

      Description

      A variant of Subject that only emits a value when it completes. It will emit its latest value to all its observers on completion. It will reemit its latest value to all new observers on further subscription and then complete. It is not possible to overwrite last value after completion.

      Examples

      using Rocket
       
       subject = PendingSubject(Int)
       
      @@ -24,4 +24,4 @@
       [1] Completed
       [2] Completed
       [3] Data: 3
      -[3] Completed
      +[3] Completed diff --git a/v1.7.2/subjects/types/recent/index.html b/v1.7.2/subjects/types/recent/index.html index 5ce028fae..b491c65a6 100644 --- a/v1.7.2/subjects/types/recent/index.html +++ b/v1.7.2/subjects/types/recent/index.html @@ -1,8 +1,8 @@ -Recent · Rocket.jl

      RecentSubject

      Rocket.RecentSubjectFunction
      RecentSubject(::Type{D}) where D
      +Recent · Rocket.jl

      RecentSubject

      Rocket.RecentSubjectFunction
      RecentSubject(::Type{D}) where D
       RecentSubject(::Type{D}, factory::F) where { D, F <: AbstractSubjectFactory }
      -RecentSubject(::Type{D}, subject::S) where { D, S }

      A variant of Subject that emits its recent value whenever it is subscribed to.

      See also: RecentSubjectFactory, Subject, SubjectFactory

      source

      Description

      One of the variants of Subjects is the RecentSubject, which has a notion of "the recent value". It stores the latest value emitted to its consumers, and whenever a new Observer subscribes, it will immediately receive the "recent value" from the RecentSubject.

      Note

      RecentSubjects is a more efficient version of ReplaySubjects with replay size equal to one.

      Examples

      In the following example, after RecentSubject is initialized the first Observer receives nothing when it subscribes. The second Observer receives the value 2 even though it subscribed after the value 2 was sent.

      using Rocket
      +RecentSubject(::Type{D}, subject::S) where { D, S }

      A variant of Subject that emits its recent value whenever it is subscribed to.

      See also: RecentSubjectFactory, Subject, SubjectFactory

      source

      Description

      One of the variants of Subjects is the RecentSubject, which has a notion of "the recent value". It stores the latest value emitted to its consumers, and whenever a new Observer subscribes, it will immediately receive the "recent value" from the RecentSubject.

      Note

      RecentSubjects is a more efficient version of ReplaySubjects with replay size equal to one.

      Examples

      In the following example, after RecentSubject is initialized the first Observer receives nothing when it subscribes. The second Observer receives the value 2 even though it subscribed after the value 2 was sent.

      using Rocket
       
       subject = RecentSubject(Int)
       
      @@ -23,4 +23,4 @@
       // [1] Data: 2
       // [2] Data: 2
       // [1] Data: 3
      -// [2] Data: 3
      +// [2] Data: 3 diff --git a/v1.7.2/subjects/types/replay/index.html b/v1.7.2/subjects/types/replay/index.html index 444b47c2b..94116a942 100644 --- a/v1.7.2/subjects/types/replay/index.html +++ b/v1.7.2/subjects/types/replay/index.html @@ -1,8 +1,8 @@ -Replay · Rocket.jl

      ReplaySubject

      Rocket.ReplaySubjectFunction
      ReplaySubject(::Type{D}, size::Int) where D
      +Replay · Rocket.jl

      ReplaySubject

      Rocket.ReplaySubjectFunction
      ReplaySubject(::Type{D}, size::Int) where D
       ReplaySubject(::Type{D}, size::Int, factory::F) where { D, F <: AbstractSubjectFactory }
      -ReplaySubject(::Type{D}, size::Int, subject::S) where { D, S }

      A variant of Subject that "replays" or emits old values to new subscribers. It buffers a set number of values and will emit those values immediately to any new subscribers in addition to emitting new values to existing subscribers.

      See also: ReplaySubjectFactory, Subject, SubjectFactory

      source

      Description

      A ReplaySubject is similar to a BehaviorSubject in that it can send old values to new subscribers, but it can also record a part of the Observable execution.

      Note

      A ReplaySubject records multiple values from the Observable execution and replays them to new subscribers.

      Examples

      When creating a ReplaySubject, you can specify how many values to replay:

      using Rocket
      +ReplaySubject(::Type{D}, size::Int, subject::S) where { D, S }

      A variant of Subject that "replays" or emits old values to new subscribers. It buffers a set number of values and will emit those values immediately to any new subscribers in addition to emitting new values to existing subscribers.

      See also: ReplaySubjectFactory, Subject, SubjectFactory

      source

      Description

      A ReplaySubject is similar to a BehaviorSubject in that it can send old values to new subscribers, but it can also record a part of the Observable execution.

      Note

      A ReplaySubject records multiple values from the Observable execution and replays them to new subscribers.

      Examples

      When creating a ReplaySubject, you can specify how many values to replay:

      using Rocket
       
       subject = ReplaySubject(Int, 3) # buffer 3 values for new subscribers
       
      @@ -29,4 +29,4 @@
       // [2] Data: 3
       // [2] Data: 4
       // [1] Data: 5
      -// [2] Data: 5
      +// [2] Data: 5 diff --git a/v1.7.2/subjects/types/subject/index.html b/v1.7.2/subjects/types/subject/index.html index 80f0448fd..d881480e0 100644 --- a/v1.7.2/subjects/types/subject/index.html +++ b/v1.7.2/subjects/types/subject/index.html @@ -1,5 +1,5 @@ -Subject · Rocket.jl

      Subject

      Rocket.SubjectType
      Subject(::Type{D}; scheduler::H = AsapScheduler())

      A Subject is a special type of Observable that allows values to be multicasted to many Observers. Subjects are like EventEmitters. Every Subject is an Observable and an Actor. You can subscribe to a Subject, and you can call next! to feed values as well as error! and complete!.

      Note: By convention, every actor subscribed to a Subject observable is not allowed to throw exceptions during next!, error! and complete! calls. Doing so would lead to undefined behaviour. Use safe() operator to bypass this rule.

      See also: SubjectFactory, ReplaySubject, BehaviorSubject, safe

      source

      Description

      Every Subject is an Observable. Given a Subject, you can subscribe to it, providing an Actor, which will start receiving values normally. From the perspective of the Observer, it cannot tell whether the Observable execution is coming from a plain unicast Observable or a Subject.

      Internally to the Subject, subscribe does not invoke a new execution that delivers values. It simply registers the given Observer in a list of Observers.

      Every Subject is an Actor. It is an object with the methods next!, error!, and complete!. To feed a new value to the Subject, just call next!(subject, theValue), and it will be multicasted to the Actors registered to listen to the Subject.

      Note

      By convention, every actor subscribed to a Subject observable is not allowed to throw exceptions during next!, error! and complete! calls. Doing so would lead to undefined behaviour. Use safe() operator to bypass this rule.

      Examples

      In the following example, the BehaviorSubject is initialized with the value 0 which the first Observer receives when it subscribes. The second Observer receives the value 2 even though it subscribed after the value 2 was sent.

      using Rocket
      +Subject · Rocket.jl

      Subject

      Rocket.SubjectType
      Subject(::Type{D}; scheduler::H = AsapScheduler())

      A Subject is a special type of Observable that allows values to be multicasted to many Observers. Subjects are like EventEmitters. Every Subject is an Observable and an Actor. You can subscribe to a Subject, and you can call next! to feed values as well as error! and complete!.

      Note: By convention, every actor subscribed to a Subject observable is not allowed to throw exceptions during next!, error! and complete! calls. Doing so would lead to undefined behaviour. Use safe() operator to bypass this rule.

      See also: SubjectFactory, ReplaySubject, BehaviorSubject, safe

      source

      Description

      Every Subject is an Observable. Given a Subject, you can subscribe to it, providing an Actor, which will start receiving values normally. From the perspective of the Observer, it cannot tell whether the Observable execution is coming from a plain unicast Observable or a Subject.

      Internally to the Subject, subscribe does not invoke a new execution that delivers values. It simply registers the given Observer in a list of Observers.

      Every Subject is an Actor. It is an object with the methods next!, error!, and complete!. To feed a new value to the Subject, just call next!(subject, theValue), and it will be multicasted to the Actors registered to listen to the Subject.

      Note

      By convention, every actor subscribed to a Subject observable is not allowed to throw exceptions during next!, error! and complete! calls. Doing so would lead to undefined behaviour. Use safe() operator to bypass this rule.

      Examples

      In the following example, the BehaviorSubject is initialized with the value 0 which the first Observer receives when it subscribes. The second Observer receives the value 2 even though it subscribed after the value 2 was sent.

      using Rocket
       
       subject = Subject(Int)
       
      @@ -19,4 +19,4 @@
       // [1] Data: 1
       // [1] Data: 2
       // [1] Data: 3
      -// [2] Data: 3
      +// [2] Data: 3
      diff --git a/v1.7.2/teardown/about/index.html b/v1.7.2/teardown/about/index.html index fff6566d4..d16cb98d6 100644 --- a/v1.7.2/teardown/about/index.html +++ b/v1.7.2/teardown/about/index.html @@ -1,5 +1,5 @@ -Subscription · Rocket.jl

      Subscription

      A Subscription represents a disposable resource, usually the execution of an Observable. A Subscription has one important method: unsubscribe!(teardown), which takes some teardown logic object as one argument and disposes the resource held by the subscription.

      using Rocket
      +Subscription · Rocket.jl

      Subscription

      A Subscription represents a disposable resource, usually the execution of an Observable. A Subscription has one important method: unsubscribe!(teardown), which takes some teardown logic object as one argument and disposes the resource held by the subscription.

      using Rocket
       
       source = Subject(Int)
       
      @@ -11,7 +11,7 @@
       
       unsubscribe!(subscription)
       
      -next!(source, 2) # Logs nothing as a single one actor has unsubscribed
      Note

      A Subscription essentially just has its own specific method for unsubscribe!() function which releases resources or cancel Observable executions. Any Observable has to return a valid Teardown object.

      unsubscribe! function also supports multiple unsubscriptions at once. If the input argument to the unsubscribe! function is either a tuple or a vector, it will first check that all of the arguments are valid subscription objects and if its true will unsubscribe from each of them individually.

      
      +next!(source, 2) # Logs nothing as a single one actor has unsubscribed
      Note

      A Subscription essentially just has its own specific method for unsubscribe!() function which releases resources or cancel Observable executions. Any Observable has to return a valid Teardown object.

      The unsubscribe! function also supports multiple unsubscriptions at once. If the input argument to the unsubscribe! function is either a tuple or a vector, it will first check that all of the arguments are valid subscription objects and if this is true it will unsubscribe from each of them individually.

      
       source = Subject(Int)
       
       subscription1 = subscribe!(source, logger())
      @@ -21,4 +21,4 @@
       
       # or similarly
       # unsubscribe!([ subscription1, subscription2 ])
      -

      For more information about subscription and teardown logic see the API Section

      +

      For more information about subscription and teardown logic see the API Section

      diff --git a/v1.7.2/teardown/types/void/index.html b/v1.7.2/teardown/types/void/index.html index 56e232fb6..c848eaa54 100644 --- a/v1.7.2/teardown/types/void/index.html +++ b/v1.7.2/teardown/types/void/index.html @@ -1,2 +1,2 @@ -Void · Rocket.jl
      +Void · Rocket.jl
      diff --git a/v1.7.2/todo/index.html b/v1.7.2/todo/index.html index 829811df3..086d52c45 100644 --- a/v1.7.2/todo/index.html +++ b/v1.7.2/todo/index.html @@ -1,2 +1,2 @@ -TODO · Rocket.jl

      TODO

      This package in under development and some features of the reactive framework not yet implemented.

      +TODO · Rocket.jl

      TODO

      This package in under development and some features of the reactive framework not yet implemented.

      diff --git a/v1.7.2/utils/index.html b/v1.7.2/utils/index.html index 589d05826..af12e461c 100644 --- a/v1.7.2/utils/index.html +++ b/v1.7.2/utils/index.html @@ -1,5 +1,5 @@ -Utils · Rocket.jl

      Utils

      Rocket.setTimeoutFunction
      setTimeout(f::Function, timeout::Int)

      Creates a Task which will asynchornously invoke fucntion f after specified timeout time in milliseconds.

      Arguments

      • f::Function, function to be invoked asynchronously
      • timeout::Int, timeout in milliseconds

      Examples

      using Rocket
      +Utils · Rocket.jl

      Utils

      Rocket.setTimeoutFunction
      setTimeout(f::Function, timeout::Int)

      Creates a Task which will asynchornously invoke fucntion f after specified timeout time in milliseconds.

      Arguments

      • f::Function, function to be invoked asynchronously
      • timeout::Int, timeout in milliseconds

      Examples

      using Rocket
       using Dates
       
       println("Before: ", Dates.format(now(), "MM:SS"))
      @@ -12,9 +12,9 @@
       # Logs
       # Before: 20:59
       # Right after: 20:59
      -# Inside: 21:00
      source
      Rocket.combined_typeFunction
      combined_type(sources)

      Returns a Tuple el-type of observable el-types in sources argument in the same order

      source
      Rocket.union_typeFunction
      union_type(sources)

      Returns a Union el-type of observable el-types in sources argument

      source

      Helpers

      Rocket.@MStorageMacro
      @MStorage(n::Int)

      Helper function to generate tuple-like structure MStorageN, but with mutable fields and empty constructor. It is possible then to take a snapshot(::MStorage) which returns a tuple with the same types and values from storage. Some operators and observables use pregenerated MStorage to instatiate uninitialized mutable storage in case when stream is allowed to not emit any values before completion.

      Generated structure layout

      struct MStorageN{V1, V2, ..., VN}
      +# Inside: 21:00
      source
      Rocket.combined_typeFunction
      combined_type(sources)

      Returns a Tuple el-type of observable el-types in sources argument in the same order

      source
      Rocket.union_typeFunction
      union_type(sources)

      Returns a Union el-type of observable el-types in sources argument

      source

      Helpers

      Rocket.@MStorageMacro
      @MStorage(n::Int)

      Helper function to generate tuple-like structure MStorageN, but with mutable fields and empty constructor. It is possible then to take a snapshot(::MStorage) which returns a tuple with the same types and values from storage. Some operators and observables use pregenerated MStorage to instatiate uninitialized mutable storage in case when stream is allowed to not emit any values before completion.

      Generated structure layout

      struct MStorageN{V1, V2, ..., VN}
           v1 :: V1
           v2 :: V2
           ...
           vn :: VN
      -end

      See also: setstorage!

      source
      Rocket.setstorage!Function
      setstorage!(s, v, ::Val{I}) where I

      This function can be used to set a new value v for storage s with a given value v and index I. Using parametrized Val{I} for indexing ensures for index to be resolved at compile-time and if-else branch optimization.

      See also: @MStorage

      source
      +end

      See also: setstorage!

      source
      Rocket.setstorage!Function
      setstorage!(s, v, ::Val{I}) where I

      This function can be used to set a new value v for storage s with a given value v and index I. Using parametrized Val{I} for indexing ensures for index to be resolved at compile-time and if-else branch optimization.

      See also: @MStorage

      source
      diff --git a/v1.7.3/.documenter-siteinfo.json b/v1.7.3/.documenter-siteinfo.json new file mode 100644 index 000000000..a8eff5941 --- /dev/null +++ b/v1.7.3/.documenter-siteinfo.json @@ -0,0 +1 @@ +{"documenter":{"julia_version":"1.9.4","generation_timestamp":"2024-02-13T10:52:28","documenter_version":"1.2.1"}} \ No newline at end of file diff --git a/v1.7.3/actors/about/index.html b/v1.7.3/actors/about/index.html new file mode 100644 index 000000000..8ae46f56d --- /dev/null +++ b/v1.7.3/actors/about/index.html @@ -0,0 +1,72 @@ + +Actor · Rocket.jl

      Actors

      An Actor is the most primitive unit of computation: it receives a message and performs a computation.

      An actor is analogous to an object in an object-oriented languages. An object receives a message (a method call) and does something depending on which message it receives (the method we are calling). The main difference is that actors are completely isolated from each other, and they will never share memory. It’s also worth mentioning that an actor can maintain a private state that should never be changed directly by another actor.

      For a quick introduction to Actor models, see this article.

      The API of Rocket.jl's Actors is similar to RxJS subscribers.

      First example

      The following example implements an Actor that retains each received value from an Observable.

      using Rocket
      +
      +struct CustomKeepActor <: Actor{Int}
      +    values::Vector{Int}
      +
      +    CustomKeepActor() = new(Vector{Int}())
      +end
      +
      +Rocket.on_next!(actor::CustomKeepActor, data::Int) = push!(actor.values, data)
      +Rocket.on_error!(actor::CustomKeepActor, err)      = error(err)
      +Rocket.on_complete!(actor::CustomKeepActor)        = println("Completed!")
      +
      +source     = from([ 1, 2, 3 ])
      +keep_actor = CustomKeepActor()
      +subscribe!(source, keep_actor)
      +
      +# Logs
      +# Completed!
      +
      +println(keep_actor.values)
      +
      +# Logs
      +# [1, 2, 3]

      An actor may be not interested in the values itself, but merely the completion of an event. In this case, Rocket.jl provides a CompletionActor abstract type. See also NextActor and ErrorActor.

      using Rocket
      +
      +struct CompletionNotificationActor <: CompletionActor{Int} end
      +
      +Rocket.on_complete!(::CompletionNotificationActor) = println("Completed!")
      +
      +source = from([ 1, 2, 3 ])
      +subscribe!(source, CompletionNotificationActor());
      +
      +# Logs
      +# Completed

      It is also possible to use Julia's multiple dispatch feature and dispatch on type of the event

      using Rocket
      +
      +struct MyCustomActor <: NextActor{Any} end
      +
      +Rocket.on_next!(::MyCustomActor, data::Int)     = println("Int: $data")
      +Rocket.on_next!(::MyCustomActor, data::Float64) = println("Float64: $data")
      +Rocket.on_next!(::MyCustomActor, data)          = println("Something else: $data")
      +
      +source = from([ 1, 1.0, "string" ])
      +subscribe!(source, MyCustomActor());
      +
      +# Logs
      +# Int: 1
      +# Float64: 1.0
      +# Something else: string
      +

      Lambda actor

      For debugging purposes it may be convenient to work with a LambdaActor. This provides an interface that defines callbacks for "next", "error" and "complete" events. But this generic actor does not allow to dispatch on the type of the event.

      using Rocket
      +
      +source = from([1, 2, 3])
      +
      +subscribe!(source, lambda(
      +    on_next     = (d) -> println(d),
      +    on_error    = (e) -> error(e),
      +    on_complete = ()  -> println("Completed")
      +))
      +
      +# Logs
      +# 1
      +# 2
      +# 3
      +# Completed

      Function actor

      Sometimes it is convenient to pass only on_next callback. Rocket.jl provides a FunctionActor which automatically converts any function object passed in the subscribe! function to a proper actor which listens only for data events, throws an exception on error event and ignores completion message.

      using Rocket
      +
      +source = from([1, 2, 3])
      +
      +subscribe!(source, (d) -> println(d))
      +
      +# Logs
      +# 1
      +# 2
      +# 3
      diff --git a/v1.7.3/actors/types/buffer/index.html b/v1.7.3/actors/types/buffer/index.html new file mode 100644 index 000000000..7ee7d6dbf --- /dev/null +++ b/v1.7.3/actors/types/buffer/index.html @@ -0,0 +1,17 @@ + +Buffer · Rocket.jl

      Buffer actor

      Rocket.bufferFunction
      buffer(::Type{T}, size::Int) where T

      Arguments

      • ::Type{T}: Type of data in buffer
      • size::Int: size of buffer

      Creation operator for the BufferActor actor.

      Examples

      using Rocket
      +
      +actor = buffer(Int, 3)
      +actor isa BufferActor{Int}
      +
      +# output
      +true

      See also: BufferActor, AbstractActor

      source
      Rocket.BufferActorType
      BufferActor{D}() where D

      Buffer actor provides a storage actor. It copies last incoming successful next events in a values array, throws an ErrorException on error! event and does nothing on completion event. Note: Actor does not check the size of incoming data.

      Examples

      using Rocket
      +
      +source = of([ 1, 2, 3 ])
      +actor  = buffer(Int, 3)
      +
      +subscribe!(source, actor)
      +show(getvalues(actor))
      +
      +# output
      +[1, 2, 3]

      See also: Actor, buffer

      source
      diff --git a/v1.7.3/actors/types/circularkeep/index.html b/v1.7.3/actors/types/circularkeep/index.html new file mode 100644 index 000000000..fed6969a7 --- /dev/null +++ b/v1.7.3/actors/types/circularkeep/index.html @@ -0,0 +1,17 @@ + +CircularKeep · Rocket.jl

      CircularKeep actor

      Rocket.circularkeepFunction
      circularkeep(::Type{T}, capacity::Int) where T

      Arguments

      • ::Type{T}: Type of keep data
      • capacity::Int: circular buffer capacity

      Creation operator for the CircularKeepActor actor.

      Examples

      using Rocket
      +
      +actor = circularkeep(Int, 3)
      +actor isa CircularKeepActor{Int}
      +
      +# output
      +true

      See also: CircularKeepActor, AbstractActor

      source
      Rocket.CircularKeepActorType
      CirucalKeepActor{D}() where D

      Circual keep actor is similar to keep actor, but uses CircularBuffer as a storage. It saves all incoming successful next events in a values circular buffer, throws an ErrorException on error! event and does nothing on completion event.

      Examples

      using Rocket
      +
      +source = from(1:5)
      +actor  = circularkeep(Int, 3)
      +
      +subscribe!(source, actor)
      +show(getvalues(actor))
      +
      +# output
      +[3, 4, 5]

      See also: Actor, keep, circularkeep

      source
      diff --git a/v1.7.3/actors/types/function/index.html b/v1.7.3/actors/types/function/index.html new file mode 100644 index 000000000..c9048516d --- /dev/null +++ b/v1.7.3/actors/types/function/index.html @@ -0,0 +1,13 @@ + +Function · Rocket.jl

      Function actor

      Rocket.FunctionActorType
      FunctionActor{D} <: Actor{D}

      FunctionActor provides a simple interface to use a single function as a next! callback, error! callback throws an ErrorException and complete! callback does nothing. Should not be used explicitly because it will be created automatically when passing a Function object as an actor in subscribe! function.

      Examples

      using Rocket
      +
      +source = from(1:5)
      +subscribe!(source, (t) -> println(t))
      +;
      +
      +# output
      +1
      +2
      +3
      +4
      +5

      See also: Actor, subscribe!

      source
      diff --git a/v1.7.3/actors/types/keep/index.html b/v1.7.3/actors/types/keep/index.html new file mode 100644 index 000000000..8d107cd27 --- /dev/null +++ b/v1.7.3/actors/types/keep/index.html @@ -0,0 +1,17 @@ + +Keep · Rocket.jl

      Keep actor

      Rocket.keepFunction
      keep(::Type{T}) where T

      Arguments

      • ::Type{T}: Type of keep data

      Creation operator for the KeepActor actor.

      Examples

      using Rocket
      +
      +actor = keep(Int)
      +actor isa KeepActor{Int}
      +
      +# output
      +true

      See also: KeepActor, AbstractActor

      source
      Rocket.KeepActorType
      KeepActor{D}() where D

      Keep actor provides a storage actor. It saves all incoming successful next events in a values array, throws an ErrorException on error! event and does nothing on completion event.

      Examples

      using Rocket
      +
      +source = from(1:5)
      +actor  = keep(Int)
      +
      +subscribe!(source, actor)
      +show(getvalues(actor))
      +
      +# output
      +[1, 2, 3, 4, 5]

      See also: Actor, keep

      source
      diff --git a/v1.7.3/actors/types/lambda/index.html b/v1.7.3/actors/types/lambda/index.html new file mode 100644 index 000000000..76a90f55f --- /dev/null +++ b/v1.7.3/actors/types/lambda/index.html @@ -0,0 +1,9 @@ + +Lambda · Rocket.jl

      Lambda actor

      Rocket.lambdaFunction
      lambda(; on_next = nothing, on_error = nothing, on_complete = nothing)
      +lambda(::Type{T}; on_next = nothing, on_error = nothing, on_complete = nothing) where T

      Creation operator for the 'LambdaActor' actor.

      Examples

      using Rocket
      +
      +actor = lambda(Int; on_next = (d) -> println(d))
      +actor isa LambdaActor{Int}
      +
      +# output
      +true

      See also: LambdaActor, AbstractActor

      source
      Rocket.LambdaActorType
      LambdaActor{D, N, E, C}(on_next::N, on_error::E, on_complete::C) where D

      Lambda actor wraps on_next, on_error, on_complete callbacks for data, error and complete events. Should not be used explicitly, use lambda creation operator instead.

      Constructor arguments

      • on_next: Callback for data event. Optional. Default is nothing.
      • on_error: Callback for error event. Optional. Default is nothing.
      • on_complete: Callback for complete event. Optional. Default is nothing.

      See also: Actor, lambda

      source
      diff --git a/v1.7.3/actors/types/logger/index.html b/v1.7.3/actors/types/logger/index.html new file mode 100644 index 000000000..2786928aa --- /dev/null +++ b/v1.7.3/actors/types/logger/index.html @@ -0,0 +1,39 @@ + +Logger · Rocket.jl

      Logger actor

      Rocket.loggerFunction
      logger([ io::IO ], name::String = "LogActor")
      +logger(::Type{T}, [ io::IO ], name::String = "LogActor") where T

      Creation operator for the LoggerActor actor.

      Examples

      using Rocket
      +
      +source = from([ 0, 1, 2 ])
      +subscribe!(source, logger())
      +;
      +
      +# output
      +
      +[LogActor] Data: 0
      +[LogActor] Data: 1
      +[LogActor] Data: 2
      +[LogActor] Completed
      using Rocket
      +
      +source = from([ 0, 1, 2 ])
      +subscribe!(source, logger("CustomName"))
      +;
      +
      +# output
      +
      +[CustomName] Data: 0
      +[CustomName] Data: 1
      +[CustomName] Data: 2
      +[CustomName] Completed
      using Rocket
      +
      +buffer = IOBuffer()
      +
      +source = from([ 0, 1, 2 ])
      +subscribe!(source, logger(buffer, "CustomBuffer"))
      +;
      +
      +print(String(take!(buffer)))
      +# output
      +
      +[CustomBuffer] Data: 0
      +[CustomBuffer] Data: 1
      +[CustomBuffer] Data: 2
      +[CustomBuffer] Completed

      See also: LoggerActor, AbstractActor

      source
      Rocket.LoggerActorType
      LoggerActor{D}(name::String = "LogActor", io::O) where { D, O }

      The LoggerActor logs all next!/error!/complete! events that are sent from an Observable.

      Constructor arguments

      • name: name of the logger. Optional. Default is LogActor.
      • io: io stream to log in, maybe nothing to write to stdout

      See also: Actor, logger

      source
      diff --git a/v1.7.3/actors/types/server/index.html b/v1.7.3/actors/types/server/index.html new file mode 100644 index 000000000..54f60f9c2 --- /dev/null +++ b/v1.7.3/actors/types/server/index.html @@ -0,0 +1,5 @@ + +Server · Rocket.jl

      Server actor

      Rocket.serverFunction
      server(port::Int)
      +server(address::A, port::Int) where { A <: IPAddr }
      +server(::Type{D}, port::Int)
      +server(::Type{D}, address::A, port::Int) where { A <: IPAddr }

      Creation operator for the ServerActor actor.

      See also: AbstractActor

      source
      Rocket.ServerActorType
      ServerActor{D, Address, Port}() where D

      The ServerActor sends all next!/error!/complete! events to the local network listeners with specified Address and Port parameters via TCPSocket.

      See also: Actor, server

      source
      diff --git a/v1.7.3/actors/types/storage/index.html b/v1.7.3/actors/types/storage/index.html new file mode 100644 index 000000000..4492b6dea --- /dev/null +++ b/v1.7.3/actors/types/storage/index.html @@ -0,0 +1,17 @@ + +Storage · Rocket.jl

      Storage actor

      Rocket.storageFunction
      storage(::Type{T}) where T

      Arguments

      • ::Type{T}: Type of storage data

      Creation operator for the StorageActor actor.

      Examples

      using Rocket
      +
      +actor = storage(Int)
      +actor isa StorageActor{Int}
      +
      +# output
      +true

      See also: StorageActor, AbstractActor

      source
      Rocket.StorageActorType
      StorageActor{D}() where D

      Storage actor provides an actor that stores a single (last) value passed to the next! callback. It saves last incoming successful next event in the value field, throws an ErrorException on error! event and does nothing on completion event. Before any events value initialised with nothing.

      Examples

      using Rocket
      +
      +source = from(1:5)
      +actor  = storage(Int)
      +
      +subscribe!(source, actor)
      +show(getvalues(actor))
      +
      +# output
      +5

      See also: Actor, storage

      source
      diff --git a/v1.7.3/actors/types/sync/index.html b/v1.7.3/actors/types/sync/index.html new file mode 100644 index 000000000..f2a5033eb --- /dev/null +++ b/v1.7.3/actors/types/sync/index.html @@ -0,0 +1,31 @@ + +Sync · Rocket.jl

      Sync actor

      Rocket.syncFunction
      sync(actor::A; withlock::Bool = true, timeout::Int = -1) where A
      +sync(factory::F; withlock::Bool = true, timeout::Int = -1) where { F <: AbstractActorFactory }

      Creation operator for the SyncActor actor. Accepts optional named timeout argument which specifies maximum number of milliseconds to wait (throws SyncActorTimedOutException() on timeout). Also accepts optional withlock boolean flag indicating that every next!, error! and complete! event should be guarded with ReentrantLock.

      Examples

      using Rocket
      +
      +actor  = keep(Int)
      +synced = sync(actor)
      +
      +subscribe!(from(0:5, scheduler = AsyncScheduler()), synced)
      +
      +yield()
      +
      +wait(synced)
      +show(synced.actor.values)
      +
      +# output
      +[0, 1, 2, 3, 4, 5]

      Can also be used with an <: AbstractActorFactory as an argument. In this case sync function will return a special actor factory object, which will store all created actors in array and wrap them with a sync function. wait(sync_factory) method will wait for all of the created actors to be completed in the order of creation (but only once for each of them).

      using Rocket
      +
      +values = Int[]
      +
      +factory  = lambda(on_next = (d) -> push!(values, d))
      +synced   = sync(factory)
      +
      +subscribe!(from(0:5, scheduler = AsyncScheduler()), synced)
      +
      +yield()
      +
      +wait(synced)
      +show(values)
      +
      +# output
      +[0, 1, 2, 3, 4, 5]

      See also: SyncActor, AbstractActor

      source
      Rocket.SyncActorType
      SyncActor{T, A}(actor::A; withlock::Bool = true, timeout::Int = -1) where { T, A }

      Sync actor provides a synchronized interface to wait for an actor to be notified with a complete event. By default creates a re-entrant lock for synchronizing next!, error! and complete! events.

      See also: Actor, sync

      source
      diff --git a/v1.7.3/actors/types/void/index.html b/v1.7.3/actors/types/void/index.html new file mode 100644 index 000000000..efbca7bfc --- /dev/null +++ b/v1.7.3/actors/types/void/index.html @@ -0,0 +1,19 @@ + +Void · Rocket.jl

      Void actor

      Rocket.voidFunction
      void()
      +void(::Type{T}) where T

      Creation operator for the VoidActor actor.

      Examples

      using Rocket
      +
      +actor = void(Int)
      +actor isa VoidActor{Int}
      +
      +# output
      +true
      +

      See also: VoidActor, AbstractActor

      source
      Rocket.VoidActorType
      VoidActor{D}() where D

      Void actor does nothing with input data, error and complete events, can be useful for debugging (e.g. to start side-effects with tap operator)

      Examples

      using Rocket
      +
      +source = from([ 0, 1, 2 ])
      +actor  = VoidActor{Int}()
      +
      +subscribe!(source, actor)
      +;
      +
      +# output
      +

      See also: Actor, void, tap

      source
      diff --git a/v1.7.3/api/actors/index.html b/v1.7.3/api/actors/index.html new file mode 100644 index 000000000..452b21248 --- /dev/null +++ b/v1.7.3/api/actors/index.html @@ -0,0 +1,54 @@ + +Actors · Rocket.jl

      Actors API

      How to create a custom Actor

      At first custom actor should implement a custom method for the as_actor function. Rocket.jl also provides a number of helper actor abstract types with predefined as_actor method behavior (see Traits API section).

      using Rocket
      +
      +struct MyCustomActor end
      +
      +as_actor(::Type{<:MyCustomActor}) = Rocket.BaseActorTrait{Int}()
      +

      or

      using Rocket
      +
      +struct MyCustomActor <: Actor{Int} end # Automatically specifies BaseActorTrait{Int} behavior.

      Additionally custom actor must provide a custom methods for on_next!, on_error! and/or on_complete! functions. Depending on specified actor trait behavior some methods may or may not be optional.

      using Rocket
      +
      +struct MyCustomActor <: Actor{Int} end
      +
      +Rocket.on_next!(actor::MyCustomActor, data::Int)  = # custom logic here
      +Rocket.on_error!(actor::MyCustomActor, err)       = # custom logic here
      +Rocket.on_complete!(actor::MyCustomActor)         = # custom logic here

      or

      using Rocket
      +
      +struct MyCustomCompletionActor <: CompletionActor{Int} end
      +
      +Rocket.on_complete!(actor::MyCustomCompletionActor) = # custom logic here

      Traits

      Rocket.as_actorFunction
      as_actor(any)

      This function checks actor trait behavior specification. May be used explicitly to specify actor trait behavior for any object.

      See also: ActorTrait

      source
      Rocket.BaseActorTraitType

      Base actor trait specifies actor to listen for all next!, error! and complete! events. BaseActorTrait is a subtype of ActorTrait.

      See also: Actor

      source
      Rocket.InvalidActorTraitType

      Default actor trait behavior for any object. Actor with such a trait specificaion cannot be used as a valid actor in subscribe! function. Doing so will raise an error. InvalidActorTrait is a subtype of ActorTrait.

      See also: ActorTrait

      source

      Types

      Rocket.ActorType

      Can be used as a super type for common actor. Automatically specifies a BaseActorTrait trait behavior. Every Actor must implement its own methods for on_next!(actor, data), on_error!(actor, err) and on_complete!(actor) functions. Actor is a subtype of AbstractActor type.

      Examples

      using Rocket
      +
      +struct MyActor <: Actor{String} end
      +
      +Rocket.as_actor(MyActor)
      +
      +# output
      +
      +BaseActorTrait{String}()

      See also: AbstractActor, as_actor, BaseActorTrait, ActorTrait, on_next!, on_error!, on_complete!

      source
      Rocket.NextActorType

      Can be used as a super type for "next-only" actor. Automatically specifies a NextActorTrait trait behavior. Every NextActor must implement its own methods for on_next!(actor, data) function only. NextActor is a subtype of AbstractActor type.

      Examples

      using Rocket
      +
      +struct MyNextActor <: NextActor{String} end
      +
      +Rocket.as_actor(MyNextActor)
      +
      +# output
      +
      +NextActorTrait{String}()

      See also: AbstractActor, as_actor, NextActorTrait, ActorTrait, on_next!

      source
      Rocket.ErrorActorType

      Can be used as a super type for "error-only" actor. Automatically specifies a ErrorActorTrait trait behavior. Every ErrorActor must implement its own methods for on_error!(actor, err) function only. ErrorActor is a subtype of AbstractActor type.

      Examples

      using Rocket
      +
      +struct MyErrorActor <: ErrorActor{String} end
      +
      +Rocket.as_actor(MyErrorActor)
      +
      +# output
      +
      +ErrorActorTrait{String}()

      See also: AbstractActor, as_actor, ErrorActorTrait, ActorTrait, on_error!

      source
      Rocket.CompletionActorType

      Can be used as a super type for "completion-only" actor. Automatically specifies a CompletionActorTrait trait behavior. Every CompletionActor must implement its own methods for on_complete!(actor) function only. CompletionActor is a subtype of AbstractActor type.

      Examples

      using Rocket
      +
      +struct MyCompletionActor <: CompletionActor{String} end
      +
      +Rocket.as_actor(MyCompletionActor)
      +
      +# output
      +
      +CompletionActorTrait{String}()

      See also: AbstractActor, as_actor, CompletionActorTrait, ActorTrait, on_complete!

      source

      Events

      Rocket.next!Function
      next!(actor, data)
      +next!(actor, data, scheduler)

      This function is used to deliver a "next" event to an actor with some data. Takes optional scheduler object to schedule execution of data delivery.

      See also: AbstractActor, on_next!

      source
      Rocket.error!Function
      error!(actor, err)
      +error!(actor, err, scheduler)

      This function is used to deliver a "error" event to an actor with some err. Takes optional scheduler object to schedule execution of error delivery.

      See also: AbstractActor, on_error!

      source
      Rocket.complete!Function
      complete!(actor)
      +complete!(actor, scheduler)

      This function is used to deliver a "complete" event to an actor. Takes optional scheduler object to schedule execution of complete event delivery.

      See also: AbstractActor, on_complete!

      source
      Rocket.on_next!Function
      on_next!(actor, data)

      Both Actor and NextActor objects must implement its own method for on_next! function which will be called on "next" event.

      See also: Actor, NextActor

      source
      Rocket.on_error!Function
      on_error!(actor, err)

      Both Actor and ErrorActor objects must implement its own method for on_error! function which will be called on "error" event.

      See also: Actor, ErrorActor

      source
      Rocket.on_complete!Function
      on_complete!(actor)

      Both Actor and CompletionActor objects must implement its own method for on_complete! function which will be called on "complete" event.

      See also: Actor, CompletionActor

      source

      Factory

      Errors

      diff --git a/v1.7.3/api/observables/index.html b/v1.7.3/api/observables/index.html new file mode 100644 index 000000000..08ebfd545 --- /dev/null +++ b/v1.7.3/api/observables/index.html @@ -0,0 +1,85 @@ + +Observables · Rocket.jl

      Observables API

      Any observable-like should implement a valid subscribable logic.

      Traits

      Rocket.as_subscribableFunction
      as_subscribable(any)

      This function checks subscribable trait behavior specification. Can be used explicitly to specify subscribable trait behavior for any object.

      See also: SubscribableTrait

      source

      Types

      Rocket.SubscribableType

      Super type for any simple subscribable object. Automatically specifies a SimpleSubscribableTrait trait behavior. Objects with specified SimpleSubscribableTrait subscribable trait must implement: on_subscribe!(subscribable, actor) method. Subscribable is a subtype of AbstractSubscribable type.

      Examples

      using Rocket
      +
      +struct MySubscribable <: Subscribable{String} end
      +
      +Rocket.as_subscribable(MySubscribable)
      +
      +# output
      +
      +SimpleSubscribableTrait{String}()

      See also: SubscribableTrait, SimpleSubscribableTrait

      source
      Rocket.ScheduledSubscribableType

      Super type for any scheduled subscribable object. Automatically specifies a ScheduledSubscribableTrait trait behavior. Objects with specified ScheduledSubscribableTrait subscribable trait must implement: on_subscribe!(subscribable, actor, scheduler) method. ScheduledSubscribable is a subtype of AbstractSubscribable type.

      Examples

      using Rocket
      +
      +struct MyScheduledSubscribable <: ScheduledSubscribable{String} end
      +
      +Rocket.as_subscribable(MyScheduledSubscribable)
      +
      +# output
      +
      +ScheduledSubscribableTrait{String}()

      See also: SubscribableTrait, ScheduledSubscribableTrait

      source
      Rocket.subscribe!Function
      subscribe!(subscribable::T, actor::S)   where { T, S }
      +subscribe!(subscribable::T, factory::F) where { T, F <: AbstractActorFactory }
      +subscribe!(subscriptions::Tuple)
      +subscribe!(subscriptions::AbstractVector)

      subscribe! function is used to attach an actor to subscribable. It also checks types of subscribable and actors to be a valid Subscribable and Actor objects respectively. Passing not valid subscribable or/and actor object will throw an error. If the input argument to the subscribe! function is either a tuple or a vector, it will first check that all of the arguments are valid source and actor objects and if its true will subscribe for each of them individually.

      Arguments

      • subscribable: valid subscribable object
      • actor: valid actor object

      Examples

      using Rocket
      +
      +source = from((1, 2, 3))
      +subscribe!(source, logger())
      +;
      +
      +# output
      +
      +[LogActor] Data: 1
      +[LogActor] Data: 2
      +[LogActor] Data: 3
      +[LogActor] Completed
      using Rocket
      +
      +source = from((1, 2, 3))
      +subscribe!(source, 1)
      +;
      +
      +# output
      +
      +ERROR: Type Int64 is not a valid actor type.
      +[...]
      using Rocket
      +
      +source = from((1, 2, 3))
      +subscribe!(1, logger())
      +;
      +
      +# output
      +
      +ERROR: Type Int64 is not a valid subscribable type.
      +[...]

      See also: on_subscribe!, as_subscribable

      source
      Rocket.on_subscribe!Function
      on_subscribe!(subscribable, actor)
      +on_subscribe!(subscribable, actor, scheduler)

      Every valid subscribable object have to define its own method for on_subscribe! function which specifies subscription logic and has return a valid Teardown object.

      Objects with specified SimpleSubscribableTrait subscribable trait must implement: on_subscribe!(subscribable, actor) method. Objects with specified ScheduledSubscribableTrait subscribable trait must implement: on_subscribe!(subscribable, actor, scheduler) method.

      Arguments

      • subscribable: Subscribable object
      • actor: Actor object
      • scheduler: Scheduler object (only for scheduled subscribables)

      Examples

      using Rocket
      +
      +struct MySubscribable <: Subscribable{Int} end
      +
      +function Rocket.on_subscribe!(subscribable::MySubscribable, actor)
      +    next!(actor, 0)
      +    complete!(actor)
      +    return voidTeardown
      +end
      +
      +subscribe!(MySubscribable(), logger())
      +;
      +
      +# output
      +
      +[LogActor] Data: 0
      +[LogActor] Completed
      using Rocket
      +
      +struct MyScheduledSubscribable <: ScheduledSubscribable{Int} end
      +
      +Rocket.getscheduler(::MyScheduledSubscribable) = AsapScheduler()
      +
      +function Rocket.on_subscribe!(subscribable::MyScheduledSubscribable, actor, scheduler)
      +    next!(actor, 0, scheduler)
      +    complete!(actor, scheduler)
      +    return voidTeardown
      +end
      +
      +subscribe!(MyScheduledSubscribable(), logger())
      +;
      +
      +# output
      +
      +[LogActor] Data: 0
      +[LogActor] Completed

      See also: Subscribable, ScheduledSubscribable, SimpleSubscribableTrait, ScheduledSubscribableTrait, Teardown, logger

      source

      Errors

      diff --git a/v1.7.3/api/operators/index.html b/v1.7.3/api/operators/index.html new file mode 100644 index 000000000..b35c8bc43 --- /dev/null +++ b/v1.7.3/api/operators/index.html @@ -0,0 +1,211 @@ + +Operators · Rocket.jl

      Operators API

      How to create a custom operator

      If you need to write an operator that cannot be made from a combination of existing operators, then you can write a custom operator from scratch.

      Each operator (e.g. MyFancyOperator) needs to either be (1) a subtype of one of abstract OperatorTrait trait types, or (2) define a

      Rocket.as_operator(::Type{<:MyFancyOperator}) = TypedOperatorTrait{T, R}()
      +# or
      +Rocket.as_operator(::Type{<:MyFancyOperator}) = InferableOperatorTrait()

      trait behavior.

      In addition, an operator must implement a specific method for on_call! function with custom logic which has to return another Observable as a result of applying MyFancyOperator to a source.

      Rocket.on_call!(::Type{L}, ::Type{R}, operator::MyFancyOperator, source) where L = # some custom logic here
      +
      +# or
      +# for inferable trait types you have to specify 'right' type with Rocket.operator_right which should specify a type of data of produced Observable
      +
      +Rocket.on_call(::Type{L}, ::Type{R}, operator::MyFancyOperator, source) where L = # some custom logic here
      +Rocket.operator_right(::MyFancyOperator, ::Type{L}) where L = R # where R should be an actual type, Int or even L itself e.g.
      +
      Note

      It is not allowed to modify the source Observable in any way; you have to return a new observable.

      See more examples on custom operators in Traits API section

      Note

      It might be useful to return a ProxyObservable from an on_call! function. ProxyObservable is a special Observable which proxying actors with the source and/or source with actors.

      Traits

      Rocket.TypedOperatorTraitType

      Typed operator trait specifies operator to be statically typed with input and output data types. Typed operator with input type L and output type R can only operate on input Observable with data type L and will always produce an Observable with data type R.

      Examples

      using Rocket
      +
      +struct MyTypedOperator <: TypedOperator{Int, Int} end
      +
      +function Rocket.on_call!(::Type{Int}, ::Type{Int}, op::MyTypedOperator, source)
      +    return proxy(Int, source, MyTypedOperatorProxy())
      +end
      +
      +struct MyTypedOperatorProxy <: ActorProxy end
      +
      +Rocket.actor_proxy!(::Type{Int}, ::MyTypedOperatorProxy, actor::A) where A = MyTypedOperatorProxiedActor{A}(actor)
      +
      +struct MyTypedOperatorProxiedActor{A} <: Actor{Int}
      +    actor :: A
      +end
      +
      +function Rocket.on_next!(actor::MyTypedOperatorProxiedActor, data::Int)
      +    # Do something with a data and/or redirect it to actor.actor
      +    next!(actor.actor, data + 1)
      +end
      +
      +Rocket.on_error!(actor::MyTypedOperatorProxiedActor, err) = error!(actor.actor, err)
      +Rocket.on_complete!(actor::MyTypedOperatorProxiedActor)   = complete!(actor.actor)
      +
      +source = from([ 0, 1, 2 ])
      +subscribe!(source |> MyTypedOperator(), logger())
      +;
      +
      +# output
      +
      +[LogActor] Data: 1
      +[LogActor] Data: 2
      +[LogActor] Data: 3
      +[LogActor] Completed

      See also: OperatorTrait, TypedOperator, OperatorTrait, ProxyObservable, ActorProxy, logger

      source
      Rocket.LeftTypedOperatorTraitType

      Left typed operator trait specifies operator to be statically typed with input data type. To infer output data type this object should specify a special function operator_right(operator, ::Type{L}) where L which will be used to infer output data type. Left typed operator with input type L can only operate on input Observable with data type L and will always produce an Observable with data type inferred from operator_right(operator, ::Type{L}).

      Examples

      using Rocket
      +
      +struct CountIntegersOperator <: LeftTypedOperator{Int} end
      +
      +function Rocket.on_call!(::Type{Int}, ::Type{Tuple{Int, Int}}, op::CountIntegersOperator, source)
      +    return proxy(Tuple{Int, Int}, source, CountIntegersOperatorProxy())
      +end
      +
      +Rocket.operator_right(::CountIntegersOperator, ::Type{Int}) = Tuple{Int, Int}
      +
      +struct CountIntegersOperatorProxy <: ActorProxy end
      +
      +Rocket.actor_proxy!(::Type{Tuple{Int, Int}}, ::CountIntegersOperatorProxy, actor::A) where A = CountIntegersProxiedActor{A}(0, actor)
      +
      +mutable struct CountIntegersProxiedActor{A} <: Actor{Int}
      +    current :: Int
      +    actor   :: A
      +end
      +
      +function Rocket.on_next!(actor::CountIntegersProxiedActor, data::Int)
      +    current = actor.current
      +    actor.current += 1
      +    next!(actor.actor, (current, data)) # e.g.
      +end
      +
      +Rocket.on_error!(actor::CountIntegersProxiedActor, err) = error!(actor.actor, err)
      +Rocket.on_complete!(actor::CountIntegersProxiedActor)   = complete!(actor.actor)
      +
      +source = from([ 0, 0, 0 ])
      +subscribe!(source |> CountIntegersOperator(), logger())
      +;
      +
      +# output
      +
      +[LogActor] Data: (0, 0)
      +[LogActor] Data: (1, 0)
      +[LogActor] Data: (2, 0)
      +[LogActor] Completed

      See also: OperatorTrait, LeftTypedOperator, operator_right, OperatorTrait, ProxyObservable, ActorProxy, enumerate, logger

      source
      Rocket.RightTypedOperatorTraitType

      Right typed operator trait specifies operator to be statically typed with output data type. It can operate on input Observable with any data type L but will always produce an Observable with data type R.

      Examples

      using Rocket
      +
      +struct ConvertToFloatOperator <: RightTypedOperator{Float64} end
      +
      +function Rocket.on_call!(::Type{L}, ::Type{Float64}, op::ConvertToFloatOperator, source) where L
      +    return proxy(Float64, source, ConvertToFloatProxy{L}())
      +end
      +
      +struct ConvertToFloatProxy{L} <: ActorProxy end
      +
      +function Rocket.actor_proxy!(::Type{Float64}, proxy::ConvertToFloatProxy{L}, actor::A) where { L, A }
      +    return ConvertToFloatProxyActor{L, A}(actor)
      +end
      +
      +struct ConvertToFloatProxyActor{L, A} <: Actor{L}
      +    actor :: A
      +end
      +
      +function Rocket.on_next!(actor::ConvertToFloatProxyActor{L}, data::L) where L
      +    next!(actor.actor, convert(Float64, data)) # e.g.
      +end
      +
      +Rocket.on_error!(actor::ConvertToFloatProxyActor, err) = error!(actor.actor, err)
      +Rocket.on_complete!(actor::ConvertToFloatProxyActor)   = complete!(actor.actor)
      +
      +source = from([ 1, 2, 3 ])
      +subscribe!(source |> ConvertToFloatOperator(), logger())
      +;
      +
      +# output
      +
      +[LogActor] Data: 1.0
      +[LogActor] Data: 2.0
      +[LogActor] Data: 3.0
      +[LogActor] Completed

      See also: OperatorTrait, RightTypedOperator, OperatorTrait, ProxyObservable, ActorProxy, logger

      source
      Rocket.InferableOperatorTraitType

      Inferable operator trait specifies operator to be statically typed neither with input data type nor with output data type. To infer output data type this object should specify a special function operator_right(operator, ::Type{L}) where L where L is input data type which will be used to infer output data type.

      using Rocket
      +
      +struct IdentityOperator <: InferableOperator end
      +
      +function Rocket.on_call!(::Type{L}, ::Type{L}, op::IdentityOperator, source) where L
      +    return proxy(L, source, IdentityProxy())
      +end
      +
      +struct IdentityProxy <: ActorProxy end
      +
      +Rocket.operator_right(::IdentityOperator, ::Type{L}) where L = L
      +
      +Rocket.actor_proxy!(::Type{L}, proxy::IdentityProxy, actor::A) where L where A = IdentityProxyActor{L, A}(actor)
      +
      +struct IdentityProxyActor{L, A} <: Actor{L}
      +    actor :: A
      +end
      +
      +function Rocket.on_next!(actor::IdentityProxyActor{L}, data::L) where L
      +    next!(actor.actor, data) # e.g.
      +end
      +
      +Rocket.on_error!(actor::IdentityProxyActor, err) = error!(actor.actor, err)
      +Rocket.on_complete!(actor::IdentityProxyActor)   = complete!(actor.actor)
      +
      +source = from([ 1, 2, 3 ])
      +subscribe!(source |> IdentityOperator(), logger())
      +
      +source = from([ 1.0, 2.0, 3.0 ])
      +subscribe!(source |> IdentityOperator(), logger())
      +;
      +
      +# output
      +
      +[LogActor] Data: 1
      +[LogActor] Data: 2
      +[LogActor] Data: 3
      +[LogActor] Completed
      +[LogActor] Data: 1.0
      +[LogActor] Data: 2.0
      +[LogActor] Data: 3.0
      +[LogActor] Completed
      +

      See also: OperatorTrait, InferableOperator, operator_right, OperatorTrait, ProxyObservable, ActorProxy, logger

      source
      Rocket.InvalidOperatorTraitType

      InvalidOperatorTrait trait specifies special 'invalid' behavior and types with such a trait specification cannot be used as an operator for an observable stream. By default any type has InvalidOperatorTrait trait specification

      See also: OperatorTrait

      source

      Types

      Rocket.TypedOperatorType

      Can be used as a supertype for any operator. Automatically specifies TypedOperatorTrait behavior.

      Examples

      using Rocket
      +
      +struct MyOperator <: TypedOperator{Float64,String} end
      +
      +as_operator(MyOperator) === TypedOperatorTrait{Float64,String}()
      +
      +# output
      +true

      See also: AbstractOperator, TypedOperatorTrait

      source
      Rocket.RightTypedOperatorType

      Can be used as a supertype for any operator. Automatically specifies RightTypedOperatorTrait behavior.

      Examples

      using Rocket
      +
      +struct MyOperator <: RightTypedOperator{Float64} end
      +
      +as_operator(MyOperator) === RightTypedOperatorTrait{Float64}()
      +
      +# output
      +true

      See also: AbstractOperator, RightTypedOperatorTrait

      source
      Rocket.on_call!Function
      on_call!(::Type, ::Type, operator, source)

      Each operator must implement its own method for on_call! function. This function is used to invoke operator on some Observable and to produce another Observable with new logic (operator specific).

      See also: AbstractOperator

      source
      Rocket.OperatorsCompositionType
      OperatorsComposition(operators)

      OperatorsComposition is an object which helps to create a composition of multiple operators. To create a composition of two or more operators overloaded + or |> can be used.

      using Rocket
      +
      +composition = map(Int, (d) -> d ^ 2) + filter(d -> d % 2 == 0)
      +
      +source = from(1:5) |> composition
      +
      +subscribe!(source, logger())
      +;
      +
      +# output
      +
      +[LogActor] Data: 4
      +[LogActor] Data: 16
      +[LogActor] Completed
      using Rocket
      +
      +composition = map(Int, (d) -> d ^ 2) |> filter(d -> d % 2 == 0)
      +
      +source = from(1:5) |> composition
      +
      +subscribe!(source, logger())
      +;
      +
      +# output
      +
      +[LogActor] Data: 4
      +[LogActor] Data: 16
      +[LogActor] Completed
      source

      Errors

      diff --git a/v1.7.3/api/subjects/index.html b/v1.7.3/api/subjects/index.html new file mode 100644 index 000000000..62b74ee6f --- /dev/null +++ b/v1.7.3/api/subjects/index.html @@ -0,0 +1,2 @@ + +Subjects · Rocket.jl

      Subjects API

      Traits

      Rocket.as_subjectFunction
      as_subject(::Type)

      This function checks subject trait behavior specification. Should be used explicitly to specify subject trait behavior for any object type.

      See also: SubjectTrait

      source

      Factory

      Errors

      diff --git a/v1.7.3/api/teardown/index.html b/v1.7.3/api/teardown/index.html new file mode 100644 index 000000000..f33c830e0 --- /dev/null +++ b/v1.7.3/api/teardown/index.html @@ -0,0 +1,27 @@ + +Teardown · Rocket.jl

      Teardown API

      Any subscription-like object should implement a valid teardown logic.

      Example

      using Rocket
      +
      +struct MuCustomSubscription <: Teardown
      +    # some fields here
      +end
      +
      +Rocket.as_teardown(::Type{<:MuCustomSubscription}) = UnsubscribableTeardownLogic()
      +
      +function on_unsubscribe!(subscription::MyCustomSubscription)
      +    # dispose resources here
      +end

      Traits

      Rocket.as_teardownFunction
      as_teardown(::Type)

      This function checks teardown trait behavior specification. Should be used explicitly to specify teardown logic trait behavior for any object.

      Examples

      using Rocket
      +
      +struct MySubscription <: Teardown end
      +
      +Rocket.as_teardown(::Type{<:MySubscription}) = UnsubscribableTeardownLogic()
      +Rocket.on_unsubscribe!(s::MySubscription)    = println("Unsubscribed!")
      +
      +subscription = MySubscription()
      +unsubscribe!(subscription)
      +;
      +
      +# output
      +
      +Unsubscribed!

      See also: Teardown, TeardownLogic

      source

      Types

      Rocket.unsubscribe!Function
      unsubscribe!(subscription)
      +unsubscribe!(subscriptions::Tuple)
      +unsubscribe!(subscriptions::AbstractVector)

      unsubscribe! function is used to cancel Observable execution and to dispose any kind of resources used during an Observable execution. If the input argument to the unsubscribe! function is either a tuple or a vector, it will first check that all of the arguments are valid subscription objects and if its true will unsubscribe from each of them individually.

      See also: Teardown, TeardownLogic, on_unsubscribe!

      source

      Errors

      diff --git a/v1.7.3/assets/documenter.js b/v1.7.3/assets/documenter.js new file mode 100644 index 000000000..f5311607b --- /dev/null +++ b/v1.7.3/assets/documenter.js @@ -0,0 +1,889 @@ +// Generated by Documenter.jl +requirejs.config({ + paths: { + 'highlight-julia': 'https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.8.0/languages/julia.min', + 'headroom': 'https://cdnjs.cloudflare.com/ajax/libs/headroom/0.12.0/headroom.min', + 'jqueryui': 'https://cdnjs.cloudflare.com/ajax/libs/jqueryui/1.13.2/jquery-ui.min', + 'minisearch': 'https://cdn.jsdelivr.net/npm/minisearch@6.1.0/dist/umd/index.min', + 'katex-auto-render': 'https://cdnjs.cloudflare.com/ajax/libs/KaTeX/0.16.8/contrib/auto-render.min', + 'jquery': 'https://cdnjs.cloudflare.com/ajax/libs/jquery/3.7.0/jquery.min', + 'headroom-jquery': 'https://cdnjs.cloudflare.com/ajax/libs/headroom/0.12.0/jQuery.headroom.min', + 'katex': 'https://cdnjs.cloudflare.com/ajax/libs/KaTeX/0.16.8/katex.min', + 'highlight': 'https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.8.0/highlight.min', + 'highlight-julia-repl': 'https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.8.0/languages/julia-repl.min', + }, + shim: { + "highlight-julia": { + "deps": [ + "highlight" + ] + }, + "katex-auto-render": { + "deps": [ + "katex" + ] + }, + "headroom-jquery": { + "deps": [ + "jquery", + "headroom" + ] + }, + "highlight-julia-repl": { + "deps": [ + "highlight" + ] + } +} +}); +//////////////////////////////////////////////////////////////////////////////// +require(['jquery', 'katex', 'katex-auto-render'], function($, katex, renderMathInElement) { +$(document).ready(function() { + renderMathInElement( + document.body, + { + "delimiters": [ + { + "left": "$", + "right": "$", + "display": false + }, + { + "left": "$$", + "right": "$$", + "display": true + }, + { + "left": "\\[", + "right": "\\]", + "display": true + } + ] +} + + ); +}) + +}) +//////////////////////////////////////////////////////////////////////////////// +require(['jquery', 'highlight', 'highlight-julia', 'highlight-julia-repl'], function($) { +$(document).ready(function() { + hljs.highlightAll(); +}) + +}) +//////////////////////////////////////////////////////////////////////////////// +require(['jquery'], function($) { + +let timer = 0; +var isExpanded = true; + +$(document).on("click", ".docstring header", function () { + let articleToggleTitle = "Expand docstring"; + + debounce(() => { + if ($(this).siblings("section").is(":visible")) { + $(this) + .find(".docstring-article-toggle-button") + .removeClass("fa-chevron-down") + .addClass("fa-chevron-right"); + } else { + $(this) + .find(".docstring-article-toggle-button") + .removeClass("fa-chevron-right") + .addClass("fa-chevron-down"); + + articleToggleTitle = "Collapse docstring"; + } + + $(this) + .find(".docstring-article-toggle-button") + .prop("title", articleToggleTitle); + $(this).siblings("section").slideToggle(); + }); +}); + +$(document).on("click", ".docs-article-toggle-button", function () { + let articleToggleTitle = "Expand docstring"; + let navArticleToggleTitle = "Expand all docstrings"; + + debounce(() => { + if (isExpanded) { + $(this).removeClass("fa-chevron-up").addClass("fa-chevron-down"); + $(".docstring-article-toggle-button") + .removeClass("fa-chevron-down") + .addClass("fa-chevron-right"); + + isExpanded = false; + + $(".docstring section").slideUp(); + } else { + $(this).removeClass("fa-chevron-down").addClass("fa-chevron-up"); + $(".docstring-article-toggle-button") + .removeClass("fa-chevron-right") + .addClass("fa-chevron-down"); + + isExpanded = true; + articleToggleTitle = "Collapse docstring"; + navArticleToggleTitle = "Collapse all docstrings"; + + $(".docstring section").slideDown(); + } + + $(this).prop("title", navArticleToggleTitle); + $(".docstring-article-toggle-button").prop("title", articleToggleTitle); + }); +}); + +function debounce(callback, timeout = 300) { + if (Date.now() - timer > timeout) { + callback(); + } + + clearTimeout(timer); + + timer = Date.now(); +} + +}) +//////////////////////////////////////////////////////////////////////////////// +require([], function() { +function addCopyButtonCallbacks() { + for (const el of document.getElementsByTagName("pre")) { + const button = document.createElement("button"); + button.classList.add("copy-button", "fa-solid", "fa-copy"); + button.setAttribute("aria-label", "Copy this code block"); + button.setAttribute("title", "Copy"); + + el.appendChild(button); + + const success = function () { + button.classList.add("success", "fa-check"); + button.classList.remove("fa-copy"); + }; + + const failure = function () { + button.classList.add("error", "fa-xmark"); + button.classList.remove("fa-copy"); + }; + + button.addEventListener("click", function () { + copyToClipboard(el.innerText).then(success, failure); + + setTimeout(function () { + button.classList.add("fa-copy"); + button.classList.remove("success", "fa-check", "fa-xmark"); + }, 5000); + }); + } +} + +function copyToClipboard(text) { + // clipboard API is only available in secure contexts + if (window.navigator && window.navigator.clipboard) { + return window.navigator.clipboard.writeText(text); + } else { + return new Promise(function (resolve, reject) { + try { + const el = document.createElement("textarea"); + el.textContent = text; + el.style.position = "fixed"; + el.style.opacity = 0; + document.body.appendChild(el); + el.select(); + document.execCommand("copy"); + + resolve(); + } catch (err) { + reject(err); + } finally { + document.body.removeChild(el); + } + }); + } +} + +if (document.readyState === "loading") { + document.addEventListener("DOMContentLoaded", addCopyButtonCallbacks); +} else { + addCopyButtonCallbacks(); +} + +}) +//////////////////////////////////////////////////////////////////////////////// +require(['jquery', 'headroom', 'headroom-jquery'], function($, Headroom) { + +// Manages the top navigation bar (hides it when the user starts scrolling down on the +// mobile). +window.Headroom = Headroom; // work around buggy module loading? +$(document).ready(function () { + $("#documenter .docs-navbar").headroom({ + tolerance: { up: 10, down: 10 }, + }); +}); + +}) +//////////////////////////////////////////////////////////////////////////////// +require(['jquery', 'minisearch'], function($, minisearch) { + +// In general, most search related things will have "search" as a prefix. +// To get an in-depth about the thought process you can refer: https://hetarth02.hashnode.dev/series/gsoc + +let results = []; +let timer = undefined; + +let data = documenterSearchIndex["docs"].map((x, key) => { + x["id"] = key; // minisearch requires a unique for each object + return x; +}); + +// list below is the lunr 2.1.3 list minus the intersect with names(Base) +// (all, any, get, in, is, only, which) and (do, else, for, let, where, while, with) +// ideally we'd just filter the original list but it's not available as a variable +const stopWords = new Set([ + "a", + "able", + "about", + "across", + "after", + "almost", + "also", + "am", + "among", + "an", + "and", + "are", + "as", + "at", + "be", + "because", + "been", + "but", + "by", + "can", + "cannot", + "could", + "dear", + "did", + "does", + "either", + "ever", + "every", + "from", + "got", + "had", + "has", + "have", + "he", + "her", + "hers", + "him", + "his", + "how", + "however", + "i", + "if", + "into", + "it", + "its", + "just", + "least", + "like", + "likely", + "may", + "me", + "might", + "most", + "must", + "my", + "neither", + "no", + "nor", + "not", + "of", + "off", + "often", + "on", + "or", + "other", + "our", + "own", + "rather", + "said", + "say", + "says", + "she", + "should", + "since", + "so", + "some", + "than", + "that", + "the", + "their", + "them", + "then", + "there", + "these", + "they", + "this", + "tis", + "to", + "too", + "twas", + "us", + "wants", + "was", + "we", + "were", + "what", + "when", + "who", + "whom", + "why", + "will", + "would", + "yet", + "you", + "your", +]); + +let index = new minisearch({ + fields: ["title", "text"], // fields to index for full-text search + storeFields: ["location", "title", "text", "category", "page"], // fields to return with search results + processTerm: (term) => { + let word = stopWords.has(term) ? null : term; + if (word) { + // custom trimmer that doesn't strip @ and !, which are used in julia macro and function names + word = word + .replace(/^[^a-zA-Z0-9@!]+/, "") + .replace(/[^a-zA-Z0-9@!]+$/, ""); + } + + return word ?? null; + }, + // add . as a separator, because otherwise "title": "Documenter.Anchors.add!", would not find anything if searching for "add!", only for the entire qualification + tokenize: (string) => string.split(/[\s\-\.]+/), + // options which will be applied during the search + searchOptions: { + boost: { title: 100 }, + fuzzy: 2, + processTerm: (term) => { + let word = stopWords.has(term) ? null : term; + if (word) { + word = word + .replace(/^[^a-zA-Z0-9@!]+/, "") + .replace(/[^a-zA-Z0-9@!]+$/, ""); + } + + return word ?? null; + }, + tokenize: (string) => string.split(/[\s\-\.]+/), + }, +}); + +index.addAll(data); + +let filters = [...new Set(data.map((x) => x.category))]; +var modal_filters = make_modal_body_filters(filters); +var filter_results = []; + +$(document).on("keyup", ".documenter-search-input", function (event) { + // Adding a debounce to prevent disruptions from super-speed typing! + debounce(() => update_search(filter_results), 300); +}); + +$(document).on("click", ".search-filter", function () { + if ($(this).hasClass("search-filter-selected")) { + $(this).removeClass("search-filter-selected"); + } else { + $(this).addClass("search-filter-selected"); + } + + // Adding a debounce to prevent disruptions from crazy clicking! + debounce(() => get_filters(), 300); +}); + +/** + * A debounce function, takes a function and an optional timeout in milliseconds + * + * @function callback + * @param {number} timeout + */ +function debounce(callback, timeout = 300) { + clearTimeout(timer); + timer = setTimeout(callback, timeout); +} + +/** + * Make/Update the search component + * + * @param {string[]} selected_filters + */ +function update_search(selected_filters = []) { + let initial_search_body = ` +
      Type something to get started!
      + `; + + let querystring = $(".documenter-search-input").val(); + + if (querystring.trim()) { + results = index.search(querystring, { + filter: (result) => { + // Filtering results + if (selected_filters.length === 0) { + return result.score >= 1; + } else { + return ( + result.score >= 1 && selected_filters.includes(result.category) + ); + } + }, + }); + + let search_result_container = ``; + let search_divider = `
      `; + + if (results.length) { + let links = []; + let count = 0; + let search_results = ""; + + results.forEach(function (result) { + if (result.location) { + // Checking for duplication of results for the same page + if (!links.includes(result.location)) { + search_results += make_search_result(result, querystring); + count++; + } + + links.push(result.location); + } + }); + + let result_count = `
      ${count} result(s)
      `; + + search_result_container = ` +
      + ${modal_filters} + ${search_divider} + ${result_count} +
      + ${search_results} +
      +
      + `; + } else { + search_result_container = ` +
      + ${modal_filters} + ${search_divider} +
      0 result(s)
      +
      +
      No result found!
      + `; + } + + if ($(".search-modal-card-body").hasClass("is-justify-content-center")) { + $(".search-modal-card-body").removeClass("is-justify-content-center"); + } + + $(".search-modal-card-body").html(search_result_container); + } else { + filter_results = []; + modal_filters = make_modal_body_filters(filters, filter_results); + + if (!$(".search-modal-card-body").hasClass("is-justify-content-center")) { + $(".search-modal-card-body").addClass("is-justify-content-center"); + } + + $(".search-modal-card-body").html(initial_search_body); + } +} + +/** + * Make the modal filter html + * + * @param {string[]} filters + * @param {string[]} selected_filters + * @returns string + */ +function make_modal_body_filters(filters, selected_filters = []) { + let str = ``; + + filters.forEach((val) => { + if (selected_filters.includes(val)) { + str += `${val}`; + } else { + str += `${val}`; + } + }); + + let filter_html = ` +
      + Filters: + ${str} +
      + `; + + return filter_html; +} + +/** + * Make the result component given a minisearch result data object and the value of the search input as queryString. + * To view the result object structure, refer: https://lucaong.github.io/minisearch/modules/_minisearch_.html#searchresult + * + * @param {object} result + * @param {string} querystring + * @returns string + */ +function make_search_result(result, querystring) { + let search_divider = `
      `; + let display_link = + result.location.slice(Math.max(0), Math.min(50, result.location.length)) + + (result.location.length > 30 ? "..." : ""); // To cut-off the link because it messes with the overflow of the whole div + + if (result.page !== "") { + display_link += ` (${result.page})`; + } + + let textindex = new RegExp(`\\b${querystring}\\b`, "i").exec(result.text); + let text = + textindex !== null + ? result.text.slice( + Math.max(textindex.index - 100, 0), + Math.min( + textindex.index + querystring.length + 100, + result.text.length + ) + ) + : ""; // cut-off text before and after from the match + + let display_result = text.length + ? "..." + + text.replace( + new RegExp(`\\b${querystring}\\b`, "i"), // For first occurrence + '$&' + ) + + "..." + : ""; // highlights the match + + let in_code = false; + if (!["page", "section"].includes(result.category.toLowerCase())) { + in_code = true; + } + + // We encode the full url to escape some special characters which can lead to broken links + let result_div = ` + +
      +
      ${result.title}
      +
      ${result.category}
      +
      +

      + ${display_result} +

      +
      + ${display_link} +
      +
      + ${search_divider} + `; + + return result_div; +} + +/** + * Get selected filters, remake the filter html and lastly update the search modal + */ +function get_filters() { + let ele = $(".search-filters .search-filter-selected").get(); + filter_results = ele.map((x) => $(x).text().toLowerCase()); + modal_filters = make_modal_body_filters(filters, filter_results); + update_search(filter_results); +} + +}) +//////////////////////////////////////////////////////////////////////////////// +require(['jquery'], function($) { + +// Modal settings dialog +$(document).ready(function () { + var settings = $("#documenter-settings"); + $("#documenter-settings-button").click(function () { + settings.toggleClass("is-active"); + }); + // Close the dialog if X is clicked + $("#documenter-settings button.delete").click(function () { + settings.removeClass("is-active"); + }); + // Close dialog if ESC is pressed + $(document).keyup(function (e) { + if (e.keyCode == 27) settings.removeClass("is-active"); + }); +}); + +}) +//////////////////////////////////////////////////////////////////////////////// +require(['jquery'], function($) { + +let search_modal_header = ` + +`; + +let initial_search_body = ` +
      Type something to get started!
      +`; + +let search_modal_footer = ` +
      + + Ctrl + + / to search + + esc to close +
      +`; + +$(document.body).append( + ` + + ` +); + +document.querySelector(".docs-search-query").addEventListener("click", () => { + openModal(); +}); + +document.querySelector(".close-search-modal").addEventListener("click", () => { + closeModal(); +}); + +$(document).on("click", ".search-result-link", function () { + closeModal(); +}); + +document.addEventListener("keydown", (event) => { + if ((event.ctrlKey || event.metaKey) && event.key === "/") { + openModal(); + } else if (event.key === "Escape") { + closeModal(); + } + + return false; +}); + +// Functions to open and close a modal +function openModal() { + let searchModal = document.querySelector("#search-modal"); + + searchModal.classList.add("is-active"); + document.querySelector(".documenter-search-input").focus(); +} + +function closeModal() { + let searchModal = document.querySelector("#search-modal"); + let initial_search_body = ` +
      Type something to get started!
      + `; + + searchModal.classList.remove("is-active"); + document.querySelector(".documenter-search-input").blur(); + + if (!$(".search-modal-card-body").hasClass("is-justify-content-center")) { + $(".search-modal-card-body").addClass("is-justify-content-center"); + } + + $(".documenter-search-input").val(""); + $(".search-modal-card-body").html(initial_search_body); +} + +document + .querySelector("#search-modal .modal-background") + .addEventListener("click", () => { + closeModal(); + }); + +}) +//////////////////////////////////////////////////////////////////////////////// +require(['jquery'], function($) { + +// Manages the showing and hiding of the sidebar. +$(document).ready(function () { + var sidebar = $("#documenter > .docs-sidebar"); + var sidebar_button = $("#documenter-sidebar-button"); + sidebar_button.click(function (ev) { + ev.preventDefault(); + sidebar.toggleClass("visible"); + if (sidebar.hasClass("visible")) { + // Makes sure that the current menu item is visible in the sidebar. + $("#documenter .docs-menu a.is-active").focus(); + } + }); + $("#documenter > .docs-main").bind("click", function (ev) { + if ($(ev.target).is(sidebar_button)) { + return; + } + if (sidebar.hasClass("visible")) { + sidebar.removeClass("visible"); + } + }); +}); + +// Resizes the package name / sitename in the sidebar if it is too wide. +// Inspired by: https://github.com/davatron5000/FitText.js +$(document).ready(function () { + e = $("#documenter .docs-autofit"); + function resize() { + var L = parseInt(e.css("max-width"), 10); + var L0 = e.width(); + if (L0 > L) { + var h0 = parseInt(e.css("font-size"), 10); + e.css("font-size", (L * h0) / L0); + // TODO: make sure it survives resizes? + } + } + // call once and then register events + resize(); + $(window).resize(resize); + $(window).on("orientationchange", resize); +}); + +// Scroll the navigation bar to the currently selected menu item +$(document).ready(function () { + var sidebar = $("#documenter .docs-menu").get(0); + var active = $("#documenter .docs-menu .is-active").get(0); + if (typeof active !== "undefined") { + sidebar.scrollTop = active.offsetTop - sidebar.offsetTop - 15; + } +}); + +}) +//////////////////////////////////////////////////////////////////////////////// +require(['jquery'], function($) { + +// Theme picker setup +$(document).ready(function () { + // onchange callback + $("#documenter-themepicker").change(function themepick_callback(ev) { + var themename = $("#documenter-themepicker option:selected").attr("value"); + if (themename === "auto") { + // set_theme(window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light'); + window.localStorage.removeItem("documenter-theme"); + } else { + // set_theme(themename); + window.localStorage.setItem("documenter-theme", themename); + } + // We re-use the global function from themeswap.js to actually do the swapping. + set_theme_from_local_storage(); + }); + + // Make sure that the themepicker displays the correct theme when the theme is retrieved + // from localStorage + if (typeof window.localStorage !== "undefined") { + var theme = window.localStorage.getItem("documenter-theme"); + if (theme !== null) { + $("#documenter-themepicker option").each(function (i, e) { + e.selected = e.value === theme; + }); + } + } +}); + +}) +//////////////////////////////////////////////////////////////////////////////// +require(['jquery'], function($) { + +// update the version selector with info from the siteinfo.js and ../versions.js files +$(document).ready(function () { + // If the version selector is disabled with DOCUMENTER_VERSION_SELECTOR_DISABLED in the + // siteinfo.js file, we just return immediately and not display the version selector. + if ( + typeof DOCUMENTER_VERSION_SELECTOR_DISABLED === "boolean" && + DOCUMENTER_VERSION_SELECTOR_DISABLED + ) { + return; + } + + var version_selector = $("#documenter .docs-version-selector"); + var version_selector_select = $("#documenter .docs-version-selector select"); + + version_selector_select.change(function (x) { + target_href = version_selector_select + .children("option:selected") + .get(0).value; + window.location.href = target_href; + }); + + // add the current version to the selector based on siteinfo.js, but only if the selector is empty + if ( + typeof DOCUMENTER_CURRENT_VERSION !== "undefined" && + $("#version-selector > option").length == 0 + ) { + var option = $( + "" + ); + version_selector_select.append(option); + } + + if (typeof DOC_VERSIONS !== "undefined") { + var existing_versions = version_selector_select.children("option"); + var existing_versions_texts = existing_versions.map(function (i, x) { + return x.text; + }); + DOC_VERSIONS.forEach(function (each) { + var version_url = documenterBaseURL + "/../" + each + "/"; + var existing_id = $.inArray(each, existing_versions_texts); + // if not already in the version selector, add it as a new option, + // otherwise update the old option with the URL and enable it + if (existing_id == -1) { + var option = $( + "" + ); + version_selector_select.append(option); + } else { + var option = existing_versions[existing_id]; + option.value = version_url; + option.disabled = false; + } + }); + } + + // only show the version selector if the selector has been populated + if (version_selector_select.children("option").length > 0) { + version_selector.toggleClass("visible"); + } +}); + +}) diff --git a/v1.7.3/assets/themes/documenter-dark.css b/v1.7.3/assets/themes/documenter-dark.css new file mode 100644 index 000000000..9f5449f4b --- /dev/null +++ b/v1.7.3/assets/themes/documenter-dark.css @@ -0,0 +1,7 @@ +html.theme--documenter-dark .pagination-previous,html.theme--documenter-dark .pagination-next,html.theme--documenter-dark .pagination-link,html.theme--documenter-dark .pagination-ellipsis,html.theme--documenter-dark .file-cta,html.theme--documenter-dark .file-name,html.theme--documenter-dark .select select,html.theme--documenter-dark .textarea,html.theme--documenter-dark .input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input,html.theme--documenter-dark .button{-moz-appearance:none;-webkit-appearance:none;align-items:center;border:1px solid transparent;border-radius:.4em;box-shadow:none;display:inline-flex;font-size:1rem;height:2.5em;justify-content:flex-start;line-height:1.5;padding-bottom:calc(0.5em - 1px);padding-left:calc(0.75em - 1px);padding-right:calc(0.75em - 1px);padding-top:calc(0.5em - 1px);position:relative;vertical-align:top}html.theme--documenter-dark .pagination-previous:focus,html.theme--documenter-dark .pagination-next:focus,html.theme--documenter-dark .pagination-link:focus,html.theme--documenter-dark .pagination-ellipsis:focus,html.theme--documenter-dark .file-cta:focus,html.theme--documenter-dark .file-name:focus,html.theme--documenter-dark .select select:focus,html.theme--documenter-dark .textarea:focus,html.theme--documenter-dark .input:focus,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input:focus,html.theme--documenter-dark .button:focus,html.theme--documenter-dark .is-focused.pagination-previous,html.theme--documenter-dark .is-focused.pagination-next,html.theme--documenter-dark .is-focused.pagination-link,html.theme--documenter-dark .is-focused.pagination-ellipsis,html.theme--documenter-dark .is-focused.file-cta,html.theme--documenter-dark .is-focused.file-name,html.theme--documenter-dark .select select.is-focused,html.theme--documenter-dark .is-focused.textarea,html.theme--documenter-dark .is-focused.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-focused,html.theme--documenter-dark .is-focused.button,html.theme--documenter-dark .pagination-previous:active,html.theme--documenter-dark .pagination-next:active,html.theme--documenter-dark .pagination-link:active,html.theme--documenter-dark .pagination-ellipsis:active,html.theme--documenter-dark .file-cta:active,html.theme--documenter-dark .file-name:active,html.theme--documenter-dark .select select:active,html.theme--documenter-dark .textarea:active,html.theme--documenter-dark .input:active,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input:active,html.theme--documenter-dark .button:active,html.theme--documenter-dark .is-active.pagination-previous,html.theme--documenter-dark .is-active.pagination-next,html.theme--documenter-dark .is-active.pagination-link,html.theme--documenter-dark .is-active.pagination-ellipsis,html.theme--documenter-dark .is-active.file-cta,html.theme--documenter-dark .is-active.file-name,html.theme--documenter-dark .select select.is-active,html.theme--documenter-dark .is-active.textarea,html.theme--documenter-dark .is-active.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-active,html.theme--documenter-dark .is-active.button{outline:none}html.theme--documenter-dark .pagination-previous[disabled],html.theme--documenter-dark .pagination-next[disabled],html.theme--documenter-dark .pagination-link[disabled],html.theme--documenter-dark .pagination-ellipsis[disabled],html.theme--documenter-dark .file-cta[disabled],html.theme--documenter-dark .file-name[disabled],html.theme--documenter-dark .select select[disabled],html.theme--documenter-dark .textarea[disabled],html.theme--documenter-dark .input[disabled],html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input[disabled],html.theme--documenter-dark .button[disabled],fieldset[disabled] html.theme--documenter-dark .pagination-previous,html.theme--documenter-dark fieldset[disabled] .pagination-previous,fieldset[disabled] html.theme--documenter-dark .pagination-next,html.theme--documenter-dark fieldset[disabled] .pagination-next,fieldset[disabled] html.theme--documenter-dark .pagination-link,html.theme--documenter-dark fieldset[disabled] .pagination-link,fieldset[disabled] html.theme--documenter-dark .pagination-ellipsis,html.theme--documenter-dark fieldset[disabled] .pagination-ellipsis,fieldset[disabled] html.theme--documenter-dark .file-cta,html.theme--documenter-dark fieldset[disabled] .file-cta,fieldset[disabled] html.theme--documenter-dark .file-name,html.theme--documenter-dark fieldset[disabled] .file-name,fieldset[disabled] html.theme--documenter-dark .select select,fieldset[disabled] html.theme--documenter-dark .textarea,fieldset[disabled] html.theme--documenter-dark .input,fieldset[disabled] html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input,html.theme--documenter-dark fieldset[disabled] .select select,html.theme--documenter-dark .select fieldset[disabled] select,html.theme--documenter-dark fieldset[disabled] .textarea,html.theme--documenter-dark fieldset[disabled] .input,html.theme--documenter-dark fieldset[disabled] #documenter .docs-sidebar form.docs-search>input,html.theme--documenter-dark #documenter .docs-sidebar fieldset[disabled] form.docs-search>input,fieldset[disabled] html.theme--documenter-dark .button,html.theme--documenter-dark fieldset[disabled] .button{cursor:not-allowed}html.theme--documenter-dark .tabs,html.theme--documenter-dark .pagination-previous,html.theme--documenter-dark .pagination-next,html.theme--documenter-dark .pagination-link,html.theme--documenter-dark .pagination-ellipsis,html.theme--documenter-dark .breadcrumb,html.theme--documenter-dark .file,html.theme--documenter-dark .button,.is-unselectable{-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}html.theme--documenter-dark .navbar-link:not(.is-arrowless)::after,html.theme--documenter-dark .select:not(.is-multiple):not(.is-loading)::after{border:3px solid rgba(0,0,0,0);border-radius:2px;border-right:0;border-top:0;content:" ";display:block;height:0.625em;margin-top:-0.4375em;pointer-events:none;position:absolute;top:50%;transform:rotate(-45deg);transform-origin:center;width:0.625em}html.theme--documenter-dark .admonition:not(:last-child),html.theme--documenter-dark .tabs:not(:last-child),html.theme--documenter-dark .pagination:not(:last-child),html.theme--documenter-dark .message:not(:last-child),html.theme--documenter-dark .level:not(:last-child),html.theme--documenter-dark .breadcrumb:not(:last-child),html.theme--documenter-dark .block:not(:last-child),html.theme--documenter-dark .title:not(:last-child),html.theme--documenter-dark .subtitle:not(:last-child),html.theme--documenter-dark .table-container:not(:last-child),html.theme--documenter-dark .table:not(:last-child),html.theme--documenter-dark .progress:not(:last-child),html.theme--documenter-dark .notification:not(:last-child),html.theme--documenter-dark .content:not(:last-child),html.theme--documenter-dark .box:not(:last-child){margin-bottom:1.5rem}html.theme--documenter-dark .modal-close,html.theme--documenter-dark .delete{-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-moz-appearance:none;-webkit-appearance:none;background-color:rgba(10,10,10,0.2);border:none;border-radius:9999px;cursor:pointer;pointer-events:auto;display:inline-block;flex-grow:0;flex-shrink:0;font-size:0;height:20px;max-height:20px;max-width:20px;min-height:20px;min-width:20px;outline:none;position:relative;vertical-align:top;width:20px}html.theme--documenter-dark .modal-close::before,html.theme--documenter-dark .delete::before,html.theme--documenter-dark .modal-close::after,html.theme--documenter-dark .delete::after{background-color:#fff;content:"";display:block;left:50%;position:absolute;top:50%;transform:translateX(-50%) translateY(-50%) rotate(45deg);transform-origin:center center}html.theme--documenter-dark .modal-close::before,html.theme--documenter-dark .delete::before{height:2px;width:50%}html.theme--documenter-dark .modal-close::after,html.theme--documenter-dark .delete::after{height:50%;width:2px}html.theme--documenter-dark .modal-close:hover,html.theme--documenter-dark .delete:hover,html.theme--documenter-dark .modal-close:focus,html.theme--documenter-dark .delete:focus{background-color:rgba(10,10,10,0.3)}html.theme--documenter-dark .modal-close:active,html.theme--documenter-dark .delete:active{background-color:rgba(10,10,10,0.4)}html.theme--documenter-dark .is-small.modal-close,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.modal-close,html.theme--documenter-dark .is-small.delete,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.delete{height:16px;max-height:16px;max-width:16px;min-height:16px;min-width:16px;width:16px}html.theme--documenter-dark .is-medium.modal-close,html.theme--documenter-dark .is-medium.delete{height:24px;max-height:24px;max-width:24px;min-height:24px;min-width:24px;width:24px}html.theme--documenter-dark .is-large.modal-close,html.theme--documenter-dark .is-large.delete{height:32px;max-height:32px;max-width:32px;min-height:32px;min-width:32px;width:32px}html.theme--documenter-dark .control.is-loading::after,html.theme--documenter-dark .select.is-loading::after,html.theme--documenter-dark .loader,html.theme--documenter-dark .button.is-loading::after{animation:spinAround 500ms infinite linear;border:2px solid #dbdee0;border-radius:9999px;border-right-color:transparent;border-top-color:transparent;content:"";display:block;height:1em;position:relative;width:1em}html.theme--documenter-dark .hero-video,html.theme--documenter-dark .modal-background,html.theme--documenter-dark .modal,html.theme--documenter-dark .image.is-square img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-square img,html.theme--documenter-dark .image.is-square .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-square .has-ratio,html.theme--documenter-dark .image.is-1by1 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-1by1 img,html.theme--documenter-dark .image.is-1by1 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-1by1 .has-ratio,html.theme--documenter-dark .image.is-5by4 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-5by4 img,html.theme--documenter-dark .image.is-5by4 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-5by4 .has-ratio,html.theme--documenter-dark .image.is-4by3 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-4by3 img,html.theme--documenter-dark .image.is-4by3 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-4by3 .has-ratio,html.theme--documenter-dark .image.is-3by2 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by2 img,html.theme--documenter-dark .image.is-3by2 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by2 .has-ratio,html.theme--documenter-dark .image.is-5by3 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-5by3 img,html.theme--documenter-dark .image.is-5by3 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-5by3 .has-ratio,html.theme--documenter-dark .image.is-16by9 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-16by9 img,html.theme--documenter-dark .image.is-16by9 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-16by9 .has-ratio,html.theme--documenter-dark .image.is-2by1 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-2by1 img,html.theme--documenter-dark .image.is-2by1 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-2by1 .has-ratio,html.theme--documenter-dark .image.is-3by1 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by1 img,html.theme--documenter-dark .image.is-3by1 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by1 .has-ratio,html.theme--documenter-dark .image.is-4by5 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-4by5 img,html.theme--documenter-dark .image.is-4by5 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-4by5 .has-ratio,html.theme--documenter-dark .image.is-3by4 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by4 img,html.theme--documenter-dark .image.is-3by4 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by4 .has-ratio,html.theme--documenter-dark .image.is-2by3 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-2by3 img,html.theme--documenter-dark .image.is-2by3 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-2by3 .has-ratio,html.theme--documenter-dark .image.is-3by5 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by5 img,html.theme--documenter-dark .image.is-3by5 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by5 .has-ratio,html.theme--documenter-dark .image.is-9by16 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-9by16 img,html.theme--documenter-dark .image.is-9by16 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-9by16 .has-ratio,html.theme--documenter-dark .image.is-1by2 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-1by2 img,html.theme--documenter-dark .image.is-1by2 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-1by2 .has-ratio,html.theme--documenter-dark .image.is-1by3 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-1by3 img,html.theme--documenter-dark .image.is-1by3 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-1by3 .has-ratio,.is-overlay{bottom:0;left:0;position:absolute;right:0;top:0}html.theme--documenter-dark .navbar-burger{-moz-appearance:none;-webkit-appearance:none;appearance:none;background:none;border:none;color:currentColor;font-family:inherit;font-size:1em;margin:0;padding:0}/*! minireset.css v0.0.6 | MIT License | github.com/jgthms/minireset.css */html,body,p,ol,ul,li,dl,dt,dd,blockquote,figure,fieldset,legend,textarea,pre,iframe,hr,h1,h2,h3,h4,h5,h6{margin:0;padding:0}h1,h2,h3,h4,h5,h6{font-size:100%;font-weight:normal}ul{list-style:none}button,input,select,textarea{margin:0}html{box-sizing:border-box}*,*::before,*::after{box-sizing:inherit}img,video{height:auto;max-width:100%}iframe{border:0}table{border-collapse:collapse;border-spacing:0}td,th{padding:0}td:not([align]),th:not([align]){text-align:inherit}.has-text-white{color:#fff !important}a.has-text-white:hover,a.has-text-white:focus{color:#e6e6e6 !important}.has-background-white{background-color:#fff !important}.has-text-black{color:#0a0a0a !important}a.has-text-black:hover,a.has-text-black:focus{color:#000 !important}.has-background-black{background-color:#0a0a0a !important}.has-text-light{color:#ecf0f1 !important}a.has-text-light:hover,a.has-text-light:focus{color:#cfd9db !important}.has-background-light{background-color:#ecf0f1 !important}.has-text-dark{color:#282f2f !important}a.has-text-dark:hover,a.has-text-dark:focus{color:#111414 !important}.has-background-dark{background-color:#282f2f !important}.has-text-primary{color:#375a7f !important}a.has-text-primary:hover,a.has-text-primary:focus{color:#28415b !important}.has-background-primary{background-color:#375a7f !important}.has-text-primary-light{color:#f1f5f9 !important}a.has-text-primary-light:hover,a.has-text-primary-light:focus{color:#cddbe9 !important}.has-background-primary-light{background-color:#f1f5f9 !important}.has-text-primary-dark{color:#4d7eb2 !important}a.has-text-primary-dark:hover,a.has-text-primary-dark:focus{color:#7198c1 !important}.has-background-primary-dark{background-color:#4d7eb2 !important}.has-text-link{color:#1abc9c !important}a.has-text-link:hover,a.has-text-link:focus{color:#148f77 !important}.has-background-link{background-color:#1abc9c !important}.has-text-link-light{color:#edfdf9 !important}a.has-text-link-light:hover,a.has-text-link-light:focus{color:#c0f6ec !important}.has-background-link-light{background-color:#edfdf9 !important}.has-text-link-dark{color:#15987e !important}a.has-text-link-dark:hover,a.has-text-link-dark:focus{color:#1bc5a4 !important}.has-background-link-dark{background-color:#15987e !important}.has-text-info{color:#024c7d !important}a.has-text-info:hover,a.has-text-info:focus{color:#012d4b !important}.has-background-info{background-color:#024c7d !important}.has-text-info-light{color:#ebf7ff !important}a.has-text-info-light:hover,a.has-text-info-light:focus{color:#b9e2fe !important}.has-background-info-light{background-color:#ebf7ff !important}.has-text-info-dark{color:#0e9dfb !important}a.has-text-info-dark:hover,a.has-text-info-dark:focus{color:#40b1fc !important}.has-background-info-dark{background-color:#0e9dfb !important}.has-text-success{color:#008438 !important}a.has-text-success:hover,a.has-text-success:focus{color:#005122 !important}.has-background-success{background-color:#008438 !important}.has-text-success-light{color:#ebfff3 !important}a.has-text-success-light:hover,a.has-text-success-light:focus{color:#b8ffd6 !important}.has-background-success-light{background-color:#ebfff3 !important}.has-text-success-dark{color:#00eb64 !important}a.has-text-success-dark:hover,a.has-text-success-dark:focus{color:#1fff7e !important}.has-background-success-dark{background-color:#00eb64 !important}.has-text-warning{color:#ad8100 !important}a.has-text-warning:hover,a.has-text-warning:focus{color:#7a5b00 !important}.has-background-warning{background-color:#ad8100 !important}.has-text-warning-light{color:#fffaeb !important}a.has-text-warning-light:hover,a.has-text-warning-light:focus{color:#ffedb8 !important}.has-background-warning-light{background-color:#fffaeb !important}.has-text-warning-dark{color:#d19c00 !important}a.has-text-warning-dark:hover,a.has-text-warning-dark:focus{color:#ffbf05 !important}.has-background-warning-dark{background-color:#d19c00 !important}.has-text-danger{color:#9e1b0d !important}a.has-text-danger:hover,a.has-text-danger:focus{color:#6f1309 !important}.has-background-danger{background-color:#9e1b0d !important}.has-text-danger-light{color:#fdeeec !important}a.has-text-danger-light:hover,a.has-text-danger-light:focus{color:#fac3bd !important}.has-background-danger-light{background-color:#fdeeec !important}.has-text-danger-dark{color:#ec311d !important}a.has-text-danger-dark:hover,a.has-text-danger-dark:focus{color:#f05c4c !important}.has-background-danger-dark{background-color:#ec311d !important}.has-text-black-bis{color:#121212 !important}.has-background-black-bis{background-color:#121212 !important}.has-text-black-ter{color:#242424 !important}.has-background-black-ter{background-color:#242424 !important}.has-text-grey-darker{color:#282f2f !important}.has-background-grey-darker{background-color:#282f2f !important}.has-text-grey-dark{color:#343c3d !important}.has-background-grey-dark{background-color:#343c3d !important}.has-text-grey{color:#5e6d6f !important}.has-background-grey{background-color:#5e6d6f !important}.has-text-grey-light{color:#8c9b9d !important}.has-background-grey-light{background-color:#8c9b9d !important}.has-text-grey-lighter{color:#dbdee0 !important}.has-background-grey-lighter{background-color:#dbdee0 !important}.has-text-white-ter{color:#ecf0f1 !important}.has-background-white-ter{background-color:#ecf0f1 !important}.has-text-white-bis{color:#fafafa !important}.has-background-white-bis{background-color:#fafafa !important}.is-flex-direction-row{flex-direction:row !important}.is-flex-direction-row-reverse{flex-direction:row-reverse !important}.is-flex-direction-column{flex-direction:column !important}.is-flex-direction-column-reverse{flex-direction:column-reverse !important}.is-flex-wrap-nowrap{flex-wrap:nowrap !important}.is-flex-wrap-wrap{flex-wrap:wrap !important}.is-flex-wrap-wrap-reverse{flex-wrap:wrap-reverse !important}.is-justify-content-flex-start{justify-content:flex-start !important}.is-justify-content-flex-end{justify-content:flex-end !important}.is-justify-content-center{justify-content:center !important}.is-justify-content-space-between{justify-content:space-between !important}.is-justify-content-space-around{justify-content:space-around !important}.is-justify-content-space-evenly{justify-content:space-evenly !important}.is-justify-content-start{justify-content:start !important}.is-justify-content-end{justify-content:end !important}.is-justify-content-left{justify-content:left !important}.is-justify-content-right{justify-content:right !important}.is-align-content-flex-start{align-content:flex-start !important}.is-align-content-flex-end{align-content:flex-end !important}.is-align-content-center{align-content:center !important}.is-align-content-space-between{align-content:space-between !important}.is-align-content-space-around{align-content:space-around !important}.is-align-content-space-evenly{align-content:space-evenly !important}.is-align-content-stretch{align-content:stretch !important}.is-align-content-start{align-content:start !important}.is-align-content-end{align-content:end !important}.is-align-content-baseline{align-content:baseline !important}.is-align-items-stretch{align-items:stretch !important}.is-align-items-flex-start{align-items:flex-start !important}.is-align-items-flex-end{align-items:flex-end !important}.is-align-items-center{align-items:center !important}.is-align-items-baseline{align-items:baseline !important}.is-align-items-start{align-items:start !important}.is-align-items-end{align-items:end !important}.is-align-items-self-start{align-items:self-start !important}.is-align-items-self-end{align-items:self-end !important}.is-align-self-auto{align-self:auto !important}.is-align-self-flex-start{align-self:flex-start !important}.is-align-self-flex-end{align-self:flex-end !important}.is-align-self-center{align-self:center !important}.is-align-self-baseline{align-self:baseline !important}.is-align-self-stretch{align-self:stretch !important}.is-flex-grow-0{flex-grow:0 !important}.is-flex-grow-1{flex-grow:1 !important}.is-flex-grow-2{flex-grow:2 !important}.is-flex-grow-3{flex-grow:3 !important}.is-flex-grow-4{flex-grow:4 !important}.is-flex-grow-5{flex-grow:5 !important}.is-flex-shrink-0{flex-shrink:0 !important}.is-flex-shrink-1{flex-shrink:1 !important}.is-flex-shrink-2{flex-shrink:2 !important}.is-flex-shrink-3{flex-shrink:3 !important}.is-flex-shrink-4{flex-shrink:4 !important}.is-flex-shrink-5{flex-shrink:5 !important}.is-clearfix::after{clear:both;content:" ";display:table}.is-pulled-left{float:left !important}.is-pulled-right{float:right !important}.is-radiusless{border-radius:0 !important}.is-shadowless{box-shadow:none !important}.is-clickable{cursor:pointer !important;pointer-events:all !important}.is-clipped{overflow:hidden !important}.is-relative{position:relative !important}.is-marginless{margin:0 !important}.is-paddingless{padding:0 !important}.m-0{margin:0 !important}.mt-0{margin-top:0 !important}.mr-0{margin-right:0 !important}.mb-0{margin-bottom:0 !important}.ml-0{margin-left:0 !important}.mx-0{margin-left:0 !important;margin-right:0 !important}.my-0{margin-top:0 !important;margin-bottom:0 !important}.m-1{margin:.25rem !important}.mt-1{margin-top:.25rem !important}.mr-1{margin-right:.25rem !important}.mb-1{margin-bottom:.25rem !important}.ml-1{margin-left:.25rem !important}.mx-1{margin-left:.25rem !important;margin-right:.25rem !important}.my-1{margin-top:.25rem !important;margin-bottom:.25rem !important}.m-2{margin:.5rem !important}.mt-2{margin-top:.5rem !important}.mr-2{margin-right:.5rem !important}.mb-2{margin-bottom:.5rem !important}.ml-2{margin-left:.5rem !important}.mx-2{margin-left:.5rem !important;margin-right:.5rem !important}.my-2{margin-top:.5rem !important;margin-bottom:.5rem !important}.m-3{margin:.75rem !important}.mt-3{margin-top:.75rem !important}.mr-3{margin-right:.75rem !important}.mb-3{margin-bottom:.75rem !important}.ml-3{margin-left:.75rem !important}.mx-3{margin-left:.75rem !important;margin-right:.75rem !important}.my-3{margin-top:.75rem !important;margin-bottom:.75rem !important}.m-4{margin:1rem !important}.mt-4{margin-top:1rem !important}.mr-4{margin-right:1rem !important}.mb-4{margin-bottom:1rem !important}.ml-4{margin-left:1rem !important}.mx-4{margin-left:1rem !important;margin-right:1rem !important}.my-4{margin-top:1rem !important;margin-bottom:1rem !important}.m-5{margin:1.5rem !important}.mt-5{margin-top:1.5rem !important}.mr-5{margin-right:1.5rem !important}.mb-5{margin-bottom:1.5rem !important}.ml-5{margin-left:1.5rem !important}.mx-5{margin-left:1.5rem !important;margin-right:1.5rem !important}.my-5{margin-top:1.5rem !important;margin-bottom:1.5rem !important}.m-6{margin:3rem !important}.mt-6{margin-top:3rem !important}.mr-6{margin-right:3rem !important}.mb-6{margin-bottom:3rem !important}.ml-6{margin-left:3rem !important}.mx-6{margin-left:3rem !important;margin-right:3rem !important}.my-6{margin-top:3rem !important;margin-bottom:3rem !important}.m-auto{margin:auto !important}.mt-auto{margin-top:auto !important}.mr-auto{margin-right:auto !important}.mb-auto{margin-bottom:auto !important}.ml-auto{margin-left:auto !important}.mx-auto{margin-left:auto !important;margin-right:auto !important}.my-auto{margin-top:auto !important;margin-bottom:auto !important}.p-0{padding:0 !important}.pt-0{padding-top:0 !important}.pr-0{padding-right:0 !important}.pb-0{padding-bottom:0 !important}.pl-0{padding-left:0 !important}.px-0{padding-left:0 !important;padding-right:0 !important}.py-0{padding-top:0 !important;padding-bottom:0 !important}.p-1{padding:.25rem !important}.pt-1{padding-top:.25rem !important}.pr-1{padding-right:.25rem !important}.pb-1{padding-bottom:.25rem !important}.pl-1{padding-left:.25rem !important}.px-1{padding-left:.25rem !important;padding-right:.25rem !important}.py-1{padding-top:.25rem !important;padding-bottom:.25rem !important}.p-2{padding:.5rem !important}.pt-2{padding-top:.5rem !important}.pr-2{padding-right:.5rem !important}.pb-2{padding-bottom:.5rem !important}.pl-2{padding-left:.5rem !important}.px-2{padding-left:.5rem !important;padding-right:.5rem !important}.py-2{padding-top:.5rem !important;padding-bottom:.5rem !important}.p-3{padding:.75rem !important}.pt-3{padding-top:.75rem !important}.pr-3{padding-right:.75rem !important}.pb-3{padding-bottom:.75rem !important}.pl-3{padding-left:.75rem !important}.px-3{padding-left:.75rem !important;padding-right:.75rem !important}.py-3{padding-top:.75rem !important;padding-bottom:.75rem !important}.p-4{padding:1rem !important}.pt-4{padding-top:1rem !important}.pr-4{padding-right:1rem !important}.pb-4{padding-bottom:1rem !important}.pl-4{padding-left:1rem !important}.px-4{padding-left:1rem !important;padding-right:1rem !important}.py-4{padding-top:1rem !important;padding-bottom:1rem !important}.p-5{padding:1.5rem !important}.pt-5{padding-top:1.5rem !important}.pr-5{padding-right:1.5rem !important}.pb-5{padding-bottom:1.5rem !important}.pl-5{padding-left:1.5rem !important}.px-5{padding-left:1.5rem !important;padding-right:1.5rem !important}.py-5{padding-top:1.5rem !important;padding-bottom:1.5rem !important}.p-6{padding:3rem !important}.pt-6{padding-top:3rem !important}.pr-6{padding-right:3rem !important}.pb-6{padding-bottom:3rem !important}.pl-6{padding-left:3rem !important}.px-6{padding-left:3rem !important;padding-right:3rem !important}.py-6{padding-top:3rem !important;padding-bottom:3rem !important}.p-auto{padding:auto !important}.pt-auto{padding-top:auto !important}.pr-auto{padding-right:auto !important}.pb-auto{padding-bottom:auto !important}.pl-auto{padding-left:auto !important}.px-auto{padding-left:auto !important;padding-right:auto !important}.py-auto{padding-top:auto !important;padding-bottom:auto !important}.is-size-1{font-size:3rem !important}.is-size-2{font-size:2.5rem !important}.is-size-3{font-size:2rem !important}.is-size-4{font-size:1.5rem !important}.is-size-5{font-size:1.25rem !important}.is-size-6{font-size:1rem !important}.is-size-7,html.theme--documenter-dark .docstring>section>a.docs-sourcelink{font-size:.75rem !important}@media screen and (max-width: 768px){.is-size-1-mobile{font-size:3rem !important}.is-size-2-mobile{font-size:2.5rem !important}.is-size-3-mobile{font-size:2rem !important}.is-size-4-mobile{font-size:1.5rem !important}.is-size-5-mobile{font-size:1.25rem !important}.is-size-6-mobile{font-size:1rem !important}.is-size-7-mobile{font-size:.75rem !important}}@media screen and (min-width: 769px),print{.is-size-1-tablet{font-size:3rem !important}.is-size-2-tablet{font-size:2.5rem !important}.is-size-3-tablet{font-size:2rem !important}.is-size-4-tablet{font-size:1.5rem !important}.is-size-5-tablet{font-size:1.25rem !important}.is-size-6-tablet{font-size:1rem !important}.is-size-7-tablet{font-size:.75rem !important}}@media screen and (max-width: 1055px){.is-size-1-touch{font-size:3rem !important}.is-size-2-touch{font-size:2.5rem !important}.is-size-3-touch{font-size:2rem !important}.is-size-4-touch{font-size:1.5rem !important}.is-size-5-touch{font-size:1.25rem !important}.is-size-6-touch{font-size:1rem !important}.is-size-7-touch{font-size:.75rem !important}}@media screen and (min-width: 1056px){.is-size-1-desktop{font-size:3rem !important}.is-size-2-desktop{font-size:2.5rem !important}.is-size-3-desktop{font-size:2rem !important}.is-size-4-desktop{font-size:1.5rem !important}.is-size-5-desktop{font-size:1.25rem !important}.is-size-6-desktop{font-size:1rem !important}.is-size-7-desktop{font-size:.75rem !important}}@media screen and (min-width: 1216px){.is-size-1-widescreen{font-size:3rem !important}.is-size-2-widescreen{font-size:2.5rem !important}.is-size-3-widescreen{font-size:2rem !important}.is-size-4-widescreen{font-size:1.5rem !important}.is-size-5-widescreen{font-size:1.25rem !important}.is-size-6-widescreen{font-size:1rem !important}.is-size-7-widescreen{font-size:.75rem !important}}@media screen and (min-width: 1408px){.is-size-1-fullhd{font-size:3rem !important}.is-size-2-fullhd{font-size:2.5rem !important}.is-size-3-fullhd{font-size:2rem !important}.is-size-4-fullhd{font-size:1.5rem !important}.is-size-5-fullhd{font-size:1.25rem !important}.is-size-6-fullhd{font-size:1rem !important}.is-size-7-fullhd{font-size:.75rem !important}}.has-text-centered{text-align:center !important}.has-text-justified{text-align:justify !important}.has-text-left{text-align:left !important}.has-text-right{text-align:right !important}@media screen and (max-width: 768px){.has-text-centered-mobile{text-align:center !important}}@media screen and (min-width: 769px),print{.has-text-centered-tablet{text-align:center !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.has-text-centered-tablet-only{text-align:center !important}}@media screen and (max-width: 1055px){.has-text-centered-touch{text-align:center !important}}@media screen and (min-width: 1056px){.has-text-centered-desktop{text-align:center !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.has-text-centered-desktop-only{text-align:center !important}}@media screen and (min-width: 1216px){.has-text-centered-widescreen{text-align:center !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.has-text-centered-widescreen-only{text-align:center !important}}@media screen and (min-width: 1408px){.has-text-centered-fullhd{text-align:center !important}}@media screen and (max-width: 768px){.has-text-justified-mobile{text-align:justify !important}}@media screen and (min-width: 769px),print{.has-text-justified-tablet{text-align:justify !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.has-text-justified-tablet-only{text-align:justify !important}}@media screen and (max-width: 1055px){.has-text-justified-touch{text-align:justify !important}}@media screen and (min-width: 1056px){.has-text-justified-desktop{text-align:justify !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.has-text-justified-desktop-only{text-align:justify !important}}@media screen and (min-width: 1216px){.has-text-justified-widescreen{text-align:justify !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.has-text-justified-widescreen-only{text-align:justify !important}}@media screen and (min-width: 1408px){.has-text-justified-fullhd{text-align:justify !important}}@media screen and (max-width: 768px){.has-text-left-mobile{text-align:left !important}}@media screen and (min-width: 769px),print{.has-text-left-tablet{text-align:left !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.has-text-left-tablet-only{text-align:left !important}}@media screen and (max-width: 1055px){.has-text-left-touch{text-align:left !important}}@media screen and (min-width: 1056px){.has-text-left-desktop{text-align:left !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.has-text-left-desktop-only{text-align:left !important}}@media screen and (min-width: 1216px){.has-text-left-widescreen{text-align:left !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.has-text-left-widescreen-only{text-align:left !important}}@media screen and (min-width: 1408px){.has-text-left-fullhd{text-align:left !important}}@media screen and (max-width: 768px){.has-text-right-mobile{text-align:right !important}}@media screen and (min-width: 769px),print{.has-text-right-tablet{text-align:right !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.has-text-right-tablet-only{text-align:right !important}}@media screen and (max-width: 1055px){.has-text-right-touch{text-align:right !important}}@media screen and (min-width: 1056px){.has-text-right-desktop{text-align:right !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.has-text-right-desktop-only{text-align:right !important}}@media screen and (min-width: 1216px){.has-text-right-widescreen{text-align:right !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.has-text-right-widescreen-only{text-align:right !important}}@media screen and (min-width: 1408px){.has-text-right-fullhd{text-align:right !important}}.is-capitalized{text-transform:capitalize !important}.is-lowercase{text-transform:lowercase !important}.is-uppercase{text-transform:uppercase !important}.is-italic{font-style:italic !important}.is-underlined{text-decoration:underline !important}.has-text-weight-light{font-weight:300 !important}.has-text-weight-normal{font-weight:400 !important}.has-text-weight-medium{font-weight:500 !important}.has-text-weight-semibold{font-weight:600 !important}.has-text-weight-bold{font-weight:700 !important}.is-family-primary{font-family:"Lato Medium",-apple-system,BlinkMacSystemFont,"Segoe UI","Helvetica Neue","Helvetica","Arial",sans-serif !important}.is-family-secondary{font-family:"Lato Medium",-apple-system,BlinkMacSystemFont,"Segoe UI","Helvetica Neue","Helvetica","Arial",sans-serif !important}.is-family-sans-serif{font-family:"Lato Medium",-apple-system,BlinkMacSystemFont,"Segoe UI","Helvetica Neue","Helvetica","Arial",sans-serif !important}.is-family-monospace{font-family:"JuliaMono","SFMono-Regular","Menlo","Consolas","Liberation Mono","DejaVu Sans Mono",monospace !important}.is-family-code{font-family:"JuliaMono","SFMono-Regular","Menlo","Consolas","Liberation Mono","DejaVu Sans Mono",monospace !important}.is-block{display:block !important}@media screen and (max-width: 768px){.is-block-mobile{display:block !important}}@media screen and (min-width: 769px),print{.is-block-tablet{display:block !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.is-block-tablet-only{display:block !important}}@media screen and (max-width: 1055px){.is-block-touch{display:block !important}}@media screen and (min-width: 1056px){.is-block-desktop{display:block !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.is-block-desktop-only{display:block !important}}@media screen and (min-width: 1216px){.is-block-widescreen{display:block !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.is-block-widescreen-only{display:block !important}}@media screen and (min-width: 1408px){.is-block-fullhd{display:block !important}}.is-flex{display:flex !important}@media screen and (max-width: 768px){.is-flex-mobile{display:flex !important}}@media screen and (min-width: 769px),print{.is-flex-tablet{display:flex !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.is-flex-tablet-only{display:flex !important}}@media screen and (max-width: 1055px){.is-flex-touch{display:flex !important}}@media screen and (min-width: 1056px){.is-flex-desktop{display:flex !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.is-flex-desktop-only{display:flex !important}}@media screen and (min-width: 1216px){.is-flex-widescreen{display:flex !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.is-flex-widescreen-only{display:flex !important}}@media screen and (min-width: 1408px){.is-flex-fullhd{display:flex !important}}.is-inline{display:inline !important}@media screen and (max-width: 768px){.is-inline-mobile{display:inline !important}}@media screen and (min-width: 769px),print{.is-inline-tablet{display:inline !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.is-inline-tablet-only{display:inline !important}}@media screen and (max-width: 1055px){.is-inline-touch{display:inline !important}}@media screen and (min-width: 1056px){.is-inline-desktop{display:inline !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.is-inline-desktop-only{display:inline !important}}@media screen and (min-width: 1216px){.is-inline-widescreen{display:inline !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.is-inline-widescreen-only{display:inline !important}}@media screen and (min-width: 1408px){.is-inline-fullhd{display:inline !important}}.is-inline-block{display:inline-block !important}@media screen and (max-width: 768px){.is-inline-block-mobile{display:inline-block !important}}@media screen and (min-width: 769px),print{.is-inline-block-tablet{display:inline-block !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.is-inline-block-tablet-only{display:inline-block !important}}@media screen and (max-width: 1055px){.is-inline-block-touch{display:inline-block !important}}@media screen and (min-width: 1056px){.is-inline-block-desktop{display:inline-block !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.is-inline-block-desktop-only{display:inline-block !important}}@media screen and (min-width: 1216px){.is-inline-block-widescreen{display:inline-block !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.is-inline-block-widescreen-only{display:inline-block !important}}@media screen and (min-width: 1408px){.is-inline-block-fullhd{display:inline-block !important}}.is-inline-flex{display:inline-flex !important}@media screen and (max-width: 768px){.is-inline-flex-mobile{display:inline-flex !important}}@media screen and (min-width: 769px),print{.is-inline-flex-tablet{display:inline-flex !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.is-inline-flex-tablet-only{display:inline-flex !important}}@media screen and (max-width: 1055px){.is-inline-flex-touch{display:inline-flex !important}}@media screen and (min-width: 1056px){.is-inline-flex-desktop{display:inline-flex !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.is-inline-flex-desktop-only{display:inline-flex !important}}@media screen and (min-width: 1216px){.is-inline-flex-widescreen{display:inline-flex !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.is-inline-flex-widescreen-only{display:inline-flex !important}}@media screen and (min-width: 1408px){.is-inline-flex-fullhd{display:inline-flex !important}}.is-hidden{display:none !important}.is-sr-only{border:none !important;clip:rect(0, 0, 0, 0) !important;height:0.01em !important;overflow:hidden !important;padding:0 !important;position:absolute !important;white-space:nowrap !important;width:0.01em !important}@media screen and (max-width: 768px){.is-hidden-mobile{display:none !important}}@media screen and (min-width: 769px),print{.is-hidden-tablet{display:none !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.is-hidden-tablet-only{display:none !important}}@media screen and (max-width: 1055px){.is-hidden-touch{display:none !important}}@media screen and (min-width: 1056px){.is-hidden-desktop{display:none !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.is-hidden-desktop-only{display:none !important}}@media screen and (min-width: 1216px){.is-hidden-widescreen{display:none !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.is-hidden-widescreen-only{display:none !important}}@media screen and (min-width: 1408px){.is-hidden-fullhd{display:none !important}}.is-invisible{visibility:hidden !important}@media screen and (max-width: 768px){.is-invisible-mobile{visibility:hidden !important}}@media screen and (min-width: 769px),print{.is-invisible-tablet{visibility:hidden !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.is-invisible-tablet-only{visibility:hidden !important}}@media screen and (max-width: 1055px){.is-invisible-touch{visibility:hidden !important}}@media screen and (min-width: 1056px){.is-invisible-desktop{visibility:hidden !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.is-invisible-desktop-only{visibility:hidden !important}}@media screen and (min-width: 1216px){.is-invisible-widescreen{visibility:hidden !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.is-invisible-widescreen-only{visibility:hidden !important}}@media screen and (min-width: 1408px){.is-invisible-fullhd{visibility:hidden !important}}html.theme--documenter-dark{/*! + Theme: a11y-dark + Author: @ericwbailey + Maintainer: @ericwbailey + + Based on the Tomorrow Night Eighties theme: https://github.com/isagalaev/highlight.js/blob/master/src/styles/tomorrow-night-eighties.css +*/}html.theme--documenter-dark html{background-color:#1f2424;font-size:16px;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;min-width:300px;overflow-x:auto;overflow-y:scroll;text-rendering:optimizeLegibility;text-size-adjust:100%}html.theme--documenter-dark article,html.theme--documenter-dark aside,html.theme--documenter-dark figure,html.theme--documenter-dark footer,html.theme--documenter-dark header,html.theme--documenter-dark hgroup,html.theme--documenter-dark section{display:block}html.theme--documenter-dark body,html.theme--documenter-dark button,html.theme--documenter-dark input,html.theme--documenter-dark optgroup,html.theme--documenter-dark select,html.theme--documenter-dark textarea{font-family:"Lato Medium",-apple-system,BlinkMacSystemFont,"Segoe UI","Helvetica Neue","Helvetica","Arial",sans-serif}html.theme--documenter-dark code,html.theme--documenter-dark pre{-moz-osx-font-smoothing:auto;-webkit-font-smoothing:auto;font-family:"JuliaMono","SFMono-Regular","Menlo","Consolas","Liberation Mono","DejaVu Sans Mono",monospace}html.theme--documenter-dark body{color:#fff;font-size:1em;font-weight:400;line-height:1.5}html.theme--documenter-dark a{color:#1abc9c;cursor:pointer;text-decoration:none}html.theme--documenter-dark a strong{color:currentColor}html.theme--documenter-dark a:hover{color:#1dd2af}html.theme--documenter-dark code{background-color:rgba(255,255,255,0.05);color:#ececec;font-size:.875em;font-weight:normal;padding:.1em}html.theme--documenter-dark hr{background-color:#282f2f;border:none;display:block;height:2px;margin:1.5rem 0}html.theme--documenter-dark img{height:auto;max-width:100%}html.theme--documenter-dark input[type="checkbox"],html.theme--documenter-dark input[type="radio"]{vertical-align:baseline}html.theme--documenter-dark small{font-size:.875em}html.theme--documenter-dark span{font-style:inherit;font-weight:inherit}html.theme--documenter-dark strong{color:#f2f2f2;font-weight:700}html.theme--documenter-dark fieldset{border:none}html.theme--documenter-dark pre{-webkit-overflow-scrolling:touch;background-color:#282f2f;color:#fff;font-size:.875em;overflow-x:auto;padding:1.25rem 1.5rem;white-space:pre;word-wrap:normal}html.theme--documenter-dark pre code{background-color:transparent;color:currentColor;font-size:1em;padding:0}html.theme--documenter-dark table td,html.theme--documenter-dark table th{vertical-align:top}html.theme--documenter-dark table td:not([align]),html.theme--documenter-dark table th:not([align]){text-align:inherit}html.theme--documenter-dark table th{color:#f2f2f2}html.theme--documenter-dark .box{background-color:#343c3d;border-radius:8px;box-shadow:none;color:#fff;display:block;padding:1.25rem}html.theme--documenter-dark a.box:hover,html.theme--documenter-dark a.box:focus{box-shadow:0 0.5em 1em -0.125em rgba(10,10,10,0.1),0 0 0 1px #1abc9c}html.theme--documenter-dark a.box:active{box-shadow:inset 0 1px 2px rgba(10,10,10,0.2),0 0 0 1px #1abc9c}html.theme--documenter-dark .button{background-color:#282f2f;border-color:#4c5759;border-width:1px;color:#375a7f;cursor:pointer;justify-content:center;padding-bottom:calc(0.5em - 1px);padding-left:1em;padding-right:1em;padding-top:calc(0.5em - 1px);text-align:center;white-space:nowrap}html.theme--documenter-dark .button strong{color:inherit}html.theme--documenter-dark .button .icon,html.theme--documenter-dark .button .icon.is-small,html.theme--documenter-dark .button #documenter .docs-sidebar form.docs-search>input.icon,html.theme--documenter-dark #documenter .docs-sidebar .button form.docs-search>input.icon,html.theme--documenter-dark .button .icon.is-medium,html.theme--documenter-dark .button .icon.is-large{height:1.5em;width:1.5em}html.theme--documenter-dark .button .icon:first-child:not(:last-child){margin-left:calc(-0.5em - 1px);margin-right:.25em}html.theme--documenter-dark .button .icon:last-child:not(:first-child){margin-left:.25em;margin-right:calc(-0.5em - 1px)}html.theme--documenter-dark .button .icon:first-child:last-child{margin-left:calc(-0.5em - 1px);margin-right:calc(-0.5em - 1px)}html.theme--documenter-dark .button:hover,html.theme--documenter-dark .button.is-hovered{border-color:#8c9b9d;color:#f2f2f2}html.theme--documenter-dark .button:focus,html.theme--documenter-dark .button.is-focused{border-color:#8c9b9d;color:#17a689}html.theme--documenter-dark .button:focus:not(:active),html.theme--documenter-dark .button.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(26,188,156,0.25)}html.theme--documenter-dark .button:active,html.theme--documenter-dark .button.is-active{border-color:#343c3d;color:#f2f2f2}html.theme--documenter-dark .button.is-text{background-color:transparent;border-color:transparent;color:#fff;text-decoration:underline}html.theme--documenter-dark .button.is-text:hover,html.theme--documenter-dark .button.is-text.is-hovered,html.theme--documenter-dark .button.is-text:focus,html.theme--documenter-dark .button.is-text.is-focused{background-color:#282f2f;color:#f2f2f2}html.theme--documenter-dark .button.is-text:active,html.theme--documenter-dark .button.is-text.is-active{background-color:#1d2122;color:#f2f2f2}html.theme--documenter-dark .button.is-text[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-text{background-color:transparent;border-color:transparent;box-shadow:none}html.theme--documenter-dark .button.is-ghost{background:none;border-color:rgba(0,0,0,0);color:#1abc9c;text-decoration:none}html.theme--documenter-dark .button.is-ghost:hover,html.theme--documenter-dark .button.is-ghost.is-hovered{color:#1abc9c;text-decoration:underline}html.theme--documenter-dark .button.is-white{background-color:#fff;border-color:transparent;color:#0a0a0a}html.theme--documenter-dark .button.is-white:hover,html.theme--documenter-dark .button.is-white.is-hovered{background-color:#f9f9f9;border-color:transparent;color:#0a0a0a}html.theme--documenter-dark .button.is-white:focus,html.theme--documenter-dark .button.is-white.is-focused{border-color:transparent;color:#0a0a0a}html.theme--documenter-dark .button.is-white:focus:not(:active),html.theme--documenter-dark .button.is-white.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(255,255,255,0.25)}html.theme--documenter-dark .button.is-white:active,html.theme--documenter-dark .button.is-white.is-active{background-color:#f2f2f2;border-color:transparent;color:#0a0a0a}html.theme--documenter-dark .button.is-white[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-white{background-color:#fff;border-color:#fff;box-shadow:none}html.theme--documenter-dark .button.is-white.is-inverted{background-color:#0a0a0a;color:#fff}html.theme--documenter-dark .button.is-white.is-inverted:hover,html.theme--documenter-dark .button.is-white.is-inverted.is-hovered{background-color:#000}html.theme--documenter-dark .button.is-white.is-inverted[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-white.is-inverted{background-color:#0a0a0a;border-color:transparent;box-shadow:none;color:#fff}html.theme--documenter-dark .button.is-white.is-loading::after{border-color:transparent transparent #0a0a0a #0a0a0a !important}html.theme--documenter-dark .button.is-white.is-outlined{background-color:transparent;border-color:#fff;color:#fff}html.theme--documenter-dark .button.is-white.is-outlined:hover,html.theme--documenter-dark .button.is-white.is-outlined.is-hovered,html.theme--documenter-dark .button.is-white.is-outlined:focus,html.theme--documenter-dark .button.is-white.is-outlined.is-focused{background-color:#fff;border-color:#fff;color:#0a0a0a}html.theme--documenter-dark .button.is-white.is-outlined.is-loading::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-white.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-white.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-white.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-white.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #0a0a0a #0a0a0a !important}html.theme--documenter-dark .button.is-white.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-white.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}html.theme--documenter-dark .button.is-white.is-inverted.is-outlined{background-color:transparent;border-color:#0a0a0a;color:#0a0a0a}html.theme--documenter-dark .button.is-white.is-inverted.is-outlined:hover,html.theme--documenter-dark .button.is-white.is-inverted.is-outlined.is-hovered,html.theme--documenter-dark .button.is-white.is-inverted.is-outlined:focus,html.theme--documenter-dark .button.is-white.is-inverted.is-outlined.is-focused{background-color:#0a0a0a;color:#fff}html.theme--documenter-dark .button.is-white.is-inverted.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-white.is-inverted.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-white.is-inverted.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-white.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-white.is-inverted.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-white.is-inverted.is-outlined{background-color:transparent;border-color:#0a0a0a;box-shadow:none;color:#0a0a0a}html.theme--documenter-dark .button.is-black{background-color:#0a0a0a;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-black:hover,html.theme--documenter-dark .button.is-black.is-hovered{background-color:#040404;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-black:focus,html.theme--documenter-dark .button.is-black.is-focused{border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-black:focus:not(:active),html.theme--documenter-dark .button.is-black.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(10,10,10,0.25)}html.theme--documenter-dark .button.is-black:active,html.theme--documenter-dark .button.is-black.is-active{background-color:#000;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-black[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-black{background-color:#0a0a0a;border-color:#0a0a0a;box-shadow:none}html.theme--documenter-dark .button.is-black.is-inverted{background-color:#fff;color:#0a0a0a}html.theme--documenter-dark .button.is-black.is-inverted:hover,html.theme--documenter-dark .button.is-black.is-inverted.is-hovered{background-color:#f2f2f2}html.theme--documenter-dark .button.is-black.is-inverted[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-black.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#0a0a0a}html.theme--documenter-dark .button.is-black.is-loading::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-black.is-outlined{background-color:transparent;border-color:#0a0a0a;color:#0a0a0a}html.theme--documenter-dark .button.is-black.is-outlined:hover,html.theme--documenter-dark .button.is-black.is-outlined.is-hovered,html.theme--documenter-dark .button.is-black.is-outlined:focus,html.theme--documenter-dark .button.is-black.is-outlined.is-focused{background-color:#0a0a0a;border-color:#0a0a0a;color:#fff}html.theme--documenter-dark .button.is-black.is-outlined.is-loading::after{border-color:transparent transparent #0a0a0a #0a0a0a !important}html.theme--documenter-dark .button.is-black.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-black.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-black.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-black.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-black.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-black.is-outlined{background-color:transparent;border-color:#0a0a0a;box-shadow:none;color:#0a0a0a}html.theme--documenter-dark .button.is-black.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}html.theme--documenter-dark .button.is-black.is-inverted.is-outlined:hover,html.theme--documenter-dark .button.is-black.is-inverted.is-outlined.is-hovered,html.theme--documenter-dark .button.is-black.is-inverted.is-outlined:focus,html.theme--documenter-dark .button.is-black.is-inverted.is-outlined.is-focused{background-color:#fff;color:#0a0a0a}html.theme--documenter-dark .button.is-black.is-inverted.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-black.is-inverted.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-black.is-inverted.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-black.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #0a0a0a #0a0a0a !important}html.theme--documenter-dark .button.is-black.is-inverted.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-black.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}html.theme--documenter-dark .button.is-light{background-color:#ecf0f1;border-color:transparent;color:rgba(0,0,0,0.7)}html.theme--documenter-dark .button.is-light:hover,html.theme--documenter-dark .button.is-light.is-hovered{background-color:#e5eaec;border-color:transparent;color:rgba(0,0,0,0.7)}html.theme--documenter-dark .button.is-light:focus,html.theme--documenter-dark .button.is-light.is-focused{border-color:transparent;color:rgba(0,0,0,0.7)}html.theme--documenter-dark .button.is-light:focus:not(:active),html.theme--documenter-dark .button.is-light.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(236,240,241,0.25)}html.theme--documenter-dark .button.is-light:active,html.theme--documenter-dark .button.is-light.is-active{background-color:#dde4e6;border-color:transparent;color:rgba(0,0,0,0.7)}html.theme--documenter-dark .button.is-light[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-light{background-color:#ecf0f1;border-color:#ecf0f1;box-shadow:none}html.theme--documenter-dark .button.is-light.is-inverted{background-color:rgba(0,0,0,0.7);color:#ecf0f1}html.theme--documenter-dark .button.is-light.is-inverted:hover,html.theme--documenter-dark .button.is-light.is-inverted.is-hovered{background-color:rgba(0,0,0,0.7)}html.theme--documenter-dark .button.is-light.is-inverted[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-light.is-inverted{background-color:rgba(0,0,0,0.7);border-color:transparent;box-shadow:none;color:#ecf0f1}html.theme--documenter-dark .button.is-light.is-loading::after{border-color:transparent transparent rgba(0,0,0,0.7) rgba(0,0,0,0.7) !important}html.theme--documenter-dark .button.is-light.is-outlined{background-color:transparent;border-color:#ecf0f1;color:#ecf0f1}html.theme--documenter-dark .button.is-light.is-outlined:hover,html.theme--documenter-dark .button.is-light.is-outlined.is-hovered,html.theme--documenter-dark .button.is-light.is-outlined:focus,html.theme--documenter-dark .button.is-light.is-outlined.is-focused{background-color:#ecf0f1;border-color:#ecf0f1;color:rgba(0,0,0,0.7)}html.theme--documenter-dark .button.is-light.is-outlined.is-loading::after{border-color:transparent transparent #ecf0f1 #ecf0f1 !important}html.theme--documenter-dark .button.is-light.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-light.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-light.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-light.is-outlined.is-loading.is-focused::after{border-color:transparent transparent rgba(0,0,0,0.7) rgba(0,0,0,0.7) !important}html.theme--documenter-dark .button.is-light.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-light.is-outlined{background-color:transparent;border-color:#ecf0f1;box-shadow:none;color:#ecf0f1}html.theme--documenter-dark .button.is-light.is-inverted.is-outlined{background-color:transparent;border-color:rgba(0,0,0,0.7);color:rgba(0,0,0,0.7)}html.theme--documenter-dark .button.is-light.is-inverted.is-outlined:hover,html.theme--documenter-dark .button.is-light.is-inverted.is-outlined.is-hovered,html.theme--documenter-dark .button.is-light.is-inverted.is-outlined:focus,html.theme--documenter-dark .button.is-light.is-inverted.is-outlined.is-focused{background-color:rgba(0,0,0,0.7);color:#ecf0f1}html.theme--documenter-dark .button.is-light.is-inverted.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-light.is-inverted.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-light.is-inverted.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-light.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #ecf0f1 #ecf0f1 !important}html.theme--documenter-dark .button.is-light.is-inverted.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-light.is-inverted.is-outlined{background-color:transparent;border-color:rgba(0,0,0,0.7);box-shadow:none;color:rgba(0,0,0,0.7)}html.theme--documenter-dark .button.is-dark,html.theme--documenter-dark .content kbd.button{background-color:#282f2f;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-dark:hover,html.theme--documenter-dark .content kbd.button:hover,html.theme--documenter-dark .button.is-dark.is-hovered,html.theme--documenter-dark .content kbd.button.is-hovered{background-color:#232829;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-dark:focus,html.theme--documenter-dark .content kbd.button:focus,html.theme--documenter-dark .button.is-dark.is-focused,html.theme--documenter-dark .content kbd.button.is-focused{border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-dark:focus:not(:active),html.theme--documenter-dark .content kbd.button:focus:not(:active),html.theme--documenter-dark .button.is-dark.is-focused:not(:active),html.theme--documenter-dark .content kbd.button.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(40,47,47,0.25)}html.theme--documenter-dark .button.is-dark:active,html.theme--documenter-dark .content kbd.button:active,html.theme--documenter-dark .button.is-dark.is-active,html.theme--documenter-dark .content kbd.button.is-active{background-color:#1d2122;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-dark[disabled],html.theme--documenter-dark .content kbd.button[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-dark,fieldset[disabled] html.theme--documenter-dark .content kbd.button{background-color:#282f2f;border-color:#282f2f;box-shadow:none}html.theme--documenter-dark .button.is-dark.is-inverted,html.theme--documenter-dark .content kbd.button.is-inverted{background-color:#fff;color:#282f2f}html.theme--documenter-dark .button.is-dark.is-inverted:hover,html.theme--documenter-dark .content kbd.button.is-inverted:hover,html.theme--documenter-dark .button.is-dark.is-inverted.is-hovered,html.theme--documenter-dark .content kbd.button.is-inverted.is-hovered{background-color:#f2f2f2}html.theme--documenter-dark .button.is-dark.is-inverted[disabled],html.theme--documenter-dark .content kbd.button.is-inverted[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-dark.is-inverted,fieldset[disabled] html.theme--documenter-dark .content kbd.button.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#282f2f}html.theme--documenter-dark .button.is-dark.is-loading::after,html.theme--documenter-dark .content kbd.button.is-loading::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-dark.is-outlined,html.theme--documenter-dark .content kbd.button.is-outlined{background-color:transparent;border-color:#282f2f;color:#282f2f}html.theme--documenter-dark .button.is-dark.is-outlined:hover,html.theme--documenter-dark .content kbd.button.is-outlined:hover,html.theme--documenter-dark .button.is-dark.is-outlined.is-hovered,html.theme--documenter-dark .content kbd.button.is-outlined.is-hovered,html.theme--documenter-dark .button.is-dark.is-outlined:focus,html.theme--documenter-dark .content kbd.button.is-outlined:focus,html.theme--documenter-dark .button.is-dark.is-outlined.is-focused,html.theme--documenter-dark .content kbd.button.is-outlined.is-focused{background-color:#282f2f;border-color:#282f2f;color:#fff}html.theme--documenter-dark .button.is-dark.is-outlined.is-loading::after,html.theme--documenter-dark .content kbd.button.is-outlined.is-loading::after{border-color:transparent transparent #282f2f #282f2f !important}html.theme--documenter-dark .button.is-dark.is-outlined.is-loading:hover::after,html.theme--documenter-dark .content kbd.button.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-dark.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .content kbd.button.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-dark.is-outlined.is-loading:focus::after,html.theme--documenter-dark .content kbd.button.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-dark.is-outlined.is-loading.is-focused::after,html.theme--documenter-dark .content kbd.button.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-dark.is-outlined[disabled],html.theme--documenter-dark .content kbd.button.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-dark.is-outlined,fieldset[disabled] html.theme--documenter-dark .content kbd.button.is-outlined{background-color:transparent;border-color:#282f2f;box-shadow:none;color:#282f2f}html.theme--documenter-dark .button.is-dark.is-inverted.is-outlined,html.theme--documenter-dark .content kbd.button.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}html.theme--documenter-dark .button.is-dark.is-inverted.is-outlined:hover,html.theme--documenter-dark .content kbd.button.is-inverted.is-outlined:hover,html.theme--documenter-dark .button.is-dark.is-inverted.is-outlined.is-hovered,html.theme--documenter-dark .content kbd.button.is-inverted.is-outlined.is-hovered,html.theme--documenter-dark .button.is-dark.is-inverted.is-outlined:focus,html.theme--documenter-dark .content kbd.button.is-inverted.is-outlined:focus,html.theme--documenter-dark .button.is-dark.is-inverted.is-outlined.is-focused,html.theme--documenter-dark .content kbd.button.is-inverted.is-outlined.is-focused{background-color:#fff;color:#282f2f}html.theme--documenter-dark .button.is-dark.is-inverted.is-outlined.is-loading:hover::after,html.theme--documenter-dark .content kbd.button.is-inverted.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-dark.is-inverted.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .content kbd.button.is-inverted.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-dark.is-inverted.is-outlined.is-loading:focus::after,html.theme--documenter-dark .content kbd.button.is-inverted.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-dark.is-inverted.is-outlined.is-loading.is-focused::after,html.theme--documenter-dark .content kbd.button.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #282f2f #282f2f !important}html.theme--documenter-dark .button.is-dark.is-inverted.is-outlined[disabled],html.theme--documenter-dark .content kbd.button.is-inverted.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-dark.is-inverted.is-outlined,fieldset[disabled] html.theme--documenter-dark .content kbd.button.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}html.theme--documenter-dark .button.is-primary,html.theme--documenter-dark .docstring>section>a.button.docs-sourcelink{background-color:#375a7f;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-primary:hover,html.theme--documenter-dark .docstring>section>a.button.docs-sourcelink:hover,html.theme--documenter-dark .button.is-primary.is-hovered,html.theme--documenter-dark .docstring>section>a.button.is-hovered.docs-sourcelink{background-color:#335476;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-primary:focus,html.theme--documenter-dark .docstring>section>a.button.docs-sourcelink:focus,html.theme--documenter-dark .button.is-primary.is-focused,html.theme--documenter-dark .docstring>section>a.button.is-focused.docs-sourcelink{border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-primary:focus:not(:active),html.theme--documenter-dark .docstring>section>a.button.docs-sourcelink:focus:not(:active),html.theme--documenter-dark .button.is-primary.is-focused:not(:active),html.theme--documenter-dark .docstring>section>a.button.is-focused.docs-sourcelink:not(:active){box-shadow:0 0 0 0.125em rgba(55,90,127,0.25)}html.theme--documenter-dark .button.is-primary:active,html.theme--documenter-dark .docstring>section>a.button.docs-sourcelink:active,html.theme--documenter-dark .button.is-primary.is-active,html.theme--documenter-dark .docstring>section>a.button.is-active.docs-sourcelink{background-color:#2f4d6d;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-primary[disabled],html.theme--documenter-dark .docstring>section>a.button.docs-sourcelink[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-primary,fieldset[disabled] html.theme--documenter-dark .docstring>section>a.button.docs-sourcelink{background-color:#375a7f;border-color:#375a7f;box-shadow:none}html.theme--documenter-dark .button.is-primary.is-inverted,html.theme--documenter-dark .docstring>section>a.button.is-inverted.docs-sourcelink{background-color:#fff;color:#375a7f}html.theme--documenter-dark .button.is-primary.is-inverted:hover,html.theme--documenter-dark .docstring>section>a.button.is-inverted.docs-sourcelink:hover,html.theme--documenter-dark .button.is-primary.is-inverted.is-hovered,html.theme--documenter-dark .docstring>section>a.button.is-inverted.is-hovered.docs-sourcelink{background-color:#f2f2f2}html.theme--documenter-dark .button.is-primary.is-inverted[disabled],html.theme--documenter-dark .docstring>section>a.button.is-inverted.docs-sourcelink[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-primary.is-inverted,fieldset[disabled] html.theme--documenter-dark .docstring>section>a.button.is-inverted.docs-sourcelink{background-color:#fff;border-color:transparent;box-shadow:none;color:#375a7f}html.theme--documenter-dark .button.is-primary.is-loading::after,html.theme--documenter-dark .docstring>section>a.button.is-loading.docs-sourcelink::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-primary.is-outlined,html.theme--documenter-dark .docstring>section>a.button.is-outlined.docs-sourcelink{background-color:transparent;border-color:#375a7f;color:#375a7f}html.theme--documenter-dark .button.is-primary.is-outlined:hover,html.theme--documenter-dark .docstring>section>a.button.is-outlined.docs-sourcelink:hover,html.theme--documenter-dark .button.is-primary.is-outlined.is-hovered,html.theme--documenter-dark .docstring>section>a.button.is-outlined.is-hovered.docs-sourcelink,html.theme--documenter-dark .button.is-primary.is-outlined:focus,html.theme--documenter-dark .docstring>section>a.button.is-outlined.docs-sourcelink:focus,html.theme--documenter-dark .button.is-primary.is-outlined.is-focused,html.theme--documenter-dark .docstring>section>a.button.is-outlined.is-focused.docs-sourcelink{background-color:#375a7f;border-color:#375a7f;color:#fff}html.theme--documenter-dark .button.is-primary.is-outlined.is-loading::after,html.theme--documenter-dark .docstring>section>a.button.is-outlined.is-loading.docs-sourcelink::after{border-color:transparent transparent #375a7f #375a7f !important}html.theme--documenter-dark .button.is-primary.is-outlined.is-loading:hover::after,html.theme--documenter-dark .docstring>section>a.button.is-outlined.is-loading.docs-sourcelink:hover::after,html.theme--documenter-dark .button.is-primary.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .docstring>section>a.button.is-outlined.is-loading.is-hovered.docs-sourcelink::after,html.theme--documenter-dark .button.is-primary.is-outlined.is-loading:focus::after,html.theme--documenter-dark .docstring>section>a.button.is-outlined.is-loading.docs-sourcelink:focus::after,html.theme--documenter-dark .button.is-primary.is-outlined.is-loading.is-focused::after,html.theme--documenter-dark .docstring>section>a.button.is-outlined.is-loading.is-focused.docs-sourcelink::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-primary.is-outlined[disabled],html.theme--documenter-dark .docstring>section>a.button.is-outlined.docs-sourcelink[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-primary.is-outlined,fieldset[disabled] html.theme--documenter-dark .docstring>section>a.button.is-outlined.docs-sourcelink{background-color:transparent;border-color:#375a7f;box-shadow:none;color:#375a7f}html.theme--documenter-dark .button.is-primary.is-inverted.is-outlined,html.theme--documenter-dark .docstring>section>a.button.is-inverted.is-outlined.docs-sourcelink{background-color:transparent;border-color:#fff;color:#fff}html.theme--documenter-dark .button.is-primary.is-inverted.is-outlined:hover,html.theme--documenter-dark .docstring>section>a.button.is-inverted.is-outlined.docs-sourcelink:hover,html.theme--documenter-dark .button.is-primary.is-inverted.is-outlined.is-hovered,html.theme--documenter-dark .docstring>section>a.button.is-inverted.is-outlined.is-hovered.docs-sourcelink,html.theme--documenter-dark .button.is-primary.is-inverted.is-outlined:focus,html.theme--documenter-dark .docstring>section>a.button.is-inverted.is-outlined.docs-sourcelink:focus,html.theme--documenter-dark .button.is-primary.is-inverted.is-outlined.is-focused,html.theme--documenter-dark .docstring>section>a.button.is-inverted.is-outlined.is-focused.docs-sourcelink{background-color:#fff;color:#375a7f}html.theme--documenter-dark .button.is-primary.is-inverted.is-outlined.is-loading:hover::after,html.theme--documenter-dark .docstring>section>a.button.is-inverted.is-outlined.is-loading.docs-sourcelink:hover::after,html.theme--documenter-dark .button.is-primary.is-inverted.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .docstring>section>a.button.is-inverted.is-outlined.is-loading.is-hovered.docs-sourcelink::after,html.theme--documenter-dark .button.is-primary.is-inverted.is-outlined.is-loading:focus::after,html.theme--documenter-dark .docstring>section>a.button.is-inverted.is-outlined.is-loading.docs-sourcelink:focus::after,html.theme--documenter-dark .button.is-primary.is-inverted.is-outlined.is-loading.is-focused::after,html.theme--documenter-dark .docstring>section>a.button.is-inverted.is-outlined.is-loading.is-focused.docs-sourcelink::after{border-color:transparent transparent #375a7f #375a7f !important}html.theme--documenter-dark .button.is-primary.is-inverted.is-outlined[disabled],html.theme--documenter-dark .docstring>section>a.button.is-inverted.is-outlined.docs-sourcelink[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-primary.is-inverted.is-outlined,fieldset[disabled] html.theme--documenter-dark .docstring>section>a.button.is-inverted.is-outlined.docs-sourcelink{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}html.theme--documenter-dark .button.is-primary.is-light,html.theme--documenter-dark .docstring>section>a.button.is-light.docs-sourcelink{background-color:#f1f5f9;color:#4d7eb2}html.theme--documenter-dark .button.is-primary.is-light:hover,html.theme--documenter-dark .docstring>section>a.button.is-light.docs-sourcelink:hover,html.theme--documenter-dark .button.is-primary.is-light.is-hovered,html.theme--documenter-dark .docstring>section>a.button.is-light.is-hovered.docs-sourcelink{background-color:#e8eef5;border-color:transparent;color:#4d7eb2}html.theme--documenter-dark .button.is-primary.is-light:active,html.theme--documenter-dark .docstring>section>a.button.is-light.docs-sourcelink:active,html.theme--documenter-dark .button.is-primary.is-light.is-active,html.theme--documenter-dark .docstring>section>a.button.is-light.is-active.docs-sourcelink{background-color:#dfe8f1;border-color:transparent;color:#4d7eb2}html.theme--documenter-dark .button.is-link{background-color:#1abc9c;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-link:hover,html.theme--documenter-dark .button.is-link.is-hovered{background-color:#18b193;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-link:focus,html.theme--documenter-dark .button.is-link.is-focused{border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-link:focus:not(:active),html.theme--documenter-dark .button.is-link.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(26,188,156,0.25)}html.theme--documenter-dark .button.is-link:active,html.theme--documenter-dark .button.is-link.is-active{background-color:#17a689;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-link[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-link{background-color:#1abc9c;border-color:#1abc9c;box-shadow:none}html.theme--documenter-dark .button.is-link.is-inverted{background-color:#fff;color:#1abc9c}html.theme--documenter-dark .button.is-link.is-inverted:hover,html.theme--documenter-dark .button.is-link.is-inverted.is-hovered{background-color:#f2f2f2}html.theme--documenter-dark .button.is-link.is-inverted[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-link.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#1abc9c}html.theme--documenter-dark .button.is-link.is-loading::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-link.is-outlined{background-color:transparent;border-color:#1abc9c;color:#1abc9c}html.theme--documenter-dark .button.is-link.is-outlined:hover,html.theme--documenter-dark .button.is-link.is-outlined.is-hovered,html.theme--documenter-dark .button.is-link.is-outlined:focus,html.theme--documenter-dark .button.is-link.is-outlined.is-focused{background-color:#1abc9c;border-color:#1abc9c;color:#fff}html.theme--documenter-dark .button.is-link.is-outlined.is-loading::after{border-color:transparent transparent #1abc9c #1abc9c !important}html.theme--documenter-dark .button.is-link.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-link.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-link.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-link.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-link.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-link.is-outlined{background-color:transparent;border-color:#1abc9c;box-shadow:none;color:#1abc9c}html.theme--documenter-dark .button.is-link.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}html.theme--documenter-dark .button.is-link.is-inverted.is-outlined:hover,html.theme--documenter-dark .button.is-link.is-inverted.is-outlined.is-hovered,html.theme--documenter-dark .button.is-link.is-inverted.is-outlined:focus,html.theme--documenter-dark .button.is-link.is-inverted.is-outlined.is-focused{background-color:#fff;color:#1abc9c}html.theme--documenter-dark .button.is-link.is-inverted.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-link.is-inverted.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-link.is-inverted.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-link.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #1abc9c #1abc9c !important}html.theme--documenter-dark .button.is-link.is-inverted.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-link.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}html.theme--documenter-dark .button.is-link.is-light{background-color:#edfdf9;color:#15987e}html.theme--documenter-dark .button.is-link.is-light:hover,html.theme--documenter-dark .button.is-link.is-light.is-hovered{background-color:#e2fbf6;border-color:transparent;color:#15987e}html.theme--documenter-dark .button.is-link.is-light:active,html.theme--documenter-dark .button.is-link.is-light.is-active{background-color:#d7f9f3;border-color:transparent;color:#15987e}html.theme--documenter-dark .button.is-info{background-color:#024c7d;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-info:hover,html.theme--documenter-dark .button.is-info.is-hovered{background-color:#024470;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-info:focus,html.theme--documenter-dark .button.is-info.is-focused{border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-info:focus:not(:active),html.theme--documenter-dark .button.is-info.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(2,76,125,0.25)}html.theme--documenter-dark .button.is-info:active,html.theme--documenter-dark .button.is-info.is-active{background-color:#023d64;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-info[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-info{background-color:#024c7d;border-color:#024c7d;box-shadow:none}html.theme--documenter-dark .button.is-info.is-inverted{background-color:#fff;color:#024c7d}html.theme--documenter-dark .button.is-info.is-inverted:hover,html.theme--documenter-dark .button.is-info.is-inverted.is-hovered{background-color:#f2f2f2}html.theme--documenter-dark .button.is-info.is-inverted[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-info.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#024c7d}html.theme--documenter-dark .button.is-info.is-loading::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-info.is-outlined{background-color:transparent;border-color:#024c7d;color:#024c7d}html.theme--documenter-dark .button.is-info.is-outlined:hover,html.theme--documenter-dark .button.is-info.is-outlined.is-hovered,html.theme--documenter-dark .button.is-info.is-outlined:focus,html.theme--documenter-dark .button.is-info.is-outlined.is-focused{background-color:#024c7d;border-color:#024c7d;color:#fff}html.theme--documenter-dark .button.is-info.is-outlined.is-loading::after{border-color:transparent transparent #024c7d #024c7d !important}html.theme--documenter-dark .button.is-info.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-info.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-info.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-info.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-info.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-info.is-outlined{background-color:transparent;border-color:#024c7d;box-shadow:none;color:#024c7d}html.theme--documenter-dark .button.is-info.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}html.theme--documenter-dark .button.is-info.is-inverted.is-outlined:hover,html.theme--documenter-dark .button.is-info.is-inverted.is-outlined.is-hovered,html.theme--documenter-dark .button.is-info.is-inverted.is-outlined:focus,html.theme--documenter-dark .button.is-info.is-inverted.is-outlined.is-focused{background-color:#fff;color:#024c7d}html.theme--documenter-dark .button.is-info.is-inverted.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-info.is-inverted.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-info.is-inverted.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-info.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #024c7d #024c7d !important}html.theme--documenter-dark .button.is-info.is-inverted.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-info.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}html.theme--documenter-dark .button.is-info.is-light{background-color:#ebf7ff;color:#0e9dfb}html.theme--documenter-dark .button.is-info.is-light:hover,html.theme--documenter-dark .button.is-info.is-light.is-hovered{background-color:#def2fe;border-color:transparent;color:#0e9dfb}html.theme--documenter-dark .button.is-info.is-light:active,html.theme--documenter-dark .button.is-info.is-light.is-active{background-color:#d2edfe;border-color:transparent;color:#0e9dfb}html.theme--documenter-dark .button.is-success{background-color:#008438;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-success:hover,html.theme--documenter-dark .button.is-success.is-hovered{background-color:#073;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-success:focus,html.theme--documenter-dark .button.is-success.is-focused{border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-success:focus:not(:active),html.theme--documenter-dark .button.is-success.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(0,132,56,0.25)}html.theme--documenter-dark .button.is-success:active,html.theme--documenter-dark .button.is-success.is-active{background-color:#006b2d;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-success[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-success{background-color:#008438;border-color:#008438;box-shadow:none}html.theme--documenter-dark .button.is-success.is-inverted{background-color:#fff;color:#008438}html.theme--documenter-dark .button.is-success.is-inverted:hover,html.theme--documenter-dark .button.is-success.is-inverted.is-hovered{background-color:#f2f2f2}html.theme--documenter-dark .button.is-success.is-inverted[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-success.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#008438}html.theme--documenter-dark .button.is-success.is-loading::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-success.is-outlined{background-color:transparent;border-color:#008438;color:#008438}html.theme--documenter-dark .button.is-success.is-outlined:hover,html.theme--documenter-dark .button.is-success.is-outlined.is-hovered,html.theme--documenter-dark .button.is-success.is-outlined:focus,html.theme--documenter-dark .button.is-success.is-outlined.is-focused{background-color:#008438;border-color:#008438;color:#fff}html.theme--documenter-dark .button.is-success.is-outlined.is-loading::after{border-color:transparent transparent #008438 #008438 !important}html.theme--documenter-dark .button.is-success.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-success.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-success.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-success.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-success.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-success.is-outlined{background-color:transparent;border-color:#008438;box-shadow:none;color:#008438}html.theme--documenter-dark .button.is-success.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}html.theme--documenter-dark .button.is-success.is-inverted.is-outlined:hover,html.theme--documenter-dark .button.is-success.is-inverted.is-outlined.is-hovered,html.theme--documenter-dark .button.is-success.is-inverted.is-outlined:focus,html.theme--documenter-dark .button.is-success.is-inverted.is-outlined.is-focused{background-color:#fff;color:#008438}html.theme--documenter-dark .button.is-success.is-inverted.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-success.is-inverted.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-success.is-inverted.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-success.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #008438 #008438 !important}html.theme--documenter-dark .button.is-success.is-inverted.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-success.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}html.theme--documenter-dark .button.is-success.is-light{background-color:#ebfff3;color:#00eb64}html.theme--documenter-dark .button.is-success.is-light:hover,html.theme--documenter-dark .button.is-success.is-light.is-hovered{background-color:#deffec;border-color:transparent;color:#00eb64}html.theme--documenter-dark .button.is-success.is-light:active,html.theme--documenter-dark .button.is-success.is-light.is-active{background-color:#d1ffe5;border-color:transparent;color:#00eb64}html.theme--documenter-dark .button.is-warning{background-color:#ad8100;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-warning:hover,html.theme--documenter-dark .button.is-warning.is-hovered{background-color:#a07700;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-warning:focus,html.theme--documenter-dark .button.is-warning.is-focused{border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-warning:focus:not(:active),html.theme--documenter-dark .button.is-warning.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(173,129,0,0.25)}html.theme--documenter-dark .button.is-warning:active,html.theme--documenter-dark .button.is-warning.is-active{background-color:#946e00;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-warning[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-warning{background-color:#ad8100;border-color:#ad8100;box-shadow:none}html.theme--documenter-dark .button.is-warning.is-inverted{background-color:#fff;color:#ad8100}html.theme--documenter-dark .button.is-warning.is-inverted:hover,html.theme--documenter-dark .button.is-warning.is-inverted.is-hovered{background-color:#f2f2f2}html.theme--documenter-dark .button.is-warning.is-inverted[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-warning.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#ad8100}html.theme--documenter-dark .button.is-warning.is-loading::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-warning.is-outlined{background-color:transparent;border-color:#ad8100;color:#ad8100}html.theme--documenter-dark .button.is-warning.is-outlined:hover,html.theme--documenter-dark .button.is-warning.is-outlined.is-hovered,html.theme--documenter-dark .button.is-warning.is-outlined:focus,html.theme--documenter-dark .button.is-warning.is-outlined.is-focused{background-color:#ad8100;border-color:#ad8100;color:#fff}html.theme--documenter-dark .button.is-warning.is-outlined.is-loading::after{border-color:transparent transparent #ad8100 #ad8100 !important}html.theme--documenter-dark .button.is-warning.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-warning.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-warning.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-warning.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-warning.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-warning.is-outlined{background-color:transparent;border-color:#ad8100;box-shadow:none;color:#ad8100}html.theme--documenter-dark .button.is-warning.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}html.theme--documenter-dark .button.is-warning.is-inverted.is-outlined:hover,html.theme--documenter-dark .button.is-warning.is-inverted.is-outlined.is-hovered,html.theme--documenter-dark .button.is-warning.is-inverted.is-outlined:focus,html.theme--documenter-dark .button.is-warning.is-inverted.is-outlined.is-focused{background-color:#fff;color:#ad8100}html.theme--documenter-dark .button.is-warning.is-inverted.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-warning.is-inverted.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-warning.is-inverted.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-warning.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #ad8100 #ad8100 !important}html.theme--documenter-dark .button.is-warning.is-inverted.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-warning.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}html.theme--documenter-dark .button.is-warning.is-light{background-color:#fffaeb;color:#d19c00}html.theme--documenter-dark .button.is-warning.is-light:hover,html.theme--documenter-dark .button.is-warning.is-light.is-hovered{background-color:#fff7de;border-color:transparent;color:#d19c00}html.theme--documenter-dark .button.is-warning.is-light:active,html.theme--documenter-dark .button.is-warning.is-light.is-active{background-color:#fff3d1;border-color:transparent;color:#d19c00}html.theme--documenter-dark .button.is-danger{background-color:#9e1b0d;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-danger:hover,html.theme--documenter-dark .button.is-danger.is-hovered{background-color:#92190c;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-danger:focus,html.theme--documenter-dark .button.is-danger.is-focused{border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-danger:focus:not(:active),html.theme--documenter-dark .button.is-danger.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(158,27,13,0.25)}html.theme--documenter-dark .button.is-danger:active,html.theme--documenter-dark .button.is-danger.is-active{background-color:#86170b;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-danger[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-danger{background-color:#9e1b0d;border-color:#9e1b0d;box-shadow:none}html.theme--documenter-dark .button.is-danger.is-inverted{background-color:#fff;color:#9e1b0d}html.theme--documenter-dark .button.is-danger.is-inverted:hover,html.theme--documenter-dark .button.is-danger.is-inverted.is-hovered{background-color:#f2f2f2}html.theme--documenter-dark .button.is-danger.is-inverted[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-danger.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#9e1b0d}html.theme--documenter-dark .button.is-danger.is-loading::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-danger.is-outlined{background-color:transparent;border-color:#9e1b0d;color:#9e1b0d}html.theme--documenter-dark .button.is-danger.is-outlined:hover,html.theme--documenter-dark .button.is-danger.is-outlined.is-hovered,html.theme--documenter-dark .button.is-danger.is-outlined:focus,html.theme--documenter-dark .button.is-danger.is-outlined.is-focused{background-color:#9e1b0d;border-color:#9e1b0d;color:#fff}html.theme--documenter-dark .button.is-danger.is-outlined.is-loading::after{border-color:transparent transparent #9e1b0d #9e1b0d !important}html.theme--documenter-dark .button.is-danger.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-danger.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-danger.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-danger.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-danger.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-danger.is-outlined{background-color:transparent;border-color:#9e1b0d;box-shadow:none;color:#9e1b0d}html.theme--documenter-dark .button.is-danger.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}html.theme--documenter-dark .button.is-danger.is-inverted.is-outlined:hover,html.theme--documenter-dark .button.is-danger.is-inverted.is-outlined.is-hovered,html.theme--documenter-dark .button.is-danger.is-inverted.is-outlined:focus,html.theme--documenter-dark .button.is-danger.is-inverted.is-outlined.is-focused{background-color:#fff;color:#9e1b0d}html.theme--documenter-dark .button.is-danger.is-inverted.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-danger.is-inverted.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-danger.is-inverted.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-danger.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #9e1b0d #9e1b0d !important}html.theme--documenter-dark .button.is-danger.is-inverted.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-danger.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}html.theme--documenter-dark .button.is-danger.is-light{background-color:#fdeeec;color:#ec311d}html.theme--documenter-dark .button.is-danger.is-light:hover,html.theme--documenter-dark .button.is-danger.is-light.is-hovered{background-color:#fce3e0;border-color:transparent;color:#ec311d}html.theme--documenter-dark .button.is-danger.is-light:active,html.theme--documenter-dark .button.is-danger.is-light.is-active{background-color:#fcd8d5;border-color:transparent;color:#ec311d}html.theme--documenter-dark .button.is-small,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.button{font-size:.75rem}html.theme--documenter-dark .button.is-small:not(.is-rounded),html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.button:not(.is-rounded){border-radius:3px}html.theme--documenter-dark .button.is-normal{font-size:1rem}html.theme--documenter-dark .button.is-medium{font-size:1.25rem}html.theme--documenter-dark .button.is-large{font-size:1.5rem}html.theme--documenter-dark .button[disabled],fieldset[disabled] html.theme--documenter-dark .button{background-color:#8c9b9d;border-color:#5e6d6f;box-shadow:none;opacity:.5}html.theme--documenter-dark .button.is-fullwidth{display:flex;width:100%}html.theme--documenter-dark .button.is-loading{color:transparent !important;pointer-events:none}html.theme--documenter-dark .button.is-loading::after{position:absolute;left:calc(50% - (1em * 0.5));top:calc(50% - (1em * 0.5));position:absolute !important}html.theme--documenter-dark .button.is-static{background-color:#282f2f;border-color:#5e6d6f;color:#dbdee0;box-shadow:none;pointer-events:none}html.theme--documenter-dark .button.is-rounded,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.button{border-radius:9999px;padding-left:calc(1em + 0.25em);padding-right:calc(1em + 0.25em)}html.theme--documenter-dark .buttons{align-items:center;display:flex;flex-wrap:wrap;justify-content:flex-start}html.theme--documenter-dark .buttons .button{margin-bottom:0.5rem}html.theme--documenter-dark .buttons .button:not(:last-child):not(.is-fullwidth){margin-right:.5rem}html.theme--documenter-dark .buttons:last-child{margin-bottom:-0.5rem}html.theme--documenter-dark .buttons:not(:last-child){margin-bottom:1rem}html.theme--documenter-dark .buttons.are-small .button:not(.is-normal):not(.is-medium):not(.is-large){font-size:.75rem}html.theme--documenter-dark .buttons.are-small .button:not(.is-normal):not(.is-medium):not(.is-large):not(.is-rounded){border-radius:3px}html.theme--documenter-dark .buttons.are-medium .button:not(.is-small):not(.is-normal):not(.is-large){font-size:1.25rem}html.theme--documenter-dark .buttons.are-large .button:not(.is-small):not(.is-normal):not(.is-medium){font-size:1.5rem}html.theme--documenter-dark .buttons.has-addons .button:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}html.theme--documenter-dark .buttons.has-addons .button:not(:last-child){border-bottom-right-radius:0;border-top-right-radius:0;margin-right:-1px}html.theme--documenter-dark .buttons.has-addons .button:last-child{margin-right:0}html.theme--documenter-dark .buttons.has-addons .button:hover,html.theme--documenter-dark .buttons.has-addons .button.is-hovered{z-index:2}html.theme--documenter-dark .buttons.has-addons .button:focus,html.theme--documenter-dark .buttons.has-addons .button.is-focused,html.theme--documenter-dark .buttons.has-addons .button:active,html.theme--documenter-dark .buttons.has-addons .button.is-active,html.theme--documenter-dark .buttons.has-addons .button.is-selected{z-index:3}html.theme--documenter-dark .buttons.has-addons .button:focus:hover,html.theme--documenter-dark .buttons.has-addons .button.is-focused:hover,html.theme--documenter-dark .buttons.has-addons .button:active:hover,html.theme--documenter-dark .buttons.has-addons .button.is-active:hover,html.theme--documenter-dark .buttons.has-addons .button.is-selected:hover{z-index:4}html.theme--documenter-dark .buttons.has-addons .button.is-expanded{flex-grow:1;flex-shrink:1}html.theme--documenter-dark .buttons.is-centered{justify-content:center}html.theme--documenter-dark .buttons.is-centered:not(.has-addons) .button:not(.is-fullwidth){margin-left:0.25rem;margin-right:0.25rem}html.theme--documenter-dark .buttons.is-right{justify-content:flex-end}html.theme--documenter-dark .buttons.is-right:not(.has-addons) .button:not(.is-fullwidth){margin-left:0.25rem;margin-right:0.25rem}@media screen and (max-width: 768px){html.theme--documenter-dark .button.is-responsive.is-small,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-responsive{font-size:.5625rem}html.theme--documenter-dark .button.is-responsive,html.theme--documenter-dark .button.is-responsive.is-normal{font-size:.65625rem}html.theme--documenter-dark .button.is-responsive.is-medium{font-size:.75rem}html.theme--documenter-dark .button.is-responsive.is-large{font-size:1rem}}@media screen and (min-width: 769px) and (max-width: 1055px){html.theme--documenter-dark .button.is-responsive.is-small,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-responsive{font-size:.65625rem}html.theme--documenter-dark .button.is-responsive,html.theme--documenter-dark .button.is-responsive.is-normal{font-size:.75rem}html.theme--documenter-dark .button.is-responsive.is-medium{font-size:1rem}html.theme--documenter-dark .button.is-responsive.is-large{font-size:1.25rem}}html.theme--documenter-dark .container{flex-grow:1;margin:0 auto;position:relative;width:auto}html.theme--documenter-dark .container.is-fluid{max-width:none !important;padding-left:32px;padding-right:32px;width:100%}@media screen and (min-width: 1056px){html.theme--documenter-dark .container{max-width:992px}}@media screen and (max-width: 1215px){html.theme--documenter-dark .container.is-widescreen:not(.is-max-desktop){max-width:1152px}}@media screen and (max-width: 1407px){html.theme--documenter-dark .container.is-fullhd:not(.is-max-desktop):not(.is-max-widescreen){max-width:1344px}}@media screen and (min-width: 1216px){html.theme--documenter-dark .container:not(.is-max-desktop){max-width:1152px}}@media screen and (min-width: 1408px){html.theme--documenter-dark .container:not(.is-max-desktop):not(.is-max-widescreen){max-width:1344px}}html.theme--documenter-dark .content li+li{margin-top:0.25em}html.theme--documenter-dark .content p:not(:last-child),html.theme--documenter-dark .content dl:not(:last-child),html.theme--documenter-dark .content ol:not(:last-child),html.theme--documenter-dark .content ul:not(:last-child),html.theme--documenter-dark .content blockquote:not(:last-child),html.theme--documenter-dark .content pre:not(:last-child),html.theme--documenter-dark .content table:not(:last-child){margin-bottom:1em}html.theme--documenter-dark .content h1,html.theme--documenter-dark .content h2,html.theme--documenter-dark .content h3,html.theme--documenter-dark .content h4,html.theme--documenter-dark .content h5,html.theme--documenter-dark .content h6{color:#f2f2f2;font-weight:600;line-height:1.125}html.theme--documenter-dark .content h1{font-size:2em;margin-bottom:0.5em}html.theme--documenter-dark .content h1:not(:first-child){margin-top:1em}html.theme--documenter-dark .content h2{font-size:1.75em;margin-bottom:0.5714em}html.theme--documenter-dark .content h2:not(:first-child){margin-top:1.1428em}html.theme--documenter-dark .content h3{font-size:1.5em;margin-bottom:0.6666em}html.theme--documenter-dark .content h3:not(:first-child){margin-top:1.3333em}html.theme--documenter-dark .content h4{font-size:1.25em;margin-bottom:0.8em}html.theme--documenter-dark .content h5{font-size:1.125em;margin-bottom:0.8888em}html.theme--documenter-dark .content h6{font-size:1em;margin-bottom:1em}html.theme--documenter-dark .content blockquote{background-color:#282f2f;border-left:5px solid #5e6d6f;padding:1.25em 1.5em}html.theme--documenter-dark .content ol{list-style-position:outside;margin-left:2em;margin-top:1em}html.theme--documenter-dark .content ol:not([type]){list-style-type:decimal}html.theme--documenter-dark .content ol.is-lower-alpha:not([type]){list-style-type:lower-alpha}html.theme--documenter-dark .content ol.is-lower-roman:not([type]){list-style-type:lower-roman}html.theme--documenter-dark .content ol.is-upper-alpha:not([type]){list-style-type:upper-alpha}html.theme--documenter-dark .content ol.is-upper-roman:not([type]){list-style-type:upper-roman}html.theme--documenter-dark .content ul{list-style:disc outside;margin-left:2em;margin-top:1em}html.theme--documenter-dark .content ul ul{list-style-type:circle;margin-top:0.5em}html.theme--documenter-dark .content ul ul ul{list-style-type:square}html.theme--documenter-dark .content dd{margin-left:2em}html.theme--documenter-dark .content figure{margin-left:2em;margin-right:2em;text-align:center}html.theme--documenter-dark .content figure:not(:first-child){margin-top:2em}html.theme--documenter-dark .content figure:not(:last-child){margin-bottom:2em}html.theme--documenter-dark .content figure img{display:inline-block}html.theme--documenter-dark .content figure figcaption{font-style:italic}html.theme--documenter-dark .content pre{-webkit-overflow-scrolling:touch;overflow-x:auto;padding:0;white-space:pre;word-wrap:normal}html.theme--documenter-dark .content sup,html.theme--documenter-dark .content sub{font-size:75%}html.theme--documenter-dark .content table{width:100%}html.theme--documenter-dark .content table td,html.theme--documenter-dark .content table th{border:1px solid #5e6d6f;border-width:0 0 1px;padding:0.5em 0.75em;vertical-align:top}html.theme--documenter-dark .content table th{color:#f2f2f2}html.theme--documenter-dark .content table th:not([align]){text-align:inherit}html.theme--documenter-dark .content table thead td,html.theme--documenter-dark .content table thead th{border-width:0 0 2px;color:#f2f2f2}html.theme--documenter-dark .content table tfoot td,html.theme--documenter-dark .content table tfoot th{border-width:2px 0 0;color:#f2f2f2}html.theme--documenter-dark .content table tbody tr:last-child td,html.theme--documenter-dark .content table tbody tr:last-child th{border-bottom-width:0}html.theme--documenter-dark .content .tabs li+li{margin-top:0}html.theme--documenter-dark .content.is-small,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.content{font-size:.75rem}html.theme--documenter-dark .content.is-normal{font-size:1rem}html.theme--documenter-dark .content.is-medium{font-size:1.25rem}html.theme--documenter-dark .content.is-large{font-size:1.5rem}html.theme--documenter-dark .icon{align-items:center;display:inline-flex;justify-content:center;height:1.5rem;width:1.5rem}html.theme--documenter-dark .icon.is-small,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.icon{height:1rem;width:1rem}html.theme--documenter-dark .icon.is-medium{height:2rem;width:2rem}html.theme--documenter-dark .icon.is-large{height:3rem;width:3rem}html.theme--documenter-dark .icon-text{align-items:flex-start;color:inherit;display:inline-flex;flex-wrap:wrap;line-height:1.5rem;vertical-align:top}html.theme--documenter-dark .icon-text .icon{flex-grow:0;flex-shrink:0}html.theme--documenter-dark .icon-text .icon:not(:last-child){margin-right:.25em}html.theme--documenter-dark .icon-text .icon:not(:first-child){margin-left:.25em}html.theme--documenter-dark div.icon-text{display:flex}html.theme--documenter-dark .image,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img{display:block;position:relative}html.theme--documenter-dark .image img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img img{display:block;height:auto;width:100%}html.theme--documenter-dark .image img.is-rounded,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img img.is-rounded{border-radius:9999px}html.theme--documenter-dark .image.is-fullwidth,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-fullwidth{width:100%}html.theme--documenter-dark .image.is-square img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-square img,html.theme--documenter-dark .image.is-square .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-square .has-ratio,html.theme--documenter-dark .image.is-1by1 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-1by1 img,html.theme--documenter-dark .image.is-1by1 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-1by1 .has-ratio,html.theme--documenter-dark .image.is-5by4 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-5by4 img,html.theme--documenter-dark .image.is-5by4 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-5by4 .has-ratio,html.theme--documenter-dark .image.is-4by3 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-4by3 img,html.theme--documenter-dark .image.is-4by3 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-4by3 .has-ratio,html.theme--documenter-dark .image.is-3by2 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by2 img,html.theme--documenter-dark .image.is-3by2 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by2 .has-ratio,html.theme--documenter-dark .image.is-5by3 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-5by3 img,html.theme--documenter-dark .image.is-5by3 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-5by3 .has-ratio,html.theme--documenter-dark .image.is-16by9 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-16by9 img,html.theme--documenter-dark .image.is-16by9 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-16by9 .has-ratio,html.theme--documenter-dark .image.is-2by1 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-2by1 img,html.theme--documenter-dark .image.is-2by1 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-2by1 .has-ratio,html.theme--documenter-dark .image.is-3by1 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by1 img,html.theme--documenter-dark .image.is-3by1 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by1 .has-ratio,html.theme--documenter-dark .image.is-4by5 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-4by5 img,html.theme--documenter-dark .image.is-4by5 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-4by5 .has-ratio,html.theme--documenter-dark .image.is-3by4 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by4 img,html.theme--documenter-dark .image.is-3by4 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by4 .has-ratio,html.theme--documenter-dark .image.is-2by3 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-2by3 img,html.theme--documenter-dark .image.is-2by3 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-2by3 .has-ratio,html.theme--documenter-dark .image.is-3by5 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by5 img,html.theme--documenter-dark .image.is-3by5 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by5 .has-ratio,html.theme--documenter-dark .image.is-9by16 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-9by16 img,html.theme--documenter-dark .image.is-9by16 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-9by16 .has-ratio,html.theme--documenter-dark .image.is-1by2 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-1by2 img,html.theme--documenter-dark .image.is-1by2 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-1by2 .has-ratio,html.theme--documenter-dark .image.is-1by3 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-1by3 img,html.theme--documenter-dark .image.is-1by3 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-1by3 .has-ratio{height:100%;width:100%}html.theme--documenter-dark .image.is-square,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-square,html.theme--documenter-dark .image.is-1by1,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-1by1{padding-top:100%}html.theme--documenter-dark .image.is-5by4,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-5by4{padding-top:80%}html.theme--documenter-dark .image.is-4by3,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-4by3{padding-top:75%}html.theme--documenter-dark .image.is-3by2,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by2{padding-top:66.6666%}html.theme--documenter-dark .image.is-5by3,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-5by3{padding-top:60%}html.theme--documenter-dark .image.is-16by9,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-16by9{padding-top:56.25%}html.theme--documenter-dark .image.is-2by1,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-2by1{padding-top:50%}html.theme--documenter-dark .image.is-3by1,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by1{padding-top:33.3333%}html.theme--documenter-dark .image.is-4by5,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-4by5{padding-top:125%}html.theme--documenter-dark .image.is-3by4,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by4{padding-top:133.3333%}html.theme--documenter-dark .image.is-2by3,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-2by3{padding-top:150%}html.theme--documenter-dark .image.is-3by5,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by5{padding-top:166.6666%}html.theme--documenter-dark .image.is-9by16,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-9by16{padding-top:177.7777%}html.theme--documenter-dark .image.is-1by2,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-1by2{padding-top:200%}html.theme--documenter-dark .image.is-1by3,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-1by3{padding-top:300%}html.theme--documenter-dark .image.is-16x16,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-16x16{height:16px;width:16px}html.theme--documenter-dark .image.is-24x24,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-24x24{height:24px;width:24px}html.theme--documenter-dark .image.is-32x32,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-32x32{height:32px;width:32px}html.theme--documenter-dark .image.is-48x48,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-48x48{height:48px;width:48px}html.theme--documenter-dark .image.is-64x64,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-64x64{height:64px;width:64px}html.theme--documenter-dark .image.is-96x96,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-96x96{height:96px;width:96px}html.theme--documenter-dark .image.is-128x128,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-128x128{height:128px;width:128px}html.theme--documenter-dark .notification{background-color:#282f2f;border-radius:.4em;position:relative;padding:1.25rem 2.5rem 1.25rem 1.5rem}html.theme--documenter-dark .notification a:not(.button):not(.dropdown-item){color:currentColor;text-decoration:underline}html.theme--documenter-dark .notification strong{color:currentColor}html.theme--documenter-dark .notification code,html.theme--documenter-dark .notification pre{background:#fff}html.theme--documenter-dark .notification pre code{background:transparent}html.theme--documenter-dark .notification>.delete{right:.5rem;position:absolute;top:0.5rem}html.theme--documenter-dark .notification .title,html.theme--documenter-dark .notification .subtitle,html.theme--documenter-dark .notification .content{color:currentColor}html.theme--documenter-dark .notification.is-white{background-color:#fff;color:#0a0a0a}html.theme--documenter-dark .notification.is-black{background-color:#0a0a0a;color:#fff}html.theme--documenter-dark .notification.is-light{background-color:#ecf0f1;color:rgba(0,0,0,0.7)}html.theme--documenter-dark .notification.is-dark,html.theme--documenter-dark .content kbd.notification{background-color:#282f2f;color:#fff}html.theme--documenter-dark .notification.is-primary,html.theme--documenter-dark .docstring>section>a.notification.docs-sourcelink{background-color:#375a7f;color:#fff}html.theme--documenter-dark .notification.is-primary.is-light,html.theme--documenter-dark .docstring>section>a.notification.is-light.docs-sourcelink{background-color:#f1f5f9;color:#4d7eb2}html.theme--documenter-dark .notification.is-link{background-color:#1abc9c;color:#fff}html.theme--documenter-dark .notification.is-link.is-light{background-color:#edfdf9;color:#15987e}html.theme--documenter-dark .notification.is-info{background-color:#024c7d;color:#fff}html.theme--documenter-dark .notification.is-info.is-light{background-color:#ebf7ff;color:#0e9dfb}html.theme--documenter-dark .notification.is-success{background-color:#008438;color:#fff}html.theme--documenter-dark .notification.is-success.is-light{background-color:#ebfff3;color:#00eb64}html.theme--documenter-dark .notification.is-warning{background-color:#ad8100;color:#fff}html.theme--documenter-dark .notification.is-warning.is-light{background-color:#fffaeb;color:#d19c00}html.theme--documenter-dark .notification.is-danger{background-color:#9e1b0d;color:#fff}html.theme--documenter-dark .notification.is-danger.is-light{background-color:#fdeeec;color:#ec311d}html.theme--documenter-dark .progress{-moz-appearance:none;-webkit-appearance:none;border:none;border-radius:9999px;display:block;height:1rem;overflow:hidden;padding:0;width:100%}html.theme--documenter-dark .progress::-webkit-progress-bar{background-color:#343c3d}html.theme--documenter-dark .progress::-webkit-progress-value{background-color:#dbdee0}html.theme--documenter-dark .progress::-moz-progress-bar{background-color:#dbdee0}html.theme--documenter-dark .progress::-ms-fill{background-color:#dbdee0;border:none}html.theme--documenter-dark .progress.is-white::-webkit-progress-value{background-color:#fff}html.theme--documenter-dark .progress.is-white::-moz-progress-bar{background-color:#fff}html.theme--documenter-dark .progress.is-white::-ms-fill{background-color:#fff}html.theme--documenter-dark .progress.is-white:indeterminate{background-image:linear-gradient(to right, #fff 30%, #343c3d 30%)}html.theme--documenter-dark .progress.is-black::-webkit-progress-value{background-color:#0a0a0a}html.theme--documenter-dark .progress.is-black::-moz-progress-bar{background-color:#0a0a0a}html.theme--documenter-dark .progress.is-black::-ms-fill{background-color:#0a0a0a}html.theme--documenter-dark .progress.is-black:indeterminate{background-image:linear-gradient(to right, #0a0a0a 30%, #343c3d 30%)}html.theme--documenter-dark .progress.is-light::-webkit-progress-value{background-color:#ecf0f1}html.theme--documenter-dark .progress.is-light::-moz-progress-bar{background-color:#ecf0f1}html.theme--documenter-dark .progress.is-light::-ms-fill{background-color:#ecf0f1}html.theme--documenter-dark .progress.is-light:indeterminate{background-image:linear-gradient(to right, #ecf0f1 30%, #343c3d 30%)}html.theme--documenter-dark .progress.is-dark::-webkit-progress-value,html.theme--documenter-dark .content kbd.progress::-webkit-progress-value{background-color:#282f2f}html.theme--documenter-dark .progress.is-dark::-moz-progress-bar,html.theme--documenter-dark .content kbd.progress::-moz-progress-bar{background-color:#282f2f}html.theme--documenter-dark .progress.is-dark::-ms-fill,html.theme--documenter-dark .content kbd.progress::-ms-fill{background-color:#282f2f}html.theme--documenter-dark .progress.is-dark:indeterminate,html.theme--documenter-dark .content kbd.progress:indeterminate{background-image:linear-gradient(to right, #282f2f 30%, #343c3d 30%)}html.theme--documenter-dark .progress.is-primary::-webkit-progress-value,html.theme--documenter-dark .docstring>section>a.progress.docs-sourcelink::-webkit-progress-value{background-color:#375a7f}html.theme--documenter-dark .progress.is-primary::-moz-progress-bar,html.theme--documenter-dark .docstring>section>a.progress.docs-sourcelink::-moz-progress-bar{background-color:#375a7f}html.theme--documenter-dark .progress.is-primary::-ms-fill,html.theme--documenter-dark .docstring>section>a.progress.docs-sourcelink::-ms-fill{background-color:#375a7f}html.theme--documenter-dark .progress.is-primary:indeterminate,html.theme--documenter-dark .docstring>section>a.progress.docs-sourcelink:indeterminate{background-image:linear-gradient(to right, #375a7f 30%, #343c3d 30%)}html.theme--documenter-dark .progress.is-link::-webkit-progress-value{background-color:#1abc9c}html.theme--documenter-dark .progress.is-link::-moz-progress-bar{background-color:#1abc9c}html.theme--documenter-dark .progress.is-link::-ms-fill{background-color:#1abc9c}html.theme--documenter-dark .progress.is-link:indeterminate{background-image:linear-gradient(to right, #1abc9c 30%, #343c3d 30%)}html.theme--documenter-dark .progress.is-info::-webkit-progress-value{background-color:#024c7d}html.theme--documenter-dark .progress.is-info::-moz-progress-bar{background-color:#024c7d}html.theme--documenter-dark .progress.is-info::-ms-fill{background-color:#024c7d}html.theme--documenter-dark .progress.is-info:indeterminate{background-image:linear-gradient(to right, #024c7d 30%, #343c3d 30%)}html.theme--documenter-dark .progress.is-success::-webkit-progress-value{background-color:#008438}html.theme--documenter-dark .progress.is-success::-moz-progress-bar{background-color:#008438}html.theme--documenter-dark .progress.is-success::-ms-fill{background-color:#008438}html.theme--documenter-dark .progress.is-success:indeterminate{background-image:linear-gradient(to right, #008438 30%, #343c3d 30%)}html.theme--documenter-dark .progress.is-warning::-webkit-progress-value{background-color:#ad8100}html.theme--documenter-dark .progress.is-warning::-moz-progress-bar{background-color:#ad8100}html.theme--documenter-dark .progress.is-warning::-ms-fill{background-color:#ad8100}html.theme--documenter-dark .progress.is-warning:indeterminate{background-image:linear-gradient(to right, #ad8100 30%, #343c3d 30%)}html.theme--documenter-dark .progress.is-danger::-webkit-progress-value{background-color:#9e1b0d}html.theme--documenter-dark .progress.is-danger::-moz-progress-bar{background-color:#9e1b0d}html.theme--documenter-dark .progress.is-danger::-ms-fill{background-color:#9e1b0d}html.theme--documenter-dark .progress.is-danger:indeterminate{background-image:linear-gradient(to right, #9e1b0d 30%, #343c3d 30%)}html.theme--documenter-dark .progress:indeterminate{animation-duration:1.5s;animation-iteration-count:infinite;animation-name:moveIndeterminate;animation-timing-function:linear;background-color:#343c3d;background-image:linear-gradient(to right, #fff 30%, #343c3d 30%);background-position:top left;background-repeat:no-repeat;background-size:150% 150%}html.theme--documenter-dark .progress:indeterminate::-webkit-progress-bar{background-color:transparent}html.theme--documenter-dark .progress:indeterminate::-moz-progress-bar{background-color:transparent}html.theme--documenter-dark .progress:indeterminate::-ms-fill{animation-name:none}html.theme--documenter-dark .progress.is-small,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.progress{height:.75rem}html.theme--documenter-dark .progress.is-medium{height:1.25rem}html.theme--documenter-dark .progress.is-large{height:1.5rem}@keyframes moveIndeterminate{from{background-position:200% 0}to{background-position:-200% 0}}html.theme--documenter-dark .table{background-color:#343c3d;color:#fff}html.theme--documenter-dark .table td,html.theme--documenter-dark .table th{border:1px solid #5e6d6f;border-width:0 0 1px;padding:0.5em 0.75em;vertical-align:top}html.theme--documenter-dark .table td.is-white,html.theme--documenter-dark .table th.is-white{background-color:#fff;border-color:#fff;color:#0a0a0a}html.theme--documenter-dark .table td.is-black,html.theme--documenter-dark .table th.is-black{background-color:#0a0a0a;border-color:#0a0a0a;color:#fff}html.theme--documenter-dark .table td.is-light,html.theme--documenter-dark .table th.is-light{background-color:#ecf0f1;border-color:#ecf0f1;color:rgba(0,0,0,0.7)}html.theme--documenter-dark .table td.is-dark,html.theme--documenter-dark .table th.is-dark{background-color:#282f2f;border-color:#282f2f;color:#fff}html.theme--documenter-dark .table td.is-primary,html.theme--documenter-dark .table th.is-primary{background-color:#375a7f;border-color:#375a7f;color:#fff}html.theme--documenter-dark .table td.is-link,html.theme--documenter-dark .table th.is-link{background-color:#1abc9c;border-color:#1abc9c;color:#fff}html.theme--documenter-dark .table td.is-info,html.theme--documenter-dark .table th.is-info{background-color:#024c7d;border-color:#024c7d;color:#fff}html.theme--documenter-dark .table td.is-success,html.theme--documenter-dark .table th.is-success{background-color:#008438;border-color:#008438;color:#fff}html.theme--documenter-dark .table td.is-warning,html.theme--documenter-dark .table th.is-warning{background-color:#ad8100;border-color:#ad8100;color:#fff}html.theme--documenter-dark .table td.is-danger,html.theme--documenter-dark .table th.is-danger{background-color:#9e1b0d;border-color:#9e1b0d;color:#fff}html.theme--documenter-dark .table td.is-narrow,html.theme--documenter-dark .table th.is-narrow{white-space:nowrap;width:1%}html.theme--documenter-dark .table td.is-selected,html.theme--documenter-dark .table th.is-selected{background-color:#375a7f;color:#fff}html.theme--documenter-dark .table td.is-selected a,html.theme--documenter-dark .table td.is-selected strong,html.theme--documenter-dark .table th.is-selected a,html.theme--documenter-dark .table th.is-selected strong{color:currentColor}html.theme--documenter-dark .table td.is-vcentered,html.theme--documenter-dark .table th.is-vcentered{vertical-align:middle}html.theme--documenter-dark .table th{color:#f2f2f2}html.theme--documenter-dark .table th:not([align]){text-align:left}html.theme--documenter-dark .table tr.is-selected{background-color:#375a7f;color:#fff}html.theme--documenter-dark .table tr.is-selected a,html.theme--documenter-dark .table tr.is-selected strong{color:currentColor}html.theme--documenter-dark .table tr.is-selected td,html.theme--documenter-dark .table tr.is-selected th{border-color:#fff;color:currentColor}html.theme--documenter-dark .table thead{background-color:rgba(0,0,0,0)}html.theme--documenter-dark .table thead td,html.theme--documenter-dark .table thead th{border-width:0 0 2px;color:#f2f2f2}html.theme--documenter-dark .table tfoot{background-color:rgba(0,0,0,0)}html.theme--documenter-dark .table tfoot td,html.theme--documenter-dark .table tfoot th{border-width:2px 0 0;color:#f2f2f2}html.theme--documenter-dark .table tbody{background-color:rgba(0,0,0,0)}html.theme--documenter-dark .table tbody tr:last-child td,html.theme--documenter-dark .table tbody tr:last-child th{border-bottom-width:0}html.theme--documenter-dark .table.is-bordered td,html.theme--documenter-dark .table.is-bordered th{border-width:1px}html.theme--documenter-dark .table.is-bordered tr:last-child td,html.theme--documenter-dark .table.is-bordered tr:last-child th{border-bottom-width:1px}html.theme--documenter-dark .table.is-fullwidth{width:100%}html.theme--documenter-dark .table.is-hoverable tbody tr:not(.is-selected):hover{background-color:#282f2f}html.theme--documenter-dark .table.is-hoverable.is-striped tbody tr:not(.is-selected):hover{background-color:#282f2f}html.theme--documenter-dark .table.is-hoverable.is-striped tbody tr:not(.is-selected):hover:nth-child(even){background-color:#2d3435}html.theme--documenter-dark .table.is-narrow td,html.theme--documenter-dark .table.is-narrow th{padding:0.25em 0.5em}html.theme--documenter-dark .table.is-striped tbody tr:not(.is-selected):nth-child(even){background-color:#282f2f}html.theme--documenter-dark .table-container{-webkit-overflow-scrolling:touch;overflow:auto;overflow-y:hidden;max-width:100%}html.theme--documenter-dark .tags{align-items:center;display:flex;flex-wrap:wrap;justify-content:flex-start}html.theme--documenter-dark .tags .tag,html.theme--documenter-dark .tags .content kbd,html.theme--documenter-dark .content .tags kbd,html.theme--documenter-dark .tags .docstring>section>a.docs-sourcelink{margin-bottom:0.5rem}html.theme--documenter-dark .tags .tag:not(:last-child),html.theme--documenter-dark .tags .content kbd:not(:last-child),html.theme--documenter-dark .content .tags kbd:not(:last-child),html.theme--documenter-dark .tags .docstring>section>a.docs-sourcelink:not(:last-child){margin-right:.5rem}html.theme--documenter-dark .tags:last-child{margin-bottom:-0.5rem}html.theme--documenter-dark .tags:not(:last-child){margin-bottom:1rem}html.theme--documenter-dark .tags.are-medium .tag:not(.is-normal):not(.is-large),html.theme--documenter-dark .tags.are-medium .content kbd:not(.is-normal):not(.is-large),html.theme--documenter-dark .content .tags.are-medium kbd:not(.is-normal):not(.is-large),html.theme--documenter-dark .tags.are-medium .docstring>section>a.docs-sourcelink:not(.is-normal):not(.is-large){font-size:1rem}html.theme--documenter-dark .tags.are-large .tag:not(.is-normal):not(.is-medium),html.theme--documenter-dark .tags.are-large .content kbd:not(.is-normal):not(.is-medium),html.theme--documenter-dark .content .tags.are-large kbd:not(.is-normal):not(.is-medium),html.theme--documenter-dark .tags.are-large .docstring>section>a.docs-sourcelink:not(.is-normal):not(.is-medium){font-size:1.25rem}html.theme--documenter-dark .tags.is-centered{justify-content:center}html.theme--documenter-dark .tags.is-centered .tag,html.theme--documenter-dark .tags.is-centered .content kbd,html.theme--documenter-dark .content .tags.is-centered kbd,html.theme--documenter-dark .tags.is-centered .docstring>section>a.docs-sourcelink{margin-right:0.25rem;margin-left:0.25rem}html.theme--documenter-dark .tags.is-right{justify-content:flex-end}html.theme--documenter-dark .tags.is-right .tag:not(:first-child),html.theme--documenter-dark .tags.is-right .content kbd:not(:first-child),html.theme--documenter-dark .content .tags.is-right kbd:not(:first-child),html.theme--documenter-dark .tags.is-right .docstring>section>a.docs-sourcelink:not(:first-child){margin-left:0.5rem}html.theme--documenter-dark .tags.is-right .tag:not(:last-child),html.theme--documenter-dark .tags.is-right .content kbd:not(:last-child),html.theme--documenter-dark .content .tags.is-right kbd:not(:last-child),html.theme--documenter-dark .tags.is-right .docstring>section>a.docs-sourcelink:not(:last-child){margin-right:0}html.theme--documenter-dark .tags.has-addons .tag,html.theme--documenter-dark .tags.has-addons .content kbd,html.theme--documenter-dark .content .tags.has-addons kbd,html.theme--documenter-dark .tags.has-addons .docstring>section>a.docs-sourcelink{margin-right:0}html.theme--documenter-dark .tags.has-addons .tag:not(:first-child),html.theme--documenter-dark .tags.has-addons .content kbd:not(:first-child),html.theme--documenter-dark .content .tags.has-addons kbd:not(:first-child),html.theme--documenter-dark .tags.has-addons .docstring>section>a.docs-sourcelink:not(:first-child){margin-left:0;border-top-left-radius:0;border-bottom-left-radius:0}html.theme--documenter-dark .tags.has-addons .tag:not(:last-child),html.theme--documenter-dark .tags.has-addons .content kbd:not(:last-child),html.theme--documenter-dark .content .tags.has-addons kbd:not(:last-child),html.theme--documenter-dark .tags.has-addons .docstring>section>a.docs-sourcelink:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}html.theme--documenter-dark .tag:not(body),html.theme--documenter-dark .content kbd:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink:not(body){align-items:center;background-color:#282f2f;border-radius:.4em;color:#fff;display:inline-flex;font-size:.75rem;height:2em;justify-content:center;line-height:1.5;padding-left:0.75em;padding-right:0.75em;white-space:nowrap}html.theme--documenter-dark .tag:not(body) .delete,html.theme--documenter-dark .content kbd:not(body) .delete,html.theme--documenter-dark .docstring>section>a.docs-sourcelink:not(body) .delete{margin-left:.25rem;margin-right:-.375rem}html.theme--documenter-dark .tag.is-white:not(body),html.theme--documenter-dark .content kbd.is-white:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-white:not(body){background-color:#fff;color:#0a0a0a}html.theme--documenter-dark .tag.is-black:not(body),html.theme--documenter-dark .content kbd.is-black:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-black:not(body){background-color:#0a0a0a;color:#fff}html.theme--documenter-dark .tag.is-light:not(body),html.theme--documenter-dark .content kbd.is-light:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-light:not(body){background-color:#ecf0f1;color:rgba(0,0,0,0.7)}html.theme--documenter-dark .tag.is-dark:not(body),html.theme--documenter-dark .content kbd:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-dark:not(body),html.theme--documenter-dark .content .docstring>section>kbd:not(body){background-color:#282f2f;color:#fff}html.theme--documenter-dark .tag.is-primary:not(body),html.theme--documenter-dark .content kbd.is-primary:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink:not(body){background-color:#375a7f;color:#fff}html.theme--documenter-dark .tag.is-primary.is-light:not(body),html.theme--documenter-dark .content kbd.is-primary.is-light:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-light:not(body){background-color:#f1f5f9;color:#4d7eb2}html.theme--documenter-dark .tag.is-link:not(body),html.theme--documenter-dark .content kbd.is-link:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-link:not(body){background-color:#1abc9c;color:#fff}html.theme--documenter-dark .tag.is-link.is-light:not(body),html.theme--documenter-dark .content kbd.is-link.is-light:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-link.is-light:not(body){background-color:#edfdf9;color:#15987e}html.theme--documenter-dark .tag.is-info:not(body),html.theme--documenter-dark .content kbd.is-info:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-info:not(body){background-color:#024c7d;color:#fff}html.theme--documenter-dark .tag.is-info.is-light:not(body),html.theme--documenter-dark .content kbd.is-info.is-light:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-info.is-light:not(body){background-color:#ebf7ff;color:#0e9dfb}html.theme--documenter-dark .tag.is-success:not(body),html.theme--documenter-dark .content kbd.is-success:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-success:not(body){background-color:#008438;color:#fff}html.theme--documenter-dark .tag.is-success.is-light:not(body),html.theme--documenter-dark .content kbd.is-success.is-light:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-success.is-light:not(body){background-color:#ebfff3;color:#00eb64}html.theme--documenter-dark .tag.is-warning:not(body),html.theme--documenter-dark .content kbd.is-warning:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-warning:not(body){background-color:#ad8100;color:#fff}html.theme--documenter-dark .tag.is-warning.is-light:not(body),html.theme--documenter-dark .content kbd.is-warning.is-light:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-warning.is-light:not(body){background-color:#fffaeb;color:#d19c00}html.theme--documenter-dark .tag.is-danger:not(body),html.theme--documenter-dark .content kbd.is-danger:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-danger:not(body){background-color:#9e1b0d;color:#fff}html.theme--documenter-dark .tag.is-danger.is-light:not(body),html.theme--documenter-dark .content kbd.is-danger.is-light:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-danger.is-light:not(body){background-color:#fdeeec;color:#ec311d}html.theme--documenter-dark .tag.is-normal:not(body),html.theme--documenter-dark .content kbd.is-normal:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-normal:not(body){font-size:.75rem}html.theme--documenter-dark .tag.is-medium:not(body),html.theme--documenter-dark .content kbd.is-medium:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-medium:not(body){font-size:1rem}html.theme--documenter-dark .tag.is-large:not(body),html.theme--documenter-dark .content kbd.is-large:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-large:not(body){font-size:1.25rem}html.theme--documenter-dark .tag:not(body) .icon:first-child:not(:last-child),html.theme--documenter-dark .content kbd:not(body) .icon:first-child:not(:last-child),html.theme--documenter-dark .docstring>section>a.docs-sourcelink:not(body) .icon:first-child:not(:last-child){margin-left:-.375em;margin-right:.1875em}html.theme--documenter-dark .tag:not(body) .icon:last-child:not(:first-child),html.theme--documenter-dark .content kbd:not(body) .icon:last-child:not(:first-child),html.theme--documenter-dark .docstring>section>a.docs-sourcelink:not(body) .icon:last-child:not(:first-child){margin-left:.1875em;margin-right:-.375em}html.theme--documenter-dark .tag:not(body) .icon:first-child:last-child,html.theme--documenter-dark .content kbd:not(body) .icon:first-child:last-child,html.theme--documenter-dark .docstring>section>a.docs-sourcelink:not(body) .icon:first-child:last-child{margin-left:-.375em;margin-right:-.375em}html.theme--documenter-dark .tag.is-delete:not(body),html.theme--documenter-dark .content kbd.is-delete:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-delete:not(body){margin-left:1px;padding:0;position:relative;width:2em}html.theme--documenter-dark .tag.is-delete:not(body)::before,html.theme--documenter-dark .content kbd.is-delete:not(body)::before,html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-delete:not(body)::before,html.theme--documenter-dark .tag.is-delete:not(body)::after,html.theme--documenter-dark .content kbd.is-delete:not(body)::after,html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-delete:not(body)::after{background-color:currentColor;content:"";display:block;left:50%;position:absolute;top:50%;transform:translateX(-50%) translateY(-50%) rotate(45deg);transform-origin:center center}html.theme--documenter-dark .tag.is-delete:not(body)::before,html.theme--documenter-dark .content kbd.is-delete:not(body)::before,html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-delete:not(body)::before{height:1px;width:50%}html.theme--documenter-dark .tag.is-delete:not(body)::after,html.theme--documenter-dark .content kbd.is-delete:not(body)::after,html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-delete:not(body)::after{height:50%;width:1px}html.theme--documenter-dark .tag.is-delete:not(body):hover,html.theme--documenter-dark .content kbd.is-delete:not(body):hover,html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-delete:not(body):hover,html.theme--documenter-dark .tag.is-delete:not(body):focus,html.theme--documenter-dark .content kbd.is-delete:not(body):focus,html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-delete:not(body):focus{background-color:#1d2122}html.theme--documenter-dark .tag.is-delete:not(body):active,html.theme--documenter-dark .content kbd.is-delete:not(body):active,html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-delete:not(body):active{background-color:#111414}html.theme--documenter-dark .tag.is-rounded:not(body),html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input:not(body),html.theme--documenter-dark .content kbd.is-rounded:not(body),html.theme--documenter-dark #documenter .docs-sidebar .content form.docs-search>input:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-rounded:not(body){border-radius:9999px}html.theme--documenter-dark a.tag:hover,html.theme--documenter-dark .docstring>section>a.docs-sourcelink:hover{text-decoration:underline}html.theme--documenter-dark .title,html.theme--documenter-dark .subtitle{word-break:break-word}html.theme--documenter-dark .title em,html.theme--documenter-dark .title span,html.theme--documenter-dark .subtitle em,html.theme--documenter-dark .subtitle span{font-weight:inherit}html.theme--documenter-dark .title sub,html.theme--documenter-dark .subtitle sub{font-size:.75em}html.theme--documenter-dark .title sup,html.theme--documenter-dark .subtitle sup{font-size:.75em}html.theme--documenter-dark .title .tag,html.theme--documenter-dark .title .content kbd,html.theme--documenter-dark .content .title kbd,html.theme--documenter-dark .title .docstring>section>a.docs-sourcelink,html.theme--documenter-dark .subtitle .tag,html.theme--documenter-dark .subtitle .content kbd,html.theme--documenter-dark .content .subtitle kbd,html.theme--documenter-dark .subtitle .docstring>section>a.docs-sourcelink{vertical-align:middle}html.theme--documenter-dark .title{color:#fff;font-size:2rem;font-weight:500;line-height:1.125}html.theme--documenter-dark .title strong{color:inherit;font-weight:inherit}html.theme--documenter-dark .title:not(.is-spaced)+.subtitle{margin-top:-1.25rem}html.theme--documenter-dark .title.is-1{font-size:3rem}html.theme--documenter-dark .title.is-2{font-size:2.5rem}html.theme--documenter-dark .title.is-3{font-size:2rem}html.theme--documenter-dark .title.is-4{font-size:1.5rem}html.theme--documenter-dark .title.is-5{font-size:1.25rem}html.theme--documenter-dark .title.is-6{font-size:1rem}html.theme--documenter-dark .title.is-7{font-size:.75rem}html.theme--documenter-dark .subtitle{color:#8c9b9d;font-size:1.25rem;font-weight:400;line-height:1.25}html.theme--documenter-dark .subtitle strong{color:#8c9b9d;font-weight:600}html.theme--documenter-dark .subtitle:not(.is-spaced)+.title{margin-top:-1.25rem}html.theme--documenter-dark .subtitle.is-1{font-size:3rem}html.theme--documenter-dark .subtitle.is-2{font-size:2.5rem}html.theme--documenter-dark .subtitle.is-3{font-size:2rem}html.theme--documenter-dark .subtitle.is-4{font-size:1.5rem}html.theme--documenter-dark .subtitle.is-5{font-size:1.25rem}html.theme--documenter-dark .subtitle.is-6{font-size:1rem}html.theme--documenter-dark .subtitle.is-7{font-size:.75rem}html.theme--documenter-dark .heading{display:block;font-size:11px;letter-spacing:1px;margin-bottom:5px;text-transform:uppercase}html.theme--documenter-dark .number{align-items:center;background-color:#282f2f;border-radius:9999px;display:inline-flex;font-size:1.25rem;height:2em;justify-content:center;margin-right:1.5rem;min-width:2.5em;padding:0.25rem 0.5rem;text-align:center;vertical-align:top}html.theme--documenter-dark .select select,html.theme--documenter-dark .textarea,html.theme--documenter-dark .input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input{background-color:#1f2424;border-color:#5e6d6f;border-radius:.4em;color:#dbdee0}html.theme--documenter-dark .select select::-moz-placeholder,html.theme--documenter-dark .textarea::-moz-placeholder,html.theme--documenter-dark .input::-moz-placeholder,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input::-moz-placeholder{color:#868c98}html.theme--documenter-dark .select select::-webkit-input-placeholder,html.theme--documenter-dark .textarea::-webkit-input-placeholder,html.theme--documenter-dark .input::-webkit-input-placeholder,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input::-webkit-input-placeholder{color:#868c98}html.theme--documenter-dark .select select:-moz-placeholder,html.theme--documenter-dark .textarea:-moz-placeholder,html.theme--documenter-dark .input:-moz-placeholder,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input:-moz-placeholder{color:#868c98}html.theme--documenter-dark .select select:-ms-input-placeholder,html.theme--documenter-dark .textarea:-ms-input-placeholder,html.theme--documenter-dark .input:-ms-input-placeholder,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input:-ms-input-placeholder{color:#868c98}html.theme--documenter-dark .select select:hover,html.theme--documenter-dark .textarea:hover,html.theme--documenter-dark .input:hover,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input:hover,html.theme--documenter-dark .select select.is-hovered,html.theme--documenter-dark .is-hovered.textarea,html.theme--documenter-dark .is-hovered.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-hovered{border-color:#8c9b9d}html.theme--documenter-dark .select select:focus,html.theme--documenter-dark .textarea:focus,html.theme--documenter-dark .input:focus,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input:focus,html.theme--documenter-dark .select select.is-focused,html.theme--documenter-dark .is-focused.textarea,html.theme--documenter-dark .is-focused.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-focused,html.theme--documenter-dark .select select:active,html.theme--documenter-dark .textarea:active,html.theme--documenter-dark .input:active,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input:active,html.theme--documenter-dark .select select.is-active,html.theme--documenter-dark .is-active.textarea,html.theme--documenter-dark .is-active.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-active{border-color:#1abc9c;box-shadow:0 0 0 0.125em rgba(26,188,156,0.25)}html.theme--documenter-dark .select select[disabled],html.theme--documenter-dark .textarea[disabled],html.theme--documenter-dark .input[disabled],html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input[disabled],fieldset[disabled] html.theme--documenter-dark .select select,fieldset[disabled] html.theme--documenter-dark .textarea,fieldset[disabled] html.theme--documenter-dark .input,fieldset[disabled] html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input{background-color:#8c9b9d;border-color:#282f2f;box-shadow:none;color:#fff}html.theme--documenter-dark .select select[disabled]::-moz-placeholder,html.theme--documenter-dark .textarea[disabled]::-moz-placeholder,html.theme--documenter-dark .input[disabled]::-moz-placeholder,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input[disabled]::-moz-placeholder,fieldset[disabled] html.theme--documenter-dark .select select::-moz-placeholder,fieldset[disabled] html.theme--documenter-dark .textarea::-moz-placeholder,fieldset[disabled] html.theme--documenter-dark .input::-moz-placeholder,fieldset[disabled] html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input::-moz-placeholder{color:rgba(255,255,255,0.3)}html.theme--documenter-dark .select select[disabled]::-webkit-input-placeholder,html.theme--documenter-dark .textarea[disabled]::-webkit-input-placeholder,html.theme--documenter-dark .input[disabled]::-webkit-input-placeholder,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input[disabled]::-webkit-input-placeholder,fieldset[disabled] html.theme--documenter-dark .select select::-webkit-input-placeholder,fieldset[disabled] html.theme--documenter-dark .textarea::-webkit-input-placeholder,fieldset[disabled] html.theme--documenter-dark .input::-webkit-input-placeholder,fieldset[disabled] html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input::-webkit-input-placeholder{color:rgba(255,255,255,0.3)}html.theme--documenter-dark .select select[disabled]:-moz-placeholder,html.theme--documenter-dark .textarea[disabled]:-moz-placeholder,html.theme--documenter-dark .input[disabled]:-moz-placeholder,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input[disabled]:-moz-placeholder,fieldset[disabled] html.theme--documenter-dark .select select:-moz-placeholder,fieldset[disabled] html.theme--documenter-dark .textarea:-moz-placeholder,fieldset[disabled] html.theme--documenter-dark .input:-moz-placeholder,fieldset[disabled] html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input:-moz-placeholder{color:rgba(255,255,255,0.3)}html.theme--documenter-dark .select select[disabled]:-ms-input-placeholder,html.theme--documenter-dark .textarea[disabled]:-ms-input-placeholder,html.theme--documenter-dark .input[disabled]:-ms-input-placeholder,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input[disabled]:-ms-input-placeholder,fieldset[disabled] html.theme--documenter-dark .select select:-ms-input-placeholder,fieldset[disabled] html.theme--documenter-dark .textarea:-ms-input-placeholder,fieldset[disabled] html.theme--documenter-dark .input:-ms-input-placeholder,fieldset[disabled] html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input:-ms-input-placeholder{color:rgba(255,255,255,0.3)}html.theme--documenter-dark .textarea,html.theme--documenter-dark .input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input{box-shadow:inset 0 0.0625em 0.125em rgba(10,10,10,0.05);max-width:100%;width:100%}html.theme--documenter-dark .textarea[readonly],html.theme--documenter-dark .input[readonly],html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input[readonly]{box-shadow:none}html.theme--documenter-dark .is-white.textarea,html.theme--documenter-dark .is-white.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-white{border-color:#fff}html.theme--documenter-dark .is-white.textarea:focus,html.theme--documenter-dark .is-white.input:focus,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-white:focus,html.theme--documenter-dark .is-white.is-focused.textarea,html.theme--documenter-dark .is-white.is-focused.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-focused,html.theme--documenter-dark .is-white.textarea:active,html.theme--documenter-dark .is-white.input:active,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-white:active,html.theme--documenter-dark .is-white.is-active.textarea,html.theme--documenter-dark .is-white.is-active.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(255,255,255,0.25)}html.theme--documenter-dark .is-black.textarea,html.theme--documenter-dark .is-black.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-black{border-color:#0a0a0a}html.theme--documenter-dark .is-black.textarea:focus,html.theme--documenter-dark .is-black.input:focus,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-black:focus,html.theme--documenter-dark .is-black.is-focused.textarea,html.theme--documenter-dark .is-black.is-focused.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-focused,html.theme--documenter-dark .is-black.textarea:active,html.theme--documenter-dark .is-black.input:active,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-black:active,html.theme--documenter-dark .is-black.is-active.textarea,html.theme--documenter-dark .is-black.is-active.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(10,10,10,0.25)}html.theme--documenter-dark .is-light.textarea,html.theme--documenter-dark .is-light.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-light{border-color:#ecf0f1}html.theme--documenter-dark .is-light.textarea:focus,html.theme--documenter-dark .is-light.input:focus,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-light:focus,html.theme--documenter-dark .is-light.is-focused.textarea,html.theme--documenter-dark .is-light.is-focused.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-focused,html.theme--documenter-dark .is-light.textarea:active,html.theme--documenter-dark .is-light.input:active,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-light:active,html.theme--documenter-dark .is-light.is-active.textarea,html.theme--documenter-dark .is-light.is-active.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(236,240,241,0.25)}html.theme--documenter-dark .is-dark.textarea,html.theme--documenter-dark .content kbd.textarea,html.theme--documenter-dark .is-dark.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-dark,html.theme--documenter-dark .content kbd.input{border-color:#282f2f}html.theme--documenter-dark .is-dark.textarea:focus,html.theme--documenter-dark .content kbd.textarea:focus,html.theme--documenter-dark .is-dark.input:focus,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-dark:focus,html.theme--documenter-dark .content kbd.input:focus,html.theme--documenter-dark .is-dark.is-focused.textarea,html.theme--documenter-dark .content kbd.is-focused.textarea,html.theme--documenter-dark .is-dark.is-focused.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-focused,html.theme--documenter-dark .content kbd.is-focused.input,html.theme--documenter-dark #documenter .docs-sidebar .content form.docs-search>input.is-focused,html.theme--documenter-dark .is-dark.textarea:active,html.theme--documenter-dark .content kbd.textarea:active,html.theme--documenter-dark .is-dark.input:active,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-dark:active,html.theme--documenter-dark .content kbd.input:active,html.theme--documenter-dark .is-dark.is-active.textarea,html.theme--documenter-dark .content kbd.is-active.textarea,html.theme--documenter-dark .is-dark.is-active.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-active,html.theme--documenter-dark .content kbd.is-active.input,html.theme--documenter-dark #documenter .docs-sidebar .content form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(40,47,47,0.25)}html.theme--documenter-dark .is-primary.textarea,html.theme--documenter-dark .docstring>section>a.textarea.docs-sourcelink,html.theme--documenter-dark .is-primary.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-primary,html.theme--documenter-dark .docstring>section>a.input.docs-sourcelink{border-color:#375a7f}html.theme--documenter-dark .is-primary.textarea:focus,html.theme--documenter-dark .docstring>section>a.textarea.docs-sourcelink:focus,html.theme--documenter-dark .is-primary.input:focus,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-primary:focus,html.theme--documenter-dark .docstring>section>a.input.docs-sourcelink:focus,html.theme--documenter-dark .is-primary.is-focused.textarea,html.theme--documenter-dark .docstring>section>a.is-focused.textarea.docs-sourcelink,html.theme--documenter-dark .is-primary.is-focused.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-focused,html.theme--documenter-dark .docstring>section>a.is-focused.input.docs-sourcelink,html.theme--documenter-dark .is-primary.textarea:active,html.theme--documenter-dark .docstring>section>a.textarea.docs-sourcelink:active,html.theme--documenter-dark .is-primary.input:active,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-primary:active,html.theme--documenter-dark .docstring>section>a.input.docs-sourcelink:active,html.theme--documenter-dark .is-primary.is-active.textarea,html.theme--documenter-dark .docstring>section>a.is-active.textarea.docs-sourcelink,html.theme--documenter-dark .is-primary.is-active.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-active,html.theme--documenter-dark .docstring>section>a.is-active.input.docs-sourcelink{box-shadow:0 0 0 0.125em rgba(55,90,127,0.25)}html.theme--documenter-dark .is-link.textarea,html.theme--documenter-dark .is-link.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-link{border-color:#1abc9c}html.theme--documenter-dark .is-link.textarea:focus,html.theme--documenter-dark .is-link.input:focus,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-link:focus,html.theme--documenter-dark .is-link.is-focused.textarea,html.theme--documenter-dark .is-link.is-focused.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-focused,html.theme--documenter-dark .is-link.textarea:active,html.theme--documenter-dark .is-link.input:active,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-link:active,html.theme--documenter-dark .is-link.is-active.textarea,html.theme--documenter-dark .is-link.is-active.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(26,188,156,0.25)}html.theme--documenter-dark .is-info.textarea,html.theme--documenter-dark .is-info.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-info{border-color:#024c7d}html.theme--documenter-dark .is-info.textarea:focus,html.theme--documenter-dark .is-info.input:focus,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-info:focus,html.theme--documenter-dark .is-info.is-focused.textarea,html.theme--documenter-dark .is-info.is-focused.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-focused,html.theme--documenter-dark .is-info.textarea:active,html.theme--documenter-dark .is-info.input:active,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-info:active,html.theme--documenter-dark .is-info.is-active.textarea,html.theme--documenter-dark .is-info.is-active.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(2,76,125,0.25)}html.theme--documenter-dark .is-success.textarea,html.theme--documenter-dark .is-success.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-success{border-color:#008438}html.theme--documenter-dark .is-success.textarea:focus,html.theme--documenter-dark .is-success.input:focus,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-success:focus,html.theme--documenter-dark .is-success.is-focused.textarea,html.theme--documenter-dark .is-success.is-focused.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-focused,html.theme--documenter-dark .is-success.textarea:active,html.theme--documenter-dark .is-success.input:active,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-success:active,html.theme--documenter-dark .is-success.is-active.textarea,html.theme--documenter-dark .is-success.is-active.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(0,132,56,0.25)}html.theme--documenter-dark .is-warning.textarea,html.theme--documenter-dark .is-warning.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-warning{border-color:#ad8100}html.theme--documenter-dark .is-warning.textarea:focus,html.theme--documenter-dark .is-warning.input:focus,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-warning:focus,html.theme--documenter-dark .is-warning.is-focused.textarea,html.theme--documenter-dark .is-warning.is-focused.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-focused,html.theme--documenter-dark .is-warning.textarea:active,html.theme--documenter-dark .is-warning.input:active,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-warning:active,html.theme--documenter-dark .is-warning.is-active.textarea,html.theme--documenter-dark .is-warning.is-active.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(173,129,0,0.25)}html.theme--documenter-dark .is-danger.textarea,html.theme--documenter-dark .is-danger.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-danger{border-color:#9e1b0d}html.theme--documenter-dark .is-danger.textarea:focus,html.theme--documenter-dark .is-danger.input:focus,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-danger:focus,html.theme--documenter-dark .is-danger.is-focused.textarea,html.theme--documenter-dark .is-danger.is-focused.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-focused,html.theme--documenter-dark .is-danger.textarea:active,html.theme--documenter-dark .is-danger.input:active,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-danger:active,html.theme--documenter-dark .is-danger.is-active.textarea,html.theme--documenter-dark .is-danger.is-active.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(158,27,13,0.25)}html.theme--documenter-dark .is-small.textarea,html.theme--documenter-dark .is-small.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input{border-radius:3px;font-size:.75rem}html.theme--documenter-dark .is-medium.textarea,html.theme--documenter-dark .is-medium.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-medium{font-size:1.25rem}html.theme--documenter-dark .is-large.textarea,html.theme--documenter-dark .is-large.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-large{font-size:1.5rem}html.theme--documenter-dark .is-fullwidth.textarea,html.theme--documenter-dark .is-fullwidth.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-fullwidth{display:block;width:100%}html.theme--documenter-dark .is-inline.textarea,html.theme--documenter-dark .is-inline.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-inline{display:inline;width:auto}html.theme--documenter-dark .input.is-rounded,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input{border-radius:9999px;padding-left:calc(calc(0.75em - 1px) + 0.375em);padding-right:calc(calc(0.75em - 1px) + 0.375em)}html.theme--documenter-dark .input.is-static,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-static{background-color:transparent;border-color:transparent;box-shadow:none;padding-left:0;padding-right:0}html.theme--documenter-dark .textarea{display:block;max-width:100%;min-width:100%;padding:calc(0.75em - 1px);resize:vertical}html.theme--documenter-dark .textarea:not([rows]){max-height:40em;min-height:8em}html.theme--documenter-dark .textarea[rows]{height:initial}html.theme--documenter-dark .textarea.has-fixed-size{resize:none}html.theme--documenter-dark .radio,html.theme--documenter-dark .checkbox{cursor:pointer;display:inline-block;line-height:1.25;position:relative}html.theme--documenter-dark .radio input,html.theme--documenter-dark .checkbox input{cursor:pointer}html.theme--documenter-dark .radio:hover,html.theme--documenter-dark .checkbox:hover{color:#8c9b9d}html.theme--documenter-dark .radio[disabled],html.theme--documenter-dark .checkbox[disabled],fieldset[disabled] html.theme--documenter-dark .radio,fieldset[disabled] html.theme--documenter-dark .checkbox,html.theme--documenter-dark .radio input[disabled],html.theme--documenter-dark .checkbox input[disabled]{color:#fff;cursor:not-allowed}html.theme--documenter-dark .radio+.radio{margin-left:.5em}html.theme--documenter-dark .select{display:inline-block;max-width:100%;position:relative;vertical-align:top}html.theme--documenter-dark .select:not(.is-multiple){height:2.5em}html.theme--documenter-dark .select:not(.is-multiple):not(.is-loading)::after{border-color:#1abc9c;right:1.125em;z-index:4}html.theme--documenter-dark .select.is-rounded select,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.select select{border-radius:9999px;padding-left:1em}html.theme--documenter-dark .select select{cursor:pointer;display:block;font-size:1em;max-width:100%;outline:none}html.theme--documenter-dark .select select::-ms-expand{display:none}html.theme--documenter-dark .select select[disabled]:hover,fieldset[disabled] html.theme--documenter-dark .select select:hover{border-color:#282f2f}html.theme--documenter-dark .select select:not([multiple]){padding-right:2.5em}html.theme--documenter-dark .select select[multiple]{height:auto;padding:0}html.theme--documenter-dark .select select[multiple] option{padding:0.5em 1em}html.theme--documenter-dark .select:not(.is-multiple):not(.is-loading):hover::after{border-color:#8c9b9d}html.theme--documenter-dark .select.is-white:not(:hover)::after{border-color:#fff}html.theme--documenter-dark .select.is-white select{border-color:#fff}html.theme--documenter-dark .select.is-white select:hover,html.theme--documenter-dark .select.is-white select.is-hovered{border-color:#f2f2f2}html.theme--documenter-dark .select.is-white select:focus,html.theme--documenter-dark .select.is-white select.is-focused,html.theme--documenter-dark .select.is-white select:active,html.theme--documenter-dark .select.is-white select.is-active{box-shadow:0 0 0 0.125em rgba(255,255,255,0.25)}html.theme--documenter-dark .select.is-black:not(:hover)::after{border-color:#0a0a0a}html.theme--documenter-dark .select.is-black select{border-color:#0a0a0a}html.theme--documenter-dark .select.is-black select:hover,html.theme--documenter-dark .select.is-black select.is-hovered{border-color:#000}html.theme--documenter-dark .select.is-black select:focus,html.theme--documenter-dark .select.is-black select.is-focused,html.theme--documenter-dark .select.is-black select:active,html.theme--documenter-dark .select.is-black select.is-active{box-shadow:0 0 0 0.125em rgba(10,10,10,0.25)}html.theme--documenter-dark .select.is-light:not(:hover)::after{border-color:#ecf0f1}html.theme--documenter-dark .select.is-light select{border-color:#ecf0f1}html.theme--documenter-dark .select.is-light select:hover,html.theme--documenter-dark .select.is-light select.is-hovered{border-color:#dde4e6}html.theme--documenter-dark .select.is-light select:focus,html.theme--documenter-dark .select.is-light select.is-focused,html.theme--documenter-dark .select.is-light select:active,html.theme--documenter-dark .select.is-light select.is-active{box-shadow:0 0 0 0.125em rgba(236,240,241,0.25)}html.theme--documenter-dark .select.is-dark:not(:hover)::after,html.theme--documenter-dark .content kbd.select:not(:hover)::after{border-color:#282f2f}html.theme--documenter-dark .select.is-dark select,html.theme--documenter-dark .content kbd.select select{border-color:#282f2f}html.theme--documenter-dark .select.is-dark select:hover,html.theme--documenter-dark .content kbd.select select:hover,html.theme--documenter-dark .select.is-dark select.is-hovered,html.theme--documenter-dark .content kbd.select select.is-hovered{border-color:#1d2122}html.theme--documenter-dark .select.is-dark select:focus,html.theme--documenter-dark .content kbd.select select:focus,html.theme--documenter-dark .select.is-dark select.is-focused,html.theme--documenter-dark .content kbd.select select.is-focused,html.theme--documenter-dark .select.is-dark select:active,html.theme--documenter-dark .content kbd.select select:active,html.theme--documenter-dark .select.is-dark select.is-active,html.theme--documenter-dark .content kbd.select select.is-active{box-shadow:0 0 0 0.125em rgba(40,47,47,0.25)}html.theme--documenter-dark .select.is-primary:not(:hover)::after,html.theme--documenter-dark .docstring>section>a.select.docs-sourcelink:not(:hover)::after{border-color:#375a7f}html.theme--documenter-dark .select.is-primary select,html.theme--documenter-dark .docstring>section>a.select.docs-sourcelink select{border-color:#375a7f}html.theme--documenter-dark .select.is-primary select:hover,html.theme--documenter-dark .docstring>section>a.select.docs-sourcelink select:hover,html.theme--documenter-dark .select.is-primary select.is-hovered,html.theme--documenter-dark .docstring>section>a.select.docs-sourcelink select.is-hovered{border-color:#2f4d6d}html.theme--documenter-dark .select.is-primary select:focus,html.theme--documenter-dark .docstring>section>a.select.docs-sourcelink select:focus,html.theme--documenter-dark .select.is-primary select.is-focused,html.theme--documenter-dark .docstring>section>a.select.docs-sourcelink select.is-focused,html.theme--documenter-dark .select.is-primary select:active,html.theme--documenter-dark .docstring>section>a.select.docs-sourcelink select:active,html.theme--documenter-dark .select.is-primary select.is-active,html.theme--documenter-dark .docstring>section>a.select.docs-sourcelink select.is-active{box-shadow:0 0 0 0.125em rgba(55,90,127,0.25)}html.theme--documenter-dark .select.is-link:not(:hover)::after{border-color:#1abc9c}html.theme--documenter-dark .select.is-link select{border-color:#1abc9c}html.theme--documenter-dark .select.is-link select:hover,html.theme--documenter-dark .select.is-link select.is-hovered{border-color:#17a689}html.theme--documenter-dark .select.is-link select:focus,html.theme--documenter-dark .select.is-link select.is-focused,html.theme--documenter-dark .select.is-link select:active,html.theme--documenter-dark .select.is-link select.is-active{box-shadow:0 0 0 0.125em rgba(26,188,156,0.25)}html.theme--documenter-dark .select.is-info:not(:hover)::after{border-color:#024c7d}html.theme--documenter-dark .select.is-info select{border-color:#024c7d}html.theme--documenter-dark .select.is-info select:hover,html.theme--documenter-dark .select.is-info select.is-hovered{border-color:#023d64}html.theme--documenter-dark .select.is-info select:focus,html.theme--documenter-dark .select.is-info select.is-focused,html.theme--documenter-dark .select.is-info select:active,html.theme--documenter-dark .select.is-info select.is-active{box-shadow:0 0 0 0.125em rgba(2,76,125,0.25)}html.theme--documenter-dark .select.is-success:not(:hover)::after{border-color:#008438}html.theme--documenter-dark .select.is-success select{border-color:#008438}html.theme--documenter-dark .select.is-success select:hover,html.theme--documenter-dark .select.is-success select.is-hovered{border-color:#006b2d}html.theme--documenter-dark .select.is-success select:focus,html.theme--documenter-dark .select.is-success select.is-focused,html.theme--documenter-dark .select.is-success select:active,html.theme--documenter-dark .select.is-success select.is-active{box-shadow:0 0 0 0.125em rgba(0,132,56,0.25)}html.theme--documenter-dark .select.is-warning:not(:hover)::after{border-color:#ad8100}html.theme--documenter-dark .select.is-warning select{border-color:#ad8100}html.theme--documenter-dark .select.is-warning select:hover,html.theme--documenter-dark .select.is-warning select.is-hovered{border-color:#946e00}html.theme--documenter-dark .select.is-warning select:focus,html.theme--documenter-dark .select.is-warning select.is-focused,html.theme--documenter-dark .select.is-warning select:active,html.theme--documenter-dark .select.is-warning select.is-active{box-shadow:0 0 0 0.125em rgba(173,129,0,0.25)}html.theme--documenter-dark .select.is-danger:not(:hover)::after{border-color:#9e1b0d}html.theme--documenter-dark .select.is-danger select{border-color:#9e1b0d}html.theme--documenter-dark .select.is-danger select:hover,html.theme--documenter-dark .select.is-danger select.is-hovered{border-color:#86170b}html.theme--documenter-dark .select.is-danger select:focus,html.theme--documenter-dark .select.is-danger select.is-focused,html.theme--documenter-dark .select.is-danger select:active,html.theme--documenter-dark .select.is-danger select.is-active{box-shadow:0 0 0 0.125em rgba(158,27,13,0.25)}html.theme--documenter-dark .select.is-small,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.select{border-radius:3px;font-size:.75rem}html.theme--documenter-dark .select.is-medium{font-size:1.25rem}html.theme--documenter-dark .select.is-large{font-size:1.5rem}html.theme--documenter-dark .select.is-disabled::after{border-color:#fff !important;opacity:0.5}html.theme--documenter-dark .select.is-fullwidth{width:100%}html.theme--documenter-dark .select.is-fullwidth select{width:100%}html.theme--documenter-dark .select.is-loading::after{margin-top:0;position:absolute;right:.625em;top:0.625em;transform:none}html.theme--documenter-dark .select.is-loading.is-small:after,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-loading:after{font-size:.75rem}html.theme--documenter-dark .select.is-loading.is-medium:after{font-size:1.25rem}html.theme--documenter-dark .select.is-loading.is-large:after{font-size:1.5rem}html.theme--documenter-dark .file{align-items:stretch;display:flex;justify-content:flex-start;position:relative}html.theme--documenter-dark .file.is-white .file-cta{background-color:#fff;border-color:transparent;color:#0a0a0a}html.theme--documenter-dark .file.is-white:hover .file-cta,html.theme--documenter-dark .file.is-white.is-hovered .file-cta{background-color:#f9f9f9;border-color:transparent;color:#0a0a0a}html.theme--documenter-dark .file.is-white:focus .file-cta,html.theme--documenter-dark .file.is-white.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(255,255,255,0.25);color:#0a0a0a}html.theme--documenter-dark .file.is-white:active .file-cta,html.theme--documenter-dark .file.is-white.is-active .file-cta{background-color:#f2f2f2;border-color:transparent;color:#0a0a0a}html.theme--documenter-dark .file.is-black .file-cta{background-color:#0a0a0a;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-black:hover .file-cta,html.theme--documenter-dark .file.is-black.is-hovered .file-cta{background-color:#040404;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-black:focus .file-cta,html.theme--documenter-dark .file.is-black.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(10,10,10,0.25);color:#fff}html.theme--documenter-dark .file.is-black:active .file-cta,html.theme--documenter-dark .file.is-black.is-active .file-cta{background-color:#000;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-light .file-cta{background-color:#ecf0f1;border-color:transparent;color:rgba(0,0,0,0.7)}html.theme--documenter-dark .file.is-light:hover .file-cta,html.theme--documenter-dark .file.is-light.is-hovered .file-cta{background-color:#e5eaec;border-color:transparent;color:rgba(0,0,0,0.7)}html.theme--documenter-dark .file.is-light:focus .file-cta,html.theme--documenter-dark .file.is-light.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(236,240,241,0.25);color:rgba(0,0,0,0.7)}html.theme--documenter-dark .file.is-light:active .file-cta,html.theme--documenter-dark .file.is-light.is-active .file-cta{background-color:#dde4e6;border-color:transparent;color:rgba(0,0,0,0.7)}html.theme--documenter-dark .file.is-dark .file-cta,html.theme--documenter-dark .content kbd.file .file-cta{background-color:#282f2f;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-dark:hover .file-cta,html.theme--documenter-dark .content kbd.file:hover .file-cta,html.theme--documenter-dark .file.is-dark.is-hovered .file-cta,html.theme--documenter-dark .content kbd.file.is-hovered .file-cta{background-color:#232829;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-dark:focus .file-cta,html.theme--documenter-dark .content kbd.file:focus .file-cta,html.theme--documenter-dark .file.is-dark.is-focused .file-cta,html.theme--documenter-dark .content kbd.file.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(40,47,47,0.25);color:#fff}html.theme--documenter-dark .file.is-dark:active .file-cta,html.theme--documenter-dark .content kbd.file:active .file-cta,html.theme--documenter-dark .file.is-dark.is-active .file-cta,html.theme--documenter-dark .content kbd.file.is-active .file-cta{background-color:#1d2122;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-primary .file-cta,html.theme--documenter-dark .docstring>section>a.file.docs-sourcelink .file-cta{background-color:#375a7f;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-primary:hover .file-cta,html.theme--documenter-dark .docstring>section>a.file.docs-sourcelink:hover .file-cta,html.theme--documenter-dark .file.is-primary.is-hovered .file-cta,html.theme--documenter-dark .docstring>section>a.file.is-hovered.docs-sourcelink .file-cta{background-color:#335476;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-primary:focus .file-cta,html.theme--documenter-dark .docstring>section>a.file.docs-sourcelink:focus .file-cta,html.theme--documenter-dark .file.is-primary.is-focused .file-cta,html.theme--documenter-dark .docstring>section>a.file.is-focused.docs-sourcelink .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(55,90,127,0.25);color:#fff}html.theme--documenter-dark .file.is-primary:active .file-cta,html.theme--documenter-dark .docstring>section>a.file.docs-sourcelink:active .file-cta,html.theme--documenter-dark .file.is-primary.is-active .file-cta,html.theme--documenter-dark .docstring>section>a.file.is-active.docs-sourcelink .file-cta{background-color:#2f4d6d;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-link .file-cta{background-color:#1abc9c;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-link:hover .file-cta,html.theme--documenter-dark .file.is-link.is-hovered .file-cta{background-color:#18b193;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-link:focus .file-cta,html.theme--documenter-dark .file.is-link.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(26,188,156,0.25);color:#fff}html.theme--documenter-dark .file.is-link:active .file-cta,html.theme--documenter-dark .file.is-link.is-active .file-cta{background-color:#17a689;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-info .file-cta{background-color:#024c7d;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-info:hover .file-cta,html.theme--documenter-dark .file.is-info.is-hovered .file-cta{background-color:#024470;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-info:focus .file-cta,html.theme--documenter-dark .file.is-info.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(2,76,125,0.25);color:#fff}html.theme--documenter-dark .file.is-info:active .file-cta,html.theme--documenter-dark .file.is-info.is-active .file-cta{background-color:#023d64;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-success .file-cta{background-color:#008438;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-success:hover .file-cta,html.theme--documenter-dark .file.is-success.is-hovered .file-cta{background-color:#073;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-success:focus .file-cta,html.theme--documenter-dark .file.is-success.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(0,132,56,0.25);color:#fff}html.theme--documenter-dark .file.is-success:active .file-cta,html.theme--documenter-dark .file.is-success.is-active .file-cta{background-color:#006b2d;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-warning .file-cta{background-color:#ad8100;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-warning:hover .file-cta,html.theme--documenter-dark .file.is-warning.is-hovered .file-cta{background-color:#a07700;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-warning:focus .file-cta,html.theme--documenter-dark .file.is-warning.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(173,129,0,0.25);color:#fff}html.theme--documenter-dark .file.is-warning:active .file-cta,html.theme--documenter-dark .file.is-warning.is-active .file-cta{background-color:#946e00;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-danger .file-cta{background-color:#9e1b0d;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-danger:hover .file-cta,html.theme--documenter-dark .file.is-danger.is-hovered .file-cta{background-color:#92190c;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-danger:focus .file-cta,html.theme--documenter-dark .file.is-danger.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(158,27,13,0.25);color:#fff}html.theme--documenter-dark .file.is-danger:active .file-cta,html.theme--documenter-dark .file.is-danger.is-active .file-cta{background-color:#86170b;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-small,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.file{font-size:.75rem}html.theme--documenter-dark .file.is-normal{font-size:1rem}html.theme--documenter-dark .file.is-medium{font-size:1.25rem}html.theme--documenter-dark .file.is-medium .file-icon .fa{font-size:21px}html.theme--documenter-dark .file.is-large{font-size:1.5rem}html.theme--documenter-dark .file.is-large .file-icon .fa{font-size:28px}html.theme--documenter-dark .file.has-name .file-cta{border-bottom-right-radius:0;border-top-right-radius:0}html.theme--documenter-dark .file.has-name .file-name{border-bottom-left-radius:0;border-top-left-radius:0}html.theme--documenter-dark .file.has-name.is-empty .file-cta{border-radius:.4em}html.theme--documenter-dark .file.has-name.is-empty .file-name{display:none}html.theme--documenter-dark .file.is-boxed .file-label{flex-direction:column}html.theme--documenter-dark .file.is-boxed .file-cta{flex-direction:column;height:auto;padding:1em 3em}html.theme--documenter-dark .file.is-boxed .file-name{border-width:0 1px 1px}html.theme--documenter-dark .file.is-boxed .file-icon{height:1.5em;width:1.5em}html.theme--documenter-dark .file.is-boxed .file-icon .fa{font-size:21px}html.theme--documenter-dark .file.is-boxed.is-small .file-icon .fa,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-boxed .file-icon .fa{font-size:14px}html.theme--documenter-dark .file.is-boxed.is-medium .file-icon .fa{font-size:28px}html.theme--documenter-dark .file.is-boxed.is-large .file-icon .fa{font-size:35px}html.theme--documenter-dark .file.is-boxed.has-name .file-cta{border-radius:.4em .4em 0 0}html.theme--documenter-dark .file.is-boxed.has-name .file-name{border-radius:0 0 .4em .4em;border-width:0 1px 1px}html.theme--documenter-dark .file.is-centered{justify-content:center}html.theme--documenter-dark .file.is-fullwidth .file-label{width:100%}html.theme--documenter-dark .file.is-fullwidth .file-name{flex-grow:1;max-width:none}html.theme--documenter-dark .file.is-right{justify-content:flex-end}html.theme--documenter-dark .file.is-right .file-cta{border-radius:0 .4em .4em 0}html.theme--documenter-dark .file.is-right .file-name{border-radius:.4em 0 0 .4em;border-width:1px 0 1px 1px;order:-1}html.theme--documenter-dark .file-label{align-items:stretch;display:flex;cursor:pointer;justify-content:flex-start;overflow:hidden;position:relative}html.theme--documenter-dark .file-label:hover .file-cta{background-color:#232829;color:#f2f2f2}html.theme--documenter-dark .file-label:hover .file-name{border-color:#596668}html.theme--documenter-dark .file-label:active .file-cta{background-color:#1d2122;color:#f2f2f2}html.theme--documenter-dark .file-label:active .file-name{border-color:#535f61}html.theme--documenter-dark .file-input{height:100%;left:0;opacity:0;outline:none;position:absolute;top:0;width:100%}html.theme--documenter-dark .file-cta,html.theme--documenter-dark .file-name{border-color:#5e6d6f;border-radius:.4em;font-size:1em;padding-left:1em;padding-right:1em;white-space:nowrap}html.theme--documenter-dark .file-cta{background-color:#282f2f;color:#fff}html.theme--documenter-dark .file-name{border-color:#5e6d6f;border-style:solid;border-width:1px 1px 1px 0;display:block;max-width:16em;overflow:hidden;text-align:inherit;text-overflow:ellipsis}html.theme--documenter-dark .file-icon{align-items:center;display:flex;height:1em;justify-content:center;margin-right:.5em;width:1em}html.theme--documenter-dark .file-icon .fa{font-size:14px}html.theme--documenter-dark .label{color:#f2f2f2;display:block;font-size:1rem;font-weight:700}html.theme--documenter-dark .label:not(:last-child){margin-bottom:0.5em}html.theme--documenter-dark .label.is-small,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.label{font-size:.75rem}html.theme--documenter-dark .label.is-medium{font-size:1.25rem}html.theme--documenter-dark .label.is-large{font-size:1.5rem}html.theme--documenter-dark .help{display:block;font-size:.75rem;margin-top:0.25rem}html.theme--documenter-dark .help.is-white{color:#fff}html.theme--documenter-dark .help.is-black{color:#0a0a0a}html.theme--documenter-dark .help.is-light{color:#ecf0f1}html.theme--documenter-dark .help.is-dark,html.theme--documenter-dark .content kbd.help{color:#282f2f}html.theme--documenter-dark .help.is-primary,html.theme--documenter-dark .docstring>section>a.help.docs-sourcelink{color:#375a7f}html.theme--documenter-dark .help.is-link{color:#1abc9c}html.theme--documenter-dark .help.is-info{color:#024c7d}html.theme--documenter-dark .help.is-success{color:#008438}html.theme--documenter-dark .help.is-warning{color:#ad8100}html.theme--documenter-dark .help.is-danger{color:#9e1b0d}html.theme--documenter-dark .field:not(:last-child){margin-bottom:0.75rem}html.theme--documenter-dark .field.has-addons{display:flex;justify-content:flex-start}html.theme--documenter-dark .field.has-addons .control:not(:last-child){margin-right:-1px}html.theme--documenter-dark .field.has-addons .control:not(:first-child):not(:last-child) .button,html.theme--documenter-dark .field.has-addons .control:not(:first-child):not(:last-child) .input,html.theme--documenter-dark .field.has-addons .control:not(:first-child):not(:last-child) #documenter .docs-sidebar form.docs-search>input,html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control:not(:first-child):not(:last-child) form.docs-search>input,html.theme--documenter-dark .field.has-addons .control:not(:first-child):not(:last-child) .select select{border-radius:0}html.theme--documenter-dark .field.has-addons .control:first-child:not(:only-child) .button,html.theme--documenter-dark .field.has-addons .control:first-child:not(:only-child) .input,html.theme--documenter-dark .field.has-addons .control:first-child:not(:only-child) #documenter .docs-sidebar form.docs-search>input,html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control:first-child:not(:only-child) form.docs-search>input,html.theme--documenter-dark .field.has-addons .control:first-child:not(:only-child) .select select{border-bottom-right-radius:0;border-top-right-radius:0}html.theme--documenter-dark .field.has-addons .control:last-child:not(:only-child) .button,html.theme--documenter-dark .field.has-addons .control:last-child:not(:only-child) .input,html.theme--documenter-dark .field.has-addons .control:last-child:not(:only-child) #documenter .docs-sidebar form.docs-search>input,html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control:last-child:not(:only-child) form.docs-search>input,html.theme--documenter-dark .field.has-addons .control:last-child:not(:only-child) .select select{border-bottom-left-radius:0;border-top-left-radius:0}html.theme--documenter-dark .field.has-addons .control .button:not([disabled]):hover,html.theme--documenter-dark .field.has-addons .control .button.is-hovered:not([disabled]),html.theme--documenter-dark .field.has-addons .control .input:not([disabled]):hover,html.theme--documenter-dark .field.has-addons .control #documenter .docs-sidebar form.docs-search>input:not([disabled]):hover,html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control form.docs-search>input:not([disabled]):hover,html.theme--documenter-dark .field.has-addons .control .input.is-hovered:not([disabled]),html.theme--documenter-dark .field.has-addons .control #documenter .docs-sidebar form.docs-search>input.is-hovered:not([disabled]),html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control form.docs-search>input.is-hovered:not([disabled]),html.theme--documenter-dark .field.has-addons .control .select select:not([disabled]):hover,html.theme--documenter-dark .field.has-addons .control .select select.is-hovered:not([disabled]){z-index:2}html.theme--documenter-dark .field.has-addons .control .button:not([disabled]):focus,html.theme--documenter-dark .field.has-addons .control .button.is-focused:not([disabled]),html.theme--documenter-dark .field.has-addons .control .button:not([disabled]):active,html.theme--documenter-dark .field.has-addons .control .button.is-active:not([disabled]),html.theme--documenter-dark .field.has-addons .control .input:not([disabled]):focus,html.theme--documenter-dark .field.has-addons .control #documenter .docs-sidebar form.docs-search>input:not([disabled]):focus,html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control form.docs-search>input:not([disabled]):focus,html.theme--documenter-dark .field.has-addons .control .input.is-focused:not([disabled]),html.theme--documenter-dark .field.has-addons .control #documenter .docs-sidebar form.docs-search>input.is-focused:not([disabled]),html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control form.docs-search>input.is-focused:not([disabled]),html.theme--documenter-dark .field.has-addons .control .input:not([disabled]):active,html.theme--documenter-dark .field.has-addons .control #documenter .docs-sidebar form.docs-search>input:not([disabled]):active,html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control form.docs-search>input:not([disabled]):active,html.theme--documenter-dark .field.has-addons .control .input.is-active:not([disabled]),html.theme--documenter-dark .field.has-addons .control #documenter .docs-sidebar form.docs-search>input.is-active:not([disabled]),html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control form.docs-search>input.is-active:not([disabled]),html.theme--documenter-dark .field.has-addons .control .select select:not([disabled]):focus,html.theme--documenter-dark .field.has-addons .control .select select.is-focused:not([disabled]),html.theme--documenter-dark .field.has-addons .control .select select:not([disabled]):active,html.theme--documenter-dark .field.has-addons .control .select select.is-active:not([disabled]){z-index:3}html.theme--documenter-dark .field.has-addons .control .button:not([disabled]):focus:hover,html.theme--documenter-dark .field.has-addons .control .button.is-focused:not([disabled]):hover,html.theme--documenter-dark .field.has-addons .control .button:not([disabled]):active:hover,html.theme--documenter-dark .field.has-addons .control .button.is-active:not([disabled]):hover,html.theme--documenter-dark .field.has-addons .control .input:not([disabled]):focus:hover,html.theme--documenter-dark .field.has-addons .control #documenter .docs-sidebar form.docs-search>input:not([disabled]):focus:hover,html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control form.docs-search>input:not([disabled]):focus:hover,html.theme--documenter-dark .field.has-addons .control .input.is-focused:not([disabled]):hover,html.theme--documenter-dark .field.has-addons .control #documenter .docs-sidebar form.docs-search>input.is-focused:not([disabled]):hover,html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control form.docs-search>input.is-focused:not([disabled]):hover,html.theme--documenter-dark .field.has-addons .control .input:not([disabled]):active:hover,html.theme--documenter-dark .field.has-addons .control #documenter .docs-sidebar form.docs-search>input:not([disabled]):active:hover,html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control form.docs-search>input:not([disabled]):active:hover,html.theme--documenter-dark .field.has-addons .control .input.is-active:not([disabled]):hover,html.theme--documenter-dark .field.has-addons .control #documenter .docs-sidebar form.docs-search>input.is-active:not([disabled]):hover,html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control form.docs-search>input.is-active:not([disabled]):hover,html.theme--documenter-dark .field.has-addons .control .select select:not([disabled]):focus:hover,html.theme--documenter-dark .field.has-addons .control .select select.is-focused:not([disabled]):hover,html.theme--documenter-dark .field.has-addons .control .select select:not([disabled]):active:hover,html.theme--documenter-dark .field.has-addons .control .select select.is-active:not([disabled]):hover{z-index:4}html.theme--documenter-dark .field.has-addons .control.is-expanded{flex-grow:1;flex-shrink:1}html.theme--documenter-dark .field.has-addons.has-addons-centered{justify-content:center}html.theme--documenter-dark .field.has-addons.has-addons-right{justify-content:flex-end}html.theme--documenter-dark .field.has-addons.has-addons-fullwidth .control{flex-grow:1;flex-shrink:0}html.theme--documenter-dark .field.is-grouped{display:flex;justify-content:flex-start}html.theme--documenter-dark .field.is-grouped>.control{flex-shrink:0}html.theme--documenter-dark .field.is-grouped>.control:not(:last-child){margin-bottom:0;margin-right:.75rem}html.theme--documenter-dark .field.is-grouped>.control.is-expanded{flex-grow:1;flex-shrink:1}html.theme--documenter-dark .field.is-grouped.is-grouped-centered{justify-content:center}html.theme--documenter-dark .field.is-grouped.is-grouped-right{justify-content:flex-end}html.theme--documenter-dark .field.is-grouped.is-grouped-multiline{flex-wrap:wrap}html.theme--documenter-dark .field.is-grouped.is-grouped-multiline>.control:last-child,html.theme--documenter-dark .field.is-grouped.is-grouped-multiline>.control:not(:last-child){margin-bottom:0.75rem}html.theme--documenter-dark .field.is-grouped.is-grouped-multiline:last-child{margin-bottom:-0.75rem}html.theme--documenter-dark .field.is-grouped.is-grouped-multiline:not(:last-child){margin-bottom:0}@media screen and (min-width: 769px),print{html.theme--documenter-dark .field.is-horizontal{display:flex}}html.theme--documenter-dark .field-label .label{font-size:inherit}@media screen and (max-width: 768px){html.theme--documenter-dark .field-label{margin-bottom:0.5rem}}@media screen and (min-width: 769px),print{html.theme--documenter-dark .field-label{flex-basis:0;flex-grow:1;flex-shrink:0;margin-right:1.5rem;text-align:right}html.theme--documenter-dark .field-label.is-small,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.field-label{font-size:.75rem;padding-top:0.375em}html.theme--documenter-dark .field-label.is-normal{padding-top:0.375em}html.theme--documenter-dark .field-label.is-medium{font-size:1.25rem;padding-top:0.375em}html.theme--documenter-dark .field-label.is-large{font-size:1.5rem;padding-top:0.375em}}html.theme--documenter-dark .field-body .field .field{margin-bottom:0}@media screen and (min-width: 769px),print{html.theme--documenter-dark .field-body{display:flex;flex-basis:0;flex-grow:5;flex-shrink:1}html.theme--documenter-dark .field-body .field{margin-bottom:0}html.theme--documenter-dark .field-body>.field{flex-shrink:1}html.theme--documenter-dark .field-body>.field:not(.is-narrow){flex-grow:1}html.theme--documenter-dark .field-body>.field:not(:last-child){margin-right:.75rem}}html.theme--documenter-dark .control{box-sizing:border-box;clear:both;font-size:1rem;position:relative;text-align:inherit}html.theme--documenter-dark .control.has-icons-left .input:focus~.icon,html.theme--documenter-dark .control.has-icons-left #documenter .docs-sidebar form.docs-search>input:focus~.icon,html.theme--documenter-dark #documenter .docs-sidebar .control.has-icons-left form.docs-search>input:focus~.icon,html.theme--documenter-dark .control.has-icons-left .select:focus~.icon,html.theme--documenter-dark .control.has-icons-right .input:focus~.icon,html.theme--documenter-dark .control.has-icons-right #documenter .docs-sidebar form.docs-search>input:focus~.icon,html.theme--documenter-dark #documenter .docs-sidebar .control.has-icons-right form.docs-search>input:focus~.icon,html.theme--documenter-dark .control.has-icons-right .select:focus~.icon{color:#282f2f}html.theme--documenter-dark .control.has-icons-left .input.is-small~.icon,html.theme--documenter-dark .control.has-icons-left #documenter .docs-sidebar form.docs-search>input~.icon,html.theme--documenter-dark #documenter .docs-sidebar .control.has-icons-left form.docs-search>input~.icon,html.theme--documenter-dark .control.has-icons-left .select.is-small~.icon,html.theme--documenter-dark .control.has-icons-right .input.is-small~.icon,html.theme--documenter-dark .control.has-icons-right #documenter .docs-sidebar form.docs-search>input~.icon,html.theme--documenter-dark #documenter .docs-sidebar .control.has-icons-right form.docs-search>input~.icon,html.theme--documenter-dark .control.has-icons-right .select.is-small~.icon{font-size:.75rem}html.theme--documenter-dark .control.has-icons-left .input.is-medium~.icon,html.theme--documenter-dark .control.has-icons-left #documenter .docs-sidebar form.docs-search>input.is-medium~.icon,html.theme--documenter-dark #documenter .docs-sidebar .control.has-icons-left form.docs-search>input.is-medium~.icon,html.theme--documenter-dark .control.has-icons-left .select.is-medium~.icon,html.theme--documenter-dark .control.has-icons-right .input.is-medium~.icon,html.theme--documenter-dark .control.has-icons-right #documenter .docs-sidebar form.docs-search>input.is-medium~.icon,html.theme--documenter-dark #documenter .docs-sidebar .control.has-icons-right form.docs-search>input.is-medium~.icon,html.theme--documenter-dark .control.has-icons-right .select.is-medium~.icon{font-size:1.25rem}html.theme--documenter-dark .control.has-icons-left .input.is-large~.icon,html.theme--documenter-dark .control.has-icons-left #documenter .docs-sidebar form.docs-search>input.is-large~.icon,html.theme--documenter-dark #documenter .docs-sidebar .control.has-icons-left form.docs-search>input.is-large~.icon,html.theme--documenter-dark .control.has-icons-left .select.is-large~.icon,html.theme--documenter-dark .control.has-icons-right .input.is-large~.icon,html.theme--documenter-dark .control.has-icons-right #documenter .docs-sidebar form.docs-search>input.is-large~.icon,html.theme--documenter-dark #documenter .docs-sidebar .control.has-icons-right form.docs-search>input.is-large~.icon,html.theme--documenter-dark .control.has-icons-right .select.is-large~.icon{font-size:1.5rem}html.theme--documenter-dark .control.has-icons-left .icon,html.theme--documenter-dark .control.has-icons-right .icon{color:#5e6d6f;height:2.5em;pointer-events:none;position:absolute;top:0;width:2.5em;z-index:4}html.theme--documenter-dark .control.has-icons-left .input,html.theme--documenter-dark .control.has-icons-left #documenter .docs-sidebar form.docs-search>input,html.theme--documenter-dark #documenter .docs-sidebar .control.has-icons-left form.docs-search>input,html.theme--documenter-dark .control.has-icons-left .select select{padding-left:2.5em}html.theme--documenter-dark .control.has-icons-left .icon.is-left{left:0}html.theme--documenter-dark .control.has-icons-right .input,html.theme--documenter-dark .control.has-icons-right #documenter .docs-sidebar form.docs-search>input,html.theme--documenter-dark #documenter .docs-sidebar .control.has-icons-right form.docs-search>input,html.theme--documenter-dark .control.has-icons-right .select select{padding-right:2.5em}html.theme--documenter-dark .control.has-icons-right .icon.is-right{right:0}html.theme--documenter-dark .control.is-loading::after{position:absolute !important;right:.625em;top:0.625em;z-index:4}html.theme--documenter-dark .control.is-loading.is-small:after,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-loading:after{font-size:.75rem}html.theme--documenter-dark .control.is-loading.is-medium:after{font-size:1.25rem}html.theme--documenter-dark .control.is-loading.is-large:after{font-size:1.5rem}html.theme--documenter-dark .breadcrumb{font-size:1rem;white-space:nowrap}html.theme--documenter-dark .breadcrumb a{align-items:center;color:#1abc9c;display:flex;justify-content:center;padding:0 .75em}html.theme--documenter-dark .breadcrumb a:hover{color:#1dd2af}html.theme--documenter-dark .breadcrumb li{align-items:center;display:flex}html.theme--documenter-dark .breadcrumb li:first-child a{padding-left:0}html.theme--documenter-dark .breadcrumb li.is-active a{color:#f2f2f2;cursor:default;pointer-events:none}html.theme--documenter-dark .breadcrumb li+li::before{color:#8c9b9d;content:"\0002f"}html.theme--documenter-dark .breadcrumb ul,html.theme--documenter-dark .breadcrumb ol{align-items:flex-start;display:flex;flex-wrap:wrap;justify-content:flex-start}html.theme--documenter-dark .breadcrumb .icon:first-child{margin-right:.5em}html.theme--documenter-dark .breadcrumb .icon:last-child{margin-left:.5em}html.theme--documenter-dark .breadcrumb.is-centered ol,html.theme--documenter-dark .breadcrumb.is-centered ul{justify-content:center}html.theme--documenter-dark .breadcrumb.is-right ol,html.theme--documenter-dark .breadcrumb.is-right ul{justify-content:flex-end}html.theme--documenter-dark .breadcrumb.is-small,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.breadcrumb{font-size:.75rem}html.theme--documenter-dark .breadcrumb.is-medium{font-size:1.25rem}html.theme--documenter-dark .breadcrumb.is-large{font-size:1.5rem}html.theme--documenter-dark .breadcrumb.has-arrow-separator li+li::before{content:"\02192"}html.theme--documenter-dark .breadcrumb.has-bullet-separator li+li::before{content:"\02022"}html.theme--documenter-dark .breadcrumb.has-dot-separator li+li::before{content:"\000b7"}html.theme--documenter-dark .breadcrumb.has-succeeds-separator li+li::before{content:"\0227B"}html.theme--documenter-dark .card{background-color:#fff;border-radius:.25rem;box-shadow:#171717;color:#fff;max-width:100%;position:relative}html.theme--documenter-dark .card-footer:first-child,html.theme--documenter-dark .card-content:first-child,html.theme--documenter-dark .card-header:first-child{border-top-left-radius:.25rem;border-top-right-radius:.25rem}html.theme--documenter-dark .card-footer:last-child,html.theme--documenter-dark .card-content:last-child,html.theme--documenter-dark .card-header:last-child{border-bottom-left-radius:.25rem;border-bottom-right-radius:.25rem}html.theme--documenter-dark .card-header{background-color:rgba(0,0,0,0);align-items:stretch;box-shadow:0 0.125em 0.25em rgba(10,10,10,0.1);display:flex}html.theme--documenter-dark .card-header-title{align-items:center;color:#f2f2f2;display:flex;flex-grow:1;font-weight:700;padding:0.75rem 1rem}html.theme--documenter-dark .card-header-title.is-centered{justify-content:center}html.theme--documenter-dark .card-header-icon{-moz-appearance:none;-webkit-appearance:none;appearance:none;background:none;border:none;color:currentColor;font-family:inherit;font-size:1em;margin:0;padding:0;align-items:center;cursor:pointer;display:flex;justify-content:center;padding:0.75rem 1rem}html.theme--documenter-dark .card-image{display:block;position:relative}html.theme--documenter-dark .card-image:first-child img{border-top-left-radius:.25rem;border-top-right-radius:.25rem}html.theme--documenter-dark .card-image:last-child img{border-bottom-left-radius:.25rem;border-bottom-right-radius:.25rem}html.theme--documenter-dark .card-content{background-color:rgba(0,0,0,0);padding:1.5rem}html.theme--documenter-dark .card-footer{background-color:rgba(0,0,0,0);border-top:1px solid #ededed;align-items:stretch;display:flex}html.theme--documenter-dark .card-footer-item{align-items:center;display:flex;flex-basis:0;flex-grow:1;flex-shrink:0;justify-content:center;padding:.75rem}html.theme--documenter-dark .card-footer-item:not(:last-child){border-right:1px solid #ededed}html.theme--documenter-dark .card .media:not(:last-child){margin-bottom:1.5rem}html.theme--documenter-dark .dropdown{display:inline-flex;position:relative;vertical-align:top}html.theme--documenter-dark .dropdown.is-active .dropdown-menu,html.theme--documenter-dark .dropdown.is-hoverable:hover .dropdown-menu{display:block}html.theme--documenter-dark .dropdown.is-right .dropdown-menu{left:auto;right:0}html.theme--documenter-dark .dropdown.is-up .dropdown-menu{bottom:100%;padding-bottom:4px;padding-top:initial;top:auto}html.theme--documenter-dark .dropdown-menu{display:none;left:0;min-width:12rem;padding-top:4px;position:absolute;top:100%;z-index:20}html.theme--documenter-dark .dropdown-content{background-color:#282f2f;border-radius:.4em;box-shadow:#171717;padding-bottom:.5rem;padding-top:.5rem}html.theme--documenter-dark .dropdown-item{color:#fff;display:block;font-size:0.875rem;line-height:1.5;padding:0.375rem 1rem;position:relative}html.theme--documenter-dark a.dropdown-item,html.theme--documenter-dark button.dropdown-item{padding-right:3rem;text-align:inherit;white-space:nowrap;width:100%}html.theme--documenter-dark a.dropdown-item:hover,html.theme--documenter-dark button.dropdown-item:hover{background-color:#282f2f;color:#0a0a0a}html.theme--documenter-dark a.dropdown-item.is-active,html.theme--documenter-dark button.dropdown-item.is-active{background-color:#1abc9c;color:#fff}html.theme--documenter-dark .dropdown-divider{background-color:#ededed;border:none;display:block;height:1px;margin:0.5rem 0}html.theme--documenter-dark .level{align-items:center;justify-content:space-between}html.theme--documenter-dark .level code{border-radius:.4em}html.theme--documenter-dark .level img{display:inline-block;vertical-align:top}html.theme--documenter-dark .level.is-mobile{display:flex}html.theme--documenter-dark .level.is-mobile .level-left,html.theme--documenter-dark .level.is-mobile .level-right{display:flex}html.theme--documenter-dark .level.is-mobile .level-left+.level-right{margin-top:0}html.theme--documenter-dark .level.is-mobile .level-item:not(:last-child){margin-bottom:0;margin-right:.75rem}html.theme--documenter-dark .level.is-mobile .level-item:not(.is-narrow){flex-grow:1}@media screen and (min-width: 769px),print{html.theme--documenter-dark .level{display:flex}html.theme--documenter-dark .level>.level-item:not(.is-narrow){flex-grow:1}}html.theme--documenter-dark .level-item{align-items:center;display:flex;flex-basis:auto;flex-grow:0;flex-shrink:0;justify-content:center}html.theme--documenter-dark .level-item .title,html.theme--documenter-dark .level-item .subtitle{margin-bottom:0}@media screen and (max-width: 768px){html.theme--documenter-dark .level-item:not(:last-child){margin-bottom:.75rem}}html.theme--documenter-dark .level-left,html.theme--documenter-dark .level-right{flex-basis:auto;flex-grow:0;flex-shrink:0}html.theme--documenter-dark .level-left .level-item.is-flexible,html.theme--documenter-dark .level-right .level-item.is-flexible{flex-grow:1}@media screen and (min-width: 769px),print{html.theme--documenter-dark .level-left .level-item:not(:last-child),html.theme--documenter-dark .level-right .level-item:not(:last-child){margin-right:.75rem}}html.theme--documenter-dark .level-left{align-items:center;justify-content:flex-start}@media screen and (max-width: 768px){html.theme--documenter-dark .level-left+.level-right{margin-top:1.5rem}}@media screen and (min-width: 769px),print{html.theme--documenter-dark .level-left{display:flex}}html.theme--documenter-dark .level-right{align-items:center;justify-content:flex-end}@media screen and (min-width: 769px),print{html.theme--documenter-dark .level-right{display:flex}}html.theme--documenter-dark .media{align-items:flex-start;display:flex;text-align:inherit}html.theme--documenter-dark .media .content:not(:last-child){margin-bottom:.75rem}html.theme--documenter-dark .media .media{border-top:1px solid rgba(94,109,111,0.5);display:flex;padding-top:.75rem}html.theme--documenter-dark .media .media .content:not(:last-child),html.theme--documenter-dark .media .media .control:not(:last-child){margin-bottom:.5rem}html.theme--documenter-dark .media .media .media{padding-top:.5rem}html.theme--documenter-dark .media .media .media+.media{margin-top:.5rem}html.theme--documenter-dark .media+.media{border-top:1px solid rgba(94,109,111,0.5);margin-top:1rem;padding-top:1rem}html.theme--documenter-dark .media.is-large+.media{margin-top:1.5rem;padding-top:1.5rem}html.theme--documenter-dark .media-left,html.theme--documenter-dark .media-right{flex-basis:auto;flex-grow:0;flex-shrink:0}html.theme--documenter-dark .media-left{margin-right:1rem}html.theme--documenter-dark .media-right{margin-left:1rem}html.theme--documenter-dark .media-content{flex-basis:auto;flex-grow:1;flex-shrink:1;text-align:inherit}@media screen and (max-width: 768px){html.theme--documenter-dark .media-content{overflow-x:auto}}html.theme--documenter-dark .menu{font-size:1rem}html.theme--documenter-dark .menu.is-small,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.menu{font-size:.75rem}html.theme--documenter-dark .menu.is-medium{font-size:1.25rem}html.theme--documenter-dark .menu.is-large{font-size:1.5rem}html.theme--documenter-dark .menu-list{line-height:1.25}html.theme--documenter-dark .menu-list a{border-radius:3px;color:#fff;display:block;padding:0.5em 0.75em}html.theme--documenter-dark .menu-list a:hover{background-color:#282f2f;color:#f2f2f2}html.theme--documenter-dark .menu-list a.is-active{background-color:#1abc9c;color:#fff}html.theme--documenter-dark .menu-list li ul{border-left:1px solid #5e6d6f;margin:.75em;padding-left:.75em}html.theme--documenter-dark .menu-label{color:#fff;font-size:.75em;letter-spacing:.1em;text-transform:uppercase}html.theme--documenter-dark .menu-label:not(:first-child){margin-top:1em}html.theme--documenter-dark .menu-label:not(:last-child){margin-bottom:1em}html.theme--documenter-dark .message{background-color:#282f2f;border-radius:.4em;font-size:1rem}html.theme--documenter-dark .message strong{color:currentColor}html.theme--documenter-dark .message a:not(.button):not(.tag):not(.dropdown-item){color:currentColor;text-decoration:underline}html.theme--documenter-dark .message.is-small,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.message{font-size:.75rem}html.theme--documenter-dark .message.is-medium{font-size:1.25rem}html.theme--documenter-dark .message.is-large{font-size:1.5rem}html.theme--documenter-dark .message.is-white{background-color:#fff}html.theme--documenter-dark .message.is-white .message-header{background-color:#fff;color:#0a0a0a}html.theme--documenter-dark .message.is-white .message-body{border-color:#fff}html.theme--documenter-dark .message.is-black{background-color:#fafafa}html.theme--documenter-dark .message.is-black .message-header{background-color:#0a0a0a;color:#fff}html.theme--documenter-dark .message.is-black .message-body{border-color:#0a0a0a}html.theme--documenter-dark .message.is-light{background-color:#f9fafb}html.theme--documenter-dark .message.is-light .message-header{background-color:#ecf0f1;color:rgba(0,0,0,0.7)}html.theme--documenter-dark .message.is-light .message-body{border-color:#ecf0f1}html.theme--documenter-dark .message.is-dark,html.theme--documenter-dark .content kbd.message{background-color:#f9fafa}html.theme--documenter-dark .message.is-dark .message-header,html.theme--documenter-dark .content kbd.message .message-header{background-color:#282f2f;color:#fff}html.theme--documenter-dark .message.is-dark .message-body,html.theme--documenter-dark .content kbd.message .message-body{border-color:#282f2f}html.theme--documenter-dark .message.is-primary,html.theme--documenter-dark .docstring>section>a.message.docs-sourcelink{background-color:#f1f5f9}html.theme--documenter-dark .message.is-primary .message-header,html.theme--documenter-dark .docstring>section>a.message.docs-sourcelink .message-header{background-color:#375a7f;color:#fff}html.theme--documenter-dark .message.is-primary .message-body,html.theme--documenter-dark .docstring>section>a.message.docs-sourcelink .message-body{border-color:#375a7f;color:#4d7eb2}html.theme--documenter-dark .message.is-link{background-color:#edfdf9}html.theme--documenter-dark .message.is-link .message-header{background-color:#1abc9c;color:#fff}html.theme--documenter-dark .message.is-link .message-body{border-color:#1abc9c;color:#15987e}html.theme--documenter-dark .message.is-info{background-color:#ebf7ff}html.theme--documenter-dark .message.is-info .message-header{background-color:#024c7d;color:#fff}html.theme--documenter-dark .message.is-info .message-body{border-color:#024c7d;color:#0e9dfb}html.theme--documenter-dark .message.is-success{background-color:#ebfff3}html.theme--documenter-dark .message.is-success .message-header{background-color:#008438;color:#fff}html.theme--documenter-dark .message.is-success .message-body{border-color:#008438;color:#00eb64}html.theme--documenter-dark .message.is-warning{background-color:#fffaeb}html.theme--documenter-dark .message.is-warning .message-header{background-color:#ad8100;color:#fff}html.theme--documenter-dark .message.is-warning .message-body{border-color:#ad8100;color:#d19c00}html.theme--documenter-dark .message.is-danger{background-color:#fdeeec}html.theme--documenter-dark .message.is-danger .message-header{background-color:#9e1b0d;color:#fff}html.theme--documenter-dark .message.is-danger .message-body{border-color:#9e1b0d;color:#ec311d}html.theme--documenter-dark .message-header{align-items:center;background-color:#fff;border-radius:.4em .4em 0 0;color:rgba(0,0,0,0.7);display:flex;font-weight:700;justify-content:space-between;line-height:1.25;padding:0.75em 1em;position:relative}html.theme--documenter-dark .message-header .delete{flex-grow:0;flex-shrink:0;margin-left:.75em}html.theme--documenter-dark .message-header+.message-body{border-width:0;border-top-left-radius:0;border-top-right-radius:0}html.theme--documenter-dark .message-body{border-color:#5e6d6f;border-radius:.4em;border-style:solid;border-width:0 0 0 4px;color:#fff;padding:1.25em 1.5em}html.theme--documenter-dark .message-body code,html.theme--documenter-dark .message-body pre{background-color:#fff}html.theme--documenter-dark .message-body pre code{background-color:rgba(0,0,0,0)}html.theme--documenter-dark .modal{align-items:center;display:none;flex-direction:column;justify-content:center;overflow:hidden;position:fixed;z-index:40}html.theme--documenter-dark .modal.is-active{display:flex}html.theme--documenter-dark .modal-background{background-color:rgba(10,10,10,0.86)}html.theme--documenter-dark .modal-content,html.theme--documenter-dark .modal-card{margin:0 20px;max-height:calc(100vh - 160px);overflow:auto;position:relative;width:100%}@media screen and (min-width: 769px){html.theme--documenter-dark .modal-content,html.theme--documenter-dark .modal-card{margin:0 auto;max-height:calc(100vh - 40px);width:640px}}html.theme--documenter-dark .modal-close{background:none;height:40px;position:fixed;right:20px;top:20px;width:40px}html.theme--documenter-dark .modal-card{display:flex;flex-direction:column;max-height:calc(100vh - 40px);overflow:hidden;-ms-overflow-y:visible}html.theme--documenter-dark .modal-card-head,html.theme--documenter-dark .modal-card-foot{align-items:center;background-color:#282f2f;display:flex;flex-shrink:0;justify-content:flex-start;padding:20px;position:relative}html.theme--documenter-dark .modal-card-head{border-bottom:1px solid #5e6d6f;border-top-left-radius:8px;border-top-right-radius:8px}html.theme--documenter-dark .modal-card-title{color:#f2f2f2;flex-grow:1;flex-shrink:0;font-size:1.5rem;line-height:1}html.theme--documenter-dark .modal-card-foot{border-bottom-left-radius:8px;border-bottom-right-radius:8px;border-top:1px solid #5e6d6f}html.theme--documenter-dark .modal-card-foot .button:not(:last-child){margin-right:.5em}html.theme--documenter-dark .modal-card-body{-webkit-overflow-scrolling:touch;background-color:#fff;flex-grow:1;flex-shrink:1;overflow:auto;padding:20px}html.theme--documenter-dark .navbar{background-color:#375a7f;min-height:4rem;position:relative;z-index:30}html.theme--documenter-dark .navbar.is-white{background-color:#fff;color:#0a0a0a}html.theme--documenter-dark .navbar.is-white .navbar-brand>.navbar-item,html.theme--documenter-dark .navbar.is-white .navbar-brand .navbar-link{color:#0a0a0a}html.theme--documenter-dark .navbar.is-white .navbar-brand>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-white .navbar-brand>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-white .navbar-brand>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-white .navbar-brand .navbar-link:focus,html.theme--documenter-dark .navbar.is-white .navbar-brand .navbar-link:hover,html.theme--documenter-dark .navbar.is-white .navbar-brand .navbar-link.is-active{background-color:#f2f2f2;color:#0a0a0a}html.theme--documenter-dark .navbar.is-white .navbar-brand .navbar-link::after{border-color:#0a0a0a}html.theme--documenter-dark .navbar.is-white .navbar-burger{color:#0a0a0a}@media screen and (min-width: 1056px){html.theme--documenter-dark .navbar.is-white .navbar-start>.navbar-item,html.theme--documenter-dark .navbar.is-white .navbar-start .navbar-link,html.theme--documenter-dark .navbar.is-white .navbar-end>.navbar-item,html.theme--documenter-dark .navbar.is-white .navbar-end .navbar-link{color:#0a0a0a}html.theme--documenter-dark .navbar.is-white .navbar-start>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-white .navbar-start>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-white .navbar-start>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-white .navbar-start .navbar-link:focus,html.theme--documenter-dark .navbar.is-white .navbar-start .navbar-link:hover,html.theme--documenter-dark .navbar.is-white .navbar-start .navbar-link.is-active,html.theme--documenter-dark .navbar.is-white .navbar-end>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-white .navbar-end>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-white .navbar-end>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-white .navbar-end .navbar-link:focus,html.theme--documenter-dark .navbar.is-white .navbar-end .navbar-link:hover,html.theme--documenter-dark .navbar.is-white .navbar-end .navbar-link.is-active{background-color:#f2f2f2;color:#0a0a0a}html.theme--documenter-dark .navbar.is-white .navbar-start .navbar-link::after,html.theme--documenter-dark .navbar.is-white .navbar-end .navbar-link::after{border-color:#0a0a0a}html.theme--documenter-dark .navbar.is-white .navbar-item.has-dropdown:focus .navbar-link,html.theme--documenter-dark .navbar.is-white .navbar-item.has-dropdown:hover .navbar-link,html.theme--documenter-dark .navbar.is-white .navbar-item.has-dropdown.is-active .navbar-link{background-color:#f2f2f2;color:#0a0a0a}html.theme--documenter-dark .navbar.is-white .navbar-dropdown a.navbar-item.is-active{background-color:#fff;color:#0a0a0a}}html.theme--documenter-dark .navbar.is-black{background-color:#0a0a0a;color:#fff}html.theme--documenter-dark .navbar.is-black .navbar-brand>.navbar-item,html.theme--documenter-dark .navbar.is-black .navbar-brand .navbar-link{color:#fff}html.theme--documenter-dark .navbar.is-black .navbar-brand>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-black .navbar-brand>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-black .navbar-brand>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-black .navbar-brand .navbar-link:focus,html.theme--documenter-dark .navbar.is-black .navbar-brand .navbar-link:hover,html.theme--documenter-dark .navbar.is-black .navbar-brand .navbar-link.is-active{background-color:#000;color:#fff}html.theme--documenter-dark .navbar.is-black .navbar-brand .navbar-link::after{border-color:#fff}html.theme--documenter-dark .navbar.is-black .navbar-burger{color:#fff}@media screen and (min-width: 1056px){html.theme--documenter-dark .navbar.is-black .navbar-start>.navbar-item,html.theme--documenter-dark .navbar.is-black .navbar-start .navbar-link,html.theme--documenter-dark .navbar.is-black .navbar-end>.navbar-item,html.theme--documenter-dark .navbar.is-black .navbar-end .navbar-link{color:#fff}html.theme--documenter-dark .navbar.is-black .navbar-start>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-black .navbar-start>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-black .navbar-start>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-black .navbar-start .navbar-link:focus,html.theme--documenter-dark .navbar.is-black .navbar-start .navbar-link:hover,html.theme--documenter-dark .navbar.is-black .navbar-start .navbar-link.is-active,html.theme--documenter-dark .navbar.is-black .navbar-end>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-black .navbar-end>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-black .navbar-end>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-black .navbar-end .navbar-link:focus,html.theme--documenter-dark .navbar.is-black .navbar-end .navbar-link:hover,html.theme--documenter-dark .navbar.is-black .navbar-end .navbar-link.is-active{background-color:#000;color:#fff}html.theme--documenter-dark .navbar.is-black .navbar-start .navbar-link::after,html.theme--documenter-dark .navbar.is-black .navbar-end .navbar-link::after{border-color:#fff}html.theme--documenter-dark .navbar.is-black .navbar-item.has-dropdown:focus .navbar-link,html.theme--documenter-dark .navbar.is-black .navbar-item.has-dropdown:hover .navbar-link,html.theme--documenter-dark .navbar.is-black .navbar-item.has-dropdown.is-active .navbar-link{background-color:#000;color:#fff}html.theme--documenter-dark .navbar.is-black .navbar-dropdown a.navbar-item.is-active{background-color:#0a0a0a;color:#fff}}html.theme--documenter-dark .navbar.is-light{background-color:#ecf0f1;color:rgba(0,0,0,0.7)}html.theme--documenter-dark .navbar.is-light .navbar-brand>.navbar-item,html.theme--documenter-dark .navbar.is-light .navbar-brand .navbar-link{color:rgba(0,0,0,0.7)}html.theme--documenter-dark .navbar.is-light .navbar-brand>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-light .navbar-brand>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-light .navbar-brand>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-light .navbar-brand .navbar-link:focus,html.theme--documenter-dark .navbar.is-light .navbar-brand .navbar-link:hover,html.theme--documenter-dark .navbar.is-light .navbar-brand .navbar-link.is-active{background-color:#dde4e6;color:rgba(0,0,0,0.7)}html.theme--documenter-dark .navbar.is-light .navbar-brand .navbar-link::after{border-color:rgba(0,0,0,0.7)}html.theme--documenter-dark .navbar.is-light .navbar-burger{color:rgba(0,0,0,0.7)}@media screen and (min-width: 1056px){html.theme--documenter-dark .navbar.is-light .navbar-start>.navbar-item,html.theme--documenter-dark .navbar.is-light .navbar-start .navbar-link,html.theme--documenter-dark .navbar.is-light .navbar-end>.navbar-item,html.theme--documenter-dark .navbar.is-light .navbar-end .navbar-link{color:rgba(0,0,0,0.7)}html.theme--documenter-dark .navbar.is-light .navbar-start>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-light .navbar-start>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-light .navbar-start>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-light .navbar-start .navbar-link:focus,html.theme--documenter-dark .navbar.is-light .navbar-start .navbar-link:hover,html.theme--documenter-dark .navbar.is-light .navbar-start .navbar-link.is-active,html.theme--documenter-dark .navbar.is-light .navbar-end>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-light .navbar-end>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-light .navbar-end>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-light .navbar-end .navbar-link:focus,html.theme--documenter-dark .navbar.is-light .navbar-end .navbar-link:hover,html.theme--documenter-dark .navbar.is-light .navbar-end .navbar-link.is-active{background-color:#dde4e6;color:rgba(0,0,0,0.7)}html.theme--documenter-dark .navbar.is-light .navbar-start .navbar-link::after,html.theme--documenter-dark .navbar.is-light .navbar-end .navbar-link::after{border-color:rgba(0,0,0,0.7)}html.theme--documenter-dark .navbar.is-light .navbar-item.has-dropdown:focus .navbar-link,html.theme--documenter-dark .navbar.is-light .navbar-item.has-dropdown:hover .navbar-link,html.theme--documenter-dark .navbar.is-light .navbar-item.has-dropdown.is-active .navbar-link{background-color:#dde4e6;color:rgba(0,0,0,0.7)}html.theme--documenter-dark .navbar.is-light .navbar-dropdown a.navbar-item.is-active{background-color:#ecf0f1;color:rgba(0,0,0,0.7)}}html.theme--documenter-dark .navbar.is-dark,html.theme--documenter-dark .content kbd.navbar{background-color:#282f2f;color:#fff}html.theme--documenter-dark .navbar.is-dark .navbar-brand>.navbar-item,html.theme--documenter-dark .content kbd.navbar .navbar-brand>.navbar-item,html.theme--documenter-dark .navbar.is-dark .navbar-brand .navbar-link,html.theme--documenter-dark .content kbd.navbar .navbar-brand .navbar-link{color:#fff}html.theme--documenter-dark .navbar.is-dark .navbar-brand>a.navbar-item:focus,html.theme--documenter-dark .content kbd.navbar .navbar-brand>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-dark .navbar-brand>a.navbar-item:hover,html.theme--documenter-dark .content kbd.navbar .navbar-brand>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-dark .navbar-brand>a.navbar-item.is-active,html.theme--documenter-dark .content kbd.navbar .navbar-brand>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-dark .navbar-brand .navbar-link:focus,html.theme--documenter-dark .content kbd.navbar .navbar-brand .navbar-link:focus,html.theme--documenter-dark .navbar.is-dark .navbar-brand .navbar-link:hover,html.theme--documenter-dark .content kbd.navbar .navbar-brand .navbar-link:hover,html.theme--documenter-dark .navbar.is-dark .navbar-brand .navbar-link.is-active,html.theme--documenter-dark .content kbd.navbar .navbar-brand .navbar-link.is-active{background-color:#1d2122;color:#fff}html.theme--documenter-dark .navbar.is-dark .navbar-brand .navbar-link::after,html.theme--documenter-dark .content kbd.navbar .navbar-brand .navbar-link::after{border-color:#fff}html.theme--documenter-dark .navbar.is-dark .navbar-burger,html.theme--documenter-dark .content kbd.navbar .navbar-burger{color:#fff}@media screen and (min-width: 1056px){html.theme--documenter-dark .navbar.is-dark .navbar-start>.navbar-item,html.theme--documenter-dark .content kbd.navbar .navbar-start>.navbar-item,html.theme--documenter-dark .navbar.is-dark .navbar-start .navbar-link,html.theme--documenter-dark .content kbd.navbar .navbar-start .navbar-link,html.theme--documenter-dark .navbar.is-dark .navbar-end>.navbar-item,html.theme--documenter-dark .content kbd.navbar .navbar-end>.navbar-item,html.theme--documenter-dark .navbar.is-dark .navbar-end .navbar-link,html.theme--documenter-dark .content kbd.navbar .navbar-end .navbar-link{color:#fff}html.theme--documenter-dark .navbar.is-dark .navbar-start>a.navbar-item:focus,html.theme--documenter-dark .content kbd.navbar .navbar-start>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-dark .navbar-start>a.navbar-item:hover,html.theme--documenter-dark .content kbd.navbar .navbar-start>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-dark .navbar-start>a.navbar-item.is-active,html.theme--documenter-dark .content kbd.navbar .navbar-start>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-dark .navbar-start .navbar-link:focus,html.theme--documenter-dark .content kbd.navbar .navbar-start .navbar-link:focus,html.theme--documenter-dark .navbar.is-dark .navbar-start .navbar-link:hover,html.theme--documenter-dark .content kbd.navbar .navbar-start .navbar-link:hover,html.theme--documenter-dark .navbar.is-dark .navbar-start .navbar-link.is-active,html.theme--documenter-dark .content kbd.navbar .navbar-start .navbar-link.is-active,html.theme--documenter-dark .navbar.is-dark .navbar-end>a.navbar-item:focus,html.theme--documenter-dark .content kbd.navbar .navbar-end>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-dark .navbar-end>a.navbar-item:hover,html.theme--documenter-dark .content kbd.navbar .navbar-end>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-dark .navbar-end>a.navbar-item.is-active,html.theme--documenter-dark .content kbd.navbar .navbar-end>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-dark .navbar-end .navbar-link:focus,html.theme--documenter-dark .content kbd.navbar .navbar-end .navbar-link:focus,html.theme--documenter-dark .navbar.is-dark .navbar-end .navbar-link:hover,html.theme--documenter-dark .content kbd.navbar .navbar-end .navbar-link:hover,html.theme--documenter-dark .navbar.is-dark .navbar-end .navbar-link.is-active,html.theme--documenter-dark .content kbd.navbar .navbar-end .navbar-link.is-active{background-color:#1d2122;color:#fff}html.theme--documenter-dark .navbar.is-dark .navbar-start .navbar-link::after,html.theme--documenter-dark .content kbd.navbar .navbar-start .navbar-link::after,html.theme--documenter-dark .navbar.is-dark .navbar-end .navbar-link::after,html.theme--documenter-dark .content kbd.navbar .navbar-end .navbar-link::after{border-color:#fff}html.theme--documenter-dark .navbar.is-dark .navbar-item.has-dropdown:focus .navbar-link,html.theme--documenter-dark .content kbd.navbar .navbar-item.has-dropdown:focus .navbar-link,html.theme--documenter-dark .navbar.is-dark .navbar-item.has-dropdown:hover .navbar-link,html.theme--documenter-dark .content kbd.navbar .navbar-item.has-dropdown:hover .navbar-link,html.theme--documenter-dark .navbar.is-dark .navbar-item.has-dropdown.is-active .navbar-link,html.theme--documenter-dark .content kbd.navbar .navbar-item.has-dropdown.is-active .navbar-link{background-color:#1d2122;color:#fff}html.theme--documenter-dark .navbar.is-dark .navbar-dropdown a.navbar-item.is-active,html.theme--documenter-dark .content kbd.navbar .navbar-dropdown a.navbar-item.is-active{background-color:#282f2f;color:#fff}}html.theme--documenter-dark .navbar.is-primary,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink{background-color:#375a7f;color:#fff}html.theme--documenter-dark .navbar.is-primary .navbar-brand>.navbar-item,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-brand>.navbar-item,html.theme--documenter-dark .navbar.is-primary .navbar-brand .navbar-link,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-brand .navbar-link{color:#fff}html.theme--documenter-dark .navbar.is-primary .navbar-brand>a.navbar-item:focus,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-brand>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-primary .navbar-brand>a.navbar-item:hover,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-brand>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-primary .navbar-brand>a.navbar-item.is-active,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-brand>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-primary .navbar-brand .navbar-link:focus,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-brand .navbar-link:focus,html.theme--documenter-dark .navbar.is-primary .navbar-brand .navbar-link:hover,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-brand .navbar-link:hover,html.theme--documenter-dark .navbar.is-primary .navbar-brand .navbar-link.is-active,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-brand .navbar-link.is-active{background-color:#2f4d6d;color:#fff}html.theme--documenter-dark .navbar.is-primary .navbar-brand .navbar-link::after,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-brand .navbar-link::after{border-color:#fff}html.theme--documenter-dark .navbar.is-primary .navbar-burger,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-burger{color:#fff}@media screen and (min-width: 1056px){html.theme--documenter-dark .navbar.is-primary .navbar-start>.navbar-item,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-start>.navbar-item,html.theme--documenter-dark .navbar.is-primary .navbar-start .navbar-link,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-start .navbar-link,html.theme--documenter-dark .navbar.is-primary .navbar-end>.navbar-item,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-end>.navbar-item,html.theme--documenter-dark .navbar.is-primary .navbar-end .navbar-link,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-end .navbar-link{color:#fff}html.theme--documenter-dark .navbar.is-primary .navbar-start>a.navbar-item:focus,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-start>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-primary .navbar-start>a.navbar-item:hover,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-start>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-primary .navbar-start>a.navbar-item.is-active,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-start>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-primary .navbar-start .navbar-link:focus,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-start .navbar-link:focus,html.theme--documenter-dark .navbar.is-primary .navbar-start .navbar-link:hover,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-start .navbar-link:hover,html.theme--documenter-dark .navbar.is-primary .navbar-start .navbar-link.is-active,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-start .navbar-link.is-active,html.theme--documenter-dark .navbar.is-primary .navbar-end>a.navbar-item:focus,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-end>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-primary .navbar-end>a.navbar-item:hover,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-end>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-primary .navbar-end>a.navbar-item.is-active,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-end>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-primary .navbar-end .navbar-link:focus,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-end .navbar-link:focus,html.theme--documenter-dark .navbar.is-primary .navbar-end .navbar-link:hover,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-end .navbar-link:hover,html.theme--documenter-dark .navbar.is-primary .navbar-end .navbar-link.is-active,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-end .navbar-link.is-active{background-color:#2f4d6d;color:#fff}html.theme--documenter-dark .navbar.is-primary .navbar-start .navbar-link::after,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-start .navbar-link::after,html.theme--documenter-dark .navbar.is-primary .navbar-end .navbar-link::after,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-end .navbar-link::after{border-color:#fff}html.theme--documenter-dark .navbar.is-primary .navbar-item.has-dropdown:focus .navbar-link,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-item.has-dropdown:focus .navbar-link,html.theme--documenter-dark .navbar.is-primary .navbar-item.has-dropdown:hover .navbar-link,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-item.has-dropdown:hover .navbar-link,html.theme--documenter-dark .navbar.is-primary .navbar-item.has-dropdown.is-active .navbar-link,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-item.has-dropdown.is-active .navbar-link{background-color:#2f4d6d;color:#fff}html.theme--documenter-dark .navbar.is-primary .navbar-dropdown a.navbar-item.is-active,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-dropdown a.navbar-item.is-active{background-color:#375a7f;color:#fff}}html.theme--documenter-dark .navbar.is-link{background-color:#1abc9c;color:#fff}html.theme--documenter-dark .navbar.is-link .navbar-brand>.navbar-item,html.theme--documenter-dark .navbar.is-link .navbar-brand .navbar-link{color:#fff}html.theme--documenter-dark .navbar.is-link .navbar-brand>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-link .navbar-brand>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-link .navbar-brand>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-link .navbar-brand .navbar-link:focus,html.theme--documenter-dark .navbar.is-link .navbar-brand .navbar-link:hover,html.theme--documenter-dark .navbar.is-link .navbar-brand .navbar-link.is-active{background-color:#17a689;color:#fff}html.theme--documenter-dark .navbar.is-link .navbar-brand .navbar-link::after{border-color:#fff}html.theme--documenter-dark .navbar.is-link .navbar-burger{color:#fff}@media screen and (min-width: 1056px){html.theme--documenter-dark .navbar.is-link .navbar-start>.navbar-item,html.theme--documenter-dark .navbar.is-link .navbar-start .navbar-link,html.theme--documenter-dark .navbar.is-link .navbar-end>.navbar-item,html.theme--documenter-dark .navbar.is-link .navbar-end .navbar-link{color:#fff}html.theme--documenter-dark .navbar.is-link .navbar-start>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-link .navbar-start>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-link .navbar-start>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-link .navbar-start .navbar-link:focus,html.theme--documenter-dark .navbar.is-link .navbar-start .navbar-link:hover,html.theme--documenter-dark .navbar.is-link .navbar-start .navbar-link.is-active,html.theme--documenter-dark .navbar.is-link .navbar-end>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-link .navbar-end>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-link .navbar-end>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-link .navbar-end .navbar-link:focus,html.theme--documenter-dark .navbar.is-link .navbar-end .navbar-link:hover,html.theme--documenter-dark .navbar.is-link .navbar-end .navbar-link.is-active{background-color:#17a689;color:#fff}html.theme--documenter-dark .navbar.is-link .navbar-start .navbar-link::after,html.theme--documenter-dark .navbar.is-link .navbar-end .navbar-link::after{border-color:#fff}html.theme--documenter-dark .navbar.is-link .navbar-item.has-dropdown:focus .navbar-link,html.theme--documenter-dark .navbar.is-link .navbar-item.has-dropdown:hover .navbar-link,html.theme--documenter-dark .navbar.is-link .navbar-item.has-dropdown.is-active .navbar-link{background-color:#17a689;color:#fff}html.theme--documenter-dark .navbar.is-link .navbar-dropdown a.navbar-item.is-active{background-color:#1abc9c;color:#fff}}html.theme--documenter-dark .navbar.is-info{background-color:#024c7d;color:#fff}html.theme--documenter-dark .navbar.is-info .navbar-brand>.navbar-item,html.theme--documenter-dark .navbar.is-info .navbar-brand .navbar-link{color:#fff}html.theme--documenter-dark .navbar.is-info .navbar-brand>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-info .navbar-brand>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-info .navbar-brand>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-info .navbar-brand .navbar-link:focus,html.theme--documenter-dark .navbar.is-info .navbar-brand .navbar-link:hover,html.theme--documenter-dark .navbar.is-info .navbar-brand .navbar-link.is-active{background-color:#023d64;color:#fff}html.theme--documenter-dark .navbar.is-info .navbar-brand .navbar-link::after{border-color:#fff}html.theme--documenter-dark .navbar.is-info .navbar-burger{color:#fff}@media screen and (min-width: 1056px){html.theme--documenter-dark .navbar.is-info .navbar-start>.navbar-item,html.theme--documenter-dark .navbar.is-info .navbar-start .navbar-link,html.theme--documenter-dark .navbar.is-info .navbar-end>.navbar-item,html.theme--documenter-dark .navbar.is-info .navbar-end .navbar-link{color:#fff}html.theme--documenter-dark .navbar.is-info .navbar-start>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-info .navbar-start>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-info .navbar-start>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-info .navbar-start .navbar-link:focus,html.theme--documenter-dark .navbar.is-info .navbar-start .navbar-link:hover,html.theme--documenter-dark .navbar.is-info .navbar-start .navbar-link.is-active,html.theme--documenter-dark .navbar.is-info .navbar-end>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-info .navbar-end>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-info .navbar-end>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-info .navbar-end .navbar-link:focus,html.theme--documenter-dark .navbar.is-info .navbar-end .navbar-link:hover,html.theme--documenter-dark .navbar.is-info .navbar-end .navbar-link.is-active{background-color:#023d64;color:#fff}html.theme--documenter-dark .navbar.is-info .navbar-start .navbar-link::after,html.theme--documenter-dark .navbar.is-info .navbar-end .navbar-link::after{border-color:#fff}html.theme--documenter-dark .navbar.is-info .navbar-item.has-dropdown:focus .navbar-link,html.theme--documenter-dark .navbar.is-info .navbar-item.has-dropdown:hover .navbar-link,html.theme--documenter-dark .navbar.is-info .navbar-item.has-dropdown.is-active .navbar-link{background-color:#023d64;color:#fff}html.theme--documenter-dark .navbar.is-info .navbar-dropdown a.navbar-item.is-active{background-color:#024c7d;color:#fff}}html.theme--documenter-dark .navbar.is-success{background-color:#008438;color:#fff}html.theme--documenter-dark .navbar.is-success .navbar-brand>.navbar-item,html.theme--documenter-dark .navbar.is-success .navbar-brand .navbar-link{color:#fff}html.theme--documenter-dark .navbar.is-success .navbar-brand>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-success .navbar-brand>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-success .navbar-brand>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-success .navbar-brand .navbar-link:focus,html.theme--documenter-dark .navbar.is-success .navbar-brand .navbar-link:hover,html.theme--documenter-dark .navbar.is-success .navbar-brand .navbar-link.is-active{background-color:#006b2d;color:#fff}html.theme--documenter-dark .navbar.is-success .navbar-brand .navbar-link::after{border-color:#fff}html.theme--documenter-dark .navbar.is-success .navbar-burger{color:#fff}@media screen and (min-width: 1056px){html.theme--documenter-dark .navbar.is-success .navbar-start>.navbar-item,html.theme--documenter-dark .navbar.is-success .navbar-start .navbar-link,html.theme--documenter-dark .navbar.is-success .navbar-end>.navbar-item,html.theme--documenter-dark .navbar.is-success .navbar-end .navbar-link{color:#fff}html.theme--documenter-dark .navbar.is-success .navbar-start>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-success .navbar-start>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-success .navbar-start>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-success .navbar-start .navbar-link:focus,html.theme--documenter-dark .navbar.is-success .navbar-start .navbar-link:hover,html.theme--documenter-dark .navbar.is-success .navbar-start .navbar-link.is-active,html.theme--documenter-dark .navbar.is-success .navbar-end>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-success .navbar-end>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-success .navbar-end>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-success .navbar-end .navbar-link:focus,html.theme--documenter-dark .navbar.is-success .navbar-end .navbar-link:hover,html.theme--documenter-dark .navbar.is-success .navbar-end .navbar-link.is-active{background-color:#006b2d;color:#fff}html.theme--documenter-dark .navbar.is-success .navbar-start .navbar-link::after,html.theme--documenter-dark .navbar.is-success .navbar-end .navbar-link::after{border-color:#fff}html.theme--documenter-dark .navbar.is-success .navbar-item.has-dropdown:focus .navbar-link,html.theme--documenter-dark .navbar.is-success .navbar-item.has-dropdown:hover .navbar-link,html.theme--documenter-dark .navbar.is-success .navbar-item.has-dropdown.is-active .navbar-link{background-color:#006b2d;color:#fff}html.theme--documenter-dark .navbar.is-success .navbar-dropdown a.navbar-item.is-active{background-color:#008438;color:#fff}}html.theme--documenter-dark .navbar.is-warning{background-color:#ad8100;color:#fff}html.theme--documenter-dark .navbar.is-warning .navbar-brand>.navbar-item,html.theme--documenter-dark .navbar.is-warning .navbar-brand .navbar-link{color:#fff}html.theme--documenter-dark .navbar.is-warning .navbar-brand>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-warning .navbar-brand>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-warning .navbar-brand>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-warning .navbar-brand .navbar-link:focus,html.theme--documenter-dark .navbar.is-warning .navbar-brand .navbar-link:hover,html.theme--documenter-dark .navbar.is-warning .navbar-brand .navbar-link.is-active{background-color:#946e00;color:#fff}html.theme--documenter-dark .navbar.is-warning .navbar-brand .navbar-link::after{border-color:#fff}html.theme--documenter-dark .navbar.is-warning .navbar-burger{color:#fff}@media screen and (min-width: 1056px){html.theme--documenter-dark .navbar.is-warning .navbar-start>.navbar-item,html.theme--documenter-dark .navbar.is-warning .navbar-start .navbar-link,html.theme--documenter-dark .navbar.is-warning .navbar-end>.navbar-item,html.theme--documenter-dark .navbar.is-warning .navbar-end .navbar-link{color:#fff}html.theme--documenter-dark .navbar.is-warning .navbar-start>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-warning .navbar-start>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-warning .navbar-start>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-warning .navbar-start .navbar-link:focus,html.theme--documenter-dark .navbar.is-warning .navbar-start .navbar-link:hover,html.theme--documenter-dark .navbar.is-warning .navbar-start .navbar-link.is-active,html.theme--documenter-dark .navbar.is-warning .navbar-end>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-warning .navbar-end>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-warning .navbar-end>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-warning .navbar-end .navbar-link:focus,html.theme--documenter-dark .navbar.is-warning .navbar-end .navbar-link:hover,html.theme--documenter-dark .navbar.is-warning .navbar-end .navbar-link.is-active{background-color:#946e00;color:#fff}html.theme--documenter-dark .navbar.is-warning .navbar-start .navbar-link::after,html.theme--documenter-dark .navbar.is-warning .navbar-end .navbar-link::after{border-color:#fff}html.theme--documenter-dark .navbar.is-warning .navbar-item.has-dropdown:focus .navbar-link,html.theme--documenter-dark .navbar.is-warning .navbar-item.has-dropdown:hover .navbar-link,html.theme--documenter-dark .navbar.is-warning .navbar-item.has-dropdown.is-active .navbar-link{background-color:#946e00;color:#fff}html.theme--documenter-dark .navbar.is-warning .navbar-dropdown a.navbar-item.is-active{background-color:#ad8100;color:#fff}}html.theme--documenter-dark .navbar.is-danger{background-color:#9e1b0d;color:#fff}html.theme--documenter-dark .navbar.is-danger .navbar-brand>.navbar-item,html.theme--documenter-dark .navbar.is-danger .navbar-brand .navbar-link{color:#fff}html.theme--documenter-dark .navbar.is-danger .navbar-brand>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-danger .navbar-brand>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-danger .navbar-brand>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-danger .navbar-brand .navbar-link:focus,html.theme--documenter-dark .navbar.is-danger .navbar-brand .navbar-link:hover,html.theme--documenter-dark .navbar.is-danger .navbar-brand .navbar-link.is-active{background-color:#86170b;color:#fff}html.theme--documenter-dark .navbar.is-danger .navbar-brand .navbar-link::after{border-color:#fff}html.theme--documenter-dark .navbar.is-danger .navbar-burger{color:#fff}@media screen and (min-width: 1056px){html.theme--documenter-dark .navbar.is-danger .navbar-start>.navbar-item,html.theme--documenter-dark .navbar.is-danger .navbar-start .navbar-link,html.theme--documenter-dark .navbar.is-danger .navbar-end>.navbar-item,html.theme--documenter-dark .navbar.is-danger .navbar-end .navbar-link{color:#fff}html.theme--documenter-dark .navbar.is-danger .navbar-start>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-danger .navbar-start>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-danger .navbar-start>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-danger .navbar-start .navbar-link:focus,html.theme--documenter-dark .navbar.is-danger .navbar-start .navbar-link:hover,html.theme--documenter-dark .navbar.is-danger .navbar-start .navbar-link.is-active,html.theme--documenter-dark .navbar.is-danger .navbar-end>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-danger .navbar-end>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-danger .navbar-end>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-danger .navbar-end .navbar-link:focus,html.theme--documenter-dark .navbar.is-danger .navbar-end .navbar-link:hover,html.theme--documenter-dark .navbar.is-danger .navbar-end .navbar-link.is-active{background-color:#86170b;color:#fff}html.theme--documenter-dark .navbar.is-danger .navbar-start .navbar-link::after,html.theme--documenter-dark .navbar.is-danger .navbar-end .navbar-link::after{border-color:#fff}html.theme--documenter-dark .navbar.is-danger .navbar-item.has-dropdown:focus .navbar-link,html.theme--documenter-dark .navbar.is-danger .navbar-item.has-dropdown:hover .navbar-link,html.theme--documenter-dark .navbar.is-danger .navbar-item.has-dropdown.is-active .navbar-link{background-color:#86170b;color:#fff}html.theme--documenter-dark .navbar.is-danger .navbar-dropdown a.navbar-item.is-active{background-color:#9e1b0d;color:#fff}}html.theme--documenter-dark .navbar>.container{align-items:stretch;display:flex;min-height:4rem;width:100%}html.theme--documenter-dark .navbar.has-shadow{box-shadow:0 2px 0 0 #282f2f}html.theme--documenter-dark .navbar.is-fixed-bottom,html.theme--documenter-dark .navbar.is-fixed-top{left:0;position:fixed;right:0;z-index:30}html.theme--documenter-dark .navbar.is-fixed-bottom{bottom:0}html.theme--documenter-dark .navbar.is-fixed-bottom.has-shadow{box-shadow:0 -2px 0 0 #282f2f}html.theme--documenter-dark .navbar.is-fixed-top{top:0}html.theme--documenter-dark html.has-navbar-fixed-top,html.theme--documenter-dark body.has-navbar-fixed-top{padding-top:4rem}html.theme--documenter-dark html.has-navbar-fixed-bottom,html.theme--documenter-dark body.has-navbar-fixed-bottom{padding-bottom:4rem}html.theme--documenter-dark .navbar-brand,html.theme--documenter-dark .navbar-tabs{align-items:stretch;display:flex;flex-shrink:0;min-height:4rem}html.theme--documenter-dark .navbar-brand a.navbar-item:focus,html.theme--documenter-dark .navbar-brand a.navbar-item:hover{background-color:transparent}html.theme--documenter-dark .navbar-tabs{-webkit-overflow-scrolling:touch;max-width:100vw;overflow-x:auto;overflow-y:hidden}html.theme--documenter-dark .navbar-burger{color:#fff;-moz-appearance:none;-webkit-appearance:none;appearance:none;background:none;border:none;cursor:pointer;display:block;height:4rem;position:relative;width:4rem;margin-left:auto}html.theme--documenter-dark .navbar-burger span{background-color:currentColor;display:block;height:1px;left:calc(50% - 8px);position:absolute;transform-origin:center;transition-duration:86ms;transition-property:background-color, opacity, transform;transition-timing-function:ease-out;width:16px}html.theme--documenter-dark .navbar-burger span:nth-child(1){top:calc(50% - 6px)}html.theme--documenter-dark .navbar-burger span:nth-child(2){top:calc(50% - 1px)}html.theme--documenter-dark .navbar-burger span:nth-child(3){top:calc(50% + 4px)}html.theme--documenter-dark .navbar-burger:hover{background-color:rgba(0,0,0,0.05)}html.theme--documenter-dark .navbar-burger.is-active span:nth-child(1){transform:translateY(5px) rotate(45deg)}html.theme--documenter-dark .navbar-burger.is-active span:nth-child(2){opacity:0}html.theme--documenter-dark .navbar-burger.is-active span:nth-child(3){transform:translateY(-5px) rotate(-45deg)}html.theme--documenter-dark .navbar-menu{display:none}html.theme--documenter-dark .navbar-item,html.theme--documenter-dark .navbar-link{color:#fff;display:block;line-height:1.5;padding:0.5rem 0.75rem;position:relative}html.theme--documenter-dark .navbar-item .icon:only-child,html.theme--documenter-dark .navbar-link .icon:only-child{margin-left:-0.25rem;margin-right:-0.25rem}html.theme--documenter-dark a.navbar-item,html.theme--documenter-dark .navbar-link{cursor:pointer}html.theme--documenter-dark a.navbar-item:focus,html.theme--documenter-dark a.navbar-item:focus-within,html.theme--documenter-dark a.navbar-item:hover,html.theme--documenter-dark a.navbar-item.is-active,html.theme--documenter-dark .navbar-link:focus,html.theme--documenter-dark .navbar-link:focus-within,html.theme--documenter-dark .navbar-link:hover,html.theme--documenter-dark .navbar-link.is-active{background-color:rgba(0,0,0,0);color:#1abc9c}html.theme--documenter-dark .navbar-item{flex-grow:0;flex-shrink:0}html.theme--documenter-dark .navbar-item img{max-height:1.75rem}html.theme--documenter-dark .navbar-item.has-dropdown{padding:0}html.theme--documenter-dark .navbar-item.is-expanded{flex-grow:1;flex-shrink:1}html.theme--documenter-dark .navbar-item.is-tab{border-bottom:1px solid transparent;min-height:4rem;padding-bottom:calc(0.5rem - 1px)}html.theme--documenter-dark .navbar-item.is-tab:focus,html.theme--documenter-dark .navbar-item.is-tab:hover{background-color:rgba(0,0,0,0);border-bottom-color:#1abc9c}html.theme--documenter-dark .navbar-item.is-tab.is-active{background-color:rgba(0,0,0,0);border-bottom-color:#1abc9c;border-bottom-style:solid;border-bottom-width:3px;color:#1abc9c;padding-bottom:calc(0.5rem - 3px)}html.theme--documenter-dark .navbar-content{flex-grow:1;flex-shrink:1}html.theme--documenter-dark .navbar-link:not(.is-arrowless){padding-right:2.5em}html.theme--documenter-dark .navbar-link:not(.is-arrowless)::after{border-color:#fff;margin-top:-0.375em;right:1.125em}html.theme--documenter-dark .navbar-dropdown{font-size:0.875rem;padding-bottom:0.5rem;padding-top:0.5rem}html.theme--documenter-dark .navbar-dropdown .navbar-item{padding-left:1.5rem;padding-right:1.5rem}html.theme--documenter-dark .navbar-divider{background-color:rgba(0,0,0,0.2);border:none;display:none;height:2px;margin:0.5rem 0}@media screen and (max-width: 1055px){html.theme--documenter-dark .navbar>.container{display:block}html.theme--documenter-dark .navbar-brand .navbar-item,html.theme--documenter-dark .navbar-tabs .navbar-item{align-items:center;display:flex}html.theme--documenter-dark .navbar-link::after{display:none}html.theme--documenter-dark .navbar-menu{background-color:#375a7f;box-shadow:0 8px 16px rgba(10,10,10,0.1);padding:0.5rem 0}html.theme--documenter-dark .navbar-menu.is-active{display:block}html.theme--documenter-dark .navbar.is-fixed-bottom-touch,html.theme--documenter-dark .navbar.is-fixed-top-touch{left:0;position:fixed;right:0;z-index:30}html.theme--documenter-dark .navbar.is-fixed-bottom-touch{bottom:0}html.theme--documenter-dark .navbar.is-fixed-bottom-touch.has-shadow{box-shadow:0 -2px 3px rgba(10,10,10,0.1)}html.theme--documenter-dark .navbar.is-fixed-top-touch{top:0}html.theme--documenter-dark .navbar.is-fixed-top .navbar-menu,html.theme--documenter-dark .navbar.is-fixed-top-touch .navbar-menu{-webkit-overflow-scrolling:touch;max-height:calc(100vh - 4rem);overflow:auto}html.theme--documenter-dark html.has-navbar-fixed-top-touch,html.theme--documenter-dark body.has-navbar-fixed-top-touch{padding-top:4rem}html.theme--documenter-dark html.has-navbar-fixed-bottom-touch,html.theme--documenter-dark body.has-navbar-fixed-bottom-touch{padding-bottom:4rem}}@media screen and (min-width: 1056px){html.theme--documenter-dark .navbar,html.theme--documenter-dark .navbar-menu,html.theme--documenter-dark .navbar-start,html.theme--documenter-dark .navbar-end{align-items:stretch;display:flex}html.theme--documenter-dark .navbar{min-height:4rem}html.theme--documenter-dark .navbar.is-spaced{padding:1rem 2rem}html.theme--documenter-dark .navbar.is-spaced .navbar-start,html.theme--documenter-dark .navbar.is-spaced .navbar-end{align-items:center}html.theme--documenter-dark .navbar.is-spaced a.navbar-item,html.theme--documenter-dark .navbar.is-spaced .navbar-link{border-radius:.4em}html.theme--documenter-dark .navbar.is-transparent a.navbar-item:focus,html.theme--documenter-dark .navbar.is-transparent a.navbar-item:hover,html.theme--documenter-dark .navbar.is-transparent a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-transparent .navbar-link:focus,html.theme--documenter-dark .navbar.is-transparent .navbar-link:hover,html.theme--documenter-dark .navbar.is-transparent .navbar-link.is-active{background-color:transparent !important}html.theme--documenter-dark .navbar.is-transparent .navbar-item.has-dropdown.is-active .navbar-link,html.theme--documenter-dark .navbar.is-transparent .navbar-item.has-dropdown.is-hoverable:focus .navbar-link,html.theme--documenter-dark .navbar.is-transparent .navbar-item.has-dropdown.is-hoverable:focus-within .navbar-link,html.theme--documenter-dark .navbar.is-transparent .navbar-item.has-dropdown.is-hoverable:hover .navbar-link{background-color:transparent !important}html.theme--documenter-dark .navbar.is-transparent .navbar-dropdown a.navbar-item:focus,html.theme--documenter-dark .navbar.is-transparent .navbar-dropdown a.navbar-item:hover{background-color:rgba(0,0,0,0);color:#dbdee0}html.theme--documenter-dark .navbar.is-transparent .navbar-dropdown a.navbar-item.is-active{background-color:rgba(0,0,0,0);color:#1abc9c}html.theme--documenter-dark .navbar-burger{display:none}html.theme--documenter-dark .navbar-item,html.theme--documenter-dark .navbar-link{align-items:center;display:flex}html.theme--documenter-dark .navbar-item.has-dropdown{align-items:stretch}html.theme--documenter-dark .navbar-item.has-dropdown-up .navbar-link::after{transform:rotate(135deg) translate(0.25em, -0.25em)}html.theme--documenter-dark .navbar-item.has-dropdown-up .navbar-dropdown{border-bottom:1px solid rgba(0,0,0,0.2);border-radius:8px 8px 0 0;border-top:none;bottom:100%;box-shadow:0 -8px 8px rgba(10,10,10,0.1);top:auto}html.theme--documenter-dark .navbar-item.is-active .navbar-dropdown,html.theme--documenter-dark .navbar-item.is-hoverable:focus .navbar-dropdown,html.theme--documenter-dark .navbar-item.is-hoverable:focus-within .navbar-dropdown,html.theme--documenter-dark .navbar-item.is-hoverable:hover .navbar-dropdown{display:block}.navbar.is-spaced html.theme--documenter-dark .navbar-item.is-active .navbar-dropdown,html.theme--documenter-dark .navbar-item.is-active .navbar-dropdown.is-boxed,.navbar.is-spaced html.theme--documenter-dark .navbar-item.is-hoverable:focus .navbar-dropdown,html.theme--documenter-dark .navbar-item.is-hoverable:focus .navbar-dropdown.is-boxed,.navbar.is-spaced html.theme--documenter-dark .navbar-item.is-hoverable:focus-within .navbar-dropdown,html.theme--documenter-dark .navbar-item.is-hoverable:focus-within .navbar-dropdown.is-boxed,.navbar.is-spaced html.theme--documenter-dark .navbar-item.is-hoverable:hover .navbar-dropdown,html.theme--documenter-dark .navbar-item.is-hoverable:hover .navbar-dropdown.is-boxed{opacity:1;pointer-events:auto;transform:translateY(0)}html.theme--documenter-dark .navbar-menu{flex-grow:1;flex-shrink:0}html.theme--documenter-dark .navbar-start{justify-content:flex-start;margin-right:auto}html.theme--documenter-dark .navbar-end{justify-content:flex-end;margin-left:auto}html.theme--documenter-dark .navbar-dropdown{background-color:#375a7f;border-bottom-left-radius:8px;border-bottom-right-radius:8px;border-top:1px solid rgba(0,0,0,0.2);box-shadow:0 8px 8px rgba(10,10,10,0.1);display:none;font-size:0.875rem;left:0;min-width:100%;position:absolute;top:100%;z-index:20}html.theme--documenter-dark .navbar-dropdown .navbar-item{padding:0.375rem 1rem;white-space:nowrap}html.theme--documenter-dark .navbar-dropdown a.navbar-item{padding-right:3rem}html.theme--documenter-dark .navbar-dropdown a.navbar-item:focus,html.theme--documenter-dark .navbar-dropdown a.navbar-item:hover{background-color:rgba(0,0,0,0);color:#dbdee0}html.theme--documenter-dark .navbar-dropdown a.navbar-item.is-active{background-color:rgba(0,0,0,0);color:#1abc9c}.navbar.is-spaced html.theme--documenter-dark .navbar-dropdown,html.theme--documenter-dark .navbar-dropdown.is-boxed{border-radius:8px;border-top:none;box-shadow:0 8px 8px rgba(10,10,10,0.1), 0 0 0 1px rgba(10,10,10,0.1);display:block;opacity:0;pointer-events:none;top:calc(100% + (-4px));transform:translateY(-5px);transition-duration:86ms;transition-property:opacity, transform}html.theme--documenter-dark .navbar-dropdown.is-right{left:auto;right:0}html.theme--documenter-dark .navbar-divider{display:block}html.theme--documenter-dark .navbar>.container .navbar-brand,html.theme--documenter-dark .container>.navbar .navbar-brand{margin-left:-.75rem}html.theme--documenter-dark .navbar>.container .navbar-menu,html.theme--documenter-dark .container>.navbar .navbar-menu{margin-right:-.75rem}html.theme--documenter-dark .navbar.is-fixed-bottom-desktop,html.theme--documenter-dark .navbar.is-fixed-top-desktop{left:0;position:fixed;right:0;z-index:30}html.theme--documenter-dark .navbar.is-fixed-bottom-desktop{bottom:0}html.theme--documenter-dark .navbar.is-fixed-bottom-desktop.has-shadow{box-shadow:0 -2px 3px rgba(10,10,10,0.1)}html.theme--documenter-dark .navbar.is-fixed-top-desktop{top:0}html.theme--documenter-dark html.has-navbar-fixed-top-desktop,html.theme--documenter-dark body.has-navbar-fixed-top-desktop{padding-top:4rem}html.theme--documenter-dark html.has-navbar-fixed-bottom-desktop,html.theme--documenter-dark body.has-navbar-fixed-bottom-desktop{padding-bottom:4rem}html.theme--documenter-dark html.has-spaced-navbar-fixed-top,html.theme--documenter-dark body.has-spaced-navbar-fixed-top{padding-top:6rem}html.theme--documenter-dark html.has-spaced-navbar-fixed-bottom,html.theme--documenter-dark body.has-spaced-navbar-fixed-bottom{padding-bottom:6rem}html.theme--documenter-dark a.navbar-item.is-active,html.theme--documenter-dark .navbar-link.is-active{color:#1abc9c}html.theme--documenter-dark a.navbar-item.is-active:not(:focus):not(:hover),html.theme--documenter-dark .navbar-link.is-active:not(:focus):not(:hover){background-color:rgba(0,0,0,0)}html.theme--documenter-dark .navbar-item.has-dropdown:focus .navbar-link,html.theme--documenter-dark .navbar-item.has-dropdown:hover .navbar-link,html.theme--documenter-dark .navbar-item.has-dropdown.is-active .navbar-link{background-color:rgba(0,0,0,0)}}html.theme--documenter-dark .hero.is-fullheight-with-navbar{min-height:calc(100vh - 4rem)}html.theme--documenter-dark .pagination{font-size:1rem;margin:-.25rem}html.theme--documenter-dark .pagination.is-small,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.pagination{font-size:.75rem}html.theme--documenter-dark .pagination.is-medium{font-size:1.25rem}html.theme--documenter-dark .pagination.is-large{font-size:1.5rem}html.theme--documenter-dark .pagination.is-rounded .pagination-previous,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.pagination .pagination-previous,html.theme--documenter-dark .pagination.is-rounded .pagination-next,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.pagination .pagination-next{padding-left:1em;padding-right:1em;border-radius:9999px}html.theme--documenter-dark .pagination.is-rounded .pagination-link,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.pagination .pagination-link{border-radius:9999px}html.theme--documenter-dark .pagination,html.theme--documenter-dark .pagination-list{align-items:center;display:flex;justify-content:center;text-align:center}html.theme--documenter-dark .pagination-previous,html.theme--documenter-dark .pagination-next,html.theme--documenter-dark .pagination-link,html.theme--documenter-dark .pagination-ellipsis{font-size:1em;justify-content:center;margin:.25rem;padding-left:.5em;padding-right:.5em;text-align:center}html.theme--documenter-dark .pagination-previous,html.theme--documenter-dark .pagination-next,html.theme--documenter-dark .pagination-link{border-color:#5e6d6f;color:#1abc9c;min-width:2.5em}html.theme--documenter-dark .pagination-previous:hover,html.theme--documenter-dark .pagination-next:hover,html.theme--documenter-dark .pagination-link:hover{border-color:#8c9b9d;color:#1dd2af}html.theme--documenter-dark .pagination-previous:focus,html.theme--documenter-dark .pagination-next:focus,html.theme--documenter-dark .pagination-link:focus{border-color:#8c9b9d}html.theme--documenter-dark .pagination-previous:active,html.theme--documenter-dark .pagination-next:active,html.theme--documenter-dark .pagination-link:active{box-shadow:inset 0 1px 2px rgba(10,10,10,0.2)}html.theme--documenter-dark .pagination-previous[disabled],html.theme--documenter-dark .pagination-previous.is-disabled,html.theme--documenter-dark .pagination-next[disabled],html.theme--documenter-dark .pagination-next.is-disabled,html.theme--documenter-dark .pagination-link[disabled],html.theme--documenter-dark .pagination-link.is-disabled{background-color:#5e6d6f;border-color:#5e6d6f;box-shadow:none;color:#fff;opacity:0.5}html.theme--documenter-dark .pagination-previous,html.theme--documenter-dark .pagination-next{padding-left:.75em;padding-right:.75em;white-space:nowrap}html.theme--documenter-dark .pagination-link.is-current{background-color:#1abc9c;border-color:#1abc9c;color:#fff}html.theme--documenter-dark .pagination-ellipsis{color:#8c9b9d;pointer-events:none}html.theme--documenter-dark .pagination-list{flex-wrap:wrap}html.theme--documenter-dark .pagination-list li{list-style:none}@media screen and (max-width: 768px){html.theme--documenter-dark .pagination{flex-wrap:wrap}html.theme--documenter-dark .pagination-previous,html.theme--documenter-dark .pagination-next{flex-grow:1;flex-shrink:1}html.theme--documenter-dark .pagination-list li{flex-grow:1;flex-shrink:1}}@media screen and (min-width: 769px),print{html.theme--documenter-dark .pagination-list{flex-grow:1;flex-shrink:1;justify-content:flex-start;order:1}html.theme--documenter-dark .pagination-previous,html.theme--documenter-dark .pagination-next,html.theme--documenter-dark .pagination-link,html.theme--documenter-dark .pagination-ellipsis{margin-bottom:0;margin-top:0}html.theme--documenter-dark .pagination-previous{order:2}html.theme--documenter-dark .pagination-next{order:3}html.theme--documenter-dark .pagination{justify-content:space-between;margin-bottom:0;margin-top:0}html.theme--documenter-dark .pagination.is-centered .pagination-previous{order:1}html.theme--documenter-dark .pagination.is-centered .pagination-list{justify-content:center;order:2}html.theme--documenter-dark .pagination.is-centered .pagination-next{order:3}html.theme--documenter-dark .pagination.is-right .pagination-previous{order:1}html.theme--documenter-dark .pagination.is-right .pagination-next{order:2}html.theme--documenter-dark .pagination.is-right .pagination-list{justify-content:flex-end;order:3}}html.theme--documenter-dark .panel{border-radius:8px;box-shadow:#171717;font-size:1rem}html.theme--documenter-dark .panel:not(:last-child){margin-bottom:1.5rem}html.theme--documenter-dark .panel.is-white .panel-heading{background-color:#fff;color:#0a0a0a}html.theme--documenter-dark .panel.is-white .panel-tabs a.is-active{border-bottom-color:#fff}html.theme--documenter-dark .panel.is-white .panel-block.is-active .panel-icon{color:#fff}html.theme--documenter-dark .panel.is-black .panel-heading{background-color:#0a0a0a;color:#fff}html.theme--documenter-dark .panel.is-black .panel-tabs a.is-active{border-bottom-color:#0a0a0a}html.theme--documenter-dark .panel.is-black .panel-block.is-active .panel-icon{color:#0a0a0a}html.theme--documenter-dark .panel.is-light .panel-heading{background-color:#ecf0f1;color:rgba(0,0,0,0.7)}html.theme--documenter-dark .panel.is-light .panel-tabs a.is-active{border-bottom-color:#ecf0f1}html.theme--documenter-dark .panel.is-light .panel-block.is-active .panel-icon{color:#ecf0f1}html.theme--documenter-dark .panel.is-dark .panel-heading,html.theme--documenter-dark .content kbd.panel .panel-heading{background-color:#282f2f;color:#fff}html.theme--documenter-dark .panel.is-dark .panel-tabs a.is-active,html.theme--documenter-dark .content kbd.panel .panel-tabs a.is-active{border-bottom-color:#282f2f}html.theme--documenter-dark .panel.is-dark .panel-block.is-active .panel-icon,html.theme--documenter-dark .content kbd.panel .panel-block.is-active .panel-icon{color:#282f2f}html.theme--documenter-dark .panel.is-primary .panel-heading,html.theme--documenter-dark .docstring>section>a.panel.docs-sourcelink .panel-heading{background-color:#375a7f;color:#fff}html.theme--documenter-dark .panel.is-primary .panel-tabs a.is-active,html.theme--documenter-dark .docstring>section>a.panel.docs-sourcelink .panel-tabs a.is-active{border-bottom-color:#375a7f}html.theme--documenter-dark .panel.is-primary .panel-block.is-active .panel-icon,html.theme--documenter-dark .docstring>section>a.panel.docs-sourcelink .panel-block.is-active .panel-icon{color:#375a7f}html.theme--documenter-dark .panel.is-link .panel-heading{background-color:#1abc9c;color:#fff}html.theme--documenter-dark .panel.is-link .panel-tabs a.is-active{border-bottom-color:#1abc9c}html.theme--documenter-dark .panel.is-link .panel-block.is-active .panel-icon{color:#1abc9c}html.theme--documenter-dark .panel.is-info .panel-heading{background-color:#024c7d;color:#fff}html.theme--documenter-dark .panel.is-info .panel-tabs a.is-active{border-bottom-color:#024c7d}html.theme--documenter-dark .panel.is-info .panel-block.is-active .panel-icon{color:#024c7d}html.theme--documenter-dark .panel.is-success .panel-heading{background-color:#008438;color:#fff}html.theme--documenter-dark .panel.is-success .panel-tabs a.is-active{border-bottom-color:#008438}html.theme--documenter-dark .panel.is-success .panel-block.is-active .panel-icon{color:#008438}html.theme--documenter-dark .panel.is-warning .panel-heading{background-color:#ad8100;color:#fff}html.theme--documenter-dark .panel.is-warning .panel-tabs a.is-active{border-bottom-color:#ad8100}html.theme--documenter-dark .panel.is-warning .panel-block.is-active .panel-icon{color:#ad8100}html.theme--documenter-dark .panel.is-danger .panel-heading{background-color:#9e1b0d;color:#fff}html.theme--documenter-dark .panel.is-danger .panel-tabs a.is-active{border-bottom-color:#9e1b0d}html.theme--documenter-dark .panel.is-danger .panel-block.is-active .panel-icon{color:#9e1b0d}html.theme--documenter-dark .panel-tabs:not(:last-child),html.theme--documenter-dark .panel-block:not(:last-child){border-bottom:1px solid #ededed}html.theme--documenter-dark .panel-heading{background-color:#343c3d;border-radius:8px 8px 0 0;color:#f2f2f2;font-size:1.25em;font-weight:700;line-height:1.25;padding:0.75em 1em}html.theme--documenter-dark .panel-tabs{align-items:flex-end;display:flex;font-size:.875em;justify-content:center}html.theme--documenter-dark .panel-tabs a{border-bottom:1px solid #5e6d6f;margin-bottom:-1px;padding:0.5em}html.theme--documenter-dark .panel-tabs a.is-active{border-bottom-color:#343c3d;color:#17a689}html.theme--documenter-dark .panel-list a{color:#fff}html.theme--documenter-dark .panel-list a:hover{color:#1abc9c}html.theme--documenter-dark .panel-block{align-items:center;color:#f2f2f2;display:flex;justify-content:flex-start;padding:0.5em 0.75em}html.theme--documenter-dark .panel-block input[type="checkbox"]{margin-right:.75em}html.theme--documenter-dark .panel-block>.control{flex-grow:1;flex-shrink:1;width:100%}html.theme--documenter-dark .panel-block.is-wrapped{flex-wrap:wrap}html.theme--documenter-dark .panel-block.is-active{border-left-color:#1abc9c;color:#17a689}html.theme--documenter-dark .panel-block.is-active .panel-icon{color:#1abc9c}html.theme--documenter-dark .panel-block:last-child{border-bottom-left-radius:8px;border-bottom-right-radius:8px}html.theme--documenter-dark a.panel-block,html.theme--documenter-dark label.panel-block{cursor:pointer}html.theme--documenter-dark a.panel-block:hover,html.theme--documenter-dark label.panel-block:hover{background-color:#282f2f}html.theme--documenter-dark .panel-icon{display:inline-block;font-size:14px;height:1em;line-height:1em;text-align:center;vertical-align:top;width:1em;color:#fff;margin-right:.75em}html.theme--documenter-dark .panel-icon .fa{font-size:inherit;line-height:inherit}html.theme--documenter-dark .tabs{-webkit-overflow-scrolling:touch;align-items:stretch;display:flex;font-size:1rem;justify-content:space-between;overflow:hidden;overflow-x:auto;white-space:nowrap}html.theme--documenter-dark .tabs a{align-items:center;border-bottom-color:#5e6d6f;border-bottom-style:solid;border-bottom-width:1px;color:#fff;display:flex;justify-content:center;margin-bottom:-1px;padding:0.5em 1em;vertical-align:top}html.theme--documenter-dark .tabs a:hover{border-bottom-color:#f2f2f2;color:#f2f2f2}html.theme--documenter-dark .tabs li{display:block}html.theme--documenter-dark .tabs li.is-active a{border-bottom-color:#1abc9c;color:#1abc9c}html.theme--documenter-dark .tabs ul{align-items:center;border-bottom-color:#5e6d6f;border-bottom-style:solid;border-bottom-width:1px;display:flex;flex-grow:1;flex-shrink:0;justify-content:flex-start}html.theme--documenter-dark .tabs ul.is-left{padding-right:0.75em}html.theme--documenter-dark .tabs ul.is-center{flex:none;justify-content:center;padding-left:0.75em;padding-right:0.75em}html.theme--documenter-dark .tabs ul.is-right{justify-content:flex-end;padding-left:0.75em}html.theme--documenter-dark .tabs .icon:first-child{margin-right:.5em}html.theme--documenter-dark .tabs .icon:last-child{margin-left:.5em}html.theme--documenter-dark .tabs.is-centered ul{justify-content:center}html.theme--documenter-dark .tabs.is-right ul{justify-content:flex-end}html.theme--documenter-dark .tabs.is-boxed a{border:1px solid transparent;border-radius:.4em .4em 0 0}html.theme--documenter-dark .tabs.is-boxed a:hover{background-color:#282f2f;border-bottom-color:#5e6d6f}html.theme--documenter-dark .tabs.is-boxed li.is-active a{background-color:#fff;border-color:#5e6d6f;border-bottom-color:rgba(0,0,0,0) !important}html.theme--documenter-dark .tabs.is-fullwidth li{flex-grow:1;flex-shrink:0}html.theme--documenter-dark .tabs.is-toggle a{border-color:#5e6d6f;border-style:solid;border-width:1px;margin-bottom:0;position:relative}html.theme--documenter-dark .tabs.is-toggle a:hover{background-color:#282f2f;border-color:#8c9b9d;z-index:2}html.theme--documenter-dark .tabs.is-toggle li+li{margin-left:-1px}html.theme--documenter-dark .tabs.is-toggle li:first-child a{border-top-left-radius:.4em;border-bottom-left-radius:.4em}html.theme--documenter-dark .tabs.is-toggle li:last-child a{border-top-right-radius:.4em;border-bottom-right-radius:.4em}html.theme--documenter-dark .tabs.is-toggle li.is-active a{background-color:#1abc9c;border-color:#1abc9c;color:#fff;z-index:1}html.theme--documenter-dark .tabs.is-toggle ul{border-bottom:none}html.theme--documenter-dark .tabs.is-toggle.is-toggle-rounded li:first-child a{border-bottom-left-radius:9999px;border-top-left-radius:9999px;padding-left:1.25em}html.theme--documenter-dark .tabs.is-toggle.is-toggle-rounded li:last-child a{border-bottom-right-radius:9999px;border-top-right-radius:9999px;padding-right:1.25em}html.theme--documenter-dark .tabs.is-small,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.tabs{font-size:.75rem}html.theme--documenter-dark .tabs.is-medium{font-size:1.25rem}html.theme--documenter-dark .tabs.is-large{font-size:1.5rem}html.theme--documenter-dark .column{display:block;flex-basis:0;flex-grow:1;flex-shrink:1;padding:.75rem}.columns.is-mobile>html.theme--documenter-dark .column.is-narrow{flex:none;width:unset}.columns.is-mobile>html.theme--documenter-dark .column.is-full{flex:none;width:100%}.columns.is-mobile>html.theme--documenter-dark .column.is-three-quarters{flex:none;width:75%}.columns.is-mobile>html.theme--documenter-dark .column.is-two-thirds{flex:none;width:66.6666%}.columns.is-mobile>html.theme--documenter-dark .column.is-half{flex:none;width:50%}.columns.is-mobile>html.theme--documenter-dark .column.is-one-third{flex:none;width:33.3333%}.columns.is-mobile>html.theme--documenter-dark .column.is-one-quarter{flex:none;width:25%}.columns.is-mobile>html.theme--documenter-dark .column.is-one-fifth{flex:none;width:20%}.columns.is-mobile>html.theme--documenter-dark .column.is-two-fifths{flex:none;width:40%}.columns.is-mobile>html.theme--documenter-dark .column.is-three-fifths{flex:none;width:60%}.columns.is-mobile>html.theme--documenter-dark .column.is-four-fifths{flex:none;width:80%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-three-quarters{margin-left:75%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-two-thirds{margin-left:66.6666%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-half{margin-left:50%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-one-third{margin-left:33.3333%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-one-quarter{margin-left:25%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-one-fifth{margin-left:20%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-two-fifths{margin-left:40%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-three-fifths{margin-left:60%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-four-fifths{margin-left:80%}.columns.is-mobile>html.theme--documenter-dark .column.is-0{flex:none;width:0%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-0{margin-left:0%}.columns.is-mobile>html.theme--documenter-dark .column.is-1{flex:none;width:8.33333337%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-1{margin-left:8.33333337%}.columns.is-mobile>html.theme--documenter-dark .column.is-2{flex:none;width:16.66666674%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-2{margin-left:16.66666674%}.columns.is-mobile>html.theme--documenter-dark .column.is-3{flex:none;width:25%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-3{margin-left:25%}.columns.is-mobile>html.theme--documenter-dark .column.is-4{flex:none;width:33.33333337%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-4{margin-left:33.33333337%}.columns.is-mobile>html.theme--documenter-dark .column.is-5{flex:none;width:41.66666674%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-5{margin-left:41.66666674%}.columns.is-mobile>html.theme--documenter-dark .column.is-6{flex:none;width:50%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-6{margin-left:50%}.columns.is-mobile>html.theme--documenter-dark .column.is-7{flex:none;width:58.33333337%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-7{margin-left:58.33333337%}.columns.is-mobile>html.theme--documenter-dark .column.is-8{flex:none;width:66.66666674%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-8{margin-left:66.66666674%}.columns.is-mobile>html.theme--documenter-dark .column.is-9{flex:none;width:75%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-9{margin-left:75%}.columns.is-mobile>html.theme--documenter-dark .column.is-10{flex:none;width:83.33333337%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-10{margin-left:83.33333337%}.columns.is-mobile>html.theme--documenter-dark .column.is-11{flex:none;width:91.66666674%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-11{margin-left:91.66666674%}.columns.is-mobile>html.theme--documenter-dark .column.is-12{flex:none;width:100%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-12{margin-left:100%}@media screen and (max-width: 768px){html.theme--documenter-dark .column.is-narrow-mobile{flex:none;width:unset}html.theme--documenter-dark .column.is-full-mobile{flex:none;width:100%}html.theme--documenter-dark .column.is-three-quarters-mobile{flex:none;width:75%}html.theme--documenter-dark .column.is-two-thirds-mobile{flex:none;width:66.6666%}html.theme--documenter-dark .column.is-half-mobile{flex:none;width:50%}html.theme--documenter-dark .column.is-one-third-mobile{flex:none;width:33.3333%}html.theme--documenter-dark .column.is-one-quarter-mobile{flex:none;width:25%}html.theme--documenter-dark .column.is-one-fifth-mobile{flex:none;width:20%}html.theme--documenter-dark .column.is-two-fifths-mobile{flex:none;width:40%}html.theme--documenter-dark .column.is-three-fifths-mobile{flex:none;width:60%}html.theme--documenter-dark .column.is-four-fifths-mobile{flex:none;width:80%}html.theme--documenter-dark .column.is-offset-three-quarters-mobile{margin-left:75%}html.theme--documenter-dark .column.is-offset-two-thirds-mobile{margin-left:66.6666%}html.theme--documenter-dark .column.is-offset-half-mobile{margin-left:50%}html.theme--documenter-dark .column.is-offset-one-third-mobile{margin-left:33.3333%}html.theme--documenter-dark .column.is-offset-one-quarter-mobile{margin-left:25%}html.theme--documenter-dark .column.is-offset-one-fifth-mobile{margin-left:20%}html.theme--documenter-dark .column.is-offset-two-fifths-mobile{margin-left:40%}html.theme--documenter-dark .column.is-offset-three-fifths-mobile{margin-left:60%}html.theme--documenter-dark .column.is-offset-four-fifths-mobile{margin-left:80%}html.theme--documenter-dark .column.is-0-mobile{flex:none;width:0%}html.theme--documenter-dark .column.is-offset-0-mobile{margin-left:0%}html.theme--documenter-dark .column.is-1-mobile{flex:none;width:8.33333337%}html.theme--documenter-dark .column.is-offset-1-mobile{margin-left:8.33333337%}html.theme--documenter-dark .column.is-2-mobile{flex:none;width:16.66666674%}html.theme--documenter-dark .column.is-offset-2-mobile{margin-left:16.66666674%}html.theme--documenter-dark .column.is-3-mobile{flex:none;width:25%}html.theme--documenter-dark .column.is-offset-3-mobile{margin-left:25%}html.theme--documenter-dark .column.is-4-mobile{flex:none;width:33.33333337%}html.theme--documenter-dark .column.is-offset-4-mobile{margin-left:33.33333337%}html.theme--documenter-dark .column.is-5-mobile{flex:none;width:41.66666674%}html.theme--documenter-dark .column.is-offset-5-mobile{margin-left:41.66666674%}html.theme--documenter-dark .column.is-6-mobile{flex:none;width:50%}html.theme--documenter-dark .column.is-offset-6-mobile{margin-left:50%}html.theme--documenter-dark .column.is-7-mobile{flex:none;width:58.33333337%}html.theme--documenter-dark .column.is-offset-7-mobile{margin-left:58.33333337%}html.theme--documenter-dark .column.is-8-mobile{flex:none;width:66.66666674%}html.theme--documenter-dark .column.is-offset-8-mobile{margin-left:66.66666674%}html.theme--documenter-dark .column.is-9-mobile{flex:none;width:75%}html.theme--documenter-dark .column.is-offset-9-mobile{margin-left:75%}html.theme--documenter-dark .column.is-10-mobile{flex:none;width:83.33333337%}html.theme--documenter-dark .column.is-offset-10-mobile{margin-left:83.33333337%}html.theme--documenter-dark .column.is-11-mobile{flex:none;width:91.66666674%}html.theme--documenter-dark .column.is-offset-11-mobile{margin-left:91.66666674%}html.theme--documenter-dark .column.is-12-mobile{flex:none;width:100%}html.theme--documenter-dark .column.is-offset-12-mobile{margin-left:100%}}@media screen and (min-width: 769px),print{html.theme--documenter-dark .column.is-narrow,html.theme--documenter-dark .column.is-narrow-tablet{flex:none;width:unset}html.theme--documenter-dark .column.is-full,html.theme--documenter-dark .column.is-full-tablet{flex:none;width:100%}html.theme--documenter-dark .column.is-three-quarters,html.theme--documenter-dark .column.is-three-quarters-tablet{flex:none;width:75%}html.theme--documenter-dark .column.is-two-thirds,html.theme--documenter-dark .column.is-two-thirds-tablet{flex:none;width:66.6666%}html.theme--documenter-dark .column.is-half,html.theme--documenter-dark .column.is-half-tablet{flex:none;width:50%}html.theme--documenter-dark .column.is-one-third,html.theme--documenter-dark .column.is-one-third-tablet{flex:none;width:33.3333%}html.theme--documenter-dark .column.is-one-quarter,html.theme--documenter-dark .column.is-one-quarter-tablet{flex:none;width:25%}html.theme--documenter-dark .column.is-one-fifth,html.theme--documenter-dark .column.is-one-fifth-tablet{flex:none;width:20%}html.theme--documenter-dark .column.is-two-fifths,html.theme--documenter-dark .column.is-two-fifths-tablet{flex:none;width:40%}html.theme--documenter-dark .column.is-three-fifths,html.theme--documenter-dark .column.is-three-fifths-tablet{flex:none;width:60%}html.theme--documenter-dark .column.is-four-fifths,html.theme--documenter-dark .column.is-four-fifths-tablet{flex:none;width:80%}html.theme--documenter-dark .column.is-offset-three-quarters,html.theme--documenter-dark .column.is-offset-three-quarters-tablet{margin-left:75%}html.theme--documenter-dark .column.is-offset-two-thirds,html.theme--documenter-dark .column.is-offset-two-thirds-tablet{margin-left:66.6666%}html.theme--documenter-dark .column.is-offset-half,html.theme--documenter-dark .column.is-offset-half-tablet{margin-left:50%}html.theme--documenter-dark .column.is-offset-one-third,html.theme--documenter-dark .column.is-offset-one-third-tablet{margin-left:33.3333%}html.theme--documenter-dark .column.is-offset-one-quarter,html.theme--documenter-dark .column.is-offset-one-quarter-tablet{margin-left:25%}html.theme--documenter-dark .column.is-offset-one-fifth,html.theme--documenter-dark .column.is-offset-one-fifth-tablet{margin-left:20%}html.theme--documenter-dark .column.is-offset-two-fifths,html.theme--documenter-dark .column.is-offset-two-fifths-tablet{margin-left:40%}html.theme--documenter-dark .column.is-offset-three-fifths,html.theme--documenter-dark .column.is-offset-three-fifths-tablet{margin-left:60%}html.theme--documenter-dark .column.is-offset-four-fifths,html.theme--documenter-dark .column.is-offset-four-fifths-tablet{margin-left:80%}html.theme--documenter-dark .column.is-0,html.theme--documenter-dark .column.is-0-tablet{flex:none;width:0%}html.theme--documenter-dark .column.is-offset-0,html.theme--documenter-dark .column.is-offset-0-tablet{margin-left:0%}html.theme--documenter-dark .column.is-1,html.theme--documenter-dark .column.is-1-tablet{flex:none;width:8.33333337%}html.theme--documenter-dark .column.is-offset-1,html.theme--documenter-dark .column.is-offset-1-tablet{margin-left:8.33333337%}html.theme--documenter-dark .column.is-2,html.theme--documenter-dark .column.is-2-tablet{flex:none;width:16.66666674%}html.theme--documenter-dark .column.is-offset-2,html.theme--documenter-dark .column.is-offset-2-tablet{margin-left:16.66666674%}html.theme--documenter-dark .column.is-3,html.theme--documenter-dark .column.is-3-tablet{flex:none;width:25%}html.theme--documenter-dark .column.is-offset-3,html.theme--documenter-dark .column.is-offset-3-tablet{margin-left:25%}html.theme--documenter-dark .column.is-4,html.theme--documenter-dark .column.is-4-tablet{flex:none;width:33.33333337%}html.theme--documenter-dark .column.is-offset-4,html.theme--documenter-dark .column.is-offset-4-tablet{margin-left:33.33333337%}html.theme--documenter-dark .column.is-5,html.theme--documenter-dark .column.is-5-tablet{flex:none;width:41.66666674%}html.theme--documenter-dark .column.is-offset-5,html.theme--documenter-dark .column.is-offset-5-tablet{margin-left:41.66666674%}html.theme--documenter-dark .column.is-6,html.theme--documenter-dark .column.is-6-tablet{flex:none;width:50%}html.theme--documenter-dark .column.is-offset-6,html.theme--documenter-dark .column.is-offset-6-tablet{margin-left:50%}html.theme--documenter-dark .column.is-7,html.theme--documenter-dark .column.is-7-tablet{flex:none;width:58.33333337%}html.theme--documenter-dark .column.is-offset-7,html.theme--documenter-dark .column.is-offset-7-tablet{margin-left:58.33333337%}html.theme--documenter-dark .column.is-8,html.theme--documenter-dark .column.is-8-tablet{flex:none;width:66.66666674%}html.theme--documenter-dark .column.is-offset-8,html.theme--documenter-dark .column.is-offset-8-tablet{margin-left:66.66666674%}html.theme--documenter-dark .column.is-9,html.theme--documenter-dark .column.is-9-tablet{flex:none;width:75%}html.theme--documenter-dark .column.is-offset-9,html.theme--documenter-dark .column.is-offset-9-tablet{margin-left:75%}html.theme--documenter-dark .column.is-10,html.theme--documenter-dark .column.is-10-tablet{flex:none;width:83.33333337%}html.theme--documenter-dark .column.is-offset-10,html.theme--documenter-dark .column.is-offset-10-tablet{margin-left:83.33333337%}html.theme--documenter-dark .column.is-11,html.theme--documenter-dark .column.is-11-tablet{flex:none;width:91.66666674%}html.theme--documenter-dark .column.is-offset-11,html.theme--documenter-dark .column.is-offset-11-tablet{margin-left:91.66666674%}html.theme--documenter-dark .column.is-12,html.theme--documenter-dark .column.is-12-tablet{flex:none;width:100%}html.theme--documenter-dark .column.is-offset-12,html.theme--documenter-dark .column.is-offset-12-tablet{margin-left:100%}}@media screen and (max-width: 1055px){html.theme--documenter-dark .column.is-narrow-touch{flex:none;width:unset}html.theme--documenter-dark .column.is-full-touch{flex:none;width:100%}html.theme--documenter-dark .column.is-three-quarters-touch{flex:none;width:75%}html.theme--documenter-dark .column.is-two-thirds-touch{flex:none;width:66.6666%}html.theme--documenter-dark .column.is-half-touch{flex:none;width:50%}html.theme--documenter-dark .column.is-one-third-touch{flex:none;width:33.3333%}html.theme--documenter-dark .column.is-one-quarter-touch{flex:none;width:25%}html.theme--documenter-dark .column.is-one-fifth-touch{flex:none;width:20%}html.theme--documenter-dark .column.is-two-fifths-touch{flex:none;width:40%}html.theme--documenter-dark .column.is-three-fifths-touch{flex:none;width:60%}html.theme--documenter-dark .column.is-four-fifths-touch{flex:none;width:80%}html.theme--documenter-dark .column.is-offset-three-quarters-touch{margin-left:75%}html.theme--documenter-dark .column.is-offset-two-thirds-touch{margin-left:66.6666%}html.theme--documenter-dark .column.is-offset-half-touch{margin-left:50%}html.theme--documenter-dark .column.is-offset-one-third-touch{margin-left:33.3333%}html.theme--documenter-dark .column.is-offset-one-quarter-touch{margin-left:25%}html.theme--documenter-dark .column.is-offset-one-fifth-touch{margin-left:20%}html.theme--documenter-dark .column.is-offset-two-fifths-touch{margin-left:40%}html.theme--documenter-dark .column.is-offset-three-fifths-touch{margin-left:60%}html.theme--documenter-dark .column.is-offset-four-fifths-touch{margin-left:80%}html.theme--documenter-dark .column.is-0-touch{flex:none;width:0%}html.theme--documenter-dark .column.is-offset-0-touch{margin-left:0%}html.theme--documenter-dark .column.is-1-touch{flex:none;width:8.33333337%}html.theme--documenter-dark .column.is-offset-1-touch{margin-left:8.33333337%}html.theme--documenter-dark .column.is-2-touch{flex:none;width:16.66666674%}html.theme--documenter-dark .column.is-offset-2-touch{margin-left:16.66666674%}html.theme--documenter-dark .column.is-3-touch{flex:none;width:25%}html.theme--documenter-dark .column.is-offset-3-touch{margin-left:25%}html.theme--documenter-dark .column.is-4-touch{flex:none;width:33.33333337%}html.theme--documenter-dark .column.is-offset-4-touch{margin-left:33.33333337%}html.theme--documenter-dark .column.is-5-touch{flex:none;width:41.66666674%}html.theme--documenter-dark .column.is-offset-5-touch{margin-left:41.66666674%}html.theme--documenter-dark .column.is-6-touch{flex:none;width:50%}html.theme--documenter-dark .column.is-offset-6-touch{margin-left:50%}html.theme--documenter-dark .column.is-7-touch{flex:none;width:58.33333337%}html.theme--documenter-dark .column.is-offset-7-touch{margin-left:58.33333337%}html.theme--documenter-dark .column.is-8-touch{flex:none;width:66.66666674%}html.theme--documenter-dark .column.is-offset-8-touch{margin-left:66.66666674%}html.theme--documenter-dark .column.is-9-touch{flex:none;width:75%}html.theme--documenter-dark .column.is-offset-9-touch{margin-left:75%}html.theme--documenter-dark .column.is-10-touch{flex:none;width:83.33333337%}html.theme--documenter-dark .column.is-offset-10-touch{margin-left:83.33333337%}html.theme--documenter-dark .column.is-11-touch{flex:none;width:91.66666674%}html.theme--documenter-dark .column.is-offset-11-touch{margin-left:91.66666674%}html.theme--documenter-dark .column.is-12-touch{flex:none;width:100%}html.theme--documenter-dark .column.is-offset-12-touch{margin-left:100%}}@media screen and (min-width: 1056px){html.theme--documenter-dark .column.is-narrow-desktop{flex:none;width:unset}html.theme--documenter-dark .column.is-full-desktop{flex:none;width:100%}html.theme--documenter-dark .column.is-three-quarters-desktop{flex:none;width:75%}html.theme--documenter-dark .column.is-two-thirds-desktop{flex:none;width:66.6666%}html.theme--documenter-dark .column.is-half-desktop{flex:none;width:50%}html.theme--documenter-dark .column.is-one-third-desktop{flex:none;width:33.3333%}html.theme--documenter-dark .column.is-one-quarter-desktop{flex:none;width:25%}html.theme--documenter-dark .column.is-one-fifth-desktop{flex:none;width:20%}html.theme--documenter-dark .column.is-two-fifths-desktop{flex:none;width:40%}html.theme--documenter-dark .column.is-three-fifths-desktop{flex:none;width:60%}html.theme--documenter-dark .column.is-four-fifths-desktop{flex:none;width:80%}html.theme--documenter-dark .column.is-offset-three-quarters-desktop{margin-left:75%}html.theme--documenter-dark .column.is-offset-two-thirds-desktop{margin-left:66.6666%}html.theme--documenter-dark .column.is-offset-half-desktop{margin-left:50%}html.theme--documenter-dark .column.is-offset-one-third-desktop{margin-left:33.3333%}html.theme--documenter-dark .column.is-offset-one-quarter-desktop{margin-left:25%}html.theme--documenter-dark .column.is-offset-one-fifth-desktop{margin-left:20%}html.theme--documenter-dark .column.is-offset-two-fifths-desktop{margin-left:40%}html.theme--documenter-dark .column.is-offset-three-fifths-desktop{margin-left:60%}html.theme--documenter-dark .column.is-offset-four-fifths-desktop{margin-left:80%}html.theme--documenter-dark .column.is-0-desktop{flex:none;width:0%}html.theme--documenter-dark .column.is-offset-0-desktop{margin-left:0%}html.theme--documenter-dark .column.is-1-desktop{flex:none;width:8.33333337%}html.theme--documenter-dark .column.is-offset-1-desktop{margin-left:8.33333337%}html.theme--documenter-dark .column.is-2-desktop{flex:none;width:16.66666674%}html.theme--documenter-dark .column.is-offset-2-desktop{margin-left:16.66666674%}html.theme--documenter-dark .column.is-3-desktop{flex:none;width:25%}html.theme--documenter-dark .column.is-offset-3-desktop{margin-left:25%}html.theme--documenter-dark .column.is-4-desktop{flex:none;width:33.33333337%}html.theme--documenter-dark .column.is-offset-4-desktop{margin-left:33.33333337%}html.theme--documenter-dark .column.is-5-desktop{flex:none;width:41.66666674%}html.theme--documenter-dark .column.is-offset-5-desktop{margin-left:41.66666674%}html.theme--documenter-dark .column.is-6-desktop{flex:none;width:50%}html.theme--documenter-dark .column.is-offset-6-desktop{margin-left:50%}html.theme--documenter-dark .column.is-7-desktop{flex:none;width:58.33333337%}html.theme--documenter-dark .column.is-offset-7-desktop{margin-left:58.33333337%}html.theme--documenter-dark .column.is-8-desktop{flex:none;width:66.66666674%}html.theme--documenter-dark .column.is-offset-8-desktop{margin-left:66.66666674%}html.theme--documenter-dark .column.is-9-desktop{flex:none;width:75%}html.theme--documenter-dark .column.is-offset-9-desktop{margin-left:75%}html.theme--documenter-dark .column.is-10-desktop{flex:none;width:83.33333337%}html.theme--documenter-dark .column.is-offset-10-desktop{margin-left:83.33333337%}html.theme--documenter-dark .column.is-11-desktop{flex:none;width:91.66666674%}html.theme--documenter-dark .column.is-offset-11-desktop{margin-left:91.66666674%}html.theme--documenter-dark .column.is-12-desktop{flex:none;width:100%}html.theme--documenter-dark .column.is-offset-12-desktop{margin-left:100%}}@media screen and (min-width: 1216px){html.theme--documenter-dark .column.is-narrow-widescreen{flex:none;width:unset}html.theme--documenter-dark .column.is-full-widescreen{flex:none;width:100%}html.theme--documenter-dark .column.is-three-quarters-widescreen{flex:none;width:75%}html.theme--documenter-dark .column.is-two-thirds-widescreen{flex:none;width:66.6666%}html.theme--documenter-dark .column.is-half-widescreen{flex:none;width:50%}html.theme--documenter-dark .column.is-one-third-widescreen{flex:none;width:33.3333%}html.theme--documenter-dark .column.is-one-quarter-widescreen{flex:none;width:25%}html.theme--documenter-dark .column.is-one-fifth-widescreen{flex:none;width:20%}html.theme--documenter-dark .column.is-two-fifths-widescreen{flex:none;width:40%}html.theme--documenter-dark .column.is-three-fifths-widescreen{flex:none;width:60%}html.theme--documenter-dark .column.is-four-fifths-widescreen{flex:none;width:80%}html.theme--documenter-dark .column.is-offset-three-quarters-widescreen{margin-left:75%}html.theme--documenter-dark .column.is-offset-two-thirds-widescreen{margin-left:66.6666%}html.theme--documenter-dark .column.is-offset-half-widescreen{margin-left:50%}html.theme--documenter-dark .column.is-offset-one-third-widescreen{margin-left:33.3333%}html.theme--documenter-dark .column.is-offset-one-quarter-widescreen{margin-left:25%}html.theme--documenter-dark .column.is-offset-one-fifth-widescreen{margin-left:20%}html.theme--documenter-dark .column.is-offset-two-fifths-widescreen{margin-left:40%}html.theme--documenter-dark .column.is-offset-three-fifths-widescreen{margin-left:60%}html.theme--documenter-dark .column.is-offset-four-fifths-widescreen{margin-left:80%}html.theme--documenter-dark .column.is-0-widescreen{flex:none;width:0%}html.theme--documenter-dark .column.is-offset-0-widescreen{margin-left:0%}html.theme--documenter-dark .column.is-1-widescreen{flex:none;width:8.33333337%}html.theme--documenter-dark .column.is-offset-1-widescreen{margin-left:8.33333337%}html.theme--documenter-dark .column.is-2-widescreen{flex:none;width:16.66666674%}html.theme--documenter-dark .column.is-offset-2-widescreen{margin-left:16.66666674%}html.theme--documenter-dark .column.is-3-widescreen{flex:none;width:25%}html.theme--documenter-dark .column.is-offset-3-widescreen{margin-left:25%}html.theme--documenter-dark .column.is-4-widescreen{flex:none;width:33.33333337%}html.theme--documenter-dark .column.is-offset-4-widescreen{margin-left:33.33333337%}html.theme--documenter-dark .column.is-5-widescreen{flex:none;width:41.66666674%}html.theme--documenter-dark .column.is-offset-5-widescreen{margin-left:41.66666674%}html.theme--documenter-dark .column.is-6-widescreen{flex:none;width:50%}html.theme--documenter-dark .column.is-offset-6-widescreen{margin-left:50%}html.theme--documenter-dark .column.is-7-widescreen{flex:none;width:58.33333337%}html.theme--documenter-dark .column.is-offset-7-widescreen{margin-left:58.33333337%}html.theme--documenter-dark .column.is-8-widescreen{flex:none;width:66.66666674%}html.theme--documenter-dark .column.is-offset-8-widescreen{margin-left:66.66666674%}html.theme--documenter-dark .column.is-9-widescreen{flex:none;width:75%}html.theme--documenter-dark .column.is-offset-9-widescreen{margin-left:75%}html.theme--documenter-dark .column.is-10-widescreen{flex:none;width:83.33333337%}html.theme--documenter-dark .column.is-offset-10-widescreen{margin-left:83.33333337%}html.theme--documenter-dark .column.is-11-widescreen{flex:none;width:91.66666674%}html.theme--documenter-dark .column.is-offset-11-widescreen{margin-left:91.66666674%}html.theme--documenter-dark .column.is-12-widescreen{flex:none;width:100%}html.theme--documenter-dark .column.is-offset-12-widescreen{margin-left:100%}}@media screen and (min-width: 1408px){html.theme--documenter-dark .column.is-narrow-fullhd{flex:none;width:unset}html.theme--documenter-dark .column.is-full-fullhd{flex:none;width:100%}html.theme--documenter-dark .column.is-three-quarters-fullhd{flex:none;width:75%}html.theme--documenter-dark .column.is-two-thirds-fullhd{flex:none;width:66.6666%}html.theme--documenter-dark .column.is-half-fullhd{flex:none;width:50%}html.theme--documenter-dark .column.is-one-third-fullhd{flex:none;width:33.3333%}html.theme--documenter-dark .column.is-one-quarter-fullhd{flex:none;width:25%}html.theme--documenter-dark .column.is-one-fifth-fullhd{flex:none;width:20%}html.theme--documenter-dark .column.is-two-fifths-fullhd{flex:none;width:40%}html.theme--documenter-dark .column.is-three-fifths-fullhd{flex:none;width:60%}html.theme--documenter-dark .column.is-four-fifths-fullhd{flex:none;width:80%}html.theme--documenter-dark .column.is-offset-three-quarters-fullhd{margin-left:75%}html.theme--documenter-dark .column.is-offset-two-thirds-fullhd{margin-left:66.6666%}html.theme--documenter-dark .column.is-offset-half-fullhd{margin-left:50%}html.theme--documenter-dark .column.is-offset-one-third-fullhd{margin-left:33.3333%}html.theme--documenter-dark .column.is-offset-one-quarter-fullhd{margin-left:25%}html.theme--documenter-dark .column.is-offset-one-fifth-fullhd{margin-left:20%}html.theme--documenter-dark .column.is-offset-two-fifths-fullhd{margin-left:40%}html.theme--documenter-dark .column.is-offset-three-fifths-fullhd{margin-left:60%}html.theme--documenter-dark .column.is-offset-four-fifths-fullhd{margin-left:80%}html.theme--documenter-dark .column.is-0-fullhd{flex:none;width:0%}html.theme--documenter-dark .column.is-offset-0-fullhd{margin-left:0%}html.theme--documenter-dark .column.is-1-fullhd{flex:none;width:8.33333337%}html.theme--documenter-dark .column.is-offset-1-fullhd{margin-left:8.33333337%}html.theme--documenter-dark .column.is-2-fullhd{flex:none;width:16.66666674%}html.theme--documenter-dark .column.is-offset-2-fullhd{margin-left:16.66666674%}html.theme--documenter-dark .column.is-3-fullhd{flex:none;width:25%}html.theme--documenter-dark .column.is-offset-3-fullhd{margin-left:25%}html.theme--documenter-dark .column.is-4-fullhd{flex:none;width:33.33333337%}html.theme--documenter-dark .column.is-offset-4-fullhd{margin-left:33.33333337%}html.theme--documenter-dark .column.is-5-fullhd{flex:none;width:41.66666674%}html.theme--documenter-dark .column.is-offset-5-fullhd{margin-left:41.66666674%}html.theme--documenter-dark .column.is-6-fullhd{flex:none;width:50%}html.theme--documenter-dark .column.is-offset-6-fullhd{margin-left:50%}html.theme--documenter-dark .column.is-7-fullhd{flex:none;width:58.33333337%}html.theme--documenter-dark .column.is-offset-7-fullhd{margin-left:58.33333337%}html.theme--documenter-dark .column.is-8-fullhd{flex:none;width:66.66666674%}html.theme--documenter-dark .column.is-offset-8-fullhd{margin-left:66.66666674%}html.theme--documenter-dark .column.is-9-fullhd{flex:none;width:75%}html.theme--documenter-dark .column.is-offset-9-fullhd{margin-left:75%}html.theme--documenter-dark .column.is-10-fullhd{flex:none;width:83.33333337%}html.theme--documenter-dark .column.is-offset-10-fullhd{margin-left:83.33333337%}html.theme--documenter-dark .column.is-11-fullhd{flex:none;width:91.66666674%}html.theme--documenter-dark .column.is-offset-11-fullhd{margin-left:91.66666674%}html.theme--documenter-dark .column.is-12-fullhd{flex:none;width:100%}html.theme--documenter-dark .column.is-offset-12-fullhd{margin-left:100%}}html.theme--documenter-dark .columns{margin-left:-.75rem;margin-right:-.75rem;margin-top:-.75rem}html.theme--documenter-dark .columns:last-child{margin-bottom:-.75rem}html.theme--documenter-dark .columns:not(:last-child){margin-bottom:calc(1.5rem - .75rem)}html.theme--documenter-dark .columns.is-centered{justify-content:center}html.theme--documenter-dark .columns.is-gapless{margin-left:0;margin-right:0;margin-top:0}html.theme--documenter-dark .columns.is-gapless>.column{margin:0;padding:0 !important}html.theme--documenter-dark .columns.is-gapless:not(:last-child){margin-bottom:1.5rem}html.theme--documenter-dark .columns.is-gapless:last-child{margin-bottom:0}html.theme--documenter-dark .columns.is-mobile{display:flex}html.theme--documenter-dark .columns.is-multiline{flex-wrap:wrap}html.theme--documenter-dark .columns.is-vcentered{align-items:center}@media screen and (min-width: 769px),print{html.theme--documenter-dark .columns:not(.is-desktop){display:flex}}@media screen and (min-width: 1056px){html.theme--documenter-dark .columns.is-desktop{display:flex}}html.theme--documenter-dark .columns.is-variable{--columnGap: 0.75rem;margin-left:calc(-1 * var(--columnGap));margin-right:calc(-1 * var(--columnGap))}html.theme--documenter-dark .columns.is-variable>.column{padding-left:var(--columnGap);padding-right:var(--columnGap)}html.theme--documenter-dark .columns.is-variable.is-0{--columnGap: 0rem}@media screen and (max-width: 768px){html.theme--documenter-dark .columns.is-variable.is-0-mobile{--columnGap: 0rem}}@media screen and (min-width: 769px),print{html.theme--documenter-dark .columns.is-variable.is-0-tablet{--columnGap: 0rem}}@media screen and (min-width: 769px) and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-0-tablet-only{--columnGap: 0rem}}@media screen and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-0-touch{--columnGap: 0rem}}@media screen and (min-width: 1056px){html.theme--documenter-dark .columns.is-variable.is-0-desktop{--columnGap: 0rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){html.theme--documenter-dark .columns.is-variable.is-0-desktop-only{--columnGap: 0rem}}@media screen and (min-width: 1216px){html.theme--documenter-dark .columns.is-variable.is-0-widescreen{--columnGap: 0rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){html.theme--documenter-dark .columns.is-variable.is-0-widescreen-only{--columnGap: 0rem}}@media screen and (min-width: 1408px){html.theme--documenter-dark .columns.is-variable.is-0-fullhd{--columnGap: 0rem}}html.theme--documenter-dark .columns.is-variable.is-1{--columnGap: .25rem}@media screen and (max-width: 768px){html.theme--documenter-dark .columns.is-variable.is-1-mobile{--columnGap: .25rem}}@media screen and (min-width: 769px),print{html.theme--documenter-dark .columns.is-variable.is-1-tablet{--columnGap: .25rem}}@media screen and (min-width: 769px) and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-1-tablet-only{--columnGap: .25rem}}@media screen and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-1-touch{--columnGap: .25rem}}@media screen and (min-width: 1056px){html.theme--documenter-dark .columns.is-variable.is-1-desktop{--columnGap: .25rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){html.theme--documenter-dark .columns.is-variable.is-1-desktop-only{--columnGap: .25rem}}@media screen and (min-width: 1216px){html.theme--documenter-dark .columns.is-variable.is-1-widescreen{--columnGap: .25rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){html.theme--documenter-dark .columns.is-variable.is-1-widescreen-only{--columnGap: .25rem}}@media screen and (min-width: 1408px){html.theme--documenter-dark .columns.is-variable.is-1-fullhd{--columnGap: .25rem}}html.theme--documenter-dark .columns.is-variable.is-2{--columnGap: .5rem}@media screen and (max-width: 768px){html.theme--documenter-dark .columns.is-variable.is-2-mobile{--columnGap: .5rem}}@media screen and (min-width: 769px),print{html.theme--documenter-dark .columns.is-variable.is-2-tablet{--columnGap: .5rem}}@media screen and (min-width: 769px) and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-2-tablet-only{--columnGap: .5rem}}@media screen and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-2-touch{--columnGap: .5rem}}@media screen and (min-width: 1056px){html.theme--documenter-dark .columns.is-variable.is-2-desktop{--columnGap: .5rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){html.theme--documenter-dark .columns.is-variable.is-2-desktop-only{--columnGap: .5rem}}@media screen and (min-width: 1216px){html.theme--documenter-dark .columns.is-variable.is-2-widescreen{--columnGap: .5rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){html.theme--documenter-dark .columns.is-variable.is-2-widescreen-only{--columnGap: .5rem}}@media screen and (min-width: 1408px){html.theme--documenter-dark .columns.is-variable.is-2-fullhd{--columnGap: .5rem}}html.theme--documenter-dark .columns.is-variable.is-3{--columnGap: .75rem}@media screen and (max-width: 768px){html.theme--documenter-dark .columns.is-variable.is-3-mobile{--columnGap: .75rem}}@media screen and (min-width: 769px),print{html.theme--documenter-dark .columns.is-variable.is-3-tablet{--columnGap: .75rem}}@media screen and (min-width: 769px) and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-3-tablet-only{--columnGap: .75rem}}@media screen and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-3-touch{--columnGap: .75rem}}@media screen and (min-width: 1056px){html.theme--documenter-dark .columns.is-variable.is-3-desktop{--columnGap: .75rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){html.theme--documenter-dark .columns.is-variable.is-3-desktop-only{--columnGap: .75rem}}@media screen and (min-width: 1216px){html.theme--documenter-dark .columns.is-variable.is-3-widescreen{--columnGap: .75rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){html.theme--documenter-dark .columns.is-variable.is-3-widescreen-only{--columnGap: .75rem}}@media screen and (min-width: 1408px){html.theme--documenter-dark .columns.is-variable.is-3-fullhd{--columnGap: .75rem}}html.theme--documenter-dark .columns.is-variable.is-4{--columnGap: 1rem}@media screen and (max-width: 768px){html.theme--documenter-dark .columns.is-variable.is-4-mobile{--columnGap: 1rem}}@media screen and (min-width: 769px),print{html.theme--documenter-dark .columns.is-variable.is-4-tablet{--columnGap: 1rem}}@media screen and (min-width: 769px) and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-4-tablet-only{--columnGap: 1rem}}@media screen and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-4-touch{--columnGap: 1rem}}@media screen and (min-width: 1056px){html.theme--documenter-dark .columns.is-variable.is-4-desktop{--columnGap: 1rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){html.theme--documenter-dark .columns.is-variable.is-4-desktop-only{--columnGap: 1rem}}@media screen and (min-width: 1216px){html.theme--documenter-dark .columns.is-variable.is-4-widescreen{--columnGap: 1rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){html.theme--documenter-dark .columns.is-variable.is-4-widescreen-only{--columnGap: 1rem}}@media screen and (min-width: 1408px){html.theme--documenter-dark .columns.is-variable.is-4-fullhd{--columnGap: 1rem}}html.theme--documenter-dark .columns.is-variable.is-5{--columnGap: 1.25rem}@media screen and (max-width: 768px){html.theme--documenter-dark .columns.is-variable.is-5-mobile{--columnGap: 1.25rem}}@media screen and (min-width: 769px),print{html.theme--documenter-dark .columns.is-variable.is-5-tablet{--columnGap: 1.25rem}}@media screen and (min-width: 769px) and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-5-tablet-only{--columnGap: 1.25rem}}@media screen and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-5-touch{--columnGap: 1.25rem}}@media screen and (min-width: 1056px){html.theme--documenter-dark .columns.is-variable.is-5-desktop{--columnGap: 1.25rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){html.theme--documenter-dark .columns.is-variable.is-5-desktop-only{--columnGap: 1.25rem}}@media screen and (min-width: 1216px){html.theme--documenter-dark .columns.is-variable.is-5-widescreen{--columnGap: 1.25rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){html.theme--documenter-dark .columns.is-variable.is-5-widescreen-only{--columnGap: 1.25rem}}@media screen and (min-width: 1408px){html.theme--documenter-dark .columns.is-variable.is-5-fullhd{--columnGap: 1.25rem}}html.theme--documenter-dark .columns.is-variable.is-6{--columnGap: 1.5rem}@media screen and (max-width: 768px){html.theme--documenter-dark .columns.is-variable.is-6-mobile{--columnGap: 1.5rem}}@media screen and (min-width: 769px),print{html.theme--documenter-dark .columns.is-variable.is-6-tablet{--columnGap: 1.5rem}}@media screen and (min-width: 769px) and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-6-tablet-only{--columnGap: 1.5rem}}@media screen and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-6-touch{--columnGap: 1.5rem}}@media screen and (min-width: 1056px){html.theme--documenter-dark .columns.is-variable.is-6-desktop{--columnGap: 1.5rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){html.theme--documenter-dark .columns.is-variable.is-6-desktop-only{--columnGap: 1.5rem}}@media screen and (min-width: 1216px){html.theme--documenter-dark .columns.is-variable.is-6-widescreen{--columnGap: 1.5rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){html.theme--documenter-dark .columns.is-variable.is-6-widescreen-only{--columnGap: 1.5rem}}@media screen and (min-width: 1408px){html.theme--documenter-dark .columns.is-variable.is-6-fullhd{--columnGap: 1.5rem}}html.theme--documenter-dark .columns.is-variable.is-7{--columnGap: 1.75rem}@media screen and (max-width: 768px){html.theme--documenter-dark .columns.is-variable.is-7-mobile{--columnGap: 1.75rem}}@media screen and (min-width: 769px),print{html.theme--documenter-dark .columns.is-variable.is-7-tablet{--columnGap: 1.75rem}}@media screen and (min-width: 769px) and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-7-tablet-only{--columnGap: 1.75rem}}@media screen and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-7-touch{--columnGap: 1.75rem}}@media screen and (min-width: 1056px){html.theme--documenter-dark .columns.is-variable.is-7-desktop{--columnGap: 1.75rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){html.theme--documenter-dark .columns.is-variable.is-7-desktop-only{--columnGap: 1.75rem}}@media screen and (min-width: 1216px){html.theme--documenter-dark .columns.is-variable.is-7-widescreen{--columnGap: 1.75rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){html.theme--documenter-dark .columns.is-variable.is-7-widescreen-only{--columnGap: 1.75rem}}@media screen and (min-width: 1408px){html.theme--documenter-dark .columns.is-variable.is-7-fullhd{--columnGap: 1.75rem}}html.theme--documenter-dark .columns.is-variable.is-8{--columnGap: 2rem}@media screen and (max-width: 768px){html.theme--documenter-dark .columns.is-variable.is-8-mobile{--columnGap: 2rem}}@media screen and (min-width: 769px),print{html.theme--documenter-dark .columns.is-variable.is-8-tablet{--columnGap: 2rem}}@media screen and (min-width: 769px) and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-8-tablet-only{--columnGap: 2rem}}@media screen and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-8-touch{--columnGap: 2rem}}@media screen and (min-width: 1056px){html.theme--documenter-dark .columns.is-variable.is-8-desktop{--columnGap: 2rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){html.theme--documenter-dark .columns.is-variable.is-8-desktop-only{--columnGap: 2rem}}@media screen and (min-width: 1216px){html.theme--documenter-dark .columns.is-variable.is-8-widescreen{--columnGap: 2rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){html.theme--documenter-dark .columns.is-variable.is-8-widescreen-only{--columnGap: 2rem}}@media screen and (min-width: 1408px){html.theme--documenter-dark .columns.is-variable.is-8-fullhd{--columnGap: 2rem}}html.theme--documenter-dark .tile{align-items:stretch;display:block;flex-basis:0;flex-grow:1;flex-shrink:1;min-height:min-content}html.theme--documenter-dark .tile.is-ancestor{margin-left:-.75rem;margin-right:-.75rem;margin-top:-.75rem}html.theme--documenter-dark .tile.is-ancestor:last-child{margin-bottom:-.75rem}html.theme--documenter-dark .tile.is-ancestor:not(:last-child){margin-bottom:.75rem}html.theme--documenter-dark .tile.is-child{margin:0 !important}html.theme--documenter-dark .tile.is-parent{padding:.75rem}html.theme--documenter-dark .tile.is-vertical{flex-direction:column}html.theme--documenter-dark .tile.is-vertical>.tile.is-child:not(:last-child){margin-bottom:1.5rem !important}@media screen and (min-width: 769px),print{html.theme--documenter-dark .tile:not(.is-child){display:flex}html.theme--documenter-dark .tile.is-1{flex:none;width:8.33333337%}html.theme--documenter-dark .tile.is-2{flex:none;width:16.66666674%}html.theme--documenter-dark .tile.is-3{flex:none;width:25%}html.theme--documenter-dark .tile.is-4{flex:none;width:33.33333337%}html.theme--documenter-dark .tile.is-5{flex:none;width:41.66666674%}html.theme--documenter-dark .tile.is-6{flex:none;width:50%}html.theme--documenter-dark .tile.is-7{flex:none;width:58.33333337%}html.theme--documenter-dark .tile.is-8{flex:none;width:66.66666674%}html.theme--documenter-dark .tile.is-9{flex:none;width:75%}html.theme--documenter-dark .tile.is-10{flex:none;width:83.33333337%}html.theme--documenter-dark .tile.is-11{flex:none;width:91.66666674%}html.theme--documenter-dark .tile.is-12{flex:none;width:100%}}html.theme--documenter-dark .hero{align-items:stretch;display:flex;flex-direction:column;justify-content:space-between}html.theme--documenter-dark .hero .navbar{background:none}html.theme--documenter-dark .hero .tabs ul{border-bottom:none}html.theme--documenter-dark .hero.is-white{background-color:#fff;color:#0a0a0a}html.theme--documenter-dark .hero.is-white a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),html.theme--documenter-dark .hero.is-white strong{color:inherit}html.theme--documenter-dark .hero.is-white .title{color:#0a0a0a}html.theme--documenter-dark .hero.is-white .subtitle{color:rgba(10,10,10,0.9)}html.theme--documenter-dark .hero.is-white .subtitle a:not(.button),html.theme--documenter-dark .hero.is-white .subtitle strong{color:#0a0a0a}@media screen and (max-width: 1055px){html.theme--documenter-dark .hero.is-white .navbar-menu{background-color:#fff}}html.theme--documenter-dark .hero.is-white .navbar-item,html.theme--documenter-dark .hero.is-white .navbar-link{color:rgba(10,10,10,0.7)}html.theme--documenter-dark .hero.is-white a.navbar-item:hover,html.theme--documenter-dark .hero.is-white a.navbar-item.is-active,html.theme--documenter-dark .hero.is-white .navbar-link:hover,html.theme--documenter-dark .hero.is-white .navbar-link.is-active{background-color:#f2f2f2;color:#0a0a0a}html.theme--documenter-dark .hero.is-white .tabs a{color:#0a0a0a;opacity:0.9}html.theme--documenter-dark .hero.is-white .tabs a:hover{opacity:1}html.theme--documenter-dark .hero.is-white .tabs li.is-active a{color:#fff !important;opacity:1}html.theme--documenter-dark .hero.is-white .tabs.is-boxed a,html.theme--documenter-dark .hero.is-white .tabs.is-toggle a{color:#0a0a0a}html.theme--documenter-dark .hero.is-white .tabs.is-boxed a:hover,html.theme--documenter-dark .hero.is-white .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}html.theme--documenter-dark .hero.is-white .tabs.is-boxed li.is-active a,html.theme--documenter-dark .hero.is-white .tabs.is-boxed li.is-active a:hover,html.theme--documenter-dark .hero.is-white .tabs.is-toggle li.is-active a,html.theme--documenter-dark .hero.is-white .tabs.is-toggle li.is-active a:hover{background-color:#0a0a0a;border-color:#0a0a0a;color:#fff}html.theme--documenter-dark .hero.is-white.is-bold{background-image:linear-gradient(141deg, #e8e3e4 0%, #fff 71%, #fff 100%)}@media screen and (max-width: 768px){html.theme--documenter-dark .hero.is-white.is-bold .navbar-menu{background-image:linear-gradient(141deg, #e8e3e4 0%, #fff 71%, #fff 100%)}}html.theme--documenter-dark .hero.is-black{background-color:#0a0a0a;color:#fff}html.theme--documenter-dark .hero.is-black a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),html.theme--documenter-dark .hero.is-black strong{color:inherit}html.theme--documenter-dark .hero.is-black .title{color:#fff}html.theme--documenter-dark .hero.is-black .subtitle{color:rgba(255,255,255,0.9)}html.theme--documenter-dark .hero.is-black .subtitle a:not(.button),html.theme--documenter-dark .hero.is-black .subtitle strong{color:#fff}@media screen and (max-width: 1055px){html.theme--documenter-dark .hero.is-black .navbar-menu{background-color:#0a0a0a}}html.theme--documenter-dark .hero.is-black .navbar-item,html.theme--documenter-dark .hero.is-black .navbar-link{color:rgba(255,255,255,0.7)}html.theme--documenter-dark .hero.is-black a.navbar-item:hover,html.theme--documenter-dark .hero.is-black a.navbar-item.is-active,html.theme--documenter-dark .hero.is-black .navbar-link:hover,html.theme--documenter-dark .hero.is-black .navbar-link.is-active{background-color:#000;color:#fff}html.theme--documenter-dark .hero.is-black .tabs a{color:#fff;opacity:0.9}html.theme--documenter-dark .hero.is-black .tabs a:hover{opacity:1}html.theme--documenter-dark .hero.is-black .tabs li.is-active a{color:#0a0a0a !important;opacity:1}html.theme--documenter-dark .hero.is-black .tabs.is-boxed a,html.theme--documenter-dark .hero.is-black .tabs.is-toggle a{color:#fff}html.theme--documenter-dark .hero.is-black .tabs.is-boxed a:hover,html.theme--documenter-dark .hero.is-black .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}html.theme--documenter-dark .hero.is-black .tabs.is-boxed li.is-active a,html.theme--documenter-dark .hero.is-black .tabs.is-boxed li.is-active a:hover,html.theme--documenter-dark .hero.is-black .tabs.is-toggle li.is-active a,html.theme--documenter-dark .hero.is-black .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#0a0a0a}html.theme--documenter-dark .hero.is-black.is-bold{background-image:linear-gradient(141deg, #000 0%, #0a0a0a 71%, #181616 100%)}@media screen and (max-width: 768px){html.theme--documenter-dark .hero.is-black.is-bold .navbar-menu{background-image:linear-gradient(141deg, #000 0%, #0a0a0a 71%, #181616 100%)}}html.theme--documenter-dark .hero.is-light{background-color:#ecf0f1;color:rgba(0,0,0,0.7)}html.theme--documenter-dark .hero.is-light a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),html.theme--documenter-dark .hero.is-light strong{color:inherit}html.theme--documenter-dark .hero.is-light .title{color:rgba(0,0,0,0.7)}html.theme--documenter-dark .hero.is-light .subtitle{color:rgba(0,0,0,0.9)}html.theme--documenter-dark .hero.is-light .subtitle a:not(.button),html.theme--documenter-dark .hero.is-light .subtitle strong{color:rgba(0,0,0,0.7)}@media screen and (max-width: 1055px){html.theme--documenter-dark .hero.is-light .navbar-menu{background-color:#ecf0f1}}html.theme--documenter-dark .hero.is-light .navbar-item,html.theme--documenter-dark .hero.is-light .navbar-link{color:rgba(0,0,0,0.7)}html.theme--documenter-dark .hero.is-light a.navbar-item:hover,html.theme--documenter-dark .hero.is-light a.navbar-item.is-active,html.theme--documenter-dark .hero.is-light .navbar-link:hover,html.theme--documenter-dark .hero.is-light .navbar-link.is-active{background-color:#dde4e6;color:rgba(0,0,0,0.7)}html.theme--documenter-dark .hero.is-light .tabs a{color:rgba(0,0,0,0.7);opacity:0.9}html.theme--documenter-dark .hero.is-light .tabs a:hover{opacity:1}html.theme--documenter-dark .hero.is-light .tabs li.is-active a{color:#ecf0f1 !important;opacity:1}html.theme--documenter-dark .hero.is-light .tabs.is-boxed a,html.theme--documenter-dark .hero.is-light .tabs.is-toggle a{color:rgba(0,0,0,0.7)}html.theme--documenter-dark .hero.is-light .tabs.is-boxed a:hover,html.theme--documenter-dark .hero.is-light .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}html.theme--documenter-dark .hero.is-light .tabs.is-boxed li.is-active a,html.theme--documenter-dark .hero.is-light .tabs.is-boxed li.is-active a:hover,html.theme--documenter-dark .hero.is-light .tabs.is-toggle li.is-active a,html.theme--documenter-dark .hero.is-light .tabs.is-toggle li.is-active a:hover{background-color:rgba(0,0,0,0.7);border-color:rgba(0,0,0,0.7);color:#ecf0f1}html.theme--documenter-dark .hero.is-light.is-bold{background-image:linear-gradient(141deg, #cadfe0 0%, #ecf0f1 71%, #fafbfc 100%)}@media screen and (max-width: 768px){html.theme--documenter-dark .hero.is-light.is-bold .navbar-menu{background-image:linear-gradient(141deg, #cadfe0 0%, #ecf0f1 71%, #fafbfc 100%)}}html.theme--documenter-dark .hero.is-dark,html.theme--documenter-dark .content kbd.hero{background-color:#282f2f;color:#fff}html.theme--documenter-dark .hero.is-dark a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),html.theme--documenter-dark .content kbd.hero a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),html.theme--documenter-dark .hero.is-dark strong,html.theme--documenter-dark .content kbd.hero strong{color:inherit}html.theme--documenter-dark .hero.is-dark .title,html.theme--documenter-dark .content kbd.hero .title{color:#fff}html.theme--documenter-dark .hero.is-dark .subtitle,html.theme--documenter-dark .content kbd.hero .subtitle{color:rgba(255,255,255,0.9)}html.theme--documenter-dark .hero.is-dark .subtitle a:not(.button),html.theme--documenter-dark .content kbd.hero .subtitle a:not(.button),html.theme--documenter-dark .hero.is-dark .subtitle strong,html.theme--documenter-dark .content kbd.hero .subtitle strong{color:#fff}@media screen and (max-width: 1055px){html.theme--documenter-dark .hero.is-dark .navbar-menu,html.theme--documenter-dark .content kbd.hero .navbar-menu{background-color:#282f2f}}html.theme--documenter-dark .hero.is-dark .navbar-item,html.theme--documenter-dark .content kbd.hero .navbar-item,html.theme--documenter-dark .hero.is-dark .navbar-link,html.theme--documenter-dark .content kbd.hero .navbar-link{color:rgba(255,255,255,0.7)}html.theme--documenter-dark .hero.is-dark a.navbar-item:hover,html.theme--documenter-dark .content kbd.hero a.navbar-item:hover,html.theme--documenter-dark .hero.is-dark a.navbar-item.is-active,html.theme--documenter-dark .content kbd.hero a.navbar-item.is-active,html.theme--documenter-dark .hero.is-dark .navbar-link:hover,html.theme--documenter-dark .content kbd.hero .navbar-link:hover,html.theme--documenter-dark .hero.is-dark .navbar-link.is-active,html.theme--documenter-dark .content kbd.hero .navbar-link.is-active{background-color:#1d2122;color:#fff}html.theme--documenter-dark .hero.is-dark .tabs a,html.theme--documenter-dark .content kbd.hero .tabs a{color:#fff;opacity:0.9}html.theme--documenter-dark .hero.is-dark .tabs a:hover,html.theme--documenter-dark .content kbd.hero .tabs a:hover{opacity:1}html.theme--documenter-dark .hero.is-dark .tabs li.is-active a,html.theme--documenter-dark .content kbd.hero .tabs li.is-active a{color:#282f2f !important;opacity:1}html.theme--documenter-dark .hero.is-dark .tabs.is-boxed a,html.theme--documenter-dark .content kbd.hero .tabs.is-boxed a,html.theme--documenter-dark .hero.is-dark .tabs.is-toggle a,html.theme--documenter-dark .content kbd.hero .tabs.is-toggle a{color:#fff}html.theme--documenter-dark .hero.is-dark .tabs.is-boxed a:hover,html.theme--documenter-dark .content kbd.hero .tabs.is-boxed a:hover,html.theme--documenter-dark .hero.is-dark .tabs.is-toggle a:hover,html.theme--documenter-dark .content kbd.hero .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}html.theme--documenter-dark .hero.is-dark .tabs.is-boxed li.is-active a,html.theme--documenter-dark .content kbd.hero .tabs.is-boxed li.is-active a,html.theme--documenter-dark .hero.is-dark .tabs.is-boxed li.is-active a:hover,html.theme--documenter-dark .hero.is-dark .tabs.is-toggle li.is-active a,html.theme--documenter-dark .content kbd.hero .tabs.is-toggle li.is-active a,html.theme--documenter-dark .hero.is-dark .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#282f2f}html.theme--documenter-dark .hero.is-dark.is-bold,html.theme--documenter-dark .content kbd.hero.is-bold{background-image:linear-gradient(141deg, #0f1615 0%, #282f2f 71%, #313c40 100%)}@media screen and (max-width: 768px){html.theme--documenter-dark .hero.is-dark.is-bold .navbar-menu,html.theme--documenter-dark .content kbd.hero.is-bold .navbar-menu{background-image:linear-gradient(141deg, #0f1615 0%, #282f2f 71%, #313c40 100%)}}html.theme--documenter-dark .hero.is-primary,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink{background-color:#375a7f;color:#fff}html.theme--documenter-dark .hero.is-primary a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),html.theme--documenter-dark .hero.is-primary strong,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink strong{color:inherit}html.theme--documenter-dark .hero.is-primary .title,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .title{color:#fff}html.theme--documenter-dark .hero.is-primary .subtitle,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .subtitle{color:rgba(255,255,255,0.9)}html.theme--documenter-dark .hero.is-primary .subtitle a:not(.button),html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .subtitle a:not(.button),html.theme--documenter-dark .hero.is-primary .subtitle strong,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .subtitle strong{color:#fff}@media screen and (max-width: 1055px){html.theme--documenter-dark .hero.is-primary .navbar-menu,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .navbar-menu{background-color:#375a7f}}html.theme--documenter-dark .hero.is-primary .navbar-item,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .navbar-item,html.theme--documenter-dark .hero.is-primary .navbar-link,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .navbar-link{color:rgba(255,255,255,0.7)}html.theme--documenter-dark .hero.is-primary a.navbar-item:hover,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink a.navbar-item:hover,html.theme--documenter-dark .hero.is-primary a.navbar-item.is-active,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink a.navbar-item.is-active,html.theme--documenter-dark .hero.is-primary .navbar-link:hover,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .navbar-link:hover,html.theme--documenter-dark .hero.is-primary .navbar-link.is-active,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .navbar-link.is-active{background-color:#2f4d6d;color:#fff}html.theme--documenter-dark .hero.is-primary .tabs a,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .tabs a{color:#fff;opacity:0.9}html.theme--documenter-dark .hero.is-primary .tabs a:hover,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .tabs a:hover{opacity:1}html.theme--documenter-dark .hero.is-primary .tabs li.is-active a,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .tabs li.is-active a{color:#375a7f !important;opacity:1}html.theme--documenter-dark .hero.is-primary .tabs.is-boxed a,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .tabs.is-boxed a,html.theme--documenter-dark .hero.is-primary .tabs.is-toggle a,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .tabs.is-toggle a{color:#fff}html.theme--documenter-dark .hero.is-primary .tabs.is-boxed a:hover,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .tabs.is-boxed a:hover,html.theme--documenter-dark .hero.is-primary .tabs.is-toggle a:hover,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}html.theme--documenter-dark .hero.is-primary .tabs.is-boxed li.is-active a,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .tabs.is-boxed li.is-active a,html.theme--documenter-dark .hero.is-primary .tabs.is-boxed li.is-active a:hover,html.theme--documenter-dark .hero.is-primary .tabs.is-toggle li.is-active a,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .tabs.is-toggle li.is-active a,html.theme--documenter-dark .hero.is-primary .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#375a7f}html.theme--documenter-dark .hero.is-primary.is-bold,html.theme--documenter-dark .docstring>section>a.hero.is-bold.docs-sourcelink{background-image:linear-gradient(141deg, #214b62 0%, #375a7f 71%, #3a5796 100%)}@media screen and (max-width: 768px){html.theme--documenter-dark .hero.is-primary.is-bold .navbar-menu,html.theme--documenter-dark .docstring>section>a.hero.is-bold.docs-sourcelink .navbar-menu{background-image:linear-gradient(141deg, #214b62 0%, #375a7f 71%, #3a5796 100%)}}html.theme--documenter-dark .hero.is-link{background-color:#1abc9c;color:#fff}html.theme--documenter-dark .hero.is-link a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),html.theme--documenter-dark .hero.is-link strong{color:inherit}html.theme--documenter-dark .hero.is-link .title{color:#fff}html.theme--documenter-dark .hero.is-link .subtitle{color:rgba(255,255,255,0.9)}html.theme--documenter-dark .hero.is-link .subtitle a:not(.button),html.theme--documenter-dark .hero.is-link .subtitle strong{color:#fff}@media screen and (max-width: 1055px){html.theme--documenter-dark .hero.is-link .navbar-menu{background-color:#1abc9c}}html.theme--documenter-dark .hero.is-link .navbar-item,html.theme--documenter-dark .hero.is-link .navbar-link{color:rgba(255,255,255,0.7)}html.theme--documenter-dark .hero.is-link a.navbar-item:hover,html.theme--documenter-dark .hero.is-link a.navbar-item.is-active,html.theme--documenter-dark .hero.is-link .navbar-link:hover,html.theme--documenter-dark .hero.is-link .navbar-link.is-active{background-color:#17a689;color:#fff}html.theme--documenter-dark .hero.is-link .tabs a{color:#fff;opacity:0.9}html.theme--documenter-dark .hero.is-link .tabs a:hover{opacity:1}html.theme--documenter-dark .hero.is-link .tabs li.is-active a{color:#1abc9c !important;opacity:1}html.theme--documenter-dark .hero.is-link .tabs.is-boxed a,html.theme--documenter-dark .hero.is-link .tabs.is-toggle a{color:#fff}html.theme--documenter-dark .hero.is-link .tabs.is-boxed a:hover,html.theme--documenter-dark .hero.is-link .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}html.theme--documenter-dark .hero.is-link .tabs.is-boxed li.is-active a,html.theme--documenter-dark .hero.is-link .tabs.is-boxed li.is-active a:hover,html.theme--documenter-dark .hero.is-link .tabs.is-toggle li.is-active a,html.theme--documenter-dark .hero.is-link .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#1abc9c}html.theme--documenter-dark .hero.is-link.is-bold{background-image:linear-gradient(141deg, #0c9764 0%, #1abc9c 71%, #17d8d2 100%)}@media screen and (max-width: 768px){html.theme--documenter-dark .hero.is-link.is-bold .navbar-menu{background-image:linear-gradient(141deg, #0c9764 0%, #1abc9c 71%, #17d8d2 100%)}}html.theme--documenter-dark .hero.is-info{background-color:#024c7d;color:#fff}html.theme--documenter-dark .hero.is-info a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),html.theme--documenter-dark .hero.is-info strong{color:inherit}html.theme--documenter-dark .hero.is-info .title{color:#fff}html.theme--documenter-dark .hero.is-info .subtitle{color:rgba(255,255,255,0.9)}html.theme--documenter-dark .hero.is-info .subtitle a:not(.button),html.theme--documenter-dark .hero.is-info .subtitle strong{color:#fff}@media screen and (max-width: 1055px){html.theme--documenter-dark .hero.is-info .navbar-menu{background-color:#024c7d}}html.theme--documenter-dark .hero.is-info .navbar-item,html.theme--documenter-dark .hero.is-info .navbar-link{color:rgba(255,255,255,0.7)}html.theme--documenter-dark .hero.is-info a.navbar-item:hover,html.theme--documenter-dark .hero.is-info a.navbar-item.is-active,html.theme--documenter-dark .hero.is-info .navbar-link:hover,html.theme--documenter-dark .hero.is-info .navbar-link.is-active{background-color:#023d64;color:#fff}html.theme--documenter-dark .hero.is-info .tabs a{color:#fff;opacity:0.9}html.theme--documenter-dark .hero.is-info .tabs a:hover{opacity:1}html.theme--documenter-dark .hero.is-info .tabs li.is-active a{color:#024c7d !important;opacity:1}html.theme--documenter-dark .hero.is-info .tabs.is-boxed a,html.theme--documenter-dark .hero.is-info .tabs.is-toggle a{color:#fff}html.theme--documenter-dark .hero.is-info .tabs.is-boxed a:hover,html.theme--documenter-dark .hero.is-info .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}html.theme--documenter-dark .hero.is-info .tabs.is-boxed li.is-active a,html.theme--documenter-dark .hero.is-info .tabs.is-boxed li.is-active a:hover,html.theme--documenter-dark .hero.is-info .tabs.is-toggle li.is-active a,html.theme--documenter-dark .hero.is-info .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#024c7d}html.theme--documenter-dark .hero.is-info.is-bold{background-image:linear-gradient(141deg, #003a4c 0%, #024c7d 71%, #004299 100%)}@media screen and (max-width: 768px){html.theme--documenter-dark .hero.is-info.is-bold .navbar-menu{background-image:linear-gradient(141deg, #003a4c 0%, #024c7d 71%, #004299 100%)}}html.theme--documenter-dark .hero.is-success{background-color:#008438;color:#fff}html.theme--documenter-dark .hero.is-success a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),html.theme--documenter-dark .hero.is-success strong{color:inherit}html.theme--documenter-dark .hero.is-success .title{color:#fff}html.theme--documenter-dark .hero.is-success .subtitle{color:rgba(255,255,255,0.9)}html.theme--documenter-dark .hero.is-success .subtitle a:not(.button),html.theme--documenter-dark .hero.is-success .subtitle strong{color:#fff}@media screen and (max-width: 1055px){html.theme--documenter-dark .hero.is-success .navbar-menu{background-color:#008438}}html.theme--documenter-dark .hero.is-success .navbar-item,html.theme--documenter-dark .hero.is-success .navbar-link{color:rgba(255,255,255,0.7)}html.theme--documenter-dark .hero.is-success a.navbar-item:hover,html.theme--documenter-dark .hero.is-success a.navbar-item.is-active,html.theme--documenter-dark .hero.is-success .navbar-link:hover,html.theme--documenter-dark .hero.is-success .navbar-link.is-active{background-color:#006b2d;color:#fff}html.theme--documenter-dark .hero.is-success .tabs a{color:#fff;opacity:0.9}html.theme--documenter-dark .hero.is-success .tabs a:hover{opacity:1}html.theme--documenter-dark .hero.is-success .tabs li.is-active a{color:#008438 !important;opacity:1}html.theme--documenter-dark .hero.is-success .tabs.is-boxed a,html.theme--documenter-dark .hero.is-success .tabs.is-toggle a{color:#fff}html.theme--documenter-dark .hero.is-success .tabs.is-boxed a:hover,html.theme--documenter-dark .hero.is-success .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}html.theme--documenter-dark .hero.is-success .tabs.is-boxed li.is-active a,html.theme--documenter-dark .hero.is-success .tabs.is-boxed li.is-active a:hover,html.theme--documenter-dark .hero.is-success .tabs.is-toggle li.is-active a,html.theme--documenter-dark .hero.is-success .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#008438}html.theme--documenter-dark .hero.is-success.is-bold{background-image:linear-gradient(141deg, #005115 0%, #008438 71%, #009e5d 100%)}@media screen and (max-width: 768px){html.theme--documenter-dark .hero.is-success.is-bold .navbar-menu{background-image:linear-gradient(141deg, #005115 0%, #008438 71%, #009e5d 100%)}}html.theme--documenter-dark .hero.is-warning{background-color:#ad8100;color:#fff}html.theme--documenter-dark .hero.is-warning a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),html.theme--documenter-dark .hero.is-warning strong{color:inherit}html.theme--documenter-dark .hero.is-warning .title{color:#fff}html.theme--documenter-dark .hero.is-warning .subtitle{color:rgba(255,255,255,0.9)}html.theme--documenter-dark .hero.is-warning .subtitle a:not(.button),html.theme--documenter-dark .hero.is-warning .subtitle strong{color:#fff}@media screen and (max-width: 1055px){html.theme--documenter-dark .hero.is-warning .navbar-menu{background-color:#ad8100}}html.theme--documenter-dark .hero.is-warning .navbar-item,html.theme--documenter-dark .hero.is-warning .navbar-link{color:rgba(255,255,255,0.7)}html.theme--documenter-dark .hero.is-warning a.navbar-item:hover,html.theme--documenter-dark .hero.is-warning a.navbar-item.is-active,html.theme--documenter-dark .hero.is-warning .navbar-link:hover,html.theme--documenter-dark .hero.is-warning .navbar-link.is-active{background-color:#946e00;color:#fff}html.theme--documenter-dark .hero.is-warning .tabs a{color:#fff;opacity:0.9}html.theme--documenter-dark .hero.is-warning .tabs a:hover{opacity:1}html.theme--documenter-dark .hero.is-warning .tabs li.is-active a{color:#ad8100 !important;opacity:1}html.theme--documenter-dark .hero.is-warning .tabs.is-boxed a,html.theme--documenter-dark .hero.is-warning .tabs.is-toggle a{color:#fff}html.theme--documenter-dark .hero.is-warning .tabs.is-boxed a:hover,html.theme--documenter-dark .hero.is-warning .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}html.theme--documenter-dark .hero.is-warning .tabs.is-boxed li.is-active a,html.theme--documenter-dark .hero.is-warning .tabs.is-boxed li.is-active a:hover,html.theme--documenter-dark .hero.is-warning .tabs.is-toggle li.is-active a,html.theme--documenter-dark .hero.is-warning .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#ad8100}html.theme--documenter-dark .hero.is-warning.is-bold{background-image:linear-gradient(141deg, #7a4700 0%, #ad8100 71%, #c7b500 100%)}@media screen and (max-width: 768px){html.theme--documenter-dark .hero.is-warning.is-bold .navbar-menu{background-image:linear-gradient(141deg, #7a4700 0%, #ad8100 71%, #c7b500 100%)}}html.theme--documenter-dark .hero.is-danger{background-color:#9e1b0d;color:#fff}html.theme--documenter-dark .hero.is-danger a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),html.theme--documenter-dark .hero.is-danger strong{color:inherit}html.theme--documenter-dark .hero.is-danger .title{color:#fff}html.theme--documenter-dark .hero.is-danger .subtitle{color:rgba(255,255,255,0.9)}html.theme--documenter-dark .hero.is-danger .subtitle a:not(.button),html.theme--documenter-dark .hero.is-danger .subtitle strong{color:#fff}@media screen and (max-width: 1055px){html.theme--documenter-dark .hero.is-danger .navbar-menu{background-color:#9e1b0d}}html.theme--documenter-dark .hero.is-danger .navbar-item,html.theme--documenter-dark .hero.is-danger .navbar-link{color:rgba(255,255,255,0.7)}html.theme--documenter-dark .hero.is-danger a.navbar-item:hover,html.theme--documenter-dark .hero.is-danger a.navbar-item.is-active,html.theme--documenter-dark .hero.is-danger .navbar-link:hover,html.theme--documenter-dark .hero.is-danger .navbar-link.is-active{background-color:#86170b;color:#fff}html.theme--documenter-dark .hero.is-danger .tabs a{color:#fff;opacity:0.9}html.theme--documenter-dark .hero.is-danger .tabs a:hover{opacity:1}html.theme--documenter-dark .hero.is-danger .tabs li.is-active a{color:#9e1b0d !important;opacity:1}html.theme--documenter-dark .hero.is-danger .tabs.is-boxed a,html.theme--documenter-dark .hero.is-danger .tabs.is-toggle a{color:#fff}html.theme--documenter-dark .hero.is-danger .tabs.is-boxed a:hover,html.theme--documenter-dark .hero.is-danger .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}html.theme--documenter-dark .hero.is-danger .tabs.is-boxed li.is-active a,html.theme--documenter-dark .hero.is-danger .tabs.is-boxed li.is-active a:hover,html.theme--documenter-dark .hero.is-danger .tabs.is-toggle li.is-active a,html.theme--documenter-dark .hero.is-danger .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#9e1b0d}html.theme--documenter-dark .hero.is-danger.is-bold{background-image:linear-gradient(141deg, #75030b 0%, #9e1b0d 71%, #ba380a 100%)}@media screen and (max-width: 768px){html.theme--documenter-dark .hero.is-danger.is-bold .navbar-menu{background-image:linear-gradient(141deg, #75030b 0%, #9e1b0d 71%, #ba380a 100%)}}html.theme--documenter-dark .hero.is-small .hero-body,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.hero .hero-body{padding:1.5rem}@media screen and (min-width: 769px),print{html.theme--documenter-dark .hero.is-medium .hero-body{padding:9rem 4.5rem}}@media screen and (min-width: 769px),print{html.theme--documenter-dark .hero.is-large .hero-body{padding:18rem 6rem}}html.theme--documenter-dark .hero.is-halfheight .hero-body,html.theme--documenter-dark .hero.is-fullheight .hero-body,html.theme--documenter-dark .hero.is-fullheight-with-navbar .hero-body{align-items:center;display:flex}html.theme--documenter-dark .hero.is-halfheight .hero-body>.container,html.theme--documenter-dark .hero.is-fullheight .hero-body>.container,html.theme--documenter-dark .hero.is-fullheight-with-navbar .hero-body>.container{flex-grow:1;flex-shrink:1}html.theme--documenter-dark .hero.is-halfheight{min-height:50vh}html.theme--documenter-dark .hero.is-fullheight{min-height:100vh}html.theme--documenter-dark .hero-video{overflow:hidden}html.theme--documenter-dark .hero-video video{left:50%;min-height:100%;min-width:100%;position:absolute;top:50%;transform:translate3d(-50%, -50%, 0)}html.theme--documenter-dark .hero-video.is-transparent{opacity:0.3}@media screen and (max-width: 768px){html.theme--documenter-dark .hero-video{display:none}}html.theme--documenter-dark .hero-buttons{margin-top:1.5rem}@media screen and (max-width: 768px){html.theme--documenter-dark .hero-buttons .button{display:flex}html.theme--documenter-dark .hero-buttons .button:not(:last-child){margin-bottom:0.75rem}}@media screen and (min-width: 769px),print{html.theme--documenter-dark .hero-buttons{display:flex;justify-content:center}html.theme--documenter-dark .hero-buttons .button:not(:last-child){margin-right:1.5rem}}html.theme--documenter-dark .hero-head,html.theme--documenter-dark .hero-foot{flex-grow:0;flex-shrink:0}html.theme--documenter-dark .hero-body{flex-grow:1;flex-shrink:0;padding:3rem 1.5rem}@media screen and (min-width: 769px),print{html.theme--documenter-dark .hero-body{padding:3rem 3rem}}html.theme--documenter-dark .section{padding:3rem 1.5rem}@media screen and (min-width: 1056px){html.theme--documenter-dark .section{padding:3rem 3rem}html.theme--documenter-dark .section.is-medium{padding:9rem 4.5rem}html.theme--documenter-dark .section.is-large{padding:18rem 6rem}}html.theme--documenter-dark .footer{background-color:#282f2f;padding:3rem 1.5rem 6rem}html.theme--documenter-dark hr{height:1px}html.theme--documenter-dark h6{text-transform:uppercase;letter-spacing:0.5px}html.theme--documenter-dark .hero{background-color:#343c3d}html.theme--documenter-dark a{transition:all 200ms ease}html.theme--documenter-dark .button{transition:all 200ms ease;border-width:1px;color:#fff}html.theme--documenter-dark .button.is-active,html.theme--documenter-dark .button.is-focused,html.theme--documenter-dark .button:active,html.theme--documenter-dark .button:focus{box-shadow:0 0 0 2px rgba(140,155,157,0.5)}html.theme--documenter-dark .button.is-white.is-hovered,html.theme--documenter-dark .button.is-white:hover{background-color:#fff}html.theme--documenter-dark .button.is-white.is-active,html.theme--documenter-dark .button.is-white.is-focused,html.theme--documenter-dark .button.is-white:active,html.theme--documenter-dark .button.is-white:focus{border-color:#fff;box-shadow:0 0 0 2px rgba(255,255,255,0.5)}html.theme--documenter-dark .button.is-black.is-hovered,html.theme--documenter-dark .button.is-black:hover{background-color:#1d1d1d}html.theme--documenter-dark .button.is-black.is-active,html.theme--documenter-dark .button.is-black.is-focused,html.theme--documenter-dark .button.is-black:active,html.theme--documenter-dark .button.is-black:focus{border-color:#0a0a0a;box-shadow:0 0 0 2px rgba(10,10,10,0.5)}html.theme--documenter-dark .button.is-light.is-hovered,html.theme--documenter-dark .button.is-light:hover{background-color:#fff}html.theme--documenter-dark .button.is-light.is-active,html.theme--documenter-dark .button.is-light.is-focused,html.theme--documenter-dark .button.is-light:active,html.theme--documenter-dark .button.is-light:focus{border-color:#ecf0f1;box-shadow:0 0 0 2px rgba(236,240,241,0.5)}html.theme--documenter-dark .button.is-dark.is-hovered,html.theme--documenter-dark .content kbd.button.is-hovered,html.theme--documenter-dark .button.is-dark:hover,html.theme--documenter-dark .content kbd.button:hover{background-color:#3a4344}html.theme--documenter-dark .button.is-dark.is-active,html.theme--documenter-dark .content kbd.button.is-active,html.theme--documenter-dark .button.is-dark.is-focused,html.theme--documenter-dark .content kbd.button.is-focused,html.theme--documenter-dark .button.is-dark:active,html.theme--documenter-dark .content kbd.button:active,html.theme--documenter-dark .button.is-dark:focus,html.theme--documenter-dark .content kbd.button:focus{border-color:#282f2f;box-shadow:0 0 0 2px rgba(40,47,47,0.5)}html.theme--documenter-dark .button.is-primary.is-hovered,html.theme--documenter-dark .docstring>section>a.button.is-hovered.docs-sourcelink,html.theme--documenter-dark .button.is-primary:hover,html.theme--documenter-dark .docstring>section>a.button.docs-sourcelink:hover{background-color:#436d9a}html.theme--documenter-dark .button.is-primary.is-active,html.theme--documenter-dark .docstring>section>a.button.is-active.docs-sourcelink,html.theme--documenter-dark .button.is-primary.is-focused,html.theme--documenter-dark .docstring>section>a.button.is-focused.docs-sourcelink,html.theme--documenter-dark .button.is-primary:active,html.theme--documenter-dark .docstring>section>a.button.docs-sourcelink:active,html.theme--documenter-dark .button.is-primary:focus,html.theme--documenter-dark .docstring>section>a.button.docs-sourcelink:focus{border-color:#375a7f;box-shadow:0 0 0 2px rgba(55,90,127,0.5)}html.theme--documenter-dark .button.is-link.is-hovered,html.theme--documenter-dark .button.is-link:hover{background-color:#1fdeb8}html.theme--documenter-dark .button.is-link.is-active,html.theme--documenter-dark .button.is-link.is-focused,html.theme--documenter-dark .button.is-link:active,html.theme--documenter-dark .button.is-link:focus{border-color:#1abc9c;box-shadow:0 0 0 2px rgba(26,188,156,0.5)}html.theme--documenter-dark .button.is-info.is-hovered,html.theme--documenter-dark .button.is-info:hover{background-color:#0363a3}html.theme--documenter-dark .button.is-info.is-active,html.theme--documenter-dark .button.is-info.is-focused,html.theme--documenter-dark .button.is-info:active,html.theme--documenter-dark .button.is-info:focus{border-color:#024c7d;box-shadow:0 0 0 2px rgba(2,76,125,0.5)}html.theme--documenter-dark .button.is-success.is-hovered,html.theme--documenter-dark .button.is-success:hover{background-color:#00aa48}html.theme--documenter-dark .button.is-success.is-active,html.theme--documenter-dark .button.is-success.is-focused,html.theme--documenter-dark .button.is-success:active,html.theme--documenter-dark .button.is-success:focus{border-color:#008438;box-shadow:0 0 0 2px rgba(0,132,56,0.5)}html.theme--documenter-dark .button.is-warning.is-hovered,html.theme--documenter-dark .button.is-warning:hover{background-color:#d39e00}html.theme--documenter-dark .button.is-warning.is-active,html.theme--documenter-dark .button.is-warning.is-focused,html.theme--documenter-dark .button.is-warning:active,html.theme--documenter-dark .button.is-warning:focus{border-color:#ad8100;box-shadow:0 0 0 2px rgba(173,129,0,0.5)}html.theme--documenter-dark .button.is-danger.is-hovered,html.theme--documenter-dark .button.is-danger:hover{background-color:#c12110}html.theme--documenter-dark .button.is-danger.is-active,html.theme--documenter-dark .button.is-danger.is-focused,html.theme--documenter-dark .button.is-danger:active,html.theme--documenter-dark .button.is-danger:focus{border-color:#9e1b0d;box-shadow:0 0 0 2px rgba(158,27,13,0.5)}html.theme--documenter-dark .label{color:#dbdee0}html.theme--documenter-dark .button,html.theme--documenter-dark .control.has-icons-left .icon,html.theme--documenter-dark .control.has-icons-right .icon,html.theme--documenter-dark .input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input,html.theme--documenter-dark .pagination-ellipsis,html.theme--documenter-dark .pagination-link,html.theme--documenter-dark .pagination-next,html.theme--documenter-dark .pagination-previous,html.theme--documenter-dark .select,html.theme--documenter-dark .select select,html.theme--documenter-dark .textarea{height:2.5em}html.theme--documenter-dark .input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input,html.theme--documenter-dark .textarea{transition:all 200ms ease;box-shadow:none;border-width:1px;padding-left:1em;padding-right:1em}html.theme--documenter-dark .select:after,html.theme--documenter-dark .select select{border-width:1px}html.theme--documenter-dark .control.has-addons .button,html.theme--documenter-dark .control.has-addons .input,html.theme--documenter-dark .control.has-addons #documenter .docs-sidebar form.docs-search>input,html.theme--documenter-dark #documenter .docs-sidebar .control.has-addons form.docs-search>input,html.theme--documenter-dark .control.has-addons .select{margin-right:-1px}html.theme--documenter-dark .notification{background-color:#343c3d}html.theme--documenter-dark .card{box-shadow:none;border:1px solid #343c3d;background-color:#282f2f;border-radius:.4em}html.theme--documenter-dark .card .card-image img{border-radius:.4em .4em 0 0}html.theme--documenter-dark .card .card-header{box-shadow:none;background-color:rgba(18,18,18,0.2);border-radius:.4em .4em 0 0}html.theme--documenter-dark .card .card-footer{background-color:rgba(18,18,18,0.2)}html.theme--documenter-dark .card .card-footer,html.theme--documenter-dark .card .card-footer-item{border-width:1px;border-color:#343c3d}html.theme--documenter-dark .notification.is-white a:not(.button){color:#0a0a0a;text-decoration:underline}html.theme--documenter-dark .notification.is-black a:not(.button){color:#fff;text-decoration:underline}html.theme--documenter-dark .notification.is-light a:not(.button){color:rgba(0,0,0,0.7);text-decoration:underline}html.theme--documenter-dark .notification.is-dark a:not(.button),html.theme--documenter-dark .content kbd.notification a:not(.button){color:#fff;text-decoration:underline}html.theme--documenter-dark .notification.is-primary a:not(.button),html.theme--documenter-dark .docstring>section>a.notification.docs-sourcelink a:not(.button){color:#fff;text-decoration:underline}html.theme--documenter-dark .notification.is-link a:not(.button){color:#fff;text-decoration:underline}html.theme--documenter-dark .notification.is-info a:not(.button){color:#fff;text-decoration:underline}html.theme--documenter-dark .notification.is-success a:not(.button){color:#fff;text-decoration:underline}html.theme--documenter-dark .notification.is-warning a:not(.button){color:#fff;text-decoration:underline}html.theme--documenter-dark .notification.is-danger a:not(.button){color:#fff;text-decoration:underline}html.theme--documenter-dark .tag,html.theme--documenter-dark .content kbd,html.theme--documenter-dark .docstring>section>a.docs-sourcelink{border-radius:.4em}html.theme--documenter-dark .menu-list a{transition:all 300ms ease}html.theme--documenter-dark .modal-card-body{background-color:#282f2f}html.theme--documenter-dark .modal-card-foot,html.theme--documenter-dark .modal-card-head{border-color:#343c3d}html.theme--documenter-dark .message-header{font-weight:700;background-color:#343c3d;color:#fff}html.theme--documenter-dark .message-body{border-width:1px;border-color:#343c3d}html.theme--documenter-dark .navbar{border-radius:.4em}html.theme--documenter-dark .navbar.is-transparent{background:none}html.theme--documenter-dark .navbar.is-primary .navbar-dropdown a.navbar-item.is-active,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-dropdown a.navbar-item.is-active{background-color:#1abc9c}@media screen and (max-width: 1055px){html.theme--documenter-dark .navbar .navbar-menu{background-color:#375a7f;border-radius:0 0 .4em .4em}}html.theme--documenter-dark .hero .navbar,html.theme--documenter-dark body>.navbar{border-radius:0}html.theme--documenter-dark .pagination-link,html.theme--documenter-dark .pagination-next,html.theme--documenter-dark .pagination-previous{border-width:1px}html.theme--documenter-dark .panel-block,html.theme--documenter-dark .panel-heading,html.theme--documenter-dark .panel-tabs{border-width:1px}html.theme--documenter-dark .panel-block:first-child,html.theme--documenter-dark .panel-heading:first-child,html.theme--documenter-dark .panel-tabs:first-child{border-top-width:1px}html.theme--documenter-dark .panel-heading{font-weight:700}html.theme--documenter-dark .panel-tabs a{border-width:1px;margin-bottom:-1px}html.theme--documenter-dark .panel-tabs a.is-active{border-bottom-color:#17a689}html.theme--documenter-dark .panel-block:hover{color:#1dd2af}html.theme--documenter-dark .panel-block:hover .panel-icon{color:#1dd2af}html.theme--documenter-dark .panel-block.is-active .panel-icon{color:#17a689}html.theme--documenter-dark .tabs a{border-bottom-width:1px;margin-bottom:-1px}html.theme--documenter-dark .tabs ul{border-bottom-width:1px}html.theme--documenter-dark .tabs.is-boxed a{border-width:1px}html.theme--documenter-dark .tabs.is-boxed li.is-active a{background-color:#1f2424}html.theme--documenter-dark .tabs.is-toggle li a{border-width:1px;margin-bottom:0}html.theme--documenter-dark .tabs.is-toggle li+li{margin-left:-1px}html.theme--documenter-dark .hero.is-white .navbar .navbar-dropdown .navbar-item:hover{background-color:rgba(0,0,0,0)}html.theme--documenter-dark .hero.is-black .navbar .navbar-dropdown .navbar-item:hover{background-color:rgba(0,0,0,0)}html.theme--documenter-dark .hero.is-light .navbar .navbar-dropdown .navbar-item:hover{background-color:rgba(0,0,0,0)}html.theme--documenter-dark .hero.is-dark .navbar .navbar-dropdown .navbar-item:hover,html.theme--documenter-dark .content kbd.hero .navbar .navbar-dropdown .navbar-item:hover{background-color:rgba(0,0,0,0)}html.theme--documenter-dark .hero.is-primary .navbar .navbar-dropdown .navbar-item:hover,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .navbar .navbar-dropdown .navbar-item:hover{background-color:rgba(0,0,0,0)}html.theme--documenter-dark .hero.is-link .navbar .navbar-dropdown .navbar-item:hover{background-color:rgba(0,0,0,0)}html.theme--documenter-dark .hero.is-info .navbar .navbar-dropdown .navbar-item:hover{background-color:rgba(0,0,0,0)}html.theme--documenter-dark .hero.is-success .navbar .navbar-dropdown .navbar-item:hover{background-color:rgba(0,0,0,0)}html.theme--documenter-dark .hero.is-warning .navbar .navbar-dropdown .navbar-item:hover{background-color:rgba(0,0,0,0)}html.theme--documenter-dark .hero.is-danger .navbar .navbar-dropdown .navbar-item:hover{background-color:rgba(0,0,0,0)}html.theme--documenter-dark h1 .docs-heading-anchor,html.theme--documenter-dark h1 .docs-heading-anchor:hover,html.theme--documenter-dark h1 .docs-heading-anchor:visited,html.theme--documenter-dark h2 .docs-heading-anchor,html.theme--documenter-dark h2 .docs-heading-anchor:hover,html.theme--documenter-dark h2 .docs-heading-anchor:visited,html.theme--documenter-dark h3 .docs-heading-anchor,html.theme--documenter-dark h3 .docs-heading-anchor:hover,html.theme--documenter-dark h3 .docs-heading-anchor:visited,html.theme--documenter-dark h4 .docs-heading-anchor,html.theme--documenter-dark h4 .docs-heading-anchor:hover,html.theme--documenter-dark h4 .docs-heading-anchor:visited,html.theme--documenter-dark h5 .docs-heading-anchor,html.theme--documenter-dark h5 .docs-heading-anchor:hover,html.theme--documenter-dark h5 .docs-heading-anchor:visited,html.theme--documenter-dark h6 .docs-heading-anchor,html.theme--documenter-dark h6 .docs-heading-anchor:hover,html.theme--documenter-dark h6 .docs-heading-anchor:visited{color:#f2f2f2}html.theme--documenter-dark h1 .docs-heading-anchor-permalink,html.theme--documenter-dark h2 .docs-heading-anchor-permalink,html.theme--documenter-dark h3 .docs-heading-anchor-permalink,html.theme--documenter-dark h4 .docs-heading-anchor-permalink,html.theme--documenter-dark h5 .docs-heading-anchor-permalink,html.theme--documenter-dark h6 .docs-heading-anchor-permalink{visibility:hidden;vertical-align:middle;margin-left:0.5em;font-size:0.7rem}html.theme--documenter-dark h1 .docs-heading-anchor-permalink::before,html.theme--documenter-dark h2 .docs-heading-anchor-permalink::before,html.theme--documenter-dark h3 .docs-heading-anchor-permalink::before,html.theme--documenter-dark h4 .docs-heading-anchor-permalink::before,html.theme--documenter-dark h5 .docs-heading-anchor-permalink::before,html.theme--documenter-dark h6 .docs-heading-anchor-permalink::before{font-family:"Font Awesome 6 Free";font-weight:900;content:"\f0c1"}html.theme--documenter-dark h1:hover .docs-heading-anchor-permalink,html.theme--documenter-dark h2:hover .docs-heading-anchor-permalink,html.theme--documenter-dark h3:hover .docs-heading-anchor-permalink,html.theme--documenter-dark h4:hover .docs-heading-anchor-permalink,html.theme--documenter-dark h5:hover .docs-heading-anchor-permalink,html.theme--documenter-dark h6:hover .docs-heading-anchor-permalink{visibility:visible}html.theme--documenter-dark .docs-light-only{display:none !important}html.theme--documenter-dark pre{position:relative;overflow:hidden}html.theme--documenter-dark pre code,html.theme--documenter-dark pre code.hljs{padding:0 .75rem !important;overflow:auto;display:block}html.theme--documenter-dark pre code:first-of-type,html.theme--documenter-dark pre code.hljs:first-of-type{padding-top:0.5rem !important}html.theme--documenter-dark pre code:last-of-type,html.theme--documenter-dark pre code.hljs:last-of-type{padding-bottom:0.5rem !important}html.theme--documenter-dark pre .copy-button{opacity:0.2;transition:opacity 0.2s;position:absolute;right:0em;top:0em;padding:0.5em;width:2.5em;height:2.5em;background:transparent;border:none;font-family:"Font Awesome 6 Free";color:#fff;cursor:pointer;text-align:center}html.theme--documenter-dark pre .copy-button:focus,html.theme--documenter-dark pre .copy-button:hover{opacity:1;background:rgba(255,255,255,0.1);color:#1abc9c}html.theme--documenter-dark pre .copy-button.success{color:#259a12;opacity:1}html.theme--documenter-dark pre .copy-button.error{color:#cb3c33;opacity:1}html.theme--documenter-dark pre:hover .copy-button{opacity:1}html.theme--documenter-dark .admonition{background-color:#282f2f;border-style:solid;border-width:1px;border-color:#5e6d6f;border-radius:.4em;font-size:1rem}html.theme--documenter-dark .admonition strong{color:currentColor}html.theme--documenter-dark .admonition.is-small,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.admonition{font-size:.75rem}html.theme--documenter-dark .admonition.is-medium{font-size:1.25rem}html.theme--documenter-dark .admonition.is-large{font-size:1.5rem}html.theme--documenter-dark .admonition.is-default{background-color:#282f2f;border-color:#5e6d6f}html.theme--documenter-dark .admonition.is-default>.admonition-header{background-color:#5e6d6f;color:#fff}html.theme--documenter-dark .admonition.is-default>.admonition-body{color:#fff}html.theme--documenter-dark .admonition.is-info{background-color:#282f2f;border-color:#024c7d}html.theme--documenter-dark .admonition.is-info>.admonition-header{background-color:#024c7d;color:#fff}html.theme--documenter-dark .admonition.is-info>.admonition-body{color:#fff}html.theme--documenter-dark .admonition.is-success{background-color:#282f2f;border-color:#008438}html.theme--documenter-dark .admonition.is-success>.admonition-header{background-color:#008438;color:#fff}html.theme--documenter-dark .admonition.is-success>.admonition-body{color:#fff}html.theme--documenter-dark .admonition.is-warning{background-color:#282f2f;border-color:#ad8100}html.theme--documenter-dark .admonition.is-warning>.admonition-header{background-color:#ad8100;color:#fff}html.theme--documenter-dark .admonition.is-warning>.admonition-body{color:#fff}html.theme--documenter-dark .admonition.is-danger{background-color:#282f2f;border-color:#9e1b0d}html.theme--documenter-dark .admonition.is-danger>.admonition-header{background-color:#9e1b0d;color:#fff}html.theme--documenter-dark .admonition.is-danger>.admonition-body{color:#fff}html.theme--documenter-dark .admonition.is-compat{background-color:#282f2f;border-color:#137886}html.theme--documenter-dark .admonition.is-compat>.admonition-header{background-color:#137886;color:#fff}html.theme--documenter-dark .admonition.is-compat>.admonition-body{color:#fff}html.theme--documenter-dark .admonition-header{color:#fff;background-color:#5e6d6f;align-items:center;font-weight:700;justify-content:space-between;line-height:1.25;padding:0.5rem .75rem;position:relative}html.theme--documenter-dark .admonition-header:before{font-family:"Font Awesome 6 Free";font-weight:900;margin-right:.75rem;content:"\f06a"}html.theme--documenter-dark details.admonition.is-details>.admonition-header{list-style:none}html.theme--documenter-dark details.admonition.is-details>.admonition-header:before{font-family:"Font Awesome 6 Free";font-weight:900;content:"\f055"}html.theme--documenter-dark details.admonition.is-details[open]>.admonition-header:before{font-family:"Font Awesome 6 Free";font-weight:900;content:"\f056"}html.theme--documenter-dark .admonition-body{color:#fff;padding:0.5rem .75rem}html.theme--documenter-dark .admonition-body pre{background-color:#282f2f}html.theme--documenter-dark .admonition-body code{background-color:rgba(255,255,255,0.05)}html.theme--documenter-dark .docstring{margin-bottom:1em;background-color:rgba(0,0,0,0);border:1px solid #5e6d6f;box-shadow:none;max-width:100%}html.theme--documenter-dark .docstring>header{cursor:pointer;display:flex;flex-grow:1;align-items:stretch;padding:0.5rem .75rem;background-color:#282f2f;box-shadow:0 0.125em 0.25em rgba(10,10,10,0.1);box-shadow:none;border-bottom:1px solid #5e6d6f;overflow:auto}html.theme--documenter-dark .docstring>header code{background-color:transparent}html.theme--documenter-dark .docstring>header .docstring-article-toggle-button{min-width:1.1rem;padding:0.2rem 0.2rem 0.2rem 0}html.theme--documenter-dark .docstring>header .docstring-binding{margin-right:0.3em}html.theme--documenter-dark .docstring>header .docstring-category{margin-left:0.3em}html.theme--documenter-dark .docstring>section{position:relative;padding:.75rem .75rem;border-bottom:1px solid #5e6d6f}html.theme--documenter-dark .docstring>section:last-child{border-bottom:none}html.theme--documenter-dark .docstring>section>a.docs-sourcelink{transition:opacity 0.3s;opacity:0;position:absolute;right:.375rem;bottom:.375rem}html.theme--documenter-dark .docstring>section>a.docs-sourcelink:focus{opacity:1 !important}html.theme--documenter-dark .docstring:hover>section>a.docs-sourcelink{opacity:0.2}html.theme--documenter-dark .docstring:focus-within>section>a.docs-sourcelink{opacity:0.2}html.theme--documenter-dark .docstring>section:hover a.docs-sourcelink{opacity:1}html.theme--documenter-dark .documenter-example-output{background-color:#1f2424}html.theme--documenter-dark .outdated-warning-overlay{position:fixed;top:0;left:0;right:0;box-shadow:0 0 10px rgba(0,0,0,0.3);z-index:999;background-color:#282f2f;color:#fff;border-bottom:3px solid #9e1b0d;padding:10px 35px;text-align:center;font-size:15px}html.theme--documenter-dark .outdated-warning-overlay .outdated-warning-closer{position:absolute;top:calc(50% - 10px);right:18px;cursor:pointer;width:12px}html.theme--documenter-dark .outdated-warning-overlay a{color:#1abc9c}html.theme--documenter-dark .outdated-warning-overlay a:hover{color:#1dd2af}html.theme--documenter-dark .content pre{border:1px solid #5e6d6f}html.theme--documenter-dark .content code{font-weight:inherit}html.theme--documenter-dark .content a code{color:#1abc9c}html.theme--documenter-dark .content h1 code,html.theme--documenter-dark .content h2 code,html.theme--documenter-dark .content h3 code,html.theme--documenter-dark .content h4 code,html.theme--documenter-dark .content h5 code,html.theme--documenter-dark .content h6 code{color:#f2f2f2}html.theme--documenter-dark .content table{display:block;width:initial;max-width:100%;overflow-x:auto}html.theme--documenter-dark .content blockquote>ul:first-child,html.theme--documenter-dark .content blockquote>ol:first-child,html.theme--documenter-dark .content .admonition-body>ul:first-child,html.theme--documenter-dark .content .admonition-body>ol:first-child{margin-top:0}html.theme--documenter-dark pre,html.theme--documenter-dark code{font-variant-ligatures:no-contextual}html.theme--documenter-dark .breadcrumb a.is-disabled{cursor:default;pointer-events:none}html.theme--documenter-dark .breadcrumb a.is-disabled,html.theme--documenter-dark .breadcrumb a.is-disabled:hover{color:#f2f2f2}html.theme--documenter-dark .hljs{background:initial !important}html.theme--documenter-dark .katex .katex-mathml{top:0;right:0}html.theme--documenter-dark .katex-display,html.theme--documenter-dark mjx-container,html.theme--documenter-dark .MathJax_Display{margin:0.5em 0 !important}html.theme--documenter-dark html{-moz-osx-font-smoothing:auto;-webkit-font-smoothing:auto}html.theme--documenter-dark li.no-marker{list-style:none}html.theme--documenter-dark #documenter .docs-main>article{overflow-wrap:break-word}html.theme--documenter-dark #documenter .docs-main>article .math-container{overflow-x:auto;overflow-y:hidden}@media screen and (min-width: 1056px){html.theme--documenter-dark #documenter .docs-main{max-width:52rem;margin-left:20rem;padding-right:1rem}}@media screen and (max-width: 1055px){html.theme--documenter-dark #documenter .docs-main{width:100%}html.theme--documenter-dark #documenter .docs-main>article{max-width:52rem;margin-left:auto;margin-right:auto;margin-bottom:1rem;padding:0 1rem}html.theme--documenter-dark #documenter .docs-main>header,html.theme--documenter-dark #documenter .docs-main>nav{max-width:100%;width:100%;margin:0}}html.theme--documenter-dark #documenter .docs-main header.docs-navbar{background-color:#1f2424;border-bottom:1px solid #5e6d6f;z-index:2;min-height:4rem;margin-bottom:1rem;display:flex}html.theme--documenter-dark #documenter .docs-main header.docs-navbar .breadcrumb{flex-grow:1;overflow-x:hidden}html.theme--documenter-dark #documenter .docs-main header.docs-navbar .docs-sidebar-button{display:block;font-size:1.5rem;padding-bottom:0.1rem;margin-right:1rem}html.theme--documenter-dark #documenter .docs-main header.docs-navbar .docs-right{display:flex;white-space:nowrap;gap:1rem;align-items:center}html.theme--documenter-dark #documenter .docs-main header.docs-navbar .docs-right .docs-icon,html.theme--documenter-dark #documenter .docs-main header.docs-navbar .docs-right .docs-label{display:inline-block}html.theme--documenter-dark #documenter .docs-main header.docs-navbar .docs-right .docs-label{padding:0;margin-left:0.3em}@media screen and (max-width: 1055px){html.theme--documenter-dark #documenter .docs-main header.docs-navbar .docs-right .docs-navbar-link{margin-left:0.4rem;margin-right:0.4rem}}html.theme--documenter-dark #documenter .docs-main header.docs-navbar>*{margin:auto 0}@media screen and (max-width: 1055px){html.theme--documenter-dark #documenter .docs-main header.docs-navbar{position:sticky;top:0;padding:0 1rem;transition-property:top, box-shadow;-webkit-transition-property:top, box-shadow;transition-duration:0.3s;-webkit-transition-duration:0.3s}html.theme--documenter-dark #documenter .docs-main header.docs-navbar.headroom--not-top{box-shadow:.2rem 0rem .4rem #171717;transition-duration:0.7s;-webkit-transition-duration:0.7s}html.theme--documenter-dark #documenter .docs-main header.docs-navbar.headroom--unpinned.headroom--not-top.headroom--not-bottom{top:-4.5rem;transition-duration:0.7s;-webkit-transition-duration:0.7s}}html.theme--documenter-dark #documenter .docs-main section.footnotes{border-top:1px solid #5e6d6f}html.theme--documenter-dark #documenter .docs-main section.footnotes li .tag:first-child,html.theme--documenter-dark #documenter .docs-main section.footnotes li .docstring>section>a.docs-sourcelink:first-child,html.theme--documenter-dark #documenter .docs-main section.footnotes li .content kbd:first-child,html.theme--documenter-dark .content #documenter .docs-main section.footnotes li kbd:first-child{margin-right:1em;margin-bottom:0.4em}html.theme--documenter-dark #documenter .docs-main .docs-footer{display:flex;flex-wrap:wrap;margin-left:0;margin-right:0;border-top:1px solid #5e6d6f;padding-top:1rem;padding-bottom:1rem}@media screen and (max-width: 1055px){html.theme--documenter-dark #documenter .docs-main .docs-footer{padding-left:1rem;padding-right:1rem}}html.theme--documenter-dark #documenter .docs-main .docs-footer .docs-footer-nextpage,html.theme--documenter-dark #documenter .docs-main .docs-footer .docs-footer-prevpage{flex-grow:1}html.theme--documenter-dark #documenter .docs-main .docs-footer .docs-footer-nextpage{text-align:right}html.theme--documenter-dark #documenter .docs-main .docs-footer .flexbox-break{flex-basis:100%;height:0}html.theme--documenter-dark #documenter .docs-main .docs-footer .footer-message{font-size:0.8em;margin:0.5em auto 0 auto;text-align:center}html.theme--documenter-dark #documenter .docs-sidebar{display:flex;flex-direction:column;color:#fff;background-color:#282f2f;border-right:1px solid #5e6d6f;padding:0;flex:0 0 18rem;z-index:5;font-size:1rem;position:fixed;left:-18rem;width:18rem;height:100%;transition:left 0.3s}html.theme--documenter-dark #documenter .docs-sidebar.visible{left:0;box-shadow:.4rem 0rem .8rem #171717}@media screen and (min-width: 1056px){html.theme--documenter-dark #documenter .docs-sidebar.visible{box-shadow:none}}@media screen and (min-width: 1056px){html.theme--documenter-dark #documenter .docs-sidebar{left:0;top:0}}html.theme--documenter-dark #documenter .docs-sidebar .docs-logo{margin-top:1rem;padding:0 1rem}html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img{max-height:6rem;margin:auto}html.theme--documenter-dark #documenter .docs-sidebar .docs-package-name{flex-shrink:0;font-size:1.5rem;font-weight:700;text-align:center;white-space:nowrap;overflow:hidden;padding:0.5rem 0}html.theme--documenter-dark #documenter .docs-sidebar .docs-package-name .docs-autofit{max-width:16.2rem}html.theme--documenter-dark #documenter .docs-sidebar .docs-package-name a,html.theme--documenter-dark #documenter .docs-sidebar .docs-package-name a:hover{color:#fff}html.theme--documenter-dark #documenter .docs-sidebar .docs-version-selector{border-top:1px solid #5e6d6f;display:none;padding:0.5rem}html.theme--documenter-dark #documenter .docs-sidebar .docs-version-selector.visible{display:flex}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu{flex-grow:1;user-select:none;border-top:1px solid #5e6d6f;padding-bottom:1.5rem}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu>li>.tocitem{font-weight:bold}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu>li li{font-size:.95rem;margin-left:1em;border-left:1px solid #5e6d6f}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu input.collapse-toggle{display:none}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu ul.collapsed{display:none}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu input:checked~ul.collapsed{display:block}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu label.tocitem{display:flex}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu label.tocitem .docs-label{flex-grow:2}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu label.tocitem .docs-chevron{display:inline-block;font-style:normal;font-variant:normal;text-rendering:auto;line-height:1;font-size:.75rem;margin-left:1rem;margin-top:auto;margin-bottom:auto}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu label.tocitem .docs-chevron::before{font-family:"Font Awesome 6 Free";font-weight:900;content:"\f054"}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu input:checked~label.tocitem .docs-chevron::before{content:"\f078"}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu .tocitem{display:block;padding:0.5rem 0.5rem}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu .tocitem,html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu .tocitem:hover{color:#fff;background:#282f2f}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu a.tocitem:hover,html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu label.tocitem:hover{color:#fff;background-color:#32393a}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu li.is-active{border-top:1px solid #5e6d6f;border-bottom:1px solid #5e6d6f;background-color:#1f2424}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu li.is-active .tocitem,html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu li.is-active .tocitem:hover{background-color:#1f2424;color:#fff}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu li.is-active ul.internal .tocitem:hover{background-color:#32393a;color:#fff}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu>li.is-active:first-child{border-top:none}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu ul.internal{margin:0 0.5rem 0.5rem;border-top:1px solid #5e6d6f}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu ul.internal li{font-size:.85rem;border-left:none;margin-left:0;margin-top:0.5rem}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu ul.internal .tocitem{width:100%;padding:0}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu ul.internal .tocitem::before{content:"⚬";margin-right:0.4em}html.theme--documenter-dark #documenter .docs-sidebar form.docs-search{margin:auto;margin-top:0.5rem;margin-bottom:0.5rem}html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input{width:14.4rem}html.theme--documenter-dark #documenter .docs-sidebar #documenter-search-query{color:#868c98;width:14.4rem;box-shadow:inset 0 1px 2px rgba(10,10,10,0.1)}@media screen and (min-width: 1056px){html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu{overflow-y:auto;-webkit-overflow-scroll:touch}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu::-webkit-scrollbar{width:.3rem;background:none}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu::-webkit-scrollbar-thumb{border-radius:5px 0px 0px 5px;background:#3b4445}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu::-webkit-scrollbar-thumb:hover{background:#4e5a5c}}@media screen and (max-width: 1055px){html.theme--documenter-dark #documenter .docs-sidebar{overflow-y:auto;-webkit-overflow-scroll:touch}html.theme--documenter-dark #documenter .docs-sidebar::-webkit-scrollbar{width:.3rem;background:none}html.theme--documenter-dark #documenter .docs-sidebar::-webkit-scrollbar-thumb{border-radius:5px 0px 0px 5px;background:#3b4445}html.theme--documenter-dark #documenter .docs-sidebar::-webkit-scrollbar-thumb:hover{background:#4e5a5c}}html.theme--documenter-dark kbd.search-modal-key-hints{border-radius:0.25rem;border:1px solid rgba(245,245,245,0.6);box-shadow:0 2px 0 1px rgba(245,245,245,0.6);cursor:default;font-size:0.9rem;line-height:1.5;min-width:0.75rem;text-align:center;padding:0.1rem 0.3rem;position:relative;top:-1px}html.theme--documenter-dark .search-min-width-50{min-width:50%}html.theme--documenter-dark .search-min-height-100{min-height:100%}html.theme--documenter-dark .search-modal-card-body{max-height:calc(100vh - 15rem)}html.theme--documenter-dark .search-result-link{border-radius:0.7em;transition:all 300ms}html.theme--documenter-dark .search-result-link:hover,html.theme--documenter-dark .search-result-link:focus{background-color:rgba(0,128,128,0.1)}html.theme--documenter-dark .search-result-link .property-search-result-badge,html.theme--documenter-dark .search-result-link .search-filter{transition:all 300ms}html.theme--documenter-dark .property-search-result-badge,html.theme--documenter-dark .search-filter{padding:0.15em 0.5em;font-size:0.8em;font-style:italic;text-transform:none !important;line-height:1.5;color:#f5f5f5;background-color:rgba(51,65,85,0.501961);border-radius:0.6rem}html.theme--documenter-dark .search-result-link:hover .property-search-result-badge,html.theme--documenter-dark .search-result-link:hover .search-filter,html.theme--documenter-dark .search-result-link:focus .property-search-result-badge,html.theme--documenter-dark .search-result-link:focus .search-filter{color:#333;background-color:#f1f5f9}html.theme--documenter-dark .search-filter{color:#333;background-color:#f5f5f5;transition:all 300ms}html.theme--documenter-dark .search-filter:hover,html.theme--documenter-dark .search-filter:focus{color:#333}html.theme--documenter-dark .search-filter-selected{color:#f5f5f5;background-color:rgba(139,0,139,0.5)}html.theme--documenter-dark .search-filter-selected:hover,html.theme--documenter-dark .search-filter-selected:focus{color:#f5f5f5}html.theme--documenter-dark .search-result-highlight{background-color:#ffdd57;color:black}html.theme--documenter-dark .search-divider{border-bottom:1px solid #5e6d6f}html.theme--documenter-dark .search-result-title{width:85%;color:#f5f5f5}html.theme--documenter-dark .search-result-code-title{font-size:0.875rem;font-family:"JuliaMono","SFMono-Regular","Menlo","Consolas","Liberation Mono","DejaVu Sans Mono",monospace}html.theme--documenter-dark #search-modal .modal-card-body::-webkit-scrollbar,html.theme--documenter-dark #search-modal .filter-tabs::-webkit-scrollbar{height:10px;width:10px;background-color:transparent}html.theme--documenter-dark #search-modal .modal-card-body::-webkit-scrollbar-thumb,html.theme--documenter-dark #search-modal .filter-tabs::-webkit-scrollbar-thumb{background-color:gray;border-radius:1rem}html.theme--documenter-dark #search-modal .modal-card-body::-webkit-scrollbar-track,html.theme--documenter-dark #search-modal .filter-tabs::-webkit-scrollbar-track{-webkit-box-shadow:inset 0 0 6px rgba(0,0,0,0.6);background-color:transparent}html.theme--documenter-dark .w-100{width:100%}html.theme--documenter-dark .gap-2{gap:0.5rem}html.theme--documenter-dark .gap-4{gap:1rem}html.theme--documenter-dark .gap-8{gap:2rem}html.theme--documenter-dark{background-color:#1f2424;font-size:16px;min-width:300px;overflow-x:auto;overflow-y:scroll;text-rendering:optimizeLegibility;text-size-adjust:100%}html.theme--documenter-dark .ansi span.sgr1{font-weight:bolder}html.theme--documenter-dark .ansi span.sgr2{font-weight:lighter}html.theme--documenter-dark .ansi span.sgr3{font-style:italic}html.theme--documenter-dark .ansi span.sgr4{text-decoration:underline}html.theme--documenter-dark .ansi span.sgr7{color:#1f2424;background-color:#fff}html.theme--documenter-dark .ansi span.sgr8{color:transparent}html.theme--documenter-dark .ansi span.sgr8 span{color:transparent}html.theme--documenter-dark .ansi span.sgr9{text-decoration:line-through}html.theme--documenter-dark .ansi span.sgr30{color:#242424}html.theme--documenter-dark .ansi span.sgr31{color:#f6705f}html.theme--documenter-dark .ansi span.sgr32{color:#4fb43a}html.theme--documenter-dark .ansi span.sgr33{color:#f4c72f}html.theme--documenter-dark .ansi span.sgr34{color:#7587f0}html.theme--documenter-dark .ansi span.sgr35{color:#bc89d3}html.theme--documenter-dark .ansi span.sgr36{color:#49b6ca}html.theme--documenter-dark .ansi span.sgr37{color:#b3bdbe}html.theme--documenter-dark .ansi span.sgr40{background-color:#242424}html.theme--documenter-dark .ansi span.sgr41{background-color:#f6705f}html.theme--documenter-dark .ansi span.sgr42{background-color:#4fb43a}html.theme--documenter-dark .ansi span.sgr43{background-color:#f4c72f}html.theme--documenter-dark .ansi span.sgr44{background-color:#7587f0}html.theme--documenter-dark .ansi span.sgr45{background-color:#bc89d3}html.theme--documenter-dark .ansi span.sgr46{background-color:#49b6ca}html.theme--documenter-dark .ansi span.sgr47{background-color:#b3bdbe}html.theme--documenter-dark .ansi span.sgr90{color:#92a0a2}html.theme--documenter-dark .ansi span.sgr91{color:#ff8674}html.theme--documenter-dark .ansi span.sgr92{color:#79d462}html.theme--documenter-dark .ansi span.sgr93{color:#ffe76b}html.theme--documenter-dark .ansi span.sgr94{color:#8a98ff}html.theme--documenter-dark .ansi span.sgr95{color:#d2a4e6}html.theme--documenter-dark .ansi span.sgr96{color:#6bc8db}html.theme--documenter-dark .ansi span.sgr97{color:#ecf0f1}html.theme--documenter-dark .ansi span.sgr100{background-color:#92a0a2}html.theme--documenter-dark .ansi span.sgr101{background-color:#ff8674}html.theme--documenter-dark .ansi span.sgr102{background-color:#79d462}html.theme--documenter-dark .ansi span.sgr103{background-color:#ffe76b}html.theme--documenter-dark .ansi span.sgr104{background-color:#8a98ff}html.theme--documenter-dark .ansi span.sgr105{background-color:#d2a4e6}html.theme--documenter-dark .ansi span.sgr106{background-color:#6bc8db}html.theme--documenter-dark .ansi span.sgr107{background-color:#ecf0f1}html.theme--documenter-dark code.language-julia-repl>span.hljs-meta{color:#4fb43a;font-weight:bolder}html.theme--documenter-dark .hljs{background:#2b2b2b;color:#f8f8f2}html.theme--documenter-dark .hljs-comment,html.theme--documenter-dark .hljs-quote{color:#d4d0ab}html.theme--documenter-dark .hljs-variable,html.theme--documenter-dark .hljs-template-variable,html.theme--documenter-dark .hljs-tag,html.theme--documenter-dark .hljs-name,html.theme--documenter-dark .hljs-selector-id,html.theme--documenter-dark .hljs-selector-class,html.theme--documenter-dark .hljs-regexp,html.theme--documenter-dark .hljs-deletion{color:#ffa07a}html.theme--documenter-dark .hljs-number,html.theme--documenter-dark .hljs-built_in,html.theme--documenter-dark .hljs-literal,html.theme--documenter-dark .hljs-type,html.theme--documenter-dark .hljs-params,html.theme--documenter-dark .hljs-meta,html.theme--documenter-dark .hljs-link{color:#f5ab35}html.theme--documenter-dark .hljs-attribute{color:#ffd700}html.theme--documenter-dark .hljs-string,html.theme--documenter-dark .hljs-symbol,html.theme--documenter-dark .hljs-bullet,html.theme--documenter-dark .hljs-addition{color:#abe338}html.theme--documenter-dark .hljs-title,html.theme--documenter-dark .hljs-section{color:#00e0e0}html.theme--documenter-dark .hljs-keyword,html.theme--documenter-dark .hljs-selector-tag{color:#dcc6e0}html.theme--documenter-dark .hljs-emphasis{font-style:italic}html.theme--documenter-dark .hljs-strong{font-weight:bold}@media screen and (-ms-high-contrast: active){html.theme--documenter-dark .hljs-addition,html.theme--documenter-dark .hljs-attribute,html.theme--documenter-dark .hljs-built_in,html.theme--documenter-dark .hljs-bullet,html.theme--documenter-dark .hljs-comment,html.theme--documenter-dark .hljs-link,html.theme--documenter-dark .hljs-literal,html.theme--documenter-dark .hljs-meta,html.theme--documenter-dark .hljs-number,html.theme--documenter-dark .hljs-params,html.theme--documenter-dark .hljs-string,html.theme--documenter-dark .hljs-symbol,html.theme--documenter-dark .hljs-type,html.theme--documenter-dark .hljs-quote{color:highlight}html.theme--documenter-dark .hljs-keyword,html.theme--documenter-dark .hljs-selector-tag{font-weight:bold}}html.theme--documenter-dark .hljs-subst{color:#f8f8f2}html.theme--documenter-dark .search-result-link{border-radius:0.7em;transition:all 300ms}html.theme--documenter-dark .search-result-link:hover,html.theme--documenter-dark .search-result-link:focus{background-color:rgba(0,128,128,0.1)}html.theme--documenter-dark .search-result-link .property-search-result-badge,html.theme--documenter-dark .search-result-link .search-filter{transition:all 300ms}html.theme--documenter-dark .search-result-link:hover .property-search-result-badge,html.theme--documenter-dark .search-result-link:hover .search-filter,html.theme--documenter-dark .search-result-link:focus .property-search-result-badge,html.theme--documenter-dark .search-result-link:focus .search-filter{color:#333 !important;background-color:#f1f5f9 !important}html.theme--documenter-dark .property-search-result-badge,html.theme--documenter-dark .search-filter{padding:0.15em 0.5em;font-size:0.8em;font-style:italic;text-transform:none !important;line-height:1.5;color:whitesmoke;background-color:#33415580;border-radius:0.6rem}html.theme--documenter-dark .search-result-title{color:whitesmoke}html.theme--documenter-dark .search-result-highlight{background-color:greenyellow;color:black}html.theme--documenter-dark .search-divider{border-bottom:1px solid #5e6d6f50}html.theme--documenter-dark .w-100{width:100%}html.theme--documenter-dark .gap-2{gap:0.5rem}html.theme--documenter-dark .gap-4{gap:1rem} diff --git a/v1.7.3/assets/themes/documenter-light.css b/v1.7.3/assets/themes/documenter-light.css new file mode 100644 index 000000000..2f168c77b --- /dev/null +++ b/v1.7.3/assets/themes/documenter-light.css @@ -0,0 +1,9 @@ +.pagination-previous,.pagination-next,.pagination-link,.pagination-ellipsis,.file-cta,.file-name,.select select,.textarea,.input,#documenter .docs-sidebar form.docs-search>input,.button{-moz-appearance:none;-webkit-appearance:none;align-items:center;border:1px solid transparent;border-radius:4px;box-shadow:none;display:inline-flex;font-size:1rem;height:2.5em;justify-content:flex-start;line-height:1.5;padding-bottom:calc(0.5em - 1px);padding-left:calc(0.75em - 1px);padding-right:calc(0.75em - 1px);padding-top:calc(0.5em - 1px);position:relative;vertical-align:top}.pagination-previous:focus,.pagination-next:focus,.pagination-link:focus,.pagination-ellipsis:focus,.file-cta:focus,.file-name:focus,.select select:focus,.textarea:focus,.input:focus,#documenter .docs-sidebar form.docs-search>input:focus,.button:focus,.is-focused.pagination-previous,.is-focused.pagination-next,.is-focused.pagination-link,.is-focused.pagination-ellipsis,.is-focused.file-cta,.is-focused.file-name,.select select.is-focused,.is-focused.textarea,.is-focused.input,#documenter .docs-sidebar form.docs-search>input.is-focused,.is-focused.button,.pagination-previous:active,.pagination-next:active,.pagination-link:active,.pagination-ellipsis:active,.file-cta:active,.file-name:active,.select select:active,.textarea:active,.input:active,#documenter .docs-sidebar form.docs-search>input:active,.button:active,.is-active.pagination-previous,.is-active.pagination-next,.is-active.pagination-link,.is-active.pagination-ellipsis,.is-active.file-cta,.is-active.file-name,.select select.is-active,.is-active.textarea,.is-active.input,#documenter .docs-sidebar form.docs-search>input.is-active,.is-active.button{outline:none}.pagination-previous[disabled],.pagination-next[disabled],.pagination-link[disabled],.pagination-ellipsis[disabled],.file-cta[disabled],.file-name[disabled],.select select[disabled],.textarea[disabled],.input[disabled],#documenter .docs-sidebar form.docs-search>input[disabled],.button[disabled],fieldset[disabled] .pagination-previous,fieldset[disabled] .pagination-next,fieldset[disabled] .pagination-link,fieldset[disabled] .pagination-ellipsis,fieldset[disabled] .file-cta,fieldset[disabled] .file-name,fieldset[disabled] .select select,.select fieldset[disabled] select,fieldset[disabled] .textarea,fieldset[disabled] .input,fieldset[disabled] #documenter .docs-sidebar form.docs-search>input,#documenter .docs-sidebar fieldset[disabled] form.docs-search>input,fieldset[disabled] .button{cursor:not-allowed}.tabs,.pagination-previous,.pagination-next,.pagination-link,.pagination-ellipsis,.breadcrumb,.file,.button,.is-unselectable{-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.navbar-link:not(.is-arrowless)::after,.select:not(.is-multiple):not(.is-loading)::after{border:3px solid rgba(0,0,0,0);border-radius:2px;border-right:0;border-top:0;content:" ";display:block;height:0.625em;margin-top:-0.4375em;pointer-events:none;position:absolute;top:50%;transform:rotate(-45deg);transform-origin:center;width:0.625em}.admonition:not(:last-child),.tabs:not(:last-child),.pagination:not(:last-child),.message:not(:last-child),.level:not(:last-child),.breadcrumb:not(:last-child),.block:not(:last-child),.title:not(:last-child),.subtitle:not(:last-child),.table-container:not(:last-child),.table:not(:last-child),.progress:not(:last-child),.notification:not(:last-child),.content:not(:last-child),.box:not(:last-child){margin-bottom:1.5rem}.modal-close,.delete{-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-moz-appearance:none;-webkit-appearance:none;background-color:rgba(10,10,10,0.2);border:none;border-radius:9999px;cursor:pointer;pointer-events:auto;display:inline-block;flex-grow:0;flex-shrink:0;font-size:0;height:20px;max-height:20px;max-width:20px;min-height:20px;min-width:20px;outline:none;position:relative;vertical-align:top;width:20px}.modal-close::before,.delete::before,.modal-close::after,.delete::after{background-color:#fff;content:"";display:block;left:50%;position:absolute;top:50%;transform:translateX(-50%) translateY(-50%) rotate(45deg);transform-origin:center center}.modal-close::before,.delete::before{height:2px;width:50%}.modal-close::after,.delete::after{height:50%;width:2px}.modal-close:hover,.delete:hover,.modal-close:focus,.delete:focus{background-color:rgba(10,10,10,0.3)}.modal-close:active,.delete:active{background-color:rgba(10,10,10,0.4)}.is-small.modal-close,#documenter .docs-sidebar form.docs-search>input.modal-close,.is-small.delete,#documenter .docs-sidebar form.docs-search>input.delete{height:16px;max-height:16px;max-width:16px;min-height:16px;min-width:16px;width:16px}.is-medium.modal-close,.is-medium.delete{height:24px;max-height:24px;max-width:24px;min-height:24px;min-width:24px;width:24px}.is-large.modal-close,.is-large.delete{height:32px;max-height:32px;max-width:32px;min-height:32px;min-width:32px;width:32px}.control.is-loading::after,.select.is-loading::after,.loader,.button.is-loading::after{animation:spinAround 500ms infinite linear;border:2px solid #dbdbdb;border-radius:9999px;border-right-color:transparent;border-top-color:transparent;content:"";display:block;height:1em;position:relative;width:1em}.hero-video,.modal-background,.modal,.image.is-square img,#documenter .docs-sidebar .docs-logo>img.is-square img,.image.is-square .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-square .has-ratio,.image.is-1by1 img,#documenter .docs-sidebar .docs-logo>img.is-1by1 img,.image.is-1by1 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-1by1 .has-ratio,.image.is-5by4 img,#documenter .docs-sidebar .docs-logo>img.is-5by4 img,.image.is-5by4 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-5by4 .has-ratio,.image.is-4by3 img,#documenter .docs-sidebar .docs-logo>img.is-4by3 img,.image.is-4by3 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-4by3 .has-ratio,.image.is-3by2 img,#documenter .docs-sidebar .docs-logo>img.is-3by2 img,.image.is-3by2 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-3by2 .has-ratio,.image.is-5by3 img,#documenter .docs-sidebar .docs-logo>img.is-5by3 img,.image.is-5by3 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-5by3 .has-ratio,.image.is-16by9 img,#documenter .docs-sidebar .docs-logo>img.is-16by9 img,.image.is-16by9 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-16by9 .has-ratio,.image.is-2by1 img,#documenter .docs-sidebar .docs-logo>img.is-2by1 img,.image.is-2by1 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-2by1 .has-ratio,.image.is-3by1 img,#documenter .docs-sidebar .docs-logo>img.is-3by1 img,.image.is-3by1 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-3by1 .has-ratio,.image.is-4by5 img,#documenter .docs-sidebar .docs-logo>img.is-4by5 img,.image.is-4by5 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-4by5 .has-ratio,.image.is-3by4 img,#documenter .docs-sidebar .docs-logo>img.is-3by4 img,.image.is-3by4 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-3by4 .has-ratio,.image.is-2by3 img,#documenter .docs-sidebar .docs-logo>img.is-2by3 img,.image.is-2by3 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-2by3 .has-ratio,.image.is-3by5 img,#documenter .docs-sidebar .docs-logo>img.is-3by5 img,.image.is-3by5 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-3by5 .has-ratio,.image.is-9by16 img,#documenter .docs-sidebar .docs-logo>img.is-9by16 img,.image.is-9by16 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-9by16 .has-ratio,.image.is-1by2 img,#documenter .docs-sidebar .docs-logo>img.is-1by2 img,.image.is-1by2 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-1by2 .has-ratio,.image.is-1by3 img,#documenter .docs-sidebar .docs-logo>img.is-1by3 img,.image.is-1by3 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-1by3 .has-ratio,.is-overlay{bottom:0;left:0;position:absolute;right:0;top:0}.navbar-burger{-moz-appearance:none;-webkit-appearance:none;appearance:none;background:none;border:none;color:currentColor;font-family:inherit;font-size:1em;margin:0;padding:0}.has-text-white{color:#fff !important}a.has-text-white:hover,a.has-text-white:focus{color:#e6e6e6 !important}.has-background-white{background-color:#fff !important}.has-text-black{color:#0a0a0a !important}a.has-text-black:hover,a.has-text-black:focus{color:#000 !important}.has-background-black{background-color:#0a0a0a !important}.has-text-light{color:#f5f5f5 !important}a.has-text-light:hover,a.has-text-light:focus{color:#dbdbdb !important}.has-background-light{background-color:#f5f5f5 !important}.has-text-dark{color:#363636 !important}a.has-text-dark:hover,a.has-text-dark:focus{color:#1c1c1c !important}.has-background-dark{background-color:#363636 !important}.has-text-primary{color:#4eb5de !important}a.has-text-primary:hover,a.has-text-primary:focus{color:#27a1d2 !important}.has-background-primary{background-color:#4eb5de !important}.has-text-primary-light{color:#eef8fc !important}a.has-text-primary-light:hover,a.has-text-primary-light:focus{color:#c3e6f4 !important}.has-background-primary-light{background-color:#eef8fc !important}.has-text-primary-dark{color:#1a6d8e !important}a.has-text-primary-dark:hover,a.has-text-primary-dark:focus{color:#228eb9 !important}.has-background-primary-dark{background-color:#1a6d8e !important}.has-text-link{color:#2e63b8 !important}a.has-text-link:hover,a.has-text-link:focus{color:#244d8f !important}.has-background-link{background-color:#2e63b8 !important}.has-text-link-light{color:#eff3fb !important}a.has-text-link-light:hover,a.has-text-link-light:focus{color:#c6d6f1 !important}.has-background-link-light{background-color:#eff3fb !important}.has-text-link-dark{color:#3169c4 !important}a.has-text-link-dark:hover,a.has-text-link-dark:focus{color:#5485d4 !important}.has-background-link-dark{background-color:#3169c4 !important}.has-text-info{color:#209cee !important}a.has-text-info:hover,a.has-text-info:focus{color:#1081cb !important}.has-background-info{background-color:#209cee !important}.has-text-info-light{color:#ecf7fe !important}a.has-text-info-light:hover,a.has-text-info-light:focus{color:#bde2fa !important}.has-background-info-light{background-color:#ecf7fe !important}.has-text-info-dark{color:#0e72b4 !important}a.has-text-info-dark:hover,a.has-text-info-dark:focus{color:#1190e3 !important}.has-background-info-dark{background-color:#0e72b4 !important}.has-text-success{color:#22c35b !important}a.has-text-success:hover,a.has-text-success:focus{color:#1a9847 !important}.has-background-success{background-color:#22c35b !important}.has-text-success-light{color:#eefcf3 !important}a.has-text-success-light:hover,a.has-text-success-light:focus{color:#c2f4d4 !important}.has-background-success-light{background-color:#eefcf3 !important}.has-text-success-dark{color:#198f43 !important}a.has-text-success-dark:hover,a.has-text-success-dark:focus{color:#21bb57 !important}.has-background-success-dark{background-color:#198f43 !important}.has-text-warning{color:#ffdd57 !important}a.has-text-warning:hover,a.has-text-warning:focus{color:#ffd324 !important}.has-background-warning{background-color:#ffdd57 !important}.has-text-warning-light{color:#fffbeb !important}a.has-text-warning-light:hover,a.has-text-warning-light:focus{color:#fff1b8 !important}.has-background-warning-light{background-color:#fffbeb !important}.has-text-warning-dark{color:#947600 !important}a.has-text-warning-dark:hover,a.has-text-warning-dark:focus{color:#c79f00 !important}.has-background-warning-dark{background-color:#947600 !important}.has-text-danger{color:#da0b00 !important}a.has-text-danger:hover,a.has-text-danger:focus{color:#a70800 !important}.has-background-danger{background-color:#da0b00 !important}.has-text-danger-light{color:#ffeceb !important}a.has-text-danger-light:hover,a.has-text-danger-light:focus{color:#ffbbb8 !important}.has-background-danger-light{background-color:#ffeceb !important}.has-text-danger-dark{color:#f50c00 !important}a.has-text-danger-dark:hover,a.has-text-danger-dark:focus{color:#ff3429 !important}.has-background-danger-dark{background-color:#f50c00 !important}.has-text-black-bis{color:#121212 !important}.has-background-black-bis{background-color:#121212 !important}.has-text-black-ter{color:#242424 !important}.has-background-black-ter{background-color:#242424 !important}.has-text-grey-darker{color:#363636 !important}.has-background-grey-darker{background-color:#363636 !important}.has-text-grey-dark{color:#4a4a4a !important}.has-background-grey-dark{background-color:#4a4a4a !important}.has-text-grey{color:#6b6b6b !important}.has-background-grey{background-color:#6b6b6b !important}.has-text-grey-light{color:#b5b5b5 !important}.has-background-grey-light{background-color:#b5b5b5 !important}.has-text-grey-lighter{color:#dbdbdb !important}.has-background-grey-lighter{background-color:#dbdbdb !important}.has-text-white-ter{color:#f5f5f5 !important}.has-background-white-ter{background-color:#f5f5f5 !important}.has-text-white-bis{color:#fafafa !important}.has-background-white-bis{background-color:#fafafa !important}.is-flex-direction-row{flex-direction:row !important}.is-flex-direction-row-reverse{flex-direction:row-reverse !important}.is-flex-direction-column{flex-direction:column !important}.is-flex-direction-column-reverse{flex-direction:column-reverse !important}.is-flex-wrap-nowrap{flex-wrap:nowrap !important}.is-flex-wrap-wrap{flex-wrap:wrap !important}.is-flex-wrap-wrap-reverse{flex-wrap:wrap-reverse !important}.is-justify-content-flex-start{justify-content:flex-start !important}.is-justify-content-flex-end{justify-content:flex-end !important}.is-justify-content-center{justify-content:center !important}.is-justify-content-space-between{justify-content:space-between !important}.is-justify-content-space-around{justify-content:space-around !important}.is-justify-content-space-evenly{justify-content:space-evenly !important}.is-justify-content-start{justify-content:start !important}.is-justify-content-end{justify-content:end !important}.is-justify-content-left{justify-content:left !important}.is-justify-content-right{justify-content:right !important}.is-align-content-flex-start{align-content:flex-start !important}.is-align-content-flex-end{align-content:flex-end !important}.is-align-content-center{align-content:center !important}.is-align-content-space-between{align-content:space-between !important}.is-align-content-space-around{align-content:space-around !important}.is-align-content-space-evenly{align-content:space-evenly !important}.is-align-content-stretch{align-content:stretch !important}.is-align-content-start{align-content:start !important}.is-align-content-end{align-content:end !important}.is-align-content-baseline{align-content:baseline !important}.is-align-items-stretch{align-items:stretch !important}.is-align-items-flex-start{align-items:flex-start !important}.is-align-items-flex-end{align-items:flex-end !important}.is-align-items-center{align-items:center !important}.is-align-items-baseline{align-items:baseline !important}.is-align-items-start{align-items:start !important}.is-align-items-end{align-items:end !important}.is-align-items-self-start{align-items:self-start !important}.is-align-items-self-end{align-items:self-end !important}.is-align-self-auto{align-self:auto !important}.is-align-self-flex-start{align-self:flex-start !important}.is-align-self-flex-end{align-self:flex-end !important}.is-align-self-center{align-self:center !important}.is-align-self-baseline{align-self:baseline !important}.is-align-self-stretch{align-self:stretch !important}.is-flex-grow-0{flex-grow:0 !important}.is-flex-grow-1{flex-grow:1 !important}.is-flex-grow-2{flex-grow:2 !important}.is-flex-grow-3{flex-grow:3 !important}.is-flex-grow-4{flex-grow:4 !important}.is-flex-grow-5{flex-grow:5 !important}.is-flex-shrink-0{flex-shrink:0 !important}.is-flex-shrink-1{flex-shrink:1 !important}.is-flex-shrink-2{flex-shrink:2 !important}.is-flex-shrink-3{flex-shrink:3 !important}.is-flex-shrink-4{flex-shrink:4 !important}.is-flex-shrink-5{flex-shrink:5 !important}.is-clearfix::after{clear:both;content:" ";display:table}.is-pulled-left{float:left !important}.is-pulled-right{float:right !important}.is-radiusless{border-radius:0 !important}.is-shadowless{box-shadow:none !important}.is-clickable{cursor:pointer !important;pointer-events:all !important}.is-clipped{overflow:hidden !important}.is-relative{position:relative !important}.is-marginless{margin:0 !important}.is-paddingless{padding:0 !important}.m-0{margin:0 !important}.mt-0{margin-top:0 !important}.mr-0{margin-right:0 !important}.mb-0{margin-bottom:0 !important}.ml-0{margin-left:0 !important}.mx-0{margin-left:0 !important;margin-right:0 !important}.my-0{margin-top:0 !important;margin-bottom:0 !important}.m-1{margin:.25rem !important}.mt-1{margin-top:.25rem !important}.mr-1{margin-right:.25rem !important}.mb-1{margin-bottom:.25rem !important}.ml-1{margin-left:.25rem !important}.mx-1{margin-left:.25rem !important;margin-right:.25rem !important}.my-1{margin-top:.25rem !important;margin-bottom:.25rem !important}.m-2{margin:.5rem !important}.mt-2{margin-top:.5rem !important}.mr-2{margin-right:.5rem !important}.mb-2{margin-bottom:.5rem !important}.ml-2{margin-left:.5rem !important}.mx-2{margin-left:.5rem !important;margin-right:.5rem !important}.my-2{margin-top:.5rem !important;margin-bottom:.5rem !important}.m-3{margin:.75rem !important}.mt-3{margin-top:.75rem !important}.mr-3{margin-right:.75rem !important}.mb-3{margin-bottom:.75rem !important}.ml-3{margin-left:.75rem !important}.mx-3{margin-left:.75rem !important;margin-right:.75rem !important}.my-3{margin-top:.75rem !important;margin-bottom:.75rem !important}.m-4{margin:1rem !important}.mt-4{margin-top:1rem !important}.mr-4{margin-right:1rem !important}.mb-4{margin-bottom:1rem !important}.ml-4{margin-left:1rem !important}.mx-4{margin-left:1rem !important;margin-right:1rem !important}.my-4{margin-top:1rem !important;margin-bottom:1rem !important}.m-5{margin:1.5rem !important}.mt-5{margin-top:1.5rem !important}.mr-5{margin-right:1.5rem !important}.mb-5{margin-bottom:1.5rem !important}.ml-5{margin-left:1.5rem !important}.mx-5{margin-left:1.5rem !important;margin-right:1.5rem !important}.my-5{margin-top:1.5rem !important;margin-bottom:1.5rem !important}.m-6{margin:3rem !important}.mt-6{margin-top:3rem !important}.mr-6{margin-right:3rem !important}.mb-6{margin-bottom:3rem !important}.ml-6{margin-left:3rem !important}.mx-6{margin-left:3rem !important;margin-right:3rem !important}.my-6{margin-top:3rem !important;margin-bottom:3rem !important}.m-auto{margin:auto !important}.mt-auto{margin-top:auto !important}.mr-auto{margin-right:auto !important}.mb-auto{margin-bottom:auto !important}.ml-auto{margin-left:auto !important}.mx-auto{margin-left:auto !important;margin-right:auto !important}.my-auto{margin-top:auto !important;margin-bottom:auto !important}.p-0{padding:0 !important}.pt-0{padding-top:0 !important}.pr-0{padding-right:0 !important}.pb-0{padding-bottom:0 !important}.pl-0{padding-left:0 !important}.px-0{padding-left:0 !important;padding-right:0 !important}.py-0{padding-top:0 !important;padding-bottom:0 !important}.p-1{padding:.25rem !important}.pt-1{padding-top:.25rem !important}.pr-1{padding-right:.25rem !important}.pb-1{padding-bottom:.25rem !important}.pl-1{padding-left:.25rem !important}.px-1{padding-left:.25rem !important;padding-right:.25rem !important}.py-1{padding-top:.25rem !important;padding-bottom:.25rem !important}.p-2{padding:.5rem !important}.pt-2{padding-top:.5rem !important}.pr-2{padding-right:.5rem !important}.pb-2{padding-bottom:.5rem !important}.pl-2{padding-left:.5rem !important}.px-2{padding-left:.5rem !important;padding-right:.5rem !important}.py-2{padding-top:.5rem !important;padding-bottom:.5rem !important}.p-3{padding:.75rem !important}.pt-3{padding-top:.75rem !important}.pr-3{padding-right:.75rem !important}.pb-3{padding-bottom:.75rem !important}.pl-3{padding-left:.75rem !important}.px-3{padding-left:.75rem !important;padding-right:.75rem !important}.py-3{padding-top:.75rem !important;padding-bottom:.75rem !important}.p-4{padding:1rem !important}.pt-4{padding-top:1rem !important}.pr-4{padding-right:1rem !important}.pb-4{padding-bottom:1rem !important}.pl-4{padding-left:1rem !important}.px-4{padding-left:1rem !important;padding-right:1rem !important}.py-4{padding-top:1rem !important;padding-bottom:1rem !important}.p-5{padding:1.5rem !important}.pt-5{padding-top:1.5rem !important}.pr-5{padding-right:1.5rem !important}.pb-5{padding-bottom:1.5rem !important}.pl-5{padding-left:1.5rem !important}.px-5{padding-left:1.5rem !important;padding-right:1.5rem !important}.py-5{padding-top:1.5rem !important;padding-bottom:1.5rem !important}.p-6{padding:3rem !important}.pt-6{padding-top:3rem !important}.pr-6{padding-right:3rem !important}.pb-6{padding-bottom:3rem !important}.pl-6{padding-left:3rem !important}.px-6{padding-left:3rem !important;padding-right:3rem !important}.py-6{padding-top:3rem !important;padding-bottom:3rem !important}.p-auto{padding:auto !important}.pt-auto{padding-top:auto !important}.pr-auto{padding-right:auto !important}.pb-auto{padding-bottom:auto !important}.pl-auto{padding-left:auto !important}.px-auto{padding-left:auto !important;padding-right:auto !important}.py-auto{padding-top:auto !important;padding-bottom:auto !important}.is-size-1{font-size:3rem !important}.is-size-2{font-size:2.5rem !important}.is-size-3{font-size:2rem !important}.is-size-4{font-size:1.5rem !important}.is-size-5{font-size:1.25rem !important}.is-size-6{font-size:1rem !important}.is-size-7,.docstring>section>a.docs-sourcelink{font-size:.75rem !important}@media screen and (max-width: 768px){.is-size-1-mobile{font-size:3rem !important}.is-size-2-mobile{font-size:2.5rem !important}.is-size-3-mobile{font-size:2rem !important}.is-size-4-mobile{font-size:1.5rem !important}.is-size-5-mobile{font-size:1.25rem !important}.is-size-6-mobile{font-size:1rem !important}.is-size-7-mobile{font-size:.75rem !important}}@media screen and (min-width: 769px),print{.is-size-1-tablet{font-size:3rem !important}.is-size-2-tablet{font-size:2.5rem !important}.is-size-3-tablet{font-size:2rem !important}.is-size-4-tablet{font-size:1.5rem !important}.is-size-5-tablet{font-size:1.25rem !important}.is-size-6-tablet{font-size:1rem !important}.is-size-7-tablet{font-size:.75rem !important}}@media screen and (max-width: 1055px){.is-size-1-touch{font-size:3rem !important}.is-size-2-touch{font-size:2.5rem !important}.is-size-3-touch{font-size:2rem !important}.is-size-4-touch{font-size:1.5rem !important}.is-size-5-touch{font-size:1.25rem !important}.is-size-6-touch{font-size:1rem !important}.is-size-7-touch{font-size:.75rem !important}}@media screen and (min-width: 1056px){.is-size-1-desktop{font-size:3rem !important}.is-size-2-desktop{font-size:2.5rem !important}.is-size-3-desktop{font-size:2rem !important}.is-size-4-desktop{font-size:1.5rem !important}.is-size-5-desktop{font-size:1.25rem !important}.is-size-6-desktop{font-size:1rem !important}.is-size-7-desktop{font-size:.75rem !important}}@media screen and (min-width: 1216px){.is-size-1-widescreen{font-size:3rem !important}.is-size-2-widescreen{font-size:2.5rem !important}.is-size-3-widescreen{font-size:2rem !important}.is-size-4-widescreen{font-size:1.5rem !important}.is-size-5-widescreen{font-size:1.25rem !important}.is-size-6-widescreen{font-size:1rem !important}.is-size-7-widescreen{font-size:.75rem !important}}@media screen and (min-width: 1408px){.is-size-1-fullhd{font-size:3rem !important}.is-size-2-fullhd{font-size:2.5rem !important}.is-size-3-fullhd{font-size:2rem !important}.is-size-4-fullhd{font-size:1.5rem !important}.is-size-5-fullhd{font-size:1.25rem !important}.is-size-6-fullhd{font-size:1rem !important}.is-size-7-fullhd{font-size:.75rem !important}}.has-text-centered{text-align:center !important}.has-text-justified{text-align:justify !important}.has-text-left{text-align:left !important}.has-text-right{text-align:right !important}@media screen and (max-width: 768px){.has-text-centered-mobile{text-align:center !important}}@media screen and (min-width: 769px),print{.has-text-centered-tablet{text-align:center !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.has-text-centered-tablet-only{text-align:center !important}}@media screen and (max-width: 1055px){.has-text-centered-touch{text-align:center !important}}@media screen and (min-width: 1056px){.has-text-centered-desktop{text-align:center !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.has-text-centered-desktop-only{text-align:center !important}}@media screen and (min-width: 1216px){.has-text-centered-widescreen{text-align:center !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.has-text-centered-widescreen-only{text-align:center !important}}@media screen and (min-width: 1408px){.has-text-centered-fullhd{text-align:center !important}}@media screen and (max-width: 768px){.has-text-justified-mobile{text-align:justify !important}}@media screen and (min-width: 769px),print{.has-text-justified-tablet{text-align:justify !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.has-text-justified-tablet-only{text-align:justify !important}}@media screen and (max-width: 1055px){.has-text-justified-touch{text-align:justify !important}}@media screen and (min-width: 1056px){.has-text-justified-desktop{text-align:justify !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.has-text-justified-desktop-only{text-align:justify !important}}@media screen and (min-width: 1216px){.has-text-justified-widescreen{text-align:justify !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.has-text-justified-widescreen-only{text-align:justify !important}}@media screen and (min-width: 1408px){.has-text-justified-fullhd{text-align:justify !important}}@media screen and (max-width: 768px){.has-text-left-mobile{text-align:left !important}}@media screen and (min-width: 769px),print{.has-text-left-tablet{text-align:left !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.has-text-left-tablet-only{text-align:left !important}}@media screen and (max-width: 1055px){.has-text-left-touch{text-align:left !important}}@media screen and (min-width: 1056px){.has-text-left-desktop{text-align:left !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.has-text-left-desktop-only{text-align:left !important}}@media screen and (min-width: 1216px){.has-text-left-widescreen{text-align:left !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.has-text-left-widescreen-only{text-align:left !important}}@media screen and (min-width: 1408px){.has-text-left-fullhd{text-align:left !important}}@media screen and (max-width: 768px){.has-text-right-mobile{text-align:right !important}}@media screen and (min-width: 769px),print{.has-text-right-tablet{text-align:right !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.has-text-right-tablet-only{text-align:right !important}}@media screen and (max-width: 1055px){.has-text-right-touch{text-align:right !important}}@media screen and (min-width: 1056px){.has-text-right-desktop{text-align:right !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.has-text-right-desktop-only{text-align:right !important}}@media screen and (min-width: 1216px){.has-text-right-widescreen{text-align:right !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.has-text-right-widescreen-only{text-align:right !important}}@media screen and (min-width: 1408px){.has-text-right-fullhd{text-align:right !important}}.is-capitalized{text-transform:capitalize !important}.is-lowercase{text-transform:lowercase !important}.is-uppercase{text-transform:uppercase !important}.is-italic{font-style:italic !important}.is-underlined{text-decoration:underline !important}.has-text-weight-light{font-weight:300 !important}.has-text-weight-normal{font-weight:400 !important}.has-text-weight-medium{font-weight:500 !important}.has-text-weight-semibold{font-weight:600 !important}.has-text-weight-bold{font-weight:700 !important}.is-family-primary{font-family:"Lato Medium",-apple-system,BlinkMacSystemFont,"Segoe UI","Helvetica Neue","Helvetica","Arial",sans-serif !important}.is-family-secondary{font-family:"Lato Medium",-apple-system,BlinkMacSystemFont,"Segoe UI","Helvetica Neue","Helvetica","Arial",sans-serif !important}.is-family-sans-serif{font-family:"Lato Medium",-apple-system,BlinkMacSystemFont,"Segoe UI","Helvetica Neue","Helvetica","Arial",sans-serif !important}.is-family-monospace{font-family:"JuliaMono","SFMono-Regular","Menlo","Consolas","Liberation Mono","DejaVu Sans Mono",monospace !important}.is-family-code{font-family:"JuliaMono","SFMono-Regular","Menlo","Consolas","Liberation Mono","DejaVu Sans Mono",monospace !important}.is-block{display:block !important}@media screen and (max-width: 768px){.is-block-mobile{display:block !important}}@media screen and (min-width: 769px),print{.is-block-tablet{display:block !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.is-block-tablet-only{display:block !important}}@media screen and (max-width: 1055px){.is-block-touch{display:block !important}}@media screen and (min-width: 1056px){.is-block-desktop{display:block !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.is-block-desktop-only{display:block !important}}@media screen and (min-width: 1216px){.is-block-widescreen{display:block !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.is-block-widescreen-only{display:block !important}}@media screen and (min-width: 1408px){.is-block-fullhd{display:block !important}}.is-flex{display:flex !important}@media screen and (max-width: 768px){.is-flex-mobile{display:flex !important}}@media screen and (min-width: 769px),print{.is-flex-tablet{display:flex !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.is-flex-tablet-only{display:flex !important}}@media screen and (max-width: 1055px){.is-flex-touch{display:flex !important}}@media screen and (min-width: 1056px){.is-flex-desktop{display:flex !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.is-flex-desktop-only{display:flex !important}}@media screen and (min-width: 1216px){.is-flex-widescreen{display:flex !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.is-flex-widescreen-only{display:flex !important}}@media screen and (min-width: 1408px){.is-flex-fullhd{display:flex !important}}.is-inline{display:inline !important}@media screen and (max-width: 768px){.is-inline-mobile{display:inline !important}}@media screen and (min-width: 769px),print{.is-inline-tablet{display:inline !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.is-inline-tablet-only{display:inline !important}}@media screen and (max-width: 1055px){.is-inline-touch{display:inline !important}}@media screen and (min-width: 1056px){.is-inline-desktop{display:inline !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.is-inline-desktop-only{display:inline !important}}@media screen and (min-width: 1216px){.is-inline-widescreen{display:inline !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.is-inline-widescreen-only{display:inline !important}}@media screen and (min-width: 1408px){.is-inline-fullhd{display:inline !important}}.is-inline-block{display:inline-block !important}@media screen and (max-width: 768px){.is-inline-block-mobile{display:inline-block !important}}@media screen and (min-width: 769px),print{.is-inline-block-tablet{display:inline-block !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.is-inline-block-tablet-only{display:inline-block !important}}@media screen and (max-width: 1055px){.is-inline-block-touch{display:inline-block !important}}@media screen and (min-width: 1056px){.is-inline-block-desktop{display:inline-block !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.is-inline-block-desktop-only{display:inline-block !important}}@media screen and (min-width: 1216px){.is-inline-block-widescreen{display:inline-block !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.is-inline-block-widescreen-only{display:inline-block !important}}@media screen and (min-width: 1408px){.is-inline-block-fullhd{display:inline-block !important}}.is-inline-flex{display:inline-flex !important}@media screen and (max-width: 768px){.is-inline-flex-mobile{display:inline-flex !important}}@media screen and (min-width: 769px),print{.is-inline-flex-tablet{display:inline-flex !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.is-inline-flex-tablet-only{display:inline-flex !important}}@media screen and (max-width: 1055px){.is-inline-flex-touch{display:inline-flex !important}}@media screen and (min-width: 1056px){.is-inline-flex-desktop{display:inline-flex !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.is-inline-flex-desktop-only{display:inline-flex !important}}@media screen and (min-width: 1216px){.is-inline-flex-widescreen{display:inline-flex !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.is-inline-flex-widescreen-only{display:inline-flex !important}}@media screen and (min-width: 1408px){.is-inline-flex-fullhd{display:inline-flex !important}}.is-hidden{display:none !important}.is-sr-only{border:none !important;clip:rect(0, 0, 0, 0) !important;height:0.01em !important;overflow:hidden !important;padding:0 !important;position:absolute !important;white-space:nowrap !important;width:0.01em !important}@media screen and (max-width: 768px){.is-hidden-mobile{display:none !important}}@media screen and (min-width: 769px),print{.is-hidden-tablet{display:none !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.is-hidden-tablet-only{display:none !important}}@media screen and (max-width: 1055px){.is-hidden-touch{display:none !important}}@media screen and (min-width: 1056px){.is-hidden-desktop{display:none !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.is-hidden-desktop-only{display:none !important}}@media screen and (min-width: 1216px){.is-hidden-widescreen{display:none !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.is-hidden-widescreen-only{display:none !important}}@media screen and (min-width: 1408px){.is-hidden-fullhd{display:none !important}}.is-invisible{visibility:hidden !important}@media screen and (max-width: 768px){.is-invisible-mobile{visibility:hidden !important}}@media screen and (min-width: 769px),print{.is-invisible-tablet{visibility:hidden !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.is-invisible-tablet-only{visibility:hidden !important}}@media screen and (max-width: 1055px){.is-invisible-touch{visibility:hidden !important}}@media screen and (min-width: 1056px){.is-invisible-desktop{visibility:hidden !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.is-invisible-desktop-only{visibility:hidden !important}}@media screen and (min-width: 1216px){.is-invisible-widescreen{visibility:hidden !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.is-invisible-widescreen-only{visibility:hidden !important}}@media screen and (min-width: 1408px){.is-invisible-fullhd{visibility:hidden !important}}/*! minireset.css v0.0.6 | MIT License | github.com/jgthms/minireset.css */html,body,p,ol,ul,li,dl,dt,dd,blockquote,figure,fieldset,legend,textarea,pre,iframe,hr,h1,h2,h3,h4,h5,h6{margin:0;padding:0}h1,h2,h3,h4,h5,h6{font-size:100%;font-weight:normal}ul{list-style:none}button,input,select,textarea{margin:0}html{box-sizing:border-box}*,*::before,*::after{box-sizing:inherit}img,video{height:auto;max-width:100%}iframe{border:0}table{border-collapse:collapse;border-spacing:0}td,th{padding:0}td:not([align]),th:not([align]){text-align:inherit}html{background-color:#fff;font-size:16px;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;min-width:300px;overflow-x:auto;overflow-y:scroll;text-rendering:optimizeLegibility;text-size-adjust:100%}article,aside,figure,footer,header,hgroup,section{display:block}body,button,input,optgroup,select,textarea{font-family:"Lato Medium",-apple-system,BlinkMacSystemFont,"Segoe UI","Helvetica Neue","Helvetica","Arial",sans-serif}code,pre{-moz-osx-font-smoothing:auto;-webkit-font-smoothing:auto;font-family:"JuliaMono","SFMono-Regular","Menlo","Consolas","Liberation Mono","DejaVu Sans Mono",monospace}body{color:#222;font-size:1em;font-weight:400;line-height:1.5}a{color:#2e63b8;cursor:pointer;text-decoration:none}a strong{color:currentColor}a:hover{color:#363636}code{background-color:rgba(0,0,0,0.05);color:#000;font-size:.875em;font-weight:normal;padding:.1em}hr{background-color:#f5f5f5;border:none;display:block;height:2px;margin:1.5rem 0}img{height:auto;max-width:100%}input[type="checkbox"],input[type="radio"]{vertical-align:baseline}small{font-size:.875em}span{font-style:inherit;font-weight:inherit}strong{color:#222;font-weight:700}fieldset{border:none}pre{-webkit-overflow-scrolling:touch;background-color:#f5f5f5;color:#222;font-size:.875em;overflow-x:auto;padding:1.25rem 1.5rem;white-space:pre;word-wrap:normal}pre code{background-color:transparent;color:currentColor;font-size:1em;padding:0}table td,table th{vertical-align:top}table td:not([align]),table th:not([align]){text-align:inherit}table th{color:#222}@keyframes spinAround{from{transform:rotate(0deg)}to{transform:rotate(359deg)}}.box{background-color:#fff;border-radius:6px;box-shadow:#bbb;color:#222;display:block;padding:1.25rem}a.box:hover,a.box:focus{box-shadow:0 0.5em 1em -0.125em rgba(10,10,10,0.1),0 0 0 1px #2e63b8}a.box:active{box-shadow:inset 0 1px 2px rgba(10,10,10,0.2),0 0 0 1px #2e63b8}.button{background-color:#fff;border-color:#dbdbdb;border-width:1px;color:#222;cursor:pointer;justify-content:center;padding-bottom:calc(0.5em - 1px);padding-left:1em;padding-right:1em;padding-top:calc(0.5em - 1px);text-align:center;white-space:nowrap}.button strong{color:inherit}.button .icon,.button .icon.is-small,.button #documenter .docs-sidebar form.docs-search>input.icon,#documenter .docs-sidebar .button form.docs-search>input.icon,.button .icon.is-medium,.button .icon.is-large{height:1.5em;width:1.5em}.button .icon:first-child:not(:last-child){margin-left:calc(-0.5em - 1px);margin-right:.25em}.button .icon:last-child:not(:first-child){margin-left:.25em;margin-right:calc(-0.5em - 1px)}.button .icon:first-child:last-child{margin-left:calc(-0.5em - 1px);margin-right:calc(-0.5em - 1px)}.button:hover,.button.is-hovered{border-color:#b5b5b5;color:#363636}.button:focus,.button.is-focused{border-color:#3c5dcd;color:#363636}.button:focus:not(:active),.button.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(46,99,184,0.25)}.button:active,.button.is-active{border-color:#4a4a4a;color:#363636}.button.is-text{background-color:transparent;border-color:transparent;color:#222;text-decoration:underline}.button.is-text:hover,.button.is-text.is-hovered,.button.is-text:focus,.button.is-text.is-focused{background-color:#f5f5f5;color:#222}.button.is-text:active,.button.is-text.is-active{background-color:#e8e8e8;color:#222}.button.is-text[disabled],fieldset[disabled] .button.is-text{background-color:transparent;border-color:transparent;box-shadow:none}.button.is-ghost{background:none;border-color:rgba(0,0,0,0);color:#2e63b8;text-decoration:none}.button.is-ghost:hover,.button.is-ghost.is-hovered{color:#2e63b8;text-decoration:underline}.button.is-white{background-color:#fff;border-color:transparent;color:#0a0a0a}.button.is-white:hover,.button.is-white.is-hovered{background-color:#f9f9f9;border-color:transparent;color:#0a0a0a}.button.is-white:focus,.button.is-white.is-focused{border-color:transparent;color:#0a0a0a}.button.is-white:focus:not(:active),.button.is-white.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(255,255,255,0.25)}.button.is-white:active,.button.is-white.is-active{background-color:#f2f2f2;border-color:transparent;color:#0a0a0a}.button.is-white[disabled],fieldset[disabled] .button.is-white{background-color:#fff;border-color:#fff;box-shadow:none}.button.is-white.is-inverted{background-color:#0a0a0a;color:#fff}.button.is-white.is-inverted:hover,.button.is-white.is-inverted.is-hovered{background-color:#000}.button.is-white.is-inverted[disabled],fieldset[disabled] .button.is-white.is-inverted{background-color:#0a0a0a;border-color:transparent;box-shadow:none;color:#fff}.button.is-white.is-loading::after{border-color:transparent transparent #0a0a0a #0a0a0a !important}.button.is-white.is-outlined{background-color:transparent;border-color:#fff;color:#fff}.button.is-white.is-outlined:hover,.button.is-white.is-outlined.is-hovered,.button.is-white.is-outlined:focus,.button.is-white.is-outlined.is-focused{background-color:#fff;border-color:#fff;color:#0a0a0a}.button.is-white.is-outlined.is-loading::after{border-color:transparent transparent #fff #fff !important}.button.is-white.is-outlined.is-loading:hover::after,.button.is-white.is-outlined.is-loading.is-hovered::after,.button.is-white.is-outlined.is-loading:focus::after,.button.is-white.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #0a0a0a #0a0a0a !important}.button.is-white.is-outlined[disabled],fieldset[disabled] .button.is-white.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}.button.is-white.is-inverted.is-outlined{background-color:transparent;border-color:#0a0a0a;color:#0a0a0a}.button.is-white.is-inverted.is-outlined:hover,.button.is-white.is-inverted.is-outlined.is-hovered,.button.is-white.is-inverted.is-outlined:focus,.button.is-white.is-inverted.is-outlined.is-focused{background-color:#0a0a0a;color:#fff}.button.is-white.is-inverted.is-outlined.is-loading:hover::after,.button.is-white.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-white.is-inverted.is-outlined.is-loading:focus::after,.button.is-white.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #fff #fff !important}.button.is-white.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-white.is-inverted.is-outlined{background-color:transparent;border-color:#0a0a0a;box-shadow:none;color:#0a0a0a}.button.is-black{background-color:#0a0a0a;border-color:transparent;color:#fff}.button.is-black:hover,.button.is-black.is-hovered{background-color:#040404;border-color:transparent;color:#fff}.button.is-black:focus,.button.is-black.is-focused{border-color:transparent;color:#fff}.button.is-black:focus:not(:active),.button.is-black.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(10,10,10,0.25)}.button.is-black:active,.button.is-black.is-active{background-color:#000;border-color:transparent;color:#fff}.button.is-black[disabled],fieldset[disabled] .button.is-black{background-color:#0a0a0a;border-color:#0a0a0a;box-shadow:none}.button.is-black.is-inverted{background-color:#fff;color:#0a0a0a}.button.is-black.is-inverted:hover,.button.is-black.is-inverted.is-hovered{background-color:#f2f2f2}.button.is-black.is-inverted[disabled],fieldset[disabled] .button.is-black.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#0a0a0a}.button.is-black.is-loading::after{border-color:transparent transparent #fff #fff !important}.button.is-black.is-outlined{background-color:transparent;border-color:#0a0a0a;color:#0a0a0a}.button.is-black.is-outlined:hover,.button.is-black.is-outlined.is-hovered,.button.is-black.is-outlined:focus,.button.is-black.is-outlined.is-focused{background-color:#0a0a0a;border-color:#0a0a0a;color:#fff}.button.is-black.is-outlined.is-loading::after{border-color:transparent transparent #0a0a0a #0a0a0a !important}.button.is-black.is-outlined.is-loading:hover::after,.button.is-black.is-outlined.is-loading.is-hovered::after,.button.is-black.is-outlined.is-loading:focus::after,.button.is-black.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #fff #fff !important}.button.is-black.is-outlined[disabled],fieldset[disabled] .button.is-black.is-outlined{background-color:transparent;border-color:#0a0a0a;box-shadow:none;color:#0a0a0a}.button.is-black.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}.button.is-black.is-inverted.is-outlined:hover,.button.is-black.is-inverted.is-outlined.is-hovered,.button.is-black.is-inverted.is-outlined:focus,.button.is-black.is-inverted.is-outlined.is-focused{background-color:#fff;color:#0a0a0a}.button.is-black.is-inverted.is-outlined.is-loading:hover::after,.button.is-black.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-black.is-inverted.is-outlined.is-loading:focus::after,.button.is-black.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #0a0a0a #0a0a0a !important}.button.is-black.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-black.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}.button.is-light{background-color:#f5f5f5;border-color:transparent;color:rgba(0,0,0,0.7)}.button.is-light:hover,.button.is-light.is-hovered{background-color:#eee;border-color:transparent;color:rgba(0,0,0,0.7)}.button.is-light:focus,.button.is-light.is-focused{border-color:transparent;color:rgba(0,0,0,0.7)}.button.is-light:focus:not(:active),.button.is-light.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(245,245,245,0.25)}.button.is-light:active,.button.is-light.is-active{background-color:#e8e8e8;border-color:transparent;color:rgba(0,0,0,0.7)}.button.is-light[disabled],fieldset[disabled] .button.is-light{background-color:#f5f5f5;border-color:#f5f5f5;box-shadow:none}.button.is-light.is-inverted{background-color:rgba(0,0,0,0.7);color:#f5f5f5}.button.is-light.is-inverted:hover,.button.is-light.is-inverted.is-hovered{background-color:rgba(0,0,0,0.7)}.button.is-light.is-inverted[disabled],fieldset[disabled] .button.is-light.is-inverted{background-color:rgba(0,0,0,0.7);border-color:transparent;box-shadow:none;color:#f5f5f5}.button.is-light.is-loading::after{border-color:transparent transparent rgba(0,0,0,0.7) rgba(0,0,0,0.7) !important}.button.is-light.is-outlined{background-color:transparent;border-color:#f5f5f5;color:#f5f5f5}.button.is-light.is-outlined:hover,.button.is-light.is-outlined.is-hovered,.button.is-light.is-outlined:focus,.button.is-light.is-outlined.is-focused{background-color:#f5f5f5;border-color:#f5f5f5;color:rgba(0,0,0,0.7)}.button.is-light.is-outlined.is-loading::after{border-color:transparent transparent #f5f5f5 #f5f5f5 !important}.button.is-light.is-outlined.is-loading:hover::after,.button.is-light.is-outlined.is-loading.is-hovered::after,.button.is-light.is-outlined.is-loading:focus::after,.button.is-light.is-outlined.is-loading.is-focused::after{border-color:transparent transparent rgba(0,0,0,0.7) rgba(0,0,0,0.7) !important}.button.is-light.is-outlined[disabled],fieldset[disabled] .button.is-light.is-outlined{background-color:transparent;border-color:#f5f5f5;box-shadow:none;color:#f5f5f5}.button.is-light.is-inverted.is-outlined{background-color:transparent;border-color:rgba(0,0,0,0.7);color:rgba(0,0,0,0.7)}.button.is-light.is-inverted.is-outlined:hover,.button.is-light.is-inverted.is-outlined.is-hovered,.button.is-light.is-inverted.is-outlined:focus,.button.is-light.is-inverted.is-outlined.is-focused{background-color:rgba(0,0,0,0.7);color:#f5f5f5}.button.is-light.is-inverted.is-outlined.is-loading:hover::after,.button.is-light.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-light.is-inverted.is-outlined.is-loading:focus::after,.button.is-light.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #f5f5f5 #f5f5f5 !important}.button.is-light.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-light.is-inverted.is-outlined{background-color:transparent;border-color:rgba(0,0,0,0.7);box-shadow:none;color:rgba(0,0,0,0.7)}.button.is-dark,.content kbd.button{background-color:#363636;border-color:transparent;color:#fff}.button.is-dark:hover,.content kbd.button:hover,.button.is-dark.is-hovered,.content kbd.button.is-hovered{background-color:#2f2f2f;border-color:transparent;color:#fff}.button.is-dark:focus,.content kbd.button:focus,.button.is-dark.is-focused,.content kbd.button.is-focused{border-color:transparent;color:#fff}.button.is-dark:focus:not(:active),.content kbd.button:focus:not(:active),.button.is-dark.is-focused:not(:active),.content kbd.button.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(54,54,54,0.25)}.button.is-dark:active,.content kbd.button:active,.button.is-dark.is-active,.content kbd.button.is-active{background-color:#292929;border-color:transparent;color:#fff}.button.is-dark[disabled],.content kbd.button[disabled],fieldset[disabled] .button.is-dark,fieldset[disabled] .content kbd.button,.content fieldset[disabled] kbd.button{background-color:#363636;border-color:#363636;box-shadow:none}.button.is-dark.is-inverted,.content kbd.button.is-inverted{background-color:#fff;color:#363636}.button.is-dark.is-inverted:hover,.content kbd.button.is-inverted:hover,.button.is-dark.is-inverted.is-hovered,.content kbd.button.is-inverted.is-hovered{background-color:#f2f2f2}.button.is-dark.is-inverted[disabled],.content kbd.button.is-inverted[disabled],fieldset[disabled] .button.is-dark.is-inverted,fieldset[disabled] .content kbd.button.is-inverted,.content fieldset[disabled] kbd.button.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#363636}.button.is-dark.is-loading::after,.content kbd.button.is-loading::after{border-color:transparent transparent #fff #fff !important}.button.is-dark.is-outlined,.content kbd.button.is-outlined{background-color:transparent;border-color:#363636;color:#363636}.button.is-dark.is-outlined:hover,.content kbd.button.is-outlined:hover,.button.is-dark.is-outlined.is-hovered,.content kbd.button.is-outlined.is-hovered,.button.is-dark.is-outlined:focus,.content kbd.button.is-outlined:focus,.button.is-dark.is-outlined.is-focused,.content kbd.button.is-outlined.is-focused{background-color:#363636;border-color:#363636;color:#fff}.button.is-dark.is-outlined.is-loading::after,.content kbd.button.is-outlined.is-loading::after{border-color:transparent transparent #363636 #363636 !important}.button.is-dark.is-outlined.is-loading:hover::after,.content kbd.button.is-outlined.is-loading:hover::after,.button.is-dark.is-outlined.is-loading.is-hovered::after,.content kbd.button.is-outlined.is-loading.is-hovered::after,.button.is-dark.is-outlined.is-loading:focus::after,.content kbd.button.is-outlined.is-loading:focus::after,.button.is-dark.is-outlined.is-loading.is-focused::after,.content kbd.button.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #fff #fff !important}.button.is-dark.is-outlined[disabled],.content kbd.button.is-outlined[disabled],fieldset[disabled] .button.is-dark.is-outlined,fieldset[disabled] .content kbd.button.is-outlined,.content fieldset[disabled] kbd.button.is-outlined{background-color:transparent;border-color:#363636;box-shadow:none;color:#363636}.button.is-dark.is-inverted.is-outlined,.content kbd.button.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}.button.is-dark.is-inverted.is-outlined:hover,.content kbd.button.is-inverted.is-outlined:hover,.button.is-dark.is-inverted.is-outlined.is-hovered,.content kbd.button.is-inverted.is-outlined.is-hovered,.button.is-dark.is-inverted.is-outlined:focus,.content kbd.button.is-inverted.is-outlined:focus,.button.is-dark.is-inverted.is-outlined.is-focused,.content kbd.button.is-inverted.is-outlined.is-focused{background-color:#fff;color:#363636}.button.is-dark.is-inverted.is-outlined.is-loading:hover::after,.content kbd.button.is-inverted.is-outlined.is-loading:hover::after,.button.is-dark.is-inverted.is-outlined.is-loading.is-hovered::after,.content kbd.button.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-dark.is-inverted.is-outlined.is-loading:focus::after,.content kbd.button.is-inverted.is-outlined.is-loading:focus::after,.button.is-dark.is-inverted.is-outlined.is-loading.is-focused::after,.content kbd.button.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #363636 #363636 !important}.button.is-dark.is-inverted.is-outlined[disabled],.content kbd.button.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-dark.is-inverted.is-outlined,fieldset[disabled] .content kbd.button.is-inverted.is-outlined,.content fieldset[disabled] kbd.button.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}.button.is-primary,.docstring>section>a.button.docs-sourcelink{background-color:#4eb5de;border-color:transparent;color:#fff}.button.is-primary:hover,.docstring>section>a.button.docs-sourcelink:hover,.button.is-primary.is-hovered,.docstring>section>a.button.is-hovered.docs-sourcelink{background-color:#43b1dc;border-color:transparent;color:#fff}.button.is-primary:focus,.docstring>section>a.button.docs-sourcelink:focus,.button.is-primary.is-focused,.docstring>section>a.button.is-focused.docs-sourcelink{border-color:transparent;color:#fff}.button.is-primary:focus:not(:active),.docstring>section>a.button.docs-sourcelink:focus:not(:active),.button.is-primary.is-focused:not(:active),.docstring>section>a.button.is-focused.docs-sourcelink:not(:active){box-shadow:0 0 0 0.125em rgba(78,181,222,0.25)}.button.is-primary:active,.docstring>section>a.button.docs-sourcelink:active,.button.is-primary.is-active,.docstring>section>a.button.is-active.docs-sourcelink{background-color:#39acda;border-color:transparent;color:#fff}.button.is-primary[disabled],.docstring>section>a.button.docs-sourcelink[disabled],fieldset[disabled] .button.is-primary,fieldset[disabled] .docstring>section>a.button.docs-sourcelink{background-color:#4eb5de;border-color:#4eb5de;box-shadow:none}.button.is-primary.is-inverted,.docstring>section>a.button.is-inverted.docs-sourcelink{background-color:#fff;color:#4eb5de}.button.is-primary.is-inverted:hover,.docstring>section>a.button.is-inverted.docs-sourcelink:hover,.button.is-primary.is-inverted.is-hovered,.docstring>section>a.button.is-inverted.is-hovered.docs-sourcelink{background-color:#f2f2f2}.button.is-primary.is-inverted[disabled],.docstring>section>a.button.is-inverted.docs-sourcelink[disabled],fieldset[disabled] .button.is-primary.is-inverted,fieldset[disabled] .docstring>section>a.button.is-inverted.docs-sourcelink{background-color:#fff;border-color:transparent;box-shadow:none;color:#4eb5de}.button.is-primary.is-loading::after,.docstring>section>a.button.is-loading.docs-sourcelink::after{border-color:transparent transparent #fff #fff !important}.button.is-primary.is-outlined,.docstring>section>a.button.is-outlined.docs-sourcelink{background-color:transparent;border-color:#4eb5de;color:#4eb5de}.button.is-primary.is-outlined:hover,.docstring>section>a.button.is-outlined.docs-sourcelink:hover,.button.is-primary.is-outlined.is-hovered,.docstring>section>a.button.is-outlined.is-hovered.docs-sourcelink,.button.is-primary.is-outlined:focus,.docstring>section>a.button.is-outlined.docs-sourcelink:focus,.button.is-primary.is-outlined.is-focused,.docstring>section>a.button.is-outlined.is-focused.docs-sourcelink{background-color:#4eb5de;border-color:#4eb5de;color:#fff}.button.is-primary.is-outlined.is-loading::after,.docstring>section>a.button.is-outlined.is-loading.docs-sourcelink::after{border-color:transparent transparent #4eb5de #4eb5de !important}.button.is-primary.is-outlined.is-loading:hover::after,.docstring>section>a.button.is-outlined.is-loading.docs-sourcelink:hover::after,.button.is-primary.is-outlined.is-loading.is-hovered::after,.docstring>section>a.button.is-outlined.is-loading.is-hovered.docs-sourcelink::after,.button.is-primary.is-outlined.is-loading:focus::after,.docstring>section>a.button.is-outlined.is-loading.docs-sourcelink:focus::after,.button.is-primary.is-outlined.is-loading.is-focused::after,.docstring>section>a.button.is-outlined.is-loading.is-focused.docs-sourcelink::after{border-color:transparent transparent #fff #fff !important}.button.is-primary.is-outlined[disabled],.docstring>section>a.button.is-outlined.docs-sourcelink[disabled],fieldset[disabled] .button.is-primary.is-outlined,fieldset[disabled] .docstring>section>a.button.is-outlined.docs-sourcelink{background-color:transparent;border-color:#4eb5de;box-shadow:none;color:#4eb5de}.button.is-primary.is-inverted.is-outlined,.docstring>section>a.button.is-inverted.is-outlined.docs-sourcelink{background-color:transparent;border-color:#fff;color:#fff}.button.is-primary.is-inverted.is-outlined:hover,.docstring>section>a.button.is-inverted.is-outlined.docs-sourcelink:hover,.button.is-primary.is-inverted.is-outlined.is-hovered,.docstring>section>a.button.is-inverted.is-outlined.is-hovered.docs-sourcelink,.button.is-primary.is-inverted.is-outlined:focus,.docstring>section>a.button.is-inverted.is-outlined.docs-sourcelink:focus,.button.is-primary.is-inverted.is-outlined.is-focused,.docstring>section>a.button.is-inverted.is-outlined.is-focused.docs-sourcelink{background-color:#fff;color:#4eb5de}.button.is-primary.is-inverted.is-outlined.is-loading:hover::after,.docstring>section>a.button.is-inverted.is-outlined.is-loading.docs-sourcelink:hover::after,.button.is-primary.is-inverted.is-outlined.is-loading.is-hovered::after,.docstring>section>a.button.is-inverted.is-outlined.is-loading.is-hovered.docs-sourcelink::after,.button.is-primary.is-inverted.is-outlined.is-loading:focus::after,.docstring>section>a.button.is-inverted.is-outlined.is-loading.docs-sourcelink:focus::after,.button.is-primary.is-inverted.is-outlined.is-loading.is-focused::after,.docstring>section>a.button.is-inverted.is-outlined.is-loading.is-focused.docs-sourcelink::after{border-color:transparent transparent #4eb5de #4eb5de !important}.button.is-primary.is-inverted.is-outlined[disabled],.docstring>section>a.button.is-inverted.is-outlined.docs-sourcelink[disabled],fieldset[disabled] .button.is-primary.is-inverted.is-outlined,fieldset[disabled] .docstring>section>a.button.is-inverted.is-outlined.docs-sourcelink{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}.button.is-primary.is-light,.docstring>section>a.button.is-light.docs-sourcelink{background-color:#eef8fc;color:#1a6d8e}.button.is-primary.is-light:hover,.docstring>section>a.button.is-light.docs-sourcelink:hover,.button.is-primary.is-light.is-hovered,.docstring>section>a.button.is-light.is-hovered.docs-sourcelink{background-color:#e3f3fa;border-color:transparent;color:#1a6d8e}.button.is-primary.is-light:active,.docstring>section>a.button.is-light.docs-sourcelink:active,.button.is-primary.is-light.is-active,.docstring>section>a.button.is-light.is-active.docs-sourcelink{background-color:#d8eff8;border-color:transparent;color:#1a6d8e}.button.is-link{background-color:#2e63b8;border-color:transparent;color:#fff}.button.is-link:hover,.button.is-link.is-hovered{background-color:#2b5eae;border-color:transparent;color:#fff}.button.is-link:focus,.button.is-link.is-focused{border-color:transparent;color:#fff}.button.is-link:focus:not(:active),.button.is-link.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(46,99,184,0.25)}.button.is-link:active,.button.is-link.is-active{background-color:#2958a4;border-color:transparent;color:#fff}.button.is-link[disabled],fieldset[disabled] .button.is-link{background-color:#2e63b8;border-color:#2e63b8;box-shadow:none}.button.is-link.is-inverted{background-color:#fff;color:#2e63b8}.button.is-link.is-inverted:hover,.button.is-link.is-inverted.is-hovered{background-color:#f2f2f2}.button.is-link.is-inverted[disabled],fieldset[disabled] .button.is-link.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#2e63b8}.button.is-link.is-loading::after{border-color:transparent transparent #fff #fff !important}.button.is-link.is-outlined{background-color:transparent;border-color:#2e63b8;color:#2e63b8}.button.is-link.is-outlined:hover,.button.is-link.is-outlined.is-hovered,.button.is-link.is-outlined:focus,.button.is-link.is-outlined.is-focused{background-color:#2e63b8;border-color:#2e63b8;color:#fff}.button.is-link.is-outlined.is-loading::after{border-color:transparent transparent #2e63b8 #2e63b8 !important}.button.is-link.is-outlined.is-loading:hover::after,.button.is-link.is-outlined.is-loading.is-hovered::after,.button.is-link.is-outlined.is-loading:focus::after,.button.is-link.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #fff #fff !important}.button.is-link.is-outlined[disabled],fieldset[disabled] .button.is-link.is-outlined{background-color:transparent;border-color:#2e63b8;box-shadow:none;color:#2e63b8}.button.is-link.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}.button.is-link.is-inverted.is-outlined:hover,.button.is-link.is-inverted.is-outlined.is-hovered,.button.is-link.is-inverted.is-outlined:focus,.button.is-link.is-inverted.is-outlined.is-focused{background-color:#fff;color:#2e63b8}.button.is-link.is-inverted.is-outlined.is-loading:hover::after,.button.is-link.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-link.is-inverted.is-outlined.is-loading:focus::after,.button.is-link.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #2e63b8 #2e63b8 !important}.button.is-link.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-link.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}.button.is-link.is-light{background-color:#eff3fb;color:#3169c4}.button.is-link.is-light:hover,.button.is-link.is-light.is-hovered{background-color:#e4ecf8;border-color:transparent;color:#3169c4}.button.is-link.is-light:active,.button.is-link.is-light.is-active{background-color:#dae5f6;border-color:transparent;color:#3169c4}.button.is-info{background-color:#209cee;border-color:transparent;color:#fff}.button.is-info:hover,.button.is-info.is-hovered{background-color:#1497ed;border-color:transparent;color:#fff}.button.is-info:focus,.button.is-info.is-focused{border-color:transparent;color:#fff}.button.is-info:focus:not(:active),.button.is-info.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(32,156,238,0.25)}.button.is-info:active,.button.is-info.is-active{background-color:#1190e3;border-color:transparent;color:#fff}.button.is-info[disabled],fieldset[disabled] .button.is-info{background-color:#209cee;border-color:#209cee;box-shadow:none}.button.is-info.is-inverted{background-color:#fff;color:#209cee}.button.is-info.is-inverted:hover,.button.is-info.is-inverted.is-hovered{background-color:#f2f2f2}.button.is-info.is-inverted[disabled],fieldset[disabled] .button.is-info.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#209cee}.button.is-info.is-loading::after{border-color:transparent transparent #fff #fff !important}.button.is-info.is-outlined{background-color:transparent;border-color:#209cee;color:#209cee}.button.is-info.is-outlined:hover,.button.is-info.is-outlined.is-hovered,.button.is-info.is-outlined:focus,.button.is-info.is-outlined.is-focused{background-color:#209cee;border-color:#209cee;color:#fff}.button.is-info.is-outlined.is-loading::after{border-color:transparent transparent #209cee #209cee !important}.button.is-info.is-outlined.is-loading:hover::after,.button.is-info.is-outlined.is-loading.is-hovered::after,.button.is-info.is-outlined.is-loading:focus::after,.button.is-info.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #fff #fff !important}.button.is-info.is-outlined[disabled],fieldset[disabled] .button.is-info.is-outlined{background-color:transparent;border-color:#209cee;box-shadow:none;color:#209cee}.button.is-info.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}.button.is-info.is-inverted.is-outlined:hover,.button.is-info.is-inverted.is-outlined.is-hovered,.button.is-info.is-inverted.is-outlined:focus,.button.is-info.is-inverted.is-outlined.is-focused{background-color:#fff;color:#209cee}.button.is-info.is-inverted.is-outlined.is-loading:hover::after,.button.is-info.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-info.is-inverted.is-outlined.is-loading:focus::after,.button.is-info.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #209cee #209cee !important}.button.is-info.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-info.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}.button.is-info.is-light{background-color:#ecf7fe;color:#0e72b4}.button.is-info.is-light:hover,.button.is-info.is-light.is-hovered{background-color:#e0f1fd;border-color:transparent;color:#0e72b4}.button.is-info.is-light:active,.button.is-info.is-light.is-active{background-color:#d4ecfc;border-color:transparent;color:#0e72b4}.button.is-success{background-color:#22c35b;border-color:transparent;color:#fff}.button.is-success:hover,.button.is-success.is-hovered{background-color:#20b856;border-color:transparent;color:#fff}.button.is-success:focus,.button.is-success.is-focused{border-color:transparent;color:#fff}.button.is-success:focus:not(:active),.button.is-success.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(34,195,91,0.25)}.button.is-success:active,.button.is-success.is-active{background-color:#1ead51;border-color:transparent;color:#fff}.button.is-success[disabled],fieldset[disabled] .button.is-success{background-color:#22c35b;border-color:#22c35b;box-shadow:none}.button.is-success.is-inverted{background-color:#fff;color:#22c35b}.button.is-success.is-inverted:hover,.button.is-success.is-inverted.is-hovered{background-color:#f2f2f2}.button.is-success.is-inverted[disabled],fieldset[disabled] .button.is-success.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#22c35b}.button.is-success.is-loading::after{border-color:transparent transparent #fff #fff !important}.button.is-success.is-outlined{background-color:transparent;border-color:#22c35b;color:#22c35b}.button.is-success.is-outlined:hover,.button.is-success.is-outlined.is-hovered,.button.is-success.is-outlined:focus,.button.is-success.is-outlined.is-focused{background-color:#22c35b;border-color:#22c35b;color:#fff}.button.is-success.is-outlined.is-loading::after{border-color:transparent transparent #22c35b #22c35b !important}.button.is-success.is-outlined.is-loading:hover::after,.button.is-success.is-outlined.is-loading.is-hovered::after,.button.is-success.is-outlined.is-loading:focus::after,.button.is-success.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #fff #fff !important}.button.is-success.is-outlined[disabled],fieldset[disabled] .button.is-success.is-outlined{background-color:transparent;border-color:#22c35b;box-shadow:none;color:#22c35b}.button.is-success.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}.button.is-success.is-inverted.is-outlined:hover,.button.is-success.is-inverted.is-outlined.is-hovered,.button.is-success.is-inverted.is-outlined:focus,.button.is-success.is-inverted.is-outlined.is-focused{background-color:#fff;color:#22c35b}.button.is-success.is-inverted.is-outlined.is-loading:hover::after,.button.is-success.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-success.is-inverted.is-outlined.is-loading:focus::after,.button.is-success.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #22c35b #22c35b !important}.button.is-success.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-success.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}.button.is-success.is-light{background-color:#eefcf3;color:#198f43}.button.is-success.is-light:hover,.button.is-success.is-light.is-hovered{background-color:#e3faeb;border-color:transparent;color:#198f43}.button.is-success.is-light:active,.button.is-success.is-light.is-active{background-color:#d8f8e3;border-color:transparent;color:#198f43}.button.is-warning{background-color:#ffdd57;border-color:transparent;color:rgba(0,0,0,0.7)}.button.is-warning:hover,.button.is-warning.is-hovered{background-color:#ffda4a;border-color:transparent;color:rgba(0,0,0,0.7)}.button.is-warning:focus,.button.is-warning.is-focused{border-color:transparent;color:rgba(0,0,0,0.7)}.button.is-warning:focus:not(:active),.button.is-warning.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(255,221,87,0.25)}.button.is-warning:active,.button.is-warning.is-active{background-color:#ffd83e;border-color:transparent;color:rgba(0,0,0,0.7)}.button.is-warning[disabled],fieldset[disabled] .button.is-warning{background-color:#ffdd57;border-color:#ffdd57;box-shadow:none}.button.is-warning.is-inverted{background-color:rgba(0,0,0,0.7);color:#ffdd57}.button.is-warning.is-inverted:hover,.button.is-warning.is-inverted.is-hovered{background-color:rgba(0,0,0,0.7)}.button.is-warning.is-inverted[disabled],fieldset[disabled] .button.is-warning.is-inverted{background-color:rgba(0,0,0,0.7);border-color:transparent;box-shadow:none;color:#ffdd57}.button.is-warning.is-loading::after{border-color:transparent transparent rgba(0,0,0,0.7) rgba(0,0,0,0.7) !important}.button.is-warning.is-outlined{background-color:transparent;border-color:#ffdd57;color:#ffdd57}.button.is-warning.is-outlined:hover,.button.is-warning.is-outlined.is-hovered,.button.is-warning.is-outlined:focus,.button.is-warning.is-outlined.is-focused{background-color:#ffdd57;border-color:#ffdd57;color:rgba(0,0,0,0.7)}.button.is-warning.is-outlined.is-loading::after{border-color:transparent transparent #ffdd57 #ffdd57 !important}.button.is-warning.is-outlined.is-loading:hover::after,.button.is-warning.is-outlined.is-loading.is-hovered::after,.button.is-warning.is-outlined.is-loading:focus::after,.button.is-warning.is-outlined.is-loading.is-focused::after{border-color:transparent transparent rgba(0,0,0,0.7) rgba(0,0,0,0.7) !important}.button.is-warning.is-outlined[disabled],fieldset[disabled] .button.is-warning.is-outlined{background-color:transparent;border-color:#ffdd57;box-shadow:none;color:#ffdd57}.button.is-warning.is-inverted.is-outlined{background-color:transparent;border-color:rgba(0,0,0,0.7);color:rgba(0,0,0,0.7)}.button.is-warning.is-inverted.is-outlined:hover,.button.is-warning.is-inverted.is-outlined.is-hovered,.button.is-warning.is-inverted.is-outlined:focus,.button.is-warning.is-inverted.is-outlined.is-focused{background-color:rgba(0,0,0,0.7);color:#ffdd57}.button.is-warning.is-inverted.is-outlined.is-loading:hover::after,.button.is-warning.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-warning.is-inverted.is-outlined.is-loading:focus::after,.button.is-warning.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #ffdd57 #ffdd57 !important}.button.is-warning.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-warning.is-inverted.is-outlined{background-color:transparent;border-color:rgba(0,0,0,0.7);box-shadow:none;color:rgba(0,0,0,0.7)}.button.is-warning.is-light{background-color:#fffbeb;color:#947600}.button.is-warning.is-light:hover,.button.is-warning.is-light.is-hovered{background-color:#fff8de;border-color:transparent;color:#947600}.button.is-warning.is-light:active,.button.is-warning.is-light.is-active{background-color:#fff6d1;border-color:transparent;color:#947600}.button.is-danger{background-color:#da0b00;border-color:transparent;color:#fff}.button.is-danger:hover,.button.is-danger.is-hovered{background-color:#cd0a00;border-color:transparent;color:#fff}.button.is-danger:focus,.button.is-danger.is-focused{border-color:transparent;color:#fff}.button.is-danger:focus:not(:active),.button.is-danger.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(218,11,0,0.25)}.button.is-danger:active,.button.is-danger.is-active{background-color:#c10a00;border-color:transparent;color:#fff}.button.is-danger[disabled],fieldset[disabled] .button.is-danger{background-color:#da0b00;border-color:#da0b00;box-shadow:none}.button.is-danger.is-inverted{background-color:#fff;color:#da0b00}.button.is-danger.is-inverted:hover,.button.is-danger.is-inverted.is-hovered{background-color:#f2f2f2}.button.is-danger.is-inverted[disabled],fieldset[disabled] .button.is-danger.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#da0b00}.button.is-danger.is-loading::after{border-color:transparent transparent #fff #fff !important}.button.is-danger.is-outlined{background-color:transparent;border-color:#da0b00;color:#da0b00}.button.is-danger.is-outlined:hover,.button.is-danger.is-outlined.is-hovered,.button.is-danger.is-outlined:focus,.button.is-danger.is-outlined.is-focused{background-color:#da0b00;border-color:#da0b00;color:#fff}.button.is-danger.is-outlined.is-loading::after{border-color:transparent transparent #da0b00 #da0b00 !important}.button.is-danger.is-outlined.is-loading:hover::after,.button.is-danger.is-outlined.is-loading.is-hovered::after,.button.is-danger.is-outlined.is-loading:focus::after,.button.is-danger.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #fff #fff !important}.button.is-danger.is-outlined[disabled],fieldset[disabled] .button.is-danger.is-outlined{background-color:transparent;border-color:#da0b00;box-shadow:none;color:#da0b00}.button.is-danger.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}.button.is-danger.is-inverted.is-outlined:hover,.button.is-danger.is-inverted.is-outlined.is-hovered,.button.is-danger.is-inverted.is-outlined:focus,.button.is-danger.is-inverted.is-outlined.is-focused{background-color:#fff;color:#da0b00}.button.is-danger.is-inverted.is-outlined.is-loading:hover::after,.button.is-danger.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-danger.is-inverted.is-outlined.is-loading:focus::after,.button.is-danger.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #da0b00 #da0b00 !important}.button.is-danger.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-danger.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}.button.is-danger.is-light{background-color:#ffeceb;color:#f50c00}.button.is-danger.is-light:hover,.button.is-danger.is-light.is-hovered{background-color:#ffe0de;border-color:transparent;color:#f50c00}.button.is-danger.is-light:active,.button.is-danger.is-light.is-active{background-color:#ffd3d1;border-color:transparent;color:#f50c00}.button.is-small,#documenter .docs-sidebar form.docs-search>input.button{font-size:.75rem}.button.is-small:not(.is-rounded),#documenter .docs-sidebar form.docs-search>input.button:not(.is-rounded){border-radius:2px}.button.is-normal{font-size:1rem}.button.is-medium{font-size:1.25rem}.button.is-large{font-size:1.5rem}.button[disabled],fieldset[disabled] .button{background-color:#fff;border-color:#dbdbdb;box-shadow:none;opacity:.5}.button.is-fullwidth{display:flex;width:100%}.button.is-loading{color:transparent !important;pointer-events:none}.button.is-loading::after{position:absolute;left:calc(50% - (1em * 0.5));top:calc(50% - (1em * 0.5));position:absolute !important}.button.is-static{background-color:#f5f5f5;border-color:#dbdbdb;color:#6b6b6b;box-shadow:none;pointer-events:none}.button.is-rounded,#documenter .docs-sidebar form.docs-search>input.button{border-radius:9999px;padding-left:calc(1em + 0.25em);padding-right:calc(1em + 0.25em)}.buttons{align-items:center;display:flex;flex-wrap:wrap;justify-content:flex-start}.buttons .button{margin-bottom:0.5rem}.buttons .button:not(:last-child):not(.is-fullwidth){margin-right:.5rem}.buttons:last-child{margin-bottom:-0.5rem}.buttons:not(:last-child){margin-bottom:1rem}.buttons.are-small .button:not(.is-normal):not(.is-medium):not(.is-large){font-size:.75rem}.buttons.are-small .button:not(.is-normal):not(.is-medium):not(.is-large):not(.is-rounded){border-radius:2px}.buttons.are-medium .button:not(.is-small):not(.is-normal):not(.is-large){font-size:1.25rem}.buttons.are-large .button:not(.is-small):not(.is-normal):not(.is-medium){font-size:1.5rem}.buttons.has-addons .button:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}.buttons.has-addons .button:not(:last-child){border-bottom-right-radius:0;border-top-right-radius:0;margin-right:-1px}.buttons.has-addons .button:last-child{margin-right:0}.buttons.has-addons .button:hover,.buttons.has-addons .button.is-hovered{z-index:2}.buttons.has-addons .button:focus,.buttons.has-addons .button.is-focused,.buttons.has-addons .button:active,.buttons.has-addons .button.is-active,.buttons.has-addons .button.is-selected{z-index:3}.buttons.has-addons .button:focus:hover,.buttons.has-addons .button.is-focused:hover,.buttons.has-addons .button:active:hover,.buttons.has-addons .button.is-active:hover,.buttons.has-addons .button.is-selected:hover{z-index:4}.buttons.has-addons .button.is-expanded{flex-grow:1;flex-shrink:1}.buttons.is-centered{justify-content:center}.buttons.is-centered:not(.has-addons) .button:not(.is-fullwidth){margin-left:0.25rem;margin-right:0.25rem}.buttons.is-right{justify-content:flex-end}.buttons.is-right:not(.has-addons) .button:not(.is-fullwidth){margin-left:0.25rem;margin-right:0.25rem}@media screen and (max-width: 768px){.button.is-responsive.is-small,#documenter .docs-sidebar form.docs-search>input.is-responsive{font-size:.5625rem}.button.is-responsive,.button.is-responsive.is-normal{font-size:.65625rem}.button.is-responsive.is-medium{font-size:.75rem}.button.is-responsive.is-large{font-size:1rem}}@media screen and (min-width: 769px) and (max-width: 1055px){.button.is-responsive.is-small,#documenter .docs-sidebar form.docs-search>input.is-responsive{font-size:.65625rem}.button.is-responsive,.button.is-responsive.is-normal{font-size:.75rem}.button.is-responsive.is-medium{font-size:1rem}.button.is-responsive.is-large{font-size:1.25rem}}.container{flex-grow:1;margin:0 auto;position:relative;width:auto}.container.is-fluid{max-width:none !important;padding-left:32px;padding-right:32px;width:100%}@media screen and (min-width: 1056px){.container{max-width:992px}}@media screen and (max-width: 1215px){.container.is-widescreen:not(.is-max-desktop){max-width:1152px}}@media screen and (max-width: 1407px){.container.is-fullhd:not(.is-max-desktop):not(.is-max-widescreen){max-width:1344px}}@media screen and (min-width: 1216px){.container:not(.is-max-desktop){max-width:1152px}}@media screen and (min-width: 1408px){.container:not(.is-max-desktop):not(.is-max-widescreen){max-width:1344px}}.content li+li{margin-top:0.25em}.content p:not(:last-child),.content dl:not(:last-child),.content ol:not(:last-child),.content ul:not(:last-child),.content blockquote:not(:last-child),.content pre:not(:last-child),.content table:not(:last-child){margin-bottom:1em}.content h1,.content h2,.content h3,.content h4,.content h5,.content h6{color:#222;font-weight:600;line-height:1.125}.content h1{font-size:2em;margin-bottom:0.5em}.content h1:not(:first-child){margin-top:1em}.content h2{font-size:1.75em;margin-bottom:0.5714em}.content h2:not(:first-child){margin-top:1.1428em}.content h3{font-size:1.5em;margin-bottom:0.6666em}.content h3:not(:first-child){margin-top:1.3333em}.content h4{font-size:1.25em;margin-bottom:0.8em}.content h5{font-size:1.125em;margin-bottom:0.8888em}.content h6{font-size:1em;margin-bottom:1em}.content blockquote{background-color:#f5f5f5;border-left:5px solid #dbdbdb;padding:1.25em 1.5em}.content ol{list-style-position:outside;margin-left:2em;margin-top:1em}.content ol:not([type]){list-style-type:decimal}.content ol.is-lower-alpha:not([type]){list-style-type:lower-alpha}.content ol.is-lower-roman:not([type]){list-style-type:lower-roman}.content ol.is-upper-alpha:not([type]){list-style-type:upper-alpha}.content ol.is-upper-roman:not([type]){list-style-type:upper-roman}.content ul{list-style:disc outside;margin-left:2em;margin-top:1em}.content ul ul{list-style-type:circle;margin-top:0.5em}.content ul ul ul{list-style-type:square}.content dd{margin-left:2em}.content figure{margin-left:2em;margin-right:2em;text-align:center}.content figure:not(:first-child){margin-top:2em}.content figure:not(:last-child){margin-bottom:2em}.content figure img{display:inline-block}.content figure figcaption{font-style:italic}.content pre{-webkit-overflow-scrolling:touch;overflow-x:auto;padding:0;white-space:pre;word-wrap:normal}.content sup,.content sub{font-size:75%}.content table{width:100%}.content table td,.content table th{border:1px solid #dbdbdb;border-width:0 0 1px;padding:0.5em 0.75em;vertical-align:top}.content table th{color:#222}.content table th:not([align]){text-align:inherit}.content table thead td,.content table thead th{border-width:0 0 2px;color:#222}.content table tfoot td,.content table tfoot th{border-width:2px 0 0;color:#222}.content table tbody tr:last-child td,.content table tbody tr:last-child th{border-bottom-width:0}.content .tabs li+li{margin-top:0}.content.is-small,#documenter .docs-sidebar form.docs-search>input.content{font-size:.75rem}.content.is-normal{font-size:1rem}.content.is-medium{font-size:1.25rem}.content.is-large{font-size:1.5rem}.icon{align-items:center;display:inline-flex;justify-content:center;height:1.5rem;width:1.5rem}.icon.is-small,#documenter .docs-sidebar form.docs-search>input.icon{height:1rem;width:1rem}.icon.is-medium{height:2rem;width:2rem}.icon.is-large{height:3rem;width:3rem}.icon-text{align-items:flex-start;color:inherit;display:inline-flex;flex-wrap:wrap;line-height:1.5rem;vertical-align:top}.icon-text .icon{flex-grow:0;flex-shrink:0}.icon-text .icon:not(:last-child){margin-right:.25em}.icon-text .icon:not(:first-child){margin-left:.25em}div.icon-text{display:flex}.image,#documenter .docs-sidebar .docs-logo>img{display:block;position:relative}.image img,#documenter .docs-sidebar .docs-logo>img img{display:block;height:auto;width:100%}.image img.is-rounded,#documenter .docs-sidebar .docs-logo>img img.is-rounded{border-radius:9999px}.image.is-fullwidth,#documenter .docs-sidebar .docs-logo>img.is-fullwidth{width:100%}.image.is-square img,#documenter .docs-sidebar .docs-logo>img.is-square img,.image.is-square .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-square .has-ratio,.image.is-1by1 img,#documenter .docs-sidebar .docs-logo>img.is-1by1 img,.image.is-1by1 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-1by1 .has-ratio,.image.is-5by4 img,#documenter .docs-sidebar .docs-logo>img.is-5by4 img,.image.is-5by4 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-5by4 .has-ratio,.image.is-4by3 img,#documenter .docs-sidebar .docs-logo>img.is-4by3 img,.image.is-4by3 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-4by3 .has-ratio,.image.is-3by2 img,#documenter .docs-sidebar .docs-logo>img.is-3by2 img,.image.is-3by2 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-3by2 .has-ratio,.image.is-5by3 img,#documenter .docs-sidebar .docs-logo>img.is-5by3 img,.image.is-5by3 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-5by3 .has-ratio,.image.is-16by9 img,#documenter .docs-sidebar .docs-logo>img.is-16by9 img,.image.is-16by9 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-16by9 .has-ratio,.image.is-2by1 img,#documenter .docs-sidebar .docs-logo>img.is-2by1 img,.image.is-2by1 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-2by1 .has-ratio,.image.is-3by1 img,#documenter .docs-sidebar .docs-logo>img.is-3by1 img,.image.is-3by1 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-3by1 .has-ratio,.image.is-4by5 img,#documenter .docs-sidebar .docs-logo>img.is-4by5 img,.image.is-4by5 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-4by5 .has-ratio,.image.is-3by4 img,#documenter .docs-sidebar .docs-logo>img.is-3by4 img,.image.is-3by4 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-3by4 .has-ratio,.image.is-2by3 img,#documenter .docs-sidebar .docs-logo>img.is-2by3 img,.image.is-2by3 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-2by3 .has-ratio,.image.is-3by5 img,#documenter .docs-sidebar .docs-logo>img.is-3by5 img,.image.is-3by5 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-3by5 .has-ratio,.image.is-9by16 img,#documenter .docs-sidebar .docs-logo>img.is-9by16 img,.image.is-9by16 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-9by16 .has-ratio,.image.is-1by2 img,#documenter .docs-sidebar .docs-logo>img.is-1by2 img,.image.is-1by2 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-1by2 .has-ratio,.image.is-1by3 img,#documenter .docs-sidebar .docs-logo>img.is-1by3 img,.image.is-1by3 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-1by3 .has-ratio{height:100%;width:100%}.image.is-square,#documenter .docs-sidebar .docs-logo>img.is-square,.image.is-1by1,#documenter .docs-sidebar .docs-logo>img.is-1by1{padding-top:100%}.image.is-5by4,#documenter .docs-sidebar .docs-logo>img.is-5by4{padding-top:80%}.image.is-4by3,#documenter .docs-sidebar .docs-logo>img.is-4by3{padding-top:75%}.image.is-3by2,#documenter .docs-sidebar .docs-logo>img.is-3by2{padding-top:66.6666%}.image.is-5by3,#documenter .docs-sidebar .docs-logo>img.is-5by3{padding-top:60%}.image.is-16by9,#documenter .docs-sidebar .docs-logo>img.is-16by9{padding-top:56.25%}.image.is-2by1,#documenter .docs-sidebar .docs-logo>img.is-2by1{padding-top:50%}.image.is-3by1,#documenter .docs-sidebar .docs-logo>img.is-3by1{padding-top:33.3333%}.image.is-4by5,#documenter .docs-sidebar .docs-logo>img.is-4by5{padding-top:125%}.image.is-3by4,#documenter .docs-sidebar .docs-logo>img.is-3by4{padding-top:133.3333%}.image.is-2by3,#documenter .docs-sidebar .docs-logo>img.is-2by3{padding-top:150%}.image.is-3by5,#documenter .docs-sidebar .docs-logo>img.is-3by5{padding-top:166.6666%}.image.is-9by16,#documenter .docs-sidebar .docs-logo>img.is-9by16{padding-top:177.7777%}.image.is-1by2,#documenter .docs-sidebar .docs-logo>img.is-1by2{padding-top:200%}.image.is-1by3,#documenter .docs-sidebar .docs-logo>img.is-1by3{padding-top:300%}.image.is-16x16,#documenter .docs-sidebar .docs-logo>img.is-16x16{height:16px;width:16px}.image.is-24x24,#documenter .docs-sidebar .docs-logo>img.is-24x24{height:24px;width:24px}.image.is-32x32,#documenter .docs-sidebar .docs-logo>img.is-32x32{height:32px;width:32px}.image.is-48x48,#documenter .docs-sidebar .docs-logo>img.is-48x48{height:48px;width:48px}.image.is-64x64,#documenter .docs-sidebar .docs-logo>img.is-64x64{height:64px;width:64px}.image.is-96x96,#documenter .docs-sidebar .docs-logo>img.is-96x96{height:96px;width:96px}.image.is-128x128,#documenter .docs-sidebar .docs-logo>img.is-128x128{height:128px;width:128px}.notification{background-color:#f5f5f5;border-radius:4px;position:relative;padding:1.25rem 2.5rem 1.25rem 1.5rem}.notification a:not(.button):not(.dropdown-item){color:currentColor;text-decoration:underline}.notification strong{color:currentColor}.notification code,.notification pre{background:#fff}.notification pre code{background:transparent}.notification>.delete{right:.5rem;position:absolute;top:0.5rem}.notification .title,.notification .subtitle,.notification .content{color:currentColor}.notification.is-white{background-color:#fff;color:#0a0a0a}.notification.is-black{background-color:#0a0a0a;color:#fff}.notification.is-light{background-color:#f5f5f5;color:rgba(0,0,0,0.7)}.notification.is-dark,.content kbd.notification{background-color:#363636;color:#fff}.notification.is-primary,.docstring>section>a.notification.docs-sourcelink{background-color:#4eb5de;color:#fff}.notification.is-primary.is-light,.docstring>section>a.notification.is-light.docs-sourcelink{background-color:#eef8fc;color:#1a6d8e}.notification.is-link{background-color:#2e63b8;color:#fff}.notification.is-link.is-light{background-color:#eff3fb;color:#3169c4}.notification.is-info{background-color:#209cee;color:#fff}.notification.is-info.is-light{background-color:#ecf7fe;color:#0e72b4}.notification.is-success{background-color:#22c35b;color:#fff}.notification.is-success.is-light{background-color:#eefcf3;color:#198f43}.notification.is-warning{background-color:#ffdd57;color:rgba(0,0,0,0.7)}.notification.is-warning.is-light{background-color:#fffbeb;color:#947600}.notification.is-danger{background-color:#da0b00;color:#fff}.notification.is-danger.is-light{background-color:#ffeceb;color:#f50c00}.progress{-moz-appearance:none;-webkit-appearance:none;border:none;border-radius:9999px;display:block;height:1rem;overflow:hidden;padding:0;width:100%}.progress::-webkit-progress-bar{background-color:#ededed}.progress::-webkit-progress-value{background-color:#222}.progress::-moz-progress-bar{background-color:#222}.progress::-ms-fill{background-color:#222;border:none}.progress.is-white::-webkit-progress-value{background-color:#fff}.progress.is-white::-moz-progress-bar{background-color:#fff}.progress.is-white::-ms-fill{background-color:#fff}.progress.is-white:indeterminate{background-image:linear-gradient(to right, #fff 30%, #ededed 30%)}.progress.is-black::-webkit-progress-value{background-color:#0a0a0a}.progress.is-black::-moz-progress-bar{background-color:#0a0a0a}.progress.is-black::-ms-fill{background-color:#0a0a0a}.progress.is-black:indeterminate{background-image:linear-gradient(to right, #0a0a0a 30%, #ededed 30%)}.progress.is-light::-webkit-progress-value{background-color:#f5f5f5}.progress.is-light::-moz-progress-bar{background-color:#f5f5f5}.progress.is-light::-ms-fill{background-color:#f5f5f5}.progress.is-light:indeterminate{background-image:linear-gradient(to right, #f5f5f5 30%, #ededed 30%)}.progress.is-dark::-webkit-progress-value,.content kbd.progress::-webkit-progress-value{background-color:#363636}.progress.is-dark::-moz-progress-bar,.content kbd.progress::-moz-progress-bar{background-color:#363636}.progress.is-dark::-ms-fill,.content kbd.progress::-ms-fill{background-color:#363636}.progress.is-dark:indeterminate,.content kbd.progress:indeterminate{background-image:linear-gradient(to right, #363636 30%, #ededed 30%)}.progress.is-primary::-webkit-progress-value,.docstring>section>a.progress.docs-sourcelink::-webkit-progress-value{background-color:#4eb5de}.progress.is-primary::-moz-progress-bar,.docstring>section>a.progress.docs-sourcelink::-moz-progress-bar{background-color:#4eb5de}.progress.is-primary::-ms-fill,.docstring>section>a.progress.docs-sourcelink::-ms-fill{background-color:#4eb5de}.progress.is-primary:indeterminate,.docstring>section>a.progress.docs-sourcelink:indeterminate{background-image:linear-gradient(to right, #4eb5de 30%, #ededed 30%)}.progress.is-link::-webkit-progress-value{background-color:#2e63b8}.progress.is-link::-moz-progress-bar{background-color:#2e63b8}.progress.is-link::-ms-fill{background-color:#2e63b8}.progress.is-link:indeterminate{background-image:linear-gradient(to right, #2e63b8 30%, #ededed 30%)}.progress.is-info::-webkit-progress-value{background-color:#209cee}.progress.is-info::-moz-progress-bar{background-color:#209cee}.progress.is-info::-ms-fill{background-color:#209cee}.progress.is-info:indeterminate{background-image:linear-gradient(to right, #209cee 30%, #ededed 30%)}.progress.is-success::-webkit-progress-value{background-color:#22c35b}.progress.is-success::-moz-progress-bar{background-color:#22c35b}.progress.is-success::-ms-fill{background-color:#22c35b}.progress.is-success:indeterminate{background-image:linear-gradient(to right, #22c35b 30%, #ededed 30%)}.progress.is-warning::-webkit-progress-value{background-color:#ffdd57}.progress.is-warning::-moz-progress-bar{background-color:#ffdd57}.progress.is-warning::-ms-fill{background-color:#ffdd57}.progress.is-warning:indeterminate{background-image:linear-gradient(to right, #ffdd57 30%, #ededed 30%)}.progress.is-danger::-webkit-progress-value{background-color:#da0b00}.progress.is-danger::-moz-progress-bar{background-color:#da0b00}.progress.is-danger::-ms-fill{background-color:#da0b00}.progress.is-danger:indeterminate{background-image:linear-gradient(to right, #da0b00 30%, #ededed 30%)}.progress:indeterminate{animation-duration:1.5s;animation-iteration-count:infinite;animation-name:moveIndeterminate;animation-timing-function:linear;background-color:#ededed;background-image:linear-gradient(to right, #222 30%, #ededed 30%);background-position:top left;background-repeat:no-repeat;background-size:150% 150%}.progress:indeterminate::-webkit-progress-bar{background-color:transparent}.progress:indeterminate::-moz-progress-bar{background-color:transparent}.progress:indeterminate::-ms-fill{animation-name:none}.progress.is-small,#documenter .docs-sidebar form.docs-search>input.progress{height:.75rem}.progress.is-medium{height:1.25rem}.progress.is-large{height:1.5rem}@keyframes moveIndeterminate{from{background-position:200% 0}to{background-position:-200% 0}}.table{background-color:#fff;color:#222}.table td,.table th{border:1px solid #dbdbdb;border-width:0 0 1px;padding:0.5em 0.75em;vertical-align:top}.table td.is-white,.table th.is-white{background-color:#fff;border-color:#fff;color:#0a0a0a}.table td.is-black,.table th.is-black{background-color:#0a0a0a;border-color:#0a0a0a;color:#fff}.table td.is-light,.table th.is-light{background-color:#f5f5f5;border-color:#f5f5f5;color:rgba(0,0,0,0.7)}.table td.is-dark,.table th.is-dark{background-color:#363636;border-color:#363636;color:#fff}.table td.is-primary,.table th.is-primary{background-color:#4eb5de;border-color:#4eb5de;color:#fff}.table td.is-link,.table th.is-link{background-color:#2e63b8;border-color:#2e63b8;color:#fff}.table td.is-info,.table th.is-info{background-color:#209cee;border-color:#209cee;color:#fff}.table td.is-success,.table th.is-success{background-color:#22c35b;border-color:#22c35b;color:#fff}.table td.is-warning,.table th.is-warning{background-color:#ffdd57;border-color:#ffdd57;color:rgba(0,0,0,0.7)}.table td.is-danger,.table th.is-danger{background-color:#da0b00;border-color:#da0b00;color:#fff}.table td.is-narrow,.table th.is-narrow{white-space:nowrap;width:1%}.table td.is-selected,.table th.is-selected{background-color:#4eb5de;color:#fff}.table td.is-selected a,.table td.is-selected strong,.table th.is-selected a,.table th.is-selected strong{color:currentColor}.table td.is-vcentered,.table th.is-vcentered{vertical-align:middle}.table th{color:#222}.table th:not([align]){text-align:left}.table tr.is-selected{background-color:#4eb5de;color:#fff}.table tr.is-selected a,.table tr.is-selected strong{color:currentColor}.table tr.is-selected td,.table tr.is-selected th{border-color:#fff;color:currentColor}.table thead{background-color:rgba(0,0,0,0)}.table thead td,.table thead th{border-width:0 0 2px;color:#222}.table tfoot{background-color:rgba(0,0,0,0)}.table tfoot td,.table tfoot th{border-width:2px 0 0;color:#222}.table tbody{background-color:rgba(0,0,0,0)}.table tbody tr:last-child td,.table tbody tr:last-child th{border-bottom-width:0}.table.is-bordered td,.table.is-bordered th{border-width:1px}.table.is-bordered tr:last-child td,.table.is-bordered tr:last-child th{border-bottom-width:1px}.table.is-fullwidth{width:100%}.table.is-hoverable tbody tr:not(.is-selected):hover{background-color:#fafafa}.table.is-hoverable.is-striped tbody tr:not(.is-selected):hover{background-color:#fafafa}.table.is-hoverable.is-striped tbody tr:not(.is-selected):hover:nth-child(even){background-color:#f5f5f5}.table.is-narrow td,.table.is-narrow th{padding:0.25em 0.5em}.table.is-striped tbody tr:not(.is-selected):nth-child(even){background-color:#fafafa}.table-container{-webkit-overflow-scrolling:touch;overflow:auto;overflow-y:hidden;max-width:100%}.tags{align-items:center;display:flex;flex-wrap:wrap;justify-content:flex-start}.tags .tag,.tags .content kbd,.content .tags kbd,.tags .docstring>section>a.docs-sourcelink{margin-bottom:0.5rem}.tags .tag:not(:last-child),.tags .content kbd:not(:last-child),.content .tags kbd:not(:last-child),.tags .docstring>section>a.docs-sourcelink:not(:last-child){margin-right:.5rem}.tags:last-child{margin-bottom:-0.5rem}.tags:not(:last-child){margin-bottom:1rem}.tags.are-medium .tag:not(.is-normal):not(.is-large),.tags.are-medium .content kbd:not(.is-normal):not(.is-large),.content .tags.are-medium kbd:not(.is-normal):not(.is-large),.tags.are-medium .docstring>section>a.docs-sourcelink:not(.is-normal):not(.is-large){font-size:1rem}.tags.are-large .tag:not(.is-normal):not(.is-medium),.tags.are-large .content kbd:not(.is-normal):not(.is-medium),.content .tags.are-large kbd:not(.is-normal):not(.is-medium),.tags.are-large .docstring>section>a.docs-sourcelink:not(.is-normal):not(.is-medium){font-size:1.25rem}.tags.is-centered{justify-content:center}.tags.is-centered .tag,.tags.is-centered .content kbd,.content .tags.is-centered kbd,.tags.is-centered .docstring>section>a.docs-sourcelink{margin-right:0.25rem;margin-left:0.25rem}.tags.is-right{justify-content:flex-end}.tags.is-right .tag:not(:first-child),.tags.is-right .content kbd:not(:first-child),.content .tags.is-right kbd:not(:first-child),.tags.is-right .docstring>section>a.docs-sourcelink:not(:first-child){margin-left:0.5rem}.tags.is-right .tag:not(:last-child),.tags.is-right .content kbd:not(:last-child),.content .tags.is-right kbd:not(:last-child),.tags.is-right .docstring>section>a.docs-sourcelink:not(:last-child){margin-right:0}.tags.has-addons .tag,.tags.has-addons .content kbd,.content .tags.has-addons kbd,.tags.has-addons .docstring>section>a.docs-sourcelink{margin-right:0}.tags.has-addons .tag:not(:first-child),.tags.has-addons .content kbd:not(:first-child),.content .tags.has-addons kbd:not(:first-child),.tags.has-addons .docstring>section>a.docs-sourcelink:not(:first-child){margin-left:0;border-top-left-radius:0;border-bottom-left-radius:0}.tags.has-addons .tag:not(:last-child),.tags.has-addons .content kbd:not(:last-child),.content .tags.has-addons kbd:not(:last-child),.tags.has-addons .docstring>section>a.docs-sourcelink:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.tag:not(body),.content kbd:not(body),.docstring>section>a.docs-sourcelink:not(body){align-items:center;background-color:#f5f5f5;border-radius:4px;color:#222;display:inline-flex;font-size:.75rem;height:2em;justify-content:center;line-height:1.5;padding-left:0.75em;padding-right:0.75em;white-space:nowrap}.tag:not(body) .delete,.content kbd:not(body) .delete,.docstring>section>a.docs-sourcelink:not(body) .delete{margin-left:.25rem;margin-right:-.375rem}.tag.is-white:not(body),.content kbd.is-white:not(body),.docstring>section>a.docs-sourcelink.is-white:not(body){background-color:#fff;color:#0a0a0a}.tag.is-black:not(body),.content kbd.is-black:not(body),.docstring>section>a.docs-sourcelink.is-black:not(body){background-color:#0a0a0a;color:#fff}.tag.is-light:not(body),.content kbd.is-light:not(body),.docstring>section>a.docs-sourcelink.is-light:not(body){background-color:#f5f5f5;color:rgba(0,0,0,0.7)}.tag.is-dark:not(body),.content kbd:not(body),.docstring>section>a.docs-sourcelink.is-dark:not(body),.content .docstring>section>kbd:not(body){background-color:#363636;color:#fff}.tag.is-primary:not(body),.content kbd.is-primary:not(body),.docstring>section>a.docs-sourcelink:not(body){background-color:#4eb5de;color:#fff}.tag.is-primary.is-light:not(body),.content kbd.is-primary.is-light:not(body),.docstring>section>a.docs-sourcelink.is-light:not(body){background-color:#eef8fc;color:#1a6d8e}.tag.is-link:not(body),.content kbd.is-link:not(body),.docstring>section>a.docs-sourcelink.is-link:not(body){background-color:#2e63b8;color:#fff}.tag.is-link.is-light:not(body),.content kbd.is-link.is-light:not(body),.docstring>section>a.docs-sourcelink.is-link.is-light:not(body){background-color:#eff3fb;color:#3169c4}.tag.is-info:not(body),.content kbd.is-info:not(body),.docstring>section>a.docs-sourcelink.is-info:not(body){background-color:#209cee;color:#fff}.tag.is-info.is-light:not(body),.content kbd.is-info.is-light:not(body),.docstring>section>a.docs-sourcelink.is-info.is-light:not(body){background-color:#ecf7fe;color:#0e72b4}.tag.is-success:not(body),.content kbd.is-success:not(body),.docstring>section>a.docs-sourcelink.is-success:not(body){background-color:#22c35b;color:#fff}.tag.is-success.is-light:not(body),.content kbd.is-success.is-light:not(body),.docstring>section>a.docs-sourcelink.is-success.is-light:not(body){background-color:#eefcf3;color:#198f43}.tag.is-warning:not(body),.content kbd.is-warning:not(body),.docstring>section>a.docs-sourcelink.is-warning:not(body){background-color:#ffdd57;color:rgba(0,0,0,0.7)}.tag.is-warning.is-light:not(body),.content kbd.is-warning.is-light:not(body),.docstring>section>a.docs-sourcelink.is-warning.is-light:not(body){background-color:#fffbeb;color:#947600}.tag.is-danger:not(body),.content kbd.is-danger:not(body),.docstring>section>a.docs-sourcelink.is-danger:not(body){background-color:#da0b00;color:#fff}.tag.is-danger.is-light:not(body),.content kbd.is-danger.is-light:not(body),.docstring>section>a.docs-sourcelink.is-danger.is-light:not(body){background-color:#ffeceb;color:#f50c00}.tag.is-normal:not(body),.content kbd.is-normal:not(body),.docstring>section>a.docs-sourcelink.is-normal:not(body){font-size:.75rem}.tag.is-medium:not(body),.content kbd.is-medium:not(body),.docstring>section>a.docs-sourcelink.is-medium:not(body){font-size:1rem}.tag.is-large:not(body),.content kbd.is-large:not(body),.docstring>section>a.docs-sourcelink.is-large:not(body){font-size:1.25rem}.tag:not(body) .icon:first-child:not(:last-child),.content kbd:not(body) .icon:first-child:not(:last-child),.docstring>section>a.docs-sourcelink:not(body) .icon:first-child:not(:last-child){margin-left:-.375em;margin-right:.1875em}.tag:not(body) .icon:last-child:not(:first-child),.content kbd:not(body) .icon:last-child:not(:first-child),.docstring>section>a.docs-sourcelink:not(body) .icon:last-child:not(:first-child){margin-left:.1875em;margin-right:-.375em}.tag:not(body) .icon:first-child:last-child,.content kbd:not(body) .icon:first-child:last-child,.docstring>section>a.docs-sourcelink:not(body) .icon:first-child:last-child{margin-left:-.375em;margin-right:-.375em}.tag.is-delete:not(body),.content kbd.is-delete:not(body),.docstring>section>a.docs-sourcelink.is-delete:not(body){margin-left:1px;padding:0;position:relative;width:2em}.tag.is-delete:not(body)::before,.content kbd.is-delete:not(body)::before,.docstring>section>a.docs-sourcelink.is-delete:not(body)::before,.tag.is-delete:not(body)::after,.content kbd.is-delete:not(body)::after,.docstring>section>a.docs-sourcelink.is-delete:not(body)::after{background-color:currentColor;content:"";display:block;left:50%;position:absolute;top:50%;transform:translateX(-50%) translateY(-50%) rotate(45deg);transform-origin:center center}.tag.is-delete:not(body)::before,.content kbd.is-delete:not(body)::before,.docstring>section>a.docs-sourcelink.is-delete:not(body)::before{height:1px;width:50%}.tag.is-delete:not(body)::after,.content kbd.is-delete:not(body)::after,.docstring>section>a.docs-sourcelink.is-delete:not(body)::after{height:50%;width:1px}.tag.is-delete:not(body):hover,.content kbd.is-delete:not(body):hover,.docstring>section>a.docs-sourcelink.is-delete:not(body):hover,.tag.is-delete:not(body):focus,.content kbd.is-delete:not(body):focus,.docstring>section>a.docs-sourcelink.is-delete:not(body):focus{background-color:#e8e8e8}.tag.is-delete:not(body):active,.content kbd.is-delete:not(body):active,.docstring>section>a.docs-sourcelink.is-delete:not(body):active{background-color:#dbdbdb}.tag.is-rounded:not(body),#documenter .docs-sidebar form.docs-search>input:not(body),.content kbd.is-rounded:not(body),#documenter .docs-sidebar .content form.docs-search>input:not(body),.docstring>section>a.docs-sourcelink.is-rounded:not(body){border-radius:9999px}a.tag:hover,.docstring>section>a.docs-sourcelink:hover{text-decoration:underline}.title,.subtitle{word-break:break-word}.title em,.title span,.subtitle em,.subtitle span{font-weight:inherit}.title sub,.subtitle sub{font-size:.75em}.title sup,.subtitle sup{font-size:.75em}.title .tag,.title .content kbd,.content .title kbd,.title .docstring>section>a.docs-sourcelink,.subtitle .tag,.subtitle .content kbd,.content .subtitle kbd,.subtitle .docstring>section>a.docs-sourcelink{vertical-align:middle}.title{color:#222;font-size:2rem;font-weight:600;line-height:1.125}.title strong{color:inherit;font-weight:inherit}.title:not(.is-spaced)+.subtitle{margin-top:-1.25rem}.title.is-1{font-size:3rem}.title.is-2{font-size:2.5rem}.title.is-3{font-size:2rem}.title.is-4{font-size:1.5rem}.title.is-5{font-size:1.25rem}.title.is-6{font-size:1rem}.title.is-7{font-size:.75rem}.subtitle{color:#222;font-size:1.25rem;font-weight:400;line-height:1.25}.subtitle strong{color:#222;font-weight:600}.subtitle:not(.is-spaced)+.title{margin-top:-1.25rem}.subtitle.is-1{font-size:3rem}.subtitle.is-2{font-size:2.5rem}.subtitle.is-3{font-size:2rem}.subtitle.is-4{font-size:1.5rem}.subtitle.is-5{font-size:1.25rem}.subtitle.is-6{font-size:1rem}.subtitle.is-7{font-size:.75rem}.heading{display:block;font-size:11px;letter-spacing:1px;margin-bottom:5px;text-transform:uppercase}.number{align-items:center;background-color:#f5f5f5;border-radius:9999px;display:inline-flex;font-size:1.25rem;height:2em;justify-content:center;margin-right:1.5rem;min-width:2.5em;padding:0.25rem 0.5rem;text-align:center;vertical-align:top}.select select,.textarea,.input,#documenter .docs-sidebar form.docs-search>input{background-color:#fff;border-color:#dbdbdb;border-radius:4px;color:#222}.select select::-moz-placeholder,.textarea::-moz-placeholder,.input::-moz-placeholder,#documenter .docs-sidebar form.docs-search>input::-moz-placeholder{color:#707070}.select select::-webkit-input-placeholder,.textarea::-webkit-input-placeholder,.input::-webkit-input-placeholder,#documenter .docs-sidebar form.docs-search>input::-webkit-input-placeholder{color:#707070}.select select:-moz-placeholder,.textarea:-moz-placeholder,.input:-moz-placeholder,#documenter .docs-sidebar form.docs-search>input:-moz-placeholder{color:#707070}.select select:-ms-input-placeholder,.textarea:-ms-input-placeholder,.input:-ms-input-placeholder,#documenter .docs-sidebar form.docs-search>input:-ms-input-placeholder{color:#707070}.select select:hover,.textarea:hover,.input:hover,#documenter .docs-sidebar form.docs-search>input:hover,.select select.is-hovered,.is-hovered.textarea,.is-hovered.input,#documenter .docs-sidebar form.docs-search>input.is-hovered{border-color:#b5b5b5}.select select:focus,.textarea:focus,.input:focus,#documenter .docs-sidebar form.docs-search>input:focus,.select select.is-focused,.is-focused.textarea,.is-focused.input,#documenter .docs-sidebar form.docs-search>input.is-focused,.select select:active,.textarea:active,.input:active,#documenter .docs-sidebar form.docs-search>input:active,.select select.is-active,.is-active.textarea,.is-active.input,#documenter .docs-sidebar form.docs-search>input.is-active{border-color:#2e63b8;box-shadow:0 0 0 0.125em rgba(46,99,184,0.25)}.select select[disabled],.textarea[disabled],.input[disabled],#documenter .docs-sidebar form.docs-search>input[disabled],fieldset[disabled] .select select,.select fieldset[disabled] select,fieldset[disabled] .textarea,fieldset[disabled] .input,fieldset[disabled] #documenter .docs-sidebar form.docs-search>input,#documenter .docs-sidebar fieldset[disabled] form.docs-search>input{background-color:#f5f5f5;border-color:#f5f5f5;box-shadow:none;color:#6b6b6b}.select select[disabled]::-moz-placeholder,.textarea[disabled]::-moz-placeholder,.input[disabled]::-moz-placeholder,#documenter .docs-sidebar form.docs-search>input[disabled]::-moz-placeholder,fieldset[disabled] .select select::-moz-placeholder,.select fieldset[disabled] select::-moz-placeholder,fieldset[disabled] .textarea::-moz-placeholder,fieldset[disabled] .input::-moz-placeholder,fieldset[disabled] #documenter .docs-sidebar form.docs-search>input::-moz-placeholder,#documenter .docs-sidebar fieldset[disabled] form.docs-search>input::-moz-placeholder{color:rgba(107,107,107,0.3)}.select select[disabled]::-webkit-input-placeholder,.textarea[disabled]::-webkit-input-placeholder,.input[disabled]::-webkit-input-placeholder,#documenter .docs-sidebar form.docs-search>input[disabled]::-webkit-input-placeholder,fieldset[disabled] .select select::-webkit-input-placeholder,.select fieldset[disabled] select::-webkit-input-placeholder,fieldset[disabled] .textarea::-webkit-input-placeholder,fieldset[disabled] .input::-webkit-input-placeholder,fieldset[disabled] #documenter .docs-sidebar form.docs-search>input::-webkit-input-placeholder,#documenter .docs-sidebar fieldset[disabled] form.docs-search>input::-webkit-input-placeholder{color:rgba(107,107,107,0.3)}.select select[disabled]:-moz-placeholder,.textarea[disabled]:-moz-placeholder,.input[disabled]:-moz-placeholder,#documenter .docs-sidebar form.docs-search>input[disabled]:-moz-placeholder,fieldset[disabled] .select select:-moz-placeholder,.select fieldset[disabled] select:-moz-placeholder,fieldset[disabled] .textarea:-moz-placeholder,fieldset[disabled] .input:-moz-placeholder,fieldset[disabled] #documenter .docs-sidebar form.docs-search>input:-moz-placeholder,#documenter .docs-sidebar fieldset[disabled] form.docs-search>input:-moz-placeholder{color:rgba(107,107,107,0.3)}.select select[disabled]:-ms-input-placeholder,.textarea[disabled]:-ms-input-placeholder,.input[disabled]:-ms-input-placeholder,#documenter .docs-sidebar form.docs-search>input[disabled]:-ms-input-placeholder,fieldset[disabled] .select select:-ms-input-placeholder,.select fieldset[disabled] select:-ms-input-placeholder,fieldset[disabled] .textarea:-ms-input-placeholder,fieldset[disabled] .input:-ms-input-placeholder,fieldset[disabled] #documenter .docs-sidebar form.docs-search>input:-ms-input-placeholder,#documenter .docs-sidebar fieldset[disabled] form.docs-search>input:-ms-input-placeholder{color:rgba(107,107,107,0.3)}.textarea,.input,#documenter .docs-sidebar form.docs-search>input{box-shadow:inset 0 0.0625em 0.125em rgba(10,10,10,0.05);max-width:100%;width:100%}.textarea[readonly],.input[readonly],#documenter .docs-sidebar form.docs-search>input[readonly]{box-shadow:none}.is-white.textarea,.is-white.input,#documenter .docs-sidebar form.docs-search>input.is-white{border-color:#fff}.is-white.textarea:focus,.is-white.input:focus,#documenter .docs-sidebar form.docs-search>input.is-white:focus,.is-white.is-focused.textarea,.is-white.is-focused.input,#documenter .docs-sidebar form.docs-search>input.is-focused,.is-white.textarea:active,.is-white.input:active,#documenter .docs-sidebar form.docs-search>input.is-white:active,.is-white.is-active.textarea,.is-white.is-active.input,#documenter .docs-sidebar form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(255,255,255,0.25)}.is-black.textarea,.is-black.input,#documenter .docs-sidebar form.docs-search>input.is-black{border-color:#0a0a0a}.is-black.textarea:focus,.is-black.input:focus,#documenter .docs-sidebar form.docs-search>input.is-black:focus,.is-black.is-focused.textarea,.is-black.is-focused.input,#documenter .docs-sidebar form.docs-search>input.is-focused,.is-black.textarea:active,.is-black.input:active,#documenter .docs-sidebar form.docs-search>input.is-black:active,.is-black.is-active.textarea,.is-black.is-active.input,#documenter .docs-sidebar form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(10,10,10,0.25)}.is-light.textarea,.is-light.input,#documenter .docs-sidebar form.docs-search>input.is-light{border-color:#f5f5f5}.is-light.textarea:focus,.is-light.input:focus,#documenter .docs-sidebar form.docs-search>input.is-light:focus,.is-light.is-focused.textarea,.is-light.is-focused.input,#documenter .docs-sidebar form.docs-search>input.is-focused,.is-light.textarea:active,.is-light.input:active,#documenter .docs-sidebar form.docs-search>input.is-light:active,.is-light.is-active.textarea,.is-light.is-active.input,#documenter .docs-sidebar form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(245,245,245,0.25)}.is-dark.textarea,.content kbd.textarea,.is-dark.input,#documenter .docs-sidebar form.docs-search>input.is-dark,.content kbd.input{border-color:#363636}.is-dark.textarea:focus,.content kbd.textarea:focus,.is-dark.input:focus,#documenter .docs-sidebar form.docs-search>input.is-dark:focus,.content kbd.input:focus,.is-dark.is-focused.textarea,.content kbd.is-focused.textarea,.is-dark.is-focused.input,#documenter .docs-sidebar form.docs-search>input.is-focused,.content kbd.is-focused.input,#documenter .docs-sidebar .content form.docs-search>input.is-focused,.is-dark.textarea:active,.content kbd.textarea:active,.is-dark.input:active,#documenter .docs-sidebar form.docs-search>input.is-dark:active,.content kbd.input:active,.is-dark.is-active.textarea,.content kbd.is-active.textarea,.is-dark.is-active.input,#documenter .docs-sidebar form.docs-search>input.is-active,.content kbd.is-active.input,#documenter .docs-sidebar .content form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(54,54,54,0.25)}.is-primary.textarea,.docstring>section>a.textarea.docs-sourcelink,.is-primary.input,#documenter .docs-sidebar form.docs-search>input.is-primary,.docstring>section>a.input.docs-sourcelink{border-color:#4eb5de}.is-primary.textarea:focus,.docstring>section>a.textarea.docs-sourcelink:focus,.is-primary.input:focus,#documenter .docs-sidebar form.docs-search>input.is-primary:focus,.docstring>section>a.input.docs-sourcelink:focus,.is-primary.is-focused.textarea,.docstring>section>a.is-focused.textarea.docs-sourcelink,.is-primary.is-focused.input,#documenter .docs-sidebar form.docs-search>input.is-focused,.docstring>section>a.is-focused.input.docs-sourcelink,.is-primary.textarea:active,.docstring>section>a.textarea.docs-sourcelink:active,.is-primary.input:active,#documenter .docs-sidebar form.docs-search>input.is-primary:active,.docstring>section>a.input.docs-sourcelink:active,.is-primary.is-active.textarea,.docstring>section>a.is-active.textarea.docs-sourcelink,.is-primary.is-active.input,#documenter .docs-sidebar form.docs-search>input.is-active,.docstring>section>a.is-active.input.docs-sourcelink{box-shadow:0 0 0 0.125em rgba(78,181,222,0.25)}.is-link.textarea,.is-link.input,#documenter .docs-sidebar form.docs-search>input.is-link{border-color:#2e63b8}.is-link.textarea:focus,.is-link.input:focus,#documenter .docs-sidebar form.docs-search>input.is-link:focus,.is-link.is-focused.textarea,.is-link.is-focused.input,#documenter .docs-sidebar form.docs-search>input.is-focused,.is-link.textarea:active,.is-link.input:active,#documenter .docs-sidebar form.docs-search>input.is-link:active,.is-link.is-active.textarea,.is-link.is-active.input,#documenter .docs-sidebar form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(46,99,184,0.25)}.is-info.textarea,.is-info.input,#documenter .docs-sidebar form.docs-search>input.is-info{border-color:#209cee}.is-info.textarea:focus,.is-info.input:focus,#documenter .docs-sidebar form.docs-search>input.is-info:focus,.is-info.is-focused.textarea,.is-info.is-focused.input,#documenter .docs-sidebar form.docs-search>input.is-focused,.is-info.textarea:active,.is-info.input:active,#documenter .docs-sidebar form.docs-search>input.is-info:active,.is-info.is-active.textarea,.is-info.is-active.input,#documenter .docs-sidebar form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(32,156,238,0.25)}.is-success.textarea,.is-success.input,#documenter .docs-sidebar form.docs-search>input.is-success{border-color:#22c35b}.is-success.textarea:focus,.is-success.input:focus,#documenter .docs-sidebar form.docs-search>input.is-success:focus,.is-success.is-focused.textarea,.is-success.is-focused.input,#documenter .docs-sidebar form.docs-search>input.is-focused,.is-success.textarea:active,.is-success.input:active,#documenter .docs-sidebar form.docs-search>input.is-success:active,.is-success.is-active.textarea,.is-success.is-active.input,#documenter .docs-sidebar form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(34,195,91,0.25)}.is-warning.textarea,.is-warning.input,#documenter .docs-sidebar form.docs-search>input.is-warning{border-color:#ffdd57}.is-warning.textarea:focus,.is-warning.input:focus,#documenter .docs-sidebar form.docs-search>input.is-warning:focus,.is-warning.is-focused.textarea,.is-warning.is-focused.input,#documenter .docs-sidebar form.docs-search>input.is-focused,.is-warning.textarea:active,.is-warning.input:active,#documenter .docs-sidebar form.docs-search>input.is-warning:active,.is-warning.is-active.textarea,.is-warning.is-active.input,#documenter .docs-sidebar form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(255,221,87,0.25)}.is-danger.textarea,.is-danger.input,#documenter .docs-sidebar form.docs-search>input.is-danger{border-color:#da0b00}.is-danger.textarea:focus,.is-danger.input:focus,#documenter .docs-sidebar form.docs-search>input.is-danger:focus,.is-danger.is-focused.textarea,.is-danger.is-focused.input,#documenter .docs-sidebar form.docs-search>input.is-focused,.is-danger.textarea:active,.is-danger.input:active,#documenter .docs-sidebar form.docs-search>input.is-danger:active,.is-danger.is-active.textarea,.is-danger.is-active.input,#documenter .docs-sidebar form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(218,11,0,0.25)}.is-small.textarea,.is-small.input,#documenter .docs-sidebar form.docs-search>input{border-radius:2px;font-size:.75rem}.is-medium.textarea,.is-medium.input,#documenter .docs-sidebar form.docs-search>input.is-medium{font-size:1.25rem}.is-large.textarea,.is-large.input,#documenter .docs-sidebar form.docs-search>input.is-large{font-size:1.5rem}.is-fullwidth.textarea,.is-fullwidth.input,#documenter .docs-sidebar form.docs-search>input.is-fullwidth{display:block;width:100%}.is-inline.textarea,.is-inline.input,#documenter .docs-sidebar form.docs-search>input.is-inline{display:inline;width:auto}.input.is-rounded,#documenter .docs-sidebar form.docs-search>input{border-radius:9999px;padding-left:calc(calc(0.75em - 1px) + 0.375em);padding-right:calc(calc(0.75em - 1px) + 0.375em)}.input.is-static,#documenter .docs-sidebar form.docs-search>input.is-static{background-color:transparent;border-color:transparent;box-shadow:none;padding-left:0;padding-right:0}.textarea{display:block;max-width:100%;min-width:100%;padding:calc(0.75em - 1px);resize:vertical}.textarea:not([rows]){max-height:40em;min-height:8em}.textarea[rows]{height:initial}.textarea.has-fixed-size{resize:none}.radio,.checkbox{cursor:pointer;display:inline-block;line-height:1.25;position:relative}.radio input,.checkbox input{cursor:pointer}.radio:hover,.checkbox:hover{color:#222}.radio[disabled],.checkbox[disabled],fieldset[disabled] .radio,fieldset[disabled] .checkbox,.radio input[disabled],.checkbox input[disabled]{color:#6b6b6b;cursor:not-allowed}.radio+.radio{margin-left:.5em}.select{display:inline-block;max-width:100%;position:relative;vertical-align:top}.select:not(.is-multiple){height:2.5em}.select:not(.is-multiple):not(.is-loading)::after{border-color:#2e63b8;right:1.125em;z-index:4}.select.is-rounded select,#documenter .docs-sidebar form.docs-search>input.select select{border-radius:9999px;padding-left:1em}.select select{cursor:pointer;display:block;font-size:1em;max-width:100%;outline:none}.select select::-ms-expand{display:none}.select select[disabled]:hover,fieldset[disabled] .select select:hover{border-color:#f5f5f5}.select select:not([multiple]){padding-right:2.5em}.select select[multiple]{height:auto;padding:0}.select select[multiple] option{padding:0.5em 1em}.select:not(.is-multiple):not(.is-loading):hover::after{border-color:#222}.select.is-white:not(:hover)::after{border-color:#fff}.select.is-white select{border-color:#fff}.select.is-white select:hover,.select.is-white select.is-hovered{border-color:#f2f2f2}.select.is-white select:focus,.select.is-white select.is-focused,.select.is-white select:active,.select.is-white select.is-active{box-shadow:0 0 0 0.125em rgba(255,255,255,0.25)}.select.is-black:not(:hover)::after{border-color:#0a0a0a}.select.is-black select{border-color:#0a0a0a}.select.is-black select:hover,.select.is-black select.is-hovered{border-color:#000}.select.is-black select:focus,.select.is-black select.is-focused,.select.is-black select:active,.select.is-black select.is-active{box-shadow:0 0 0 0.125em rgba(10,10,10,0.25)}.select.is-light:not(:hover)::after{border-color:#f5f5f5}.select.is-light select{border-color:#f5f5f5}.select.is-light select:hover,.select.is-light select.is-hovered{border-color:#e8e8e8}.select.is-light select:focus,.select.is-light select.is-focused,.select.is-light select:active,.select.is-light select.is-active{box-shadow:0 0 0 0.125em rgba(245,245,245,0.25)}.select.is-dark:not(:hover)::after,.content kbd.select:not(:hover)::after{border-color:#363636}.select.is-dark select,.content kbd.select select{border-color:#363636}.select.is-dark select:hover,.content kbd.select select:hover,.select.is-dark select.is-hovered,.content kbd.select select.is-hovered{border-color:#292929}.select.is-dark select:focus,.content kbd.select select:focus,.select.is-dark select.is-focused,.content kbd.select select.is-focused,.select.is-dark select:active,.content kbd.select select:active,.select.is-dark select.is-active,.content kbd.select select.is-active{box-shadow:0 0 0 0.125em rgba(54,54,54,0.25)}.select.is-primary:not(:hover)::after,.docstring>section>a.select.docs-sourcelink:not(:hover)::after{border-color:#4eb5de}.select.is-primary select,.docstring>section>a.select.docs-sourcelink select{border-color:#4eb5de}.select.is-primary select:hover,.docstring>section>a.select.docs-sourcelink select:hover,.select.is-primary select.is-hovered,.docstring>section>a.select.docs-sourcelink select.is-hovered{border-color:#39acda}.select.is-primary select:focus,.docstring>section>a.select.docs-sourcelink select:focus,.select.is-primary select.is-focused,.docstring>section>a.select.docs-sourcelink select.is-focused,.select.is-primary select:active,.docstring>section>a.select.docs-sourcelink select:active,.select.is-primary select.is-active,.docstring>section>a.select.docs-sourcelink select.is-active{box-shadow:0 0 0 0.125em rgba(78,181,222,0.25)}.select.is-link:not(:hover)::after{border-color:#2e63b8}.select.is-link select{border-color:#2e63b8}.select.is-link select:hover,.select.is-link select.is-hovered{border-color:#2958a4}.select.is-link select:focus,.select.is-link select.is-focused,.select.is-link select:active,.select.is-link select.is-active{box-shadow:0 0 0 0.125em rgba(46,99,184,0.25)}.select.is-info:not(:hover)::after{border-color:#209cee}.select.is-info select{border-color:#209cee}.select.is-info select:hover,.select.is-info select.is-hovered{border-color:#1190e3}.select.is-info select:focus,.select.is-info select.is-focused,.select.is-info select:active,.select.is-info select.is-active{box-shadow:0 0 0 0.125em rgba(32,156,238,0.25)}.select.is-success:not(:hover)::after{border-color:#22c35b}.select.is-success select{border-color:#22c35b}.select.is-success select:hover,.select.is-success select.is-hovered{border-color:#1ead51}.select.is-success select:focus,.select.is-success select.is-focused,.select.is-success select:active,.select.is-success select.is-active{box-shadow:0 0 0 0.125em rgba(34,195,91,0.25)}.select.is-warning:not(:hover)::after{border-color:#ffdd57}.select.is-warning select{border-color:#ffdd57}.select.is-warning select:hover,.select.is-warning select.is-hovered{border-color:#ffd83e}.select.is-warning select:focus,.select.is-warning select.is-focused,.select.is-warning select:active,.select.is-warning select.is-active{box-shadow:0 0 0 0.125em rgba(255,221,87,0.25)}.select.is-danger:not(:hover)::after{border-color:#da0b00}.select.is-danger select{border-color:#da0b00}.select.is-danger select:hover,.select.is-danger select.is-hovered{border-color:#c10a00}.select.is-danger select:focus,.select.is-danger select.is-focused,.select.is-danger select:active,.select.is-danger select.is-active{box-shadow:0 0 0 0.125em rgba(218,11,0,0.25)}.select.is-small,#documenter .docs-sidebar form.docs-search>input.select{border-radius:2px;font-size:.75rem}.select.is-medium{font-size:1.25rem}.select.is-large{font-size:1.5rem}.select.is-disabled::after{border-color:#6b6b6b !important;opacity:0.5}.select.is-fullwidth{width:100%}.select.is-fullwidth select{width:100%}.select.is-loading::after{margin-top:0;position:absolute;right:.625em;top:0.625em;transform:none}.select.is-loading.is-small:after,#documenter .docs-sidebar form.docs-search>input.is-loading:after{font-size:.75rem}.select.is-loading.is-medium:after{font-size:1.25rem}.select.is-loading.is-large:after{font-size:1.5rem}.file{align-items:stretch;display:flex;justify-content:flex-start;position:relative}.file.is-white .file-cta{background-color:#fff;border-color:transparent;color:#0a0a0a}.file.is-white:hover .file-cta,.file.is-white.is-hovered .file-cta{background-color:#f9f9f9;border-color:transparent;color:#0a0a0a}.file.is-white:focus .file-cta,.file.is-white.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(255,255,255,0.25);color:#0a0a0a}.file.is-white:active .file-cta,.file.is-white.is-active .file-cta{background-color:#f2f2f2;border-color:transparent;color:#0a0a0a}.file.is-black .file-cta{background-color:#0a0a0a;border-color:transparent;color:#fff}.file.is-black:hover .file-cta,.file.is-black.is-hovered .file-cta{background-color:#040404;border-color:transparent;color:#fff}.file.is-black:focus .file-cta,.file.is-black.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(10,10,10,0.25);color:#fff}.file.is-black:active .file-cta,.file.is-black.is-active .file-cta{background-color:#000;border-color:transparent;color:#fff}.file.is-light .file-cta{background-color:#f5f5f5;border-color:transparent;color:rgba(0,0,0,0.7)}.file.is-light:hover .file-cta,.file.is-light.is-hovered .file-cta{background-color:#eee;border-color:transparent;color:rgba(0,0,0,0.7)}.file.is-light:focus .file-cta,.file.is-light.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(245,245,245,0.25);color:rgba(0,0,0,0.7)}.file.is-light:active .file-cta,.file.is-light.is-active .file-cta{background-color:#e8e8e8;border-color:transparent;color:rgba(0,0,0,0.7)}.file.is-dark .file-cta,.content kbd.file .file-cta{background-color:#363636;border-color:transparent;color:#fff}.file.is-dark:hover .file-cta,.content kbd.file:hover .file-cta,.file.is-dark.is-hovered .file-cta,.content kbd.file.is-hovered .file-cta{background-color:#2f2f2f;border-color:transparent;color:#fff}.file.is-dark:focus .file-cta,.content kbd.file:focus .file-cta,.file.is-dark.is-focused .file-cta,.content kbd.file.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(54,54,54,0.25);color:#fff}.file.is-dark:active .file-cta,.content kbd.file:active .file-cta,.file.is-dark.is-active .file-cta,.content kbd.file.is-active .file-cta{background-color:#292929;border-color:transparent;color:#fff}.file.is-primary .file-cta,.docstring>section>a.file.docs-sourcelink .file-cta{background-color:#4eb5de;border-color:transparent;color:#fff}.file.is-primary:hover .file-cta,.docstring>section>a.file.docs-sourcelink:hover .file-cta,.file.is-primary.is-hovered .file-cta,.docstring>section>a.file.is-hovered.docs-sourcelink .file-cta{background-color:#43b1dc;border-color:transparent;color:#fff}.file.is-primary:focus .file-cta,.docstring>section>a.file.docs-sourcelink:focus .file-cta,.file.is-primary.is-focused .file-cta,.docstring>section>a.file.is-focused.docs-sourcelink .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(78,181,222,0.25);color:#fff}.file.is-primary:active .file-cta,.docstring>section>a.file.docs-sourcelink:active .file-cta,.file.is-primary.is-active .file-cta,.docstring>section>a.file.is-active.docs-sourcelink .file-cta{background-color:#39acda;border-color:transparent;color:#fff}.file.is-link .file-cta{background-color:#2e63b8;border-color:transparent;color:#fff}.file.is-link:hover .file-cta,.file.is-link.is-hovered .file-cta{background-color:#2b5eae;border-color:transparent;color:#fff}.file.is-link:focus .file-cta,.file.is-link.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(46,99,184,0.25);color:#fff}.file.is-link:active .file-cta,.file.is-link.is-active .file-cta{background-color:#2958a4;border-color:transparent;color:#fff}.file.is-info .file-cta{background-color:#209cee;border-color:transparent;color:#fff}.file.is-info:hover .file-cta,.file.is-info.is-hovered .file-cta{background-color:#1497ed;border-color:transparent;color:#fff}.file.is-info:focus .file-cta,.file.is-info.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(32,156,238,0.25);color:#fff}.file.is-info:active .file-cta,.file.is-info.is-active .file-cta{background-color:#1190e3;border-color:transparent;color:#fff}.file.is-success .file-cta{background-color:#22c35b;border-color:transparent;color:#fff}.file.is-success:hover .file-cta,.file.is-success.is-hovered .file-cta{background-color:#20b856;border-color:transparent;color:#fff}.file.is-success:focus .file-cta,.file.is-success.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(34,195,91,0.25);color:#fff}.file.is-success:active .file-cta,.file.is-success.is-active .file-cta{background-color:#1ead51;border-color:transparent;color:#fff}.file.is-warning .file-cta{background-color:#ffdd57;border-color:transparent;color:rgba(0,0,0,0.7)}.file.is-warning:hover .file-cta,.file.is-warning.is-hovered .file-cta{background-color:#ffda4a;border-color:transparent;color:rgba(0,0,0,0.7)}.file.is-warning:focus .file-cta,.file.is-warning.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(255,221,87,0.25);color:rgba(0,0,0,0.7)}.file.is-warning:active .file-cta,.file.is-warning.is-active .file-cta{background-color:#ffd83e;border-color:transparent;color:rgba(0,0,0,0.7)}.file.is-danger .file-cta{background-color:#da0b00;border-color:transparent;color:#fff}.file.is-danger:hover .file-cta,.file.is-danger.is-hovered .file-cta{background-color:#cd0a00;border-color:transparent;color:#fff}.file.is-danger:focus .file-cta,.file.is-danger.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(218,11,0,0.25);color:#fff}.file.is-danger:active .file-cta,.file.is-danger.is-active .file-cta{background-color:#c10a00;border-color:transparent;color:#fff}.file.is-small,#documenter .docs-sidebar form.docs-search>input.file{font-size:.75rem}.file.is-normal{font-size:1rem}.file.is-medium{font-size:1.25rem}.file.is-medium .file-icon .fa{font-size:21px}.file.is-large{font-size:1.5rem}.file.is-large .file-icon .fa{font-size:28px}.file.has-name .file-cta{border-bottom-right-radius:0;border-top-right-radius:0}.file.has-name .file-name{border-bottom-left-radius:0;border-top-left-radius:0}.file.has-name.is-empty .file-cta{border-radius:4px}.file.has-name.is-empty .file-name{display:none}.file.is-boxed .file-label{flex-direction:column}.file.is-boxed .file-cta{flex-direction:column;height:auto;padding:1em 3em}.file.is-boxed .file-name{border-width:0 1px 1px}.file.is-boxed .file-icon{height:1.5em;width:1.5em}.file.is-boxed .file-icon .fa{font-size:21px}.file.is-boxed.is-small .file-icon .fa,#documenter .docs-sidebar form.docs-search>input.is-boxed .file-icon .fa{font-size:14px}.file.is-boxed.is-medium .file-icon .fa{font-size:28px}.file.is-boxed.is-large .file-icon .fa{font-size:35px}.file.is-boxed.has-name .file-cta{border-radius:4px 4px 0 0}.file.is-boxed.has-name .file-name{border-radius:0 0 4px 4px;border-width:0 1px 1px}.file.is-centered{justify-content:center}.file.is-fullwidth .file-label{width:100%}.file.is-fullwidth .file-name{flex-grow:1;max-width:none}.file.is-right{justify-content:flex-end}.file.is-right .file-cta{border-radius:0 4px 4px 0}.file.is-right .file-name{border-radius:4px 0 0 4px;border-width:1px 0 1px 1px;order:-1}.file-label{align-items:stretch;display:flex;cursor:pointer;justify-content:flex-start;overflow:hidden;position:relative}.file-label:hover .file-cta{background-color:#eee;color:#222}.file-label:hover .file-name{border-color:#d5d5d5}.file-label:active .file-cta{background-color:#e8e8e8;color:#222}.file-label:active .file-name{border-color:#cfcfcf}.file-input{height:100%;left:0;opacity:0;outline:none;position:absolute;top:0;width:100%}.file-cta,.file-name{border-color:#dbdbdb;border-radius:4px;font-size:1em;padding-left:1em;padding-right:1em;white-space:nowrap}.file-cta{background-color:#f5f5f5;color:#222}.file-name{border-color:#dbdbdb;border-style:solid;border-width:1px 1px 1px 0;display:block;max-width:16em;overflow:hidden;text-align:inherit;text-overflow:ellipsis}.file-icon{align-items:center;display:flex;height:1em;justify-content:center;margin-right:.5em;width:1em}.file-icon .fa{font-size:14px}.label{color:#222;display:block;font-size:1rem;font-weight:700}.label:not(:last-child){margin-bottom:0.5em}.label.is-small,#documenter .docs-sidebar form.docs-search>input.label{font-size:.75rem}.label.is-medium{font-size:1.25rem}.label.is-large{font-size:1.5rem}.help{display:block;font-size:.75rem;margin-top:0.25rem}.help.is-white{color:#fff}.help.is-black{color:#0a0a0a}.help.is-light{color:#f5f5f5}.help.is-dark,.content kbd.help{color:#363636}.help.is-primary,.docstring>section>a.help.docs-sourcelink{color:#4eb5de}.help.is-link{color:#2e63b8}.help.is-info{color:#209cee}.help.is-success{color:#22c35b}.help.is-warning{color:#ffdd57}.help.is-danger{color:#da0b00}.field:not(:last-child){margin-bottom:0.75rem}.field.has-addons{display:flex;justify-content:flex-start}.field.has-addons .control:not(:last-child){margin-right:-1px}.field.has-addons .control:not(:first-child):not(:last-child) .button,.field.has-addons .control:not(:first-child):not(:last-child) .input,.field.has-addons .control:not(:first-child):not(:last-child) #documenter .docs-sidebar form.docs-search>input,#documenter .docs-sidebar .field.has-addons .control:not(:first-child):not(:last-child) form.docs-search>input,.field.has-addons .control:not(:first-child):not(:last-child) .select select{border-radius:0}.field.has-addons .control:first-child:not(:only-child) .button,.field.has-addons .control:first-child:not(:only-child) .input,.field.has-addons .control:first-child:not(:only-child) #documenter .docs-sidebar form.docs-search>input,#documenter .docs-sidebar .field.has-addons .control:first-child:not(:only-child) form.docs-search>input,.field.has-addons .control:first-child:not(:only-child) .select select{border-bottom-right-radius:0;border-top-right-radius:0}.field.has-addons .control:last-child:not(:only-child) .button,.field.has-addons .control:last-child:not(:only-child) .input,.field.has-addons .control:last-child:not(:only-child) #documenter .docs-sidebar form.docs-search>input,#documenter .docs-sidebar .field.has-addons .control:last-child:not(:only-child) form.docs-search>input,.field.has-addons .control:last-child:not(:only-child) .select select{border-bottom-left-radius:0;border-top-left-radius:0}.field.has-addons .control .button:not([disabled]):hover,.field.has-addons .control .button.is-hovered:not([disabled]),.field.has-addons .control .input:not([disabled]):hover,.field.has-addons .control #documenter .docs-sidebar form.docs-search>input:not([disabled]):hover,#documenter .docs-sidebar .field.has-addons .control form.docs-search>input:not([disabled]):hover,.field.has-addons .control .input.is-hovered:not([disabled]),.field.has-addons .control #documenter .docs-sidebar form.docs-search>input.is-hovered:not([disabled]),#documenter .docs-sidebar .field.has-addons .control form.docs-search>input.is-hovered:not([disabled]),.field.has-addons .control .select select:not([disabled]):hover,.field.has-addons .control .select select.is-hovered:not([disabled]){z-index:2}.field.has-addons .control .button:not([disabled]):focus,.field.has-addons .control .button.is-focused:not([disabled]),.field.has-addons .control .button:not([disabled]):active,.field.has-addons .control .button.is-active:not([disabled]),.field.has-addons .control .input:not([disabled]):focus,.field.has-addons .control #documenter .docs-sidebar form.docs-search>input:not([disabled]):focus,#documenter .docs-sidebar .field.has-addons .control form.docs-search>input:not([disabled]):focus,.field.has-addons .control .input.is-focused:not([disabled]),.field.has-addons .control #documenter .docs-sidebar form.docs-search>input.is-focused:not([disabled]),#documenter .docs-sidebar .field.has-addons .control form.docs-search>input.is-focused:not([disabled]),.field.has-addons .control .input:not([disabled]):active,.field.has-addons .control #documenter .docs-sidebar form.docs-search>input:not([disabled]):active,#documenter .docs-sidebar .field.has-addons .control form.docs-search>input:not([disabled]):active,.field.has-addons .control .input.is-active:not([disabled]),.field.has-addons .control #documenter .docs-sidebar form.docs-search>input.is-active:not([disabled]),#documenter .docs-sidebar .field.has-addons .control form.docs-search>input.is-active:not([disabled]),.field.has-addons .control .select select:not([disabled]):focus,.field.has-addons .control .select select.is-focused:not([disabled]),.field.has-addons .control .select select:not([disabled]):active,.field.has-addons .control .select select.is-active:not([disabled]){z-index:3}.field.has-addons .control .button:not([disabled]):focus:hover,.field.has-addons .control .button.is-focused:not([disabled]):hover,.field.has-addons .control .button:not([disabled]):active:hover,.field.has-addons .control .button.is-active:not([disabled]):hover,.field.has-addons .control .input:not([disabled]):focus:hover,.field.has-addons .control #documenter .docs-sidebar form.docs-search>input:not([disabled]):focus:hover,#documenter .docs-sidebar .field.has-addons .control form.docs-search>input:not([disabled]):focus:hover,.field.has-addons .control .input.is-focused:not([disabled]):hover,.field.has-addons .control #documenter .docs-sidebar form.docs-search>input.is-focused:not([disabled]):hover,#documenter .docs-sidebar .field.has-addons .control form.docs-search>input.is-focused:not([disabled]):hover,.field.has-addons .control .input:not([disabled]):active:hover,.field.has-addons .control #documenter .docs-sidebar form.docs-search>input:not([disabled]):active:hover,#documenter .docs-sidebar .field.has-addons .control form.docs-search>input:not([disabled]):active:hover,.field.has-addons .control .input.is-active:not([disabled]):hover,.field.has-addons .control #documenter .docs-sidebar form.docs-search>input.is-active:not([disabled]):hover,#documenter .docs-sidebar .field.has-addons .control form.docs-search>input.is-active:not([disabled]):hover,.field.has-addons .control .select select:not([disabled]):focus:hover,.field.has-addons .control .select select.is-focused:not([disabled]):hover,.field.has-addons .control .select select:not([disabled]):active:hover,.field.has-addons .control .select select.is-active:not([disabled]):hover{z-index:4}.field.has-addons .control.is-expanded{flex-grow:1;flex-shrink:1}.field.has-addons.has-addons-centered{justify-content:center}.field.has-addons.has-addons-right{justify-content:flex-end}.field.has-addons.has-addons-fullwidth .control{flex-grow:1;flex-shrink:0}.field.is-grouped{display:flex;justify-content:flex-start}.field.is-grouped>.control{flex-shrink:0}.field.is-grouped>.control:not(:last-child){margin-bottom:0;margin-right:.75rem}.field.is-grouped>.control.is-expanded{flex-grow:1;flex-shrink:1}.field.is-grouped.is-grouped-centered{justify-content:center}.field.is-grouped.is-grouped-right{justify-content:flex-end}.field.is-grouped.is-grouped-multiline{flex-wrap:wrap}.field.is-grouped.is-grouped-multiline>.control:last-child,.field.is-grouped.is-grouped-multiline>.control:not(:last-child){margin-bottom:0.75rem}.field.is-grouped.is-grouped-multiline:last-child{margin-bottom:-0.75rem}.field.is-grouped.is-grouped-multiline:not(:last-child){margin-bottom:0}@media screen and (min-width: 769px),print{.field.is-horizontal{display:flex}}.field-label .label{font-size:inherit}@media screen and (max-width: 768px){.field-label{margin-bottom:0.5rem}}@media screen and (min-width: 769px),print{.field-label{flex-basis:0;flex-grow:1;flex-shrink:0;margin-right:1.5rem;text-align:right}.field-label.is-small,#documenter .docs-sidebar form.docs-search>input.field-label{font-size:.75rem;padding-top:0.375em}.field-label.is-normal{padding-top:0.375em}.field-label.is-medium{font-size:1.25rem;padding-top:0.375em}.field-label.is-large{font-size:1.5rem;padding-top:0.375em}}.field-body .field .field{margin-bottom:0}@media screen and (min-width: 769px),print{.field-body{display:flex;flex-basis:0;flex-grow:5;flex-shrink:1}.field-body .field{margin-bottom:0}.field-body>.field{flex-shrink:1}.field-body>.field:not(.is-narrow){flex-grow:1}.field-body>.field:not(:last-child){margin-right:.75rem}}.control{box-sizing:border-box;clear:both;font-size:1rem;position:relative;text-align:inherit}.control.has-icons-left .input:focus~.icon,.control.has-icons-left #documenter .docs-sidebar form.docs-search>input:focus~.icon,#documenter .docs-sidebar .control.has-icons-left form.docs-search>input:focus~.icon,.control.has-icons-left .select:focus~.icon,.control.has-icons-right .input:focus~.icon,.control.has-icons-right #documenter .docs-sidebar form.docs-search>input:focus~.icon,#documenter .docs-sidebar .control.has-icons-right form.docs-search>input:focus~.icon,.control.has-icons-right .select:focus~.icon{color:#222}.control.has-icons-left .input.is-small~.icon,.control.has-icons-left #documenter .docs-sidebar form.docs-search>input~.icon,#documenter .docs-sidebar .control.has-icons-left form.docs-search>input~.icon,.control.has-icons-left .select.is-small~.icon,.control.has-icons-right .input.is-small~.icon,.control.has-icons-right #documenter .docs-sidebar form.docs-search>input~.icon,#documenter .docs-sidebar .control.has-icons-right form.docs-search>input~.icon,.control.has-icons-right .select.is-small~.icon{font-size:.75rem}.control.has-icons-left .input.is-medium~.icon,.control.has-icons-left #documenter .docs-sidebar form.docs-search>input.is-medium~.icon,#documenter .docs-sidebar .control.has-icons-left form.docs-search>input.is-medium~.icon,.control.has-icons-left .select.is-medium~.icon,.control.has-icons-right .input.is-medium~.icon,.control.has-icons-right #documenter .docs-sidebar form.docs-search>input.is-medium~.icon,#documenter .docs-sidebar .control.has-icons-right form.docs-search>input.is-medium~.icon,.control.has-icons-right .select.is-medium~.icon{font-size:1.25rem}.control.has-icons-left .input.is-large~.icon,.control.has-icons-left #documenter .docs-sidebar form.docs-search>input.is-large~.icon,#documenter .docs-sidebar .control.has-icons-left form.docs-search>input.is-large~.icon,.control.has-icons-left .select.is-large~.icon,.control.has-icons-right .input.is-large~.icon,.control.has-icons-right #documenter .docs-sidebar form.docs-search>input.is-large~.icon,#documenter .docs-sidebar .control.has-icons-right form.docs-search>input.is-large~.icon,.control.has-icons-right .select.is-large~.icon{font-size:1.5rem}.control.has-icons-left .icon,.control.has-icons-right .icon{color:#dbdbdb;height:2.5em;pointer-events:none;position:absolute;top:0;width:2.5em;z-index:4}.control.has-icons-left .input,.control.has-icons-left #documenter .docs-sidebar form.docs-search>input,#documenter .docs-sidebar .control.has-icons-left form.docs-search>input,.control.has-icons-left .select select{padding-left:2.5em}.control.has-icons-left .icon.is-left{left:0}.control.has-icons-right .input,.control.has-icons-right #documenter .docs-sidebar form.docs-search>input,#documenter .docs-sidebar .control.has-icons-right form.docs-search>input,.control.has-icons-right .select select{padding-right:2.5em}.control.has-icons-right .icon.is-right{right:0}.control.is-loading::after{position:absolute !important;right:.625em;top:0.625em;z-index:4}.control.is-loading.is-small:after,#documenter .docs-sidebar form.docs-search>input.is-loading:after{font-size:.75rem}.control.is-loading.is-medium:after{font-size:1.25rem}.control.is-loading.is-large:after{font-size:1.5rem}.breadcrumb{font-size:1rem;white-space:nowrap}.breadcrumb a{align-items:center;color:#2e63b8;display:flex;justify-content:center;padding:0 .75em}.breadcrumb a:hover{color:#363636}.breadcrumb li{align-items:center;display:flex}.breadcrumb li:first-child a{padding-left:0}.breadcrumb li.is-active a{color:#222;cursor:default;pointer-events:none}.breadcrumb li+li::before{color:#b5b5b5;content:"\0002f"}.breadcrumb ul,.breadcrumb ol{align-items:flex-start;display:flex;flex-wrap:wrap;justify-content:flex-start}.breadcrumb .icon:first-child{margin-right:.5em}.breadcrumb .icon:last-child{margin-left:.5em}.breadcrumb.is-centered ol,.breadcrumb.is-centered ul{justify-content:center}.breadcrumb.is-right ol,.breadcrumb.is-right ul{justify-content:flex-end}.breadcrumb.is-small,#documenter .docs-sidebar form.docs-search>input.breadcrumb{font-size:.75rem}.breadcrumb.is-medium{font-size:1.25rem}.breadcrumb.is-large{font-size:1.5rem}.breadcrumb.has-arrow-separator li+li::before{content:"\02192"}.breadcrumb.has-bullet-separator li+li::before{content:"\02022"}.breadcrumb.has-dot-separator li+li::before{content:"\000b7"}.breadcrumb.has-succeeds-separator li+li::before{content:"\0227B"}.card{background-color:#fff;border-radius:.25rem;box-shadow:#bbb;color:#222;max-width:100%;position:relative}.card-footer:first-child,.card-content:first-child,.card-header:first-child{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.card-footer:last-child,.card-content:last-child,.card-header:last-child{border-bottom-left-radius:.25rem;border-bottom-right-radius:.25rem}.card-header{background-color:rgba(0,0,0,0);align-items:stretch;box-shadow:0 0.125em 0.25em rgba(10,10,10,0.1);display:flex}.card-header-title{align-items:center;color:#222;display:flex;flex-grow:1;font-weight:700;padding:0.75rem 1rem}.card-header-title.is-centered{justify-content:center}.card-header-icon{-moz-appearance:none;-webkit-appearance:none;appearance:none;background:none;border:none;color:currentColor;font-family:inherit;font-size:1em;margin:0;padding:0;align-items:center;cursor:pointer;display:flex;justify-content:center;padding:0.75rem 1rem}.card-image{display:block;position:relative}.card-image:first-child img{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.card-image:last-child img{border-bottom-left-radius:.25rem;border-bottom-right-radius:.25rem}.card-content{background-color:rgba(0,0,0,0);padding:1.5rem}.card-footer{background-color:rgba(0,0,0,0);border-top:1px solid #ededed;align-items:stretch;display:flex}.card-footer-item{align-items:center;display:flex;flex-basis:0;flex-grow:1;flex-shrink:0;justify-content:center;padding:.75rem}.card-footer-item:not(:last-child){border-right:1px solid #ededed}.card .media:not(:last-child){margin-bottom:1.5rem}.dropdown{display:inline-flex;position:relative;vertical-align:top}.dropdown.is-active .dropdown-menu,.dropdown.is-hoverable:hover .dropdown-menu{display:block}.dropdown.is-right .dropdown-menu{left:auto;right:0}.dropdown.is-up .dropdown-menu{bottom:100%;padding-bottom:4px;padding-top:initial;top:auto}.dropdown-menu{display:none;left:0;min-width:12rem;padding-top:4px;position:absolute;top:100%;z-index:20}.dropdown-content{background-color:#fff;border-radius:4px;box-shadow:#bbb;padding-bottom:.5rem;padding-top:.5rem}.dropdown-item{color:#222;display:block;font-size:0.875rem;line-height:1.5;padding:0.375rem 1rem;position:relative}a.dropdown-item,button.dropdown-item{padding-right:3rem;text-align:inherit;white-space:nowrap;width:100%}a.dropdown-item:hover,button.dropdown-item:hover{background-color:#f5f5f5;color:#0a0a0a}a.dropdown-item.is-active,button.dropdown-item.is-active{background-color:#2e63b8;color:#fff}.dropdown-divider{background-color:#ededed;border:none;display:block;height:1px;margin:0.5rem 0}.level{align-items:center;justify-content:space-between}.level code{border-radius:4px}.level img{display:inline-block;vertical-align:top}.level.is-mobile{display:flex}.level.is-mobile .level-left,.level.is-mobile .level-right{display:flex}.level.is-mobile .level-left+.level-right{margin-top:0}.level.is-mobile .level-item:not(:last-child){margin-bottom:0;margin-right:.75rem}.level.is-mobile .level-item:not(.is-narrow){flex-grow:1}@media screen and (min-width: 769px),print{.level{display:flex}.level>.level-item:not(.is-narrow){flex-grow:1}}.level-item{align-items:center;display:flex;flex-basis:auto;flex-grow:0;flex-shrink:0;justify-content:center}.level-item .title,.level-item .subtitle{margin-bottom:0}@media screen and (max-width: 768px){.level-item:not(:last-child){margin-bottom:.75rem}}.level-left,.level-right{flex-basis:auto;flex-grow:0;flex-shrink:0}.level-left .level-item.is-flexible,.level-right .level-item.is-flexible{flex-grow:1}@media screen and (min-width: 769px),print{.level-left .level-item:not(:last-child),.level-right .level-item:not(:last-child){margin-right:.75rem}}.level-left{align-items:center;justify-content:flex-start}@media screen and (max-width: 768px){.level-left+.level-right{margin-top:1.5rem}}@media screen and (min-width: 769px),print{.level-left{display:flex}}.level-right{align-items:center;justify-content:flex-end}@media screen and (min-width: 769px),print{.level-right{display:flex}}.media{align-items:flex-start;display:flex;text-align:inherit}.media .content:not(:last-child){margin-bottom:.75rem}.media .media{border-top:1px solid rgba(219,219,219,0.5);display:flex;padding-top:.75rem}.media .media .content:not(:last-child),.media .media .control:not(:last-child){margin-bottom:.5rem}.media .media .media{padding-top:.5rem}.media .media .media+.media{margin-top:.5rem}.media+.media{border-top:1px solid rgba(219,219,219,0.5);margin-top:1rem;padding-top:1rem}.media.is-large+.media{margin-top:1.5rem;padding-top:1.5rem}.media-left,.media-right{flex-basis:auto;flex-grow:0;flex-shrink:0}.media-left{margin-right:1rem}.media-right{margin-left:1rem}.media-content{flex-basis:auto;flex-grow:1;flex-shrink:1;text-align:inherit}@media screen and (max-width: 768px){.media-content{overflow-x:auto}}.menu{font-size:1rem}.menu.is-small,#documenter .docs-sidebar form.docs-search>input.menu{font-size:.75rem}.menu.is-medium{font-size:1.25rem}.menu.is-large{font-size:1.5rem}.menu-list{line-height:1.25}.menu-list a{border-radius:2px;color:#222;display:block;padding:0.5em 0.75em}.menu-list a:hover{background-color:#f5f5f5;color:#222}.menu-list a.is-active{background-color:#2e63b8;color:#fff}.menu-list li ul{border-left:1px solid #dbdbdb;margin:.75em;padding-left:.75em}.menu-label{color:#6b6b6b;font-size:.75em;letter-spacing:.1em;text-transform:uppercase}.menu-label:not(:first-child){margin-top:1em}.menu-label:not(:last-child){margin-bottom:1em}.message{background-color:#f5f5f5;border-radius:4px;font-size:1rem}.message strong{color:currentColor}.message a:not(.button):not(.tag):not(.dropdown-item){color:currentColor;text-decoration:underline}.message.is-small,#documenter .docs-sidebar form.docs-search>input.message{font-size:.75rem}.message.is-medium{font-size:1.25rem}.message.is-large{font-size:1.5rem}.message.is-white{background-color:#fff}.message.is-white .message-header{background-color:#fff;color:#0a0a0a}.message.is-white .message-body{border-color:#fff}.message.is-black{background-color:#fafafa}.message.is-black .message-header{background-color:#0a0a0a;color:#fff}.message.is-black .message-body{border-color:#0a0a0a}.message.is-light{background-color:#fafafa}.message.is-light .message-header{background-color:#f5f5f5;color:rgba(0,0,0,0.7)}.message.is-light .message-body{border-color:#f5f5f5}.message.is-dark,.content kbd.message{background-color:#fafafa}.message.is-dark .message-header,.content kbd.message .message-header{background-color:#363636;color:#fff}.message.is-dark .message-body,.content kbd.message .message-body{border-color:#363636}.message.is-primary,.docstring>section>a.message.docs-sourcelink{background-color:#eef8fc}.message.is-primary .message-header,.docstring>section>a.message.docs-sourcelink .message-header{background-color:#4eb5de;color:#fff}.message.is-primary .message-body,.docstring>section>a.message.docs-sourcelink .message-body{border-color:#4eb5de;color:#1a6d8e}.message.is-link{background-color:#eff3fb}.message.is-link .message-header{background-color:#2e63b8;color:#fff}.message.is-link .message-body{border-color:#2e63b8;color:#3169c4}.message.is-info{background-color:#ecf7fe}.message.is-info .message-header{background-color:#209cee;color:#fff}.message.is-info .message-body{border-color:#209cee;color:#0e72b4}.message.is-success{background-color:#eefcf3}.message.is-success .message-header{background-color:#22c35b;color:#fff}.message.is-success .message-body{border-color:#22c35b;color:#198f43}.message.is-warning{background-color:#fffbeb}.message.is-warning .message-header{background-color:#ffdd57;color:rgba(0,0,0,0.7)}.message.is-warning .message-body{border-color:#ffdd57;color:#947600}.message.is-danger{background-color:#ffeceb}.message.is-danger .message-header{background-color:#da0b00;color:#fff}.message.is-danger .message-body{border-color:#da0b00;color:#f50c00}.message-header{align-items:center;background-color:#222;border-radius:4px 4px 0 0;color:#fff;display:flex;font-weight:700;justify-content:space-between;line-height:1.25;padding:0.75em 1em;position:relative}.message-header .delete{flex-grow:0;flex-shrink:0;margin-left:.75em}.message-header+.message-body{border-width:0;border-top-left-radius:0;border-top-right-radius:0}.message-body{border-color:#dbdbdb;border-radius:4px;border-style:solid;border-width:0 0 0 4px;color:#222;padding:1.25em 1.5em}.message-body code,.message-body pre{background-color:#fff}.message-body pre code{background-color:rgba(0,0,0,0)}.modal{align-items:center;display:none;flex-direction:column;justify-content:center;overflow:hidden;position:fixed;z-index:40}.modal.is-active{display:flex}.modal-background{background-color:rgba(10,10,10,0.86)}.modal-content,.modal-card{margin:0 20px;max-height:calc(100vh - 160px);overflow:auto;position:relative;width:100%}@media screen and (min-width: 769px){.modal-content,.modal-card{margin:0 auto;max-height:calc(100vh - 40px);width:640px}}.modal-close{background:none;height:40px;position:fixed;right:20px;top:20px;width:40px}.modal-card{display:flex;flex-direction:column;max-height:calc(100vh - 40px);overflow:hidden;-ms-overflow-y:visible}.modal-card-head,.modal-card-foot{align-items:center;background-color:#f5f5f5;display:flex;flex-shrink:0;justify-content:flex-start;padding:20px;position:relative}.modal-card-head{border-bottom:1px solid #dbdbdb;border-top-left-radius:6px;border-top-right-radius:6px}.modal-card-title{color:#222;flex-grow:1;flex-shrink:0;font-size:1.5rem;line-height:1}.modal-card-foot{border-bottom-left-radius:6px;border-bottom-right-radius:6px;border-top:1px solid #dbdbdb}.modal-card-foot .button:not(:last-child){margin-right:.5em}.modal-card-body{-webkit-overflow-scrolling:touch;background-color:#fff;flex-grow:1;flex-shrink:1;overflow:auto;padding:20px}.navbar{background-color:#fff;min-height:3.25rem;position:relative;z-index:30}.navbar.is-white{background-color:#fff;color:#0a0a0a}.navbar.is-white .navbar-brand>.navbar-item,.navbar.is-white .navbar-brand .navbar-link{color:#0a0a0a}.navbar.is-white .navbar-brand>a.navbar-item:focus,.navbar.is-white .navbar-brand>a.navbar-item:hover,.navbar.is-white .navbar-brand>a.navbar-item.is-active,.navbar.is-white .navbar-brand .navbar-link:focus,.navbar.is-white .navbar-brand .navbar-link:hover,.navbar.is-white .navbar-brand .navbar-link.is-active{background-color:#f2f2f2;color:#0a0a0a}.navbar.is-white .navbar-brand .navbar-link::after{border-color:#0a0a0a}.navbar.is-white .navbar-burger{color:#0a0a0a}@media screen and (min-width: 1056px){.navbar.is-white .navbar-start>.navbar-item,.navbar.is-white .navbar-start .navbar-link,.navbar.is-white .navbar-end>.navbar-item,.navbar.is-white .navbar-end .navbar-link{color:#0a0a0a}.navbar.is-white .navbar-start>a.navbar-item:focus,.navbar.is-white .navbar-start>a.navbar-item:hover,.navbar.is-white .navbar-start>a.navbar-item.is-active,.navbar.is-white .navbar-start .navbar-link:focus,.navbar.is-white .navbar-start .navbar-link:hover,.navbar.is-white .navbar-start .navbar-link.is-active,.navbar.is-white .navbar-end>a.navbar-item:focus,.navbar.is-white .navbar-end>a.navbar-item:hover,.navbar.is-white .navbar-end>a.navbar-item.is-active,.navbar.is-white .navbar-end .navbar-link:focus,.navbar.is-white .navbar-end .navbar-link:hover,.navbar.is-white .navbar-end .navbar-link.is-active{background-color:#f2f2f2;color:#0a0a0a}.navbar.is-white .navbar-start .navbar-link::after,.navbar.is-white .navbar-end .navbar-link::after{border-color:#0a0a0a}.navbar.is-white .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-white .navbar-item.has-dropdown:hover .navbar-link,.navbar.is-white .navbar-item.has-dropdown.is-active .navbar-link{background-color:#f2f2f2;color:#0a0a0a}.navbar.is-white .navbar-dropdown a.navbar-item.is-active{background-color:#fff;color:#0a0a0a}}.navbar.is-black{background-color:#0a0a0a;color:#fff}.navbar.is-black .navbar-brand>.navbar-item,.navbar.is-black .navbar-brand .navbar-link{color:#fff}.navbar.is-black .navbar-brand>a.navbar-item:focus,.navbar.is-black .navbar-brand>a.navbar-item:hover,.navbar.is-black .navbar-brand>a.navbar-item.is-active,.navbar.is-black .navbar-brand .navbar-link:focus,.navbar.is-black .navbar-brand .navbar-link:hover,.navbar.is-black .navbar-brand .navbar-link.is-active{background-color:#000;color:#fff}.navbar.is-black .navbar-brand .navbar-link::after{border-color:#fff}.navbar.is-black .navbar-burger{color:#fff}@media screen and (min-width: 1056px){.navbar.is-black .navbar-start>.navbar-item,.navbar.is-black .navbar-start .navbar-link,.navbar.is-black .navbar-end>.navbar-item,.navbar.is-black .navbar-end .navbar-link{color:#fff}.navbar.is-black .navbar-start>a.navbar-item:focus,.navbar.is-black .navbar-start>a.navbar-item:hover,.navbar.is-black .navbar-start>a.navbar-item.is-active,.navbar.is-black .navbar-start .navbar-link:focus,.navbar.is-black .navbar-start .navbar-link:hover,.navbar.is-black .navbar-start .navbar-link.is-active,.navbar.is-black .navbar-end>a.navbar-item:focus,.navbar.is-black .navbar-end>a.navbar-item:hover,.navbar.is-black .navbar-end>a.navbar-item.is-active,.navbar.is-black .navbar-end .navbar-link:focus,.navbar.is-black .navbar-end .navbar-link:hover,.navbar.is-black .navbar-end .navbar-link.is-active{background-color:#000;color:#fff}.navbar.is-black .navbar-start .navbar-link::after,.navbar.is-black .navbar-end .navbar-link::after{border-color:#fff}.navbar.is-black .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-black .navbar-item.has-dropdown:hover .navbar-link,.navbar.is-black .navbar-item.has-dropdown.is-active .navbar-link{background-color:#000;color:#fff}.navbar.is-black .navbar-dropdown a.navbar-item.is-active{background-color:#0a0a0a;color:#fff}}.navbar.is-light{background-color:#f5f5f5;color:rgba(0,0,0,0.7)}.navbar.is-light .navbar-brand>.navbar-item,.navbar.is-light .navbar-brand .navbar-link{color:rgba(0,0,0,0.7)}.navbar.is-light .navbar-brand>a.navbar-item:focus,.navbar.is-light .navbar-brand>a.navbar-item:hover,.navbar.is-light .navbar-brand>a.navbar-item.is-active,.navbar.is-light .navbar-brand .navbar-link:focus,.navbar.is-light .navbar-brand .navbar-link:hover,.navbar.is-light .navbar-brand .navbar-link.is-active{background-color:#e8e8e8;color:rgba(0,0,0,0.7)}.navbar.is-light .navbar-brand .navbar-link::after{border-color:rgba(0,0,0,0.7)}.navbar.is-light .navbar-burger{color:rgba(0,0,0,0.7)}@media screen and (min-width: 1056px){.navbar.is-light .navbar-start>.navbar-item,.navbar.is-light .navbar-start .navbar-link,.navbar.is-light .navbar-end>.navbar-item,.navbar.is-light .navbar-end .navbar-link{color:rgba(0,0,0,0.7)}.navbar.is-light .navbar-start>a.navbar-item:focus,.navbar.is-light .navbar-start>a.navbar-item:hover,.navbar.is-light .navbar-start>a.navbar-item.is-active,.navbar.is-light .navbar-start .navbar-link:focus,.navbar.is-light .navbar-start .navbar-link:hover,.navbar.is-light .navbar-start .navbar-link.is-active,.navbar.is-light .navbar-end>a.navbar-item:focus,.navbar.is-light .navbar-end>a.navbar-item:hover,.navbar.is-light .navbar-end>a.navbar-item.is-active,.navbar.is-light .navbar-end .navbar-link:focus,.navbar.is-light .navbar-end .navbar-link:hover,.navbar.is-light .navbar-end .navbar-link.is-active{background-color:#e8e8e8;color:rgba(0,0,0,0.7)}.navbar.is-light .navbar-start .navbar-link::after,.navbar.is-light .navbar-end .navbar-link::after{border-color:rgba(0,0,0,0.7)}.navbar.is-light .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-light .navbar-item.has-dropdown:hover .navbar-link,.navbar.is-light .navbar-item.has-dropdown.is-active .navbar-link{background-color:#e8e8e8;color:rgba(0,0,0,0.7)}.navbar.is-light .navbar-dropdown a.navbar-item.is-active{background-color:#f5f5f5;color:rgba(0,0,0,0.7)}}.navbar.is-dark,.content kbd.navbar{background-color:#363636;color:#fff}.navbar.is-dark .navbar-brand>.navbar-item,.content kbd.navbar .navbar-brand>.navbar-item,.navbar.is-dark .navbar-brand .navbar-link,.content kbd.navbar .navbar-brand .navbar-link{color:#fff}.navbar.is-dark .navbar-brand>a.navbar-item:focus,.content kbd.navbar .navbar-brand>a.navbar-item:focus,.navbar.is-dark .navbar-brand>a.navbar-item:hover,.content kbd.navbar .navbar-brand>a.navbar-item:hover,.navbar.is-dark .navbar-brand>a.navbar-item.is-active,.content kbd.navbar .navbar-brand>a.navbar-item.is-active,.navbar.is-dark .navbar-brand .navbar-link:focus,.content kbd.navbar .navbar-brand .navbar-link:focus,.navbar.is-dark .navbar-brand .navbar-link:hover,.content kbd.navbar .navbar-brand .navbar-link:hover,.navbar.is-dark .navbar-brand .navbar-link.is-active,.content kbd.navbar .navbar-brand .navbar-link.is-active{background-color:#292929;color:#fff}.navbar.is-dark .navbar-brand .navbar-link::after,.content kbd.navbar .navbar-brand .navbar-link::after{border-color:#fff}.navbar.is-dark .navbar-burger,.content kbd.navbar .navbar-burger{color:#fff}@media screen and (min-width: 1056px){.navbar.is-dark .navbar-start>.navbar-item,.content kbd.navbar .navbar-start>.navbar-item,.navbar.is-dark .navbar-start .navbar-link,.content kbd.navbar .navbar-start .navbar-link,.navbar.is-dark .navbar-end>.navbar-item,.content kbd.navbar .navbar-end>.navbar-item,.navbar.is-dark .navbar-end .navbar-link,.content kbd.navbar .navbar-end .navbar-link{color:#fff}.navbar.is-dark .navbar-start>a.navbar-item:focus,.content kbd.navbar .navbar-start>a.navbar-item:focus,.navbar.is-dark .navbar-start>a.navbar-item:hover,.content kbd.navbar .navbar-start>a.navbar-item:hover,.navbar.is-dark .navbar-start>a.navbar-item.is-active,.content kbd.navbar .navbar-start>a.navbar-item.is-active,.navbar.is-dark .navbar-start .navbar-link:focus,.content kbd.navbar .navbar-start .navbar-link:focus,.navbar.is-dark .navbar-start .navbar-link:hover,.content kbd.navbar .navbar-start .navbar-link:hover,.navbar.is-dark .navbar-start .navbar-link.is-active,.content kbd.navbar .navbar-start .navbar-link.is-active,.navbar.is-dark .navbar-end>a.navbar-item:focus,.content kbd.navbar .navbar-end>a.navbar-item:focus,.navbar.is-dark .navbar-end>a.navbar-item:hover,.content kbd.navbar .navbar-end>a.navbar-item:hover,.navbar.is-dark .navbar-end>a.navbar-item.is-active,.content kbd.navbar .navbar-end>a.navbar-item.is-active,.navbar.is-dark .navbar-end .navbar-link:focus,.content kbd.navbar .navbar-end .navbar-link:focus,.navbar.is-dark .navbar-end .navbar-link:hover,.content kbd.navbar .navbar-end .navbar-link:hover,.navbar.is-dark .navbar-end .navbar-link.is-active,.content kbd.navbar .navbar-end .navbar-link.is-active{background-color:#292929;color:#fff}.navbar.is-dark .navbar-start .navbar-link::after,.content kbd.navbar .navbar-start .navbar-link::after,.navbar.is-dark .navbar-end .navbar-link::after,.content kbd.navbar .navbar-end .navbar-link::after{border-color:#fff}.navbar.is-dark .navbar-item.has-dropdown:focus .navbar-link,.content kbd.navbar .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-dark .navbar-item.has-dropdown:hover .navbar-link,.content kbd.navbar .navbar-item.has-dropdown:hover .navbar-link,.navbar.is-dark .navbar-item.has-dropdown.is-active .navbar-link,.content kbd.navbar .navbar-item.has-dropdown.is-active .navbar-link{background-color:#292929;color:#fff}.navbar.is-dark .navbar-dropdown a.navbar-item.is-active,.content kbd.navbar .navbar-dropdown a.navbar-item.is-active{background-color:#363636;color:#fff}}.navbar.is-primary,.docstring>section>a.navbar.docs-sourcelink{background-color:#4eb5de;color:#fff}.navbar.is-primary .navbar-brand>.navbar-item,.docstring>section>a.navbar.docs-sourcelink .navbar-brand>.navbar-item,.navbar.is-primary .navbar-brand .navbar-link,.docstring>section>a.navbar.docs-sourcelink .navbar-brand .navbar-link{color:#fff}.navbar.is-primary .navbar-brand>a.navbar-item:focus,.docstring>section>a.navbar.docs-sourcelink .navbar-brand>a.navbar-item:focus,.navbar.is-primary .navbar-brand>a.navbar-item:hover,.docstring>section>a.navbar.docs-sourcelink .navbar-brand>a.navbar-item:hover,.navbar.is-primary .navbar-brand>a.navbar-item.is-active,.docstring>section>a.navbar.docs-sourcelink .navbar-brand>a.navbar-item.is-active,.navbar.is-primary .navbar-brand .navbar-link:focus,.docstring>section>a.navbar.docs-sourcelink .navbar-brand .navbar-link:focus,.navbar.is-primary .navbar-brand .navbar-link:hover,.docstring>section>a.navbar.docs-sourcelink .navbar-brand .navbar-link:hover,.navbar.is-primary .navbar-brand .navbar-link.is-active,.docstring>section>a.navbar.docs-sourcelink .navbar-brand .navbar-link.is-active{background-color:#39acda;color:#fff}.navbar.is-primary .navbar-brand .navbar-link::after,.docstring>section>a.navbar.docs-sourcelink .navbar-brand .navbar-link::after{border-color:#fff}.navbar.is-primary .navbar-burger,.docstring>section>a.navbar.docs-sourcelink .navbar-burger{color:#fff}@media screen and (min-width: 1056px){.navbar.is-primary .navbar-start>.navbar-item,.docstring>section>a.navbar.docs-sourcelink .navbar-start>.navbar-item,.navbar.is-primary .navbar-start .navbar-link,.docstring>section>a.navbar.docs-sourcelink .navbar-start .navbar-link,.navbar.is-primary .navbar-end>.navbar-item,.docstring>section>a.navbar.docs-sourcelink .navbar-end>.navbar-item,.navbar.is-primary .navbar-end .navbar-link,.docstring>section>a.navbar.docs-sourcelink .navbar-end .navbar-link{color:#fff}.navbar.is-primary .navbar-start>a.navbar-item:focus,.docstring>section>a.navbar.docs-sourcelink .navbar-start>a.navbar-item:focus,.navbar.is-primary .navbar-start>a.navbar-item:hover,.docstring>section>a.navbar.docs-sourcelink .navbar-start>a.navbar-item:hover,.navbar.is-primary .navbar-start>a.navbar-item.is-active,.docstring>section>a.navbar.docs-sourcelink .navbar-start>a.navbar-item.is-active,.navbar.is-primary .navbar-start .navbar-link:focus,.docstring>section>a.navbar.docs-sourcelink .navbar-start .navbar-link:focus,.navbar.is-primary .navbar-start .navbar-link:hover,.docstring>section>a.navbar.docs-sourcelink .navbar-start .navbar-link:hover,.navbar.is-primary .navbar-start .navbar-link.is-active,.docstring>section>a.navbar.docs-sourcelink .navbar-start .navbar-link.is-active,.navbar.is-primary .navbar-end>a.navbar-item:focus,.docstring>section>a.navbar.docs-sourcelink .navbar-end>a.navbar-item:focus,.navbar.is-primary .navbar-end>a.navbar-item:hover,.docstring>section>a.navbar.docs-sourcelink .navbar-end>a.navbar-item:hover,.navbar.is-primary .navbar-end>a.navbar-item.is-active,.docstring>section>a.navbar.docs-sourcelink .navbar-end>a.navbar-item.is-active,.navbar.is-primary .navbar-end .navbar-link:focus,.docstring>section>a.navbar.docs-sourcelink .navbar-end .navbar-link:focus,.navbar.is-primary .navbar-end .navbar-link:hover,.docstring>section>a.navbar.docs-sourcelink .navbar-end .navbar-link:hover,.navbar.is-primary .navbar-end .navbar-link.is-active,.docstring>section>a.navbar.docs-sourcelink .navbar-end .navbar-link.is-active{background-color:#39acda;color:#fff}.navbar.is-primary .navbar-start .navbar-link::after,.docstring>section>a.navbar.docs-sourcelink .navbar-start .navbar-link::after,.navbar.is-primary .navbar-end .navbar-link::after,.docstring>section>a.navbar.docs-sourcelink .navbar-end .navbar-link::after{border-color:#fff}.navbar.is-primary .navbar-item.has-dropdown:focus .navbar-link,.docstring>section>a.navbar.docs-sourcelink .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-primary .navbar-item.has-dropdown:hover .navbar-link,.docstring>section>a.navbar.docs-sourcelink .navbar-item.has-dropdown:hover .navbar-link,.navbar.is-primary .navbar-item.has-dropdown.is-active .navbar-link,.docstring>section>a.navbar.docs-sourcelink .navbar-item.has-dropdown.is-active .navbar-link{background-color:#39acda;color:#fff}.navbar.is-primary .navbar-dropdown a.navbar-item.is-active,.docstring>section>a.navbar.docs-sourcelink .navbar-dropdown a.navbar-item.is-active{background-color:#4eb5de;color:#fff}}.navbar.is-link{background-color:#2e63b8;color:#fff}.navbar.is-link .navbar-brand>.navbar-item,.navbar.is-link .navbar-brand .navbar-link{color:#fff}.navbar.is-link .navbar-brand>a.navbar-item:focus,.navbar.is-link .navbar-brand>a.navbar-item:hover,.navbar.is-link .navbar-brand>a.navbar-item.is-active,.navbar.is-link .navbar-brand .navbar-link:focus,.navbar.is-link .navbar-brand .navbar-link:hover,.navbar.is-link .navbar-brand .navbar-link.is-active{background-color:#2958a4;color:#fff}.navbar.is-link .navbar-brand .navbar-link::after{border-color:#fff}.navbar.is-link .navbar-burger{color:#fff}@media screen and (min-width: 1056px){.navbar.is-link .navbar-start>.navbar-item,.navbar.is-link .navbar-start .navbar-link,.navbar.is-link .navbar-end>.navbar-item,.navbar.is-link .navbar-end .navbar-link{color:#fff}.navbar.is-link .navbar-start>a.navbar-item:focus,.navbar.is-link .navbar-start>a.navbar-item:hover,.navbar.is-link .navbar-start>a.navbar-item.is-active,.navbar.is-link .navbar-start .navbar-link:focus,.navbar.is-link .navbar-start .navbar-link:hover,.navbar.is-link .navbar-start .navbar-link.is-active,.navbar.is-link .navbar-end>a.navbar-item:focus,.navbar.is-link .navbar-end>a.navbar-item:hover,.navbar.is-link .navbar-end>a.navbar-item.is-active,.navbar.is-link .navbar-end .navbar-link:focus,.navbar.is-link .navbar-end .navbar-link:hover,.navbar.is-link .navbar-end .navbar-link.is-active{background-color:#2958a4;color:#fff}.navbar.is-link .navbar-start .navbar-link::after,.navbar.is-link .navbar-end .navbar-link::after{border-color:#fff}.navbar.is-link .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-link .navbar-item.has-dropdown:hover .navbar-link,.navbar.is-link .navbar-item.has-dropdown.is-active .navbar-link{background-color:#2958a4;color:#fff}.navbar.is-link .navbar-dropdown a.navbar-item.is-active{background-color:#2e63b8;color:#fff}}.navbar.is-info{background-color:#209cee;color:#fff}.navbar.is-info .navbar-brand>.navbar-item,.navbar.is-info .navbar-brand .navbar-link{color:#fff}.navbar.is-info .navbar-brand>a.navbar-item:focus,.navbar.is-info .navbar-brand>a.navbar-item:hover,.navbar.is-info .navbar-brand>a.navbar-item.is-active,.navbar.is-info .navbar-brand .navbar-link:focus,.navbar.is-info .navbar-brand .navbar-link:hover,.navbar.is-info .navbar-brand .navbar-link.is-active{background-color:#1190e3;color:#fff}.navbar.is-info .navbar-brand .navbar-link::after{border-color:#fff}.navbar.is-info .navbar-burger{color:#fff}@media screen and (min-width: 1056px){.navbar.is-info .navbar-start>.navbar-item,.navbar.is-info .navbar-start .navbar-link,.navbar.is-info .navbar-end>.navbar-item,.navbar.is-info .navbar-end .navbar-link{color:#fff}.navbar.is-info .navbar-start>a.navbar-item:focus,.navbar.is-info .navbar-start>a.navbar-item:hover,.navbar.is-info .navbar-start>a.navbar-item.is-active,.navbar.is-info .navbar-start .navbar-link:focus,.navbar.is-info .navbar-start .navbar-link:hover,.navbar.is-info .navbar-start .navbar-link.is-active,.navbar.is-info .navbar-end>a.navbar-item:focus,.navbar.is-info .navbar-end>a.navbar-item:hover,.navbar.is-info .navbar-end>a.navbar-item.is-active,.navbar.is-info .navbar-end .navbar-link:focus,.navbar.is-info .navbar-end .navbar-link:hover,.navbar.is-info .navbar-end .navbar-link.is-active{background-color:#1190e3;color:#fff}.navbar.is-info .navbar-start .navbar-link::after,.navbar.is-info .navbar-end .navbar-link::after{border-color:#fff}.navbar.is-info .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-info .navbar-item.has-dropdown:hover .navbar-link,.navbar.is-info .navbar-item.has-dropdown.is-active .navbar-link{background-color:#1190e3;color:#fff}.navbar.is-info .navbar-dropdown a.navbar-item.is-active{background-color:#209cee;color:#fff}}.navbar.is-success{background-color:#22c35b;color:#fff}.navbar.is-success .navbar-brand>.navbar-item,.navbar.is-success .navbar-brand .navbar-link{color:#fff}.navbar.is-success .navbar-brand>a.navbar-item:focus,.navbar.is-success .navbar-brand>a.navbar-item:hover,.navbar.is-success .navbar-brand>a.navbar-item.is-active,.navbar.is-success .navbar-brand .navbar-link:focus,.navbar.is-success .navbar-brand .navbar-link:hover,.navbar.is-success .navbar-brand .navbar-link.is-active{background-color:#1ead51;color:#fff}.navbar.is-success .navbar-brand .navbar-link::after{border-color:#fff}.navbar.is-success .navbar-burger{color:#fff}@media screen and (min-width: 1056px){.navbar.is-success .navbar-start>.navbar-item,.navbar.is-success .navbar-start .navbar-link,.navbar.is-success .navbar-end>.navbar-item,.navbar.is-success .navbar-end .navbar-link{color:#fff}.navbar.is-success .navbar-start>a.navbar-item:focus,.navbar.is-success .navbar-start>a.navbar-item:hover,.navbar.is-success .navbar-start>a.navbar-item.is-active,.navbar.is-success .navbar-start .navbar-link:focus,.navbar.is-success .navbar-start .navbar-link:hover,.navbar.is-success .navbar-start .navbar-link.is-active,.navbar.is-success .navbar-end>a.navbar-item:focus,.navbar.is-success .navbar-end>a.navbar-item:hover,.navbar.is-success .navbar-end>a.navbar-item.is-active,.navbar.is-success .navbar-end .navbar-link:focus,.navbar.is-success .navbar-end .navbar-link:hover,.navbar.is-success .navbar-end .navbar-link.is-active{background-color:#1ead51;color:#fff}.navbar.is-success .navbar-start .navbar-link::after,.navbar.is-success .navbar-end .navbar-link::after{border-color:#fff}.navbar.is-success .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-success .navbar-item.has-dropdown:hover .navbar-link,.navbar.is-success .navbar-item.has-dropdown.is-active .navbar-link{background-color:#1ead51;color:#fff}.navbar.is-success .navbar-dropdown a.navbar-item.is-active{background-color:#22c35b;color:#fff}}.navbar.is-warning{background-color:#ffdd57;color:rgba(0,0,0,0.7)}.navbar.is-warning .navbar-brand>.navbar-item,.navbar.is-warning .navbar-brand .navbar-link{color:rgba(0,0,0,0.7)}.navbar.is-warning .navbar-brand>a.navbar-item:focus,.navbar.is-warning .navbar-brand>a.navbar-item:hover,.navbar.is-warning .navbar-brand>a.navbar-item.is-active,.navbar.is-warning .navbar-brand .navbar-link:focus,.navbar.is-warning .navbar-brand .navbar-link:hover,.navbar.is-warning .navbar-brand .navbar-link.is-active{background-color:#ffd83e;color:rgba(0,0,0,0.7)}.navbar.is-warning .navbar-brand .navbar-link::after{border-color:rgba(0,0,0,0.7)}.navbar.is-warning .navbar-burger{color:rgba(0,0,0,0.7)}@media screen and (min-width: 1056px){.navbar.is-warning .navbar-start>.navbar-item,.navbar.is-warning .navbar-start .navbar-link,.navbar.is-warning .navbar-end>.navbar-item,.navbar.is-warning .navbar-end .navbar-link{color:rgba(0,0,0,0.7)}.navbar.is-warning .navbar-start>a.navbar-item:focus,.navbar.is-warning .navbar-start>a.navbar-item:hover,.navbar.is-warning .navbar-start>a.navbar-item.is-active,.navbar.is-warning .navbar-start .navbar-link:focus,.navbar.is-warning .navbar-start .navbar-link:hover,.navbar.is-warning .navbar-start .navbar-link.is-active,.navbar.is-warning .navbar-end>a.navbar-item:focus,.navbar.is-warning .navbar-end>a.navbar-item:hover,.navbar.is-warning .navbar-end>a.navbar-item.is-active,.navbar.is-warning .navbar-end .navbar-link:focus,.navbar.is-warning .navbar-end .navbar-link:hover,.navbar.is-warning .navbar-end .navbar-link.is-active{background-color:#ffd83e;color:rgba(0,0,0,0.7)}.navbar.is-warning .navbar-start .navbar-link::after,.navbar.is-warning .navbar-end .navbar-link::after{border-color:rgba(0,0,0,0.7)}.navbar.is-warning .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-warning .navbar-item.has-dropdown:hover .navbar-link,.navbar.is-warning .navbar-item.has-dropdown.is-active .navbar-link{background-color:#ffd83e;color:rgba(0,0,0,0.7)}.navbar.is-warning .navbar-dropdown a.navbar-item.is-active{background-color:#ffdd57;color:rgba(0,0,0,0.7)}}.navbar.is-danger{background-color:#da0b00;color:#fff}.navbar.is-danger .navbar-brand>.navbar-item,.navbar.is-danger .navbar-brand .navbar-link{color:#fff}.navbar.is-danger .navbar-brand>a.navbar-item:focus,.navbar.is-danger .navbar-brand>a.navbar-item:hover,.navbar.is-danger .navbar-brand>a.navbar-item.is-active,.navbar.is-danger .navbar-brand .navbar-link:focus,.navbar.is-danger .navbar-brand .navbar-link:hover,.navbar.is-danger .navbar-brand .navbar-link.is-active{background-color:#c10a00;color:#fff}.navbar.is-danger .navbar-brand .navbar-link::after{border-color:#fff}.navbar.is-danger .navbar-burger{color:#fff}@media screen and (min-width: 1056px){.navbar.is-danger .navbar-start>.navbar-item,.navbar.is-danger .navbar-start .navbar-link,.navbar.is-danger .navbar-end>.navbar-item,.navbar.is-danger .navbar-end .navbar-link{color:#fff}.navbar.is-danger .navbar-start>a.navbar-item:focus,.navbar.is-danger .navbar-start>a.navbar-item:hover,.navbar.is-danger .navbar-start>a.navbar-item.is-active,.navbar.is-danger .navbar-start .navbar-link:focus,.navbar.is-danger .navbar-start .navbar-link:hover,.navbar.is-danger .navbar-start .navbar-link.is-active,.navbar.is-danger .navbar-end>a.navbar-item:focus,.navbar.is-danger .navbar-end>a.navbar-item:hover,.navbar.is-danger .navbar-end>a.navbar-item.is-active,.navbar.is-danger .navbar-end .navbar-link:focus,.navbar.is-danger .navbar-end .navbar-link:hover,.navbar.is-danger .navbar-end .navbar-link.is-active{background-color:#c10a00;color:#fff}.navbar.is-danger .navbar-start .navbar-link::after,.navbar.is-danger .navbar-end .navbar-link::after{border-color:#fff}.navbar.is-danger .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-danger .navbar-item.has-dropdown:hover .navbar-link,.navbar.is-danger .navbar-item.has-dropdown.is-active .navbar-link{background-color:#c10a00;color:#fff}.navbar.is-danger .navbar-dropdown a.navbar-item.is-active{background-color:#da0b00;color:#fff}}.navbar>.container{align-items:stretch;display:flex;min-height:3.25rem;width:100%}.navbar.has-shadow{box-shadow:0 2px 0 0 #f5f5f5}.navbar.is-fixed-bottom,.navbar.is-fixed-top{left:0;position:fixed;right:0;z-index:30}.navbar.is-fixed-bottom{bottom:0}.navbar.is-fixed-bottom.has-shadow{box-shadow:0 -2px 0 0 #f5f5f5}.navbar.is-fixed-top{top:0}html.has-navbar-fixed-top,body.has-navbar-fixed-top{padding-top:3.25rem}html.has-navbar-fixed-bottom,body.has-navbar-fixed-bottom{padding-bottom:3.25rem}.navbar-brand,.navbar-tabs{align-items:stretch;display:flex;flex-shrink:0;min-height:3.25rem}.navbar-brand a.navbar-item:focus,.navbar-brand a.navbar-item:hover{background-color:transparent}.navbar-tabs{-webkit-overflow-scrolling:touch;max-width:100vw;overflow-x:auto;overflow-y:hidden}.navbar-burger{color:#222;-moz-appearance:none;-webkit-appearance:none;appearance:none;background:none;border:none;cursor:pointer;display:block;height:3.25rem;position:relative;width:3.25rem;margin-left:auto}.navbar-burger span{background-color:currentColor;display:block;height:1px;left:calc(50% - 8px);position:absolute;transform-origin:center;transition-duration:86ms;transition-property:background-color, opacity, transform;transition-timing-function:ease-out;width:16px}.navbar-burger span:nth-child(1){top:calc(50% - 6px)}.navbar-burger span:nth-child(2){top:calc(50% - 1px)}.navbar-burger span:nth-child(3){top:calc(50% + 4px)}.navbar-burger:hover{background-color:rgba(0,0,0,0.05)}.navbar-burger.is-active span:nth-child(1){transform:translateY(5px) rotate(45deg)}.navbar-burger.is-active span:nth-child(2){opacity:0}.navbar-burger.is-active span:nth-child(3){transform:translateY(-5px) rotate(-45deg)}.navbar-menu{display:none}.navbar-item,.navbar-link{color:#222;display:block;line-height:1.5;padding:0.5rem 0.75rem;position:relative}.navbar-item .icon:only-child,.navbar-link .icon:only-child{margin-left:-0.25rem;margin-right:-0.25rem}a.navbar-item,.navbar-link{cursor:pointer}a.navbar-item:focus,a.navbar-item:focus-within,a.navbar-item:hover,a.navbar-item.is-active,.navbar-link:focus,.navbar-link:focus-within,.navbar-link:hover,.navbar-link.is-active{background-color:#fafafa;color:#2e63b8}.navbar-item{flex-grow:0;flex-shrink:0}.navbar-item img{max-height:1.75rem}.navbar-item.has-dropdown{padding:0}.navbar-item.is-expanded{flex-grow:1;flex-shrink:1}.navbar-item.is-tab{border-bottom:1px solid transparent;min-height:3.25rem;padding-bottom:calc(0.5rem - 1px)}.navbar-item.is-tab:focus,.navbar-item.is-tab:hover{background-color:rgba(0,0,0,0);border-bottom-color:#2e63b8}.navbar-item.is-tab.is-active{background-color:rgba(0,0,0,0);border-bottom-color:#2e63b8;border-bottom-style:solid;border-bottom-width:3px;color:#2e63b8;padding-bottom:calc(0.5rem - 3px)}.navbar-content{flex-grow:1;flex-shrink:1}.navbar-link:not(.is-arrowless){padding-right:2.5em}.navbar-link:not(.is-arrowless)::after{border-color:#2e63b8;margin-top:-0.375em;right:1.125em}.navbar-dropdown{font-size:0.875rem;padding-bottom:0.5rem;padding-top:0.5rem}.navbar-dropdown .navbar-item{padding-left:1.5rem;padding-right:1.5rem}.navbar-divider{background-color:#f5f5f5;border:none;display:none;height:2px;margin:0.5rem 0}@media screen and (max-width: 1055px){.navbar>.container{display:block}.navbar-brand .navbar-item,.navbar-tabs .navbar-item{align-items:center;display:flex}.navbar-link::after{display:none}.navbar-menu{background-color:#fff;box-shadow:0 8px 16px rgba(10,10,10,0.1);padding:0.5rem 0}.navbar-menu.is-active{display:block}.navbar.is-fixed-bottom-touch,.navbar.is-fixed-top-touch{left:0;position:fixed;right:0;z-index:30}.navbar.is-fixed-bottom-touch{bottom:0}.navbar.is-fixed-bottom-touch.has-shadow{box-shadow:0 -2px 3px rgba(10,10,10,0.1)}.navbar.is-fixed-top-touch{top:0}.navbar.is-fixed-top .navbar-menu,.navbar.is-fixed-top-touch .navbar-menu{-webkit-overflow-scrolling:touch;max-height:calc(100vh - 3.25rem);overflow:auto}html.has-navbar-fixed-top-touch,body.has-navbar-fixed-top-touch{padding-top:3.25rem}html.has-navbar-fixed-bottom-touch,body.has-navbar-fixed-bottom-touch{padding-bottom:3.25rem}}@media screen and (min-width: 1056px){.navbar,.navbar-menu,.navbar-start,.navbar-end{align-items:stretch;display:flex}.navbar{min-height:3.25rem}.navbar.is-spaced{padding:1rem 2rem}.navbar.is-spaced .navbar-start,.navbar.is-spaced .navbar-end{align-items:center}.navbar.is-spaced a.navbar-item,.navbar.is-spaced .navbar-link{border-radius:4px}.navbar.is-transparent a.navbar-item:focus,.navbar.is-transparent a.navbar-item:hover,.navbar.is-transparent a.navbar-item.is-active,.navbar.is-transparent .navbar-link:focus,.navbar.is-transparent .navbar-link:hover,.navbar.is-transparent .navbar-link.is-active{background-color:transparent !important}.navbar.is-transparent .navbar-item.has-dropdown.is-active .navbar-link,.navbar.is-transparent .navbar-item.has-dropdown.is-hoverable:focus .navbar-link,.navbar.is-transparent .navbar-item.has-dropdown.is-hoverable:focus-within .navbar-link,.navbar.is-transparent .navbar-item.has-dropdown.is-hoverable:hover .navbar-link{background-color:transparent !important}.navbar.is-transparent .navbar-dropdown a.navbar-item:focus,.navbar.is-transparent .navbar-dropdown a.navbar-item:hover{background-color:#f5f5f5;color:#0a0a0a}.navbar.is-transparent .navbar-dropdown a.navbar-item.is-active{background-color:#f5f5f5;color:#2e63b8}.navbar-burger{display:none}.navbar-item,.navbar-link{align-items:center;display:flex}.navbar-item.has-dropdown{align-items:stretch}.navbar-item.has-dropdown-up .navbar-link::after{transform:rotate(135deg) translate(0.25em, -0.25em)}.navbar-item.has-dropdown-up .navbar-dropdown{border-bottom:2px solid #dbdbdb;border-radius:6px 6px 0 0;border-top:none;bottom:100%;box-shadow:0 -8px 8px rgba(10,10,10,0.1);top:auto}.navbar-item.is-active .navbar-dropdown,.navbar-item.is-hoverable:focus .navbar-dropdown,.navbar-item.is-hoverable:focus-within .navbar-dropdown,.navbar-item.is-hoverable:hover .navbar-dropdown{display:block}.navbar.is-spaced .navbar-item.is-active .navbar-dropdown,.navbar-item.is-active .navbar-dropdown.is-boxed,.navbar.is-spaced .navbar-item.is-hoverable:focus .navbar-dropdown,.navbar-item.is-hoverable:focus .navbar-dropdown.is-boxed,.navbar.is-spaced .navbar-item.is-hoverable:focus-within .navbar-dropdown,.navbar-item.is-hoverable:focus-within .navbar-dropdown.is-boxed,.navbar.is-spaced .navbar-item.is-hoverable:hover .navbar-dropdown,.navbar-item.is-hoverable:hover .navbar-dropdown.is-boxed{opacity:1;pointer-events:auto;transform:translateY(0)}.navbar-menu{flex-grow:1;flex-shrink:0}.navbar-start{justify-content:flex-start;margin-right:auto}.navbar-end{justify-content:flex-end;margin-left:auto}.navbar-dropdown{background-color:#fff;border-bottom-left-radius:6px;border-bottom-right-radius:6px;border-top:2px solid #dbdbdb;box-shadow:0 8px 8px rgba(10,10,10,0.1);display:none;font-size:0.875rem;left:0;min-width:100%;position:absolute;top:100%;z-index:20}.navbar-dropdown .navbar-item{padding:0.375rem 1rem;white-space:nowrap}.navbar-dropdown a.navbar-item{padding-right:3rem}.navbar-dropdown a.navbar-item:focus,.navbar-dropdown a.navbar-item:hover{background-color:#f5f5f5;color:#0a0a0a}.navbar-dropdown a.navbar-item.is-active{background-color:#f5f5f5;color:#2e63b8}.navbar.is-spaced .navbar-dropdown,.navbar-dropdown.is-boxed{border-radius:6px;border-top:none;box-shadow:0 8px 8px rgba(10,10,10,0.1), 0 0 0 1px rgba(10,10,10,0.1);display:block;opacity:0;pointer-events:none;top:calc(100% + (-4px));transform:translateY(-5px);transition-duration:86ms;transition-property:opacity, transform}.navbar-dropdown.is-right{left:auto;right:0}.navbar-divider{display:block}.navbar>.container .navbar-brand,.container>.navbar .navbar-brand{margin-left:-.75rem}.navbar>.container .navbar-menu,.container>.navbar .navbar-menu{margin-right:-.75rem}.navbar.is-fixed-bottom-desktop,.navbar.is-fixed-top-desktop{left:0;position:fixed;right:0;z-index:30}.navbar.is-fixed-bottom-desktop{bottom:0}.navbar.is-fixed-bottom-desktop.has-shadow{box-shadow:0 -2px 3px rgba(10,10,10,0.1)}.navbar.is-fixed-top-desktop{top:0}html.has-navbar-fixed-top-desktop,body.has-navbar-fixed-top-desktop{padding-top:3.25rem}html.has-navbar-fixed-bottom-desktop,body.has-navbar-fixed-bottom-desktop{padding-bottom:3.25rem}html.has-spaced-navbar-fixed-top,body.has-spaced-navbar-fixed-top{padding-top:5.25rem}html.has-spaced-navbar-fixed-bottom,body.has-spaced-navbar-fixed-bottom{padding-bottom:5.25rem}a.navbar-item.is-active,.navbar-link.is-active{color:#0a0a0a}a.navbar-item.is-active:not(:focus):not(:hover),.navbar-link.is-active:not(:focus):not(:hover){background-color:rgba(0,0,0,0)}.navbar-item.has-dropdown:focus .navbar-link,.navbar-item.has-dropdown:hover .navbar-link,.navbar-item.has-dropdown.is-active .navbar-link{background-color:#fafafa}}.hero.is-fullheight-with-navbar{min-height:calc(100vh - 3.25rem)}.pagination{font-size:1rem;margin:-.25rem}.pagination.is-small,#documenter .docs-sidebar form.docs-search>input.pagination{font-size:.75rem}.pagination.is-medium{font-size:1.25rem}.pagination.is-large{font-size:1.5rem}.pagination.is-rounded .pagination-previous,#documenter .docs-sidebar form.docs-search>input.pagination .pagination-previous,.pagination.is-rounded .pagination-next,#documenter .docs-sidebar form.docs-search>input.pagination .pagination-next{padding-left:1em;padding-right:1em;border-radius:9999px}.pagination.is-rounded .pagination-link,#documenter .docs-sidebar form.docs-search>input.pagination .pagination-link{border-radius:9999px}.pagination,.pagination-list{align-items:center;display:flex;justify-content:center;text-align:center}.pagination-previous,.pagination-next,.pagination-link,.pagination-ellipsis{font-size:1em;justify-content:center;margin:.25rem;padding-left:.5em;padding-right:.5em;text-align:center}.pagination-previous,.pagination-next,.pagination-link{border-color:#dbdbdb;color:#222;min-width:2.5em}.pagination-previous:hover,.pagination-next:hover,.pagination-link:hover{border-color:#b5b5b5;color:#363636}.pagination-previous:focus,.pagination-next:focus,.pagination-link:focus{border-color:#3c5dcd}.pagination-previous:active,.pagination-next:active,.pagination-link:active{box-shadow:inset 0 1px 2px rgba(10,10,10,0.2)}.pagination-previous[disabled],.pagination-previous.is-disabled,.pagination-next[disabled],.pagination-next.is-disabled,.pagination-link[disabled],.pagination-link.is-disabled{background-color:#dbdbdb;border-color:#dbdbdb;box-shadow:none;color:#6b6b6b;opacity:0.5}.pagination-previous,.pagination-next{padding-left:.75em;padding-right:.75em;white-space:nowrap}.pagination-link.is-current{background-color:#2e63b8;border-color:#2e63b8;color:#fff}.pagination-ellipsis{color:#b5b5b5;pointer-events:none}.pagination-list{flex-wrap:wrap}.pagination-list li{list-style:none}@media screen and (max-width: 768px){.pagination{flex-wrap:wrap}.pagination-previous,.pagination-next{flex-grow:1;flex-shrink:1}.pagination-list li{flex-grow:1;flex-shrink:1}}@media screen and (min-width: 769px),print{.pagination-list{flex-grow:1;flex-shrink:1;justify-content:flex-start;order:1}.pagination-previous,.pagination-next,.pagination-link,.pagination-ellipsis{margin-bottom:0;margin-top:0}.pagination-previous{order:2}.pagination-next{order:3}.pagination{justify-content:space-between;margin-bottom:0;margin-top:0}.pagination.is-centered .pagination-previous{order:1}.pagination.is-centered .pagination-list{justify-content:center;order:2}.pagination.is-centered .pagination-next{order:3}.pagination.is-right .pagination-previous{order:1}.pagination.is-right .pagination-next{order:2}.pagination.is-right .pagination-list{justify-content:flex-end;order:3}}.panel{border-radius:6px;box-shadow:#bbb;font-size:1rem}.panel:not(:last-child){margin-bottom:1.5rem}.panel.is-white .panel-heading{background-color:#fff;color:#0a0a0a}.panel.is-white .panel-tabs a.is-active{border-bottom-color:#fff}.panel.is-white .panel-block.is-active .panel-icon{color:#fff}.panel.is-black .panel-heading{background-color:#0a0a0a;color:#fff}.panel.is-black .panel-tabs a.is-active{border-bottom-color:#0a0a0a}.panel.is-black .panel-block.is-active .panel-icon{color:#0a0a0a}.panel.is-light .panel-heading{background-color:#f5f5f5;color:rgba(0,0,0,0.7)}.panel.is-light .panel-tabs a.is-active{border-bottom-color:#f5f5f5}.panel.is-light .panel-block.is-active .panel-icon{color:#f5f5f5}.panel.is-dark .panel-heading,.content kbd.panel .panel-heading{background-color:#363636;color:#fff}.panel.is-dark .panel-tabs a.is-active,.content kbd.panel .panel-tabs a.is-active{border-bottom-color:#363636}.panel.is-dark .panel-block.is-active .panel-icon,.content kbd.panel .panel-block.is-active .panel-icon{color:#363636}.panel.is-primary .panel-heading,.docstring>section>a.panel.docs-sourcelink .panel-heading{background-color:#4eb5de;color:#fff}.panel.is-primary .panel-tabs a.is-active,.docstring>section>a.panel.docs-sourcelink .panel-tabs a.is-active{border-bottom-color:#4eb5de}.panel.is-primary .panel-block.is-active .panel-icon,.docstring>section>a.panel.docs-sourcelink .panel-block.is-active .panel-icon{color:#4eb5de}.panel.is-link .panel-heading{background-color:#2e63b8;color:#fff}.panel.is-link .panel-tabs a.is-active{border-bottom-color:#2e63b8}.panel.is-link .panel-block.is-active .panel-icon{color:#2e63b8}.panel.is-info .panel-heading{background-color:#209cee;color:#fff}.panel.is-info .panel-tabs a.is-active{border-bottom-color:#209cee}.panel.is-info .panel-block.is-active .panel-icon{color:#209cee}.panel.is-success .panel-heading{background-color:#22c35b;color:#fff}.panel.is-success .panel-tabs a.is-active{border-bottom-color:#22c35b}.panel.is-success .panel-block.is-active .panel-icon{color:#22c35b}.panel.is-warning .panel-heading{background-color:#ffdd57;color:rgba(0,0,0,0.7)}.panel.is-warning .panel-tabs a.is-active{border-bottom-color:#ffdd57}.panel.is-warning .panel-block.is-active .panel-icon{color:#ffdd57}.panel.is-danger .panel-heading{background-color:#da0b00;color:#fff}.panel.is-danger .panel-tabs a.is-active{border-bottom-color:#da0b00}.panel.is-danger .panel-block.is-active .panel-icon{color:#da0b00}.panel-tabs:not(:last-child),.panel-block:not(:last-child){border-bottom:1px solid #ededed}.panel-heading{background-color:#ededed;border-radius:6px 6px 0 0;color:#222;font-size:1.25em;font-weight:700;line-height:1.25;padding:0.75em 1em}.panel-tabs{align-items:flex-end;display:flex;font-size:.875em;justify-content:center}.panel-tabs a{border-bottom:1px solid #dbdbdb;margin-bottom:-1px;padding:0.5em}.panel-tabs a.is-active{border-bottom-color:#4a4a4a;color:#363636}.panel-list a{color:#222}.panel-list a:hover{color:#2e63b8}.panel-block{align-items:center;color:#222;display:flex;justify-content:flex-start;padding:0.5em 0.75em}.panel-block input[type="checkbox"]{margin-right:.75em}.panel-block>.control{flex-grow:1;flex-shrink:1;width:100%}.panel-block.is-wrapped{flex-wrap:wrap}.panel-block.is-active{border-left-color:#2e63b8;color:#363636}.panel-block.is-active .panel-icon{color:#2e63b8}.panel-block:last-child{border-bottom-left-radius:6px;border-bottom-right-radius:6px}a.panel-block,label.panel-block{cursor:pointer}a.panel-block:hover,label.panel-block:hover{background-color:#f5f5f5}.panel-icon{display:inline-block;font-size:14px;height:1em;line-height:1em;text-align:center;vertical-align:top;width:1em;color:#6b6b6b;margin-right:.75em}.panel-icon .fa{font-size:inherit;line-height:inherit}.tabs{-webkit-overflow-scrolling:touch;align-items:stretch;display:flex;font-size:1rem;justify-content:space-between;overflow:hidden;overflow-x:auto;white-space:nowrap}.tabs a{align-items:center;border-bottom-color:#dbdbdb;border-bottom-style:solid;border-bottom-width:1px;color:#222;display:flex;justify-content:center;margin-bottom:-1px;padding:0.5em 1em;vertical-align:top}.tabs a:hover{border-bottom-color:#222;color:#222}.tabs li{display:block}.tabs li.is-active a{border-bottom-color:#2e63b8;color:#2e63b8}.tabs ul{align-items:center;border-bottom-color:#dbdbdb;border-bottom-style:solid;border-bottom-width:1px;display:flex;flex-grow:1;flex-shrink:0;justify-content:flex-start}.tabs ul.is-left{padding-right:0.75em}.tabs ul.is-center{flex:none;justify-content:center;padding-left:0.75em;padding-right:0.75em}.tabs ul.is-right{justify-content:flex-end;padding-left:0.75em}.tabs .icon:first-child{margin-right:.5em}.tabs .icon:last-child{margin-left:.5em}.tabs.is-centered ul{justify-content:center}.tabs.is-right ul{justify-content:flex-end}.tabs.is-boxed a{border:1px solid transparent;border-radius:4px 4px 0 0}.tabs.is-boxed a:hover{background-color:#f5f5f5;border-bottom-color:#dbdbdb}.tabs.is-boxed li.is-active a{background-color:#fff;border-color:#dbdbdb;border-bottom-color:rgba(0,0,0,0) !important}.tabs.is-fullwidth li{flex-grow:1;flex-shrink:0}.tabs.is-toggle a{border-color:#dbdbdb;border-style:solid;border-width:1px;margin-bottom:0;position:relative}.tabs.is-toggle a:hover{background-color:#f5f5f5;border-color:#b5b5b5;z-index:2}.tabs.is-toggle li+li{margin-left:-1px}.tabs.is-toggle li:first-child a{border-top-left-radius:4px;border-bottom-left-radius:4px}.tabs.is-toggle li:last-child a{border-top-right-radius:4px;border-bottom-right-radius:4px}.tabs.is-toggle li.is-active a{background-color:#2e63b8;border-color:#2e63b8;color:#fff;z-index:1}.tabs.is-toggle ul{border-bottom:none}.tabs.is-toggle.is-toggle-rounded li:first-child a{border-bottom-left-radius:9999px;border-top-left-radius:9999px;padding-left:1.25em}.tabs.is-toggle.is-toggle-rounded li:last-child a{border-bottom-right-radius:9999px;border-top-right-radius:9999px;padding-right:1.25em}.tabs.is-small,#documenter .docs-sidebar form.docs-search>input.tabs{font-size:.75rem}.tabs.is-medium{font-size:1.25rem}.tabs.is-large{font-size:1.5rem}.column{display:block;flex-basis:0;flex-grow:1;flex-shrink:1;padding:.75rem}.columns.is-mobile>.column.is-narrow{flex:none;width:unset}.columns.is-mobile>.column.is-full{flex:none;width:100%}.columns.is-mobile>.column.is-three-quarters{flex:none;width:75%}.columns.is-mobile>.column.is-two-thirds{flex:none;width:66.6666%}.columns.is-mobile>.column.is-half{flex:none;width:50%}.columns.is-mobile>.column.is-one-third{flex:none;width:33.3333%}.columns.is-mobile>.column.is-one-quarter{flex:none;width:25%}.columns.is-mobile>.column.is-one-fifth{flex:none;width:20%}.columns.is-mobile>.column.is-two-fifths{flex:none;width:40%}.columns.is-mobile>.column.is-three-fifths{flex:none;width:60%}.columns.is-mobile>.column.is-four-fifths{flex:none;width:80%}.columns.is-mobile>.column.is-offset-three-quarters{margin-left:75%}.columns.is-mobile>.column.is-offset-two-thirds{margin-left:66.6666%}.columns.is-mobile>.column.is-offset-half{margin-left:50%}.columns.is-mobile>.column.is-offset-one-third{margin-left:33.3333%}.columns.is-mobile>.column.is-offset-one-quarter{margin-left:25%}.columns.is-mobile>.column.is-offset-one-fifth{margin-left:20%}.columns.is-mobile>.column.is-offset-two-fifths{margin-left:40%}.columns.is-mobile>.column.is-offset-three-fifths{margin-left:60%}.columns.is-mobile>.column.is-offset-four-fifths{margin-left:80%}.columns.is-mobile>.column.is-0{flex:none;width:0%}.columns.is-mobile>.column.is-offset-0{margin-left:0%}.columns.is-mobile>.column.is-1{flex:none;width:8.33333337%}.columns.is-mobile>.column.is-offset-1{margin-left:8.33333337%}.columns.is-mobile>.column.is-2{flex:none;width:16.66666674%}.columns.is-mobile>.column.is-offset-2{margin-left:16.66666674%}.columns.is-mobile>.column.is-3{flex:none;width:25%}.columns.is-mobile>.column.is-offset-3{margin-left:25%}.columns.is-mobile>.column.is-4{flex:none;width:33.33333337%}.columns.is-mobile>.column.is-offset-4{margin-left:33.33333337%}.columns.is-mobile>.column.is-5{flex:none;width:41.66666674%}.columns.is-mobile>.column.is-offset-5{margin-left:41.66666674%}.columns.is-mobile>.column.is-6{flex:none;width:50%}.columns.is-mobile>.column.is-offset-6{margin-left:50%}.columns.is-mobile>.column.is-7{flex:none;width:58.33333337%}.columns.is-mobile>.column.is-offset-7{margin-left:58.33333337%}.columns.is-mobile>.column.is-8{flex:none;width:66.66666674%}.columns.is-mobile>.column.is-offset-8{margin-left:66.66666674%}.columns.is-mobile>.column.is-9{flex:none;width:75%}.columns.is-mobile>.column.is-offset-9{margin-left:75%}.columns.is-mobile>.column.is-10{flex:none;width:83.33333337%}.columns.is-mobile>.column.is-offset-10{margin-left:83.33333337%}.columns.is-mobile>.column.is-11{flex:none;width:91.66666674%}.columns.is-mobile>.column.is-offset-11{margin-left:91.66666674%}.columns.is-mobile>.column.is-12{flex:none;width:100%}.columns.is-mobile>.column.is-offset-12{margin-left:100%}@media screen and (max-width: 768px){.column.is-narrow-mobile{flex:none;width:unset}.column.is-full-mobile{flex:none;width:100%}.column.is-three-quarters-mobile{flex:none;width:75%}.column.is-two-thirds-mobile{flex:none;width:66.6666%}.column.is-half-mobile{flex:none;width:50%}.column.is-one-third-mobile{flex:none;width:33.3333%}.column.is-one-quarter-mobile{flex:none;width:25%}.column.is-one-fifth-mobile{flex:none;width:20%}.column.is-two-fifths-mobile{flex:none;width:40%}.column.is-three-fifths-mobile{flex:none;width:60%}.column.is-four-fifths-mobile{flex:none;width:80%}.column.is-offset-three-quarters-mobile{margin-left:75%}.column.is-offset-two-thirds-mobile{margin-left:66.6666%}.column.is-offset-half-mobile{margin-left:50%}.column.is-offset-one-third-mobile{margin-left:33.3333%}.column.is-offset-one-quarter-mobile{margin-left:25%}.column.is-offset-one-fifth-mobile{margin-left:20%}.column.is-offset-two-fifths-mobile{margin-left:40%}.column.is-offset-three-fifths-mobile{margin-left:60%}.column.is-offset-four-fifths-mobile{margin-left:80%}.column.is-0-mobile{flex:none;width:0%}.column.is-offset-0-mobile{margin-left:0%}.column.is-1-mobile{flex:none;width:8.33333337%}.column.is-offset-1-mobile{margin-left:8.33333337%}.column.is-2-mobile{flex:none;width:16.66666674%}.column.is-offset-2-mobile{margin-left:16.66666674%}.column.is-3-mobile{flex:none;width:25%}.column.is-offset-3-mobile{margin-left:25%}.column.is-4-mobile{flex:none;width:33.33333337%}.column.is-offset-4-mobile{margin-left:33.33333337%}.column.is-5-mobile{flex:none;width:41.66666674%}.column.is-offset-5-mobile{margin-left:41.66666674%}.column.is-6-mobile{flex:none;width:50%}.column.is-offset-6-mobile{margin-left:50%}.column.is-7-mobile{flex:none;width:58.33333337%}.column.is-offset-7-mobile{margin-left:58.33333337%}.column.is-8-mobile{flex:none;width:66.66666674%}.column.is-offset-8-mobile{margin-left:66.66666674%}.column.is-9-mobile{flex:none;width:75%}.column.is-offset-9-mobile{margin-left:75%}.column.is-10-mobile{flex:none;width:83.33333337%}.column.is-offset-10-mobile{margin-left:83.33333337%}.column.is-11-mobile{flex:none;width:91.66666674%}.column.is-offset-11-mobile{margin-left:91.66666674%}.column.is-12-mobile{flex:none;width:100%}.column.is-offset-12-mobile{margin-left:100%}}@media screen and (min-width: 769px),print{.column.is-narrow,.column.is-narrow-tablet{flex:none;width:unset}.column.is-full,.column.is-full-tablet{flex:none;width:100%}.column.is-three-quarters,.column.is-three-quarters-tablet{flex:none;width:75%}.column.is-two-thirds,.column.is-two-thirds-tablet{flex:none;width:66.6666%}.column.is-half,.column.is-half-tablet{flex:none;width:50%}.column.is-one-third,.column.is-one-third-tablet{flex:none;width:33.3333%}.column.is-one-quarter,.column.is-one-quarter-tablet{flex:none;width:25%}.column.is-one-fifth,.column.is-one-fifth-tablet{flex:none;width:20%}.column.is-two-fifths,.column.is-two-fifths-tablet{flex:none;width:40%}.column.is-three-fifths,.column.is-three-fifths-tablet{flex:none;width:60%}.column.is-four-fifths,.column.is-four-fifths-tablet{flex:none;width:80%}.column.is-offset-three-quarters,.column.is-offset-three-quarters-tablet{margin-left:75%}.column.is-offset-two-thirds,.column.is-offset-two-thirds-tablet{margin-left:66.6666%}.column.is-offset-half,.column.is-offset-half-tablet{margin-left:50%}.column.is-offset-one-third,.column.is-offset-one-third-tablet{margin-left:33.3333%}.column.is-offset-one-quarter,.column.is-offset-one-quarter-tablet{margin-left:25%}.column.is-offset-one-fifth,.column.is-offset-one-fifth-tablet{margin-left:20%}.column.is-offset-two-fifths,.column.is-offset-two-fifths-tablet{margin-left:40%}.column.is-offset-three-fifths,.column.is-offset-three-fifths-tablet{margin-left:60%}.column.is-offset-four-fifths,.column.is-offset-four-fifths-tablet{margin-left:80%}.column.is-0,.column.is-0-tablet{flex:none;width:0%}.column.is-offset-0,.column.is-offset-0-tablet{margin-left:0%}.column.is-1,.column.is-1-tablet{flex:none;width:8.33333337%}.column.is-offset-1,.column.is-offset-1-tablet{margin-left:8.33333337%}.column.is-2,.column.is-2-tablet{flex:none;width:16.66666674%}.column.is-offset-2,.column.is-offset-2-tablet{margin-left:16.66666674%}.column.is-3,.column.is-3-tablet{flex:none;width:25%}.column.is-offset-3,.column.is-offset-3-tablet{margin-left:25%}.column.is-4,.column.is-4-tablet{flex:none;width:33.33333337%}.column.is-offset-4,.column.is-offset-4-tablet{margin-left:33.33333337%}.column.is-5,.column.is-5-tablet{flex:none;width:41.66666674%}.column.is-offset-5,.column.is-offset-5-tablet{margin-left:41.66666674%}.column.is-6,.column.is-6-tablet{flex:none;width:50%}.column.is-offset-6,.column.is-offset-6-tablet{margin-left:50%}.column.is-7,.column.is-7-tablet{flex:none;width:58.33333337%}.column.is-offset-7,.column.is-offset-7-tablet{margin-left:58.33333337%}.column.is-8,.column.is-8-tablet{flex:none;width:66.66666674%}.column.is-offset-8,.column.is-offset-8-tablet{margin-left:66.66666674%}.column.is-9,.column.is-9-tablet{flex:none;width:75%}.column.is-offset-9,.column.is-offset-9-tablet{margin-left:75%}.column.is-10,.column.is-10-tablet{flex:none;width:83.33333337%}.column.is-offset-10,.column.is-offset-10-tablet{margin-left:83.33333337%}.column.is-11,.column.is-11-tablet{flex:none;width:91.66666674%}.column.is-offset-11,.column.is-offset-11-tablet{margin-left:91.66666674%}.column.is-12,.column.is-12-tablet{flex:none;width:100%}.column.is-offset-12,.column.is-offset-12-tablet{margin-left:100%}}@media screen and (max-width: 1055px){.column.is-narrow-touch{flex:none;width:unset}.column.is-full-touch{flex:none;width:100%}.column.is-three-quarters-touch{flex:none;width:75%}.column.is-two-thirds-touch{flex:none;width:66.6666%}.column.is-half-touch{flex:none;width:50%}.column.is-one-third-touch{flex:none;width:33.3333%}.column.is-one-quarter-touch{flex:none;width:25%}.column.is-one-fifth-touch{flex:none;width:20%}.column.is-two-fifths-touch{flex:none;width:40%}.column.is-three-fifths-touch{flex:none;width:60%}.column.is-four-fifths-touch{flex:none;width:80%}.column.is-offset-three-quarters-touch{margin-left:75%}.column.is-offset-two-thirds-touch{margin-left:66.6666%}.column.is-offset-half-touch{margin-left:50%}.column.is-offset-one-third-touch{margin-left:33.3333%}.column.is-offset-one-quarter-touch{margin-left:25%}.column.is-offset-one-fifth-touch{margin-left:20%}.column.is-offset-two-fifths-touch{margin-left:40%}.column.is-offset-three-fifths-touch{margin-left:60%}.column.is-offset-four-fifths-touch{margin-left:80%}.column.is-0-touch{flex:none;width:0%}.column.is-offset-0-touch{margin-left:0%}.column.is-1-touch{flex:none;width:8.33333337%}.column.is-offset-1-touch{margin-left:8.33333337%}.column.is-2-touch{flex:none;width:16.66666674%}.column.is-offset-2-touch{margin-left:16.66666674%}.column.is-3-touch{flex:none;width:25%}.column.is-offset-3-touch{margin-left:25%}.column.is-4-touch{flex:none;width:33.33333337%}.column.is-offset-4-touch{margin-left:33.33333337%}.column.is-5-touch{flex:none;width:41.66666674%}.column.is-offset-5-touch{margin-left:41.66666674%}.column.is-6-touch{flex:none;width:50%}.column.is-offset-6-touch{margin-left:50%}.column.is-7-touch{flex:none;width:58.33333337%}.column.is-offset-7-touch{margin-left:58.33333337%}.column.is-8-touch{flex:none;width:66.66666674%}.column.is-offset-8-touch{margin-left:66.66666674%}.column.is-9-touch{flex:none;width:75%}.column.is-offset-9-touch{margin-left:75%}.column.is-10-touch{flex:none;width:83.33333337%}.column.is-offset-10-touch{margin-left:83.33333337%}.column.is-11-touch{flex:none;width:91.66666674%}.column.is-offset-11-touch{margin-left:91.66666674%}.column.is-12-touch{flex:none;width:100%}.column.is-offset-12-touch{margin-left:100%}}@media screen and (min-width: 1056px){.column.is-narrow-desktop{flex:none;width:unset}.column.is-full-desktop{flex:none;width:100%}.column.is-three-quarters-desktop{flex:none;width:75%}.column.is-two-thirds-desktop{flex:none;width:66.6666%}.column.is-half-desktop{flex:none;width:50%}.column.is-one-third-desktop{flex:none;width:33.3333%}.column.is-one-quarter-desktop{flex:none;width:25%}.column.is-one-fifth-desktop{flex:none;width:20%}.column.is-two-fifths-desktop{flex:none;width:40%}.column.is-three-fifths-desktop{flex:none;width:60%}.column.is-four-fifths-desktop{flex:none;width:80%}.column.is-offset-three-quarters-desktop{margin-left:75%}.column.is-offset-two-thirds-desktop{margin-left:66.6666%}.column.is-offset-half-desktop{margin-left:50%}.column.is-offset-one-third-desktop{margin-left:33.3333%}.column.is-offset-one-quarter-desktop{margin-left:25%}.column.is-offset-one-fifth-desktop{margin-left:20%}.column.is-offset-two-fifths-desktop{margin-left:40%}.column.is-offset-three-fifths-desktop{margin-left:60%}.column.is-offset-four-fifths-desktop{margin-left:80%}.column.is-0-desktop{flex:none;width:0%}.column.is-offset-0-desktop{margin-left:0%}.column.is-1-desktop{flex:none;width:8.33333337%}.column.is-offset-1-desktop{margin-left:8.33333337%}.column.is-2-desktop{flex:none;width:16.66666674%}.column.is-offset-2-desktop{margin-left:16.66666674%}.column.is-3-desktop{flex:none;width:25%}.column.is-offset-3-desktop{margin-left:25%}.column.is-4-desktop{flex:none;width:33.33333337%}.column.is-offset-4-desktop{margin-left:33.33333337%}.column.is-5-desktop{flex:none;width:41.66666674%}.column.is-offset-5-desktop{margin-left:41.66666674%}.column.is-6-desktop{flex:none;width:50%}.column.is-offset-6-desktop{margin-left:50%}.column.is-7-desktop{flex:none;width:58.33333337%}.column.is-offset-7-desktop{margin-left:58.33333337%}.column.is-8-desktop{flex:none;width:66.66666674%}.column.is-offset-8-desktop{margin-left:66.66666674%}.column.is-9-desktop{flex:none;width:75%}.column.is-offset-9-desktop{margin-left:75%}.column.is-10-desktop{flex:none;width:83.33333337%}.column.is-offset-10-desktop{margin-left:83.33333337%}.column.is-11-desktop{flex:none;width:91.66666674%}.column.is-offset-11-desktop{margin-left:91.66666674%}.column.is-12-desktop{flex:none;width:100%}.column.is-offset-12-desktop{margin-left:100%}}@media screen and (min-width: 1216px){.column.is-narrow-widescreen{flex:none;width:unset}.column.is-full-widescreen{flex:none;width:100%}.column.is-three-quarters-widescreen{flex:none;width:75%}.column.is-two-thirds-widescreen{flex:none;width:66.6666%}.column.is-half-widescreen{flex:none;width:50%}.column.is-one-third-widescreen{flex:none;width:33.3333%}.column.is-one-quarter-widescreen{flex:none;width:25%}.column.is-one-fifth-widescreen{flex:none;width:20%}.column.is-two-fifths-widescreen{flex:none;width:40%}.column.is-three-fifths-widescreen{flex:none;width:60%}.column.is-four-fifths-widescreen{flex:none;width:80%}.column.is-offset-three-quarters-widescreen{margin-left:75%}.column.is-offset-two-thirds-widescreen{margin-left:66.6666%}.column.is-offset-half-widescreen{margin-left:50%}.column.is-offset-one-third-widescreen{margin-left:33.3333%}.column.is-offset-one-quarter-widescreen{margin-left:25%}.column.is-offset-one-fifth-widescreen{margin-left:20%}.column.is-offset-two-fifths-widescreen{margin-left:40%}.column.is-offset-three-fifths-widescreen{margin-left:60%}.column.is-offset-four-fifths-widescreen{margin-left:80%}.column.is-0-widescreen{flex:none;width:0%}.column.is-offset-0-widescreen{margin-left:0%}.column.is-1-widescreen{flex:none;width:8.33333337%}.column.is-offset-1-widescreen{margin-left:8.33333337%}.column.is-2-widescreen{flex:none;width:16.66666674%}.column.is-offset-2-widescreen{margin-left:16.66666674%}.column.is-3-widescreen{flex:none;width:25%}.column.is-offset-3-widescreen{margin-left:25%}.column.is-4-widescreen{flex:none;width:33.33333337%}.column.is-offset-4-widescreen{margin-left:33.33333337%}.column.is-5-widescreen{flex:none;width:41.66666674%}.column.is-offset-5-widescreen{margin-left:41.66666674%}.column.is-6-widescreen{flex:none;width:50%}.column.is-offset-6-widescreen{margin-left:50%}.column.is-7-widescreen{flex:none;width:58.33333337%}.column.is-offset-7-widescreen{margin-left:58.33333337%}.column.is-8-widescreen{flex:none;width:66.66666674%}.column.is-offset-8-widescreen{margin-left:66.66666674%}.column.is-9-widescreen{flex:none;width:75%}.column.is-offset-9-widescreen{margin-left:75%}.column.is-10-widescreen{flex:none;width:83.33333337%}.column.is-offset-10-widescreen{margin-left:83.33333337%}.column.is-11-widescreen{flex:none;width:91.66666674%}.column.is-offset-11-widescreen{margin-left:91.66666674%}.column.is-12-widescreen{flex:none;width:100%}.column.is-offset-12-widescreen{margin-left:100%}}@media screen and (min-width: 1408px){.column.is-narrow-fullhd{flex:none;width:unset}.column.is-full-fullhd{flex:none;width:100%}.column.is-three-quarters-fullhd{flex:none;width:75%}.column.is-two-thirds-fullhd{flex:none;width:66.6666%}.column.is-half-fullhd{flex:none;width:50%}.column.is-one-third-fullhd{flex:none;width:33.3333%}.column.is-one-quarter-fullhd{flex:none;width:25%}.column.is-one-fifth-fullhd{flex:none;width:20%}.column.is-two-fifths-fullhd{flex:none;width:40%}.column.is-three-fifths-fullhd{flex:none;width:60%}.column.is-four-fifths-fullhd{flex:none;width:80%}.column.is-offset-three-quarters-fullhd{margin-left:75%}.column.is-offset-two-thirds-fullhd{margin-left:66.6666%}.column.is-offset-half-fullhd{margin-left:50%}.column.is-offset-one-third-fullhd{margin-left:33.3333%}.column.is-offset-one-quarter-fullhd{margin-left:25%}.column.is-offset-one-fifth-fullhd{margin-left:20%}.column.is-offset-two-fifths-fullhd{margin-left:40%}.column.is-offset-three-fifths-fullhd{margin-left:60%}.column.is-offset-four-fifths-fullhd{margin-left:80%}.column.is-0-fullhd{flex:none;width:0%}.column.is-offset-0-fullhd{margin-left:0%}.column.is-1-fullhd{flex:none;width:8.33333337%}.column.is-offset-1-fullhd{margin-left:8.33333337%}.column.is-2-fullhd{flex:none;width:16.66666674%}.column.is-offset-2-fullhd{margin-left:16.66666674%}.column.is-3-fullhd{flex:none;width:25%}.column.is-offset-3-fullhd{margin-left:25%}.column.is-4-fullhd{flex:none;width:33.33333337%}.column.is-offset-4-fullhd{margin-left:33.33333337%}.column.is-5-fullhd{flex:none;width:41.66666674%}.column.is-offset-5-fullhd{margin-left:41.66666674%}.column.is-6-fullhd{flex:none;width:50%}.column.is-offset-6-fullhd{margin-left:50%}.column.is-7-fullhd{flex:none;width:58.33333337%}.column.is-offset-7-fullhd{margin-left:58.33333337%}.column.is-8-fullhd{flex:none;width:66.66666674%}.column.is-offset-8-fullhd{margin-left:66.66666674%}.column.is-9-fullhd{flex:none;width:75%}.column.is-offset-9-fullhd{margin-left:75%}.column.is-10-fullhd{flex:none;width:83.33333337%}.column.is-offset-10-fullhd{margin-left:83.33333337%}.column.is-11-fullhd{flex:none;width:91.66666674%}.column.is-offset-11-fullhd{margin-left:91.66666674%}.column.is-12-fullhd{flex:none;width:100%}.column.is-offset-12-fullhd{margin-left:100%}}.columns{margin-left:-.75rem;margin-right:-.75rem;margin-top:-.75rem}.columns:last-child{margin-bottom:-.75rem}.columns:not(:last-child){margin-bottom:calc(1.5rem - .75rem)}.columns.is-centered{justify-content:center}.columns.is-gapless{margin-left:0;margin-right:0;margin-top:0}.columns.is-gapless>.column{margin:0;padding:0 !important}.columns.is-gapless:not(:last-child){margin-bottom:1.5rem}.columns.is-gapless:last-child{margin-bottom:0}.columns.is-mobile{display:flex}.columns.is-multiline{flex-wrap:wrap}.columns.is-vcentered{align-items:center}@media screen and (min-width: 769px),print{.columns:not(.is-desktop){display:flex}}@media screen and (min-width: 1056px){.columns.is-desktop{display:flex}}.columns.is-variable{--columnGap: 0.75rem;margin-left:calc(-1 * var(--columnGap));margin-right:calc(-1 * var(--columnGap))}.columns.is-variable>.column{padding-left:var(--columnGap);padding-right:var(--columnGap)}.columns.is-variable.is-0{--columnGap: 0rem}@media screen and (max-width: 768px){.columns.is-variable.is-0-mobile{--columnGap: 0rem}}@media screen and (min-width: 769px),print{.columns.is-variable.is-0-tablet{--columnGap: 0rem}}@media screen and (min-width: 769px) and (max-width: 1055px){.columns.is-variable.is-0-tablet-only{--columnGap: 0rem}}@media screen and (max-width: 1055px){.columns.is-variable.is-0-touch{--columnGap: 0rem}}@media screen and (min-width: 1056px){.columns.is-variable.is-0-desktop{--columnGap: 0rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){.columns.is-variable.is-0-desktop-only{--columnGap: 0rem}}@media screen and (min-width: 1216px){.columns.is-variable.is-0-widescreen{--columnGap: 0rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){.columns.is-variable.is-0-widescreen-only{--columnGap: 0rem}}@media screen and (min-width: 1408px){.columns.is-variable.is-0-fullhd{--columnGap: 0rem}}.columns.is-variable.is-1{--columnGap: .25rem}@media screen and (max-width: 768px){.columns.is-variable.is-1-mobile{--columnGap: .25rem}}@media screen and (min-width: 769px),print{.columns.is-variable.is-1-tablet{--columnGap: .25rem}}@media screen and (min-width: 769px) and (max-width: 1055px){.columns.is-variable.is-1-tablet-only{--columnGap: .25rem}}@media screen and (max-width: 1055px){.columns.is-variable.is-1-touch{--columnGap: .25rem}}@media screen and (min-width: 1056px){.columns.is-variable.is-1-desktop{--columnGap: .25rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){.columns.is-variable.is-1-desktop-only{--columnGap: .25rem}}@media screen and (min-width: 1216px){.columns.is-variable.is-1-widescreen{--columnGap: .25rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){.columns.is-variable.is-1-widescreen-only{--columnGap: .25rem}}@media screen and (min-width: 1408px){.columns.is-variable.is-1-fullhd{--columnGap: .25rem}}.columns.is-variable.is-2{--columnGap: .5rem}@media screen and (max-width: 768px){.columns.is-variable.is-2-mobile{--columnGap: .5rem}}@media screen and (min-width: 769px),print{.columns.is-variable.is-2-tablet{--columnGap: .5rem}}@media screen and (min-width: 769px) and (max-width: 1055px){.columns.is-variable.is-2-tablet-only{--columnGap: .5rem}}@media screen and (max-width: 1055px){.columns.is-variable.is-2-touch{--columnGap: .5rem}}@media screen and (min-width: 1056px){.columns.is-variable.is-2-desktop{--columnGap: .5rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){.columns.is-variable.is-2-desktop-only{--columnGap: .5rem}}@media screen and (min-width: 1216px){.columns.is-variable.is-2-widescreen{--columnGap: .5rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){.columns.is-variable.is-2-widescreen-only{--columnGap: .5rem}}@media screen and (min-width: 1408px){.columns.is-variable.is-2-fullhd{--columnGap: .5rem}}.columns.is-variable.is-3{--columnGap: .75rem}@media screen and (max-width: 768px){.columns.is-variable.is-3-mobile{--columnGap: .75rem}}@media screen and (min-width: 769px),print{.columns.is-variable.is-3-tablet{--columnGap: .75rem}}@media screen and (min-width: 769px) and (max-width: 1055px){.columns.is-variable.is-3-tablet-only{--columnGap: .75rem}}@media screen and (max-width: 1055px){.columns.is-variable.is-3-touch{--columnGap: .75rem}}@media screen and (min-width: 1056px){.columns.is-variable.is-3-desktop{--columnGap: .75rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){.columns.is-variable.is-3-desktop-only{--columnGap: .75rem}}@media screen and (min-width: 1216px){.columns.is-variable.is-3-widescreen{--columnGap: .75rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){.columns.is-variable.is-3-widescreen-only{--columnGap: .75rem}}@media screen and (min-width: 1408px){.columns.is-variable.is-3-fullhd{--columnGap: .75rem}}.columns.is-variable.is-4{--columnGap: 1rem}@media screen and (max-width: 768px){.columns.is-variable.is-4-mobile{--columnGap: 1rem}}@media screen and (min-width: 769px),print{.columns.is-variable.is-4-tablet{--columnGap: 1rem}}@media screen and (min-width: 769px) and (max-width: 1055px){.columns.is-variable.is-4-tablet-only{--columnGap: 1rem}}@media screen and (max-width: 1055px){.columns.is-variable.is-4-touch{--columnGap: 1rem}}@media screen and (min-width: 1056px){.columns.is-variable.is-4-desktop{--columnGap: 1rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){.columns.is-variable.is-4-desktop-only{--columnGap: 1rem}}@media screen and (min-width: 1216px){.columns.is-variable.is-4-widescreen{--columnGap: 1rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){.columns.is-variable.is-4-widescreen-only{--columnGap: 1rem}}@media screen and (min-width: 1408px){.columns.is-variable.is-4-fullhd{--columnGap: 1rem}}.columns.is-variable.is-5{--columnGap: 1.25rem}@media screen and (max-width: 768px){.columns.is-variable.is-5-mobile{--columnGap: 1.25rem}}@media screen and (min-width: 769px),print{.columns.is-variable.is-5-tablet{--columnGap: 1.25rem}}@media screen and (min-width: 769px) and (max-width: 1055px){.columns.is-variable.is-5-tablet-only{--columnGap: 1.25rem}}@media screen and (max-width: 1055px){.columns.is-variable.is-5-touch{--columnGap: 1.25rem}}@media screen and (min-width: 1056px){.columns.is-variable.is-5-desktop{--columnGap: 1.25rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){.columns.is-variable.is-5-desktop-only{--columnGap: 1.25rem}}@media screen and (min-width: 1216px){.columns.is-variable.is-5-widescreen{--columnGap: 1.25rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){.columns.is-variable.is-5-widescreen-only{--columnGap: 1.25rem}}@media screen and (min-width: 1408px){.columns.is-variable.is-5-fullhd{--columnGap: 1.25rem}}.columns.is-variable.is-6{--columnGap: 1.5rem}@media screen and (max-width: 768px){.columns.is-variable.is-6-mobile{--columnGap: 1.5rem}}@media screen and (min-width: 769px),print{.columns.is-variable.is-6-tablet{--columnGap: 1.5rem}}@media screen and (min-width: 769px) and (max-width: 1055px){.columns.is-variable.is-6-tablet-only{--columnGap: 1.5rem}}@media screen and (max-width: 1055px){.columns.is-variable.is-6-touch{--columnGap: 1.5rem}}@media screen and (min-width: 1056px){.columns.is-variable.is-6-desktop{--columnGap: 1.5rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){.columns.is-variable.is-6-desktop-only{--columnGap: 1.5rem}}@media screen and (min-width: 1216px){.columns.is-variable.is-6-widescreen{--columnGap: 1.5rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){.columns.is-variable.is-6-widescreen-only{--columnGap: 1.5rem}}@media screen and (min-width: 1408px){.columns.is-variable.is-6-fullhd{--columnGap: 1.5rem}}.columns.is-variable.is-7{--columnGap: 1.75rem}@media screen and (max-width: 768px){.columns.is-variable.is-7-mobile{--columnGap: 1.75rem}}@media screen and (min-width: 769px),print{.columns.is-variable.is-7-tablet{--columnGap: 1.75rem}}@media screen and (min-width: 769px) and (max-width: 1055px){.columns.is-variable.is-7-tablet-only{--columnGap: 1.75rem}}@media screen and (max-width: 1055px){.columns.is-variable.is-7-touch{--columnGap: 1.75rem}}@media screen and (min-width: 1056px){.columns.is-variable.is-7-desktop{--columnGap: 1.75rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){.columns.is-variable.is-7-desktop-only{--columnGap: 1.75rem}}@media screen and (min-width: 1216px){.columns.is-variable.is-7-widescreen{--columnGap: 1.75rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){.columns.is-variable.is-7-widescreen-only{--columnGap: 1.75rem}}@media screen and (min-width: 1408px){.columns.is-variable.is-7-fullhd{--columnGap: 1.75rem}}.columns.is-variable.is-8{--columnGap: 2rem}@media screen and (max-width: 768px){.columns.is-variable.is-8-mobile{--columnGap: 2rem}}@media screen and (min-width: 769px),print{.columns.is-variable.is-8-tablet{--columnGap: 2rem}}@media screen and (min-width: 769px) and (max-width: 1055px){.columns.is-variable.is-8-tablet-only{--columnGap: 2rem}}@media screen and (max-width: 1055px){.columns.is-variable.is-8-touch{--columnGap: 2rem}}@media screen and (min-width: 1056px){.columns.is-variable.is-8-desktop{--columnGap: 2rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){.columns.is-variable.is-8-desktop-only{--columnGap: 2rem}}@media screen and (min-width: 1216px){.columns.is-variable.is-8-widescreen{--columnGap: 2rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){.columns.is-variable.is-8-widescreen-only{--columnGap: 2rem}}@media screen and (min-width: 1408px){.columns.is-variable.is-8-fullhd{--columnGap: 2rem}}.tile{align-items:stretch;display:block;flex-basis:0;flex-grow:1;flex-shrink:1;min-height:min-content}.tile.is-ancestor{margin-left:-.75rem;margin-right:-.75rem;margin-top:-.75rem}.tile.is-ancestor:last-child{margin-bottom:-.75rem}.tile.is-ancestor:not(:last-child){margin-bottom:.75rem}.tile.is-child{margin:0 !important}.tile.is-parent{padding:.75rem}.tile.is-vertical{flex-direction:column}.tile.is-vertical>.tile.is-child:not(:last-child){margin-bottom:1.5rem !important}@media screen and (min-width: 769px),print{.tile:not(.is-child){display:flex}.tile.is-1{flex:none;width:8.33333337%}.tile.is-2{flex:none;width:16.66666674%}.tile.is-3{flex:none;width:25%}.tile.is-4{flex:none;width:33.33333337%}.tile.is-5{flex:none;width:41.66666674%}.tile.is-6{flex:none;width:50%}.tile.is-7{flex:none;width:58.33333337%}.tile.is-8{flex:none;width:66.66666674%}.tile.is-9{flex:none;width:75%}.tile.is-10{flex:none;width:83.33333337%}.tile.is-11{flex:none;width:91.66666674%}.tile.is-12{flex:none;width:100%}}.hero{align-items:stretch;display:flex;flex-direction:column;justify-content:space-between}.hero .navbar{background:none}.hero .tabs ul{border-bottom:none}.hero.is-white{background-color:#fff;color:#0a0a0a}.hero.is-white a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-white strong{color:inherit}.hero.is-white .title{color:#0a0a0a}.hero.is-white .subtitle{color:rgba(10,10,10,0.9)}.hero.is-white .subtitle a:not(.button),.hero.is-white .subtitle strong{color:#0a0a0a}@media screen and (max-width: 1055px){.hero.is-white .navbar-menu{background-color:#fff}}.hero.is-white .navbar-item,.hero.is-white .navbar-link{color:rgba(10,10,10,0.7)}.hero.is-white a.navbar-item:hover,.hero.is-white a.navbar-item.is-active,.hero.is-white .navbar-link:hover,.hero.is-white .navbar-link.is-active{background-color:#f2f2f2;color:#0a0a0a}.hero.is-white .tabs a{color:#0a0a0a;opacity:0.9}.hero.is-white .tabs a:hover{opacity:1}.hero.is-white .tabs li.is-active a{color:#fff !important;opacity:1}.hero.is-white .tabs.is-boxed a,.hero.is-white .tabs.is-toggle a{color:#0a0a0a}.hero.is-white .tabs.is-boxed a:hover,.hero.is-white .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}.hero.is-white .tabs.is-boxed li.is-active a,.hero.is-white .tabs.is-boxed li.is-active a:hover,.hero.is-white .tabs.is-toggle li.is-active a,.hero.is-white .tabs.is-toggle li.is-active a:hover{background-color:#0a0a0a;border-color:#0a0a0a;color:#fff}.hero.is-white.is-bold{background-image:linear-gradient(141deg, #e8e3e4 0%, #fff 71%, #fff 100%)}@media screen and (max-width: 768px){.hero.is-white.is-bold .navbar-menu{background-image:linear-gradient(141deg, #e8e3e4 0%, #fff 71%, #fff 100%)}}.hero.is-black{background-color:#0a0a0a;color:#fff}.hero.is-black a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-black strong{color:inherit}.hero.is-black .title{color:#fff}.hero.is-black .subtitle{color:rgba(255,255,255,0.9)}.hero.is-black .subtitle a:not(.button),.hero.is-black .subtitle strong{color:#fff}@media screen and (max-width: 1055px){.hero.is-black .navbar-menu{background-color:#0a0a0a}}.hero.is-black .navbar-item,.hero.is-black .navbar-link{color:rgba(255,255,255,0.7)}.hero.is-black a.navbar-item:hover,.hero.is-black a.navbar-item.is-active,.hero.is-black .navbar-link:hover,.hero.is-black .navbar-link.is-active{background-color:#000;color:#fff}.hero.is-black .tabs a{color:#fff;opacity:0.9}.hero.is-black .tabs a:hover{opacity:1}.hero.is-black .tabs li.is-active a{color:#0a0a0a !important;opacity:1}.hero.is-black .tabs.is-boxed a,.hero.is-black .tabs.is-toggle a{color:#fff}.hero.is-black .tabs.is-boxed a:hover,.hero.is-black .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}.hero.is-black .tabs.is-boxed li.is-active a,.hero.is-black .tabs.is-boxed li.is-active a:hover,.hero.is-black .tabs.is-toggle li.is-active a,.hero.is-black .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#0a0a0a}.hero.is-black.is-bold{background-image:linear-gradient(141deg, #000 0%, #0a0a0a 71%, #181616 100%)}@media screen and (max-width: 768px){.hero.is-black.is-bold .navbar-menu{background-image:linear-gradient(141deg, #000 0%, #0a0a0a 71%, #181616 100%)}}.hero.is-light{background-color:#f5f5f5;color:rgba(0,0,0,0.7)}.hero.is-light a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-light strong{color:inherit}.hero.is-light .title{color:rgba(0,0,0,0.7)}.hero.is-light .subtitle{color:rgba(0,0,0,0.9)}.hero.is-light .subtitle a:not(.button),.hero.is-light .subtitle strong{color:rgba(0,0,0,0.7)}@media screen and (max-width: 1055px){.hero.is-light .navbar-menu{background-color:#f5f5f5}}.hero.is-light .navbar-item,.hero.is-light .navbar-link{color:rgba(0,0,0,0.7)}.hero.is-light a.navbar-item:hover,.hero.is-light a.navbar-item.is-active,.hero.is-light .navbar-link:hover,.hero.is-light .navbar-link.is-active{background-color:#e8e8e8;color:rgba(0,0,0,0.7)}.hero.is-light .tabs a{color:rgba(0,0,0,0.7);opacity:0.9}.hero.is-light .tabs a:hover{opacity:1}.hero.is-light .tabs li.is-active a{color:#f5f5f5 !important;opacity:1}.hero.is-light .tabs.is-boxed a,.hero.is-light .tabs.is-toggle a{color:rgba(0,0,0,0.7)}.hero.is-light .tabs.is-boxed a:hover,.hero.is-light .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}.hero.is-light .tabs.is-boxed li.is-active a,.hero.is-light .tabs.is-boxed li.is-active a:hover,.hero.is-light .tabs.is-toggle li.is-active a,.hero.is-light .tabs.is-toggle li.is-active a:hover{background-color:rgba(0,0,0,0.7);border-color:rgba(0,0,0,0.7);color:#f5f5f5}.hero.is-light.is-bold{background-image:linear-gradient(141deg, #dfd8d9 0%, #f5f5f5 71%, #fff 100%)}@media screen and (max-width: 768px){.hero.is-light.is-bold .navbar-menu{background-image:linear-gradient(141deg, #dfd8d9 0%, #f5f5f5 71%, #fff 100%)}}.hero.is-dark,.content kbd.hero{background-color:#363636;color:#fff}.hero.is-dark a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.content kbd.hero a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-dark strong,.content kbd.hero strong{color:inherit}.hero.is-dark .title,.content kbd.hero .title{color:#fff}.hero.is-dark .subtitle,.content kbd.hero .subtitle{color:rgba(255,255,255,0.9)}.hero.is-dark .subtitle a:not(.button),.content kbd.hero .subtitle a:not(.button),.hero.is-dark .subtitle strong,.content kbd.hero .subtitle strong{color:#fff}@media screen and (max-width: 1055px){.hero.is-dark .navbar-menu,.content kbd.hero .navbar-menu{background-color:#363636}}.hero.is-dark .navbar-item,.content kbd.hero .navbar-item,.hero.is-dark .navbar-link,.content kbd.hero .navbar-link{color:rgba(255,255,255,0.7)}.hero.is-dark a.navbar-item:hover,.content kbd.hero a.navbar-item:hover,.hero.is-dark a.navbar-item.is-active,.content kbd.hero a.navbar-item.is-active,.hero.is-dark .navbar-link:hover,.content kbd.hero .navbar-link:hover,.hero.is-dark .navbar-link.is-active,.content kbd.hero .navbar-link.is-active{background-color:#292929;color:#fff}.hero.is-dark .tabs a,.content kbd.hero .tabs a{color:#fff;opacity:0.9}.hero.is-dark .tabs a:hover,.content kbd.hero .tabs a:hover{opacity:1}.hero.is-dark .tabs li.is-active a,.content kbd.hero .tabs li.is-active a{color:#363636 !important;opacity:1}.hero.is-dark .tabs.is-boxed a,.content kbd.hero .tabs.is-boxed a,.hero.is-dark .tabs.is-toggle a,.content kbd.hero .tabs.is-toggle a{color:#fff}.hero.is-dark .tabs.is-boxed a:hover,.content kbd.hero .tabs.is-boxed a:hover,.hero.is-dark .tabs.is-toggle a:hover,.content kbd.hero .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}.hero.is-dark .tabs.is-boxed li.is-active a,.content kbd.hero .tabs.is-boxed li.is-active a,.hero.is-dark .tabs.is-boxed li.is-active a:hover,.hero.is-dark .tabs.is-toggle li.is-active a,.content kbd.hero .tabs.is-toggle li.is-active a,.hero.is-dark .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#363636}.hero.is-dark.is-bold,.content kbd.hero.is-bold{background-image:linear-gradient(141deg, #1f191a 0%, #363636 71%, #46403f 100%)}@media screen and (max-width: 768px){.hero.is-dark.is-bold .navbar-menu,.content kbd.hero.is-bold .navbar-menu{background-image:linear-gradient(141deg, #1f191a 0%, #363636 71%, #46403f 100%)}}.hero.is-primary,.docstring>section>a.hero.docs-sourcelink{background-color:#4eb5de;color:#fff}.hero.is-primary a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.docstring>section>a.hero.docs-sourcelink a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-primary strong,.docstring>section>a.hero.docs-sourcelink strong{color:inherit}.hero.is-primary .title,.docstring>section>a.hero.docs-sourcelink .title{color:#fff}.hero.is-primary .subtitle,.docstring>section>a.hero.docs-sourcelink .subtitle{color:rgba(255,255,255,0.9)}.hero.is-primary .subtitle a:not(.button),.docstring>section>a.hero.docs-sourcelink .subtitle a:not(.button),.hero.is-primary .subtitle strong,.docstring>section>a.hero.docs-sourcelink .subtitle strong{color:#fff}@media screen and (max-width: 1055px){.hero.is-primary .navbar-menu,.docstring>section>a.hero.docs-sourcelink .navbar-menu{background-color:#4eb5de}}.hero.is-primary .navbar-item,.docstring>section>a.hero.docs-sourcelink .navbar-item,.hero.is-primary .navbar-link,.docstring>section>a.hero.docs-sourcelink .navbar-link{color:rgba(255,255,255,0.7)}.hero.is-primary a.navbar-item:hover,.docstring>section>a.hero.docs-sourcelink a.navbar-item:hover,.hero.is-primary a.navbar-item.is-active,.docstring>section>a.hero.docs-sourcelink a.navbar-item.is-active,.hero.is-primary .navbar-link:hover,.docstring>section>a.hero.docs-sourcelink .navbar-link:hover,.hero.is-primary .navbar-link.is-active,.docstring>section>a.hero.docs-sourcelink .navbar-link.is-active{background-color:#39acda;color:#fff}.hero.is-primary .tabs a,.docstring>section>a.hero.docs-sourcelink .tabs a{color:#fff;opacity:0.9}.hero.is-primary .tabs a:hover,.docstring>section>a.hero.docs-sourcelink .tabs a:hover{opacity:1}.hero.is-primary .tabs li.is-active a,.docstring>section>a.hero.docs-sourcelink .tabs li.is-active a{color:#4eb5de !important;opacity:1}.hero.is-primary .tabs.is-boxed a,.docstring>section>a.hero.docs-sourcelink .tabs.is-boxed a,.hero.is-primary .tabs.is-toggle a,.docstring>section>a.hero.docs-sourcelink .tabs.is-toggle a{color:#fff}.hero.is-primary .tabs.is-boxed a:hover,.docstring>section>a.hero.docs-sourcelink .tabs.is-boxed a:hover,.hero.is-primary .tabs.is-toggle a:hover,.docstring>section>a.hero.docs-sourcelink .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}.hero.is-primary .tabs.is-boxed li.is-active a,.docstring>section>a.hero.docs-sourcelink .tabs.is-boxed li.is-active a,.hero.is-primary .tabs.is-boxed li.is-active a:hover,.hero.is-primary .tabs.is-toggle li.is-active a,.docstring>section>a.hero.docs-sourcelink .tabs.is-toggle li.is-active a,.hero.is-primary .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#4eb5de}.hero.is-primary.is-bold,.docstring>section>a.hero.is-bold.docs-sourcelink{background-image:linear-gradient(141deg, #1bc7de 0%, #4eb5de 71%, #5fa9e7 100%)}@media screen and (max-width: 768px){.hero.is-primary.is-bold .navbar-menu,.docstring>section>a.hero.is-bold.docs-sourcelink .navbar-menu{background-image:linear-gradient(141deg, #1bc7de 0%, #4eb5de 71%, #5fa9e7 100%)}}.hero.is-link{background-color:#2e63b8;color:#fff}.hero.is-link a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-link strong{color:inherit}.hero.is-link .title{color:#fff}.hero.is-link .subtitle{color:rgba(255,255,255,0.9)}.hero.is-link .subtitle a:not(.button),.hero.is-link .subtitle strong{color:#fff}@media screen and (max-width: 1055px){.hero.is-link .navbar-menu{background-color:#2e63b8}}.hero.is-link .navbar-item,.hero.is-link .navbar-link{color:rgba(255,255,255,0.7)}.hero.is-link a.navbar-item:hover,.hero.is-link a.navbar-item.is-active,.hero.is-link .navbar-link:hover,.hero.is-link .navbar-link.is-active{background-color:#2958a4;color:#fff}.hero.is-link .tabs a{color:#fff;opacity:0.9}.hero.is-link .tabs a:hover{opacity:1}.hero.is-link .tabs li.is-active a{color:#2e63b8 !important;opacity:1}.hero.is-link .tabs.is-boxed a,.hero.is-link .tabs.is-toggle a{color:#fff}.hero.is-link .tabs.is-boxed a:hover,.hero.is-link .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}.hero.is-link .tabs.is-boxed li.is-active a,.hero.is-link .tabs.is-boxed li.is-active a:hover,.hero.is-link .tabs.is-toggle li.is-active a,.hero.is-link .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#2e63b8}.hero.is-link.is-bold{background-image:linear-gradient(141deg, #1b6098 0%, #2e63b8 71%, #2d51d2 100%)}@media screen and (max-width: 768px){.hero.is-link.is-bold .navbar-menu{background-image:linear-gradient(141deg, #1b6098 0%, #2e63b8 71%, #2d51d2 100%)}}.hero.is-info{background-color:#209cee;color:#fff}.hero.is-info a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-info strong{color:inherit}.hero.is-info .title{color:#fff}.hero.is-info .subtitle{color:rgba(255,255,255,0.9)}.hero.is-info .subtitle a:not(.button),.hero.is-info .subtitle strong{color:#fff}@media screen and (max-width: 1055px){.hero.is-info .navbar-menu{background-color:#209cee}}.hero.is-info .navbar-item,.hero.is-info .navbar-link{color:rgba(255,255,255,0.7)}.hero.is-info a.navbar-item:hover,.hero.is-info a.navbar-item.is-active,.hero.is-info .navbar-link:hover,.hero.is-info .navbar-link.is-active{background-color:#1190e3;color:#fff}.hero.is-info .tabs a{color:#fff;opacity:0.9}.hero.is-info .tabs a:hover{opacity:1}.hero.is-info .tabs li.is-active a{color:#209cee !important;opacity:1}.hero.is-info .tabs.is-boxed a,.hero.is-info .tabs.is-toggle a{color:#fff}.hero.is-info .tabs.is-boxed a:hover,.hero.is-info .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}.hero.is-info .tabs.is-boxed li.is-active a,.hero.is-info .tabs.is-boxed li.is-active a:hover,.hero.is-info .tabs.is-toggle li.is-active a,.hero.is-info .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#209cee}.hero.is-info.is-bold{background-image:linear-gradient(141deg, #05a6d6 0%, #209cee 71%, #3287f5 100%)}@media screen and (max-width: 768px){.hero.is-info.is-bold .navbar-menu{background-image:linear-gradient(141deg, #05a6d6 0%, #209cee 71%, #3287f5 100%)}}.hero.is-success{background-color:#22c35b;color:#fff}.hero.is-success a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-success strong{color:inherit}.hero.is-success .title{color:#fff}.hero.is-success .subtitle{color:rgba(255,255,255,0.9)}.hero.is-success .subtitle a:not(.button),.hero.is-success .subtitle strong{color:#fff}@media screen and (max-width: 1055px){.hero.is-success .navbar-menu{background-color:#22c35b}}.hero.is-success .navbar-item,.hero.is-success .navbar-link{color:rgba(255,255,255,0.7)}.hero.is-success a.navbar-item:hover,.hero.is-success a.navbar-item.is-active,.hero.is-success .navbar-link:hover,.hero.is-success .navbar-link.is-active{background-color:#1ead51;color:#fff}.hero.is-success .tabs a{color:#fff;opacity:0.9}.hero.is-success .tabs a:hover{opacity:1}.hero.is-success .tabs li.is-active a{color:#22c35b !important;opacity:1}.hero.is-success .tabs.is-boxed a,.hero.is-success .tabs.is-toggle a{color:#fff}.hero.is-success .tabs.is-boxed a:hover,.hero.is-success .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}.hero.is-success .tabs.is-boxed li.is-active a,.hero.is-success .tabs.is-boxed li.is-active a:hover,.hero.is-success .tabs.is-toggle li.is-active a,.hero.is-success .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#22c35b}.hero.is-success.is-bold{background-image:linear-gradient(141deg, #12a02c 0%, #22c35b 71%, #1fdf83 100%)}@media screen and (max-width: 768px){.hero.is-success.is-bold .navbar-menu{background-image:linear-gradient(141deg, #12a02c 0%, #22c35b 71%, #1fdf83 100%)}}.hero.is-warning{background-color:#ffdd57;color:rgba(0,0,0,0.7)}.hero.is-warning a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-warning strong{color:inherit}.hero.is-warning .title{color:rgba(0,0,0,0.7)}.hero.is-warning .subtitle{color:rgba(0,0,0,0.9)}.hero.is-warning .subtitle a:not(.button),.hero.is-warning .subtitle strong{color:rgba(0,0,0,0.7)}@media screen and (max-width: 1055px){.hero.is-warning .navbar-menu{background-color:#ffdd57}}.hero.is-warning .navbar-item,.hero.is-warning .navbar-link{color:rgba(0,0,0,0.7)}.hero.is-warning a.navbar-item:hover,.hero.is-warning a.navbar-item.is-active,.hero.is-warning .navbar-link:hover,.hero.is-warning .navbar-link.is-active{background-color:#ffd83e;color:rgba(0,0,0,0.7)}.hero.is-warning .tabs a{color:rgba(0,0,0,0.7);opacity:0.9}.hero.is-warning .tabs a:hover{opacity:1}.hero.is-warning .tabs li.is-active a{color:#ffdd57 !important;opacity:1}.hero.is-warning .tabs.is-boxed a,.hero.is-warning .tabs.is-toggle a{color:rgba(0,0,0,0.7)}.hero.is-warning .tabs.is-boxed a:hover,.hero.is-warning .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}.hero.is-warning .tabs.is-boxed li.is-active a,.hero.is-warning .tabs.is-boxed li.is-active a:hover,.hero.is-warning .tabs.is-toggle li.is-active a,.hero.is-warning .tabs.is-toggle li.is-active a:hover{background-color:rgba(0,0,0,0.7);border-color:rgba(0,0,0,0.7);color:#ffdd57}.hero.is-warning.is-bold{background-image:linear-gradient(141deg, #ffae24 0%, #ffdd57 71%, #fffa71 100%)}@media screen and (max-width: 768px){.hero.is-warning.is-bold .navbar-menu{background-image:linear-gradient(141deg, #ffae24 0%, #ffdd57 71%, #fffa71 100%)}}.hero.is-danger{background-color:#da0b00;color:#fff}.hero.is-danger a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-danger strong{color:inherit}.hero.is-danger .title{color:#fff}.hero.is-danger .subtitle{color:rgba(255,255,255,0.9)}.hero.is-danger .subtitle a:not(.button),.hero.is-danger .subtitle strong{color:#fff}@media screen and (max-width: 1055px){.hero.is-danger .navbar-menu{background-color:#da0b00}}.hero.is-danger .navbar-item,.hero.is-danger .navbar-link{color:rgba(255,255,255,0.7)}.hero.is-danger a.navbar-item:hover,.hero.is-danger a.navbar-item.is-active,.hero.is-danger .navbar-link:hover,.hero.is-danger .navbar-link.is-active{background-color:#c10a00;color:#fff}.hero.is-danger .tabs a{color:#fff;opacity:0.9}.hero.is-danger .tabs a:hover{opacity:1}.hero.is-danger .tabs li.is-active a{color:#da0b00 !important;opacity:1}.hero.is-danger .tabs.is-boxed a,.hero.is-danger .tabs.is-toggle a{color:#fff}.hero.is-danger .tabs.is-boxed a:hover,.hero.is-danger .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}.hero.is-danger .tabs.is-boxed li.is-active a,.hero.is-danger .tabs.is-boxed li.is-active a:hover,.hero.is-danger .tabs.is-toggle li.is-active a,.hero.is-danger .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#da0b00}.hero.is-danger.is-bold{background-image:linear-gradient(141deg, #a70013 0%, #da0b00 71%, #f43500 100%)}@media screen and (max-width: 768px){.hero.is-danger.is-bold .navbar-menu{background-image:linear-gradient(141deg, #a70013 0%, #da0b00 71%, #f43500 100%)}}.hero.is-small .hero-body,#documenter .docs-sidebar form.docs-search>input.hero .hero-body{padding:1.5rem}@media screen and (min-width: 769px),print{.hero.is-medium .hero-body{padding:9rem 4.5rem}}@media screen and (min-width: 769px),print{.hero.is-large .hero-body{padding:18rem 6rem}}.hero.is-halfheight .hero-body,.hero.is-fullheight .hero-body,.hero.is-fullheight-with-navbar .hero-body{align-items:center;display:flex}.hero.is-halfheight .hero-body>.container,.hero.is-fullheight .hero-body>.container,.hero.is-fullheight-with-navbar .hero-body>.container{flex-grow:1;flex-shrink:1}.hero.is-halfheight{min-height:50vh}.hero.is-fullheight{min-height:100vh}.hero-video{overflow:hidden}.hero-video video{left:50%;min-height:100%;min-width:100%;position:absolute;top:50%;transform:translate3d(-50%, -50%, 0)}.hero-video.is-transparent{opacity:0.3}@media screen and (max-width: 768px){.hero-video{display:none}}.hero-buttons{margin-top:1.5rem}@media screen and (max-width: 768px){.hero-buttons .button{display:flex}.hero-buttons .button:not(:last-child){margin-bottom:0.75rem}}@media screen and (min-width: 769px),print{.hero-buttons{display:flex;justify-content:center}.hero-buttons .button:not(:last-child){margin-right:1.5rem}}.hero-head,.hero-foot{flex-grow:0;flex-shrink:0}.hero-body{flex-grow:1;flex-shrink:0;padding:3rem 1.5rem}@media screen and (min-width: 769px),print{.hero-body{padding:3rem 3rem}}.section{padding:3rem 1.5rem}@media screen and (min-width: 1056px){.section{padding:3rem 3rem}.section.is-medium{padding:9rem 4.5rem}.section.is-large{padding:18rem 6rem}}.footer{background-color:#fafafa;padding:3rem 1.5rem 6rem}h1 .docs-heading-anchor,h1 .docs-heading-anchor:hover,h1 .docs-heading-anchor:visited,h2 .docs-heading-anchor,h2 .docs-heading-anchor:hover,h2 .docs-heading-anchor:visited,h3 .docs-heading-anchor,h3 .docs-heading-anchor:hover,h3 .docs-heading-anchor:visited,h4 .docs-heading-anchor,h4 .docs-heading-anchor:hover,h4 .docs-heading-anchor:visited,h5 .docs-heading-anchor,h5 .docs-heading-anchor:hover,h5 .docs-heading-anchor:visited,h6 .docs-heading-anchor,h6 .docs-heading-anchor:hover,h6 .docs-heading-anchor:visited{color:#222}h1 .docs-heading-anchor-permalink,h2 .docs-heading-anchor-permalink,h3 .docs-heading-anchor-permalink,h4 .docs-heading-anchor-permalink,h5 .docs-heading-anchor-permalink,h6 .docs-heading-anchor-permalink{visibility:hidden;vertical-align:middle;margin-left:0.5em;font-size:0.7rem}h1 .docs-heading-anchor-permalink::before,h2 .docs-heading-anchor-permalink::before,h3 .docs-heading-anchor-permalink::before,h4 .docs-heading-anchor-permalink::before,h5 .docs-heading-anchor-permalink::before,h6 .docs-heading-anchor-permalink::before{font-family:"Font Awesome 6 Free";font-weight:900;content:"\f0c1"}h1:hover .docs-heading-anchor-permalink,h2:hover .docs-heading-anchor-permalink,h3:hover .docs-heading-anchor-permalink,h4:hover .docs-heading-anchor-permalink,h5:hover .docs-heading-anchor-permalink,h6:hover .docs-heading-anchor-permalink{visibility:visible}.docs-dark-only{display:none !important}pre{position:relative;overflow:hidden}pre code,pre code.hljs{padding:0 .75rem !important;overflow:auto;display:block}pre code:first-of-type,pre code.hljs:first-of-type{padding-top:0.5rem !important}pre code:last-of-type,pre code.hljs:last-of-type{padding-bottom:0.5rem !important}pre .copy-button{opacity:0.2;transition:opacity 0.2s;position:absolute;right:0em;top:0em;padding:0.5em;width:2.5em;height:2.5em;background:transparent;border:none;font-family:"Font Awesome 6 Free";color:#222;cursor:pointer;text-align:center}pre .copy-button:focus,pre .copy-button:hover{opacity:1;background:rgba(34,34,34,0.1);color:#2e63b8}pre .copy-button.success{color:#259a12;opacity:1}pre .copy-button.error{color:#cb3c33;opacity:1}pre:hover .copy-button{opacity:1}.admonition{background-color:#b5b5b5;border-style:solid;border-width:1px;border-color:#363636;border-radius:4px;font-size:1rem}.admonition strong{color:currentColor}.admonition.is-small,#documenter .docs-sidebar form.docs-search>input.admonition{font-size:.75rem}.admonition.is-medium{font-size:1.25rem}.admonition.is-large{font-size:1.5rem}.admonition.is-default{background-color:#b5b5b5;border-color:#363636}.admonition.is-default>.admonition-header{background-color:#363636;color:#fff}.admonition.is-default>.admonition-body{color:#fff}.admonition.is-info{background-color:#def0fc;border-color:#209cee}.admonition.is-info>.admonition-header{background-color:#209cee;color:#fff}.admonition.is-info>.admonition-body{color:rgba(0,0,0,0.7)}.admonition.is-success{background-color:#bdf4d1;border-color:#22c35b}.admonition.is-success>.admonition-header{background-color:#22c35b;color:#fff}.admonition.is-success>.admonition-body{color:rgba(0,0,0,0.7)}.admonition.is-warning{background-color:#fff3c5;border-color:#ffdd57}.admonition.is-warning>.admonition-header{background-color:#ffdd57;color:rgba(0,0,0,0.7)}.admonition.is-warning>.admonition-body{color:rgba(0,0,0,0.7)}.admonition.is-danger{background-color:#ffaba7;border-color:#da0b00}.admonition.is-danger>.admonition-header{background-color:#da0b00;color:#fff}.admonition.is-danger>.admonition-body{color:rgba(0,0,0,0.7)}.admonition.is-compat{background-color:#bdeff5;border-color:#1db5c9}.admonition.is-compat>.admonition-header{background-color:#1db5c9;color:#fff}.admonition.is-compat>.admonition-body{color:rgba(0,0,0,0.7)}.admonition-header{color:#fff;background-color:#363636;align-items:center;font-weight:700;justify-content:space-between;line-height:1.25;padding:0.5rem .75rem;position:relative}.admonition-header:before{font-family:"Font Awesome 6 Free";font-weight:900;margin-right:.75rem;content:"\f06a"}details.admonition.is-details>.admonition-header{list-style:none}details.admonition.is-details>.admonition-header:before{font-family:"Font Awesome 6 Free";font-weight:900;content:"\f055"}details.admonition.is-details[open]>.admonition-header:before{font-family:"Font Awesome 6 Free";font-weight:900;content:"\f056"}.admonition-body{color:#222;padding:0.5rem .75rem}.admonition-body pre{background-color:#f5f5f5}.admonition-body code{background-color:rgba(0,0,0,0.05)}.docstring{margin-bottom:1em;background-color:rgba(0,0,0,0);border:1px solid #dbdbdb;box-shadow:2px 2px 3px rgba(10,10,10,0.1);max-width:100%}.docstring>header{cursor:pointer;display:flex;flex-grow:1;align-items:stretch;padding:0.5rem .75rem;background-color:#f5f5f5;box-shadow:0 0.125em 0.25em rgba(10,10,10,0.1);box-shadow:none;border-bottom:1px solid #dbdbdb;overflow:auto}.docstring>header code{background-color:transparent}.docstring>header .docstring-article-toggle-button{min-width:1.1rem;padding:0.2rem 0.2rem 0.2rem 0}.docstring>header .docstring-binding{margin-right:0.3em}.docstring>header .docstring-category{margin-left:0.3em}.docstring>section{position:relative;padding:.75rem .75rem;border-bottom:1px solid #dbdbdb}.docstring>section:last-child{border-bottom:none}.docstring>section>a.docs-sourcelink{transition:opacity 0.3s;opacity:0;position:absolute;right:.375rem;bottom:.375rem}.docstring>section>a.docs-sourcelink:focus{opacity:1 !important}.docstring:hover>section>a.docs-sourcelink{opacity:0.2}.docstring:focus-within>section>a.docs-sourcelink{opacity:0.2}.docstring>section:hover a.docs-sourcelink{opacity:1}.documenter-example-output{background-color:#fff}.outdated-warning-overlay{position:fixed;top:0;left:0;right:0;box-shadow:0 0 10px rgba(0,0,0,0.3);z-index:999;background-color:#ffaba7;color:rgba(0,0,0,0.7);border-bottom:3px solid #da0b00;padding:10px 35px;text-align:center;font-size:15px}.outdated-warning-overlay .outdated-warning-closer{position:absolute;top:calc(50% - 10px);right:18px;cursor:pointer;width:12px}.outdated-warning-overlay a{color:#2e63b8}.outdated-warning-overlay a:hover{color:#363636}.content pre{border:1px solid #dbdbdb}.content code{font-weight:inherit}.content a code{color:#2e63b8}.content h1 code,.content h2 code,.content h3 code,.content h4 code,.content h5 code,.content h6 code{color:#222}.content table{display:block;width:initial;max-width:100%;overflow-x:auto}.content blockquote>ul:first-child,.content blockquote>ol:first-child,.content .admonition-body>ul:first-child,.content .admonition-body>ol:first-child{margin-top:0}pre,code{font-variant-ligatures:no-contextual}.breadcrumb a.is-disabled{cursor:default;pointer-events:none}.breadcrumb a.is-disabled,.breadcrumb a.is-disabled:hover{color:#222}.hljs{background:initial !important}.katex .katex-mathml{top:0;right:0}.katex-display,mjx-container,.MathJax_Display{margin:0.5em 0 !important}html{-moz-osx-font-smoothing:auto;-webkit-font-smoothing:auto}li.no-marker{list-style:none}#documenter .docs-main>article{overflow-wrap:break-word}#documenter .docs-main>article .math-container{overflow-x:auto;overflow-y:hidden}@media screen and (min-width: 1056px){#documenter .docs-main{max-width:52rem;margin-left:20rem;padding-right:1rem}}@media screen and (max-width: 1055px){#documenter .docs-main{width:100%}#documenter .docs-main>article{max-width:52rem;margin-left:auto;margin-right:auto;margin-bottom:1rem;padding:0 1rem}#documenter .docs-main>header,#documenter .docs-main>nav{max-width:100%;width:100%;margin:0}}#documenter .docs-main header.docs-navbar{background-color:#fff;border-bottom:1px solid #dbdbdb;z-index:2;min-height:4rem;margin-bottom:1rem;display:flex}#documenter .docs-main header.docs-navbar .breadcrumb{flex-grow:1;overflow-x:hidden}#documenter .docs-main header.docs-navbar .docs-sidebar-button{display:block;font-size:1.5rem;padding-bottom:0.1rem;margin-right:1rem}#documenter .docs-main header.docs-navbar .docs-right{display:flex;white-space:nowrap;gap:1rem;align-items:center}#documenter .docs-main header.docs-navbar .docs-right .docs-icon,#documenter .docs-main header.docs-navbar .docs-right .docs-label{display:inline-block}#documenter .docs-main header.docs-navbar .docs-right .docs-label{padding:0;margin-left:0.3em}@media screen and (max-width: 1055px){#documenter .docs-main header.docs-navbar .docs-right .docs-navbar-link{margin-left:0.4rem;margin-right:0.4rem}}#documenter .docs-main header.docs-navbar>*{margin:auto 0}@media screen and (max-width: 1055px){#documenter .docs-main header.docs-navbar{position:sticky;top:0;padding:0 1rem;transition-property:top, box-shadow;-webkit-transition-property:top, box-shadow;transition-duration:0.3s;-webkit-transition-duration:0.3s}#documenter .docs-main header.docs-navbar.headroom--not-top{box-shadow:.2rem 0rem .4rem #bbb;transition-duration:0.7s;-webkit-transition-duration:0.7s}#documenter .docs-main header.docs-navbar.headroom--unpinned.headroom--not-top.headroom--not-bottom{top:-4.5rem;transition-duration:0.7s;-webkit-transition-duration:0.7s}}#documenter .docs-main section.footnotes{border-top:1px solid #dbdbdb}#documenter .docs-main section.footnotes li .tag:first-child,#documenter .docs-main section.footnotes li .docstring>section>a.docs-sourcelink:first-child,#documenter .docs-main section.footnotes li .content kbd:first-child,.content #documenter .docs-main section.footnotes li kbd:first-child{margin-right:1em;margin-bottom:0.4em}#documenter .docs-main .docs-footer{display:flex;flex-wrap:wrap;margin-left:0;margin-right:0;border-top:1px solid #dbdbdb;padding-top:1rem;padding-bottom:1rem}@media screen and (max-width: 1055px){#documenter .docs-main .docs-footer{padding-left:1rem;padding-right:1rem}}#documenter .docs-main .docs-footer .docs-footer-nextpage,#documenter .docs-main .docs-footer .docs-footer-prevpage{flex-grow:1}#documenter .docs-main .docs-footer .docs-footer-nextpage{text-align:right}#documenter .docs-main .docs-footer .flexbox-break{flex-basis:100%;height:0}#documenter .docs-main .docs-footer .footer-message{font-size:0.8em;margin:0.5em auto 0 auto;text-align:center}#documenter .docs-sidebar{display:flex;flex-direction:column;color:#0a0a0a;background-color:#f5f5f5;border-right:1px solid #dbdbdb;padding:0;flex:0 0 18rem;z-index:5;font-size:1rem;position:fixed;left:-18rem;width:18rem;height:100%;transition:left 0.3s}#documenter .docs-sidebar.visible{left:0;box-shadow:.4rem 0rem .8rem #bbb}@media screen and (min-width: 1056px){#documenter .docs-sidebar.visible{box-shadow:none}}@media screen and (min-width: 1056px){#documenter .docs-sidebar{left:0;top:0}}#documenter .docs-sidebar .docs-logo{margin-top:1rem;padding:0 1rem}#documenter .docs-sidebar .docs-logo>img{max-height:6rem;margin:auto}#documenter .docs-sidebar .docs-package-name{flex-shrink:0;font-size:1.5rem;font-weight:700;text-align:center;white-space:nowrap;overflow:hidden;padding:0.5rem 0}#documenter .docs-sidebar .docs-package-name .docs-autofit{max-width:16.2rem}#documenter .docs-sidebar .docs-package-name a,#documenter .docs-sidebar .docs-package-name a:hover{color:#0a0a0a}#documenter .docs-sidebar .docs-version-selector{border-top:1px solid #dbdbdb;display:none;padding:0.5rem}#documenter .docs-sidebar .docs-version-selector.visible{display:flex}#documenter .docs-sidebar ul.docs-menu{flex-grow:1;user-select:none;border-top:1px solid #dbdbdb;padding-bottom:1.5rem}#documenter .docs-sidebar ul.docs-menu>li>.tocitem{font-weight:bold}#documenter .docs-sidebar ul.docs-menu>li li{font-size:.95rem;margin-left:1em;border-left:1px solid #dbdbdb}#documenter .docs-sidebar ul.docs-menu input.collapse-toggle{display:none}#documenter .docs-sidebar ul.docs-menu ul.collapsed{display:none}#documenter .docs-sidebar ul.docs-menu input:checked~ul.collapsed{display:block}#documenter .docs-sidebar ul.docs-menu label.tocitem{display:flex}#documenter .docs-sidebar ul.docs-menu label.tocitem .docs-label{flex-grow:2}#documenter .docs-sidebar ul.docs-menu label.tocitem .docs-chevron{display:inline-block;font-style:normal;font-variant:normal;text-rendering:auto;line-height:1;font-size:.75rem;margin-left:1rem;margin-top:auto;margin-bottom:auto}#documenter .docs-sidebar ul.docs-menu label.tocitem .docs-chevron::before{font-family:"Font Awesome 6 Free";font-weight:900;content:"\f054"}#documenter .docs-sidebar ul.docs-menu input:checked~label.tocitem .docs-chevron::before{content:"\f078"}#documenter .docs-sidebar ul.docs-menu .tocitem{display:block;padding:0.5rem 0.5rem}#documenter .docs-sidebar ul.docs-menu .tocitem,#documenter .docs-sidebar ul.docs-menu .tocitem:hover{color:#0a0a0a;background:#f5f5f5}#documenter .docs-sidebar ul.docs-menu a.tocitem:hover,#documenter .docs-sidebar ul.docs-menu label.tocitem:hover{color:#0a0a0a;background-color:#ebebeb}#documenter .docs-sidebar ul.docs-menu li.is-active{border-top:1px solid #dbdbdb;border-bottom:1px solid #dbdbdb;background-color:#fff}#documenter .docs-sidebar ul.docs-menu li.is-active .tocitem,#documenter .docs-sidebar ul.docs-menu li.is-active .tocitem:hover{background-color:#fff;color:#0a0a0a}#documenter .docs-sidebar ul.docs-menu li.is-active ul.internal .tocitem:hover{background-color:#ebebeb;color:#0a0a0a}#documenter .docs-sidebar ul.docs-menu>li.is-active:first-child{border-top:none}#documenter .docs-sidebar ul.docs-menu ul.internal{margin:0 0.5rem 0.5rem;border-top:1px solid #dbdbdb}#documenter .docs-sidebar ul.docs-menu ul.internal li{font-size:.85rem;border-left:none;margin-left:0;margin-top:0.5rem}#documenter .docs-sidebar ul.docs-menu ul.internal .tocitem{width:100%;padding:0}#documenter .docs-sidebar ul.docs-menu ul.internal .tocitem::before{content:"⚬";margin-right:0.4em}#documenter .docs-sidebar form.docs-search{margin:auto;margin-top:0.5rem;margin-bottom:0.5rem}#documenter .docs-sidebar form.docs-search>input{width:14.4rem}#documenter .docs-sidebar #documenter-search-query{color:#707070;width:14.4rem;box-shadow:inset 0 1px 2px rgba(10,10,10,0.1)}@media screen and (min-width: 1056px){#documenter .docs-sidebar ul.docs-menu{overflow-y:auto;-webkit-overflow-scroll:touch}#documenter .docs-sidebar ul.docs-menu::-webkit-scrollbar{width:.3rem;background:none}#documenter .docs-sidebar ul.docs-menu::-webkit-scrollbar-thumb{border-radius:5px 0px 0px 5px;background:#e0e0e0}#documenter .docs-sidebar ul.docs-menu::-webkit-scrollbar-thumb:hover{background:#ccc}}@media screen and (max-width: 1055px){#documenter .docs-sidebar{overflow-y:auto;-webkit-overflow-scroll:touch}#documenter .docs-sidebar::-webkit-scrollbar{width:.3rem;background:none}#documenter .docs-sidebar::-webkit-scrollbar-thumb{border-radius:5px 0px 0px 5px;background:#e0e0e0}#documenter .docs-sidebar::-webkit-scrollbar-thumb:hover{background:#ccc}}kbd.search-modal-key-hints{border-radius:0.25rem;border:1px solid rgba(0,0,0,0.6);box-shadow:0 2px 0 1px rgba(0,0,0,0.6);cursor:default;font-size:0.9rem;line-height:1.5;min-width:0.75rem;text-align:center;padding:0.1rem 0.3rem;position:relative;top:-1px}.search-min-width-50{min-width:50%}.search-min-height-100{min-height:100%}.search-modal-card-body{max-height:calc(100vh - 15rem)}.search-result-link{border-radius:0.7em;transition:all 300ms}.search-result-link:hover,.search-result-link:focus{background-color:rgba(0,128,128,0.1)}.search-result-link .property-search-result-badge,.search-result-link .search-filter{transition:all 300ms}.property-search-result-badge,.search-filter{padding:0.15em 0.5em;font-size:0.8em;font-style:italic;text-transform:none !important;line-height:1.5;color:#f5f5f5;background-color:rgba(51,65,85,0.501961);border-radius:0.6rem}.search-result-link:hover .property-search-result-badge,.search-result-link:hover .search-filter,.search-result-link:focus .property-search-result-badge,.search-result-link:focus .search-filter{color:#f1f5f9;background-color:#333}.search-filter{color:#333;background-color:#f5f5f5;transition:all 300ms}.search-filter:hover,.search-filter:focus{color:#333}.search-filter-selected{color:#f5f5f5;background-color:rgba(139,0,139,0.5)}.search-filter-selected:hover,.search-filter-selected:focus{color:#f5f5f5}.search-result-highlight{background-color:#ffdd57;color:black}.search-divider{border-bottom:1px solid #dbdbdb}.search-result-title{width:85%;color:#333}.search-result-code-title{font-size:0.875rem;font-family:"JuliaMono","SFMono-Regular","Menlo","Consolas","Liberation Mono","DejaVu Sans Mono",monospace}#search-modal .modal-card-body::-webkit-scrollbar,#search-modal .filter-tabs::-webkit-scrollbar{height:10px;width:10px;background-color:transparent}#search-modal .modal-card-body::-webkit-scrollbar-thumb,#search-modal .filter-tabs::-webkit-scrollbar-thumb{background-color:gray;border-radius:1rem}#search-modal .modal-card-body::-webkit-scrollbar-track,#search-modal .filter-tabs::-webkit-scrollbar-track{-webkit-box-shadow:inset 0 0 6px rgba(0,0,0,0.6);background-color:transparent}.w-100{width:100%}.gap-2{gap:0.5rem}.gap-4{gap:1rem}.gap-8{gap:2rem}.ansi span.sgr1{font-weight:bolder}.ansi span.sgr2{font-weight:lighter}.ansi span.sgr3{font-style:italic}.ansi span.sgr4{text-decoration:underline}.ansi span.sgr7{color:#fff;background-color:#222}.ansi span.sgr8{color:transparent}.ansi span.sgr8 span{color:transparent}.ansi span.sgr9{text-decoration:line-through}.ansi span.sgr30{color:#242424}.ansi span.sgr31{color:#a7201f}.ansi span.sgr32{color:#066f00}.ansi span.sgr33{color:#856b00}.ansi span.sgr34{color:#2149b0}.ansi span.sgr35{color:#7d4498}.ansi span.sgr36{color:#007989}.ansi span.sgr37{color:gray}.ansi span.sgr40{background-color:#242424}.ansi span.sgr41{background-color:#a7201f}.ansi span.sgr42{background-color:#066f00}.ansi span.sgr43{background-color:#856b00}.ansi span.sgr44{background-color:#2149b0}.ansi span.sgr45{background-color:#7d4498}.ansi span.sgr46{background-color:#007989}.ansi span.sgr47{background-color:gray}.ansi span.sgr90{color:#616161}.ansi span.sgr91{color:#cb3c33}.ansi span.sgr92{color:#0e8300}.ansi span.sgr93{color:#a98800}.ansi span.sgr94{color:#3c5dcd}.ansi span.sgr95{color:#9256af}.ansi span.sgr96{color:#008fa3}.ansi span.sgr97{color:#f5f5f5}.ansi span.sgr100{background-color:#616161}.ansi span.sgr101{background-color:#cb3c33}.ansi span.sgr102{background-color:#0e8300}.ansi span.sgr103{background-color:#a98800}.ansi span.sgr104{background-color:#3c5dcd}.ansi span.sgr105{background-color:#9256af}.ansi span.sgr106{background-color:#008fa3}.ansi span.sgr107{background-color:#f5f5f5}code.language-julia-repl>span.hljs-meta{color:#066f00;font-weight:bolder}/*! + Theme: Default + Description: Original highlight.js style + Author: (c) Ivan Sagalaev + Maintainer: @highlightjs/core-team + Website: https://highlightjs.org/ + License: see project LICENSE + Touched: 2021 +*/pre code.hljs{display:block;overflow-x:auto;padding:1em}code.hljs{padding:3px 5px}.hljs{background:#F3F3F3;color:#444}.hljs-comment{color:#697070}.hljs-tag,.hljs-punctuation{color:#444a}.hljs-tag .hljs-name,.hljs-tag .hljs-attr{color:#444}.hljs-keyword,.hljs-attribute,.hljs-selector-tag,.hljs-meta .hljs-keyword,.hljs-doctag,.hljs-name{font-weight:bold}.hljs-type,.hljs-string,.hljs-number,.hljs-selector-id,.hljs-selector-class,.hljs-quote,.hljs-template-tag,.hljs-deletion{color:#880000}.hljs-title,.hljs-section{color:#880000;font-weight:bold}.hljs-regexp,.hljs-symbol,.hljs-variable,.hljs-template-variable,.hljs-link,.hljs-selector-attr,.hljs-operator,.hljs-selector-pseudo{color:#ab5656}.hljs-literal{color:#695}.hljs-built_in,.hljs-bullet,.hljs-code,.hljs-addition{color:#397300}.hljs-meta{color:#1f7199}.hljs-meta .hljs-string{color:#38a}.hljs-emphasis{font-style:italic}.hljs-strong{font-weight:bold}.gap-4{gap:1rem} diff --git a/v1.7.3/assets/themeswap.js b/v1.7.3/assets/themeswap.js new file mode 100644 index 000000000..9f5eebe6a --- /dev/null +++ b/v1.7.3/assets/themeswap.js @@ -0,0 +1,84 @@ +// Small function to quickly swap out themes. Gets put into the tag.. +function set_theme_from_local_storage() { + // Initialize the theme to null, which means default + var theme = null; + // If the browser supports the localstorage and is not disabled then try to get the + // documenter theme + if (window.localStorage != null) { + // Get the user-picked theme from localStorage. May be `null`, which means the default + // theme. + theme = window.localStorage.getItem("documenter-theme"); + } + // Check if the users preference is for dark color scheme + var darkPreference = + window.matchMedia("(prefers-color-scheme: dark)").matches === true; + // Initialize a few variables for the loop: + // + // - active: will contain the index of the theme that should be active. Note that there + // is no guarantee that localStorage contains sane values. If `active` stays `null` + // we either could not find the theme or it is the default (primary) theme anyway. + // Either way, we then need to stick to the primary theme. + // + // - disabled: style sheets that should be disabled (i.e. all the theme style sheets + // that are not the currently active theme) + var active = null; + var disabled = []; + var primaryLightTheme = null; + var primaryDarkTheme = null; + for (var i = 0; i < document.styleSheets.length; i++) { + var ss = document.styleSheets[i]; + // The tag of each style sheet is expected to have a data-theme-name attribute + // which must contain the name of the theme. The names in localStorage much match this. + var themename = ss.ownerNode.getAttribute("data-theme-name"); + // attribute not set => non-theme stylesheet => ignore + if (themename === null) continue; + // To distinguish the default (primary) theme, it needs to have the data-theme-primary + // attribute set. + if (ss.ownerNode.getAttribute("data-theme-primary") !== null) { + primaryLightTheme = themename; + } + // Check if the theme is primary dark theme so that we could store its name in darkTheme + if (ss.ownerNode.getAttribute("data-theme-primary-dark") !== null) { + primaryDarkTheme = themename; + } + // If we find a matching theme (and it's not the default), we'll set active to non-null + if (themename === theme) active = i; + // Store the style sheets of inactive themes so that we could disable them + if (themename !== theme) disabled.push(ss); + } + var activeTheme = null; + if (active !== null) { + // If we did find an active theme, we'll (1) add the theme--$(theme) class to + document.getElementsByTagName("html")[0].className = "theme--" + theme; + activeTheme = theme; + } else { + // If we did _not_ find an active theme, then we need to fall back to the primary theme + // which can either be dark or light, depending on the user's OS preference. + var activeTheme = darkPreference ? primaryDarkTheme : primaryLightTheme; + // In case it somehow happens that the relevant primary theme was not found in the + // preceding loop, we abort without doing anything. + if (activeTheme === null) { + console.error("Unable to determine primary theme."); + return; + } + // When switching to the primary light theme, then we must not have a class name + // for the tag. That's only for non-primary or the primary dark theme. + if (darkPreference) { + document.getElementsByTagName("html")[0].className = + "theme--" + activeTheme; + } else { + document.getElementsByTagName("html")[0].className = ""; + } + } + for (var i = 0; i < document.styleSheets.length; i++) { + var ss = document.styleSheets[i]; + // The tag of each style sheet is expected to have a data-theme-name attribute + // which must contain the name of the theme. The names in localStorage much match this. + var themename = ss.ownerNode.getAttribute("data-theme-name"); + // attribute not set => non-theme stylesheet => ignore + if (themename === null) continue; + // we'll disable all the stylesheets, except for the active one + ss.disabled = !(themename == activeTheme); + } +} +set_theme_from_local_storage(); diff --git a/v1.7.3/assets/warner.js b/v1.7.3/assets/warner.js new file mode 100644 index 000000000..3f6f5d008 --- /dev/null +++ b/v1.7.3/assets/warner.js @@ -0,0 +1,52 @@ +function maybeAddWarning() { + // DOCUMENTER_NEWEST is defined in versions.js, DOCUMENTER_CURRENT_VERSION and DOCUMENTER_STABLE + // in siteinfo.js. + // If either of these are undefined something went horribly wrong, so we abort. + if ( + window.DOCUMENTER_NEWEST === undefined || + window.DOCUMENTER_CURRENT_VERSION === undefined || + window.DOCUMENTER_STABLE === undefined + ) { + return; + } + + // Current version is not a version number, so we can't tell if it's the newest version. Abort. + if (!/v(\d+\.)*\d+/.test(window.DOCUMENTER_CURRENT_VERSION)) { + return; + } + + // Current version is newest version, so no need to add a warning. + if (window.DOCUMENTER_NEWEST === window.DOCUMENTER_CURRENT_VERSION) { + return; + } + + // Add a noindex meta tag (unless one exists) so that search engines don't index this version of the docs. + if (document.body.querySelector('meta[name="robots"]') === null) { + const meta = document.createElement("meta"); + meta.name = "robots"; + meta.content = "noindex"; + + document.getElementsByTagName("head")[0].appendChild(meta); + } + + const div = document.createElement("div"); + div.classList.add("outdated-warning-overlay"); + const closer = document.createElement("button"); + closer.classList.add("outdated-warning-closer", "delete"); + closer.addEventListener("click", function () { + document.body.removeChild(div); + }); + const href = window.documenterBaseURL + "/../" + window.DOCUMENTER_STABLE; + div.innerHTML = + 'This documentation is not for the latest stable release, but for either the development version or an older release.
      Click here to go to the documentation for the latest stable release.'; + div.appendChild(closer); + document.body.appendChild(div); +} + +if (document.readyState === "loading") { + document.addEventListener("DOMContentLoaded", maybeAddWarning); +} else { + maybeAddWarning(); +} diff --git a/v1.7.3/contributing/index.html b/v1.7.3/contributing/index.html new file mode 100644 index 000000000..5013c2ff5 --- /dev/null +++ b/v1.7.3/contributing/index.html @@ -0,0 +1,2 @@ + +Contributing · Rocket.jl

      Contribution guidelines

      We welcome all possible contributors. This page details the some of the guidelines that should be followed when contributing to this package.

      Reporting bugs

      We track bugs using GitHub issues. We encourage you to write complete, specific, reproducible bug reports. Mention the versions of Julia and Rocket.jl for which you observe unexpected behavior. Please provide a concise description of the problem and complement it with code snippets, test cases, screenshots, tracebacks or any other information that you consider relevant. This will help us to replicate the problem and narrow the search space for solutions.

      Suggesting features

      We welcome new feature proposals. However, before submitting a feature request, consider a few things:

      • Does the feature require changes in the core Rocket.jl code? If it doesn't (for example, you would like to add a operator for a particular application), consider making a separate repository for your extensions.
      • If you would like to add an implementation of a feature that changes a lot in the core Rocket.jl code, please open an issue on GitHub and describe your proposal first. This will allow us to discuss your proposal with you before you invest your time in implementing something that may be difficult to merge later on.

      Contributing code

      Installing Rocket

      We suggest that you use the dev command from the new Julia package manager to install Rocket.jl for development purposes. To work on your fork of Rocket.jl, use your fork's URL address in the dev command, for example:

      ] dev git@github.com:your_username/Rocket.jl.git

      The dev command clones Rocket.jl to ~/.julia/dev/Rocket. All local changes to Rocket code will be reflected in imported code.

      Note

      It is also might be useful to install Revise.jl package as it allows you to modify code and use the changes without restarting Julia.

      Committing code

      We use the standard GitHub Flow workflow where all contributions are added through pull requests. In order to contribute, first fork the repository, then commit your contributions to your fork, and then create a pull request on the master branch of the Rocket.jl repository.

      Before opening a pull request, please make sure that all tests pass without failing! All demos (can be found in /demo/ directory) have to run without errors as well.

      Style conventions

      We use default Julia style guide. We list here a few important points and our modifications to the Julia style guide:

      • Use 4 spaces for indentation
      • Type names use UpperCamelCase. For example: ArrayObservable, MapOperator, etc..
      • Function names are lowercase with underscores, when necessary. For example: next!, subscribe!, as_actor, etc..
      • Variable names and function arguments use snake_case
      • The name of a method that modifies its argument(s) must end in !

      Unit tests

      We use the test-driven development (TDD) methodology for Rocket.jl development. The test coverage should be as complete as possible. Please make sure that you write tests for each piece of code that you want to add.

      All unit tests are located in the /test/ directory. The /test/ directory follows the structure of the /src/ directory. Each test file should have following filename format: test_*.jl. Some tests are also present in jldoctest docs annotations directly in the source code. See Julia's documentation about doctests.

      The tests can be evaluated by running following command in the Julia REPL:

      ] test Rocket
      diff --git a/v1.7.3/getting-started/index.html b/v1.7.3/getting-started/index.html new file mode 100644 index 000000000..01733fb75 --- /dev/null +++ b/v1.7.3/getting-started/index.html @@ -0,0 +1,22 @@ + +Getting started · Rocket.jl

      Getting started

      Rocket.jl is a Julia package for reactive programming that makes it easier to work with asynchronous data. It is inspired by the RxJS and ReactiveX communities.

      In order to combine good performance with a convenient API, Rocket.jl employs Observer patterns, Actor models and Functional programming.

      Installation

      Install Rocket.jl through the Julia package manager:

      ] add Rocket

      Concepts

      Rocket.jl has been designed with a focus on performance and modularity.

      The essential concepts in Rocket.jl are:

      • Observable: represents a collection of future messages (data or/and events).
      • Actor: is an object that knows how to react on incoming messages delivered by the Observable.
      • Subscription: represents a teardown logic that is useful for cancelling the execution of an Observable.
      • Operator: an object that deals with collection operations, such as map, filter, reduce, etc.
      • Subject: the way of multicasting a message to multiple Observers.

      First example

      Conventionally, arrays are used for processing data.

      for value in array_of_values
      +    doSomethingWithMyData(value)
      +end

      In contrast, Rocket.jl uses observables.

      subscription = subscribe!(source_of_values, lambda(
      +    on_next     = (data)  -> doSomethingWithMyData(data),
      +    on_error    = (error) -> doSomethingWithAnError(error),
      +    on_complete = ()      -> println("Completed!")
      +))

      At some point in time you may decide to stop listening for new messages.

      unsubscribe!(subscription)

      Actors

      In order to process messages from an observable you will need to define an Actor that knows how to react to incoming messages.

      struct MyActor <: Rocket.Actor{Int} end
      +
      +Rocket.on_next!(actor::MyActor, data::Int) = doSomethingWithMyData(data)
      +Rocket.on_error!(actor::MyActor, error)    = doSomethingWithAnError(error)
      +Rocket.on_complete!(actor::MyActor)        = println("Completed!")

      An actor can also have its own local state.

      struct StoreActor{D} <: Rocket.Actor{D}
      +    values :: Vector{D}
      +
      +    StoreActor{D}() where D = new(Vector{D}())
      +end
      +
      +Rocket.on_next!(actor::StoreActor{D}, data::D) where D = push!(actor.values, data)
      +Rocket.on_error!(actor::StoreActor, error)             = doSomethingWithAnError(error)
      +Rocket.on_complete!(actor::StoreActor)                 = println("Completed: $(actor.values)")

      For debugging purposes you can use a general LambdaActor actor or just pass a function object as an actor in subscribe! function..

      Operators

      What makes Rocket.jl powerful is its ability to help you process, transform and modify the messages that flow through your observables, using Operators.

      subscribe!(squared_int_values |> map(Int, (d) -> d ^ 2), lambda(
      +    on_next = (data) -> println(data)
      +))
      diff --git a/v1.7.3/index.html b/v1.7.3/index.html new file mode 100644 index 000000000..c5788163d --- /dev/null +++ b/v1.7.3/index.html @@ -0,0 +1,2 @@ + +Home · Rocket.jl

      Rocket.jl Documentation

      Welcome to the documentation for Rocket.jl.

      This documentation is an adaptation of the RxJS library documentation.

      Table of Contents

      Index

      diff --git a/v1.7.3/observables/about/index.html b/v1.7.3/observables/about/index.html new file mode 100644 index 000000000..2b40af90c --- /dev/null +++ b/v1.7.3/observables/about/index.html @@ -0,0 +1,94 @@ + +Observable · Rocket.jl

      Observables

      Observables are lazy Push collections of multiple values. They fill the missing spot in the following table:

      TypeSingleMultiple
      PullFunctionIterator
      PushPromiseObservable

      First example

      For example, the following code specifies an Observable that pushes the values 1, 2, 3 immediately (synchronously) when subscribed to, and the value 4 after one second has passed since subscription.

      using Rocket
      +
      +source = make(Int) do actor
      +    next!(actor, 1)
      +    next!(actor, 2)
      +    next!(actor, 3)
      +    setTimeout(1000) do
      +        next!(actor, 4)
      +        complete!(actor)
      +    end
      +end

      To invoke the Observable and inspect these values, we need to subscribe to it. It is important to note that observables are lazy collections which means they don't emit anything until someone subscribes to it. Every subscription spawns its own independent execution of observable. There are some exceptions to this rule, e.g. Subjects and some operators (share(), etc..) which may change this behaviour

      using Rocket
      +
      +source = make(Int) do actor
      +    next!(actor, 1)
      +    next!(actor, 2)
      +    next!(actor, 3)
      +    setTimeout(1000) do
      +        next!(actor, 4)
      +        complete!(actor)
      +    end
      +end
      +
      +println("Just before subscribe")
      +subscribe!(source, lambda(
      +    on_next     = (d) -> println(d),
      +    on_complete = ()  -> println("Completed")
      +))
      +println("Just after subscribe")
      +
      +# Logs
      +# Just before subscribe
      +# 1
      +# 2
      +# 3
      +# Just after subscribe
      +# 4
      +# Completed

      Pull vs Push

      Pull and Push are two different protocols that describe how a data Producer communicates with a data Consumer.

      In a Pull system, the Consumer determines when it receives data from the Producer. The Producer itself is unaware of when the data are delivered to the Consumer.

      Every Julia Function is a Pull system. The function is a Producer of data, and the code that calls the function is consuming data by "pulling" a return value from the call.

      TypePRODUCERCONSUMER
      PullPassive: produces data when requested.Active: decides when data is requested.
      PushActive: produces data at its own pace.Passive: reacts to received data.

      In Push systems, the Producer determines when to send data to the Consumer. The Consumer is unaware of when it will receive that data.

      Futures and promises are the most common type of Push systems today. A Promise (the Producer) delivers a resolved value to registered callbacks (the Consumers). Unlike functions, it is the Promise that determines precisely when a value is "pushed" to the callbacks.

      Rocket.jl introduces Observables, a new Push system for Julia. An Observable is a Producer of multiple values, "pushing" them to Observers (Consumers or Actors).

      • A Function is a lazily evaluated computation that synchronously returns a single value on invocation.
      • A Generator is a lazily evaluated computation that synchronously returns zero to (potentially) infinite values on iteration.
      • A Promise is a computation that may (or may not) eventually return a single value.
      • An Observable is a lazily evaluated computation that can synchronously or asynchronously return zero to (potentially) infinite values from the time it's invoked.

      Observables as generalizations of functions

      In contrast to functions, Observables can "return" multiple values over time. For example, functions can't do this:

      function foo()
      +    println("Hello!")
      +    return 0
      +    return 1 # Dead code, will never happen
      +end

      Observables, however, can do this:

      using Rocket
      +
      +foo = make(Int) do actor
      +    next!(actor, 0)
      +    next!(actor, 1)
      +    complete!(actor)
      +end
      +

      Observables can also "return" values asynchronously after some time:

      using Rocket
      +
      +foo = make(Int) do actor
      +    setTimeout(1000) do
      +        next!(actor, 0)
      +        complete!(actor)
      +    end
      +end

      Assume we have a function foo and some observable:

      • Function call foo(args...) means "give me one value synchronously" (pull strategy)
      • In contrast subscription to an observable with subscribe(observable, ...) means "notify me about any amount of values, either synchronously or asynchronously" (push strategy)

      When a new value is available in an observable we say that the observable emits or generates an update. Values that are generated by an observable are sometimes also called future values, because there is no principled way to predict when an observable will generate a new value. In some programming languages, observables are referred to as generators or streams and we will use all three terms interchangeably.

      Anatomy of an Observable

      Observables are (1) created using creation operators (it is also possible to build an Observable from scratch with custom logic); (2) subscribed to with an Actor; (3) execute to deliver next! / error! / complete! notifications to the Actor, and (4) their execution may be disposed. These four aspects are all encoded in an Observable instance, but some of these aspects are related to other types, such as Subscribable and Subscription.

      The core responsibilities of an Observable are:

      • Creating Observables
      • Subscribing to Observables
      • Executing the Observable
      • Disposing Observables

      Creating Observables

      You can create an Observable in various ways using Creation operators. You can also build an Observable from scratch. To see how you can build an Observable with custom logic, consult the API Section.

      Subscribing to Observables

      The Observable source in the example can be subscribed to.

      using Rocket
      +
      +subscribe!(source, lambda(
      +    on_next = (d) -> println(d)
      +))

      This example shows how subscribe calls are not shared among multiple Actors of the same Observable. When calling subscribe! with an Actor, the function on_subscribe! that is attached to this particular Observable is executed for that given actor. Each call to subscribe! triggers its own independent setup for that given actor.

      Note

      Subscribing to an Observable is like calling a function, providing callbacks where the data will be delivered to.

      The subscribe! function also supports multiple subscriptions at once. If the input argument to the subscribe! function is a tuple or a vector, it will first check that all of the arguments are valid source objects and actors and if its true will subscribe from each of them individually.

      
      +source1 = Subject(Int)
      +source2 = Subject(Int)
      +
      +subscriptions = subscribe!([
      +    (source1, logger()),
      +    (source2, logger()),
      +])
      +
      +# Later on
      +# unsubscribe!(subscriptions)
      +

      Executing Observables

      The execution produces multiple values over time, either synchronously or asynchronously.

      An Observable Execution can deliver three types of notifications:

      • Next: sends a value, such as an Int, String, Dict, etc.;
      • Error: sends any error as a value;
      • Complete: does not send a value.

      "Next" notifications are the most important and most common type: they represent actual data being delivered to an subscriber. "Error" and "Complete" notifications terminate the Observable Execution.

      Note

      In an Observable Execution, any number of Next notifications may be delivered. However, once a single Error or Complete notification is delivered, nothing else can be delivered afterwards.

      The following is an example of an Observable execution that delivers three Next notifications and subsequently completes:

      using Rocket
      +
      +source = make(Int) do actor
      +    next!(actor, 1)
      +    next!(actor, 2)
      +    next!(actor, 3)
      +    complete!(actor)
      +end
      +
      +# or the same with creation operator
      +
      +source = from([ 1, 2, 3 ])

      It is advised to wrap any code in subscribe by a try/catch block that delivers an Error notification upon an exception:

      using Rocket
      +
      +source = make(Int) do actor
      +    try
      +        next!(actor, 1)
      +        next!(actor, 2)
      +        next!(actor, 3)
      +        complete!(actor)
      +    catch e
      +        error!(actor, e)
      +    end
      +end
      +

      Disposing Observable Executions

      It is common for an Actor to abort execution of an Observable Execution. Once the Actor is done receiving values, it may stop the execution in order to free computation power or memory resources.

      When subscribe! is called, the Actor gets attached to the newly created Observable execution. This call also returns an object, the Subscription:

      subscription = subscribe!(source, actor)

      The Subscription represents the ongoing execution, and has a minimal API that allows you to cancel the execution. Read more about Subscription type here.

      With

      unsubscribe!(subscription)

      you can cancel the ongoing execution.

      Note

      subscribe! returns a Subscription that represents the ongoing execution. Simply call unsubscribe! on the Subscription to cancel the execution.

      diff --git a/v1.7.3/observables/types/array/index.html b/v1.7.3/observables/types/array/index.html new file mode 100644 index 000000000..855079335 --- /dev/null +++ b/v1.7.3/observables/types/array/index.html @@ -0,0 +1,59 @@ + +Array · Rocket.jl

      Array Observable

      Rocket.fromFunction
      from(x; scheduler::H = AsapScheduler()) where { H <: AbstractScheduler }
      +from(a::Vector{D}; scheduler::H = AsapScheduler()) where { D, H <: AbstractScheduler }

      Creation operator for the ArrayObservable that emits either a single value if x has a Scalar trait specification or a collection of values if x has a NonScalar trait specification. Throws an ErrorException if x has UndefinedScalarness trait type. To specify scalarness for arbitrary type T some can implement an additional method for scalarness(::Type{<:MyType}) function and to specify scalarness behavior. Optionally accepts custom scheduler-like object to schedule messages delivery.

      Arguments

      • x: an object to be wrapped into array of values
      • scheduler: optional, scheduler-like object

      For an object x to be a valid input for a from operator it must implement Rocket.scalarness(::Type{ <: T }) method which should return either Rocket.Scalar or Rocket.NonScalar objects. In first case from operator will treat x as a single scalar value and will wrap it into a vector while in the second case from operator will convert x object into an array using collect function.

      For arbitrary iterable objects consider using iterable creation operator.

      Note

      from operators creates a copy of x using collect on a given object.

      Examples

      using Rocket
      +
      +source = from([ 0, 1, 2 ])
      +subscribe!(source, logger())
      +;
      +
      +# output
      +
      +[LogActor] Data: 0
      +[LogActor] Data: 1
      +[LogActor] Data: 2
      +[LogActor] Completed
      +
      using Rocket
      +
      +source = from(( 0, 1, 2 ))
      +subscribe!(source, logger())
      +;
      +
      +# output
      +
      +[LogActor] Data: 0
      +[LogActor] Data: 1
      +[LogActor] Data: 2
      +[LogActor] Completed
      +
      using Rocket
      +
      +source = from(0)
      +subscribe!(source, logger())
      +;
      +
      +# output
      +
      +[LogActor] Data: 0
      +[LogActor] Completed
      +
      using Rocket
      +
      +source = from("Hello, world!")
      +subscribe!(source, logger())
      +;
      +
      +# output
      +
      +[LogActor] Data: H
      +[LogActor] Data: e
      +[LogActor] Data: l
      +[LogActor] Data: l
      +[LogActor] Data: o
      +[LogActor] Data: ,
      +[LogActor] Data:
      +[LogActor] Data: w
      +[LogActor] Data: o
      +[LogActor] Data: r
      +[LogActor] Data: l
      +[LogActor] Data: d
      +[LogActor] Data: !
      +[LogActor] Completed
      +

      See also: ArrayObservable, subscribe!, logger, iterable

      source
      Rocket.ArrayObservableType
      ArrayObservable{D, H}(values::Vector{D}, scheduler::H) where { D, H }

      ArrayObservable wraps a regular Julia array into an observable. Uses scheduler object to schedule messages delivery.

      Constructor arguments

      • values: array of values to be wrapped
      • scheduler: Scheduler-like object

      See also: Subscribable, from

      source
      diff --git a/v1.7.3/observables/types/collected/index.html b/v1.7.3/observables/types/collected/index.html new file mode 100644 index 000000000..5360a69b3 --- /dev/null +++ b/v1.7.3/observables/types/collected/index.html @@ -0,0 +1,14 @@ + +Collected · Rocket.jl

      Collected Observable

      Rocket.collectLatestFunction
      collectLatest(sources::S, mappingFn::F = copy) where { S, F }
      +collectLatest(::Type{T}, ::Type{R}, sources::S, mappingFn::F = copy)

      Collects values from multible Observables and emits it in one single array every time each inner Observable has a new value. Reemits errors from inner observables. Completes when all inner observables completes.

      Arguments

      • sources: input sources
      • mappingFn: optional mappingFn applied to an array of emited values, copy by default, should return a Vector

      Note: collectLatest completes immediately if sources are empty.

      Optional arguments

      • ::Type{T}: optional type of emmiting values of inner observables
      • ::Type{R}: optional return type after applying mappingFn to a vector of values

      Examples

      using Rocket
      +
      +collected = collectLatest([ of(1), from([ 1, 2 ]) ])
      +
      +subscribe!(collected, logger())
      +;
      +
      +# output
      +
      +[LogActor] Data: [1, 1]
      +[LogActor] Data: [1, 2]
      +[LogActor] Completed

      See also: Subscribable, subscribe!, combineLatest

      source

      Description

      collectLatest collects the values from all Observables in its vector argument. This is done by subscribing to each Observable in order and, whenever an Observable emits, collecting a vector of the most recent values from each Observable (in order). If you pass n Observables to collectLatest, the returned Observable will always emit an ordered vector of n values.

      To ensure that the output vector has a consistent length, collectLatest waits for all input Observables to emit at least once before it starts emitting results. This means that if some Observable emits values before other Observables started emitting, all these values but the last will be lost. On the other hand, if some Observable does not emit a value but completes, the resulting Observable will complete simultaneously without emitting anything. Furthermore, if some input Observable does not emit any value and never completes, collectLatest will also never emit and never complete.

      If at least one Observable was passed to collectLatest and all passed Observables emitted, then the resulting Observable will complete when all combined streams complete. So even if some Observable completes, the result of collectLatest will still emit values when the other Observables do. In case of a completed Observable, its value will now remain to be the last emitted value. On the other hand, if any Observable errors, collectLatest will also immediately error.

      diff --git a/v1.7.3/observables/types/combined/index.html b/v1.7.3/observables/types/combined/index.html new file mode 100644 index 000000000..6390a2b2f --- /dev/null +++ b/v1.7.3/observables/types/combined/index.html @@ -0,0 +1,26 @@ + +Combined · Rocket.jl

      Combined Observable

      Rocket.combineLatestFunction
      combineLatest(sources...; strategy = PushEach())
      +combineLatest(sources::S, strategy::G = PushEach()) where { S <: Tuple, U }

      Combines multiple Observables to create an Observable whose values are calculated from the latest values of each of its input Observables. Accept optimal update strategy object.

      Arguments

      • sources: input sources
      • strategy: optional update strategy for batching new values together

      Note: combineLatest() completes immediately if sources are empty.

      Examples

      using Rocket
      +
      +latest = combineLatest(of(1), from(2:5))
      +
      +subscribe!(latest, logger())
      +;
      +
      +# output
      +
      +[LogActor] Data: (1, 2)
      +[LogActor] Data: (1, 3)
      +[LogActor] Data: (1, 4)
      +[LogActor] Data: (1, 5)
      +[LogActor] Completed
      using Rocket
      +
      +latest = combineLatest(of(1) |> async(0), from(2:5) |> async(0), strategy = PushNew())
      +
      +subscribe!(latest, logger())
      +;
      +
      +# output
      +
      +[LogActor] Data: (1, 2)
      +[LogActor] Completed

      See also: Subscribable, subscribe!, PushEach, PushEachBut, PushNew, PushNewBut, PushStrategy

      source

      Description

      combineLatest combines the values from all Observables in its arguments. This is done by subscribing to each Observable in order and, whenever an Observable emits, collecting a tuple of the most recent values from each Observable (in order). If you pass n Observables to combineLatest, the returned Observable will always emit an ordered tuple of n values.

      To ensure that the output tuple has a consistent length, combineLatest waits for all input Observables to emit at least once before it starts emitting results. This means that if some Observable emits values before other Observables started emitting, all these values but the last will be lost. On the other hand, if some Observable does not emit a value but completes, the resulting Observable will complete simultaneously without emitting anything. Furthermore, if some input Observable does not emit any value and never completes, combineLatest will also never emit and never complete.

      If at least one Observable was passed to combineLatest and all passed Observables emitted, then the resulting Observable will complete when all combined streams complete. So even if some Observable completes, the result of combineLatest will still emit values when the other Observables do. In case of a completed Observable, its value will now remain to be the last emitted value. On the other hand, if any Observable errors, combineLatest will also immediately error.

      It is possible to change default update/complete strategy behaviour with an optional strategy object.

      diff --git a/v1.7.3/observables/types/combined_updates/index.html b/v1.7.3/observables/types/combined_updates/index.html new file mode 100644 index 000000000..bd09b307a --- /dev/null +++ b/v1.7.3/observables/types/combined_updates/index.html @@ -0,0 +1,3 @@ + +Combined Updates · Rocket.jl

      CombinedUpdates Observable

      Rocket.combineLatestUpdatesFunction
      combineLatestUpdates(sources...; strategy = PushEach())
      +combineLatestUpdates(sources::S, strategy::G = PushEach()) where { S <: Tuple, U }

      combineLatestUpdates is a more effiecient version of combineLatest(sources) + map_to(sources) operators chain.

      Arguments

      • sources: input sources
      • strategy: optional update strategy for batching new values together

      Note: combineLatestUpdates() completes immediately if sources are empty.

      See also: Subscribable, subscribe!, PushEach, PushEachBut, PushNew, PushNewBut, PushStrategy

      source
      diff --git a/v1.7.3/observables/types/completed/index.html b/v1.7.3/observables/types/completed/index.html new file mode 100644 index 000000000..809ff6bd3 --- /dev/null +++ b/v1.7.3/observables/types/completed/index.html @@ -0,0 +1,11 @@ + +Completed · Rocket.jl

      Completed Observable

      Rocket.completedFunction
      completed(::Type{T} = Any; scheduler::H = AsapScheduler()) where { T, H <: AbstractScheduler }

      Creation operator for the CompletedObservable that emits no items to the Actor and immediately sends a complete notification on subscription.

      Arguments

      • T: type of output data source, optional, Any is the default
      • scheduler: optional, scheduler-like object

      Examples

      using Rocket
      +
      +source = completed(Int)
      +subscribe!(source, logger())
      +;
      +
      +# output
      +
      +[LogActor] Completed
      +

      See also: CompletedObservable, subscribe!, logger

      source
      Rocket.CompletedObservableType
      CompletedObservable{D, H}(scheduler::H)

      Observable that emits no items to the Actor and just sends a complete notification on subscription.

      Constructor arguments

      • scheduler: Scheduler-like object

      See also: Subscribable, completed

      source
      diff --git a/v1.7.3/observables/types/concat/index.html b/v1.7.3/observables/types/concat/index.html new file mode 100644 index 000000000..da6af4e67 --- /dev/null +++ b/v1.7.3/observables/types/concat/index.html @@ -0,0 +1,25 @@ + +Concat · Rocket.jl

      Concat Observable

      Rocket.concatFunction
      concat(sources...)
      +concat(sources::S) where { S <: Tuple }

      Combines multiple Observables to create an Observable which sequentially emits all values from given Observable and then moves on to the next. All values of each passed Observable merged into a single Observable, in order, in serial fashion.

      Arguments

      • sources: input sources

      Examples

      using Rocket
      +
      +source1 = of(1)
      +source2 = of(2)
      +
      +subscribe!(concat(source1, source2), logger())
      +;
      +
      +# output
      +[LogActor] Data: 1
      +[LogActor] Data: 2
      +[LogActor] Completed
      using Rocket
      +
      +source1 = of(1) |> async()
      +source2 = of(2)
      +
      +subscribe!(concat(source1, source2), logger())
      +;
      +
      +# output
      +[LogActor] Data: 1
      +[LogActor] Data: 2
      +[LogActor] Completed

      See also: Subscribable, subscribe!

      source
      diff --git a/v1.7.3/observables/types/connectable/index.html b/v1.7.3/observables/types/connectable/index.html new file mode 100644 index 000000000..83b3298cb --- /dev/null +++ b/v1.7.3/observables/types/connectable/index.html @@ -0,0 +1,17 @@ + +Connectable · Rocket.jl

      Connectable Observable

      Rocket.connectableFunction
      connectable(subject::J, source::S) where J where S

      Creates a ConnectableObservable with a given subject object and a source observable.

      Example

      using Rocket
      +
      +c = connectable(Subject(Int; scheduler = AsapScheduler()), from(1:3))
      +
      +subscribe!(c, logger());
      +
      +connect(c);
      +;
      +
      +# output
      +
      +[LogActor] Data: 1
      +[LogActor] Data: 2
      +[LogActor] Data: 3
      +[LogActor] Completed
      +

      See also: ConnectableObservable, connect, subscribe!

      source
      Rocket.connectFunction
      connect(connectable::ConnectableObservable)

      When connect is called, the subject passed to the multicast operator is subscribed to the source and the subject’s observers receive the multicast notifications, which fits our basic mental model of stream multicasting. Returns a subscription.

      See also: connectable, ConnectableObservable

      source
      Rocket.ConnectableObservableType
      ConnectableObservable{D}(subject, source)

      A connectable observable encapsulates the multicasting infrastructure with provided subject, but does not immediately subscribe to the source. It subscribes to the source when its connect method is called.

      See also: connect, Subscribable

      source
      diff --git a/v1.7.3/observables/types/defer/index.html b/v1.7.3/observables/types/defer/index.html new file mode 100644 index 000000000..ec24301b8 --- /dev/null +++ b/v1.7.3/observables/types/defer/index.html @@ -0,0 +1,13 @@ + +Defer · Rocket.jl

      Defer Observable

      Rocket.deferFunction
      defer(::Type{D}, factoryFn::F) where { D, F <: Function }

      Creates an Observable that, on subscribe, calls an Observable factory to make an Observable for each new Observer.

      Arguments

      • T: type of output data source, created by the factoryFn
      • factoryFn: the Observable factory function to invoke for each Observer that subscribes to the output Observable

      Examples

      using Rocket
      +
      +source = defer(Int, () -> from([ 1, 2, 3 ]))
      +
      +subscribe!(source, logger())
      +;
      +
      +# output
      +[LogActor] Data: 1
      +[LogActor] Data: 2
      +[LogActor] Data: 3
      +[LogActor] Completed

      See also: Subscribable, subscribe!, logger

      source

      Description

      defer allows you to create the Observable only when the Actor subscribes, and create a fresh Observable for each Actor. It waits until an Actor subscribes to it, and then it generates an Observable, typically with an Observable factory function. It does this afresh for each subscriber, so although each subscriber may think it is subscribing to the same Observable, in fact each subscriber gets its own individual Observable.

      diff --git a/v1.7.3/observables/types/faulted/index.html b/v1.7.3/observables/types/faulted/index.html new file mode 100644 index 000000000..007bcde0d --- /dev/null +++ b/v1.7.3/observables/types/faulted/index.html @@ -0,0 +1,12 @@ + +Faulted · Rocket.jl

      Faulted Observable

      Rocket.faultedFunction
      faulted(err; scheduler::H = AsapScheduler())            where { H <: AbstractScheduler }
      +faulted(::Type{T}, err; scheduler::H = AsapScheduler()) where { T, H <: AbstractScheduler }

      Creation operator for the FaultedObservable that emits no items to the Actor and immediately sends an error notification.

      Arguments

      • err: the particular Error to pass to the error notification.
      • T: type of output data source, optional, Any by default
      • scheduler: optional, scheduler-like object

      Examples

      using Rocket
      +
      +source = faulted("Error!")
      +subscribe!(source, logger())
      +;
      +
      +# output
      +
      +[LogActor] Error: Error!
      +

      See also: FaultedObservable, subscribe!

      source
      Rocket.FaultedObservableType
      FaultedObservable{D, H}(err, scheduler::H)

      Observable that emits no items to the Actor and just sends an error notification on subscription.

      Constructor arguments

      • err: error to emit on subscription
      • scheduler: scheduler-like object

      See also: faulted

      source
      diff --git a/v1.7.3/observables/types/file/index.html b/v1.7.3/observables/types/file/index.html new file mode 100644 index 000000000..618bce6d3 --- /dev/null +++ b/v1.7.3/observables/types/file/index.html @@ -0,0 +1,2 @@ + +File · Rocket.jl
      diff --git a/v1.7.3/observables/types/function/index.html b/v1.7.3/observables/types/function/index.html new file mode 100644 index 000000000..2b63861f4 --- /dev/null +++ b/v1.7.3/observables/types/function/index.html @@ -0,0 +1,33 @@ + +Function · Rocket.jl

      Function Observable

      Rocket.makeFunction
      make(f::Function, type::Type{D})

      Creation operator for the FunctionObservable.

      Arguments

      • f: function to be invoked on subscription
      • type: type of data in observable

      Examples

      using Rocket
      +
      +source = make(Int) do actor
      +    next!(actor, 0)
      +    complete!(actor)
      +end
      +
      +subscription = subscribe!(source, logger());
      +unsubscribe!(subscription)
      +;
      +
      +# output
      +
      +[LogActor] Data: 0
      +[LogActor] Completed
      +
      using Rocket
      +
      +source = make(Int) do actor
      +    next!(actor, 0)
      +    setTimeout(100) do
      +        next!(actor, 1)
      +        complete!(actor)
      +    end
      +end
      +
      +subscription = subscribe!(source, logger())
      +unsubscribe!(subscription)
      +;
      +
      +# output
      +
      +[LogActor] Data: 0

      See also: FunctionObservable, subscribe!, logger

      source
      Rocket.FunctionObservableType
      FunctionObservable{D}(f::F)

      FunctionObservable wraps a callback f, which is called when the Observable is initially subscribed to. This function is given an Actor, to which new values can be nexted (with next!(actor, data)), or an error! method can be called to raise an error, or complete! can be called to notify of a successful completion.

      Arguments

      • f::F: function to be invoked on subscription

      See also: Subscribable, make

      source
      diff --git a/v1.7.3/observables/types/generate/index.html b/v1.7.3/observables/types/generate/index.html new file mode 100644 index 000000000..55ac8ce70 --- /dev/null +++ b/v1.7.3/observables/types/generate/index.html @@ -0,0 +1,11 @@ + +Generate · Rocket.jl

      Generate Observable

      Rocket.generateFunction
      generate(initial::D, condition::C, iterator::I; scheduler::H = AsapScheduler()) where { D, C, I, H <: AbstractScheduler }

      Generates an observable sequence by running a state-driven loop producing the sequence's elements, using the specified scheduler to send out observer messages.

      Arguments

      • initial: initial state
      • condition: condition to terminate generation (upon returning false)
      • iterator: iteration step function
      • scheduler: optional, scheduler-like object

      Note

      iterator object should return objects of the same type as initial.

      Examples

      using Rocket
      +
      +source = generate(1, x -> x < 3, x -> x + 1)
      +subscribe!(source, logger())
      +;
      +
      +# output
      +[LogActor] Data: 1
      +[LogActor] Data: 2
      +[LogActor] Completed

      See also: ScheduledSubscribable, subscribe!

      source
      diff --git a/v1.7.3/observables/types/interval/index.html b/v1.7.3/observables/types/interval/index.html new file mode 100644 index 000000000..abfd07e05 --- /dev/null +++ b/v1.7.3/observables/types/interval/index.html @@ -0,0 +1,25 @@ + +Interval · Rocket.jl

      Interval Observable

      Rocket.intervalFunction
      interval(period::Union{Int, Nothing} = nothing)

      Creation operator for the TimerObservable. interval returns an Observable that emits an infinite sequence of ascending integers, with a constant interval of time of your choosing between those emissions. The first emission is not sent immediately, but only after the first period has passed.

      Arguments

      • interval: the interval size in milliseconds

      Examples

      using Rocket
      +
      +source = interval(50)
      +
      +subscription = subscribe!(source, logger())
      +sleep(0.215)
      +unsubscribe!(subscription)
      +sleep(0.215)
      +subscription = subscribe!(source, logger())
      +sleep(0.185)
      +unsubscribe!(subscription)
      +
      +close(source)
      +;
      +
      +# output
      +
      +[LogActor] Data: 0
      +[LogActor] Data: 1
      +[LogActor] Data: 2
      +[LogActor] Data: 3
      +[LogActor] Data: 8
      +[LogActor] Data: 9
      +[LogActor] Data: 10

      See also: timer, TimerObservable, Subscribable

      source
      diff --git a/v1.7.3/observables/types/iterable/index.html b/v1.7.3/observables/types/iterable/index.html new file mode 100644 index 000000000..b8fc0bbbd --- /dev/null +++ b/v1.7.3/observables/types/iterable/index.html @@ -0,0 +1,26 @@ + +Iterable · Rocket.jl

      Iterable Observable

      Rocket.iterableFunction
      iterable(iterator; scheduler::H = AsapScheduler()) where { H <: AbstractScheduler }

      Creation operator for the IterableObservable that wraps given iterator into an observable object.

      Arguments

      • iterator: an iterator object to be wrapped an observable
      • scheduler: optional, scheduler-like object

      Note

      iterable operators does not create a copy of iterator. Any changes in the iterator object might be visible in the created observable. For side-effects free behavior consider using from creation operator which creates a copy of a given object with a collect function.

      Examples

      using Rocket
      +
      +source = iterable([ 0, 1, 2 ])
      +subscribe!(source, logger())
      +;
      +
      +# output
      +
      +[LogActor] Data: 0
      +[LogActor] Data: 1
      +[LogActor] Data: 2
      +[LogActor] Completed
      using Rocket
      +
      +source = iterable("Hello")
      +subscribe!(source, logger())
      +;
      +
      +# output
      +
      +[LogActor] Data: H
      +[LogActor] Data: e
      +[LogActor] Data: l
      +[LogActor] Data: l
      +[LogActor] Data: o
      +[LogActor] Completed

      See also: ScheduledSubscribable, subscribe!, from

      source
      diff --git a/v1.7.3/observables/types/labeled/index.html b/v1.7.3/observables/types/labeled/index.html new file mode 100644 index 000000000..f3bacf88b --- /dev/null +++ b/v1.7.3/observables/types/labeled/index.html @@ -0,0 +1,13 @@ + +Labeled · Rocket.jl

      Labeled Observable

      Rocket.labeledFunction
      labeled(names::Val, stream)

      Creation operator for the LabeledObservable that wraps given stream, that produces Tuple values into a NamedTuple with given names.

      Arguments

      • names: a Val object that contains a tuple of symbols
      • stream: an observable that emits a Tuple, length of the Tuple events must be equal to the length of the names argument

      Examples

      using Rocket
      +
      +source = labeled(Val((:x, :y)), from([ (1, 2), (2, 3), (3, 4) ]))
      +subscribe!(source, logger())
      +;
      +
      +# output
      +
      +[LogActor] Data: (x = 1, y = 2)
      +[LogActor] Data: (x = 2, y = 3)
      +[LogActor] Data: (x = 3, y = 4)
      +[LogActor] Completed

      See also: ScheduledSubscribable, subscribe!, from

      source
      diff --git a/v1.7.3/observables/types/merged/index.html b/v1.7.3/observables/types/merged/index.html new file mode 100644 index 000000000..5cf80778b --- /dev/null +++ b/v1.7.3/observables/types/merged/index.html @@ -0,0 +1,46 @@ + +Merged · Rocket.jl

      Merged Observable

      Rocket.mergedFunction
      merged(sources::T) where { T <: Tuple }

      Creation operator for the MergeObservable with a given sources collected in a tuple. merge subscribes to each given input Observable (as arguments), and simply forwards (without doing any transformation) all the values from all the input Observables to the output Observable. The output Observable only completes once all input Observables have completed. Any error delivered by an input Observable will be immediately emitted on the output Observable.

      Examples

      using Rocket
      +
      +observable = merged((from(1:4), of(2.0), from("Hello")))
      +
      +subscribe!(observable, logger())
      +;
      +
      +# output
      +[LogActor] Data: 1
      +[LogActor] Data: 2
      +[LogActor] Data: 3
      +[LogActor] Data: 4
      +[LogActor] Data: 2.0
      +[LogActor] Data: H
      +[LogActor] Data: e
      +[LogActor] Data: l
      +[LogActor] Data: l
      +[LogActor] Data: o
      +[LogActor] Completed
      using Rocket
      +
      +subject = Subject(Int, scheduler = AsyncScheduler())
      +
      +observable = merged((subject, of(2.0), from("Hello")))
      +
      +actor = sync(logger())
      +
      +subscribe!(observable, actor)
      +
      +setTimeout(200) do
      +    next!(subject, 1)
      +    complete!(subject)
      +end
      +
      +wait(actor)
      +;
      +
      +# output
      +[LogActor] Data: 2.0
      +[LogActor] Data: H
      +[LogActor] Data: e
      +[LogActor] Data: l
      +[LogActor] Data: l
      +[LogActor] Data: o
      +[LogActor] Data: 1
      +[LogActor] Completed

      See also: Subscribable

      source
      diff --git a/v1.7.3/observables/types/network/index.html b/v1.7.3/observables/types/network/index.html new file mode 100644 index 000000000..8d068501c --- /dev/null +++ b/v1.7.3/observables/types/network/index.html @@ -0,0 +1,6 @@ + +Network · Rocket.jl

      Network Observable

      Rocket.networkFunction
      network(::Type{D}, port::Int)             where D
      +network(::Type{D}, address::A, port::Int) where { D, A <: IPAddr }
      +
      +network(::Type{Vector{D}}, port::Int, buffer_size::Int)             where D
      +network(::Type{Vector{D}}, address::A, port::Int, buffer_size::Int) where { D, A <: IPAddr }

      Creation operator for the NetworkObservable that emits messages from the server with specified address and port arguments.

      See also: NetworkObservable, subscribe!

      source
      diff --git a/v1.7.3/observables/types/never/index.html b/v1.7.3/observables/types/never/index.html new file mode 100644 index 000000000..487cb0efb --- /dev/null +++ b/v1.7.3/observables/types/never/index.html @@ -0,0 +1,9 @@ + +Never · Rocket.jl

      Never Observable

      Rocket.neverFunction
      never(T = Any)

      Creation operator for the NeverObservable that emits neither values nor errors nor the completion notification. It can be used for testing purposes or for composing with other Observables. Please note that by never emitting a complete notification, this Observable keeps the subscription from being disposed automatically. Subscriptions need to be manually disposed.

      Arguments

      • T: Type of Observable data, optional, Any is the default

      Examples

      using Rocket
      +
      +source = never()
      +subscribe!(source, logger())
      +;
      +
      +# output
      +

      See also: NeverObservable, subscribe!, logger

      source
      diff --git a/v1.7.3/observables/types/proxy/index.html b/v1.7.3/observables/types/proxy/index.html new file mode 100644 index 000000000..bd819792b --- /dev/null +++ b/v1.7.3/observables/types/proxy/index.html @@ -0,0 +1,30 @@ + +Proxy · Rocket.jl

      Proxy Observable

      ProxyObservable might help to create a custom operator. It wraps either source and/or actor with their proxied versions providing additional custom logic for on_subscribe! and/or for on_next!, on_error!, on_complete! methods.

      Rocket.proxyFunction
      proxy(::Type{L}, source, proxy) where L

      Creation operator for the ProxyObservable with a given source and proxy objects.

      Example

      using Rocket
      +
      +source = from(1:5)
      +
      +struct MyCustomProxy <: ActorProxy end
      +
      +struct MyCustomActor{A} <: Actor{Int}
      +    actor :: A
      +end
      +
      +Rocket.on_next!(actor::MyCustomActor, data::Int) = next!(actor.actor, data ^ 2)
      +Rocket.on_error!(actor::MyCustomActor, err)      = error!(actor.actor, err)
      +Rocket.on_complete!(actor::MyCustomActor)        = complete!(actor.actor)
      +
      +Rocket.actor_proxy!(::Type{Int}, proxy::MyCustomProxy, actor::A) where A = MyCustomActor{A}(actor)
      +
      +proxied = proxy(Int, source, MyCustomProxy())
      +
      +subscribe!(proxied, logger())
      +;
      +
      +# output
      +
      +[LogActor] Data: 1
      +[LogActor] Data: 4
      +[LogActor] Data: 9
      +[LogActor] Data: 16
      +[LogActor] Data: 25
      +[LogActor] Completed

      See also: ProxyObservable, ActorProxy, SourceProxy, ActorSourceProxy

      source
      Rocket.ActorProxyType
      ActorProxy

      Can be used as a super type for common proxy object. Automatically specifies ValidActorProxy trait behavior. Each ActorProxy must implement its own method for actor_proxy!(::Type, proxy, actor) function which have to return a valid actor object.

      See also: proxy, actor_proxy!

      source
      Rocket.SourceProxyType
      SourceProxy

      Can be used as a super type for common proxy object. Automatically specifies ValidSourceProxy trait behavior. Each SourceProxy must implement its own method for source_proxy!(::Type, proxy, source) function which have to return a valid subscribable object.

      See also: proxy, source_proxy!

      source
      Rocket.ActorSourceProxyType
      ActorSourceProxy

      Can be used as a super type for common proxy object. Automatically specifies ValidActorSourceProxy trait behavior. Each ActorSourceProxy must implement its own method for source_proxy!(::Type, proxy, source) function which have to return a valid subscribable object and also for actor_proxy!(::Type, proxy, actor) function which have to return a valid actor object..

      See also: proxy, actor_proxy!, source_proxy!

      source
      Rocket.actor_proxy!Function
      actor_proxy!(::Type, proxy, actor)

      This is function is used to wrap an actor with its proxied version given a particular proxy object. Must return another actor. Each valid ActorProxy and ActorSourceProxy must implement its own method for actor_proxy! function. The first argument is the same as the type of data of the connected proxy observable.

      See also: proxy, ActorProxy, ActorSourceProxy

      source
      Rocket.source_proxy!Function
      source_proxy!(::Type, proxy, source)

      This is function is used to wrap a source with its proxied version given a particular proxy object. Must return another Observable. Each valid SourceProxy and ActorSourceProxy must implement its own method for source_proxy! function. The first argument is the same as the type of data of the connected proxy observable.

      See also: proxy, SourceProxy, ActorSourceProxy

      source
      diff --git a/v1.7.3/observables/types/race/index.html b/v1.7.3/observables/types/race/index.html new file mode 100644 index 000000000..2c5a67eb5 --- /dev/null +++ b/v1.7.3/observables/types/race/index.html @@ -0,0 +1,23 @@ + +Race · Rocket.jl

      Race Observable

      Rocket.raceFunction
      race(sources...)
      +race(sources::S) where { S <: Tuple }

      Combines multiple Observables to create an Observable that mirrors the output of the first Observable to emit an item. Essentially it subscribes to the observable that was the first to start emitting.

      Arguments

      • sources: input sources

      Examples

      using Rocket
      +
      +source1 = of(1)
      +source2 = of(2)
      +
      +subscribe!(race(source1, source2), logger())
      +;
      +
      +# output
      +[LogActor] Data: 1
      +[LogActor] Completed
      using Rocket
      +
      +source1 = of(1) |> async()
      +source2 = of(2)
      +
      +subscribe!(race(source1, source2), logger())
      +;
      +
      +# output
      +[LogActor] Data: 2
      +[LogActor] Completed

      See also: Subscribable, subscribe!

      source
      diff --git a/v1.7.3/observables/types/single/index.html b/v1.7.3/observables/types/single/index.html new file mode 100644 index 000000000..11f9a6086 --- /dev/null +++ b/v1.7.3/observables/types/single/index.html @@ -0,0 +1,12 @@ + +Single · Rocket.jl

      Single Observable

      Rocket.ofFunction
      of(x; scheduler::H = AsapScheduler()) where { H <: AbstractScheduler }

      Creation operator for the SingleObservable that emits a single value x and then completes.

      Arguments

      • x: value to be emmited before completion

      Examples

      using Rocket
      +
      +source = of(1)
      +subscribe!(source, logger())
      +;
      +
      +# output
      +
      +[LogActor] Data: 1
      +[LogActor] Completed
      +

      See also: SingleObservable, subscribe!, logger

      source
      Rocket.SingleObservableType
      SingleObservable{D, H}(value::D, scheduler::H)

      SingleObservable wraps single value of type D into a observable.

      Constructor arguments

      • value: a single value to emit
      • scheduler: scheduler-like object

      See also: of, Subscribable

      source
      diff --git a/v1.7.3/observables/types/timer/index.html b/v1.7.3/observables/types/timer/index.html new file mode 100644 index 000000000..c5bb5b89b --- /dev/null +++ b/v1.7.3/observables/types/timer/index.html @@ -0,0 +1,18 @@ + +Timer · Rocket.jl

      Timer Observable

      Rocket.timerFunction
      timer(delay::Int)
      +timer(delay::Int, period::Int)

      Creation operator for the TimerObservable. Its like interval(@ref), but you can specify when should the emissions start. timer returns an Observable that emits an infinite sequence of ascending integers, with a constant interval of time, period of your choosing between those emissions. The first emission happens after the specified delay. If period is not specified, the output Observable emits only one value, 0. Otherwise, it emits an infinite sequence. The timer closes automatically when the unsubscription happens.

      Arguments

      • delay: the initial delay time specified as an integer denoting milliseconds to wait before emitting the first value of 0.
      • period: the minimum period of time between emissions of the subsequent numbers (in milliseconds).

      Examples

      using Rocket
      +
      +source = timer(0, 50)
      +
      +sleep(0.075)
      +subscription = subscribe!(source, logger())
      +sleep(0.105)
      +unsubscribe!(subscription)
      +
      +;
      +
      +# output
      +
      +[LogActor] Data: 2
      +[LogActor] Data: 3
      +

      See also: interval, TimerObservable, subscribe!, logger

      source
      Rocket.TimerObservableType
      TimerObservable

      An Observable that starts emitting after an delay and emits ever increasing numbers after each period of time thereafter.

      Parameters

      • delay: The initial delay time specified as an integer denoting milliseconds to wait before emitting the first value of 0`.
      • period: The minimum period of time in milliseconds between emissions of the subsequent numbers.

      See also: timer, Subscribable

      source
      diff --git a/v1.7.3/observables/types/zipped/index.html b/v1.7.3/observables/types/zipped/index.html new file mode 100644 index 000000000..48232dd67 --- /dev/null +++ b/v1.7.3/observables/types/zipped/index.html @@ -0,0 +1,33 @@ + +Zipped · Rocket.jl

      Zipped Observable

      Rocket.zippedFunction
      zipped(sources...)

      Combines multiple Observables to create an Observable whose values are calculated from the values, in order, of each of its input Observables.

      Arguments

      • sources: input sources

      Examples

      using Rocket
      +
      +source = zipped(of(1), from(2:5))
      +
      +subscribe!(source, logger())
      +;
      +
      +# output
      +
      +[LogActor] Data: (1, 2)
      +[LogActor] Completed
      using Rocket
      +
      +source = zipped(from(1:3), from(1:5))
      +
      +subscribe!(source, logger())
      +;
      +
      +# output
      +
      +[LogActor] Data: (1, 1)
      +[LogActor] Data: (2, 2)
      +[LogActor] Data: (3, 3)
      +[LogActor] Completed
      using Rocket
      +
      +source = zipped(completed(), of(0.0))
      +
      +subscribe!(source, logger())
      +;
      +
      +# output
      +
      +[LogActor] Completed

      See also: Subscribable, subscribe!

      source
      diff --git a/v1.7.3/operators/about/index.html b/v1.7.3/operators/about/index.html new file mode 100644 index 000000000..457b3da50 --- /dev/null +++ b/v1.7.3/operators/about/index.html @@ -0,0 +1,58 @@ + +Operator · Rocket.jl

      Operators

      Even though the Observable is the foundation, reactive extensions are mostly useful because of their operators. Operators are the essential pieces that allow complex asynchronous code to be easily composed in a declarative manner.

      What are operators?

      There are two kinds of operators:

      Pipeable operators

      Pipeable Operators are the kind that can be piped to Observables using the syntax source |> operator(). These include the filter() and map() operators. When called, operators do not change the existing Observable instance. Instead, they return a new Observable, whose subscription logic is based on the first Observable.

      Note

      A Pipeable Operator is a function that takes an Observable as its input and returns another Observable. It is a pure operation: the previous Observable remains unmodified.

      A Pipeable Operator is essentially a pure callable object that accepts one Observable as input and returns another Observable as output. Subscribing to the output Observable will also subscribe to the input Observable.

      For example, the operator called map() is analogous to the Array method of the same name. Just like the array method map((d) -> d ^ 2, [ 1, 2, 3 ]) yields [ 1, 4, 9 ], the Observable emits 1, 4, 9:

      source = from([ 1, 2, 3 ])
      +subscribe!(source |> map(Int, (d) -> d ^ 2), lambda(
      +    on_next = (d) -> println(d)
      +))
      +
      +// Logs:
      +// 1
      +// 4
      +// 9

      Another useful operator is first():

      source = from([ 1, 2, 3 ])
      +subscribe!(source |> first(), lambda(
      +    on_next     = (d) -> println(d),
      +    on_complete = ()  -> "Completed"
      +))
      +
      +// Logs:
      +// 1
      +// Completed

      Creation operators

      Distinct from pipeable operators, creation operators are functions that can be used to create an Observable with some common predefined behavior or by joining other Observables. For example: from([ 1, 2, 3 ]) creates an observable that will sequentially emit 1, 2, and 3.

      source = from([ 1, 2, 3 ])
      +subscribe!(source, lambda(
      +    on_next     = (d) -> println("Value: $d"),
      +    on_error    = (e) -> println("Oh no, error: $e")
      +    on_complete = ()  -> println("Completed")
      +))
      +
      +// Logs:
      +// Value: 1
      +// Value: 2
      +// Value: 3
      +// Completed

      Operators piping

      Pipeable operators are special objects that can be used like ordinary functions with on_call!(operator, source). In practice however they tend to accumulate and quickly grow unreadable: on_call!(operator1, on_call!(operator2, on_call!(operator3, source))). Therefore, Rocket.jl overloads |> for operators and Observables:

      using Rocket
      +
      +source = from(1:100) |> filter((d) -> d % 2 === 0) |> map(Int, (d) -> d ^ 2) |> sum()
      +
      +subscribe!(source, logger())
      +
      +// Logs
      +// [LogActor] Data: 171700
      +// [LogActor] Completed

      It is also possible to create an operator composition with + or |>. It might be useful to create an alias for some often used operator chain

      using Rocket
      +
      +mapAndFilter = map(Int, d -> d ^ 2) + filter(d -> d % 2 == 0) 
      +
      +source = from(1:5) |> mapAndFilter
      +
      +subscribe!(source, logger())
      +
      +// Logs
      +// [LogActor] Data: 4
      +// [LogActor] Data: 16
      +// [LogActor] Completed
      +
      +mapAndFilterAndSum = mapAndFilter + sum()
      +
      +source = from(1:5) |> mapAndFilterAndSum
      +
      +subscribe!(source, logger())
      +
      +// Logs
      +// [LogActor] Data: 20
      +// [LogActor] Completed

      For stylistic reasons, on_call!(operator, source) is never used in practice - even if there is only one operator. Instead, source |> operator() is generally preferred.

      diff --git a/v1.7.3/operators/all/index.html b/v1.7.3/operators/all/index.html new file mode 100644 index 000000000..1c80125c5 --- /dev/null +++ b/v1.7.3/operators/all/index.html @@ -0,0 +1,2 @@ + +All · Rocket.jl
      diff --git a/v1.7.3/operators/creation/about/index.html b/v1.7.3/operators/creation/about/index.html new file mode 100644 index 000000000..424a624c3 --- /dev/null +++ b/v1.7.3/operators/creation/about/index.html @@ -0,0 +1,2 @@ + +Creation · Rocket.jl
      diff --git a/v1.7.3/operators/errors/about/index.html b/v1.7.3/operators/errors/about/index.html new file mode 100644 index 000000000..b8b3fd9db --- /dev/null +++ b/v1.7.3/operators/errors/about/index.html @@ -0,0 +1,2 @@ + +About error handling operators · Rocket.jl
      diff --git a/v1.7.3/operators/errors/catch_error/index.html b/v1.7.3/operators/errors/catch_error/index.html new file mode 100644 index 000000000..b0243b3d0 --- /dev/null +++ b/v1.7.3/operators/errors/catch_error/index.html @@ -0,0 +1,14 @@ + +catch_error · Rocket.jl

      Catch Error Operator

      Rocket.catch_errorFunction
      catch_error(selectorFn::F) where F

      Creates a CatchErrorOperator, which catches errors on the observable to be handled by returning a new observable or throwing an error.

      Arguments:

      • selectorFn::F: a callable object that takes as arguments err, which is the error, and caught, which is the source observable, in case you'd like to "retry" that observable by returning it again. Whatever observable is returned by the selector will be used to continue the observable chain.

      Producing

      Stream of type <: Subscribable{L} where L refers to type of source stream

      Examples

      using Rocket
      +
      +source = from(1:5) |> safe() |> map(Int, (d) -> d == 4 ? error(4) : d) |> catch_error((err, obs) -> of(1))
      +
      +subscribe!(source, logger())
      +;
      +
      +# output
      +[LogActor] Data: 1
      +[LogActor] Data: 2
      +[LogActor] Data: 3
      +[LogActor] Data: 1
      +[LogActor] Completed

      See also: AbstractOperator, InferableOperator, rerun, logger, safe

      source

      See also

      Operators

      diff --git a/v1.7.3/operators/errors/error_if/index.html b/v1.7.3/operators/errors/error_if/index.html new file mode 100644 index 000000000..c6b3d242c --- /dev/null +++ b/v1.7.3/operators/errors/error_if/index.html @@ -0,0 +1,16 @@ + +error_if · Rocket.jl

      Error If Operator

      Rocket.error_ifFunction
      error_if(checkFn, errorFn)

      Creates an error_if operator, which performs a check for every emission on the source Observable with checkFn. If checkFn returns true, the operator sends an error event and unsubscribes from the observable.

      Arguments

      • checkFn: check function with (data) -> Bool signature
      • errorFn: error object generating function with (data) -> Any signature, optional

      Producing

      Stream of type <: Subscribable{L} where L refers to type of source stream

      Examples

      using Rocket
      +
      +source = from([1, 2, 3]) |> error_if((data) -> data > 2, (data) -> "CustomError")
      +
      +subscription = subscribe!(source, lambda(
      +    on_next  = (d) -> println("Next: ", d),
      +    on_error = (e) -> println("Error: ", e),
      +    on_complete = () -> println("Completed")
      +))
      +;
      +
      +# output
      +Next: 1
      +Next: 2
      +Error: CustomError

      See also: error_if_not, error_if_empty, default_if_empty, lambda

      source

      See also

      Operators

      diff --git a/v1.7.3/operators/errors/error_if_not/index.html b/v1.7.3/operators/errors/error_if_not/index.html new file mode 100644 index 000000000..67181c917 --- /dev/null +++ b/v1.7.3/operators/errors/error_if_not/index.html @@ -0,0 +1,15 @@ + +error_if_not · Rocket.jl

      Error If Not Operator

      Note: error_if_not is an alias for error_if operator with inverted checkFn.

      Rocket.error_if_notFunction
      error_if_not(checkFn, errorFn)

      Creates an error_if_not operator, which performs a check for every emission on the source Observable with checkFn. If checkFn returns false, the operator sends an error event and unsubscribes from the observable.

      Note: error_if_not is an alias for error_if operator with inverted checkFn.

      Arguments

      • checkFn: check function with (data) -> Bool signature
      • errorFn: error object generating function with (data) -> Any signature, optional

      Producing

      Stream of type <: Subscribable{L} where L refers to type of source stream

      Examples

      using Rocket
      +
      +source = from([1, 2, 3]) |> error_if_not((data) -> data < 2, (data) -> "CustomError")
      +
      +subscription = subscribe!(source, lambda(
      +    on_next  = (d) -> println("Next: ", d),
      +    on_error = (e) -> println("Error: ", e),
      +    on_complete = () -> println("Completed")
      +))
      +;
      +
      +# output
      +Next: 1
      +Error: CustomError

      See also: error_if, error_if_empty, default_if_empty, logger

      source

      See also

      Operators

      diff --git a/v1.7.3/operators/errors/rerun/index.html b/v1.7.3/operators/errors/rerun/index.html new file mode 100644 index 000000000..591b0cc25 --- /dev/null +++ b/v1.7.3/operators/errors/rerun/index.html @@ -0,0 +1,14 @@ + +rerun · Rocket.jl

      Rerun Operator

      Rocket.rerunFunction
      rerun(count::Int = -1)

      Returns an Observable that mirrors the source Observable with the exception of an error. If the source Observable calls error, this method will resubscribe to the source Observable for a maximum of count resubscriptions (given as a number parameter) rather than propagating the error call.

      Arguments:

      • count::Int: Number of retry attempts before failing. Optional. Default is -1.

      Producing

      Stream of type <: Subscribable{L} where L refers to type of source stream

      Examples

      using Rocket
      +
      +source = from(1:3) |> safe() |> map(Int, (d) -> d > 1 ? error("Error") : d) |> rerun(3)
      +
      +subscribe!(source, logger())
      +;
      +
      +# output
      +[LogActor] Data: 1
      +[LogActor] Data: 1
      +[LogActor] Data: 1
      +[LogActor] Data: 1
      +[LogActor] Error: ErrorException("Error")

      See also: AbstractOperator, InferableOperator, catch_error, logger, safe

      source

      Description

      Any and all items emitted by the source Observable will be emitted by the resulting Observable, even those emitted during failed subscriptions. For example, if an Observable fails at first but emits [1, 2] then succeeds the second time and emits: [1, 2, 3, 4, 5] then the complete stream of emissions and notifications would be: [1, 2, 1, 2, 3, 4, 5, complete].

      See also

      Operators

      diff --git a/v1.7.3/operators/filtering/about/index.html b/v1.7.3/operators/filtering/about/index.html new file mode 100644 index 000000000..1b28b628c --- /dev/null +++ b/v1.7.3/operators/filtering/about/index.html @@ -0,0 +1,2 @@ + +About filtering operators · Rocket.jl
      diff --git a/v1.7.3/operators/filtering/filter/index.html b/v1.7.3/operators/filtering/filter/index.html new file mode 100644 index 000000000..201fb6247 --- /dev/null +++ b/v1.7.3/operators/filtering/filter/index.html @@ -0,0 +1,13 @@ + +filter · Rocket.jl

      Filter Operator

      Base.filterFunction
      filter(filterFn::F) where { F <: Function }

      Creates a filter operator, which filters items of the source Observable by emitting only those that satisfy a specified filterFn predicate.

      Producing

      Stream of type <: Subscribable{L} where L refers to type of source stream

      Arguments

      • filterFn::F: predicate function with (data::T) -> Bool signature

      Examples

      using Rocket
      +
      +source = from([ 1, 2, 3, 4, 5, 6 ])
      +subscribe!(source |> filter((d) -> d % 2 == 0), logger())
      +;
      +
      +# output
      +
      +[LogActor] Data: 2
      +[LogActor] Data: 4
      +[LogActor] Data: 6
      +[LogActor] Completed

      See also: AbstractOperator, InferableOperator, ProxyObservable, logger

      source

      Description

      Like filter(f, array), this operator takes values from the source Observable, passes them through a predicate function and only emits those values that yielded true.

      See also

      Operators

      diff --git a/v1.7.3/operators/filtering/filter_type/index.html b/v1.7.3/operators/filtering/filter_type/index.html new file mode 100644 index 000000000..1499e7a46 --- /dev/null +++ b/v1.7.3/operators/filtering/filter_type/index.html @@ -0,0 +1,13 @@ + +filter_type · Rocket.jl

      FilterType Operator

      Rocket.filter_typeFunction
      filter_type(type::Type{ T }) where { T }

      Creates a filter_type operator, which filters items of the source Observable by emitting only those that match a specified T type with a <: operator. This operator is a more efficient version of filter(v -> v <: T) |> map(T, v -> v) operators chain.

      Producing

      Stream of type <: Subscribable{ T } where T refers to type argument

      Examples

      using Rocket
      +
      +source = from(Real[ 1, 2.0, 3, 4.0, 5, 6.0 ])
      +subscribe!(source |> filter_type(Int), logger())
      +;
      +
      +# output
      +
      +[LogActor] Data: 1
      +[LogActor] Data: 3
      +[LogActor] Data: 5
      +[LogActor] Completed

      See also: AbstractOperator, InferableOperator, ProxyObservable, logger

      source

      See also

      Operators

      diff --git a/v1.7.3/operators/filtering/find/index.html b/v1.7.3/operators/filtering/find/index.html new file mode 100644 index 000000000..f5232dbcc --- /dev/null +++ b/v1.7.3/operators/filtering/find/index.html @@ -0,0 +1,11 @@ + +find · Rocket.jl

      Find operator

      Rocket.findFunction
      find(conditionFn::F) where { F <: Function }

      Creates a find operator, which emits only the first value emitted by the source Observable that meets some condition.

      Producing

      Stream of type <: Subscribable{L} where L refers to type of source stream

      Arguments

      • conditionFn::F: condition function with (data::T) -> Bool signature

      Examples

      using Rocket
      +
      +source = from([ 1, 2, 3, 4, 5, 6, 7, 8 ])
      +subscribe!(source |> find((d) -> d % 2 == 0), logger())
      +;
      +
      +# output
      +
      +[LogActor] Data: 2
      +[LogActor] Completed

      See also: AbstractOperator, InferableOperator, ProxyObservable, logger

      source

      Description

      find searches for the first item in the source Observable that matches the specified condition embodied by the predicate, and returns the first occurrence in the source. Does not emit an error if a valid value is not found.

      See also

      Operators, take

      diff --git a/v1.7.3/operators/filtering/find_index/index.html b/v1.7.3/operators/filtering/find_index/index.html new file mode 100644 index 000000000..8c194caf6 --- /dev/null +++ b/v1.7.3/operators/filtering/find_index/index.html @@ -0,0 +1,11 @@ + +find_index · Rocket.jl

      Find Index operator

      Rocket.find_indexFunction
      find_index(conditionFn::F) where { F <: Function }

      Creates a find operator, which emits only the index of the first value emitted by the source Observable that meets some condition. Indices are 1-based.

      Producing

      Stream of type <: Subscribable{L} where L refers to type of source stream

      Arguments

      • conditionFn::F: condition function with (data::T) -> Bool signature

      Examples

      using Rocket
      +
      +source = from([ 0, 1, 2, 3, 4, 5, 6, 7, 8 ])
      +subscribe!(source |> find_index((d) -> d !== 0 && d % 2 == 0), logger())
      +;
      +
      +# output
      +
      +[LogActor] Data: 3
      +[LogActor] Completed

      See also: find, AbstractOperator, InferableOperator, ProxyObservable, logger

      source

      Description

      It's like find, but emits the index of the found value, not the value itself.

      See also

      Operators, take

      diff --git a/v1.7.3/operators/filtering/first/index.html b/v1.7.3/operators/filtering/first/index.html new file mode 100644 index 000000000..117accf61 --- /dev/null +++ b/v1.7.3/operators/filtering/first/index.html @@ -0,0 +1,11 @@ + +first · Rocket.jl

      First operator

      Base.firstFunction
      first(; default = nothing)

      Creates a first operator, which returns an Observable that emits only the first value emitted by the source Observable. Sends FirstNotFoundException error message if a given source completes without emitting a single value.

      Arguments

      • default: an optional default value to provide if no values were emitted

      Producing

      Stream of type <: Subscribable{L} where L refers to type of source stream

      Examples

      using Rocket
      +
      +source       = from(1:100)
      +subscription = subscribe!(source |> first(), logger())
      +;
      +
      +# output
      +
      +[LogActor] Data: 1
      +[LogActor] Completed

      See also: take, logger

      source

      Description

      An alias for take(1) operator.

      See also

      Operators, take

      diff --git a/v1.7.3/operators/filtering/ignore/index.html b/v1.7.3/operators/filtering/ignore/index.html new file mode 100644 index 000000000..1c31feab1 --- /dev/null +++ b/v1.7.3/operators/filtering/ignore/index.html @@ -0,0 +1,14 @@ + +ignore · Rocket.jl

      Ignore operator

      Rocket.ignoreFunction
      ignore(count::Int)

      Creates a ignore operator, which returns an Observable that skips the first count items emitted by the source Observable.

      Arguments

      • count::Int: the number of times, items emitted by source Observable should be skipped.

      Producing

      Stream of type <: Subscribable{L} where L refers to type of source stream

      Examples

      using Rocket
      +
      +source = from(1:5)
      +
      +subscribe!(source |> ignore(2), logger())
      +;
      +
      +# output
      +
      +[LogActor] Data: 3
      +[LogActor] Data: 4
      +[LogActor] Data: 5
      +[LogActor] Completed

      See also: AbstractOperator, InferableOperator, ProxyObservable, logger

      source

      See also

      Operators

      diff --git a/v1.7.3/operators/filtering/last/index.html b/v1.7.3/operators/filtering/last/index.html new file mode 100644 index 000000000..a73cf1d22 --- /dev/null +++ b/v1.7.3/operators/filtering/last/index.html @@ -0,0 +1,30 @@ + +last · Rocket.jl

      Last Operator

      Base.lastFunction
      last(; default = nothing)

      Creates a last operator, which returns an Observable that emits only the last item emitted by the source Observable. Sends LastNotFoundException error message if a given source completes without emitting a single value.

      Arguments

      • default: an optional default value to provide if no values were emitted

      Producing

      Stream of type <: Subscribable{L} where L refers to type of source stream

      Examples

      using Rocket
      +
      +source = from([ 1, 2, 3 ])
      +subscribe!(source |> last(), logger())
      +;
      +
      +# output
      +
      +[LogActor] Data: 3
      +[LogActor] Completed
      +
      using Rocket
      +
      +source = from(Int[])
      +subscribe!(source |> last() |> catch_error((err, obs) -> of(1)), logger())
      +;
      +
      +# output
      +
      +[LogActor] Data: 1
      +[LogActor] Completed
      using Rocket
      +
      +source = from(Int[])
      +subscribe!(source |> last(default = 1), logger())
      +;
      +
      +# output
      +
      +[LogActor] Data: 1
      +[LogActor] Completed

      See also: AbstractOperator, InferableOperator, ProxyObservable, logger

      source

      Description

      last operator returns an Observable that emits only the last item emitted by the source Observable.

      See also

      Operators

      diff --git a/v1.7.3/operators/filtering/some/index.html b/v1.7.3/operators/filtering/some/index.html new file mode 100644 index 000000000..12a1222d8 --- /dev/null +++ b/v1.7.3/operators/filtering/some/index.html @@ -0,0 +1,13 @@ + +some · Rocket.jl

      Some Operator

      Rocket.someFunction
      some()

      Creates a some operator, which filters out nothing items by the source Observable by emitting only those that not equal to nothing.

      Producing

      Stream of type <: Subscribable{L} where L refers to type of source stream <: Subscribable{Union{L, Nothing}}

      Examples

      using Rocket
      +
      +source = from([ 1, nothing, 3 ])
      +subscribe!(source |> some(), logger())
      +;
      +
      +# output
      +
      +[LogActor] Data: 1
      +[LogActor] Data: 3
      +[LogActor] Completed
      +

      See also: AbstractOperator, InferableOperator, ProxyObservable, max, min, logger

      source

      Description

      This operator takes values from the source Observable and only emits those values that are not nothing.

      See also

      Operators, filter

      diff --git a/v1.7.3/operators/filtering/take/index.html b/v1.7.3/operators/filtering/take/index.html new file mode 100644 index 000000000..1f0f4bd02 --- /dev/null +++ b/v1.7.3/operators/filtering/take/index.html @@ -0,0 +1,16 @@ + +take · Rocket.jl

      Take Operator

      Rocket.takeFunction
      take(maxcount::Int)

      Creates a take operator, which returns an Observable that emits only the first maxcount values emitted by the source Observable.

      Arguments

      • maxcount::Int: the maximum number of next values to emit.

      Producing

      Stream of type <: Subscribable{L} where L refers to type of source stream

      Examples

      using Rocket
      +
      +source = from([ i for i in 1:100 ])
      +
      +subscribe!(source |> take(5), logger())
      +;
      +
      +# output
      +
      +[LogActor] Data: 1
      +[LogActor] Data: 2
      +[LogActor] Data: 3
      +[LogActor] Data: 4
      +[LogActor] Data: 5
      +[LogActor] Completed

      See also: AbstractOperator, InferableOperator, ProxyObservable, logger

      source

      Description

      take returns an Observable that emits only the first count values emitted by the source Observable. If the source emits fewer than count values, then all of its values are emitted. Afterwards, the Observable completes regardless of whether the source completed.

      See also

      Operators

      diff --git a/v1.7.3/operators/filtering/take_until/index.html b/v1.7.3/operators/filtering/take_until/index.html new file mode 100644 index 000000000..8199c0079 --- /dev/null +++ b/v1.7.3/operators/filtering/take_until/index.html @@ -0,0 +1,32 @@ + +take_until · Rocket.jl

      TakeUntil Operator

      Rocket.take_untilFunction
      take_until(notifier::S)

      Creates a take operator, which returns an Observable that emits the values emitted by the source Observable until a notifier Observable emits a value or a completion event.

      Arguments

      • notifier::S: The Observable whose first emitted value will cause the output Observable of take_until to stop emitting values from the source Observable.

      Producing

      Stream of type <: Subscribable{L} where L refers to type of source stream

      Examples

      using Rocket
      +
      +source = interval(100) |> take_until(timer(1000))
      +
      +subscribe!(source, logger())
      +;
      +
      +# output
      +
      +[LogActor] Data: 0
      +[LogActor] Data: 1
      +[LogActor] Data: 2
      +[LogActor] Data: 3
      +[LogActor] Data: 4
      +[LogActor] Data: 5
      +[LogActor] Data: 6
      +[LogActor] Data: 7
      +[LogActor] Data: 8
      +[LogActor] Completed
      using Rocket 
      +
      +source = interval(100)
      +
      +subscribe!(source |> take_until(source |> filter(i -> i == 3)), logger())
      +;
      +
      +# output 
      +
      +[LogActor] Data: 0
      +[LogActor] Data: 1
      +[LogActor] Data: 2
      +[LogActor] Completed

      See also: AbstractOperator, InferableOperator, ProxyObservable, logger

      source

      Description

      take_until subscribes and begins mirroring the source Observable. It also monitors a second Observable, notifier that you provide. If the notifier emits a value, the output Observable stops mirroring the source Observable and completes. If the notifier doesn't emit any value and completes then take_until also completes.

      See also

      Operators

      diff --git a/v1.7.3/operators/join/about/index.html b/v1.7.3/operators/join/about/index.html new file mode 100644 index 000000000..fffb89d59 --- /dev/null +++ b/v1.7.3/operators/join/about/index.html @@ -0,0 +1,2 @@ + +Join category · Rocket.jl

      Join category

      There are operators for different purposes, and they may be categorized as: creation, transformation, filtering, joining, multicasting, error handling, utility, etc. In the following list you will find all the operators organized in join category.

      See also

      Operators

      diff --git a/v1.7.3/operators/join/with_latest/index.html b/v1.7.3/operators/join/with_latest/index.html new file mode 100644 index 000000000..105192285 --- /dev/null +++ b/v1.7.3/operators/join/with_latest/index.html @@ -0,0 +1,11 @@ + +with_latest · Rocket.jl

      WithLatest Operator

      Rocket.with_latestFunction
      with_latest(sources...)

      Creates a with_latest operator, which combines the source Observable with other Observables to create an Observable whose values are calculated from the latest values of each, only when the source emits.

      Examples

      using Rocket
      +
      +source = of(1)
      +subscribe!(source |> with_latest(from(1:5)), logger())
      +;
      +
      +# output
      +
      +[LogActor] Data: (1, 5)
      +[LogActor] Completed

      See also: AbstractOperator, InferableOperator

      source

      See also

      Operators

      diff --git a/v1.7.3/operators/mathematical/about/index.html b/v1.7.3/operators/mathematical/about/index.html new file mode 100644 index 000000000..b7c438298 --- /dev/null +++ b/v1.7.3/operators/mathematical/about/index.html @@ -0,0 +1,2 @@ + +About mathematical operators · Rocket.jl
      diff --git a/v1.7.3/operators/mathematical/count/index.html b/v1.7.3/operators/mathematical/count/index.html new file mode 100644 index 000000000..d5fc39ca9 --- /dev/null +++ b/v1.7.3/operators/mathematical/count/index.html @@ -0,0 +1,20 @@ + +count · Rocket.jl

      Count Operator

      Base.countFunction
      count()

      Creates a count operator, which counts the number of emissions on the source and emits that number when the source completes.

      Producing

      Stream of type <: Subscribable{Int}

      Examples

      using Rocket
      +
      +source = from([ i for i in 1:42 ])
      +subscribe!(source |> count(), logger())
      +;
      +
      +# output
      +
      +[LogActor] Data: 42
      +[LogActor] Completed
      +

      See also: AbstractOperator, RightTypedOperator, ProxyObservable, logger

      source

      Description

      count transforms an Observable that emits values into an Observable that emits a single value that represents the number of values emitted by the source Observable. If the source Observable terminates with an error, count will pass this error notification along without emitting a value first. If the source Observable does not terminate at all, count will neither emit a value nor terminate.

      Example

      Counts how many values source Observable have emitted before the complete event happened

      using Rocket
      +
      +source = from([ i for i in 1:42 ])
      +subscribe!(source |> count(), logger())
      +
      +# output
      +
      +[LogActor] Data: 42
      +[LogActor] Completed

      See also

      Operators

      diff --git a/v1.7.3/operators/mathematical/max/index.html b/v1.7.3/operators/mathematical/max/index.html new file mode 100644 index 000000000..86112d272 --- /dev/null +++ b/v1.7.3/operators/mathematical/max/index.html @@ -0,0 +1,12 @@ + +max · Rocket.jl

      Max Operator

      Base.maxFunction
      max(; from = nothing)

      Creates a max operator, which emits a single item: the item with the largest value.

      Arguments

      • from: optional initial maximum value, if nothing first item from the source will be used as initial instead

      Producing

      Stream of type <: Subscribable{Union{L, Nothing}} where L refers to type of source stream

      Examples

      using Rocket
      +
      +source = from([ i for i in 1:42 ])
      +subscribe!(source |> max(), logger())
      +;
      +
      +# output
      +
      +[LogActor] Data: 42
      +[LogActor] Completed
      +

      See also: AbstractOperator, InferableOperator, ProxyObservable, logger

      source

      Description

      The max operator operates on an Observable of similar objects. When the source Observable completes, it emits the item with the largest value.

      See also

      Operators

      diff --git a/v1.7.3/operators/mathematical/min/index.html b/v1.7.3/operators/mathematical/min/index.html new file mode 100644 index 000000000..eee3e1572 --- /dev/null +++ b/v1.7.3/operators/mathematical/min/index.html @@ -0,0 +1,12 @@ + +min · Rocket.jl

      Min Operator

      Base.minFunction
      min(; from = nothing)

      Creates a min operator, which emits a single item: the item with the smallest value.

      Arguments

      • from: optional initial minimal value, if nothing first item from the source will be used as initial instead

      Producing

      Stream of type <: Subscribable{Union{L, Nothing}} where L refers to type of source stream

      Examples

      using Rocket
      +
      +source = from([ i for i in 1:42 ])
      +subscribe!(source |> min(), logger())
      +;
      +
      +# output
      +
      +[LogActor] Data: 1
      +[LogActor] Completed
      +

      See also: AbstractOperator, InferableOperator, ProxyObservable, logger

      source

      Description

      The min operator operates on an Observable of similar objects. When source Observable completes, it emits the item with the smallest value.

      See also

      Operators

      diff --git a/v1.7.3/operators/mathematical/reduce/index.html b/v1.7.3/operators/mathematical/reduce/index.html new file mode 100644 index 000000000..eed7bb531 --- /dev/null +++ b/v1.7.3/operators/mathematical/reduce/index.html @@ -0,0 +1,23 @@ + +reduce · Rocket.jl

      Reduce Operator

      Base.reduceFunction
      reduce(::Type{R}, reduceFn::Function, seed::R) where R
      +reduce(reduceFn::F) where { F <: Function }

      Creates a reduce operator, which applies a given accumulator reduceFn function over the source Observable, and returns the accumulated result when the source completes, given an optional seed value. If a seed value is specified, then that value will be used as the initial value for the accumulator. If no seed value is specified, the first item of the source is used as the seed.

      Arguments

      • ::Type{R}: the type of data of transformed value
      • reduceFn::Function: transformation function with (data::T, current::R) -> R signature
      • seed::R: optional seed accumulation value

      Producing

      Stream of type <: Subscribable{R}

      Examples

      using Rocket
      +
      +source = from([ i for i in 1:10 ])
      +subscribe!(source |> reduce(Vector{Int}, (d, c) -> [ c..., d ], Int[]), logger())
      +;
      +
      +# output
      +
      +[LogActor] Data: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
      +[LogActor] Completed
      +
      using Rocket
      +
      +source = from([ i for i in 1:42 ])
      +subscribe!(source |> reduce(+), logger())
      +;
      +
      +# output
      +
      +[LogActor] Data: 903
      +[LogActor] Completed
      +

      See also: AbstractOperator, RightTypedOperator, ProxyObservable, logger

      source

      Description

      reduce applies an accumulator function to each value of the source Observable (from the past) and reduces it to a single value that is emitted by the output Observable. Note that reduce will only emit one value, only when the source Observable completes. It is equivalent to applying scan followed by last.

      It returns an Observable that applies a specified accumulator function to each item emitted by the source Observable. If a seed value is specified, then that value will be used as the initial value of the accumulator. If no seed value is specified, the first item of the source is used as the seed.

      See also

      Operators, scan, last

      diff --git a/v1.7.3/operators/mathematical/sum/index.html b/v1.7.3/operators/mathematical/sum/index.html new file mode 100644 index 000000000..3d03fc57d --- /dev/null +++ b/v1.7.3/operators/mathematical/sum/index.html @@ -0,0 +1,22 @@ + +sum · Rocket.jl

      Sum Operator

      Base.sumFunction
      sum(; from = nothing)

      Creates a sum operator, which applies a sum accumulator function over the source Observable, and returns the accumulated result when the source completes, given an optional initial value.

      The sum operator is similar to reduce(T, T, +) (see reduce).

      Arguments

      • from: optional initial accumulation value, if nothing first value will be used instead

      Producing

      Stream of type <: Subscribable{L} where L refers to type of source stream

      Examples

      using Rocket
      +
      +source = from([ i for i in 1:42 ])
      +subscribe!(source |> sum(), logger())
      +;
      +
      +# output
      +
      +[LogActor] Data: 903
      +[LogActor] Completed
      +
      using Rocket
      +
      +source = from([ i for i in 1:42 ])
      +subscribe!(source |> sum(from = 97), logger())
      +;
      +
      +# output
      +
      +[LogActor] Data: 1000
      +[LogActor] Completed
      +

      See also: AbstractOperator, InferableOperator, ProxyObservable, reduce, logger

      source

      Description

      sum operates on an Observable of objects on which + is defined. When the source Observable completes, it emits the sum of all previous items. The sum operator is similar to reduce(T, T, +) (see reduce).

      See also

      Operators, reduce

      diff --git a/v1.7.3/operators/multicasting/about/index.html b/v1.7.3/operators/multicasting/about/index.html new file mode 100644 index 000000000..b2f7c8752 --- /dev/null +++ b/v1.7.3/operators/multicasting/about/index.html @@ -0,0 +1,2 @@ + +About multicasting operators · Rocket.jl
      diff --git a/v1.7.3/operators/multicasting/multicast/index.html b/v1.7.3/operators/multicasting/multicast/index.html new file mode 100644 index 000000000..009546c39 --- /dev/null +++ b/v1.7.3/operators/multicasting/multicast/index.html @@ -0,0 +1,33 @@ + +multicast · Rocket.jl

      Multicast Operator

      Rocket.multicastFunction
      multicast(subject::S) where S
      +multicast(factory::F) where { F <: AbstractSubjectFactory }

      The multicast()operator takes a Subject and uses it to share the source execution. It returns what’s known as aConnectableObservable`, which has a connect() method. It has one simple job - subscribes to the source with the provided subject.

      Example

      using Rocket
      +
      +subject = Subject(Int)
      +source  = from(1:5) |> multicast(subject)
      +
      +actor1 = logger("1")
      +actor2 = logger("2")
      +
      +subscription1 = subscribe!(source, actor1)
      +subscription2 = subscribe!(source, actor2)
      +
      +connect(source)
      +
      +unsubscribe!(subscription1)
      +unsubscribe!(subscription2)
      +;
      +
      +# output
      +
      +[1] Data: 1
      +[2] Data: 1
      +[1] Data: 2
      +[2] Data: 2
      +[1] Data: 3
      +[2] Data: 3
      +[1] Data: 4
      +[2] Data: 4
      +[1] Data: 5
      +[2] Data: 5
      +[1] Completed
      +[2] Completed

      See also: ConnectableObservable, Subject, share, publish

      source

      See also

      Operators

      diff --git a/v1.7.3/operators/multicasting/publish/index.html b/v1.7.3/operators/multicasting/publish/index.html new file mode 100644 index 000000000..82dcf989a --- /dev/null +++ b/v1.7.3/operators/multicasting/publish/index.html @@ -0,0 +1,2 @@ + +publish · Rocket.jl

      Publish Operators

      See also

      Operators

      diff --git a/v1.7.3/operators/multicasting/share/index.html b/v1.7.3/operators/multicasting/share/index.html new file mode 100644 index 000000000..5f4cbccd9 --- /dev/null +++ b/v1.7.3/operators/multicasting/share/index.html @@ -0,0 +1,2 @@ + +share · Rocket.jl

      Share Operators

      See also

      Operators

      diff --git a/v1.7.3/operators/transformation/about/index.html b/v1.7.3/operators/transformation/about/index.html new file mode 100644 index 000000000..3c06ba1c4 --- /dev/null +++ b/v1.7.3/operators/transformation/about/index.html @@ -0,0 +1,2 @@ + +About transformation operators · Rocket.jl
      diff --git a/v1.7.3/operators/transformation/accumulated/index.html b/v1.7.3/operators/transformation/accumulated/index.html new file mode 100644 index 000000000..ee4e205c7 --- /dev/null +++ b/v1.7.3/operators/transformation/accumulated/index.html @@ -0,0 +1,23 @@ + +accumulated · Rocket.jl

      Accumulated Operator

      Rocket.accumulatedFunction
      accumulated()

      Creates an accumulated operator, which returns an Observable that emits the current item with all of the previous items emitted by the source Observable in one single ordered array.

      Producing

      Stream of type <: Subscribable{Vector{L}} where L refers to type of source stream

      Examples

      using Rocket
      +
      +source = from([ 1, 2, 3 ])
      +subscribe!(source |> accumulated(), logger())
      +;
      +
      +# output
      +
      +[LogActor] Data: [1]
      +[LogActor] Data: [1, 2]
      +[LogActor] Data: [1, 2, 3]
      +[LogActor] Completed
      +
      using Rocket
      +
      +source = of(1)
      +subscribe!(source |> accumulated(), logger())
      +;
      +
      +# output
      +
      +[LogActor] Data: [1]
      +[LogActor] Completed

      See also: AbstractOperator, InferableOperator, ProxyObservable, logger

      source

      Description

      Combines all values emitted by the source, using an accumulator function that joins a new source value with the all past values emmited into one single array. This is similar to scan with vcat accumulation function.

      See also

      Operators

      diff --git a/v1.7.3/operators/transformation/concat_map/index.html b/v1.7.3/operators/transformation/concat_map/index.html new file mode 100644 index 000000000..e4ccf0b55 --- /dev/null +++ b/v1.7.3/operators/transformation/concat_map/index.html @@ -0,0 +1,16 @@ + +concat_map · Rocket.jl

      ConcatMap Operator

      Rocket.concat_mapFunction
      concat_map(::Type{R}, mappingFn::F = identity) where { R, F <: Function }

      Creates a concat_map operator, which returns an Observable that emits the result of applying the projection function to each item emitted by the source Observable and taking values from each projected inner Observable sequentially. Essentialy it projects each source value to an Observable which is merged in the output Observable, in a serialized fashion waiting for each one to complete before merging the next.

      Arguments

      • ::Type{R}: the type of data of output Observables after projection with mappingFn
      • mappingFn::F: projection function with (data) -> Observable{R} signature

      Producing

      Stream of type <: Subscribable{R}

      Examples

      using Rocket
      +
      +source = from([ 0, 0 ]) |> concat_map(Int, d -> from([ 1, 2, 3 ], scheduler = AsyncScheduler(0)))
      +subscribe!(source, logger())
      +;
      +
      +# output
      +
      +[LogActor] Data: 1
      +[LogActor] Data: 2
      +[LogActor] Data: 3
      +[LogActor] Data: 1
      +[LogActor] Data: 2
      +[LogActor] Data: 3
      +[LogActor] Completed

      See also: AbstractOperator, RightTypedOperator, ProxyObservable, logger

      source

      Description

      Returns an Observable that emits items based on applying a function that you supply to each item emitted by the source Observable, where that function returns an (so-called "inner") Observable. Each new inner Observable is concatenated with the previous inner Observable.

      Warning

      If source values arrive endlessly and faster than their corresponding inner Observables can complete, it will result in memory issues as inner Observables amass in an unbounded buffer waiting for their turn to be subscribed to.

      Note

      concat_map is equivalent to merge_map with concurrency parameter set to 1.

      See also

      Operators, merge_map

      diff --git a/v1.7.3/operators/transformation/concat_map_to/index.html b/v1.7.3/operators/transformation/concat_map_to/index.html new file mode 100644 index 000000000..1ee2bca90 --- /dev/null +++ b/v1.7.3/operators/transformation/concat_map_to/index.html @@ -0,0 +1,19 @@ + +concat_map_to · Rocket.jl

      ConcatMapTo Operator

      Rocket.concat_map_toFunction
      switch_map_to(inner_observable)

      Creates a switch_map_to operator, which returns an observable of values merged together by joining the passed observable with itself, one after the other, for each value emitted from the source. Essentially it projects each source value to the same Observable which is merged multiple times in a serialized fashion on the output Observable.

      Arguments

      • inner_observable: an Observable to replace each value from the source Observable.

      Producing

      Stream of type <: Subscribable{R} where R refers to the eltype of inner_observable

      Examples

      using Rocket
      +
      +source = from([ 0, 0, 0 ])
      +subscribe!(source |> concat_map_to(from([ 1, 2, 3 ])), logger())
      +;
      +
      +# output
      +
      +[LogActor] Data: 1
      +[LogActor] Data: 2
      +[LogActor] Data: 3
      +[LogActor] Data: 1
      +[LogActor] Data: 2
      +[LogActor] Data: 3
      +[LogActor] Data: 1
      +[LogActor] Data: 2
      +[LogActor] Data: 3
      +[LogActor] Completed

      See also: concat_map, AbstractOperator, RightTypedOperator, ProxyObservable, logger

      source
      Note

      concat_map_to is equivalent to concat_map with mappingFn set to (_) -> inner_observable.

      See also

      Operators, concat_map

      diff --git a/v1.7.3/operators/transformation/enumerate/index.html b/v1.7.3/operators/transformation/enumerate/index.html new file mode 100644 index 000000000..ea40d4559 --- /dev/null +++ b/v1.7.3/operators/transformation/enumerate/index.html @@ -0,0 +1,27 @@ + +enumerate · Rocket.jl

      Enumerate Operator

      Base.Iterators.enumerateFunction
      enumerate()

      Creates an enumerate operator, which converts each value emitted by the source Observable into a tuple of its order number and the value itself.

      The enumerate operator is similar to scan(Tuple{Int, Int}, (d, c) -> (d, c[2] + 1), (0, 0)) (see scan).

      Producing

      Stream of type <: Subscribable{Tuple{Int, L}} where L refers to type of source stream

      Examples

      using Rocket
      +
      +source = from([ 0 for _ in 1:3 ])
      +subscribe!(source |> enumerate(), logger())
      +;
      +
      +# output
      +
      +[LogActor] Data: (1, 0)
      +[LogActor] Data: (2, 0)
      +[LogActor] Data: (3, 0)
      +[LogActor] Completed
      +

      See also: AbstractOperator, InferableOperator, ProxyObservable, scan, map, logger

      source

      Description

      enumerate returns an Observable that converts each value emitted by the source Observable into a tuple of its order number and the value itself.

      Example

      Get a value from the source with its order number

      using Rocket
      +
      +source = from([ 0.0, 0.2, 0.4, 0.6, 0.8, 1.0 ])
      +subscribe!(source |> enumerate(), logger())
      +
      +# output
      +
      +[LogActor] Data: (0.0, 1)
      +[LogActor] Data: (0.2, 2)
      +[LogActor] Data: (0.4, 3)
      +[LogActor] Data: (0.6, 4)
      +[LogActor] Data: (0.8, 5)
      +[LogActor] Data: (1.0, 6)
      +[LogActor] Completed

      See also

      Operators, scan

      diff --git a/v1.7.3/operators/transformation/exhaust_map/index.html b/v1.7.3/operators/transformation/exhaust_map/index.html new file mode 100644 index 000000000..e8822befa --- /dev/null +++ b/v1.7.3/operators/transformation/exhaust_map/index.html @@ -0,0 +1,12 @@ + +exhaust_map · Rocket.jl

      ExhaustMap Operator

      Rocket.exhaust_mapFunction
      exhaust_map(::Type{R}, mappingFn::F = identity) where { R, F <: Function }

      Creates a exhaust_map operator, which returns an Observable containing projected Observables of each item of the source, ignoring projected Observables that start before their preceding Observable has completed. Essentially it projects each source value to an Observable which is merged in the output Observable only if the previous projected Observable has completed.

      Arguments

      • ::Type{R}: the type of data of output Observables after projection with mappingFn
      • mappingFn::F: projection function with (data) -> Observable{R} signature

      Producing

      Stream of type <: Subscribable{R}

      Examples

      using Rocket
      +
      +source = from([ 0, 0 ]) |> async() |> exhaust_map(Int, d -> from([ 1, 2 ]) |> async())
      +subscribe!(source, logger())
      +;
      +
      +# output
      +
      +[LogActor] Data: 1
      +[LogActor] Data: 2
      +[LogActor] Completed

      See also: AbstractOperator, RightTypedOperator, ProxyObservable, logger

      source

      See also

      Operators

      diff --git a/v1.7.3/operators/transformation/lowercase/index.html b/v1.7.3/operators/transformation/lowercase/index.html new file mode 100644 index 000000000..e5beed5bf --- /dev/null +++ b/v1.7.3/operators/transformation/lowercase/index.html @@ -0,0 +1,11 @@ + +lowercase · Rocket.jl

      Lowercase Operator

      Base.Unicode.lowercaseFunction
      lowercase()

      Creates an lowercase operator, which forces each value to be in lower case

      Producing

      Stream of type <: Subscribable{L} where L referes to type of data of input Observable

      Examples

      using Rocket
      +
      +source = of("Hello, world!")
      +subscribe!(source |> lowercase(), logger())
      +;
      +
      +# output
      +
      +[LogActor] Data: hello, world!
      +[LogActor] Completed

      See also: AbstractOperator, InferableOperator, ProxyObservable, logger

      source

      See also

      Operators, map, uppercase

      diff --git a/v1.7.3/operators/transformation/map/index.html b/v1.7.3/operators/transformation/map/index.html new file mode 100644 index 000000000..4edceb5e1 --- /dev/null +++ b/v1.7.3/operators/transformation/map/index.html @@ -0,0 +1,75 @@ + +map · Rocket.jl

      Map Operator

      Base.mapFunction
      map(::Type{R}, mappingFn::F) where { F <: Function }

      Creates a map operator, which applies a given mappingFn to each value emmited by the source Observable, and emits the resulting values as an Observable. You have to specify output R type after mappingFn projection.

      Arguments

      • ::Type{R}: the type of data of transformed value, may be or may not be the same as source type
      • mappingFn::Function: transformation function with (data::L) -> R signature, where L is type of data in input source

      Producing

      Stream of type <: Subscribable{R}

      Examples

      using Rocket
      +
      +source = from([ 1, 2, 3 ])
      +subscribe!(source |> map(Int, (d) -> d ^ 2), logger())
      +;
      +
      +# output
      +
      +[LogActor] Data: 1
      +[LogActor] Data: 4
      +[LogActor] Data: 9
      +[LogActor] Completed

      See also: AbstractOperator, RightTypedOperator, ProxyObservable, logger

      source

      Description

      The map operator, similar to map(f, array), applies a function to each value from the source. It's important to note that the function f is expected to be pure and without any side effects. The map operator is designed to create a copy of the original observable for each new subscriber. It independently executes the f function for each subscriber and doesn't share the resulting value. This might be inconvenient when f involves complex calculations or side effects.

      using Rocket
      +
      +function f(x)
      +    println("Function `f` called") # Assume heavy calculations or side-effects
      +    return x + 1
      +end
      +
      +subject = Subject(Int)
      +
      +mapped = subject |> map(Int, f)
      +
      +subscription1 = subscribe!(mapped, logger())
      +subscription2 = subscribe!(mapped, logger())
      +
      +next!(subject, 1)
      +
      +unsubscribe!(subscription1)
      +unsubscribe!(subscription2)
      Function `f` called
      +[LogActor] Data: 2
      +Function `f` called
      +[LogActor] Data: 2

      In the example, you'll observe that "Function f called" is displayed twice. This happens because each subscriber receives their individual, distinct version of the modified data. To alter this behavior, one can utilize the share() operator. This operator creates only a single copy of the modified observable and shares the computed results.

      mapped_and_shared = mapped |> share()
      +
      +subscription1 = subscribe!(mapped_and_shared, logger())
      +subscription2 = subscribe!(mapped_and_shared, logger())
      +
      +next!(subject, 1)
      +
      +unsubscribe!(subscription1)
      +unsubscribe!(subscription2)
      Function `f` called
      +[LogActor] Data: 2
      +[LogActor] Data: 2

      In this example, "Function f called" appears only once, and the computed value is shared between the two subscribers. Note, however, that this behaviour might be confusing in cases where the first subscribers completes the observable till its completion stage. For example:

      mapped_and_shared = from([ 0, 1, 2 ]) |> map(Int, f) |> share()
      +
      +subscription1 = subscribe!(mapped_and_shared, logger())
      +subscription2 = subscribe!(mapped_and_shared, logger())
      +
      +unsubscribe!(subscription1)
      +unsubscribe!(subscription2)
      Function `f` called
      +[LogActor] Data: 1
      +Function `f` called
      +[LogActor] Data: 2
      +Function `f` called
      +[LogActor] Data: 3
      +[LogActor] Completed
      +[LogActor] Completed

      In this scenario, the second subscriber doesn't receive any values because the first subscriber exhausts the single shared observable. Once the shared observable is used up, it doesn't produce any further values. This doesn't occur without the share() operator.

      mapped = from([ 0, 1, 2 ]) |> map(Int, f)
      +
      +subscription1 = subscribe!(mapped, logger())
      +subscription2 = subscribe!(mapped, logger())
      +
      +unsubscribe!(subscription1)
      +unsubscribe!(subscription2)
      Function `f` called
      +[LogActor] Data: 1
      +Function `f` called
      +[LogActor] Data: 2
      +Function `f` called
      +[LogActor] Data: 3
      +[LogActor] Completed
      +Function `f` called
      +[LogActor] Data: 1
      +Function `f` called
      +[LogActor] Data: 2
      +Function `f` called
      +[LogActor] Data: 3
      +[LogActor] Completed

      See also

      Operators

      diff --git a/v1.7.3/operators/transformation/map_to/index.html b/v1.7.3/operators/transformation/map_to/index.html new file mode 100644 index 000000000..c04a33470 --- /dev/null +++ b/v1.7.3/operators/transformation/map_to/index.html @@ -0,0 +1,13 @@ + +map_to · Rocket.jl

      MapTo Operator

      Rocket.map_toFunction
      map_to(value::T) where T

      Creates a map operator, which emits the given constant value on the output Observable every time the source Observable emits a value.

      Arguments

      • value::T: the constant value to map each source value to

      Producing

      Stream of type <: Subscribable{T}

      Examples

      using Rocket
      +
      +source = from([ 1, 2, 3 ])
      +subscribe!(source |> map_to('a'), logger())
      +;
      +
      +# output
      +
      +[LogActor] Data: a
      +[LogActor] Data: a
      +[LogActor] Data: a
      +[LogActor] Completed

      See also: map, AbstractOperator, RightTypedOperator, ProxyObservable, logger

      source

      Description

      Takes a constant value as argument, and emits that whenever the source Observable emits a value. In other words, ignores the actual source value, and simply uses the emission moment to know when to emit the given value.

      See also

      Operators

      diff --git a/v1.7.3/operators/transformation/merge_map/index.html b/v1.7.3/operators/transformation/merge_map/index.html new file mode 100644 index 000000000..8a785e61c --- /dev/null +++ b/v1.7.3/operators/transformation/merge_map/index.html @@ -0,0 +1,16 @@ + +merge_map · Rocket.jl

      MergeMap Operator

      Rocket.merge_mapFunction
      merge_map(::Type{R}, mappingFn::F = identity; concurrent::Int = typemax(Int)) where { R, F <: Function }

      Creates a merge_map operator, which returns an Observable that emits the result of applying the projection function mappingFn to each item emitted by the source Observable and merging the results of the Observables obtained from this transformation.

      Arguments

      • ::Type{R}: the type of data of output Observables after projection with mappingFn
      • mappingFn::F: projection function with (data) -> Observable{R} signature
      • concurrent::Int: optional, default is typemax(Int), maximum number of input Observables being subscribed to concurrently

      Producing

      Stream of type <: Subscribable{R}

      Examples

      using Rocket
      +
      +source = from([ 0, 0 ]) |> merge_map(Int, d -> from([ 1, 2, 3 ], scheduler = AsyncScheduler(0)))
      +subscribe!(source, logger())
      +;
      +
      +# output
      +
      +[LogActor] Data: 1
      +[LogActor] Data: 1
      +[LogActor] Data: 2
      +[LogActor] Data: 2
      +[LogActor] Data: 3
      +[LogActor] Data: 3
      +[LogActor] Completed

      See also: AbstractOperator, RightTypedOperator, ProxyObservable, logger

      source

      See also

      Operators

      diff --git a/v1.7.3/operators/transformation/override/index.html b/v1.7.3/operators/transformation/override/index.html new file mode 100644 index 000000000..a195003fc --- /dev/null +++ b/v1.7.3/operators/transformation/override/index.html @@ -0,0 +1,33 @@ + +override · Rocket.jl

      Override Operator

      Rocket.overrideFunction
      override(handler::OverrideHandler)

      Creates an override operator that overrides each emission from source observable with value provided in handler. If handler contains nothing source observable emits as usual. For constant override see map_to. Use Rocket.setvalue! to set new value for handler.

      Producing

      Stream of type <: Subscribable{Union{L, T}} where L refers to the type of source stream and T referes to the type of handler's value

      Examples

      using Rocket 
      +
      +subject = Subject(Int)
      +handler = OverrideHandler(Int, -1)
      +
      +source = subject |> override(handler)
      +
      +subscription = subscribe!(source, logger())
      +
      +next!(subject, 1)
      +next!(subject, 2)
      +
      +Rocket.setvalue!(handler, nothing)
      +
      +next!(subject, 3)
      +next!(subject, 4)
      +
      +Rocket.setvalue!(handler, -2)
      +
      +next!(subject, 5)
      +next!(subject, 6)
      +
      +unsubscribe!(subscription)
      +
      +# output
      +[LogActor] Data: -1
      +[LogActor] Data: -1
      +[LogActor] Data: 3
      +[LogActor] Data: 4
      +[LogActor] Data: -2
      +[LogActor] Data: -2

      See also: OverrideHandler

      source

      See also

      Operators

      diff --git a/v1.7.3/operators/transformation/pairwise/index.html b/v1.7.3/operators/transformation/pairwise/index.html new file mode 100644 index 000000000..722fb90ef --- /dev/null +++ b/v1.7.3/operators/transformation/pairwise/index.html @@ -0,0 +1,29 @@ + +pairwise · Rocket.jl

      Pairwise Operator

      Rocket.pairwiseFunction
      pairwise([ initial ])

      Creates a pairwise operator, which groups pairs of consecutive emissions together and emits them as a tuple of two values. Accepts optional initial seed value to start pairing from.

      using Rocket
      +
      +source = from(1:5) |> pairwise()
      +
      +subscribe!(source, logger())
      +;
      +
      +# output
      +
      +[LogActor] Data: (1, 2)
      +[LogActor] Data: (2, 3)
      +[LogActor] Data: (3, 4)
      +[LogActor] Data: (4, 5)
      +[LogActor] Completed
      using Rocket
      +
      +source = from(1:5) |> pairwise(0)
      +
      +subscribe!(source, logger())
      +;
      +
      +# output
      +
      +[LogActor] Data: (0, 1)
      +[LogActor] Data: (1, 2)
      +[LogActor] Data: (2, 3)
      +[LogActor] Data: (3, 4)
      +[LogActor] Data: (4, 5)
      +[LogActor] Completed

      See also: AbstractOperator, InferableOperator, logger

      source

      See also

      Operators

      diff --git a/v1.7.3/operators/transformation/scan/index.html b/v1.7.3/operators/transformation/scan/index.html new file mode 100644 index 000000000..13ddb434c --- /dev/null +++ b/v1.7.3/operators/transformation/scan/index.html @@ -0,0 +1,27 @@ + +scan · Rocket.jl

      Scan Operator

      Rocket.scanFunction
      scan(::Type{R}, scanFn::F, seed::R) where { R, F <: Function }
      +scan(scanFn::F) where { F <: Function }

      Creates a scan operator, which applies a given accumulator scanFn function to each value emmited by the source Observable, and returns each intermediate result with an optional seed value. If a seed value is specified, then that value will be used as the initial value for the accumulator. If no seed value is specified, the first item of the source is used as the seed.

      Arguments

      • ::Type{R}: the type of data of transformed value, may be or may not be the same as type of input source
      • scanFn::Function: accumulator function with (data::T, current::R) -> R signature
      • seed::R: optional initial value for accumulator function

      Producing

      Stream of type <: Subscribable{R}

      Examples

      using Rocket
      +
      +source = from([ 1, 2, 3 ])
      +subscribe!(source |> scan(+), logger())
      +;
      +
      +# output
      +
      +[LogActor] Data: 1
      +[LogActor] Data: 3
      +[LogActor] Data: 6
      +[LogActor] Completed
      +
      using Rocket
      +
      +source = from([ 1, 2, 3 ])
      +subscribe!(source |> scan(Vector{Int}, (d, c) -> [ c..., d ], Int[]), logger())
      +;
      +
      +# output
      +
      +[LogActor] Data: [1]
      +[LogActor] Data: [1, 2]
      +[LogActor] Data: [1, 2, 3]
      +[LogActor] Completed
      +

      See also: AbstractOperator, RightTypedOperator, ProxyObservable, reduce, logger

      source

      Description

      Combines all values emitted by the source, using an accumulator function that joins a new source value with the past accumulation. This is similar to reduce, but emits the intermediate accumulations.

      Returns an Observable that applies a specified accumulator function to each item emitted by the source Observable. If a seed value is specified, then that value will be used as the initial value for the accumulator. If no seed value is specified, the first item of the source is used as the seed.

      See also

      Operators

      diff --git a/v1.7.3/operators/transformation/start_with/index.html b/v1.7.3/operators/transformation/start_with/index.html new file mode 100644 index 000000000..ac1e0f1f1 --- /dev/null +++ b/v1.7.3/operators/transformation/start_with/index.html @@ -0,0 +1,14 @@ + +start_with · Rocket.jl

      StartWith Operator

      Rocket.start_withFunction
      start_with(object::O) where O

      Creates a start_with operator, which forces an observable to emit given object as a first value.

      Producing

      Stream of type <: Subscribable{Union{L, O}} where L refers to type of source stream <: Subscribable{L}

      Examples

      using Rocket
      +
      +source = from(1:3) |> start_with(0)
      +subscribe!(source, logger())
      +;
      +
      +# output
      +
      +[LogActor] Data: 0
      +[LogActor] Data: 1
      +[LogActor] Data: 2
      +[LogActor] Data: 3
      +[LogActor] Completed

      See also: AbstractOperator, InferableOperator, ProxyObservable, logger

      source

      See also

      Operators

      diff --git a/v1.7.3/operators/transformation/substitute/index.html b/v1.7.3/operators/transformation/substitute/index.html new file mode 100644 index 000000000..18269ff79 --- /dev/null +++ b/v1.7.3/operators/transformation/substitute/index.html @@ -0,0 +1,31 @@ + +substitute · Rocket.jl

      Substitute Operator

      Rocket.substituteFunction
      substitute(::Type{T}, mapFn::F, handler::SubstituteHandler) where { T, F <: Function }

      This operator forces observable to substitute each emmited value with the latest computed value with the corresponding handler and release! function. After release! on handler substitute operator computes new value with mapFn but does not emit it until next emission from source observable. Always calls mapFn on first value from source observable.

      Producing

      Stream of type <: Subscribable{T}

      Examples

      using Rocket
      +
      +subject = Subject(Int)
      +
      +handler = SubstituteHandler()
      +source  = subject |> substitute(String, i -> string("i = ", i), handler)
      +
      +subscription = subscribe!(source, logger())
      +
      +next!(subject, 1)
      +next!(subject, 2)
      +next!(subject, 3)
      +
      +release!(handler)
      +
      +next!(subject, 4)
      +next!(subject, 5)
      +next!(subject, 6)
      +
      +unsubscribe!(subscription)
      +;
      +
      +# output
      +
      +[LogActor] Data: i = 1
      +[LogActor] Data: i = 1
      +[LogActor] Data: i = 1
      +[LogActor] Data: i = 3
      +[LogActor] Data: i = 3
      +[LogActor] Data: i = 3

      See also: SubstituteHandler

      source

      See also

      Operators

      diff --git a/v1.7.3/operators/transformation/switch_map/index.html b/v1.7.3/operators/transformation/switch_map/index.html new file mode 100644 index 000000000..adb0dc252 --- /dev/null +++ b/v1.7.3/operators/transformation/switch_map/index.html @@ -0,0 +1,24 @@ + +switch_map · Rocket.jl

      SwitchMap Operator

      Rocket.switch_mapFunction
      switch_map(::Type{R}, mappingFn::F = identity) where { R, F <: Function }

      Creates a switch_map operator, which returns an Observable that emits items based on applying a function mappingFn that you supply to each item emitted by the source Observable, where that function returns an (so-called "inner") Observable. Each time it observes one of these inner Observables, the output Observable begins emitting the items emitted by that inner Observable. When a new inner Observable is emitted, switch_map stops emitting items from the earlier-emitted inner Observable and begins emitting items from the new one. It continues to behave like this for subsequent inner Observables.

      Arguments

      • ::Type{R}: the type of data of output Observables after projection with mappingFn
      • mappingFn::F: projection function with (data) -> Observable{R} signature

      Producing

      Stream of type <: Subscribable{R}

      Examples

      using Rocket
      +
      +source = from([ of(1), of(2), of(3) ])
      +subscribe!(source |> switch_map(Int), logger())
      +;
      +
      +# output
      +
      +[LogActor] Data: 1
      +[LogActor] Data: 2
      +[LogActor] Data: 3
      +[LogActor] Completed
      using Rocket
      +
      +source = from([ 1, 2, 3 ])
      +subscribe!(source |> switch_map(Float64, (d) -> of(convert(Float64, d ^ 2))), logger())
      +;
      +
      +# output
      +
      +[LogActor] Data: 1.0
      +[LogActor] Data: 4.0
      +[LogActor] Data: 9.0
      +[LogActor] Completed

      See also: AbstractOperator, RightTypedOperator, ProxyObservable, logger

      source

      See also

      Operators

      diff --git a/v1.7.3/operators/transformation/switch_map_to/index.html b/v1.7.3/operators/transformation/switch_map_to/index.html new file mode 100644 index 000000000..c2fe94b61 --- /dev/null +++ b/v1.7.3/operators/transformation/switch_map_to/index.html @@ -0,0 +1,19 @@ + +switch_map_to · Rocket.jl

      SwitchMapTo Operator

      Rocket.switch_map_toFunction
      switch_map_to(inner_observable)

      Creates a switch_map_to operator, which projects each source value to the same Observable which is flattened multiple times with switch_map in the output Observable.

      Arguments

      • inner_observable: an Observable to replace each value from the source Observable.

      Producing

      Stream of type <: Subscribable{R} where R refers to the eltype of inner_observable

      Examples

      using Rocket
      +
      +source = from([ 0, 0, 0 ])
      +subscribe!(source |> switch_map_to(from([ 1, 2, 3 ])), logger())
      +;
      +
      +# output
      +
      +[LogActor] Data: 1
      +[LogActor] Data: 2
      +[LogActor] Data: 3
      +[LogActor] Data: 1
      +[LogActor] Data: 2
      +[LogActor] Data: 3
      +[LogActor] Data: 1
      +[LogActor] Data: 2
      +[LogActor] Data: 3
      +[LogActor] Completed

      See also: switch_map, AbstractOperator, RightTypedOperator, ProxyObservable, logger

      source
      Note

      switch_map_to is equivalent to switch_map with mappingFn set to (_) -> inner_observable.

      See also

      Operators

      diff --git a/v1.7.3/operators/transformation/to_array/index.html b/v1.7.3/operators/transformation/to_array/index.html new file mode 100644 index 000000000..2f213794f --- /dev/null +++ b/v1.7.3/operators/transformation/to_array/index.html @@ -0,0 +1,12 @@ + +to_array · Rocket.jl

      Uppercase Operator

      Rocket.to_arrayFunction
      to_array()

      Creates a to_array operator, which reduces all values into a single array and returns this result when the source completes.

      Producing

      Stream of type <: Subscribable{Vector{L}} where L refers to type of source stream

      Examples

      using Rocket
      +
      +source = from([ 1, 2, 3 ])
      +subscribe!(source |> to_array(), logger())
      +;
      +
      +# output
      +
      +[LogActor] Data: [1, 2, 3]
      +[LogActor] Completed
      +

      See also: AbstractOperator, InferableOperator, ProxyObservable, logger

      source

      See also

      Operators, map, lowercase

      diff --git a/v1.7.3/operators/transformation/uppercase/index.html b/v1.7.3/operators/transformation/uppercase/index.html new file mode 100644 index 000000000..4d6edb098 --- /dev/null +++ b/v1.7.3/operators/transformation/uppercase/index.html @@ -0,0 +1,11 @@ + +uppercase · Rocket.jl

      Uppercase Operator

      Base.Unicode.uppercaseFunction
      uppercase()

      Creates an uppercase operator, which forces each value to be in upper case

      Producing

      Stream of type <: Subscribable{L} where L referes to type of data of input Observable

      Examples

      using Rocket
      +
      +source = of("Hello, world!")
      +subscribe!(source |> uppercase(), logger())
      +;
      +
      +# output
      +
      +[LogActor] Data: HELLO, WORLD!
      +[LogActor] Completed

      See also: AbstractOperator, InferableOperator, ProxyObservable, logger

      source

      See also

      Operators, map, lowercase

      diff --git a/v1.7.3/operators/utility/about/index.html b/v1.7.3/operators/utility/about/index.html new file mode 100644 index 000000000..866f3dcad --- /dev/null +++ b/v1.7.3/operators/utility/about/index.html @@ -0,0 +1,2 @@ + +About utility operators · Rocket.jl
      diff --git a/v1.7.3/operators/utility/async/index.html b/v1.7.3/operators/utility/async/index.html new file mode 100644 index 000000000..694e48173 --- /dev/null +++ b/v1.7.3/operators/utility/async/index.html @@ -0,0 +1,2 @@ + +async · Rocket.jl
      diff --git a/v1.7.3/operators/utility/default_if_empty/index.html b/v1.7.3/operators/utility/default_if_empty/index.html new file mode 100644 index 000000000..70c8f033c --- /dev/null +++ b/v1.7.3/operators/utility/default_if_empty/index.html @@ -0,0 +1,21 @@ + +default_if_empty · Rocket.jl

      DefaultIfEmpty Operator

      Rocket.default_if_emptyFunction
      default_if_empty(value::T)
      +default_if_empty(callback::Function)

      Creates a default_if_empty operator, which emits a given value if the source Observable completes without emitting any next value, otherwise mirrors the source Observable. Optionally accepts a zero-argument callback that will be executed to generate default value. Note: Callback function's output is always converted to the eltype of the original observable.

      using Rocket
      +
      +source = completed(Int) |> default_if_empty(0)
      +
      +subscribe!(source, logger())
      +;
      +
      +# output
      +[LogActor] Data: 0
      +[LogActor] Completed
      using Rocket
      +
      +source = completed(Int) |> default_if_empty(() -> 42)
      +
      +subscribe!(source, logger())
      +;
      +
      +# output
      +[LogActor] Data: 42
      +[LogActor] Completed

      See also: AbstractOperator, InferableOperator, logger, map

      source

      Description

      default_if_empty emits the values emitted by the source Observable or a specified default value if the source Observable is empty (completes without having emitted any next value).

      See also

      Operators

      diff --git a/v1.7.3/operators/utility/delay/index.html b/v1.7.3/operators/utility/delay/index.html new file mode 100644 index 000000000..bf0e8a012 --- /dev/null +++ b/v1.7.3/operators/utility/delay/index.html @@ -0,0 +1,17 @@ + +delay · Rocket.jl

      Delay Operator

      Rocket.delayFunction
      delay(delay::Int)

      Creates a delay operator, which delays the emission of items from the source Observable by a given timeout.

      Arguments:

      • delay::Int: the delay duration in milliseconds (a number) until which the emission of the source items is delayed.

      Producing

      Stream of type <: Subscribable{L} where L refers to type of source stream

      See also: AbstractOperator, InferableOperator, ProxyObservable

      source

      Description

      Delays the emission of items from the source Observable by a given timeout

      Example

      Delay every value with 1 second to the output

      using Rocket
      +using Dates
      +
      +source = from([ 1, 2, 3 ])
      +println(Dates.format(now(), "MM:SS"))
      +subscription = subscribe!(source |> delay(2000), lambda(
      +    on_next = (d) -> println("$(Dates.format(now(), "MM:SS")): $d")
      +));
      +
      +# output
      +
      +03:41
      +03:43: 1
      +03:43: 2
      +03:43: 3
      +

      See also

      Operators

      diff --git a/v1.7.3/operators/utility/discontinue/index.html b/v1.7.3/operators/utility/discontinue/index.html new file mode 100644 index 000000000..ab60074a7 --- /dev/null +++ b/v1.7.3/operators/utility/discontinue/index.html @@ -0,0 +1,13 @@ + +discontinue · Rocket.jl

      Discontinue Operator

      Rocket.discontinueFunction
      discontinue()

      Creates an operator, which prevents an emitting of self-depending messages and breaks a possible infinite loop. Does nothing if observable scheduled asynchronously.

      Producing

      Stream of type <: Subscribable{L} where L refers to type of source stream

      Examples

      using Rocket
      +
      +s = BehaviorSubject(0)
      +
      +subscription1 = subscribe!(s, logger())
      +subscription2 = subscribe!(s |> map(Int, d -> d + 1) |> discontinue(), s)
      +;
      +
      +# output
      +
      +[LogActor] Data: 0
      +[LogActor] Data: 1

      See also: AbstractOperator, RightTypedOperator, ProxyObservable, logger

      source

      See also

      Operators

      diff --git a/v1.7.3/operators/utility/error_if_empty/index.html b/v1.7.3/operators/utility/error_if_empty/index.html new file mode 100644 index 000000000..91f03ea87 --- /dev/null +++ b/v1.7.3/operators/utility/error_if_empty/index.html @@ -0,0 +1,10 @@ + +error_if_empty · Rocket.jl

      ErrorIfEmpty Operator

      Rocket.error_if_emptyFunction
      error_if_empty(err)

      Creates a error_if_empty operator, which emits a given error if the source Observable completes without emitting any next value, otherwise mirrors the source Observable.

      using Rocket
      +
      +source = completed(Int) |> error_if_empty("Empty")
      +
      +subscribe!(source, logger())
      +;
      +
      +# output
      +[LogActor] Error: Empty

      See also: AbstractOperator, InferableOperator, logger, map

      source

      Description

      error_if_empty emits the values emitted by the source Observable or a specified error message if the source Observable is empty (completes without having emitted any next value).

      See also

      Operators

      diff --git a/v1.7.3/operators/utility/limit_subscribers/index.html b/v1.7.3/operators/utility/limit_subscribers/index.html new file mode 100644 index 000000000..b652fe6c3 --- /dev/null +++ b/v1.7.3/operators/utility/limit_subscribers/index.html @@ -0,0 +1,13 @@ + +limit_subscribers · Rocket.jl

      LimitSubscribers Operator

      Rocket.LimitSubscribersGuardType
      LimitSubscribersGuard(limit::Int = 1, exclusive = true)

      Guard structure used in limit_subscribers operator.

      Arguments

      • limit: number of concurrent subscribers
      • exclusive: boolean flag, which indicates whenever this guard can be shared with other observables in other limit_subscribers operator. If set to true, reusing this guard in a different limit_subscribers operator for other observable will result in automatic unsubscription of all present actors.

      Note

      This structure is useful in Pluto.jl notebooks in particular, allowing for automatic subscription/unsubscription of observables.

      Example

      
      +# Cell 1
      +guard = LimitSubscribersGuard()
      +
      +# Cell 2
      +subscription = subscribe!(some_stream |> limit_subscribers(guard), logger())

      See also: limit_subscribers, subscribe!

      source
      Rocket.limit_subscribersFunction
      limit_subscribers(limit::Int = 1, exclusive::Bool = true)
      +limit_subscribers(guard::LimitSubscribersGuard)

      Creates an operator that limits number of concurrent actors to the given observable. On new subscription, if limit is exceeded, oldest actor is automatically unsubscribed and receives a completion event.

      Arguments

      • limit: number of concurrent subscribers
      • exclusive: boolean flag, which indicates whenever this guard can be shared with other observables in other limit_subscribers operator. If set to true, reusing this guard in a different limit_subscribers operator for other observable will result in automatic unsubscription of all present actors.

      Note

      This structure is useful in Pluto.jl notebooks in particular, allowing for automatic subscription/unsubscription of observables.

      Example

      
      +# Cell 1
      +guard = LimitSubscribersGuard()
      +
      +# Cell 2
      +subscription = subscribe!(some_stream |> limit_subscribers(guard), logger())

      See also: LimitSubscribersGuard

      source

      See also

      Operators

      diff --git a/v1.7.3/operators/utility/noop/index.html b/v1.7.3/operators/utility/noop/index.html new file mode 100644 index 000000000..1d463ce72 --- /dev/null +++ b/v1.7.3/operators/utility/noop/index.html @@ -0,0 +1,25 @@ + +noop · Rocket.jl

      Noop Operator

      Rocket.noopFunction
      noop()

      Creates a noop operator, which does nothing, but breaks operator composition type inference checking procedure for Julia's compiler. It might be useful for very long chain of operators, because Julia tries to statically infer data types at compile-time for the whole chain and can run into StackOverflow issues.

      using Rocket
      +
      +# foo() block to enforce local scope for scope variable
      +function foo()
      +    source = from(1:5)
      +
      +    for i in 1:1000
      +        source = source |> map(Int, d -> d + 1) |> noop()
      +    end
      +
      +    subscribe!(source, logger())
      +end
      +
      +foo()
      +;
      +
      +# output
      +
      +[LogActor] Data: 1001
      +[LogActor] Data: 1002
      +[LogActor] Data: 1003
      +[LogActor] Data: 1004
      +[LogActor] Data: 1005
      +[LogActor] Completed

      See also: AbstractOperator, InferableOperator, logger, map

      source

      See also

      Operators

      diff --git a/v1.7.3/operators/utility/ref_count/index.html b/v1.7.3/operators/utility/ref_count/index.html new file mode 100644 index 000000000..702e7f8e6 --- /dev/null +++ b/v1.7.3/operators/utility/ref_count/index.html @@ -0,0 +1,24 @@ + +ref_count · Rocket.jl

      Ref Count Operator

      Rocket.ref_countFunction
      ref_count()

      Make a ConnectableObservable behave like a ordinary observable and automates the way you can connect to it. Internally it counts the subscriptions to the observable and subscribes (only once) to the source if the number of subscriptions is larger than 0. If the number of subscriptions is smaller than 1, it unsubscribes from the source. This way you can make sure that everything before the published refCount has only a single subscription independently of the number of subscribers to the target observable.

      Note that using the share operator is exactly the same as using the publish operator (making the observable hot) and the ref_count() operator in a sequence.

      Example

      using Rocket
      +
      +subject = Subject(Int, scheduler = AsapScheduler())
      +source  = from(1:5) |> multicast(subject) |> ref_count()
      +
      +actor1 = logger("1")
      +actor2 = logger("2")
      +
      +subscription1 = subscribe!(source, actor1)
      +subscription2 = subscribe!(source, actor2)
      +
      +unsubscribe!(subscription1)
      +unsubscribe!(subscription2)
      +;
      +
      +# output
      +[1] Data: 1
      +[1] Data: 2
      +[1] Data: 3
      +[1] Data: 4
      +[1] Data: 5
      +[1] Completed
      +[2] Completed

      See also: AbstractOperator, publish, multicast, share

      source

      See also

      Operators

      diff --git a/v1.7.3/operators/utility/safe/index.html b/v1.7.3/operators/utility/safe/index.html new file mode 100644 index 000000000..bf2354797 --- /dev/null +++ b/v1.7.3/operators/utility/safe/index.html @@ -0,0 +1,2 @@ + +safe · Rocket.jl
      diff --git a/v1.7.3/operators/utility/skip_complete/index.html b/v1.7.3/operators/utility/skip_complete/index.html new file mode 100644 index 000000000..9b4f880a4 --- /dev/null +++ b/v1.7.3/operators/utility/skip_complete/index.html @@ -0,0 +1,12 @@ + +skip_complete · Rocket.jl

      SkipComplete Operator

      Rocket.skip_completeFunction
      skip_complete()

      Creates a skip_complete operator, which filters out complete event by the source Observable by emitting only next and error messages.

      Producing

      Stream of type <: Subscribable{L} where L refers to type of source stream

      Examples

      using Rocket
      +
      +source = from([ 1, 2, 3 ])
      +subscribe!(source |> skip_complete(), logger())
      +;
      +
      +# output
      +[LogActor] Data: 1
      +[LogActor] Data: 2
      +[LogActor] Data: 3
      +

      See also: AbstractOperator, InferableOperator, ProxyObservable, skip_error, skip_next, logger

      source

      See also

      Operators

      diff --git a/v1.7.3/operators/utility/skip_error/index.html b/v1.7.3/operators/utility/skip_error/index.html new file mode 100644 index 000000000..4e6577bb2 --- /dev/null +++ b/v1.7.3/operators/utility/skip_error/index.html @@ -0,0 +1,9 @@ + +skip_error · Rocket.jl

      SkipError Operator

      See also

      Operators

      diff --git a/v1.7.3/operators/utility/skip_next/index.html b/v1.7.3/operators/utility/skip_next/index.html new file mode 100644 index 000000000..110ceaca6 --- /dev/null +++ b/v1.7.3/operators/utility/skip_next/index.html @@ -0,0 +1,10 @@ + +skip_next · Rocket.jl

      SkipNext Operator

      Rocket.skip_nextFunction
      skip_next()

      Creates a skip_next operator, which filters out all next messages by the source Observable by emitting only error and complete messages.

      Producing

      Stream of type <: Subscribable{L} where L refers to type of source stream

      Examples

      using Rocket
      +
      +source = from([ 1, 2, 3 ])
      +subscribe!(source |> skip_next(), logger())
      +;
      +
      +# output
      +[LogActor] Completed
      +

      See also: AbstractOperator, InferableOperator, ProxyObservable, skip_error, skip_complete, logger

      source

      See also

      Operators

      diff --git a/v1.7.3/operators/utility/tap/index.html b/v1.7.3/operators/utility/tap/index.html new file mode 100644 index 000000000..2f8eddfd3 --- /dev/null +++ b/v1.7.3/operators/utility/tap/index.html @@ -0,0 +1,17 @@ + +tap · Rocket.jl

      Tap Operator

      Rocket.tapFunction
      tap(tapFn::F) where { F <: Function }

      Creates a tap operator, which performs a side effect for every emission on the source Observable, but return an Observable that is identical to the source.

      Arguments

      • tapFn::Function: side-effect tap function with (data) -> Nothing signature

      Producing

      Stream of type <: Subscribable{L} where L refers to type of source stream

      Examples

      using Rocket
      +
      +source = from([ 1, 2, 3 ])
      +subscribe!(source |> tap((d) -> println("In tap: $d")), logger())
      +;
      +
      +# output
      +
      +In tap: 1
      +[LogActor] Data: 1
      +In tap: 2
      +[LogActor] Data: 2
      +In tap: 3
      +[LogActor] Data: 3
      +[LogActor] Completed
      +

      See also: tap_on_subscribe, tap_on_complete, logger

      source

      Description

      Returns an Observable that resembles the source Observable, but modifies it so that the provided Observer is called to perform a side effect for every value emitted by the source.

      This operator is useful for debugging your Observables, verifying correct values, or performing other side effects.

      Note: this operator differs from a subscribe on the Observable. If the Observable returned by tap is not subscribed, the side effects specified by the Observer will never happen. tap therefore simply spies on existing execution, it does not trigger an execution to happen like subscribe does.

      See also

      Operators

      diff --git a/v1.7.3/operators/utility/tap_on_complete/index.html b/v1.7.3/operators/utility/tap_on_complete/index.html new file mode 100644 index 000000000..a300b0157 --- /dev/null +++ b/v1.7.3/operators/utility/tap_on_complete/index.html @@ -0,0 +1,15 @@ + +tap_on_complete · Rocket.jl

      TapOnComplete Operator

      Rocket.tap_on_completeFunction
      tap_on_complete(tapFn::F) where { F <: Function }

      Creates a tap operator, which performs a side effect for only complete emission on the source Observable, but return an Observable that is identical to the source.

      Arguments

      • tapFn::Function: side-effect tap function with () -> Nothing signature

      Producing

      Stream of type <: Subscribable{L} where L refers to type of source stream

      Examples

      using Rocket
      +
      +source = from([ 1, 2, 3 ])
      +subscribe!(source |> tap_on_complete(() -> println("Complete event received")), logger())
      +;
      +
      +# output
      +
      +[LogActor] Data: 1
      +[LogActor] Data: 2
      +[LogActor] Data: 3
      +[LogActor] Completed
      +Complete event received
      +

      See also: tap_on_subscribe, tap, logger

      source

      Description

      Returns an Observable that resembles the source Observable, but modifies it so that the provided Observer is called to perform a side effect on complete event emission by the source.

      This operator is useful for debugging your Observables, verifying correctness, or performing other side effects.

      Note: this operator differs from a subscribe on the Observable. If the Observable returned by tap_on_complete is not subscribed, the side effects specified by the Observer will never happen. tap_on_complete therefore simply spies on future execution, it does not trigger an execution to happen like subscribe does.

      See also

      Operators

      diff --git a/v1.7.3/operators/utility/tap_on_subscribe/index.html b/v1.7.3/operators/utility/tap_on_subscribe/index.html new file mode 100644 index 000000000..6d472cfb3 --- /dev/null +++ b/v1.7.3/operators/utility/tap_on_subscribe/index.html @@ -0,0 +1,26 @@ + +tap_on_subscribe · Rocket.jl

      TapOnSubscribe Operator

      Rocket.tap_on_subscribeFunction
      tap_on_subscribe(tapFn::F, strategy::S = TapBeforeSubscription()) where { F <: Function }

      Creates a tap operator, which performs a side effect on the subscription on the source Observable, but return an Observable that is identical to the source.

      Arguments

      • tapFn::Function: side-effect tap function with () -> Nothing signature
      • strategy: (optional), specifies the order of a side-effect and an actual subscription, uses TapBeforeSubscription by default

      Producing

      Stream of type <: Subscribable{L} where L refers to type of source stream

      Examples

      using Rocket
      +
      +source = from([ 1, 2, 3 ])
      +subscribe!(source |> tap_on_subscribe(() -> println("Someone subscribed")), logger())
      +;
      +
      +# output
      +
      +Someone subscribed
      +[LogActor] Data: 1
      +[LogActor] Data: 2
      +[LogActor] Data: 3
      +[LogActor] Completed
      using Rocket
      +
      +source = from([ 1, 2, 3 ])
      +subscribe!(source |> tap_on_subscribe(() -> println("Someone subscribed"), TapAfterSubscription()), logger())
      +;
      +
      +# output
      +
      +[LogActor] Data: 1
      +[LogActor] Data: 2
      +[LogActor] Data: 3
      +[LogActor] Completed
      +Someone subscribed

      See also: TapBeforeSubscription, TapAfterSubscription, tap, tap_on_unsubscribe, tap_on_complete, logger

      source

      Description

      Returns an Observable that resembles the source Observable, but modifies it so that the provided Observer is called to perform a side effect on subscription to the source.

      This operator is useful for debugging your Observables, verifying correctness, or performing other side effects.

      Note: this operator differs from a subscribe on the Observable. If the Observable returned by tap_on_subscribe is not subscribed, the side effects specified by the Observer will never happen. tap_on_subscribe therefore simply spies on future execution, it does not trigger an execution to happen like subscribe does.

      See also

      Operators

      diff --git a/v1.7.3/operators/utility/tap_on_unsubscribe/index.html b/v1.7.3/operators/utility/tap_on_unsubscribe/index.html new file mode 100644 index 000000000..7c8b022a3 --- /dev/null +++ b/v1.7.3/operators/utility/tap_on_unsubscribe/index.html @@ -0,0 +1,15 @@ + +tap_on_unsubscribe · Rocket.jl

      TapOnUnsubscribe Operator

      Rocket.tap_on_unsubscribeFunction
      tap_on_unsubscribe(tapFn::F, strategy::S = TapBeforeUnsubscription()) where { F <: Function }

      Creates a tap operator, which performs a side effect on the unsubscription on the source Observable, but return an Observable that is identical to the source. Tap callback triggers only once.

      Arguments

      • tapFn::Function: side-effect tap function with () -> Nothing signature
      • strategy: (optional), specifies the order of a side-effect and an actual unsubscription, uses TapBeforeUnsubscription by default

      Producing

      Stream of type <: Subscribable{L} where L refers to type of source stream

      Examples

      using Rocket
      +
      +source = from([ 1, 2, 3 ])
      +subscription = subscribe!(source |> tap_on_unsubscribe(() -> println("Someone unsubscribed")), logger())
      +unsubscribe!(subscription)
      +;
      +
      +# output
      +
      +[LogActor] Data: 1
      +[LogActor] Data: 2
      +[LogActor] Data: 3
      +[LogActor] Completed
      +Someone unsubscribed

      See also: TapBeforeUnsubscription, TapAfterUnsubscription, tap, tap_on_subscribe, tap_on_complete, logger

      source

      Description

      Returns an Observable that resembles the source Observable, but modifies it so that the provided Observer is called to perform a side effect on unsubscription from the source.

      This operator is useful for debugging your Observables, verifying correctness, or performing other side effects.

      See also

      Operators

      diff --git a/v1.7.3/search_index.js b/v1.7.3/search_index.js new file mode 100644 index 000000000..b82711f2e --- /dev/null +++ b/v1.7.3/search_index.js @@ -0,0 +1,3 @@ +var documenterSearchIndex = {"docs": +[{"location":"operators/utility/skip_complete/#operator_skip_complete","page":"skip_complete","title":"SkipComplete Operator","text":"","category":"section"},{"location":"operators/utility/skip_complete/","page":"skip_complete","title":"skip_complete","text":"skip_complete","category":"page"},{"location":"operators/utility/skip_complete/#Rocket.skip_complete","page":"skip_complete","title":"Rocket.skip_complete","text":"skip_complete()\n\nCreates a skip_complete operator, which filters out complete event by the source Observable by emitting only next and error messages.\n\nProducing\n\nStream of type <: Subscribable{L} where L refers to type of source stream\n\nExamples\n\nusing Rocket\n\nsource = from([ 1, 2, 3 ])\nsubscribe!(source |> skip_complete(), logger())\n;\n\n# output\n[LogActor] Data: 1\n[LogActor] Data: 2\n[LogActor] Data: 3\n\n\nSee also: AbstractOperator, InferableOperator, ProxyObservable, skip_error, skip_next, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/utility/skip_complete/#See-also","page":"skip_complete","title":"See also","text":"","category":"section"},{"location":"operators/utility/skip_complete/","page":"skip_complete","title":"skip_complete","text":"Operators","category":"page"},{"location":"operators/transformation/start_with/#operator_start_with","page":"start_with","title":"StartWith Operator","text":"","category":"section"},{"location":"operators/transformation/start_with/","page":"start_with","title":"start_with","text":"start_with","category":"page"},{"location":"operators/transformation/start_with/#Rocket.start_with","page":"start_with","title":"Rocket.start_with","text":"start_with(object::O) where O\n\nCreates a start_with operator, which forces an observable to emit given object as a first value.\n\nProducing\n\nStream of type <: Subscribable{Union{L, O}} where L refers to type of source stream <: Subscribable{L}\n\nExamples\n\nusing Rocket\n\nsource = from(1:3) |> start_with(0)\nsubscribe!(source, logger())\n;\n\n# output\n\n[LogActor] Data: 0\n[LogActor] Data: 1\n[LogActor] Data: 2\n[LogActor] Data: 3\n[LogActor] Completed\n\nSee also: AbstractOperator, InferableOperator, ProxyObservable, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/transformation/start_with/#See-also","page":"start_with","title":"See also","text":"","category":"section"},{"location":"operators/transformation/start_with/","page":"start_with","title":"start_with","text":"Operators","category":"page"},{"location":"actors/types/server/#actor_server","page":"Server","title":"Server actor","text":"","category":"section"},{"location":"actors/types/server/","page":"Server","title":"Server","text":"server","category":"page"},{"location":"actors/types/server/#Rocket.server","page":"Server","title":"Rocket.server","text":"server(port::Int)\nserver(address::A, port::Int) where { A <: IPAddr }\nserver(::Type{D}, port::Int)\nserver(::Type{D}, address::A, port::Int) where { A <: IPAddr }\n\nCreation operator for the ServerActor actor.\n\nSee also: AbstractActor\n\n\n\n\n\n","category":"function"},{"location":"actors/types/server/","page":"Server","title":"Server","text":"ServerActor","category":"page"},{"location":"actors/types/server/#Rocket.ServerActor","page":"Server","title":"Rocket.ServerActor","text":"ServerActor{D, Address, Port}() where D\n\nThe ServerActor sends all next!/error!/complete! events to the local network listeners with specified Address and Port parameters via TCPSocket.\n\nSee also: Actor, server\n\n\n\n\n\n","category":"type"},{"location":"operators/transformation/exhaust_map/#operator_exhaust_map","page":"exhaust_map","title":"ExhaustMap Operator","text":"","category":"section"},{"location":"operators/transformation/exhaust_map/","page":"exhaust_map","title":"exhaust_map","text":"exhaust_map","category":"page"},{"location":"operators/transformation/exhaust_map/#Rocket.exhaust_map","page":"exhaust_map","title":"Rocket.exhaust_map","text":"exhaust_map(::Type{R}, mappingFn::F = identity) where { R, F <: Function }\n\nCreates a exhaust_map operator, which returns an Observable containing projected Observables of each item of the source, ignoring projected Observables that start before their preceding Observable has completed. Essentially it projects each source value to an Observable which is merged in the output Observable only if the previous projected Observable has completed.\n\nArguments\n\n::Type{R}: the type of data of output Observables after projection with mappingFn\nmappingFn::F: projection function with (data) -> Observable{R} signature\n\nProducing\n\nStream of type <: Subscribable{R}\n\nExamples\n\nusing Rocket\n\nsource = from([ 0, 0 ]) |> async() |> exhaust_map(Int, d -> from([ 1, 2 ]) |> async())\nsubscribe!(source, logger())\n;\n\n# output\n\n[LogActor] Data: 1\n[LogActor] Data: 2\n[LogActor] Completed\n\nSee also: AbstractOperator, RightTypedOperator, ProxyObservable, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/transformation/exhaust_map/#See-also","page":"exhaust_map","title":"See also","text":"","category":"section"},{"location":"operators/transformation/exhaust_map/","page":"exhaust_map","title":"exhaust_map","text":"Operators","category":"page"},{"location":"operators/utility/ref_count/#operator_ref_count","page":"ref_count","title":"Ref Count Operator","text":"","category":"section"},{"location":"operators/utility/ref_count/","page":"ref_count","title":"ref_count","text":"ref_count","category":"page"},{"location":"operators/utility/ref_count/#Rocket.ref_count","page":"ref_count","title":"Rocket.ref_count","text":"ref_count()\n\nMake a ConnectableObservable behave like a ordinary observable and automates the way you can connect to it. Internally it counts the subscriptions to the observable and subscribes (only once) to the source if the number of subscriptions is larger than 0. If the number of subscriptions is smaller than 1, it unsubscribes from the source. This way you can make sure that everything before the published refCount has only a single subscription independently of the number of subscribers to the target observable.\n\nNote that using the share operator is exactly the same as using the publish operator (making the observable hot) and the ref_count() operator in a sequence.\n\nExample\n\nusing Rocket\n\nsubject = Subject(Int, scheduler = AsapScheduler())\nsource = from(1:5) |> multicast(subject) |> ref_count()\n\nactor1 = logger(\"1\")\nactor2 = logger(\"2\")\n\nsubscription1 = subscribe!(source, actor1)\nsubscription2 = subscribe!(source, actor2)\n\nunsubscribe!(subscription1)\nunsubscribe!(subscription2)\n;\n\n# output\n[1] Data: 1\n[1] Data: 2\n[1] Data: 3\n[1] Data: 4\n[1] Data: 5\n[1] Completed\n[2] Completed\n\nSee also: AbstractOperator, publish, multicast, share\n\n\n\n\n\n","category":"function"},{"location":"operators/utility/ref_count/#See-also","page":"ref_count","title":"See also","text":"","category":"section"},{"location":"operators/utility/ref_count/","page":"ref_count","title":"ref_count","text":"Operators","category":"page"},{"location":"actors/types/keep/#actor_keep","page":"Keep","title":"Keep actor","text":"","category":"section"},{"location":"actors/types/keep/","page":"Keep","title":"Keep","text":"keep","category":"page"},{"location":"actors/types/keep/#Rocket.keep","page":"Keep","title":"Rocket.keep","text":"keep(::Type{T}) where T\n\nArguments\n\n::Type{T}: Type of keep data\n\nCreation operator for the KeepActor actor.\n\nExamples\n\nusing Rocket\n\nactor = keep(Int)\nactor isa KeepActor{Int}\n\n# output\ntrue\n\nSee also: KeepActor, AbstractActor\n\n\n\n\n\n","category":"function"},{"location":"actors/types/keep/","page":"Keep","title":"Keep","text":"KeepActor","category":"page"},{"location":"actors/types/keep/#Rocket.KeepActor","page":"Keep","title":"Rocket.KeepActor","text":"KeepActor{D}() where D\n\nKeep actor provides a storage actor. It saves all incoming successful next events in a values array, throws an ErrorException on error! event and does nothing on completion event.\n\nExamples\n\nusing Rocket\n\nsource = from(1:5)\nactor = keep(Int)\n\nsubscribe!(source, actor)\nshow(getvalues(actor))\n\n# output\n[1, 2, 3, 4, 5]\n\nSee also: Actor, keep\n\n\n\n\n\n","category":"type"},{"location":"observables/types/collected/#observable_collected","page":"Collected","title":"Collected Observable","text":"","category":"section"},{"location":"observables/types/collected/","page":"Collected","title":"Collected","text":"collectLatest","category":"page"},{"location":"observables/types/collected/#Rocket.collectLatest","page":"Collected","title":"Rocket.collectLatest","text":"collectLatest(sources::S, mappingFn::F = copy) where { S, F }\ncollectLatest(::Type{T}, ::Type{R}, sources::S, mappingFn::F = copy)\n\nCollects values from multible Observables and emits it in one single array every time each inner Observable has a new value. Reemits errors from inner observables. Completes when all inner observables completes.\n\nArguments\n\nsources: input sources\nmappingFn: optional mappingFn applied to an array of emited values, copy by default, should return a Vector\n\nNote: collectLatest completes immediately if sources are empty.\n\nOptional arguments\n\n::Type{T}: optional type of emmiting values of inner observables\n::Type{R}: optional return type after applying mappingFn to a vector of values\n\nExamples\n\nusing Rocket\n\ncollected = collectLatest([ of(1), from([ 1, 2 ]) ])\n\nsubscribe!(collected, logger())\n;\n\n# output\n\n[LogActor] Data: [1, 1]\n[LogActor] Data: [1, 2]\n[LogActor] Completed\n\nSee also: Subscribable, subscribe!, combineLatest\n\n\n\n\n\n","category":"function"},{"location":"observables/types/collected/#Description","page":"Collected","title":"Description","text":"","category":"section"},{"location":"observables/types/collected/","page":"Collected","title":"Collected","text":"collectLatest collects the values from all Observables in its vector argument. This is done by subscribing to each Observable in order and, whenever an Observable emits, collecting a vector of the most recent values from each Observable (in order). If you pass n Observables to collectLatest, the returned Observable will always emit an ordered vector of n values.","category":"page"},{"location":"observables/types/collected/","page":"Collected","title":"Collected","text":"To ensure that the output vector has a consistent length, collectLatest waits for all input Observables to emit at least once before it starts emitting results. This means that if some Observable emits values before other Observables started emitting, all these values but the last will be lost. On the other hand, if some Observable does not emit a value but completes, the resulting Observable will complete simultaneously without emitting anything. Furthermore, if some input Observable does not emit any value and never completes, collectLatest will also never emit and never complete.","category":"page"},{"location":"observables/types/collected/","page":"Collected","title":"Collected","text":"If at least one Observable was passed to collectLatest and all passed Observables emitted, then the resulting Observable will complete when all combined streams complete. So even if some Observable completes, the result of collectLatest will still emit values when the other Observables do. In case of a completed Observable, its value will now remain to be the last emitted value. On the other hand, if any Observable errors, collectLatest will also immediately error.","category":"page"},{"location":"observables/types/defer/#observable_defer","page":"Defer","title":"Defer Observable","text":"","category":"section"},{"location":"observables/types/defer/","page":"Defer","title":"Defer","text":"defer","category":"page"},{"location":"observables/types/defer/#Rocket.defer","page":"Defer","title":"Rocket.defer","text":"defer(::Type{D}, factoryFn::F) where { D, F <: Function }\n\nCreates an Observable that, on subscribe, calls an Observable factory to make an Observable for each new Observer.\n\nArguments\n\nT: type of output data source, created by the factoryFn\nfactoryFn: the Observable factory function to invoke for each Observer that subscribes to the output Observable\n\nExamples\n\nusing Rocket\n\nsource = defer(Int, () -> from([ 1, 2, 3 ]))\n\nsubscribe!(source, logger())\n;\n\n# output\n[LogActor] Data: 1\n[LogActor] Data: 2\n[LogActor] Data: 3\n[LogActor] Completed\n\nSee also: Subscribable, subscribe!, logger\n\n\n\n\n\n","category":"function"},{"location":"observables/types/defer/#Description","page":"Defer","title":"Description","text":"","category":"section"},{"location":"observables/types/defer/","page":"Defer","title":"Defer","text":"defer allows you to create the Observable only when the Actor subscribes, and create a fresh Observable for each Actor. It waits until an Actor subscribes to it, and then it generates an Observable, typically with an Observable factory function. It does this afresh for each subscriber, so although each subscriber may think it is subscribing to the same Observable, in fact each subscriber gets its own individual Observable.","category":"page"},{"location":"operators/filtering/last/#operator_last","page":"last","title":"Last Operator","text":"","category":"section"},{"location":"operators/filtering/last/","page":"last","title":"last","text":"last","category":"page"},{"location":"operators/filtering/last/#Base.last","page":"last","title":"Base.last","text":"last(; default = nothing)\n\nCreates a last operator, which returns an Observable that emits only the last item emitted by the source Observable. Sends LastNotFoundException error message if a given source completes without emitting a single value.\n\nArguments\n\ndefault: an optional default value to provide if no values were emitted\n\nProducing\n\nStream of type <: Subscribable{L} where L refers to type of source stream\n\nExamples\n\nusing Rocket\n\nsource = from([ 1, 2, 3 ])\nsubscribe!(source |> last(), logger())\n;\n\n# output\n\n[LogActor] Data: 3\n[LogActor] Completed\n\n\nusing Rocket\n\nsource = from(Int[])\nsubscribe!(source |> last() |> catch_error((err, obs) -> of(1)), logger())\n;\n\n# output\n\n[LogActor] Data: 1\n[LogActor] Completed\n\nusing Rocket\n\nsource = from(Int[])\nsubscribe!(source |> last(default = 1), logger())\n;\n\n# output\n\n[LogActor] Data: 1\n[LogActor] Completed\n\nSee also: AbstractOperator, InferableOperator, ProxyObservable, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/filtering/last/#Description","page":"last","title":"Description","text":"","category":"section"},{"location":"operators/filtering/last/","page":"last","title":"last","text":"last operator returns an Observable that emits only the last item emitted by the source Observable.","category":"page"},{"location":"operators/filtering/last/#See-also","page":"last","title":"See also","text":"","category":"section"},{"location":"operators/filtering/last/","page":"last","title":"last","text":"Operators","category":"page"},{"location":"operators/utility/tap_on_subscribe/#operator_tap_on_subscribe","page":"tap_on_subscribe","title":"TapOnSubscribe Operator","text":"","category":"section"},{"location":"operators/utility/tap_on_subscribe/","page":"tap_on_subscribe","title":"tap_on_subscribe","text":"TapBeforeSubscription\nTapAfterSubscription\ntap_on_subscribe","category":"page"},{"location":"operators/utility/tap_on_subscribe/#Rocket.TapBeforeSubscription","page":"tap_on_subscribe","title":"Rocket.TapBeforeSubscription","text":"TapBeforeSubscription\n\nOne of the strategies for tap_on_subscribe operator. With TapBeforeSubscription tap callback will be called before actual subscription.\n\nSee also: tap_on_subscribe, TapAfterSubscription\n\n\n\n\n\n","category":"type"},{"location":"operators/utility/tap_on_subscribe/#Rocket.TapAfterSubscription","page":"tap_on_subscribe","title":"Rocket.TapAfterSubscription","text":"TapAfterSubscription\n\nOne of the strategies for tap_on_subscribe operator. With TapBeforeSubscription tap callback will be called after actual subscription.\n\nSee also: tap_on_subscribe, TapBeforeSubscription\n\n\n\n\n\n","category":"type"},{"location":"operators/utility/tap_on_subscribe/#Rocket.tap_on_subscribe","page":"tap_on_subscribe","title":"Rocket.tap_on_subscribe","text":"tap_on_subscribe(tapFn::F, strategy::S = TapBeforeSubscription()) where { F <: Function }\n\nCreates a tap operator, which performs a side effect on the subscription on the source Observable, but return an Observable that is identical to the source.\n\nArguments\n\ntapFn::Function: side-effect tap function with () -> Nothing signature\nstrategy: (optional), specifies the order of a side-effect and an actual subscription, uses TapBeforeSubscription by default\n\nProducing\n\nStream of type <: Subscribable{L} where L refers to type of source stream\n\nExamples\n\nusing Rocket\n\nsource = from([ 1, 2, 3 ])\nsubscribe!(source |> tap_on_subscribe(() -> println(\"Someone subscribed\")), logger())\n;\n\n# output\n\nSomeone subscribed\n[LogActor] Data: 1\n[LogActor] Data: 2\n[LogActor] Data: 3\n[LogActor] Completed\n\nusing Rocket\n\nsource = from([ 1, 2, 3 ])\nsubscribe!(source |> tap_on_subscribe(() -> println(\"Someone subscribed\"), TapAfterSubscription()), logger())\n;\n\n# output\n\n[LogActor] Data: 1\n[LogActor] Data: 2\n[LogActor] Data: 3\n[LogActor] Completed\nSomeone subscribed\n\nSee also: TapBeforeSubscription, TapAfterSubscription, tap, tap_on_unsubscribe, tap_on_complete, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/utility/tap_on_subscribe/#Description","page":"tap_on_subscribe","title":"Description","text":"","category":"section"},{"location":"operators/utility/tap_on_subscribe/","page":"tap_on_subscribe","title":"tap_on_subscribe","text":"Returns an Observable that resembles the source Observable, but modifies it so that the provided Observer is called to perform a side effect on subscription to the source.","category":"page"},{"location":"operators/utility/tap_on_subscribe/","page":"tap_on_subscribe","title":"tap_on_subscribe","text":"This operator is useful for debugging your Observables, verifying correctness, or performing other side effects.","category":"page"},{"location":"operators/utility/tap_on_subscribe/","page":"tap_on_subscribe","title":"tap_on_subscribe","text":"Note: this operator differs from a subscribe on the Observable. If the Observable returned by tap_on_subscribe is not subscribed, the side effects specified by the Observer will never happen. tap_on_subscribe therefore simply spies on future execution, it does not trigger an execution to happen like subscribe does.","category":"page"},{"location":"operators/utility/tap_on_subscribe/#See-also","page":"tap_on_subscribe","title":"See also","text":"","category":"section"},{"location":"operators/utility/tap_on_subscribe/","page":"tap_on_subscribe","title":"tap_on_subscribe","text":"Operators","category":"page"},{"location":"operators/utility/safe/#operator_safe","page":"safe","title":"Safe Operator","text":"","category":"section"},{"location":"operators/utility/safe/","page":"safe","title":"safe","text":"safe","category":"page"},{"location":"operators/utility/safe/#Rocket.safe","page":"safe","title":"Rocket.safe","text":"safe()\n\nCreates a SafeOperator, which wraps on_subscribe! and each next!, error! and complete! callbacks into try-catch block.\n\nProducing\n\nStream of type <: Subscribable{L} where L refers to type of source stream\n\nSee also: AbstractOperator, InferableOperator, ProxyObservable, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/utility/safe/#See-also","page":"safe","title":"See also","text":"","category":"section"},{"location":"operators/utility/safe/","page":"safe","title":"safe","text":"Operators","category":"page"},{"location":"operators/utility/skip_next/#operator_skip_next","page":"skip_next","title":"SkipNext Operator","text":"","category":"section"},{"location":"operators/utility/skip_next/","page":"skip_next","title":"skip_next","text":"skip_next","category":"page"},{"location":"operators/utility/skip_next/#Rocket.skip_next","page":"skip_next","title":"Rocket.skip_next","text":"skip_next()\n\nCreates a skip_next operator, which filters out all next messages by the source Observable by emitting only error and complete messages.\n\nProducing\n\nStream of type <: Subscribable{L} where L refers to type of source stream\n\nExamples\n\nusing Rocket\n\nsource = from([ 1, 2, 3 ])\nsubscribe!(source |> skip_next(), logger())\n;\n\n# output\n[LogActor] Completed\n\n\nSee also: AbstractOperator, InferableOperator, ProxyObservable, skip_error, skip_complete, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/utility/skip_next/#See-also","page":"skip_next","title":"See also","text":"","category":"section"},{"location":"operators/utility/skip_next/","page":"skip_next","title":"skip_next","text":"Operators","category":"page"},{"location":"operators/transformation/switch_map/#operator_switch_map","page":"switch_map","title":"SwitchMap Operator","text":"","category":"section"},{"location":"operators/transformation/switch_map/","page":"switch_map","title":"switch_map","text":"switch_map","category":"page"},{"location":"operators/transformation/switch_map/#Rocket.switch_map","page":"switch_map","title":"Rocket.switch_map","text":"switch_map(::Type{R}, mappingFn::F = identity) where { R, F <: Function }\n\nCreates a switch_map operator, which returns an Observable that emits items based on applying a function mappingFn that you supply to each item emitted by the source Observable, where that function returns an (so-called \"inner\") Observable. Each time it observes one of these inner Observables, the output Observable begins emitting the items emitted by that inner Observable. When a new inner Observable is emitted, switch_map stops emitting items from the earlier-emitted inner Observable and begins emitting items from the new one. It continues to behave like this for subsequent inner Observables.\n\nArguments\n\n::Type{R}: the type of data of output Observables after projection with mappingFn\nmappingFn::F: projection function with (data) -> Observable{R} signature\n\nProducing\n\nStream of type <: Subscribable{R}\n\nExamples\n\nusing Rocket\n\nsource = from([ of(1), of(2), of(3) ])\nsubscribe!(source |> switch_map(Int), logger())\n;\n\n# output\n\n[LogActor] Data: 1\n[LogActor] Data: 2\n[LogActor] Data: 3\n[LogActor] Completed\n\nusing Rocket\n\nsource = from([ 1, 2, 3 ])\nsubscribe!(source |> switch_map(Float64, (d) -> of(convert(Float64, d ^ 2))), logger())\n;\n\n# output\n\n[LogActor] Data: 1.0\n[LogActor] Data: 4.0\n[LogActor] Data: 9.0\n[LogActor] Completed\n\nSee also: AbstractOperator, RightTypedOperator, ProxyObservable, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/transformation/switch_map/#See-also","page":"switch_map","title":"See also","text":"","category":"section"},{"location":"operators/transformation/switch_map/","page":"switch_map","title":"switch_map","text":"Operators","category":"page"},{"location":"api/actors/#actors_api","page":"Actors","title":"Actors API","text":"","category":"section"},{"location":"api/actors/#How-to-create-a-custom-Actor","page":"Actors","title":"How to create a custom Actor","text":"","category":"section"},{"location":"api/actors/","page":"Actors","title":"Actors","text":"At first custom actor should implement a custom method for the as_actor function. Rocket.jl also provides a number of helper actor abstract types with predefined as_actor method behavior (see Traits API section).","category":"page"},{"location":"api/actors/","page":"Actors","title":"Actors","text":"using Rocket\n\nstruct MyCustomActor end\n\nas_actor(::Type{<:MyCustomActor}) = Rocket.BaseActorTrait{Int}()\n","category":"page"},{"location":"api/actors/","page":"Actors","title":"Actors","text":"or","category":"page"},{"location":"api/actors/","page":"Actors","title":"Actors","text":"using Rocket\n\nstruct MyCustomActor <: Actor{Int} end # Automatically specifies BaseActorTrait{Int} behavior.","category":"page"},{"location":"api/actors/","page":"Actors","title":"Actors","text":"Additionally custom actor must provide a custom methods for on_next!, on_error! and/or on_complete! functions. Depending on specified actor trait behavior some methods may or may not be optional.","category":"page"},{"location":"api/actors/","page":"Actors","title":"Actors","text":"using Rocket\n\nstruct MyCustomActor <: Actor{Int} end\n\nRocket.on_next!(actor::MyCustomActor, data::Int) = # custom logic here\nRocket.on_error!(actor::MyCustomActor, err) = # custom logic here\nRocket.on_complete!(actor::MyCustomActor) = # custom logic here","category":"page"},{"location":"api/actors/","page":"Actors","title":"Actors","text":"or","category":"page"},{"location":"api/actors/","page":"Actors","title":"Actors","text":"using Rocket\n\nstruct MyCustomCompletionActor <: CompletionActor{Int} end\n\nRocket.on_complete!(actor::MyCustomCompletionActor) = # custom logic here","category":"page"},{"location":"api/actors/#actors_api_traits","page":"Actors","title":"Traits","text":"","category":"section"},{"location":"api/actors/","page":"Actors","title":"Actors","text":"as_actor\nActorTrait\nBaseActorTrait\nNextActorTrait\nErrorActorTrait\nCompletionActorTrait\nInvalidActorTrait","category":"page"},{"location":"api/actors/#Rocket.as_actor","page":"Actors","title":"Rocket.as_actor","text":"as_actor(any)\n\nThis function checks actor trait behavior specification. May be used explicitly to specify actor trait behavior for any object.\n\nSee also: ActorTrait\n\n\n\n\n\n","category":"function"},{"location":"api/actors/#Rocket.ActorTrait","page":"Actors","title":"Rocket.ActorTrait","text":"Abstract type for all possible actor traits\n\nSee also: BaseActorTrait, NextActorTrait, ErrorActorTrait, CompletionActorTrait, InvalidActorTrait\n\n\n\n\n\n","category":"type"},{"location":"api/actors/#Rocket.BaseActorTrait","page":"Actors","title":"Rocket.BaseActorTrait","text":"Base actor trait specifies actor to listen for all next!, error! and complete! events. BaseActorTrait is a subtype of ActorTrait.\n\nSee also: Actor\n\n\n\n\n\n","category":"type"},{"location":"api/actors/#Rocket.NextActorTrait","page":"Actors","title":"Rocket.NextActorTrait","text":"Next actor trait specifies actor to listen for next! events only. NextActorTrait is a subtype of ActorTrait.\n\nSee also: NextActor\n\n\n\n\n\n","category":"type"},{"location":"api/actors/#Rocket.ErrorActorTrait","page":"Actors","title":"Rocket.ErrorActorTrait","text":"Error actor trait specifies actor to listen for error! events only. ErrorActorTrait is a subtype of ActorTrait.\n\nSee also: ErrorActor\n\n\n\n\n\n","category":"type"},{"location":"api/actors/#Rocket.CompletionActorTrait","page":"Actors","title":"Rocket.CompletionActorTrait","text":"Completion actor trait specifies actor to listen for complete! events only. CompletionActorTrait is a subtype of ActorTrait.\n\nSee also: CompletionActor\n\n\n\n\n\n","category":"type"},{"location":"api/actors/#Rocket.InvalidActorTrait","page":"Actors","title":"Rocket.InvalidActorTrait","text":"Default actor trait behavior for any object. Actor with such a trait specificaion cannot be used as a valid actor in subscribe! function. Doing so will raise an error. InvalidActorTrait is a subtype of ActorTrait.\n\nSee also: ActorTrait\n\n\n\n\n\n","category":"type"},{"location":"api/actors/#Types","page":"Actors","title":"Types","text":"","category":"section"},{"location":"api/actors/","page":"Actors","title":"Actors","text":"AbstractActor\nActor\nNextActor\nErrorActor\nCompletionActor","category":"page"},{"location":"api/actors/#Rocket.AbstractActor","page":"Actors","title":"Rocket.AbstractActor","text":"Supertype type for Actor, NextActor, ErrorActor and CompletionActor types.\n\nSee also: Actor, NextActor, ErrorActor, CompletionActor\n\n\n\n\n\n","category":"type"},{"location":"api/actors/#Rocket.Actor","page":"Actors","title":"Rocket.Actor","text":"Can be used as a super type for common actor. Automatically specifies a BaseActorTrait trait behavior. Every Actor must implement its own methods for on_next!(actor, data), on_error!(actor, err) and on_complete!(actor) functions. Actor is a subtype of AbstractActor type.\n\nExamples\n\nusing Rocket\n\nstruct MyActor <: Actor{String} end\n\nRocket.as_actor(MyActor)\n\n# output\n\nBaseActorTrait{String}()\n\nSee also: AbstractActor, as_actor, BaseActorTrait, ActorTrait, on_next!, on_error!, on_complete!\n\n\n\n\n\n","category":"type"},{"location":"api/actors/#Rocket.NextActor","page":"Actors","title":"Rocket.NextActor","text":"Can be used as a super type for \"next-only\" actor. Automatically specifies a NextActorTrait trait behavior. Every NextActor must implement its own methods for on_next!(actor, data) function only. NextActor is a subtype of AbstractActor type.\n\nExamples\n\nusing Rocket\n\nstruct MyNextActor <: NextActor{String} end\n\nRocket.as_actor(MyNextActor)\n\n# output\n\nNextActorTrait{String}()\n\nSee also: AbstractActor, as_actor, NextActorTrait, ActorTrait, on_next!\n\n\n\n\n\n","category":"type"},{"location":"api/actors/#Rocket.ErrorActor","page":"Actors","title":"Rocket.ErrorActor","text":"Can be used as a super type for \"error-only\" actor. Automatically specifies a ErrorActorTrait trait behavior. Every ErrorActor must implement its own methods for on_error!(actor, err) function only. ErrorActor is a subtype of AbstractActor type.\n\nExamples\n\nusing Rocket\n\nstruct MyErrorActor <: ErrorActor{String} end\n\nRocket.as_actor(MyErrorActor)\n\n# output\n\nErrorActorTrait{String}()\n\nSee also: AbstractActor, as_actor, ErrorActorTrait, ActorTrait, on_error!\n\n\n\n\n\n","category":"type"},{"location":"api/actors/#Rocket.CompletionActor","page":"Actors","title":"Rocket.CompletionActor","text":"Can be used as a super type for \"completion-only\" actor. Automatically specifies a CompletionActorTrait trait behavior. Every CompletionActor must implement its own methods for on_complete!(actor) function only. CompletionActor is a subtype of AbstractActor type.\n\nExamples\n\nusing Rocket\n\nstruct MyCompletionActor <: CompletionActor{String} end\n\nRocket.as_actor(MyCompletionActor)\n\n# output\n\nCompletionActorTrait{String}()\n\nSee also: AbstractActor, as_actor, CompletionActorTrait, ActorTrait, on_complete!\n\n\n\n\n\n","category":"type"},{"location":"api/actors/#Events","page":"Actors","title":"Events","text":"","category":"section"},{"location":"api/actors/","page":"Actors","title":"Actors","text":"next!\nerror!\ncomplete!","category":"page"},{"location":"api/actors/#Rocket.next!","page":"Actors","title":"Rocket.next!","text":"next!(actor, data)\nnext!(actor, data, scheduler)\n\nThis function is used to deliver a \"next\" event to an actor with some data. Takes optional scheduler object to schedule execution of data delivery.\n\nSee also: AbstractActor, on_next!\n\n\n\n\n\n","category":"function"},{"location":"api/actors/#Rocket.error!","page":"Actors","title":"Rocket.error!","text":"error!(actor, err)\nerror!(actor, err, scheduler)\n\nThis function is used to deliver a \"error\" event to an actor with some err. Takes optional scheduler object to schedule execution of error delivery.\n\nSee also: AbstractActor, on_error!\n\n\n\n\n\n","category":"function"},{"location":"api/actors/#Rocket.complete!","page":"Actors","title":"Rocket.complete!","text":"complete!(actor)\ncomplete!(actor, scheduler)\n\nThis function is used to deliver a \"complete\" event to an actor. Takes optional scheduler object to schedule execution of complete event delivery.\n\nSee also: AbstractActor, on_complete!\n\n\n\n\n\n","category":"function"},{"location":"api/actors/","page":"Actors","title":"Actors","text":"on_next!\non_error!\non_complete!","category":"page"},{"location":"api/actors/#Rocket.on_next!","page":"Actors","title":"Rocket.on_next!","text":"on_next!(actor, data)\n\nBoth Actor and NextActor objects must implement its own method for on_next! function which will be called on \"next\" event.\n\nSee also: Actor, NextActor\n\n\n\n\n\n","category":"function"},{"location":"api/actors/#Rocket.on_error!","page":"Actors","title":"Rocket.on_error!","text":"on_error!(actor, err)\n\nBoth Actor and ErrorActor objects must implement its own method for on_error! function which will be called on \"error\" event.\n\nSee also: Actor, ErrorActor\n\n\n\n\n\n","category":"function"},{"location":"api/actors/#Rocket.on_complete!","page":"Actors","title":"Rocket.on_complete!","text":"on_complete!(actor)\n\nBoth Actor and CompletionActor objects must implement its own method for on_complete! function which will be called on \"complete\" event.\n\nSee also: Actor, CompletionActor\n\n\n\n\n\n","category":"function"},{"location":"api/actors/#Factory","page":"Actors","title":"Factory","text":"","category":"section"},{"location":"api/actors/","page":"Actors","title":"Actors","text":"AbstractActorFactory\ncreate_actor\nMissingCreateActorFactoryImplementationError","category":"page"},{"location":"api/actors/#Rocket.AbstractActorFactory","page":"Actors","title":"Rocket.AbstractActorFactory","text":"Abstract type for all possible actor factories\n\nSee also: Actor\n\n\n\n\n\n","category":"type"},{"location":"api/actors/#Rocket.create_actor","page":"Actors","title":"Rocket.create_actor","text":"create_actor(::Type{L}, factory::F) where { L, F <: AbstractActorFactory }\n\nActor creator function for a given factory F. Should be implemented explicitly for any AbstractActorFactory object\n\nSee also: AbstractActorFactory, MissingCreateActorFactoryImplementationError\n\n\n\n\n\n","category":"function"},{"location":"api/actors/#Rocket.MissingCreateActorFactoryImplementationError","page":"Actors","title":"Rocket.MissingCreateActorFactoryImplementationError","text":"This error will be throw if Julia cannot find specific method of 'create_actor()' function for given actor factory\n\nSee also: AbstractActorFactory, create_actor\n\n\n\n\n\n","category":"type"},{"location":"api/actors/#Errors","page":"Actors","title":"Errors","text":"","category":"section"},{"location":"api/actors/","page":"Actors","title":"Actors","text":"InvalidActorTraitUsageError\nInconsistentSourceActorDataTypesError\nMissingDataArgumentInNextCall\nMissingErrorArgumentInErrorCall\nExtraArgumentInCompleteCall\nMissingOnNextImplementationError\nMissingOnErrorImplementationError\nMissingOnCompleteImplementationError","category":"page"},{"location":"api/actors/#Rocket.InvalidActorTraitUsageError","page":"Actors","title":"Rocket.InvalidActorTraitUsageError","text":"This error will be thrown if next!, error! or complete! functions are called with invalid actor object\n\nSee also: next!, error!, complete!, InvalidActorTrait\n\n\n\n\n\n","category":"type"},{"location":"api/actors/#Rocket.InconsistentSourceActorDataTypesError","page":"Actors","title":"Rocket.InconsistentSourceActorDataTypesError","text":"This error will be thrown if next! function is called with inconsistent data type\n\nSee also: AbstractActor, Subscribable, next!\n\n\n\n\n\n","category":"type"},{"location":"api/actors/#Rocket.MissingDataArgumentInNextCall","page":"Actors","title":"Rocket.MissingDataArgumentInNextCall","text":"This error will be thrown if next! function is called without data argument\n\nSee also: next!\n\n\n\n\n\n","category":"type"},{"location":"api/actors/#Rocket.MissingErrorArgumentInErrorCall","page":"Actors","title":"Rocket.MissingErrorArgumentInErrorCall","text":"This error will be thrown if error! function is called without err argument\n\nSee also: error!\n\n\n\n\n\n","category":"type"},{"location":"api/actors/#Rocket.ExtraArgumentInCompleteCall","page":"Actors","title":"Rocket.ExtraArgumentInCompleteCall","text":"This error will be thrown if complete! function is called with extra data/err argument\n\nSee also: complete!\n\n\n\n\n\n","category":"type"},{"location":"api/actors/#Rocket.MissingOnNextImplementationError","page":"Actors","title":"Rocket.MissingOnNextImplementationError","text":"This error will be thrown if Julia cannot find specific method of 'on_next!()' function for given actor and data\n\nSee also: on_next!\n\n\n\n\n\n","category":"type"},{"location":"api/actors/#Rocket.MissingOnErrorImplementationError","page":"Actors","title":"Rocket.MissingOnErrorImplementationError","text":"This error will be thrown if Julia cannot find specific method of 'on_error!()' function for given actor\n\nSee also: on_error!\n\n\n\n\n\n","category":"type"},{"location":"api/actors/#Rocket.MissingOnCompleteImplementationError","page":"Actors","title":"Rocket.MissingOnCompleteImplementationError","text":"This error will be thrown if Julia cannot find specific method of 'on_complete!()' function for given actor and data\n\nSee also: on_next!\n\n\n\n\n\n","category":"type"},{"location":"observables/types/array/#observable_array","page":"Array","title":"Array Observable","text":"","category":"section"},{"location":"observables/types/array/","page":"Array","title":"Array","text":"from","category":"page"},{"location":"observables/types/array/#Rocket.from","page":"Array","title":"Rocket.from","text":"from(x; scheduler::H = AsapScheduler()) where { H <: AbstractScheduler }\nfrom(a::Vector{D}; scheduler::H = AsapScheduler()) where { D, H <: AbstractScheduler }\n\nCreation operator for the ArrayObservable that emits either a single value if x has a Scalar trait specification or a collection of values if x has a NonScalar trait specification. Throws an ErrorException if x has UndefinedScalarness trait type. To specify scalarness for arbitrary type T some can implement an additional method for scalarness(::Type{<:MyType}) function and to specify scalarness behavior. Optionally accepts custom scheduler-like object to schedule messages delivery.\n\nArguments\n\nx: an object to be wrapped into array of values\nscheduler: optional, scheduler-like object\n\nFor an object x to be a valid input for a from operator it must implement Rocket.scalarness(::Type{ <: T }) method which should return either Rocket.Scalar or Rocket.NonScalar objects. In first case from operator will treat x as a single scalar value and will wrap it into a vector while in the second case from operator will convert x object into an array using collect function.\n\nFor arbitrary iterable objects consider using iterable creation operator.\n\nNote\n\nfrom operators creates a copy of x using collect on a given object.\n\nExamples\n\nusing Rocket\n\nsource = from([ 0, 1, 2 ])\nsubscribe!(source, logger())\n;\n\n# output\n\n[LogActor] Data: 0\n[LogActor] Data: 1\n[LogActor] Data: 2\n[LogActor] Completed\n\n\nusing Rocket\n\nsource = from(( 0, 1, 2 ))\nsubscribe!(source, logger())\n;\n\n# output\n\n[LogActor] Data: 0\n[LogActor] Data: 1\n[LogActor] Data: 2\n[LogActor] Completed\n\n\nusing Rocket\n\nsource = from(0)\nsubscribe!(source, logger())\n;\n\n# output\n\n[LogActor] Data: 0\n[LogActor] Completed\n\n\nusing Rocket\n\nsource = from(\"Hello, world!\")\nsubscribe!(source, logger())\n;\n\n# output\n\n[LogActor] Data: H\n[LogActor] Data: e\n[LogActor] Data: l\n[LogActor] Data: l\n[LogActor] Data: o\n[LogActor] Data: ,\n[LogActor] Data:\n[LogActor] Data: w\n[LogActor] Data: o\n[LogActor] Data: r\n[LogActor] Data: l\n[LogActor] Data: d\n[LogActor] Data: !\n[LogActor] Completed\n\n\nSee also: ArrayObservable, subscribe!, logger, iterable\n\n\n\n\n\n","category":"function"},{"location":"observables/types/array/","page":"Array","title":"Array","text":"ArrayObservable","category":"page"},{"location":"observables/types/array/#Rocket.ArrayObservable","page":"Array","title":"Rocket.ArrayObservable","text":"ArrayObservable{D, H}(values::Vector{D}, scheduler::H) where { D, H }\n\nArrayObservable wraps a regular Julia array into an observable. Uses scheduler object to schedule messages delivery.\n\nConstructor arguments\n\nvalues: array of values to be wrapped\nscheduler: Scheduler-like object\n\nSee also: Subscribable, from\n\n\n\n\n\n","category":"type"},{"location":"api/teardown/#teardown_api","page":"Teardown","title":"Teardown API","text":"","category":"section"},{"location":"api/teardown/","page":"Teardown","title":"Teardown","text":"Any subscription-like object should implement a valid teardown logic.","category":"page"},{"location":"api/teardown/#Example","page":"Teardown","title":"Example","text":"","category":"section"},{"location":"api/teardown/","page":"Teardown","title":"Teardown","text":"using Rocket\n\nstruct MuCustomSubscription <: Teardown\n # some fields here\nend\n\nRocket.as_teardown(::Type{<:MuCustomSubscription}) = UnsubscribableTeardownLogic()\n\nfunction on_unsubscribe!(subscription::MyCustomSubscription)\n # dispose resources here\nend","category":"page"},{"location":"api/teardown/#Traits","page":"Teardown","title":"Traits","text":"","category":"section"},{"location":"api/teardown/","page":"Teardown","title":"Teardown","text":"TeardownLogic\nas_teardown\nUnsubscribableTeardownLogic\non_unsubscribe!\nCallableTeardownLogic\nVoidTeardownLogic\nInvalidTeardownLogic","category":"page"},{"location":"api/teardown/#Rocket.TeardownLogic","page":"Teardown","title":"Rocket.TeardownLogic","text":"Abstract type for all possible teardown logic traits.\n\nSee also: UnsubscribableTeardownLogic, CallableTeardownLogic, VoidTeardownLogic, InvalidTeardownLogic\n\n\n\n\n\n","category":"type"},{"location":"api/teardown/#Rocket.as_teardown","page":"Teardown","title":"Rocket.as_teardown","text":"as_teardown(::Type)\n\nThis function checks teardown trait behavior specification. Should be used explicitly to specify teardown logic trait behavior for any object.\n\nExamples\n\nusing Rocket\n\nstruct MySubscription <: Teardown end\n\nRocket.as_teardown(::Type{<:MySubscription}) = UnsubscribableTeardownLogic()\nRocket.on_unsubscribe!(s::MySubscription) = println(\"Unsubscribed!\")\n\nsubscription = MySubscription()\nunsubscribe!(subscription)\n;\n\n# output\n\nUnsubscribed!\n\nSee also: Teardown, TeardownLogic\n\n\n\n\n\n","category":"function"},{"location":"api/teardown/#Rocket.UnsubscribableTeardownLogic","page":"Teardown","title":"Rocket.UnsubscribableTeardownLogic","text":"Unsubscribable teardown logic trait behavior. Unsubscribable teardown object must define its own method for on_unsubscribe!() function which will be invoked when actor decides to unsubscribe! from Observable.\n\nSee also: TeardownLogic, on_unsubscribe!, unsubscribe!\n\n\n\n\n\n","category":"type"},{"location":"api/teardown/#Rocket.on_unsubscribe!","page":"Teardown","title":"Rocket.on_unsubscribe!","text":"on_unsubscribe!(teardown)\n\nEach valid teardown object with UnsubscribableTeardownLogic trait behavior must implement its own method for on_unsubscribe!() function which will be invoked when actor decides to unsubscribe! from Observable.\n\nSee also: Teardown, TeardownLogic, UnsubscribableTeardownLogic\n\n\n\n\n\n","category":"function"},{"location":"api/teardown/#Rocket.CallableTeardownLogic","page":"Teardown","title":"Rocket.CallableTeardownLogic","text":"Callable teardown logic trait behavior. Callable teardown object must be callable (insert meme with a surprised Pikachu here).\n\nSee also: TeardownLogic, on_unsubscribe!, unsubscribe!\n\n\n\n\n\n","category":"type"},{"location":"api/teardown/#Rocket.VoidTeardownLogic","page":"Teardown","title":"Rocket.VoidTeardownLogic","text":"Void teardown logic trait behavior. Void teardown object does nothing in unsubscribe! and may not define any additional methods.\n\nSee also: TeardownLogic, on_unsubscribe!, unsubscribe!\n\n\n\n\n\n","category":"type"},{"location":"api/teardown/#Rocket.InvalidTeardownLogic","page":"Teardown","title":"Rocket.InvalidTeardownLogic","text":"Default teardown logic trait behavour. Invalid teardwon object cannot be used in unsubscribe! function. Doing so will raise an error.\n\nSee also: TeardownLogic, on_unsubscribe!, unsubscribe!\n\n\n\n\n\n","category":"type"},{"location":"api/teardown/#Types","page":"Teardown","title":"Types","text":"","category":"section"},{"location":"api/teardown/","page":"Teardown","title":"Teardown","text":"Teardown\nunsubscribe!","category":"page"},{"location":"api/teardown/#Rocket.Teardown","page":"Teardown","title":"Rocket.Teardown","text":"Abstract type for any teardown object. Each teardown object must be a subtype of Teardown.\n\nSee also: TeardownLogic\n\n\n\n\n\n","category":"type"},{"location":"api/teardown/#Rocket.unsubscribe!","page":"Teardown","title":"Rocket.unsubscribe!","text":"unsubscribe!(subscription)\nunsubscribe!(subscriptions::Tuple)\nunsubscribe!(subscriptions::AbstractVector)\n\nunsubscribe! function is used to cancel Observable execution and to dispose any kind of resources used during an Observable execution. If the input argument to the unsubscribe! function is either a tuple or a vector, it will first check that all of the arguments are valid subscription objects and if its true will unsubscribe from each of them individually. \n\nSee also: Teardown, TeardownLogic, on_unsubscribe!\n\n\n\n\n\n","category":"function"},{"location":"api/teardown/#Errors","page":"Teardown","title":"Errors","text":"","category":"section"},{"location":"api/teardown/","page":"Teardown","title":"Teardown","text":"InvalidTeardownLogicTraitUsageError\nInvalidMultipleTeardownLogicTraitUsageError\nMissingOnUnsubscribeImplementationError","category":"page"},{"location":"api/teardown/#Rocket.InvalidTeardownLogicTraitUsageError","page":"Teardown","title":"Rocket.InvalidTeardownLogicTraitUsageError","text":"This error will be thrown if unsubscribe! function is called with invalid teardown object.\n\nSee also: unsubscribe!\n\n\n\n\n\n","category":"type"},{"location":"api/teardown/#Rocket.InvalidMultipleTeardownLogicTraitUsageError","page":"Teardown","title":"Rocket.InvalidMultipleTeardownLogicTraitUsageError","text":"This error will be thrown if unsubscribe! function is called with a tuple with invalid teardown object in it.\n\nSee also: unsubscribe!\n\n\n\n\n\n","category":"type"},{"location":"api/teardown/#Rocket.MissingOnUnsubscribeImplementationError","page":"Teardown","title":"Rocket.MissingOnUnsubscribeImplementationError","text":"This error will be thrown if Julia cannot find specific method of on_unsubscribe!() function for given teardown object.\n\nSee also: on_unsubscribe!\n\n\n\n\n\n","category":"type"},{"location":"operators/transformation/accumulated/#operator_accumulated","page":"accumulated","title":"Accumulated Operator","text":"","category":"section"},{"location":"operators/transformation/accumulated/","page":"accumulated","title":"accumulated","text":"accumulated","category":"page"},{"location":"operators/transformation/accumulated/#Rocket.accumulated","page":"accumulated","title":"Rocket.accumulated","text":"accumulated()\n\nCreates an accumulated operator, which returns an Observable that emits the current item with all of the previous items emitted by the source Observable in one single ordered array.\n\nProducing\n\nStream of type <: Subscribable{Vector{L}} where L refers to type of source stream\n\nExamples\n\nusing Rocket\n\nsource = from([ 1, 2, 3 ])\nsubscribe!(source |> accumulated(), logger())\n;\n\n# output\n\n[LogActor] Data: [1]\n[LogActor] Data: [1, 2]\n[LogActor] Data: [1, 2, 3]\n[LogActor] Completed\n\n\nusing Rocket\n\nsource = of(1)\nsubscribe!(source |> accumulated(), logger())\n;\n\n# output\n\n[LogActor] Data: [1]\n[LogActor] Completed\n\nSee also: AbstractOperator, InferableOperator, ProxyObservable, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/transformation/accumulated/#Description","page":"accumulated","title":"Description","text":"","category":"section"},{"location":"operators/transformation/accumulated/","page":"accumulated","title":"accumulated","text":"Combines all values emitted by the source, using an accumulator function that joins a new source value with the all past values emmited into one single array. This is similar to scan with vcat accumulation function.","category":"page"},{"location":"operators/transformation/accumulated/#See-also","page":"accumulated","title":"See also","text":"","category":"section"},{"location":"operators/transformation/accumulated/","page":"accumulated","title":"accumulated","text":"Operators","category":"page"},{"location":"operators/mathematical/max/#operator_max","page":"max","title":"Max Operator","text":"","category":"section"},{"location":"operators/mathematical/max/","page":"max","title":"max","text":"max","category":"page"},{"location":"operators/mathematical/max/#Base.max","page":"max","title":"Base.max","text":"max(; from = nothing)\n\nCreates a max operator, which emits a single item: the item with the largest value.\n\nArguments\n\nfrom: optional initial maximum value, if nothing first item from the source will be used as initial instead\n\nProducing\n\nStream of type <: Subscribable{Union{L, Nothing}} where L refers to type of source stream\n\nExamples\n\nusing Rocket\n\nsource = from([ i for i in 1:42 ])\nsubscribe!(source |> max(), logger())\n;\n\n# output\n\n[LogActor] Data: 42\n[LogActor] Completed\n\n\nSee also: AbstractOperator, InferableOperator, ProxyObservable, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/mathematical/max/#Description","page":"max","title":"Description","text":"","category":"section"},{"location":"operators/mathematical/max/","page":"max","title":"max","text":"The max operator operates on an Observable of similar objects. When the source Observable completes, it emits the item with the largest value.","category":"page"},{"location":"operators/mathematical/max/#See-also","page":"max","title":"See also","text":"","category":"section"},{"location":"operators/mathematical/max/","page":"max","title":"max","text":"Operators","category":"page"},{"location":"operators/errors/catch_error/#operator_catch_error","page":"catch_error","title":"Catch Error Operator","text":"","category":"section"},{"location":"operators/errors/catch_error/","page":"catch_error","title":"catch_error","text":"catch_error","category":"page"},{"location":"operators/errors/catch_error/#Rocket.catch_error","page":"catch_error","title":"Rocket.catch_error","text":"catch_error(selectorFn::F) where F\n\nCreates a CatchErrorOperator, which catches errors on the observable to be handled by returning a new observable or throwing an error.\n\nArguments:\n\nselectorFn::F: a callable object that takes as arguments err, which is the error, and caught, which is the source observable, in case you'd like to \"retry\" that observable by returning it again. Whatever observable is returned by the selector will be used to continue the observable chain.\n\nProducing\n\nStream of type <: Subscribable{L} where L refers to type of source stream\n\nExamples\n\nusing Rocket\n\nsource = from(1:5) |> safe() |> map(Int, (d) -> d == 4 ? error(4) : d) |> catch_error((err, obs) -> of(1))\n\nsubscribe!(source, logger())\n;\n\n# output\n[LogActor] Data: 1\n[LogActor] Data: 2\n[LogActor] Data: 3\n[LogActor] Data: 1\n[LogActor] Completed\n\nSee also: AbstractOperator, InferableOperator, rerun, logger, safe\n\n\n\n\n\n","category":"function"},{"location":"operators/errors/catch_error/#See-also","page":"catch_error","title":"See also","text":"","category":"section"},{"location":"operators/errors/catch_error/","page":"catch_error","title":"catch_error","text":"Operators","category":"page"},{"location":"operators/about/#section_operators","page":"Operator","title":"Operators","text":"","category":"section"},{"location":"operators/about/","page":"Operator","title":"Operator","text":"Even though the Observable is the foundation, reactive extensions are mostly useful because of their operators. Operators are the essential pieces that allow complex asynchronous code to be easily composed in a declarative manner.","category":"page"},{"location":"operators/about/#what_are_operators","page":"Operator","title":"What are operators?","text":"","category":"section"},{"location":"operators/about/","page":"Operator","title":"Operator","text":"There are two kinds of operators:","category":"page"},{"location":"operators/about/#Pipeable-operators","page":"Operator","title":"Pipeable operators","text":"","category":"section"},{"location":"operators/about/","page":"Operator","title":"Operator","text":"Pipeable Operators are the kind that can be piped to Observables using the syntax source |> operator(). These include the filter() and map() operators. When called, operators do not change the existing Observable instance. Instead, they return a new Observable, whose subscription logic is based on the first Observable.","category":"page"},{"location":"operators/about/","page":"Operator","title":"Operator","text":"note: Note\nA Pipeable Operator is a function that takes an Observable as its input and returns another Observable. It is a pure operation: the previous Observable remains unmodified.","category":"page"},{"location":"operators/about/","page":"Operator","title":"Operator","text":"A Pipeable Operator is essentially a pure callable object that accepts one Observable as input and returns another Observable as output. Subscribing to the output Observable will also subscribe to the input Observable.","category":"page"},{"location":"operators/about/","page":"Operator","title":"Operator","text":"For example, the operator called map() is analogous to the Array method of the same name. Just like the array method map((d) -> d ^ 2, [ 1, 2, 3 ]) yields [ 1, 4, 9 ], the Observable emits 1, 4, 9:","category":"page"},{"location":"operators/about/","page":"Operator","title":"Operator","text":"source = from([ 1, 2, 3 ])\nsubscribe!(source |> map(Int, (d) -> d ^ 2), lambda(\n on_next = (d) -> println(d)\n))\n\n// Logs:\n// 1\n// 4\n// 9","category":"page"},{"location":"operators/about/","page":"Operator","title":"Operator","text":"Another useful operator is first():","category":"page"},{"location":"operators/about/","page":"Operator","title":"Operator","text":"source = from([ 1, 2, 3 ])\nsubscribe!(source |> first(), lambda(\n on_next = (d) -> println(d),\n on_complete = () -> \"Completed\"\n))\n\n// Logs:\n// 1\n// Completed","category":"page"},{"location":"operators/about/#Creation-operators","page":"Operator","title":"Creation operators","text":"","category":"section"},{"location":"operators/about/","page":"Operator","title":"Operator","text":"Distinct from pipeable operators, creation operators are functions that can be used to create an Observable with some common predefined behavior or by joining other Observables. For example: from([ 1, 2, 3 ]) creates an observable that will sequentially emit 1, 2, and 3.","category":"page"},{"location":"operators/about/","page":"Operator","title":"Operator","text":"source = from([ 1, 2, 3 ])\nsubscribe!(source, lambda(\n on_next = (d) -> println(\"Value: $d\"),\n on_error = (e) -> println(\"Oh no, error: $e\")\n on_complete = () -> println(\"Completed\")\n))\n\n// Logs:\n// Value: 1\n// Value: 2\n// Value: 3\n// Completed","category":"page"},{"location":"operators/about/#Operators-piping","page":"Operator","title":"Operators piping","text":"","category":"section"},{"location":"operators/about/","page":"Operator","title":"Operator","text":"Pipeable operators are special objects that can be used like ordinary functions with on_call!(operator, source). In practice however they tend to accumulate and quickly grow unreadable: on_call!(operator1, on_call!(operator2, on_call!(operator3, source))). Therefore, Rocket.jl overloads |> for operators and Observables:","category":"page"},{"location":"operators/about/","page":"Operator","title":"Operator","text":"using Rocket\n\nsource = from(1:100) |> filter((d) -> d % 2 === 0) |> map(Int, (d) -> d ^ 2) |> sum()\n\nsubscribe!(source, logger())\n\n// Logs\n// [LogActor] Data: 171700\n// [LogActor] Completed","category":"page"},{"location":"operators/about/","page":"Operator","title":"Operator","text":"It is also possible to create an operator composition with + or |>. It might be useful to create an alias for some often used operator chain","category":"page"},{"location":"operators/about/","page":"Operator","title":"Operator","text":"using Rocket\n\nmapAndFilter = map(Int, d -> d ^ 2) + filter(d -> d % 2 == 0) \n\nsource = from(1:5) |> mapAndFilter\n\nsubscribe!(source, logger())\n\n// Logs\n// [LogActor] Data: 4\n// [LogActor] Data: 16\n// [LogActor] Completed\n\nmapAndFilterAndSum = mapAndFilter + sum()\n\nsource = from(1:5) |> mapAndFilterAndSum\n\nsubscribe!(source, logger())\n\n// Logs\n// [LogActor] Data: 20\n// [LogActor] Completed","category":"page"},{"location":"operators/about/","page":"Operator","title":"Operator","text":"For stylistic reasons, on_call!(operator, source) is never used in practice - even if there is only one operator. Instead, source |> operator() is generally preferred.","category":"page"},{"location":"observables/types/iterable/#observable_iterable","page":"Iterable","title":"Iterable Observable","text":"","category":"section"},{"location":"observables/types/iterable/","page":"Iterable","title":"Iterable","text":"iterable","category":"page"},{"location":"observables/types/iterable/#Rocket.iterable","page":"Iterable","title":"Rocket.iterable","text":"iterable(iterator; scheduler::H = AsapScheduler()) where { H <: AbstractScheduler }\n\nCreation operator for the IterableObservable that wraps given iterator into an observable object.\n\nArguments\n\niterator: an iterator object to be wrapped an observable\nscheduler: optional, scheduler-like object\n\nNote\n\niterable operators does not create a copy of iterator. Any changes in the iterator object might be visible in the created observable. For side-effects free behavior consider using from creation operator which creates a copy of a given object with a collect function.\n\nExamples\n\nusing Rocket\n\nsource = iterable([ 0, 1, 2 ])\nsubscribe!(source, logger())\n;\n\n# output\n\n[LogActor] Data: 0\n[LogActor] Data: 1\n[LogActor] Data: 2\n[LogActor] Completed\n\nusing Rocket\n\nsource = iterable(\"Hello\")\nsubscribe!(source, logger())\n;\n\n# output\n\n[LogActor] Data: H\n[LogActor] Data: e\n[LogActor] Data: l\n[LogActor] Data: l\n[LogActor] Data: o\n[LogActor] Completed\n\nSee also: ScheduledSubscribable, subscribe!, from\n\n\n\n\n\n","category":"function"},{"location":"observables/types/generate/#observable_generate","page":"Generate","title":"Generate Observable","text":"","category":"section"},{"location":"observables/types/generate/","page":"Generate","title":"Generate","text":"generate","category":"page"},{"location":"observables/types/generate/#Rocket.generate","page":"Generate","title":"Rocket.generate","text":"generate(initial::D, condition::C, iterator::I; scheduler::H = AsapScheduler()) where { D, C, I, H <: AbstractScheduler }\n\nGenerates an observable sequence by running a state-driven loop producing the sequence's elements, using the specified scheduler to send out observer messages.\n\nArguments\n\ninitial: initial state\ncondition: condition to terminate generation (upon returning false)\niterator: iteration step function\nscheduler: optional, scheduler-like object\n\nNote\n\niterator object should return objects of the same type as initial.\n\nExamples\n\nusing Rocket\n\nsource = generate(1, x -> x < 3, x -> x + 1)\nsubscribe!(source, logger())\n;\n\n# output\n[LogActor] Data: 1\n[LogActor] Data: 2\n[LogActor] Completed\n\nSee also: ScheduledSubscribable, subscribe!\n\n\n\n\n\n","category":"function"},{"location":"operators/filtering/ignore/#operator_ignore","page":"ignore","title":"Ignore operator","text":"","category":"section"},{"location":"operators/filtering/ignore/","page":"ignore","title":"ignore","text":"ignore","category":"page"},{"location":"operators/filtering/ignore/#Rocket.ignore","page":"ignore","title":"Rocket.ignore","text":"ignore(count::Int)\n\nCreates a ignore operator, which returns an Observable that skips the first count items emitted by the source Observable.\n\nArguments\n\ncount::Int: the number of times, items emitted by source Observable should be skipped.\n\nProducing\n\nStream of type <: Subscribable{L} where L refers to type of source stream\n\nExamples\n\nusing Rocket\n\nsource = from(1:5)\n\nsubscribe!(source |> ignore(2), logger())\n;\n\n# output\n\n[LogActor] Data: 3\n[LogActor] Data: 4\n[LogActor] Data: 5\n[LogActor] Completed\n\nSee also: AbstractOperator, InferableOperator, ProxyObservable, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/filtering/ignore/#See-also","page":"ignore","title":"See also","text":"","category":"section"},{"location":"operators/filtering/ignore/","page":"ignore","title":"ignore","text":"Operators","category":"page"},{"location":"subjects/types/replay/#subject_replay","page":"Replay","title":"ReplaySubject","text":"","category":"section"},{"location":"subjects/types/replay/","page":"Replay","title":"Replay","text":"ReplaySubject\nReplaySubjectFactory","category":"page"},{"location":"subjects/types/replay/#Rocket.ReplaySubject","page":"Replay","title":"Rocket.ReplaySubject","text":"ReplaySubject(::Type{D}, size::Int) where D\nReplaySubject(::Type{D}, size::Int, factory::F) where { D, F <: AbstractSubjectFactory }\nReplaySubject(::Type{D}, size::Int, subject::S) where { D, S }\n\nA variant of Subject that \"replays\" or emits old values to new subscribers. It buffers a set number of values and will emit those values immediately to any new subscribers in addition to emitting new values to existing subscribers.\n\nSee also: ReplaySubjectFactory, Subject, SubjectFactory\n\n\n\n\n\n","category":"function"},{"location":"subjects/types/replay/#Rocket.ReplaySubjectFactory","page":"Replay","title":"Rocket.ReplaySubjectFactory","text":"ReplaySubjectFactory(size::Int, factory::F) where { F <: AbstractSubjectFactory }\nReplaySubjectFactory(size::Int; scheduler::H = AsapScheduler()) where { H <: AbstractScheduler }\n\nA variant of SubjectFactory that creates an instance of ReplaySubject.\n\nSee also: SubjectFactory, AbstractSubjectFactory, ReplaySubject, Subject\n\n\n\n\n\n","category":"function"},{"location":"subjects/types/replay/#Description","page":"Replay","title":"Description","text":"","category":"section"},{"location":"subjects/types/replay/","page":"Replay","title":"Replay","text":"A ReplaySubject is similar to a BehaviorSubject in that it can send old values to new subscribers, but it can also record a part of the Observable execution.","category":"page"},{"location":"subjects/types/replay/","page":"Replay","title":"Replay","text":"note: Note\nA ReplaySubject records multiple values from the Observable execution and replays them to new subscribers.","category":"page"},{"location":"subjects/types/replay/#Examples","page":"Replay","title":"Examples","text":"","category":"section"},{"location":"subjects/types/replay/","page":"Replay","title":"Replay","text":"When creating a ReplaySubject, you can specify how many values to replay:","category":"page"},{"location":"subjects/types/replay/","page":"Replay","title":"Replay","text":"using Rocket\n\nsubject = ReplaySubject(Int, 3) # buffer 3 values for new subscribers\n\nsubscription1 = subscribe!(subject, logger(\"1\"))\n\nnext!(subject, 1)\nnext!(subject, 2)\nnext!(subject, 3)\nnext!(subject, 4)\n\nsubscription2 = subscribe!(subject, logger(\"2\"))\n\nnext!(subject, 5)\n\nunsubscribe!(subscription1)\nunsubscribe!(subscription2)\n\n// Logs\n// [1] Data: 1\n// [1] Data: 2\n// [1] Data: 3\n// [1] Data: 4\n// [2] Data: 2\n// [2] Data: 3\n// [2] Data: 4\n// [1] Data: 5\n// [2] Data: 5","category":"page"},{"location":"observables/about/#section_observables","page":"Observable","title":"Observables","text":"","category":"section"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"Observables are lazy Push collections of multiple values. They fill the missing spot in the following table:","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"Type Single Multiple\nPull Function Iterator\nPush Promise Observable","category":"page"},{"location":"observables/about/#First-example","page":"Observable","title":"First example","text":"","category":"section"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"For example, the following code specifies an Observable that pushes the values 1, 2, 3 immediately (synchronously) when subscribed to, and the value 4 after one second has passed since subscription.","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"using Rocket\n\nsource = make(Int) do actor\n next!(actor, 1)\n next!(actor, 2)\n next!(actor, 3)\n setTimeout(1000) do\n next!(actor, 4)\n complete!(actor)\n end\nend","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"To invoke the Observable and inspect these values, we need to subscribe to it. It is important to note that observables are lazy collections which means they don't emit anything until someone subscribes to it. Every subscription spawns its own independent execution of observable. There are some exceptions to this rule, e.g. Subjects and some operators (share(), etc..) which may change this behaviour","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"using Rocket\n\nsource = make(Int) do actor\n next!(actor, 1)\n next!(actor, 2)\n next!(actor, 3)\n setTimeout(1000) do\n next!(actor, 4)\n complete!(actor)\n end\nend\n\nprintln(\"Just before subscribe\")\nsubscribe!(source, lambda(\n on_next = (d) -> println(d),\n on_complete = () -> println(\"Completed\")\n))\nprintln(\"Just after subscribe\")\n\n# Logs\n# Just before subscribe\n# 1\n# 2\n# 3\n# Just after subscribe\n# 4\n# Completed","category":"page"},{"location":"observables/about/#Pull-vs-Push","page":"Observable","title":"Pull vs Push","text":"","category":"section"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"Pull and Push are two different protocols that describe how a data Producer communicates with a data Consumer.","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"In a Pull system, the Consumer determines when it receives data from the Producer. The Producer itself is unaware of when the data are delivered to the Consumer.","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"Every Julia Function is a Pull system. The function is a Producer of data, and the code that calls the function is consuming data by \"pulling\" a return value from the call.","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"Type PRODUCER CONSUMER\nPull Passive: produces data when requested. Active: decides when data is requested.\nPush Active: produces data at its own pace. Passive: reacts to received data.","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"In Push systems, the Producer determines when to send data to the Consumer. The Consumer is unaware of when it will receive that data.","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"Futures and promises are the most common type of Push systems today. A Promise (the Producer) delivers a resolved value to registered callbacks (the Consumers). Unlike functions, it is the Promise that determines precisely when a value is \"pushed\" to the callbacks.","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"Rocket.jl introduces Observables, a new Push system for Julia. An Observable is a Producer of multiple values, \"pushing\" them to Observers (Consumers or Actors).","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"A Function is a lazily evaluated computation that synchronously returns a single value on invocation.\nA Generator is a lazily evaluated computation that synchronously returns zero to (potentially) infinite values on iteration.\nA Promise is a computation that may (or may not) eventually return a single value.\nAn Observable is a lazily evaluated computation that can synchronously or asynchronously return zero to (potentially) infinite values from the time it's invoked.","category":"page"},{"location":"observables/about/#Observables-as-generalizations-of-functions","page":"Observable","title":"Observables as generalizations of functions","text":"","category":"section"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"In contrast to functions, Observables can \"return\" multiple values over time. For example, functions can't do this:","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"function foo()\n println(\"Hello!\")\n return 0\n return 1 # Dead code, will never happen\nend","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"Observables, however, can do this:","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"using Rocket\n\nfoo = make(Int) do actor\n next!(actor, 0)\n next!(actor, 1)\n complete!(actor)\nend\n","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"Observables can also \"return\" values asynchronously after some time:","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"using Rocket\n\nfoo = make(Int) do actor\n setTimeout(1000) do\n next!(actor, 0)\n complete!(actor)\n end\nend","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"Assume we have a function foo and some observable:","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"Function call foo(args...) means \"give me one value synchronously\" (pull strategy)\nIn contrast subscription to an observable with subscribe(observable, ...) means \"notify me about any amount of values, either synchronously or asynchronously\" (push strategy)","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"When a new value is available in an observable we say that the observable emits or generates an update. Values that are generated by an observable are sometimes also called future values, because there is no principled way to predict when an observable will generate a new value. In some programming languages, observables are referred to as generators or streams and we will use all three terms interchangeably.","category":"page"},{"location":"observables/about/#Anatomy-of-an-Observable","page":"Observable","title":"Anatomy of an Observable","text":"","category":"section"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"Observables are (1) created using creation operators (it is also possible to build an Observable from scratch with custom logic); (2) subscribed to with an Actor; (3) execute to deliver next! / error! / complete! notifications to the Actor, and (4) their execution may be disposed. These four aspects are all encoded in an Observable instance, but some of these aspects are related to other types, such as Subscribable and Subscription.","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"The core responsibilities of an Observable are:","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"Creating Observables\nSubscribing to Observables\nExecuting the Observable\nDisposing Observables","category":"page"},{"location":"observables/about/#Creating-Observables","page":"Observable","title":"Creating Observables","text":"","category":"section"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"You can create an Observable in various ways using Creation operators. You can also build an Observable from scratch. To see how you can build an Observable with custom logic, consult the API Section.","category":"page"},{"location":"observables/about/#Subscribing-to-Observables","page":"Observable","title":"Subscribing to Observables","text":"","category":"section"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"The Observable source in the example can be subscribed to.","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"using Rocket\n\nsubscribe!(source, lambda(\n on_next = (d) -> println(d)\n))","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"This example shows how subscribe calls are not shared among multiple Actors of the same Observable. When calling subscribe! with an Actor, the function on_subscribe! that is attached to this particular Observable is executed for that given actor. Each call to subscribe! triggers its own independent setup for that given actor.","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"note: Note\nSubscribing to an Observable is like calling a function, providing callbacks where the data will be delivered to.","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"The subscribe! function also supports multiple subscriptions at once. If the input argument to the subscribe! function is a tuple or a vector, it will first check that all of the arguments are valid source objects and actors and if its true will subscribe from each of them individually.","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"\nsource1 = Subject(Int)\nsource2 = Subject(Int)\n\nsubscriptions = subscribe!([\n (source1, logger()),\n (source2, logger()),\n])\n\n# Later on\n# unsubscribe!(subscriptions)\n","category":"page"},{"location":"observables/about/#Executing-Observables","page":"Observable","title":"Executing Observables","text":"","category":"section"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"The execution produces multiple values over time, either synchronously or asynchronously.","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"An Observable Execution can deliver three types of notifications:","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"Next: sends a value, such as an Int, String, Dict, etc.;\nError: sends any error as a value;\nComplete: does not send a value.","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"\"Next\" notifications are the most important and most common type: they represent actual data being delivered to an subscriber. \"Error\" and \"Complete\" notifications terminate the Observable Execution.","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"note: Note\nIn an Observable Execution, any number of Next notifications may be delivered. However, once a single Error or Complete notification is delivered, nothing else can be delivered afterwards.","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"The following is an example of an Observable execution that delivers three Next notifications and subsequently completes:","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"using Rocket\n\nsource = make(Int) do actor\n next!(actor, 1)\n next!(actor, 2)\n next!(actor, 3)\n complete!(actor)\nend\n\n# or the same with creation operator\n\nsource = from([ 1, 2, 3 ])","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"It is advised to wrap any code in subscribe by a try/catch block that delivers an Error notification upon an exception:","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"using Rocket\n\nsource = make(Int) do actor\n try\n next!(actor, 1)\n next!(actor, 2)\n next!(actor, 3)\n complete!(actor)\n catch e\n error!(actor, e)\n end\nend\n","category":"page"},{"location":"observables/about/#Disposing-Observable-Executions","page":"Observable","title":"Disposing Observable Executions","text":"","category":"section"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"It is common for an Actor to abort execution of an Observable Execution. Once the Actor is done receiving values, it may stop the execution in order to free computation power or memory resources.","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"When subscribe! is called, the Actor gets attached to the newly created Observable execution. This call also returns an object, the Subscription:","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"subscription = subscribe!(source, actor)","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"The Subscription represents the ongoing execution, and has a minimal API that allows you to cancel the execution. Read more about Subscription type here.","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"With","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"unsubscribe!(subscription)","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"you can cancel the ongoing execution.","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"note: Note\nsubscribe! returns a Subscription that represents the ongoing execution. Simply call unsubscribe! on the Subscription to cancel the execution.","category":"page"},{"location":"actors/types/circularkeep/#actor_circularkeep","page":"CircularKeep","title":"CircularKeep actor","text":"","category":"section"},{"location":"actors/types/circularkeep/","page":"CircularKeep","title":"CircularKeep","text":"circularkeep","category":"page"},{"location":"actors/types/circularkeep/#Rocket.circularkeep","page":"CircularKeep","title":"Rocket.circularkeep","text":"circularkeep(::Type{T}, capacity::Int) where T\n\nArguments\n\n::Type{T}: Type of keep data\ncapacity::Int: circular buffer capacity\n\nCreation operator for the CircularKeepActor actor.\n\nExamples\n\nusing Rocket\n\nactor = circularkeep(Int, 3)\nactor isa CircularKeepActor{Int}\n\n# output\ntrue\n\nSee also: CircularKeepActor, AbstractActor\n\n\n\n\n\n","category":"function"},{"location":"actors/types/circularkeep/","page":"CircularKeep","title":"CircularKeep","text":"CircularKeepActor","category":"page"},{"location":"actors/types/circularkeep/#Rocket.CircularKeepActor","page":"CircularKeep","title":"Rocket.CircularKeepActor","text":"CirucalKeepActor{D}() where D\n\nCircual keep actor is similar to keep actor, but uses CircularBuffer as a storage. It saves all incoming successful next events in a values circular buffer, throws an ErrorException on error! event and does nothing on completion event.\n\nExamples\n\nusing Rocket\n\nsource = from(1:5)\nactor = circularkeep(Int, 3)\n\nsubscribe!(source, actor)\nshow(getvalues(actor))\n\n# output\n[3, 4, 5]\n\nSee also: Actor, keep, circularkeep\n\n\n\n\n\n","category":"type"},{"location":"operators/utility/default_if_empty/#operator_ref_default_if_empty","page":"default_if_empty","title":"DefaultIfEmpty Operator","text":"","category":"section"},{"location":"operators/utility/default_if_empty/","page":"default_if_empty","title":"default_if_empty","text":"default_if_empty","category":"page"},{"location":"operators/utility/default_if_empty/#Rocket.default_if_empty","page":"default_if_empty","title":"Rocket.default_if_empty","text":"default_if_empty(value::T)\ndefault_if_empty(callback::Function)\n\nCreates a default_if_empty operator, which emits a given value if the source Observable completes without emitting any next value, otherwise mirrors the source Observable. Optionally accepts a zero-argument callback that will be executed to generate default value. Note: Callback function's output is always converted to the eltype of the original observable.\n\nusing Rocket\n\nsource = completed(Int) |> default_if_empty(0)\n\nsubscribe!(source, logger())\n;\n\n# output\n[LogActor] Data: 0\n[LogActor] Completed\n\nusing Rocket\n\nsource = completed(Int) |> default_if_empty(() -> 42)\n\nsubscribe!(source, logger())\n;\n\n# output\n[LogActor] Data: 42\n[LogActor] Completed\n\nSee also: AbstractOperator, InferableOperator, logger, map\n\n\n\n\n\n","category":"function"},{"location":"operators/utility/default_if_empty/#Description","page":"default_if_empty","title":"Description","text":"","category":"section"},{"location":"operators/utility/default_if_empty/","page":"default_if_empty","title":"default_if_empty","text":"default_if_empty emits the values emitted by the source Observable or a specified default value if the source Observable is empty (completes without having emitted any next value).","category":"page"},{"location":"operators/utility/default_if_empty/#See-also","page":"default_if_empty","title":"See also","text":"","category":"section"},{"location":"operators/utility/default_if_empty/","page":"default_if_empty","title":"default_if_empty","text":"Operators","category":"page"},{"location":"observables/types/never/#observable_never","page":"Never","title":"Never Observable","text":"","category":"section"},{"location":"observables/types/never/","page":"Never","title":"Never","text":"never","category":"page"},{"location":"observables/types/never/#Rocket.never","page":"Never","title":"Rocket.never","text":"never(T = Any)\n\nCreation operator for the NeverObservable that emits neither values nor errors nor the completion notification. It can be used for testing purposes or for composing with other Observables. Please note that by never emitting a complete notification, this Observable keeps the subscription from being disposed automatically. Subscriptions need to be manually disposed.\n\nArguments\n\nT: Type of Observable data, optional, Any is the default\n\nExamples\n\nusing Rocket\n\nsource = never()\nsubscribe!(source, logger())\n;\n\n# output\n\n\nSee also: NeverObservable, subscribe!, logger\n\n\n\n\n\n","category":"function"},{"location":"observables/types/never/","page":"Never","title":"Never","text":"NeverObservable","category":"page"},{"location":"observables/types/never/#Rocket.NeverObservable","page":"Never","title":"Rocket.NeverObservable","text":"NeverObservable{D}()\n\nAn Observable that emits no items to the Observer and never completes.\n\nType parameters\n\nD: Type of Observable data\n\nSee also: Subscribable, never\n\n\n\n\n\n","category":"type"},{"location":"operators/utility/about/#Utility-category","page":"About utility operators","title":"Utility category","text":"","category":"section"},{"location":"operators/utility/about/","page":"About utility operators","title":"About utility operators","text":"There are operators for different purposes, and they may be categorized as: creation, transformation, filtering, joining, multicasting, error handling, utility, etc. In the following list you will find all the operators organized in utility category.","category":"page"},{"location":"operators/utility/about/","page":"About utility operators","title":"About utility operators","text":"tap\ntap_on_subscribe\ntap_on_unsubscribe\ntap_on_complete\ndelay\nsafe\nnoop\nref_count\nasync\ndefault_if_empty\nerror_if_empty\nskip_next\nskip_error\nskip_complete\ndiscontinue\nlimit_subscribers","category":"page"},{"location":"operators/utility/about/#See-also","page":"About utility operators","title":"See also","text":"","category":"section"},{"location":"operators/utility/about/","page":"About utility operators","title":"About utility operators","text":"Operators","category":"page"},{"location":"operators/all/#operators_list","page":"All","title":"List of all available operators","text":"","category":"section"},{"location":"operators/all/","page":"All","title":"All","text":"There are operators for different purposes, and they may be categorized as: creation, transformation, filtering, joining, multicasting, error handling, utility, etc.","category":"page"},{"location":"operators/all/#Creation-operators","page":"All","title":"Creation operators","text":"","category":"section"},{"location":"operators/all/","page":"All","title":"All","text":"make\nof\nfrom\niterable\nfaulted\nnever\ncompleted\ntimer\ninterval\nproxy\nfile\ncombined\nrace\nconnectable\nmerged\nconcat\ngenerate\nnetwork\ndefer\nzipped","category":"page"},{"location":"operators/all/#Transformation-operators","page":"All","title":"Transformation operators","text":"","category":"section"},{"location":"operators/all/","page":"All","title":"All","text":"map\nmap_to\nscan\naccumulated\nenumerate\nuppercase\nlowercase\nto_array\nswitch_map\nswitch_map_to\nmerge_map\nconcat_map\nconcat_map_to\nexhaust_map\nstart_with\npairwise\nsubstitute\noverride","category":"page"},{"location":"operators/all/#Filtering-operators","page":"All","title":"Filtering operators","text":"","category":"section"},{"location":"operators/all/","page":"All","title":"All","text":"filter\nfilter_type\nsome\ntake\ntake_until\nfirst\nlast\nfind\nfind_index\nignore","category":"page"},{"location":"operators/all/#Mathematical-and-Aggregate-operators","page":"All","title":"Mathematical and Aggregate operators","text":"","category":"section"},{"location":"operators/all/","page":"All","title":"All","text":"count\nmax\nmin\nreduce\nsum","category":"page"},{"location":"operators/all/#Error-handling-operators","page":"All","title":"Error handling operators","text":"","category":"section"},{"location":"operators/all/","page":"All","title":"All","text":"catch_error\nrerun\nerror_if\nerror_if_not","category":"page"},{"location":"operators/all/#Join-operator","page":"All","title":"Join operator","text":"","category":"section"},{"location":"operators/all/","page":"All","title":"All","text":"with_latest","category":"page"},{"location":"operators/all/#Multicasting-operators","page":"All","title":"Multicasting operators","text":"","category":"section"},{"location":"operators/all/","page":"All","title":"All","text":"multicast\npublish\npublish_behavior\npublish_replay\nshare\nshare_replay","category":"page"},{"location":"operators/all/#Utility-operators","page":"All","title":"Utility operators","text":"","category":"section"},{"location":"operators/all/","page":"All","title":"All","text":"tap\ntap_on_subscribe\ntap_on_unsubscribe\ntap_on_complete\ndelay\nsafe\nnoop\nref_count\nasync\ndefault_if_empty\nerror_if_empty\nskip_next\nskip_error\nskip_complete\ndiscontinue\nlimit_subscribers","category":"page"},{"location":"observables/types/concat/#observable_concat","page":"Concat","title":"Concat Observable","text":"","category":"section"},{"location":"observables/types/concat/","page":"Concat","title":"Concat","text":"concat","category":"page"},{"location":"observables/types/concat/#Rocket.concat","page":"Concat","title":"Rocket.concat","text":"concat(sources...)\nconcat(sources::S) where { S <: Tuple }\n\nCombines multiple Observables to create an Observable which sequentially emits all values from given Observable and then moves on to the next. All values of each passed Observable merged into a single Observable, in order, in serial fashion.\n\nArguments\n\nsources: input sources\n\nExamples\n\nusing Rocket\n\nsource1 = of(1)\nsource2 = of(2)\n\nsubscribe!(concat(source1, source2), logger())\n;\n\n# output\n[LogActor] Data: 1\n[LogActor] Data: 2\n[LogActor] Completed\n\nusing Rocket\n\nsource1 = of(1) |> async()\nsource2 = of(2)\n\nsubscribe!(concat(source1, source2), logger())\n;\n\n# output\n[LogActor] Data: 1\n[LogActor] Data: 2\n[LogActor] Completed\n\nSee also: Subscribable, subscribe!\n\n\n\n\n\n","category":"function"},{"location":"observables/types/labeled/#observable_labeled","page":"Labeled","title":"Labeled Observable","text":"","category":"section"},{"location":"observables/types/labeled/","page":"Labeled","title":"Labeled","text":"labeled","category":"page"},{"location":"observables/types/labeled/#Rocket.labeled","page":"Labeled","title":"Rocket.labeled","text":"labeled(names::Val, stream)\n\nCreation operator for the LabeledObservable that wraps given stream, that produces Tuple values into a NamedTuple with given names.\n\nArguments\n\nnames: a Val object that contains a tuple of symbols\nstream: an observable that emits a Tuple, length of the Tuple events must be equal to the length of the names argument\n\nExamples\n\nusing Rocket\n\nsource = labeled(Val((:x, :y)), from([ (1, 2), (2, 3), (3, 4) ]))\nsubscribe!(source, logger())\n;\n\n# output\n\n[LogActor] Data: (x = 1, y = 2)\n[LogActor] Data: (x = 2, y = 3)\n[LogActor] Data: (x = 3, y = 4)\n[LogActor] Completed\n\nSee also: ScheduledSubscribable, subscribe!, from\n\n\n\n\n\n","category":"function"},{"location":"observables/types/labeled/","page":"Labeled","title":"Labeled","text":"LabeledObservable","category":"page"},{"location":"observables/types/labeled/#Rocket.LabeledObservable","page":"Labeled","title":"Rocket.LabeledObservable","text":"LabeledObservable{D, S}()\n\nAn Observable that emits NamesTuple items from a source Observable that emits Tuple items.\n\nSee also: Subscribable, labeled\n\n\n\n\n\n","category":"type"},{"location":"actors/types/lambda/#actor_lambda","page":"Lambda","title":"Lambda actor","text":"","category":"section"},{"location":"actors/types/lambda/","page":"Lambda","title":"Lambda","text":"lambda","category":"page"},{"location":"actors/types/lambda/#Rocket.lambda","page":"Lambda","title":"Rocket.lambda","text":"lambda(; on_next = nothing, on_error = nothing, on_complete = nothing)\nlambda(::Type{T}; on_next = nothing, on_error = nothing, on_complete = nothing) where T\n\nCreation operator for the 'LambdaActor' actor.\n\nExamples\n\nusing Rocket\n\nactor = lambda(Int; on_next = (d) -> println(d))\nactor isa LambdaActor{Int}\n\n# output\ntrue\n\nSee also: LambdaActor, AbstractActor\n\n\n\n\n\n","category":"function"},{"location":"actors/types/lambda/","page":"Lambda","title":"Lambda","text":"LambdaActor","category":"page"},{"location":"actors/types/lambda/#Rocket.LambdaActor","page":"Lambda","title":"Rocket.LambdaActor","text":"LambdaActor{D, N, E, C}(on_next::N, on_error::E, on_complete::C) where D\n\nLambda actor wraps on_next, on_error, on_complete callbacks for data, error and complete events. Should not be used explicitly, use lambda creation operator instead.\n\nConstructor arguments\n\non_next: Callback for data event. Optional. Default is nothing.\non_error: Callback for error event. Optional. Default is nothing.\non_complete: Callback for complete event. Optional. Default is nothing.\n\nSee also: Actor, lambda\n\n\n\n\n\n","category":"type"},{"location":"operators/utility/error_if_empty/#operator_ref_error_if_empty","page":"error_if_empty","title":"ErrorIfEmpty Operator","text":"","category":"section"},{"location":"operators/utility/error_if_empty/","page":"error_if_empty","title":"error_if_empty","text":"error_if_empty","category":"page"},{"location":"operators/utility/error_if_empty/#Rocket.error_if_empty","page":"error_if_empty","title":"Rocket.error_if_empty","text":"error_if_empty(err)\n\nCreates a error_if_empty operator, which emits a given error if the source Observable completes without emitting any next value, otherwise mirrors the source Observable.\n\nusing Rocket\n\nsource = completed(Int) |> error_if_empty(\"Empty\")\n\nsubscribe!(source, logger())\n;\n\n# output\n[LogActor] Error: Empty\n\nSee also: AbstractOperator, InferableOperator, logger, map\n\n\n\n\n\n","category":"function"},{"location":"operators/utility/error_if_empty/#Description","page":"error_if_empty","title":"Description","text":"","category":"section"},{"location":"operators/utility/error_if_empty/","page":"error_if_empty","title":"error_if_empty","text":"error_if_empty emits the values emitted by the source Observable or a specified error message if the source Observable is empty (completes without having emitted any next value).","category":"page"},{"location":"operators/utility/error_if_empty/#See-also","page":"error_if_empty","title":"See also","text":"","category":"section"},{"location":"operators/utility/error_if_empty/","page":"error_if_empty","title":"error_if_empty","text":"Operators","category":"page"},{"location":"subjects/types/subject/#subject","page":"Subject","title":"Subject","text":"","category":"section"},{"location":"subjects/types/subject/","page":"Subject","title":"Subject","text":"Subject\nSubjectFactory","category":"page"},{"location":"subjects/types/subject/#Rocket.Subject","page":"Subject","title":"Rocket.Subject","text":"Subject(::Type{D}; scheduler::H = AsapScheduler())\n\nA Subject is a special type of Observable that allows values to be multicasted to many Observers. Subjects are like EventEmitters. Every Subject is an Observable and an Actor. You can subscribe to a Subject, and you can call next! to feed values as well as error! and complete!.\n\nNote: By convention, every actor subscribed to a Subject observable is not allowed to throw exceptions during next!, error! and complete! calls. Doing so would lead to undefined behaviour. Use safe() operator to bypass this rule. \n\nSee also: SubjectFactory, ReplaySubject, BehaviorSubject, safe\n\n\n\n\n\n","category":"type"},{"location":"subjects/types/subject/#Rocket.SubjectFactory","page":"Subject","title":"Rocket.SubjectFactory","text":"SubjectFactory(scheduler::H) where { H <: AbstractScheduler }\n\nA base subject factory that creates an instance of Subject with specified scheduler.\n\nSee also: AbstractSubjectFactory, Subject\n\n\n\n\n\n","category":"type"},{"location":"subjects/types/subject/#Description","page":"Subject","title":"Description","text":"","category":"section"},{"location":"subjects/types/subject/","page":"Subject","title":"Subject","text":"Every Subject is an Observable. Given a Subject, you can subscribe to it, providing an Actor, which will start receiving values normally. From the perspective of the Observer, it cannot tell whether the Observable execution is coming from a plain unicast Observable or a Subject.","category":"page"},{"location":"subjects/types/subject/","page":"Subject","title":"Subject","text":"Internally to the Subject, subscribe does not invoke a new execution that delivers values. It simply registers the given Observer in a list of Observers.","category":"page"},{"location":"subjects/types/subject/","page":"Subject","title":"Subject","text":"Every Subject is an Actor. It is an object with the methods next!, error!, and complete!. To feed a new value to the Subject, just call next!(subject, theValue), and it will be multicasted to the Actors registered to listen to the Subject.","category":"page"},{"location":"subjects/types/subject/","page":"Subject","title":"Subject","text":"note: Note\nBy convention, every actor subscribed to a Subject observable is not allowed to throw exceptions during next!, error! and complete! calls. Doing so would lead to undefined behaviour. Use safe() operator to bypass this rule. ","category":"page"},{"location":"subjects/types/subject/#Examples","page":"Subject","title":"Examples","text":"","category":"section"},{"location":"subjects/types/subject/","page":"Subject","title":"Subject","text":"In the following example, the BehaviorSubject is initialized with the value 0 which the first Observer receives when it subscribes. The second Observer receives the value 2 even though it subscribed after the value 2 was sent.","category":"page"},{"location":"subjects/types/subject/","page":"Subject","title":"Subject","text":"using Rocket\n\nsubject = Subject(Int)\n\nsubscription1 = subscribe!(subject, logger(\"1\"))\n\nnext!(subject, 1)\nnext!(subject, 2)\n\nsubscription2 = subscribe!(subject, logger(\"2\"))\n\nnext!(subject, 3)\n\nunsubscribe!(subscription1)\nunsubscribe!(subscription2)\n\n// Logs\n// [1] Data: 1\n// [1] Data: 2\n// [1] Data: 3\n// [2] Data: 3","category":"page"},{"location":"utils/#Utils","page":"Utils","title":"Utils","text":"","category":"section"},{"location":"utils/","page":"Utils","title":"Utils","text":"setTimeout\nRocket.combined_type\nRocket.union_type","category":"page"},{"location":"utils/#Rocket.setTimeout","page":"Utils","title":"Rocket.setTimeout","text":"setTimeout(f::Function, timeout::Int)\n\nCreates a Task which will asynchornously invoke fucntion f after specified timeout time in milliseconds.\n\nArguments\n\nf::Function, function to be invoked asynchronously\ntimeout::Int, timeout in milliseconds\n\nExamples\n\nusing Rocket\nusing Dates\n\nprintln(\"Before: \", Dates.format(now(), \"MM:SS\"))\nsetTimeout(1000) do\n println(\"Inside: \", Dates.format(now(), \"MM:SS\"))\nend\nprintln(\"Right after: \", Dates.format(now(), \"MM:SS\"))\n;\n\n# Logs\n# Before: 20:59\n# Right after: 20:59\n# Inside: 21:00\n\n\n\n\n\n","category":"function"},{"location":"utils/#Rocket.combined_type","page":"Utils","title":"Rocket.combined_type","text":"combined_type(sources)\n\nReturns a Tuple el-type of observable el-types in sources argument in the same order\n\n\n\n\n\n","category":"function"},{"location":"utils/#Rocket.union_type","page":"Utils","title":"Rocket.union_type","text":"union_type(sources)\n\nReturns a Union el-type of observable el-types in sources argument\n\n\n\n\n\n","category":"function"},{"location":"utils/#Helpers","page":"Utils","title":"Helpers","text":"","category":"section"},{"location":"utils/","page":"Utils","title":"Utils","text":"Rocket.@MStorage\nRocket.setstorage!","category":"page"},{"location":"utils/#Rocket.@MStorage","page":"Utils","title":"Rocket.@MStorage","text":"@MStorage(n::Int)\n\nHelper function to generate tuple-like structure MStorageN, but with mutable fields and empty constructor. It is possible then to take a snapshot(::MStorage) which returns a tuple with the same types and values from storage. Some operators and observables use pregenerated MStorage to instatiate uninitialized mutable storage in case when stream is allowed to not emit any values before completion.\n\nGenerated structure layout\n\nstruct MStorageN{V1, V2, ..., VN}\n v1 :: V1\n v2 :: V2\n ...\n vn :: VN\nend\n\nSee also: setstorage!\n\n\n\n\n\n","category":"macro"},{"location":"utils/#Rocket.setstorage!","page":"Utils","title":"Rocket.setstorage!","text":"setstorage!(s, v, ::Val{I}) where I\n\nThis function can be used to set a new value v for storage s with a given value v and index I. Using parametrized Val{I} for indexing ensures for index to be resolved at compile-time and if-else branch optimization.\n\nSee also: @MStorage\n\n\n\n\n\n","category":"function"},{"location":"observables/types/completed/#observable_completed","page":"Completed","title":"Completed Observable","text":"","category":"section"},{"location":"observables/types/completed/","page":"Completed","title":"Completed","text":"completed","category":"page"},{"location":"observables/types/completed/#Rocket.completed","page":"Completed","title":"Rocket.completed","text":"completed(::Type{T} = Any; scheduler::H = AsapScheduler()) where { T, H <: AbstractScheduler }\n\nCreation operator for the CompletedObservable that emits no items to the Actor and immediately sends a complete notification on subscription.\n\nArguments\n\nT: type of output data source, optional, Any is the default\nscheduler: optional, scheduler-like object\n\nExamples\n\nusing Rocket\n\nsource = completed(Int)\nsubscribe!(source, logger())\n;\n\n# output\n\n[LogActor] Completed\n\n\nSee also: CompletedObservable, subscribe!, logger\n\n\n\n\n\n","category":"function"},{"location":"observables/types/completed/","page":"Completed","title":"Completed","text":"CompletedObservable","category":"page"},{"location":"observables/types/completed/#Rocket.CompletedObservable","page":"Completed","title":"Rocket.CompletedObservable","text":"CompletedObservable{D, H}(scheduler::H)\n\nObservable that emits no items to the Actor and just sends a complete notification on subscription.\n\nConstructor arguments\n\nscheduler: Scheduler-like object\n\nSee also: Subscribable, completed\n\n\n\n\n\n","category":"type"},{"location":"operators/utility/tap/#operator_tap","page":"tap","title":"Tap Operator","text":"","category":"section"},{"location":"operators/utility/tap/","page":"tap","title":"tap","text":"tap","category":"page"},{"location":"operators/utility/tap/#Rocket.tap","page":"tap","title":"Rocket.tap","text":"tap(tapFn::F) where { F <: Function }\n\nCreates a tap operator, which performs a side effect for every emission on the source Observable, but return an Observable that is identical to the source.\n\nArguments\n\ntapFn::Function: side-effect tap function with (data) -> Nothing signature\n\nProducing\n\nStream of type <: Subscribable{L} where L refers to type of source stream\n\nExamples\n\nusing Rocket\n\nsource = from([ 1, 2, 3 ])\nsubscribe!(source |> tap((d) -> println(\"In tap: $d\")), logger())\n;\n\n# output\n\nIn tap: 1\n[LogActor] Data: 1\nIn tap: 2\n[LogActor] Data: 2\nIn tap: 3\n[LogActor] Data: 3\n[LogActor] Completed\n\n\nSee also: tap_on_subscribe, tap_on_complete, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/utility/tap/#Description","page":"tap","title":"Description","text":"","category":"section"},{"location":"operators/utility/tap/","page":"tap","title":"tap","text":"Returns an Observable that resembles the source Observable, but modifies it so that the provided Observer is called to perform a side effect for every value emitted by the source.","category":"page"},{"location":"operators/utility/tap/","page":"tap","title":"tap","text":"This operator is useful for debugging your Observables, verifying correct values, or performing other side effects.","category":"page"},{"location":"operators/utility/tap/","page":"tap","title":"tap","text":"Note: this operator differs from a subscribe on the Observable. If the Observable returned by tap is not subscribed, the side effects specified by the Observer will never happen. tap therefore simply spies on existing execution, it does not trigger an execution to happen like subscribe does.","category":"page"},{"location":"operators/utility/tap/#See-also","page":"tap","title":"See also","text":"","category":"section"},{"location":"operators/utility/tap/","page":"tap","title":"tap","text":"Operators","category":"page"},{"location":"observables/types/network/#observable_network","page":"Network","title":"Network Observable","text":"","category":"section"},{"location":"observables/types/network/","page":"Network","title":"Network","text":"network","category":"page"},{"location":"observables/types/network/#Rocket.network","page":"Network","title":"Rocket.network","text":"network(::Type{D}, port::Int) where D\nnetwork(::Type{D}, address::A, port::Int) where { D, A <: IPAddr }\n\nnetwork(::Type{Vector{D}}, port::Int, buffer_size::Int) where D\nnetwork(::Type{Vector{D}}, address::A, port::Int, buffer_size::Int) where { D, A <: IPAddr }\n\nCreation operator for the NetworkObservable that emits messages from the server with specified address and port arguments.\n\nSee also: NetworkObservable, subscribe!\n\n\n\n\n\n","category":"function"},{"location":"observables/types/network/","page":"Network","title":"Network","text":"NetworkObservable","category":"page"},{"location":"observables/types/network/#Rocket.NetworkObservable","page":"Network","title":"Rocket.NetworkObservable","text":"NetworkObservable{D, Address, Port, S}()\n\nNetworkObservable listens for the messages of type D from remote server with specified Address and Port parameters.\n\nSee also: network, Subscribable\n\n\n\n\n\n","category":"type"},{"location":"observables/types/function/#observable_function","page":"Function","title":"Function Observable","text":"","category":"section"},{"location":"observables/types/function/","page":"Function","title":"Function","text":"make","category":"page"},{"location":"observables/types/function/#Rocket.make","page":"Function","title":"Rocket.make","text":"make(f::Function, type::Type{D})\n\nCreation operator for the FunctionObservable.\n\nArguments\n\nf: function to be invoked on subscription\ntype: type of data in observable\n\nExamples\n\nusing Rocket\n\nsource = make(Int) do actor\n next!(actor, 0)\n complete!(actor)\nend\n\nsubscription = subscribe!(source, logger());\nunsubscribe!(subscription)\n;\n\n# output\n\n[LogActor] Data: 0\n[LogActor] Completed\n\n\nusing Rocket\n\nsource = make(Int) do actor\n next!(actor, 0)\n setTimeout(100) do\n next!(actor, 1)\n complete!(actor)\n end\nend\n\nsubscription = subscribe!(source, logger())\nunsubscribe!(subscription)\n;\n\n# output\n\n[LogActor] Data: 0\n\nSee also: FunctionObservable, subscribe!, logger\n\n\n\n\n\n","category":"function"},{"location":"observables/types/function/","page":"Function","title":"Function","text":"FunctionObservable","category":"page"},{"location":"observables/types/function/#Rocket.FunctionObservable","page":"Function","title":"Rocket.FunctionObservable","text":"FunctionObservable{D}(f::F)\n\nFunctionObservable wraps a callback f, which is called when the Observable is initially subscribed to. This function is given an Actor, to which new values can be nexted (with next!(actor, data)), or an error! method can be called to raise an error, or complete! can be called to notify of a successful completion.\n\nArguments\n\nf::F: function to be invoked on subscription\n\nSee also: Subscribable, make\n\n\n\n\n\n","category":"type"},{"location":"observables/types/race/#observable_race","page":"Race","title":"Race Observable","text":"","category":"section"},{"location":"observables/types/race/","page":"Race","title":"Race","text":"race","category":"page"},{"location":"observables/types/race/#Rocket.race","page":"Race","title":"Rocket.race","text":"race(sources...)\nrace(sources::S) where { S <: Tuple }\n\nCombines multiple Observables to create an Observable that mirrors the output of the first Observable to emit an item. Essentially it subscribes to the observable that was the first to start emitting.\n\nArguments\n\nsources: input sources\n\nExamples\n\nusing Rocket\n\nsource1 = of(1)\nsource2 = of(2)\n\nsubscribe!(race(source1, source2), logger())\n;\n\n# output\n[LogActor] Data: 1\n[LogActor] Completed\n\nusing Rocket\n\nsource1 = of(1) |> async()\nsource2 = of(2)\n\nsubscribe!(race(source1, source2), logger())\n;\n\n# output\n[LogActor] Data: 2\n[LogActor] Completed\n\nSee also: Subscribable, subscribe!\n\n\n\n\n\n","category":"function"},{"location":"operators/transformation/concat_map_to/#operator_concat_map_to","page":"concat_map_to","title":"ConcatMapTo Operator","text":"","category":"section"},{"location":"operators/transformation/concat_map_to/","page":"concat_map_to","title":"concat_map_to","text":"concat_map_to","category":"page"},{"location":"operators/transformation/concat_map_to/#Rocket.concat_map_to","page":"concat_map_to","title":"Rocket.concat_map_to","text":"switch_map_to(inner_observable)\n\nCreates a switch_map_to operator, which returns an observable of values merged together by joining the passed observable with itself, one after the other, for each value emitted from the source. Essentially it projects each source value to the same Observable which is merged multiple times in a serialized fashion on the output Observable.\n\nArguments\n\ninner_observable: an Observable to replace each value from the source Observable.\n\nProducing\n\nStream of type <: Subscribable{R} where R refers to the eltype of inner_observable\n\nExamples\n\nusing Rocket\n\nsource = from([ 0, 0, 0 ])\nsubscribe!(source |> concat_map_to(from([ 1, 2, 3 ])), logger())\n;\n\n# output\n\n[LogActor] Data: 1\n[LogActor] Data: 2\n[LogActor] Data: 3\n[LogActor] Data: 1\n[LogActor] Data: 2\n[LogActor] Data: 3\n[LogActor] Data: 1\n[LogActor] Data: 2\n[LogActor] Data: 3\n[LogActor] Completed\n\nSee also: concat_map, AbstractOperator, RightTypedOperator, ProxyObservable, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/transformation/concat_map_to/","page":"concat_map_to","title":"concat_map_to","text":"note: Note\nconcat_map_to is equivalent to concat_map with mappingFn set to (_) -> inner_observable.","category":"page"},{"location":"operators/transformation/concat_map_to/#See-also","page":"concat_map_to","title":"See also","text":"","category":"section"},{"location":"operators/transformation/concat_map_to/","page":"concat_map_to","title":"concat_map_to","text":"Operators, concat_map","category":"page"},{"location":"operators/errors/error_if_not/#operator_error_if_not","page":"error_if_not","title":"Error If Not Operator","text":"","category":"section"},{"location":"operators/errors/error_if_not/","page":"error_if_not","title":"error_if_not","text":"Note: error_if_not is an alias for error_if operator with inverted checkFn.","category":"page"},{"location":"operators/errors/error_if_not/","page":"error_if_not","title":"error_if_not","text":"error_if_not","category":"page"},{"location":"operators/errors/error_if_not/#Rocket.error_if_not","page":"error_if_not","title":"Rocket.error_if_not","text":"error_if_not(checkFn, errorFn)\n\nCreates an error_if_not operator, which performs a check for every emission on the source Observable with checkFn. If checkFn returns false, the operator sends an error event and unsubscribes from the observable.\n\nNote: error_if_not is an alias for error_if operator with inverted checkFn.\n\nArguments\n\ncheckFn: check function with (data) -> Bool signature\nerrorFn: error object generating function with (data) -> Any signature, optional\n\nProducing\n\nStream of type <: Subscribable{L} where L refers to type of source stream\n\nExamples\n\nusing Rocket\n\nsource = from([1, 2, 3]) |> error_if_not((data) -> data < 2, (data) -> \"CustomError\")\n\nsubscription = subscribe!(source, lambda(\n on_next = (d) -> println(\"Next: \", d),\n on_error = (e) -> println(\"Error: \", e),\n on_complete = () -> println(\"Completed\")\n))\n;\n\n# output\nNext: 1\nError: CustomError\n\nSee also: error_if, error_if_empty, default_if_empty, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/errors/error_if_not/#See-also","page":"error_if_not","title":"See also","text":"","category":"section"},{"location":"operators/errors/error_if_not/","page":"error_if_not","title":"error_if_not","text":"Operators","category":"page"},{"location":"todo/#TODO","page":"TODO","title":"TODO","text":"","category":"section"},{"location":"todo/","page":"TODO","title":"TODO","text":"This package in under development and some features of the reactive framework not yet implemented.","category":"page"},{"location":"operators/mathematical/count/#operator_count","page":"count","title":"Count Operator","text":"","category":"section"},{"location":"operators/mathematical/count/","page":"count","title":"count","text":"count","category":"page"},{"location":"operators/mathematical/count/#Base.count","page":"count","title":"Base.count","text":"count()\n\nCreates a count operator, which counts the number of emissions on the source and emits that number when the source completes.\n\nProducing\n\nStream of type <: Subscribable{Int}\n\nExamples\n\nusing Rocket\n\nsource = from([ i for i in 1:42 ])\nsubscribe!(source |> count(), logger())\n;\n\n# output\n\n[LogActor] Data: 42\n[LogActor] Completed\n\n\nSee also: AbstractOperator, RightTypedOperator, ProxyObservable, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/mathematical/count/#Description","page":"count","title":"Description","text":"","category":"section"},{"location":"operators/mathematical/count/","page":"count","title":"count","text":"count transforms an Observable that emits values into an Observable that emits a single value that represents the number of values emitted by the source Observable. If the source Observable terminates with an error, count will pass this error notification along without emitting a value first. If the source Observable does not terminate at all, count will neither emit a value nor terminate.","category":"page"},{"location":"operators/mathematical/count/#Example","page":"count","title":"Example","text":"","category":"section"},{"location":"operators/mathematical/count/","page":"count","title":"count","text":"Counts how many values source Observable have emitted before the complete event happened","category":"page"},{"location":"operators/mathematical/count/","page":"count","title":"count","text":"using Rocket\n\nsource = from([ i for i in 1:42 ])\nsubscribe!(source |> count(), logger())\n\n# output\n\n[LogActor] Data: 42\n[LogActor] Completed","category":"page"},{"location":"operators/mathematical/count/#See-also","page":"count","title":"See also","text":"","category":"section"},{"location":"operators/mathematical/count/","page":"count","title":"count","text":"Operators","category":"page"},{"location":"operators/transformation/map_to/#operator_map_to","page":"map_to","title":"MapTo Operator","text":"","category":"section"},{"location":"operators/transformation/map_to/","page":"map_to","title":"map_to","text":"map_to","category":"page"},{"location":"operators/transformation/map_to/#Rocket.map_to","page":"map_to","title":"Rocket.map_to","text":"map_to(value::T) where T\n\nCreates a map operator, which emits the given constant value on the output Observable every time the source Observable emits a value.\n\nArguments\n\nvalue::T: the constant value to map each source value to\n\nProducing\n\nStream of type <: Subscribable{T}\n\nExamples\n\nusing Rocket\n\nsource = from([ 1, 2, 3 ])\nsubscribe!(source |> map_to('a'), logger())\n;\n\n# output\n\n[LogActor] Data: a\n[LogActor] Data: a\n[LogActor] Data: a\n[LogActor] Completed\n\nSee also: map, AbstractOperator, RightTypedOperator, ProxyObservable, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/transformation/map_to/#Description","page":"map_to","title":"Description","text":"","category":"section"},{"location":"operators/transformation/map_to/","page":"map_to","title":"map_to","text":"Takes a constant value as argument, and emits that whenever the source Observable emits a value. In other words, ignores the actual source value, and simply uses the emission moment to know when to emit the given value.","category":"page"},{"location":"operators/transformation/map_to/#See-also","page":"map_to","title":"See also","text":"","category":"section"},{"location":"operators/transformation/map_to/","page":"map_to","title":"map_to","text":"Operators","category":"page"},{"location":"observables/types/merged/#observable_merged","page":"Merged","title":"Merged Observable","text":"","category":"section"},{"location":"observables/types/merged/","page":"Merged","title":"Merged","text":"merged","category":"page"},{"location":"observables/types/merged/#Rocket.merged","page":"Merged","title":"Rocket.merged","text":"merged(sources::T) where { T <: Tuple }\n\nCreation operator for the MergeObservable with a given sources collected in a tuple. merge subscribes to each given input Observable (as arguments), and simply forwards (without doing any transformation) all the values from all the input Observables to the output Observable. The output Observable only completes once all input Observables have completed. Any error delivered by an input Observable will be immediately emitted on the output Observable.\n\nExamples\n\nusing Rocket\n\nobservable = merged((from(1:4), of(2.0), from(\"Hello\")))\n\nsubscribe!(observable, logger())\n;\n\n# output\n[LogActor] Data: 1\n[LogActor] Data: 2\n[LogActor] Data: 3\n[LogActor] Data: 4\n[LogActor] Data: 2.0\n[LogActor] Data: H\n[LogActor] Data: e\n[LogActor] Data: l\n[LogActor] Data: l\n[LogActor] Data: o\n[LogActor] Completed\n\nusing Rocket\n\nsubject = Subject(Int, scheduler = AsyncScheduler())\n\nobservable = merged((subject, of(2.0), from(\"Hello\")))\n\nactor = sync(logger())\n\nsubscribe!(observable, actor)\n\nsetTimeout(200) do\n next!(subject, 1)\n complete!(subject)\nend\n\nwait(actor)\n;\n\n# output\n[LogActor] Data: 2.0\n[LogActor] Data: H\n[LogActor] Data: e\n[LogActor] Data: l\n[LogActor] Data: l\n[LogActor] Data: o\n[LogActor] Data: 1\n[LogActor] Completed\n\nSee also: Subscribable\n\n\n\n\n\n","category":"function"},{"location":"operators/transformation/uppercase/#operator_uppercase","page":"uppercase","title":"Uppercase Operator","text":"","category":"section"},{"location":"operators/transformation/uppercase/","page":"uppercase","title":"uppercase","text":"uppercase","category":"page"},{"location":"operators/transformation/uppercase/#Base.Unicode.uppercase","page":"uppercase","title":"Base.Unicode.uppercase","text":"uppercase()\n\nCreates an uppercase operator, which forces each value to be in upper case\n\nProducing\n\nStream of type <: Subscribable{L} where L referes to type of data of input Observable\n\nExamples\n\nusing Rocket\n\nsource = of(\"Hello, world!\")\nsubscribe!(source |> uppercase(), logger())\n;\n\n# output\n\n[LogActor] Data: HELLO, WORLD!\n[LogActor] Completed\n\nSee also: AbstractOperator, InferableOperator, ProxyObservable, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/transformation/uppercase/#See-also","page":"uppercase","title":"See also","text":"","category":"section"},{"location":"operators/transformation/uppercase/","page":"uppercase","title":"uppercase","text":"Operators, map, lowercase","category":"page"},{"location":"observables/types/file/#observable_file","page":"File","title":"File Observable","text":"","category":"section"},{"location":"observables/types/file/","page":"File","title":"File","text":"file","category":"page"},{"location":"observables/types/file/#Rocket.file","page":"File","title":"Rocket.file","text":"file(path::String)\n\nCreation operator for the SyncFileObservable with a given path.\n\nSee also: SyncFileObservable\n\n\n\n\n\n","category":"function"},{"location":"observables/types/file/","page":"File","title":"File","text":"SyncFileObservable","category":"page"},{"location":"observables/types/file/#Rocket.SyncFileObservable","page":"File","title":"Rocket.SyncFileObservable","text":"SyncFileObservable(path::String)\n\nFile observable, which synchronously emits content of the file line by line as a String objects on subscription.\n\nSee also: file, Subscribable\n\n\n\n\n\n","category":"type"},{"location":"operators/mathematical/reduce/#operator_reduce","page":"reduce","title":"Reduce Operator","text":"","category":"section"},{"location":"operators/mathematical/reduce/","page":"reduce","title":"reduce","text":"reduce","category":"page"},{"location":"operators/mathematical/reduce/#Base.reduce","page":"reduce","title":"Base.reduce","text":"reduce(::Type{R}, reduceFn::Function, seed::R) where R\nreduce(reduceFn::F) where { F <: Function }\n\nCreates a reduce operator, which applies a given accumulator reduceFn function over the source Observable, and returns the accumulated result when the source completes, given an optional seed value. If a seed value is specified, then that value will be used as the initial value for the accumulator. If no seed value is specified, the first item of the source is used as the seed.\n\nArguments\n\n::Type{R}: the type of data of transformed value\nreduceFn::Function: transformation function with (data::T, current::R) -> R signature\nseed::R: optional seed accumulation value\n\nProducing\n\nStream of type <: Subscribable{R}\n\nExamples\n\nusing Rocket\n\nsource = from([ i for i in 1:10 ])\nsubscribe!(source |> reduce(Vector{Int}, (d, c) -> [ c..., d ], Int[]), logger())\n;\n\n# output\n\n[LogActor] Data: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]\n[LogActor] Completed\n\n\nusing Rocket\n\nsource = from([ i for i in 1:42 ])\nsubscribe!(source |> reduce(+), logger())\n;\n\n# output\n\n[LogActor] Data: 903\n[LogActor] Completed\n\n\nSee also: AbstractOperator, RightTypedOperator, ProxyObservable, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/mathematical/reduce/#Description","page":"reduce","title":"Description","text":"","category":"section"},{"location":"operators/mathematical/reduce/","page":"reduce","title":"reduce","text":"reduce applies an accumulator function to each value of the source Observable (from the past) and reduces it to a single value that is emitted by the output Observable. Note that reduce will only emit one value, only when the source Observable completes. It is equivalent to applying scan followed by last.","category":"page"},{"location":"operators/mathematical/reduce/","page":"reduce","title":"reduce","text":"It returns an Observable that applies a specified accumulator function to each item emitted by the source Observable. If a seed value is specified, then that value will be used as the initial value of the accumulator. If no seed value is specified, the first item of the source is used as the seed.","category":"page"},{"location":"operators/mathematical/reduce/#See-also","page":"reduce","title":"See also","text":"","category":"section"},{"location":"operators/mathematical/reduce/","page":"reduce","title":"reduce","text":"Operators, scan, last","category":"page"},{"location":"operators/filtering/some/#operator_some","page":"some","title":"Some Operator","text":"","category":"section"},{"location":"operators/filtering/some/","page":"some","title":"some","text":"some","category":"page"},{"location":"operators/filtering/some/#Rocket.some","page":"some","title":"Rocket.some","text":"some()\n\nCreates a some operator, which filters out nothing items by the source Observable by emitting only those that not equal to nothing.\n\nProducing\n\nStream of type <: Subscribable{L} where L refers to type of source stream <: Subscribable{Union{L, Nothing}}\n\nExamples\n\nusing Rocket\n\nsource = from([ 1, nothing, 3 ])\nsubscribe!(source |> some(), logger())\n;\n\n# output\n\n[LogActor] Data: 1\n[LogActor] Data: 3\n[LogActor] Completed\n\n\nSee also: AbstractOperator, InferableOperator, ProxyObservable, max, min, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/filtering/some/#Description","page":"some","title":"Description","text":"","category":"section"},{"location":"operators/filtering/some/","page":"some","title":"some","text":"This operator takes values from the source Observable and only emits those values that are not nothing.","category":"page"},{"location":"operators/filtering/some/#See-also","page":"some","title":"See also","text":"","category":"section"},{"location":"operators/filtering/some/","page":"some","title":"some","text":"Operators, filter","category":"page"},{"location":"actors/types/storage/#actor_storage","page":"Storage","title":"Storage actor","text":"","category":"section"},{"location":"actors/types/storage/","page":"Storage","title":"Storage","text":"storage","category":"page"},{"location":"actors/types/storage/#Rocket.storage","page":"Storage","title":"Rocket.storage","text":"storage(::Type{T}) where T\n\nArguments\n\n::Type{T}: Type of storage data\n\nCreation operator for the StorageActor actor.\n\nExamples\n\nusing Rocket\n\nactor = storage(Int)\nactor isa StorageActor{Int}\n\n# output\ntrue\n\nSee also: StorageActor, AbstractActor\n\n\n\n\n\n","category":"function"},{"location":"actors/types/storage/","page":"Storage","title":"Storage","text":"StorageActor","category":"page"},{"location":"actors/types/storage/#Rocket.StorageActor","page":"Storage","title":"Rocket.StorageActor","text":"StorageActor{D}() where D\n\nStorage actor provides an actor that stores a single (last) value passed to the next! callback. It saves last incoming successful next event in the value field, throws an ErrorException on error! event and does nothing on completion event. Before any events value initialised with nothing.\n\nExamples\n\nusing Rocket\n\nsource = from(1:5)\nactor = storage(Int)\n\nsubscribe!(source, actor)\nshow(getvalues(actor))\n\n# output\n5\n\nSee also: Actor, storage\n\n\n\n\n\n","category":"type"},{"location":"operators/multicasting/publish/#operator_publish","page":"publish","title":"Publish Operators","text":"","category":"section"},{"location":"operators/multicasting/publish/","page":"publish","title":"publish","text":"publish\npublish_behavior\npublish_replay\npublish_recent","category":"page"},{"location":"operators/multicasting/publish/#Rocket.publish","page":"publish","title":"Rocket.publish","text":"publish(; scheduler::H = AsapScheduler()) where { H <: AbstractScheduler }\n\npublish() is a shortcut for multicast(SubjectFactory())\n\nSee also: AbstractOperator, multicast, SubjectFactory\n\n\n\n\n\n","category":"function"},{"location":"operators/multicasting/publish/#Rocket.publish_behavior","page":"publish","title":"Rocket.publish_behavior","text":"publish_behavior(default; scheduler::H = AsapScheduler()) where { H <: AbstractScheduler }\n\npublish_behavior(default) is a shortcut for multicast(BehaviorSubjectFactory(default))\n\nSee also: AbstractOperator, multicast, BehaviorSubjectFactory\n\n\n\n\n\n","category":"function"},{"location":"operators/multicasting/publish/#Rocket.publish_replay","page":"publish","title":"Rocket.publish_replay","text":"publish_replay(size::Int; scheduler::H = AsapScheduler()) where { H <: AbstractScheduler }\n\npublish_replay(size) is a shortcut for multicast(ReplaySubjectFactory(size))\n\nSee also: AbstractOperator, multicast, ReplaySubjectFactory\n\n\n\n\n\n","category":"function"},{"location":"operators/multicasting/publish/#Rocket.publish_recent","page":"publish","title":"Rocket.publish_recent","text":"publish_recent(; scheduler::H = AsapScheduler()) where { H <: AbstractScheduler }\n\npublish_recent(size) is a shortcut for multicast(RecentSubjectFactory())\n\nSee also: AbstractOperator, multicast, RecentSubjectFactory\n\n\n\n\n\n","category":"function"},{"location":"operators/multicasting/publish/#See-also","page":"publish","title":"See also","text":"","category":"section"},{"location":"operators/multicasting/publish/","page":"publish","title":"publish","text":"Operators","category":"page"},{"location":"#Rocket.jl-Documentation","page":"Home","title":"Rocket.jl Documentation","text":"","category":"section"},{"location":"","page":"Home","title":"Home","text":"Welcome to the documentation for Rocket.jl.","category":"page"},{"location":"","page":"Home","title":"Home","text":"This documentation is an adaptation of the RxJS library documentation.","category":"page"},{"location":"#Table-of-Contents","page":"Home","title":"Table of Contents","text":"","category":"section"},{"location":"","page":"Home","title":"Home","text":"Pages = [\n \"getting-started.md\",\n \"observables/about.md\",\n \"actors/about.md\",\n \"teardown/about.md\",\n \"operators/about.md\",\n \"operators/piping.md\",\n \"operators/create-new-operator.md\",\n \"operators/high-order.md\",\n \"todo.md\",\n \"contributing.md\",\n \"utils.md\"\n]\nDepth = 2","category":"page"},{"location":"#Index","page":"Home","title":"Index","text":"","category":"section"},{"location":"","page":"Home","title":"Home","text":"","category":"page"},{"location":"actors/types/logger/#actor_logger","page":"Logger","title":"Logger actor","text":"","category":"section"},{"location":"actors/types/logger/","page":"Logger","title":"Logger","text":"logger","category":"page"},{"location":"actors/types/logger/#Rocket.logger","page":"Logger","title":"Rocket.logger","text":"logger([ io::IO ], name::String = \"LogActor\")\nlogger(::Type{T}, [ io::IO ], name::String = \"LogActor\") where T\n\nCreation operator for the LoggerActor actor.\n\nExamples\n\nusing Rocket\n\nsource = from([ 0, 1, 2 ])\nsubscribe!(source, logger())\n;\n\n# output\n\n[LogActor] Data: 0\n[LogActor] Data: 1\n[LogActor] Data: 2\n[LogActor] Completed\n\nusing Rocket\n\nsource = from([ 0, 1, 2 ])\nsubscribe!(source, logger(\"CustomName\"))\n;\n\n# output\n\n[CustomName] Data: 0\n[CustomName] Data: 1\n[CustomName] Data: 2\n[CustomName] Completed\n\nusing Rocket\n\nbuffer = IOBuffer()\n\nsource = from([ 0, 1, 2 ])\nsubscribe!(source, logger(buffer, \"CustomBuffer\"))\n;\n\nprint(String(take!(buffer)))\n# output\n\n[CustomBuffer] Data: 0\n[CustomBuffer] Data: 1\n[CustomBuffer] Data: 2\n[CustomBuffer] Completed\n\nSee also: LoggerActor, AbstractActor\n\n\n\n\n\n","category":"function"},{"location":"actors/types/logger/","page":"Logger","title":"Logger","text":"LoggerActor","category":"page"},{"location":"actors/types/logger/#Rocket.LoggerActor","page":"Logger","title":"Rocket.LoggerActor","text":"LoggerActor{D}(name::String = \"LogActor\", io::O) where { D, O }\n\nThe LoggerActor logs all next!/error!/complete! events that are sent from an Observable.\n\nConstructor arguments\n\nname: name of the logger. Optional. Default is LogActor.\nio: io stream to log in, maybe nothing to write to stdout\n\nSee also: Actor, logger\n\n\n\n\n\n","category":"type"},{"location":"operators/multicasting/about/#Multicasting-category","page":"About multicasting operators","title":"Multicasting category","text":"","category":"section"},{"location":"operators/multicasting/about/","page":"About multicasting operators","title":"About multicasting operators","text":"There are operators for different purposes, and they may be categorized as: creation, transformation, filtering, joining, multicasting, error handling, utility, etc. In the following list you will find all the operators organized in multicasting category.","category":"page"},{"location":"operators/multicasting/about/","page":"About multicasting operators","title":"About multicasting operators","text":"multicast\npublish\npublish_behavior\npublish_replay\nshare\nshare_replay","category":"page"},{"location":"operators/multicasting/about/#See-also","page":"About multicasting operators","title":"See also","text":"","category":"section"},{"location":"operators/multicasting/about/","page":"About multicasting operators","title":"About multicasting operators","text":"Operators","category":"page"},{"location":"observables/types/zipped/#observable_zipped","page":"Zipped","title":"Zipped Observable","text":"","category":"section"},{"location":"observables/types/zipped/","page":"Zipped","title":"Zipped","text":"zipped","category":"page"},{"location":"observables/types/zipped/#Rocket.zipped","page":"Zipped","title":"Rocket.zipped","text":"zipped(sources...)\n\nCombines multiple Observables to create an Observable whose values are calculated from the values, in order, of each of its input Observables.\n\nArguments\n\nsources: input sources\n\nExamples\n\nusing Rocket\n\nsource = zipped(of(1), from(2:5))\n\nsubscribe!(source, logger())\n;\n\n# output\n\n[LogActor] Data: (1, 2)\n[LogActor] Completed\n\nusing Rocket\n\nsource = zipped(from(1:3), from(1:5))\n\nsubscribe!(source, logger())\n;\n\n# output\n\n[LogActor] Data: (1, 1)\n[LogActor] Data: (2, 2)\n[LogActor] Data: (3, 3)\n[LogActor] Completed\n\nusing Rocket\n\nsource = zipped(completed(), of(0.0))\n\nsubscribe!(source, logger())\n;\n\n# output\n\n[LogActor] Completed\n\nSee also: Subscribable, subscribe!\n\n\n\n\n\n","category":"function"},{"location":"contributing/#Contribution-guidelines","page":"Contributing","title":"Contribution guidelines","text":"","category":"section"},{"location":"contributing/","page":"Contributing","title":"Contributing","text":"We welcome all possible contributors. This page details the some of the guidelines that should be followed when contributing to this package.","category":"page"},{"location":"contributing/#Reporting-bugs","page":"Contributing","title":"Reporting bugs","text":"","category":"section"},{"location":"contributing/","page":"Contributing","title":"Contributing","text":"We track bugs using GitHub issues. We encourage you to write complete, specific, reproducible bug reports. Mention the versions of Julia and Rocket.jl for which you observe unexpected behavior. Please provide a concise description of the problem and complement it with code snippets, test cases, screenshots, tracebacks or any other information that you consider relevant. This will help us to replicate the problem and narrow the search space for solutions.","category":"page"},{"location":"contributing/#Suggesting-features","page":"Contributing","title":"Suggesting features","text":"","category":"section"},{"location":"contributing/","page":"Contributing","title":"Contributing","text":"We welcome new feature proposals. However, before submitting a feature request, consider a few things:","category":"page"},{"location":"contributing/","page":"Contributing","title":"Contributing","text":"Does the feature require changes in the core Rocket.jl code? If it doesn't (for example, you would like to add a operator for a particular application), consider making a separate repository for your extensions.\nIf you would like to add an implementation of a feature that changes a lot in the core Rocket.jl code, please open an issue on GitHub and describe your proposal first. This will allow us to discuss your proposal with you before you invest your time in implementing something that may be difficult to merge later on.","category":"page"},{"location":"contributing/#Contributing-code","page":"Contributing","title":"Contributing code","text":"","category":"section"},{"location":"contributing/#Installing-Rocket","page":"Contributing","title":"Installing Rocket","text":"","category":"section"},{"location":"contributing/","page":"Contributing","title":"Contributing","text":"We suggest that you use the dev command from the new Julia package manager to install Rocket.jl for development purposes. To work on your fork of Rocket.jl, use your fork's URL address in the dev command, for example:","category":"page"},{"location":"contributing/","page":"Contributing","title":"Contributing","text":"] dev git@github.com:your_username/Rocket.jl.git","category":"page"},{"location":"contributing/","page":"Contributing","title":"Contributing","text":"The dev command clones Rocket.jl to ~/.julia/dev/Rocket. All local changes to Rocket code will be reflected in imported code.","category":"page"},{"location":"contributing/","page":"Contributing","title":"Contributing","text":"note: Note\nIt is also might be useful to install Revise.jl package as it allows you to modify code and use the changes without restarting Julia.","category":"page"},{"location":"contributing/#Committing-code","page":"Contributing","title":"Committing code","text":"","category":"section"},{"location":"contributing/","page":"Contributing","title":"Contributing","text":"We use the standard GitHub Flow workflow where all contributions are added through pull requests. In order to contribute, first fork the repository, then commit your contributions to your fork, and then create a pull request on the master branch of the Rocket.jl repository.","category":"page"},{"location":"contributing/","page":"Contributing","title":"Contributing","text":"Before opening a pull request, please make sure that all tests pass without failing! All demos (can be found in /demo/ directory) have to run without errors as well.","category":"page"},{"location":"contributing/#Style-conventions","page":"Contributing","title":"Style conventions","text":"","category":"section"},{"location":"contributing/","page":"Contributing","title":"Contributing","text":"We use default Julia style guide. We list here a few important points and our modifications to the Julia style guide:","category":"page"},{"location":"contributing/","page":"Contributing","title":"Contributing","text":"Use 4 spaces for indentation\nType names use UpperCamelCase. For example: ArrayObservable, MapOperator, etc..\nFunction names are lowercase with underscores, when necessary. For example: next!, subscribe!, as_actor, etc..\nVariable names and function arguments use snake_case\nThe name of a method that modifies its argument(s) must end in !","category":"page"},{"location":"contributing/#Unit-tests","page":"Contributing","title":"Unit tests","text":"","category":"section"},{"location":"contributing/","page":"Contributing","title":"Contributing","text":"We use the test-driven development (TDD) methodology for Rocket.jl development. The test coverage should be as complete as possible. Please make sure that you write tests for each piece of code that you want to add.","category":"page"},{"location":"contributing/","page":"Contributing","title":"Contributing","text":"All unit tests are located in the /test/ directory. The /test/ directory follows the structure of the /src/ directory. Each test file should have following filename format: test_*.jl. Some tests are also present in jldoctest docs annotations directly in the source code. See Julia's documentation about doctests.","category":"page"},{"location":"contributing/","page":"Contributing","title":"Contributing","text":"The tests can be evaluated by running following command in the Julia REPL:","category":"page"},{"location":"contributing/","page":"Contributing","title":"Contributing","text":"] test Rocket","category":"page"},{"location":"operators/transformation/override/#operator_override","page":"override","title":"Override Operator","text":"","category":"section"},{"location":"operators/transformation/override/","page":"override","title":"override","text":"override\nOverrideHandler","category":"page"},{"location":"operators/transformation/override/#Rocket.override","page":"override","title":"Rocket.override","text":"override(handler::OverrideHandler)\n\nCreates an override operator that overrides each emission from source observable with value provided in handler. If handler contains nothing source observable emits as usual. For constant override see map_to. Use Rocket.setvalue! to set new value for handler.\n\nProducing\n\nStream of type <: Subscribable{Union{L, T}} where L refers to the type of source stream and T referes to the type of handler's value\n\nExamples\n\nusing Rocket \n\nsubject = Subject(Int)\nhandler = OverrideHandler(Int, -1)\n\nsource = subject |> override(handler)\n\nsubscription = subscribe!(source, logger())\n\nnext!(subject, 1)\nnext!(subject, 2)\n\nRocket.setvalue!(handler, nothing)\n\nnext!(subject, 3)\nnext!(subject, 4)\n\nRocket.setvalue!(handler, -2)\n\nnext!(subject, 5)\nnext!(subject, 6)\n\nunsubscribe!(subscription)\n\n# output\n[LogActor] Data: -1\n[LogActor] Data: -1\n[LogActor] Data: 3\n[LogActor] Data: 4\n[LogActor] Data: -2\n[LogActor] Data: -2\n\nSee also: OverrideHandler\n\n\n\n\n\n","category":"function"},{"location":"operators/transformation/override/#Rocket.OverrideHandler","page":"override","title":"Rocket.OverrideHandler","text":"OverrideHandler(::Type{T}, value::Union{Nothing, T}) where T\nOverrideHandler(::Type{T}) where T\n\nHandler used in substitute operator.\n\nSee also: substitute\n\n\n\n\n\n","category":"type"},{"location":"operators/transformation/override/#See-also","page":"override","title":"See also","text":"","category":"section"},{"location":"operators/transformation/override/","page":"override","title":"override","text":"Operators","category":"page"},{"location":"operators/filtering/find/#operator_find","page":"find","title":"Find operator","text":"","category":"section"},{"location":"operators/filtering/find/","page":"find","title":"find","text":"find","category":"page"},{"location":"operators/filtering/find/#Rocket.find","page":"find","title":"Rocket.find","text":"find(conditionFn::F) where { F <: Function }\n\nCreates a find operator, which emits only the first value emitted by the source Observable that meets some condition.\n\nProducing\n\nStream of type <: Subscribable{L} where L refers to type of source stream\n\nArguments\n\nconditionFn::F: condition function with (data::T) -> Bool signature\n\nExamples\n\nusing Rocket\n\nsource = from([ 1, 2, 3, 4, 5, 6, 7, 8 ])\nsubscribe!(source |> find((d) -> d % 2 == 0), logger())\n;\n\n# output\n\n[LogActor] Data: 2\n[LogActor] Completed\n\nSee also: AbstractOperator, InferableOperator, ProxyObservable, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/filtering/find/#Description","page":"find","title":"Description","text":"","category":"section"},{"location":"operators/filtering/find/","page":"find","title":"find","text":"find searches for the first item in the source Observable that matches the specified condition embodied by the predicate, and returns the first occurrence in the source. Does not emit an error if a valid value is not found.","category":"page"},{"location":"operators/filtering/find/#See-also","page":"find","title":"See also","text":"","category":"section"},{"location":"operators/filtering/find/","page":"find","title":"find","text":"Operators, take","category":"page"},{"location":"operators/utility/discontinue/#operator_discontinue","page":"discontinue","title":"Discontinue Operator","text":"","category":"section"},{"location":"operators/utility/discontinue/","page":"discontinue","title":"discontinue","text":"discontinue","category":"page"},{"location":"operators/utility/discontinue/#Rocket.discontinue","page":"discontinue","title":"Rocket.discontinue","text":"discontinue()\n\nCreates an operator, which prevents an emitting of self-depending messages and breaks a possible infinite loop. Does nothing if observable scheduled asynchronously.\n\nProducing\n\nStream of type <: Subscribable{L} where L refers to type of source stream\n\nExamples\n\nusing Rocket\n\ns = BehaviorSubject(0)\n\nsubscription1 = subscribe!(s, logger())\nsubscription2 = subscribe!(s |> map(Int, d -> d + 1) |> discontinue(), s)\n;\n\n# output\n\n[LogActor] Data: 0\n[LogActor] Data: 1\n\nSee also: AbstractOperator, RightTypedOperator, ProxyObservable, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/utility/discontinue/#See-also","page":"discontinue","title":"See also","text":"","category":"section"},{"location":"operators/utility/discontinue/","page":"discontinue","title":"discontinue","text":"Operators","category":"page"},{"location":"teardown/about/#section_subscription","page":"Subscription","title":"Subscription","text":"","category":"section"},{"location":"teardown/about/","page":"Subscription","title":"Subscription","text":"A Subscription represents a disposable resource, usually the execution of an Observable. A Subscription has one important method: unsubscribe!(teardown), which takes some teardown logic object as one argument and disposes the resource held by the subscription.","category":"page"},{"location":"teardown/about/","page":"Subscription","title":"Subscription","text":"using Rocket\n\nsource = Subject(Int)\n\nnext!(source, 0) # Logs nothing as there is no subscribers\n\nsubscription = subscribe!(source, logger())\n\nnext!(source, 1) # Logs [LogActor] Data: 1 into standard output\n\nunsubscribe!(subscription)\n\nnext!(source, 2) # Logs nothing as a single one actor has unsubscribed","category":"page"},{"location":"teardown/about/","page":"Subscription","title":"Subscription","text":"note: Note\nA Subscription essentially just has its own specific method for unsubscribe!() function which releases resources or cancel Observable executions. Any Observable has to return a valid Teardown object.","category":"page"},{"location":"teardown/about/","page":"Subscription","title":"Subscription","text":"The unsubscribe! function also supports multiple unsubscriptions at once. If the input argument to the unsubscribe! function is either a tuple or a vector, it will first check that all of the arguments are valid subscription objects and if this is true it will unsubscribe from each of them individually.","category":"page"},{"location":"teardown/about/","page":"Subscription","title":"Subscription","text":"\nsource = Subject(Int)\n\nsubscription1 = subscribe!(source, logger())\nsubscription2 = subscribe!(source, logger())\n\nunsubscribe!((subscription1, subscription2))\n\n# or similarly\n# unsubscribe!([ subscription1, subscription2 ])\n","category":"page"},{"location":"teardown/about/","page":"Subscription","title":"Subscription","text":"For more information about subscription and teardown logic see the API Section","category":"page"},{"location":"operators/transformation/switch_map_to/#operator_switch_map_to","page":"switch_map_to","title":"SwitchMapTo Operator","text":"","category":"section"},{"location":"operators/transformation/switch_map_to/","page":"switch_map_to","title":"switch_map_to","text":"switch_map_to","category":"page"},{"location":"operators/transformation/switch_map_to/#Rocket.switch_map_to","page":"switch_map_to","title":"Rocket.switch_map_to","text":"switch_map_to(inner_observable)\n\nCreates a switch_map_to operator, which projects each source value to the same Observable which is flattened multiple times with switch_map in the output Observable.\n\nArguments\n\ninner_observable: an Observable to replace each value from the source Observable.\n\nProducing\n\nStream of type <: Subscribable{R} where R refers to the eltype of inner_observable\n\nExamples\n\nusing Rocket\n\nsource = from([ 0, 0, 0 ])\nsubscribe!(source |> switch_map_to(from([ 1, 2, 3 ])), logger())\n;\n\n# output\n\n[LogActor] Data: 1\n[LogActor] Data: 2\n[LogActor] Data: 3\n[LogActor] Data: 1\n[LogActor] Data: 2\n[LogActor] Data: 3\n[LogActor] Data: 1\n[LogActor] Data: 2\n[LogActor] Data: 3\n[LogActor] Completed\n\nSee also: switch_map, AbstractOperator, RightTypedOperator, ProxyObservable, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/transformation/switch_map_to/","page":"switch_map_to","title":"switch_map_to","text":"note: Note\nswitch_map_to is equivalent to switch_map with mappingFn set to (_) -> inner_observable.","category":"page"},{"location":"operators/transformation/switch_map_to/#See-also","page":"switch_map_to","title":"See also","text":"","category":"section"},{"location":"operators/transformation/switch_map_to/","page":"switch_map_to","title":"switch_map_to","text":"Operators","category":"page"},{"location":"operators/errors/rerun/#operator_rerun","page":"rerun","title":"Rerun Operator","text":"","category":"section"},{"location":"operators/errors/rerun/","page":"rerun","title":"rerun","text":"rerun","category":"page"},{"location":"operators/errors/rerun/#Rocket.rerun","page":"rerun","title":"Rocket.rerun","text":"rerun(count::Int = -1)\n\nReturns an Observable that mirrors the source Observable with the exception of an error. If the source Observable calls error, this method will resubscribe to the source Observable for a maximum of count resubscriptions (given as a number parameter) rather than propagating the error call.\n\nArguments:\n\ncount::Int: Number of retry attempts before failing. Optional. Default is -1.\n\nProducing\n\nStream of type <: Subscribable{L} where L refers to type of source stream\n\nExamples\n\nusing Rocket\n\nsource = from(1:3) |> safe() |> map(Int, (d) -> d > 1 ? error(\"Error\") : d) |> rerun(3)\n\nsubscribe!(source, logger())\n;\n\n# output\n[LogActor] Data: 1\n[LogActor] Data: 1\n[LogActor] Data: 1\n[LogActor] Data: 1\n[LogActor] Error: ErrorException(\"Error\")\n\nSee also: AbstractOperator, InferableOperator, catch_error, logger, safe\n\n\n\n\n\n","category":"function"},{"location":"operators/errors/rerun/#Description","page":"rerun","title":"Description","text":"","category":"section"},{"location":"operators/errors/rerun/","page":"rerun","title":"rerun","text":"Any and all items emitted by the source Observable will be emitted by the resulting Observable, even those emitted during failed subscriptions. For example, if an Observable fails at first but emits [1, 2] then succeeds the second time and emits: [1, 2, 3, 4, 5] then the complete stream of emissions and notifications would be: [1, 2, 1, 2, 3, 4, 5, complete].","category":"page"},{"location":"operators/errors/rerun/#See-also","page":"rerun","title":"See also","text":"","category":"section"},{"location":"operators/errors/rerun/","page":"rerun","title":"rerun","text":"Operators","category":"page"},{"location":"observables/types/timer/#observable_timer","page":"Timer","title":"Timer Observable","text":"","category":"section"},{"location":"observables/types/timer/","page":"Timer","title":"Timer","text":"timer","category":"page"},{"location":"observables/types/timer/#Rocket.timer","page":"Timer","title":"Rocket.timer","text":"timer(delay::Int)\ntimer(delay::Int, period::Int)\n\nCreation operator for the TimerObservable. Its like interval(@ref), but you can specify when should the emissions start. timer returns an Observable that emits an infinite sequence of ascending integers, with a constant interval of time, period of your choosing between those emissions. The first emission happens after the specified delay. If period is not specified, the output Observable emits only one value, 0. Otherwise, it emits an infinite sequence. The timer closes automatically when the unsubscription happens.\n\nArguments\n\ndelay: the initial delay time specified as an integer denoting milliseconds to wait before emitting the first value of 0.\nperiod: the minimum period of time between emissions of the subsequent numbers (in milliseconds).\n\nExamples\n\nusing Rocket\n\nsource = timer(0, 50)\n\nsleep(0.075)\nsubscription = subscribe!(source, logger())\nsleep(0.105)\nunsubscribe!(subscription)\n\n;\n\n# output\n\n[LogActor] Data: 2\n[LogActor] Data: 3\n\n\nSee also: interval, TimerObservable, subscribe!, logger\n\n\n\n\n\n","category":"function"},{"location":"observables/types/timer/","page":"Timer","title":"Timer","text":"TimerObservable","category":"page"},{"location":"observables/types/timer/#Rocket.TimerObservable","page":"Timer","title":"Rocket.TimerObservable","text":"TimerObservable\n\nAn Observable that starts emitting after an delay and emits ever increasing numbers after each period of time thereafter.\n\nParameters\n\ndelay: The initial delay time specified as an integer denoting milliseconds to wait before emitting the first value of 0`.\nperiod: The minimum period of time in milliseconds between emissions of the subsequent numbers.\n\nSee also: timer, Subscribable\n\n\n\n\n\n","category":"type"},{"location":"actors/about/#section_actors","page":"Actor","title":"Actors","text":"","category":"section"},{"location":"actors/about/","page":"Actor","title":"Actor","text":"An Actor is the most primitive unit of computation: it receives a message and performs a computation.","category":"page"},{"location":"actors/about/","page":"Actor","title":"Actor","text":"An actor is analogous to an object in an object-oriented languages. An object receives a message (a method call) and does something depending on which message it receives (the method we are calling). The main difference is that actors are completely isolated from each other, and they will never share memory. It’s also worth mentioning that an actor can maintain a private state that should never be changed directly by another actor.","category":"page"},{"location":"actors/about/","page":"Actor","title":"Actor","text":"For a quick introduction to Actor models, see this article.","category":"page"},{"location":"actors/about/","page":"Actor","title":"Actor","text":"The API of Rocket.jl's Actors is similar to RxJS subscribers.","category":"page"},{"location":"actors/about/#First-example","page":"Actor","title":"First example","text":"","category":"section"},{"location":"actors/about/","page":"Actor","title":"Actor","text":"The following example implements an Actor that retains each received value from an Observable.","category":"page"},{"location":"actors/about/","page":"Actor","title":"Actor","text":"using Rocket\n\nstruct CustomKeepActor <: Actor{Int}\n values::Vector{Int}\n\n CustomKeepActor() = new(Vector{Int}())\nend\n\nRocket.on_next!(actor::CustomKeepActor, data::Int) = push!(actor.values, data)\nRocket.on_error!(actor::CustomKeepActor, err) = error(err)\nRocket.on_complete!(actor::CustomKeepActor) = println(\"Completed!\")\n\nsource = from([ 1, 2, 3 ])\nkeep_actor = CustomKeepActor()\nsubscribe!(source, keep_actor)\n\n# Logs\n# Completed!\n\nprintln(keep_actor.values)\n\n# Logs\n# [1, 2, 3]","category":"page"},{"location":"actors/about/","page":"Actor","title":"Actor","text":"An actor may be not interested in the values itself, but merely the completion of an event. In this case, Rocket.jl provides a CompletionActor abstract type. See also NextActor and ErrorActor.","category":"page"},{"location":"actors/about/","page":"Actor","title":"Actor","text":"using Rocket\n\nstruct CompletionNotificationActor <: CompletionActor{Int} end\n\nRocket.on_complete!(::CompletionNotificationActor) = println(\"Completed!\")\n\nsource = from([ 1, 2, 3 ])\nsubscribe!(source, CompletionNotificationActor());\n\n# Logs\n# Completed","category":"page"},{"location":"actors/about/","page":"Actor","title":"Actor","text":"It is also possible to use Julia's multiple dispatch feature and dispatch on type of the event","category":"page"},{"location":"actors/about/","page":"Actor","title":"Actor","text":"using Rocket\n\nstruct MyCustomActor <: NextActor{Any} end\n\nRocket.on_next!(::MyCustomActor, data::Int) = println(\"Int: $data\")\nRocket.on_next!(::MyCustomActor, data::Float64) = println(\"Float64: $data\")\nRocket.on_next!(::MyCustomActor, data) = println(\"Something else: $data\")\n\nsource = from([ 1, 1.0, \"string\" ])\nsubscribe!(source, MyCustomActor());\n\n# Logs\n# Int: 1\n# Float64: 1.0\n# Something else: string\n","category":"page"},{"location":"actors/about/#Lambda-actor","page":"Actor","title":"Lambda actor","text":"","category":"section"},{"location":"actors/about/","page":"Actor","title":"Actor","text":"For debugging purposes it may be convenient to work with a LambdaActor. This provides an interface that defines callbacks for \"next\", \"error\" and \"complete\" events. But this generic actor does not allow to dispatch on the type of the event.","category":"page"},{"location":"actors/about/","page":"Actor","title":"Actor","text":"using Rocket\n\nsource = from([1, 2, 3])\n\nsubscribe!(source, lambda(\n on_next = (d) -> println(d),\n on_error = (e) -> error(e),\n on_complete = () -> println(\"Completed\")\n))\n\n# Logs\n# 1\n# 2\n# 3\n# Completed","category":"page"},{"location":"actors/about/#Function-actor","page":"Actor","title":"Function actor","text":"","category":"section"},{"location":"actors/about/","page":"Actor","title":"Actor","text":"Sometimes it is convenient to pass only on_next callback. Rocket.jl provides a FunctionActor which automatically converts any function object passed in the subscribe! function to a proper actor which listens only for data events, throws an exception on error event and ignores completion message.","category":"page"},{"location":"actors/about/","page":"Actor","title":"Actor","text":"using Rocket\n\nsource = from([1, 2, 3])\n\nsubscribe!(source, (d) -> println(d))\n\n# Logs\n# 1\n# 2\n# 3","category":"page"},{"location":"observables/types/single/#observable_single","page":"Single","title":"Single Observable","text":"","category":"section"},{"location":"observables/types/single/","page":"Single","title":"Single","text":"of","category":"page"},{"location":"observables/types/single/#Rocket.of","page":"Single","title":"Rocket.of","text":"of(x; scheduler::H = AsapScheduler()) where { H <: AbstractScheduler }\n\nCreation operator for the SingleObservable that emits a single value x and then completes.\n\nArguments\n\nx: value to be emmited before completion\n\nExamples\n\nusing Rocket\n\nsource = of(1)\nsubscribe!(source, logger())\n;\n\n# output\n\n[LogActor] Data: 1\n[LogActor] Completed\n\n\nSee also: SingleObservable, subscribe!, logger\n\n\n\n\n\n","category":"function"},{"location":"observables/types/single/","page":"Single","title":"Single","text":"SingleObservable","category":"page"},{"location":"observables/types/single/#Rocket.SingleObservable","page":"Single","title":"Rocket.SingleObservable","text":"SingleObservable{D, H}(value::D, scheduler::H)\n\nSingleObservable wraps single value of type D into a observable.\n\nConstructor arguments\n\nvalue: a single value to emit\nscheduler: scheduler-like object\n\nSee also: of, Subscribable\n\n\n\n\n\n","category":"type"},{"location":"observables/types/interval/#observable_interval","page":"Interval","title":"Interval Observable","text":"","category":"section"},{"location":"observables/types/interval/","page":"Interval","title":"Interval","text":"interval","category":"page"},{"location":"observables/types/interval/#Rocket.interval","page":"Interval","title":"Rocket.interval","text":"interval(period::Union{Int, Nothing} = nothing)\n\nCreation operator for the TimerObservable. interval returns an Observable that emits an infinite sequence of ascending integers, with a constant interval of time of your choosing between those emissions. The first emission is not sent immediately, but only after the first period has passed.\n\nArguments\n\ninterval: the interval size in milliseconds\n\nExamples\n\nusing Rocket\n\nsource = interval(50)\n\nsubscription = subscribe!(source, logger())\nsleep(0.215)\nunsubscribe!(subscription)\nsleep(0.215)\nsubscription = subscribe!(source, logger())\nsleep(0.185)\nunsubscribe!(subscription)\n\nclose(source)\n;\n\n# output\n\n[LogActor] Data: 0\n[LogActor] Data: 1\n[LogActor] Data: 2\n[LogActor] Data: 3\n[LogActor] Data: 8\n[LogActor] Data: 9\n[LogActor] Data: 10\n\nSee also: timer, TimerObservable, Subscribable\n\n\n\n\n\n","category":"function"},{"location":"operators/filtering/take_until/#operator_take_until","page":"take_until","title":"TakeUntil Operator","text":"","category":"section"},{"location":"operators/filtering/take_until/","page":"take_until","title":"take_until","text":"take_until","category":"page"},{"location":"operators/filtering/take_until/#Rocket.take_until","page":"take_until","title":"Rocket.take_until","text":"take_until(notifier::S)\n\nCreates a take operator, which returns an Observable that emits the values emitted by the source Observable until a notifier Observable emits a value or a completion event.\n\nArguments\n\nnotifier::S: The Observable whose first emitted value will cause the output Observable of take_until to stop emitting values from the source Observable.\n\nProducing\n\nStream of type <: Subscribable{L} where L refers to type of source stream\n\nExamples\n\nusing Rocket\n\nsource = interval(100) |> take_until(timer(1000))\n\nsubscribe!(source, logger())\n;\n\n# output\n\n[LogActor] Data: 0\n[LogActor] Data: 1\n[LogActor] Data: 2\n[LogActor] Data: 3\n[LogActor] Data: 4\n[LogActor] Data: 5\n[LogActor] Data: 6\n[LogActor] Data: 7\n[LogActor] Data: 8\n[LogActor] Completed\n\nusing Rocket \n\nsource = interval(100)\n\nsubscribe!(source |> take_until(source |> filter(i -> i == 3)), logger())\n;\n\n# output \n\n[LogActor] Data: 0\n[LogActor] Data: 1\n[LogActor] Data: 2\n[LogActor] Completed\n\nSee also: AbstractOperator, InferableOperator, ProxyObservable, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/filtering/take_until/#Description","page":"take_until","title":"Description","text":"","category":"section"},{"location":"operators/filtering/take_until/","page":"take_until","title":"take_until","text":"take_until subscribes and begins mirroring the source Observable. It also monitors a second Observable, notifier that you provide. If the notifier emits a value, the output Observable stops mirroring the source Observable and completes. If the notifier doesn't emit any value and completes then take_until also completes.","category":"page"},{"location":"operators/filtering/take_until/#See-also","page":"take_until","title":"See also","text":"","category":"section"},{"location":"operators/filtering/take_until/","page":"take_until","title":"take_until","text":"Operators","category":"page"},{"location":"operators/multicasting/share/#operator_share","page":"share","title":"Share Operators","text":"","category":"section"},{"location":"operators/multicasting/share/","page":"share","title":"share","text":"share\nshare_replay\nshare_recent","category":"page"},{"location":"operators/multicasting/share/#Rocket.share","page":"share","title":"Rocket.share","text":"share(; scheduler::H = AsapScheduler()) where { H <: AbstractScheduler }\n\nshare() is a shortcut for publish() + ref_count()\n\nSee also: AbstractOperator, multicast, publish, ref_count\n\n\n\n\n\n","category":"function"},{"location":"operators/multicasting/share/#Rocket.share_replay","page":"share","title":"Rocket.share_replay","text":"share_replay(size::Int; scheduler::H = AsapScheduler()) where { H <: AbstractScheduler }\n\nshare_replay(size) is a shortcut for publish_replay(size) + ref_count()\n\nSee also: AbstractOperator, multicast, publish, publish_replay, ref_count\n\n\n\n\n\n","category":"function"},{"location":"operators/multicasting/share/#Rocket.share_recent","page":"share","title":"Rocket.share_recent","text":"share_recent(; scheduler::H = AsapScheduler()) where { H <: AbstractScheduler }\n\nshare_recent() is a shortcut for publish_recent() + ref_count()\n\nSee also: AbstractOperator, multicast, publish, publish_recent, ref_count\n\n\n\n\n\n","category":"function"},{"location":"operators/multicasting/share/#See-also","page":"share","title":"See also","text":"","category":"section"},{"location":"operators/multicasting/share/","page":"share","title":"share","text":"Operators","category":"page"},{"location":"operators/transformation/concat_map/#operator_concat_map","page":"concat_map","title":"ConcatMap Operator","text":"","category":"section"},{"location":"operators/transformation/concat_map/","page":"concat_map","title":"concat_map","text":"concat_map","category":"page"},{"location":"operators/transformation/concat_map/#Rocket.concat_map","page":"concat_map","title":"Rocket.concat_map","text":"concat_map(::Type{R}, mappingFn::F = identity) where { R, F <: Function }\n\nCreates a concat_map operator, which returns an Observable that emits the result of applying the projection function to each item emitted by the source Observable and taking values from each projected inner Observable sequentially. Essentialy it projects each source value to an Observable which is merged in the output Observable, in a serialized fashion waiting for each one to complete before merging the next.\n\nArguments\n\n::Type{R}: the type of data of output Observables after projection with mappingFn\nmappingFn::F: projection function with (data) -> Observable{R} signature\n\nProducing\n\nStream of type <: Subscribable{R}\n\nExamples\n\nusing Rocket\n\nsource = from([ 0, 0 ]) |> concat_map(Int, d -> from([ 1, 2, 3 ], scheduler = AsyncScheduler(0)))\nsubscribe!(source, logger())\n;\n\n# output\n\n[LogActor] Data: 1\n[LogActor] Data: 2\n[LogActor] Data: 3\n[LogActor] Data: 1\n[LogActor] Data: 2\n[LogActor] Data: 3\n[LogActor] Completed\n\nSee also: AbstractOperator, RightTypedOperator, ProxyObservable, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/transformation/concat_map/#Description","page":"concat_map","title":"Description","text":"","category":"section"},{"location":"operators/transformation/concat_map/","page":"concat_map","title":"concat_map","text":"Returns an Observable that emits items based on applying a function that you supply to each item emitted by the source Observable, where that function returns an (so-called \"inner\") Observable. Each new inner Observable is concatenated with the previous inner Observable.","category":"page"},{"location":"operators/transformation/concat_map/","page":"concat_map","title":"concat_map","text":"warning: Warning\nIf source values arrive endlessly and faster than their corresponding inner Observables can complete, it will result in memory issues as inner Observables amass in an unbounded buffer waiting for their turn to be subscribed to.","category":"page"},{"location":"operators/transformation/concat_map/","page":"concat_map","title":"concat_map","text":"note: Note\nconcat_map is equivalent to merge_map with concurrency parameter set to 1.","category":"page"},{"location":"operators/transformation/concat_map/#See-also","page":"concat_map","title":"See also","text":"","category":"section"},{"location":"operators/transformation/concat_map/","page":"concat_map","title":"concat_map","text":"Operators, merge_map","category":"page"},{"location":"subjects/types/pending/#subject_pending","page":"Pending","title":"PendingSubject","text":"","category":"section"},{"location":"subjects/types/pending/","page":"Pending","title":"Pending","text":"PendingSubject\nPendingSubjectFactory","category":"page"},{"location":"subjects/types/pending/#Rocket.PendingSubject","page":"Pending","title":"Rocket.PendingSubject","text":"PendingSubject(::Type{D}) where D\nPendingSubject(::Type{D}, factory::F) where { D, F <: AbstractFactory }\nPendingSubject(::Type{D}, subject::S) where { D, S }\n\nA variant of Subject that emits its last value on completion. Reemits last value on further subscriptions and then completes.\n\nSee also: PendingSubjectFactory, Subject, SubjectFactory\n\n\n\n\n\n","category":"function"},{"location":"subjects/types/pending/#Rocket.PendingSubjectFactory","page":"Pending","title":"Rocket.PendingSubjectFactory","text":"PendingSubjectFactory(factory::F) where { F <: AbstractSubjectFactory }\nPendingSubjectFactory(; scheduler::H = AsapScheduler()) where { H <: AbstractScheduler }\n\nA variant of SubjectFactory that creates an instance of PendingSubject.\n\nSee also: SubjectFactory, AbstractSubjectFactory, PendingSubject, Subject\n\n\n\n\n\n","category":"function"},{"location":"subjects/types/pending/#Description","page":"Pending","title":"Description","text":"","category":"section"},{"location":"subjects/types/pending/","page":"Pending","title":"Pending","text":"A variant of Subject that only emits a value when it completes. It will emit its latest value to all its observers on completion. It will reemit its latest value to all new observers on further subscription and then complete. It is not possible to overwrite last value after completion.","category":"page"},{"location":"subjects/types/pending/#Examples","page":"Pending","title":"Examples","text":"","category":"section"},{"location":"subjects/types/pending/","page":"Pending","title":"Pending","text":"using Rocket\n\nsubject = PendingSubject(Int)\n\nsubscription1 = subscribe!(subject, logger(\"1\"))\n\nnext!(subject, 1) # Nothing is logged\nnext!(subject, 2) # Nothing is logged\n\nsubscription2 = subscribe!(subject, logger(\"2\"))\n\nnext!(subject, 3) # Nothing is logged\n\ncomplete!(subject)\n\nsubscription3 = subscribe!(subject, logger(\"3\"))\n\n[1] Data: 3\n[2] Data: 3\n[1] Completed\n[2] Completed\n[3] Data: 3\n[3] Completed","category":"page"},{"location":"operators/filtering/filter_type/#operator_filter_type","page":"filter_type","title":"FilterType Operator","text":"","category":"section"},{"location":"operators/filtering/filter_type/","page":"filter_type","title":"filter_type","text":"filter_type","category":"page"},{"location":"operators/filtering/filter_type/#Rocket.filter_type","page":"filter_type","title":"Rocket.filter_type","text":"filter_type(type::Type{ T }) where { T }\n\nCreates a filter_type operator, which filters items of the source Observable by emitting only those that match a specified T type with a <: operator. This operator is a more efficient version of filter(v -> v <: T) |> map(T, v -> v) operators chain.\n\nProducing\n\nStream of type <: Subscribable{ T } where T refers to type argument\n\nExamples\n\nusing Rocket\n\nsource = from(Real[ 1, 2.0, 3, 4.0, 5, 6.0 ])\nsubscribe!(source |> filter_type(Int), logger())\n;\n\n# output\n\n[LogActor] Data: 1\n[LogActor] Data: 3\n[LogActor] Data: 5\n[LogActor] Completed\n\nSee also: AbstractOperator, InferableOperator, ProxyObservable, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/filtering/filter_type/#See-also","page":"filter_type","title":"See also","text":"","category":"section"},{"location":"operators/filtering/filter_type/","page":"filter_type","title":"filter_type","text":"Operators","category":"page"},{"location":"operators/filtering/filter/#operator_filter","page":"filter","title":"Filter Operator","text":"","category":"section"},{"location":"operators/filtering/filter/","page":"filter","title":"filter","text":"filter","category":"page"},{"location":"operators/filtering/filter/#Base.filter","page":"filter","title":"Base.filter","text":"filter(filterFn::F) where { F <: Function }\n\nCreates a filter operator, which filters items of the source Observable by emitting only those that satisfy a specified filterFn predicate.\n\nProducing\n\nStream of type <: Subscribable{L} where L refers to type of source stream\n\nArguments\n\nfilterFn::F: predicate function with (data::T) -> Bool signature\n\nExamples\n\nusing Rocket\n\nsource = from([ 1, 2, 3, 4, 5, 6 ])\nsubscribe!(source |> filter((d) -> d % 2 == 0), logger())\n;\n\n# output\n\n[LogActor] Data: 2\n[LogActor] Data: 4\n[LogActor] Data: 6\n[LogActor] Completed\n\nSee also: AbstractOperator, InferableOperator, ProxyObservable, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/filtering/filter/#Description","page":"filter","title":"Description","text":"","category":"section"},{"location":"operators/filtering/filter/","page":"filter","title":"filter","text":"Like filter(f, array), this operator takes values from the source Observable, passes them through a predicate function and only emits those values that yielded true.","category":"page"},{"location":"operators/filtering/filter/#See-also","page":"filter","title":"See also","text":"","category":"section"},{"location":"operators/filtering/filter/","page":"filter","title":"filter","text":"Operators","category":"page"},{"location":"operators/join/with_latest/#operator_with_latest","page":"with_latest","title":"WithLatest Operator","text":"","category":"section"},{"location":"operators/join/with_latest/","page":"with_latest","title":"with_latest","text":"with_latest","category":"page"},{"location":"operators/join/with_latest/#Rocket.with_latest","page":"with_latest","title":"Rocket.with_latest","text":"with_latest(sources...)\n\nCreates a with_latest operator, which combines the source Observable with other Observables to create an Observable whose values are calculated from the latest values of each, only when the source emits.\n\nExamples\n\nusing Rocket\n\nsource = of(1)\nsubscribe!(source |> with_latest(from(1:5)), logger())\n;\n\n# output\n\n[LogActor] Data: (1, 5)\n[LogActor] Completed\n\nSee also: AbstractOperator, InferableOperator\n\n\n\n\n\n","category":"function"},{"location":"operators/join/with_latest/#See-also","page":"with_latest","title":"See also","text":"","category":"section"},{"location":"operators/join/with_latest/","page":"with_latest","title":"with_latest","text":"Operators","category":"page"},{"location":"operators/join/about/#Join-category","page":"Join category","title":"Join category","text":"","category":"section"},{"location":"operators/join/about/","page":"Join category","title":"Join category","text":"There are operators for different purposes, and they may be categorized as: creation, transformation, filtering, joining, multicasting, error handling, utility, etc. In the following list you will find all the operators organized in join category.","category":"page"},{"location":"operators/join/about/","page":"Join category","title":"Join category","text":"with_latest","category":"page"},{"location":"operators/join/about/#See-also","page":"Join category","title":"See also","text":"","category":"section"},{"location":"operators/join/about/","page":"Join category","title":"Join category","text":"Operators","category":"page"},{"location":"subjects/types/behavior/#subject_behavior","page":"Behavior","title":"BehaviorSubject","text":"","category":"section"},{"location":"subjects/types/behavior/","page":"Behavior","title":"Behavior","text":"BehaviorSubject\nBehaviorSubjectFactory","category":"page"},{"location":"subjects/types/behavior/#Rocket.BehaviorSubject","page":"Behavior","title":"Rocket.BehaviorSubject","text":"BehaviorSubject(value::D) where D\nBehaviorSubject(::Type{D}, value) where D\nBehaviorSubject(::Type{D}, value, factory::F) where { D, F <: AbstractSubjectFactory }\nBehaviorSubject(::Type{D}, value, subject::S) where { D, S }\n\nA variant of Subject that requires an initial value and emits its current value whenever it is subscribed to.\n\nSee also: BehaviorSubjectFactory, Subject, SubjectFactory\n\n\n\n\n\n","category":"function"},{"location":"subjects/types/behavior/#Rocket.BehaviorSubjectFactory","page":"Behavior","title":"Rocket.BehaviorSubjectFactory","text":"BehaviorSubjectFactory(default, factory::F) where { F <: AbstractSubjectFactory }\nBehaviorSubjectFactory(default; scheduler::H = AsapScheduler()) where { H <: AbstractScheduler }\n\nA variant of SubjectFactory that creates an instance of ReplaySubject.\n\nSee also: SubjectFactory, AbstractSubjectFactory, BehaviorSubject, Subject\n\n\n\n\n\n","category":"function"},{"location":"subjects/types/behavior/#Description","page":"Behavior","title":"Description","text":"","category":"section"},{"location":"subjects/types/behavior/","page":"Behavior","title":"Behavior","text":"One of the variants of Subjects is the BehaviorSubject, which has a notion of \"the current value\". It stores the latest value emitted to its consumers, and whenever a new Observer subscribes, it will immediately receive the \"current value\" from the BehaviorSubject.","category":"page"},{"location":"subjects/types/behavior/","page":"Behavior","title":"Behavior","text":"note: Note\nBehaviorSubjects are useful for representing \"values over time\". For instance, an event stream of birthdays is a Subject, but the stream of a person's age would be a BehaviorSubject.","category":"page"},{"location":"subjects/types/behavior/#Examples","page":"Behavior","title":"Examples","text":"","category":"section"},{"location":"subjects/types/behavior/","page":"Behavior","title":"Behavior","text":"In the following example, the BehaviorSubject is initialized with the value 0 which the first Observer receives when it subscribes. The second Observer receives the value 2 even though it subscribed after the value 2 was sent.","category":"page"},{"location":"subjects/types/behavior/","page":"Behavior","title":"Behavior","text":"using Rocket\n\nsubject = BehaviorSubject(Int, 0)\n\nsubscription1 = subscribe!(subject, logger(\"1\"))\n\nnext!(subject, 1)\nnext!(subject, 2)\n\nsubscription2 = subscribe!(subject, logger(\"2\"))\n\nnext!(subject, 3)\n\nunsubscribe!(subscription1)\nunsubscribe!(subscription2)\n\n// Logs\n// [1] Data: 0\n// [1] Data: 1\n// [1] Data: 2\n// [2] Data: 2\n// [1] Data: 3\n// [2] Data: 3","category":"page"},{"location":"api/operators/#operators_api","page":"Operators","title":"Operators API","text":"","category":"section"},{"location":"api/operators/#How-to-create-a-custom-operator","page":"Operators","title":"How to create a custom operator","text":"","category":"section"},{"location":"api/operators/","page":"Operators","title":"Operators","text":"If you need to write an operator that cannot be made from a combination of existing operators, then you can write a custom operator from scratch.","category":"page"},{"location":"api/operators/","page":"Operators","title":"Operators","text":"Each operator (e.g. MyFancyOperator) needs to either be (1) a subtype of one of abstract OperatorTrait trait types, or (2) define a","category":"page"},{"location":"api/operators/","page":"Operators","title":"Operators","text":"Rocket.as_operator(::Type{<:MyFancyOperator}) = TypedOperatorTrait{T, R}()\n# or\nRocket.as_operator(::Type{<:MyFancyOperator}) = InferableOperatorTrait()","category":"page"},{"location":"api/operators/","page":"Operators","title":"Operators","text":"trait behavior.","category":"page"},{"location":"api/operators/","page":"Operators","title":"Operators","text":"In addition, an operator must implement a specific method for on_call! function with custom logic which has to return another Observable as a result of applying MyFancyOperator to a source.","category":"page"},{"location":"api/operators/","page":"Operators","title":"Operators","text":"Rocket.on_call!(::Type{L}, ::Type{R}, operator::MyFancyOperator, source) where L = # some custom logic here\n\n# or\n# for inferable trait types you have to specify 'right' type with Rocket.operator_right which should specify a type of data of produced Observable\n\nRocket.on_call(::Type{L}, ::Type{R}, operator::MyFancyOperator, source) where L = # some custom logic here\nRocket.operator_right(::MyFancyOperator, ::Type{L}) where L = R # where R should be an actual type, Int or even L itself e.g.\n","category":"page"},{"location":"api/operators/","page":"Operators","title":"Operators","text":"note: Note\nIt is not allowed to modify the source Observable in any way; you have to return a new observable.","category":"page"},{"location":"api/operators/","page":"Operators","title":"Operators","text":"See more examples on custom operators in Traits API section","category":"page"},{"location":"api/operators/","page":"Operators","title":"Operators","text":"note: Note\nIt might be useful to return a ProxyObservable from an on_call! function. ProxyObservable is a special Observable which proxying actors with the source and/or source with actors.","category":"page"},{"location":"api/operators/#operators_api_traits","page":"Operators","title":"Traits","text":"","category":"section"},{"location":"api/operators/","page":"Operators","title":"Operators","text":"OperatorTrait\nas_operator\nTypedOperatorTrait\nLeftTypedOperatorTrait\nRightTypedOperatorTrait\nInferableOperatorTrait\nInvalidOperatorTrait","category":"page"},{"location":"api/operators/#Rocket.OperatorTrait","page":"Operators","title":"Rocket.OperatorTrait","text":"Abstract type for all possible operator traits\n\nSee also: TypedOperatorTrait, LeftTypedOperatorTrait, RightTypedOperatorTrait, InferableOperatorTrait, InvalidOperatorTrait,\n\n\n\n\n\n","category":"type"},{"location":"api/operators/#Rocket.as_operator","page":"Operators","title":"Rocket.as_operator","text":"as_operator(any)\n\nThis function checks operator trait behavior. May be used explicitly to specify operator trait behavior for any object.\n\nSee also: OperatorTrait, AbstractOperator\n\n\n\n\n\n","category":"function"},{"location":"api/operators/#Rocket.TypedOperatorTrait","page":"Operators","title":"Rocket.TypedOperatorTrait","text":"Typed operator trait specifies operator to be statically typed with input and output data types. Typed operator with input type L and output type R can only operate on input Observable with data type L and will always produce an Observable with data type R.\n\nExamples\n\nusing Rocket\n\nstruct MyTypedOperator <: TypedOperator{Int, Int} end\n\nfunction Rocket.on_call!(::Type{Int}, ::Type{Int}, op::MyTypedOperator, source)\n return proxy(Int, source, MyTypedOperatorProxy())\nend\n\nstruct MyTypedOperatorProxy <: ActorProxy end\n\nRocket.actor_proxy!(::Type{Int}, ::MyTypedOperatorProxy, actor::A) where A = MyTypedOperatorProxiedActor{A}(actor)\n\nstruct MyTypedOperatorProxiedActor{A} <: Actor{Int}\n actor :: A\nend\n\nfunction Rocket.on_next!(actor::MyTypedOperatorProxiedActor, data::Int)\n # Do something with a data and/or redirect it to actor.actor\n next!(actor.actor, data + 1)\nend\n\nRocket.on_error!(actor::MyTypedOperatorProxiedActor, err) = error!(actor.actor, err)\nRocket.on_complete!(actor::MyTypedOperatorProxiedActor) = complete!(actor.actor)\n\nsource = from([ 0, 1, 2 ])\nsubscribe!(source |> MyTypedOperator(), logger())\n;\n\n# output\n\n[LogActor] Data: 1\n[LogActor] Data: 2\n[LogActor] Data: 3\n[LogActor] Completed\n\nSee also: OperatorTrait, TypedOperator, OperatorTrait, ProxyObservable, ActorProxy, logger\n\n\n\n\n\n","category":"type"},{"location":"api/operators/#Rocket.LeftTypedOperatorTrait","page":"Operators","title":"Rocket.LeftTypedOperatorTrait","text":"Left typed operator trait specifies operator to be statically typed with input data type. To infer output data type this object should specify a special function operator_right(operator, ::Type{L}) where L which will be used to infer output data type. Left typed operator with input type L can only operate on input Observable with data type L and will always produce an Observable with data type inferred from operator_right(operator, ::Type{L}).\n\nExamples\n\nusing Rocket\n\nstruct CountIntegersOperator <: LeftTypedOperator{Int} end\n\nfunction Rocket.on_call!(::Type{Int}, ::Type{Tuple{Int, Int}}, op::CountIntegersOperator, source)\n return proxy(Tuple{Int, Int}, source, CountIntegersOperatorProxy())\nend\n\nRocket.operator_right(::CountIntegersOperator, ::Type{Int}) = Tuple{Int, Int}\n\nstruct CountIntegersOperatorProxy <: ActorProxy end\n\nRocket.actor_proxy!(::Type{Tuple{Int, Int}}, ::CountIntegersOperatorProxy, actor::A) where A = CountIntegersProxiedActor{A}(0, actor)\n\nmutable struct CountIntegersProxiedActor{A} <: Actor{Int}\n current :: Int\n actor :: A\nend\n\nfunction Rocket.on_next!(actor::CountIntegersProxiedActor, data::Int)\n current = actor.current\n actor.current += 1\n next!(actor.actor, (current, data)) # e.g.\nend\n\nRocket.on_error!(actor::CountIntegersProxiedActor, err) = error!(actor.actor, err)\nRocket.on_complete!(actor::CountIntegersProxiedActor) = complete!(actor.actor)\n\nsource = from([ 0, 0, 0 ])\nsubscribe!(source |> CountIntegersOperator(), logger())\n;\n\n# output\n\n[LogActor] Data: (0, 0)\n[LogActor] Data: (1, 0)\n[LogActor] Data: (2, 0)\n[LogActor] Completed\n\nSee also: OperatorTrait, LeftTypedOperator, operator_right, OperatorTrait, ProxyObservable, ActorProxy, enumerate, logger\n\n\n\n\n\n","category":"type"},{"location":"api/operators/#Rocket.RightTypedOperatorTrait","page":"Operators","title":"Rocket.RightTypedOperatorTrait","text":"Right typed operator trait specifies operator to be statically typed with output data type. It can operate on input Observable with any data type L but will always produce an Observable with data type R.\n\nExamples\n\nusing Rocket\n\nstruct ConvertToFloatOperator <: RightTypedOperator{Float64} end\n\nfunction Rocket.on_call!(::Type{L}, ::Type{Float64}, op::ConvertToFloatOperator, source) where L\n return proxy(Float64, source, ConvertToFloatProxy{L}())\nend\n\nstruct ConvertToFloatProxy{L} <: ActorProxy end\n\nfunction Rocket.actor_proxy!(::Type{Float64}, proxy::ConvertToFloatProxy{L}, actor::A) where { L, A }\n return ConvertToFloatProxyActor{L, A}(actor)\nend\n\nstruct ConvertToFloatProxyActor{L, A} <: Actor{L}\n actor :: A\nend\n\nfunction Rocket.on_next!(actor::ConvertToFloatProxyActor{L}, data::L) where L\n next!(actor.actor, convert(Float64, data)) # e.g.\nend\n\nRocket.on_error!(actor::ConvertToFloatProxyActor, err) = error!(actor.actor, err)\nRocket.on_complete!(actor::ConvertToFloatProxyActor) = complete!(actor.actor)\n\nsource = from([ 1, 2, 3 ])\nsubscribe!(source |> ConvertToFloatOperator(), logger())\n;\n\n# output\n\n[LogActor] Data: 1.0\n[LogActor] Data: 2.0\n[LogActor] Data: 3.0\n[LogActor] Completed\n\nSee also: OperatorTrait, RightTypedOperator, OperatorTrait, ProxyObservable, ActorProxy, logger\n\n\n\n\n\n","category":"type"},{"location":"api/operators/#Rocket.InferableOperatorTrait","page":"Operators","title":"Rocket.InferableOperatorTrait","text":"Inferable operator trait specifies operator to be statically typed neither with input data type nor with output data type. To infer output data type this object should specify a special function operator_right(operator, ::Type{L}) where L where L is input data type which will be used to infer output data type.\n\nusing Rocket\n\nstruct IdentityOperator <: InferableOperator end\n\nfunction Rocket.on_call!(::Type{L}, ::Type{L}, op::IdentityOperator, source) where L\n return proxy(L, source, IdentityProxy())\nend\n\nstruct IdentityProxy <: ActorProxy end\n\nRocket.operator_right(::IdentityOperator, ::Type{L}) where L = L\n\nRocket.actor_proxy!(::Type{L}, proxy::IdentityProxy, actor::A) where L where A = IdentityProxyActor{L, A}(actor)\n\nstruct IdentityProxyActor{L, A} <: Actor{L}\n actor :: A\nend\n\nfunction Rocket.on_next!(actor::IdentityProxyActor{L}, data::L) where L\n next!(actor.actor, data) # e.g.\nend\n\nRocket.on_error!(actor::IdentityProxyActor, err) = error!(actor.actor, err)\nRocket.on_complete!(actor::IdentityProxyActor) = complete!(actor.actor)\n\nsource = from([ 1, 2, 3 ])\nsubscribe!(source |> IdentityOperator(), logger())\n\nsource = from([ 1.0, 2.0, 3.0 ])\nsubscribe!(source |> IdentityOperator(), logger())\n;\n\n# output\n\n[LogActor] Data: 1\n[LogActor] Data: 2\n[LogActor] Data: 3\n[LogActor] Completed\n[LogActor] Data: 1.0\n[LogActor] Data: 2.0\n[LogActor] Data: 3.0\n[LogActor] Completed\n\n\nSee also: OperatorTrait, InferableOperator, operator_right, OperatorTrait, ProxyObservable, ActorProxy, logger\n\n\n\n\n\n","category":"type"},{"location":"api/operators/#Rocket.InvalidOperatorTrait","page":"Operators","title":"Rocket.InvalidOperatorTrait","text":"InvalidOperatorTrait trait specifies special 'invalid' behavior and types with such a trait specification cannot be used as an operator for an observable stream. By default any type has InvalidOperatorTrait trait specification\n\nSee also: OperatorTrait\n\n\n\n\n\n","category":"type"},{"location":"api/operators/#Types","page":"Operators","title":"Types","text":"","category":"section"},{"location":"api/operators/","page":"Operators","title":"Operators","text":"AbstractOperator\nTypedOperator\nLeftTypedOperator\nRightTypedOperator\nInferableOperator\non_call!\noperator_right\nOperatorsComposition","category":"page"},{"location":"api/operators/#Rocket.AbstractOperator","page":"Operators","title":"Rocket.AbstractOperator","text":"Supertype for all operators\n\nSee also: TypedOperator, LeftTypedOperator, RightTypedOperator, InferableOperator\n\n\n\n\n\n","category":"type"},{"location":"api/operators/#Rocket.TypedOperator","page":"Operators","title":"Rocket.TypedOperator","text":"Can be used as a supertype for any operator. Automatically specifies TypedOperatorTrait behavior.\n\nExamples\n\nusing Rocket\n\nstruct MyOperator <: TypedOperator{Float64,String} end\n\nas_operator(MyOperator) === TypedOperatorTrait{Float64,String}()\n\n# output\ntrue\n\nSee also: AbstractOperator, TypedOperatorTrait\n\n\n\n\n\n","category":"type"},{"location":"api/operators/#Rocket.LeftTypedOperator","page":"Operators","title":"Rocket.LeftTypedOperator","text":"Can be used as a supertype for any operator. Automatically specifies LeftTypedOperatorTrait behavior.\n\nExamples\n\nusing Rocket\n\nstruct MyOperator <: LeftTypedOperator{Float64} end\n\nas_operator(MyOperator) === LeftTypedOperatorTrait{Float64}()\n\n# output\ntrue\n\nSee also: AbstractOperator, LeftTypedOperatorTrait, operator_right\n\n\n\n\n\n","category":"type"},{"location":"api/operators/#Rocket.RightTypedOperator","page":"Operators","title":"Rocket.RightTypedOperator","text":"Can be used as a supertype for any operator. Automatically specifies RightTypedOperatorTrait behavior.\n\nExamples\n\nusing Rocket\n\nstruct MyOperator <: RightTypedOperator{Float64} end\n\nas_operator(MyOperator) === RightTypedOperatorTrait{Float64}()\n\n# output\ntrue\n\nSee also: AbstractOperator, RightTypedOperatorTrait\n\n\n\n\n\n","category":"type"},{"location":"api/operators/#Rocket.InferableOperator","page":"Operators","title":"Rocket.InferableOperator","text":"Can be used as a supertype for any operator. Automatically specifies InferableOperatorTrait behavior.\n\nExamples\n\nusing Rocket\n\nstruct MyOperator <: InferableOperator end\n\nas_operator(MyOperator) === InferableOperatorTrait()\n\n# output\ntrue\n\nSee also: AbstractOperator, InferableOperatorTrait, operator_right\n\n\n\n\n\n","category":"type"},{"location":"api/operators/#Rocket.on_call!","page":"Operators","title":"Rocket.on_call!","text":"on_call!(::Type, ::Type, operator, source)\n\nEach operator must implement its own method for on_call! function. This function is used to invoke operator on some Observable and to produce another Observable with new logic (operator specific).\n\nSee also: AbstractOperator\n\n\n\n\n\n","category":"function"},{"location":"api/operators/#Rocket.operator_right","page":"Operators","title":"Rocket.operator_right","text":"operator_right(operator, L)\n\nBoth LeftTypedOperator and InferableOperator must implement its own method for operator_right function. This function is used to infer type of data of output Observable given the type of data of input Observable.\n\nSee also: AbstractOperator, LeftTypedOperator, InferableOperator\n\n\n\n\n\n","category":"function"},{"location":"api/operators/#Rocket.OperatorsComposition","page":"Operators","title":"Rocket.OperatorsComposition","text":"OperatorsComposition(operators)\n\nOperatorsComposition is an object which helps to create a composition of multiple operators. To create a composition of two or more operators overloaded + or |> can be used.\n\nusing Rocket\n\ncomposition = map(Int, (d) -> d ^ 2) + filter(d -> d % 2 == 0)\n\nsource = from(1:5) |> composition\n\nsubscribe!(source, logger())\n;\n\n# output\n\n[LogActor] Data: 4\n[LogActor] Data: 16\n[LogActor] Completed\n\nusing Rocket\n\ncomposition = map(Int, (d) -> d ^ 2) |> filter(d -> d % 2 == 0)\n\nsource = from(1:5) |> composition\n\nsubscribe!(source, logger())\n;\n\n# output\n\n[LogActor] Data: 4\n[LogActor] Data: 16\n[LogActor] Completed\n\n\n\n\n\n","category":"type"},{"location":"api/operators/#Errors","page":"Operators","title":"Errors","text":"","category":"section"},{"location":"api/operators/","page":"Operators","title":"Operators","text":"InvalidOperatorTraitUsageError\nInconsistentSourceOperatorDataTypesError\nMissingOnCallImplementationError\nMissingOperatorRightImplementationError","category":"page"},{"location":"api/operators/#Rocket.InvalidOperatorTraitUsageError","page":"Operators","title":"Rocket.InvalidOperatorTraitUsageError","text":"This error will be thrown if |> pipe operator is called with invalid operator object\n\nSee also: on_call!\n\n\n\n\n\n","category":"type"},{"location":"api/operators/#Rocket.InconsistentSourceOperatorDataTypesError","page":"Operators","title":"Rocket.InconsistentSourceOperatorDataTypesError","text":"This error will be thrown if |> pipe operator is called with inconsistent data type\n\nSee also: on_call!\n\n\n\n\n\n","category":"type"},{"location":"api/operators/#Rocket.MissingOnCallImplementationError","page":"Operators","title":"Rocket.MissingOnCallImplementationError","text":"This error will be thrown if Julia cannot find specific method of on_call! function for a given operator.\n\nSee also: on_call!\n\n\n\n\n\n","category":"type"},{"location":"api/operators/#Rocket.MissingOperatorRightImplementationError","page":"Operators","title":"Rocket.MissingOperatorRightImplementationError","text":"This error will be thrown if Julia cannot find specific method of operator_right function for a given operator.\n\nSee also: operator_right\n\n\n\n\n\n","category":"type"},{"location":"observables/types/faulted/#observable_faulted","page":"Faulted","title":"Faulted Observable","text":"","category":"section"},{"location":"observables/types/faulted/","page":"Faulted","title":"Faulted","text":"faulted","category":"page"},{"location":"observables/types/faulted/#Rocket.faulted","page":"Faulted","title":"Rocket.faulted","text":"faulted(err; scheduler::H = AsapScheduler()) where { H <: AbstractScheduler }\nfaulted(::Type{T}, err; scheduler::H = AsapScheduler()) where { T, H <: AbstractScheduler }\n\nCreation operator for the FaultedObservable that emits no items to the Actor and immediately sends an error notification.\n\nArguments\n\nerr: the particular Error to pass to the error notification.\nT: type of output data source, optional, Any by default\nscheduler: optional, scheduler-like object\n\nExamples\n\nusing Rocket\n\nsource = faulted(\"Error!\")\nsubscribe!(source, logger())\n;\n\n# output\n\n[LogActor] Error: Error!\n\n\nSee also: FaultedObservable, subscribe!\n\n\n\n\n\n","category":"function"},{"location":"observables/types/faulted/","page":"Faulted","title":"Faulted","text":"FaultedObservable","category":"page"},{"location":"observables/types/faulted/#Rocket.FaultedObservable","page":"Faulted","title":"Rocket.FaultedObservable","text":"FaultedObservable{D, H}(err, scheduler::H)\n\nObservable that emits no items to the Actor and just sends an error notification on subscription.\n\nConstructor arguments\n\nerr: error to emit on subscription\nscheduler: scheduler-like object\n\nSee also: faulted\n\n\n\n\n\n","category":"type"},{"location":"operators/multicasting/multicast/#operator_multicast","page":"multicast","title":"Multicast Operator","text":"","category":"section"},{"location":"operators/multicasting/multicast/","page":"multicast","title":"multicast","text":"multicast","category":"page"},{"location":"operators/multicasting/multicast/#Rocket.multicast","page":"multicast","title":"Rocket.multicast","text":"multicast(subject::S) where S\nmulticast(factory::F) where { F <: AbstractSubjectFactory }\n\nThe multicast()operator takes a Subject and uses it to share the source execution. It returns what’s known as aConnectableObservable`, which has a connect() method. It has one simple job - subscribes to the source with the provided subject.\n\nExample\n\nusing Rocket\n\nsubject = Subject(Int)\nsource = from(1:5) |> multicast(subject)\n\nactor1 = logger(\"1\")\nactor2 = logger(\"2\")\n\nsubscription1 = subscribe!(source, actor1)\nsubscription2 = subscribe!(source, actor2)\n\nconnect(source)\n\nunsubscribe!(subscription1)\nunsubscribe!(subscription2)\n;\n\n# output\n\n[1] Data: 1\n[2] Data: 1\n[1] Data: 2\n[2] Data: 2\n[1] Data: 3\n[2] Data: 3\n[1] Data: 4\n[2] Data: 4\n[1] Data: 5\n[2] Data: 5\n[1] Completed\n[2] Completed\n\nSee also: ConnectableObservable, Subject, share, publish\n\n\n\n\n\n","category":"function"},{"location":"operators/multicasting/multicast/#See-also","page":"multicast","title":"See also","text":"","category":"section"},{"location":"operators/multicasting/multicast/","page":"multicast","title":"multicast","text":"Operators","category":"page"},{"location":"operators/transformation/map/#operator_map","page":"map","title":"Map Operator","text":"","category":"section"},{"location":"operators/transformation/map/","page":"map","title":"map","text":"map","category":"page"},{"location":"operators/transformation/map/#Base.map","page":"map","title":"Base.map","text":"map(::Type{R}, mappingFn::F) where { F <: Function }\n\nCreates a map operator, which applies a given mappingFn to each value emmited by the source Observable, and emits the resulting values as an Observable. You have to specify output R type after mappingFn projection.\n\nArguments\n\n::Type{R}: the type of data of transformed value, may be or may not be the same as source type\nmappingFn::Function: transformation function with (data::L) -> R signature, where L is type of data in input source\n\nProducing\n\nStream of type <: Subscribable{R}\n\nExamples\n\nusing Rocket\n\nsource = from([ 1, 2, 3 ])\nsubscribe!(source |> map(Int, (d) -> d ^ 2), logger())\n;\n\n# output\n\n[LogActor] Data: 1\n[LogActor] Data: 4\n[LogActor] Data: 9\n[LogActor] Completed\n\nSee also: AbstractOperator, RightTypedOperator, ProxyObservable, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/transformation/map/#Description","page":"map","title":"Description","text":"","category":"section"},{"location":"operators/transformation/map/","page":"map","title":"map","text":"The map operator, similar to map(f, array), applies a function to each value from the source. It's important to note that the function f is expected to be pure and without any side effects. The map operator is designed to create a copy of the original observable for each new subscriber. It independently executes the f function for each subscriber and doesn't share the resulting value. This might be inconvenient when f involves complex calculations or side effects.","category":"page"},{"location":"operators/transformation/map/","page":"map","title":"map","text":"using Rocket\n\nfunction f(x)\n println(\"Function `f` called\") # Assume heavy calculations or side-effects\n return x + 1\nend\n\nsubject = Subject(Int)\n\nmapped = subject |> map(Int, f)\n\nsubscription1 = subscribe!(mapped, logger())\nsubscription2 = subscribe!(mapped, logger())\n\nnext!(subject, 1)\n\nunsubscribe!(subscription1)\nunsubscribe!(subscription2)\nnothing #hide","category":"page"},{"location":"operators/transformation/map/","page":"map","title":"map","text":"In the example, you'll observe that \"Function f called\" is displayed twice. This happens because each subscriber receives their individual, distinct version of the modified data. To alter this behavior, one can utilize the share() operator. This operator creates only a single copy of the modified observable and shares the computed results.","category":"page"},{"location":"operators/transformation/map/","page":"map","title":"map","text":"mapped_and_shared = mapped |> share()\n\nsubscription1 = subscribe!(mapped_and_shared, logger())\nsubscription2 = subscribe!(mapped_and_shared, logger())\n\nnext!(subject, 1)\n\nunsubscribe!(subscription1)\nunsubscribe!(subscription2)\nnothing #hide","category":"page"},{"location":"operators/transformation/map/","page":"map","title":"map","text":"In this example, \"Function f called\" appears only once, and the computed value is shared between the two subscribers. Note, however, that this behaviour might be confusing in cases where the first subscribers completes the observable till its completion stage. For example:","category":"page"},{"location":"operators/transformation/map/","page":"map","title":"map","text":"mapped_and_shared = from([ 0, 1, 2 ]) |> map(Int, f) |> share()\n\nsubscription1 = subscribe!(mapped_and_shared, logger())\nsubscription2 = subscribe!(mapped_and_shared, logger())\n\nunsubscribe!(subscription1)\nunsubscribe!(subscription2)\nnothing #hide","category":"page"},{"location":"operators/transformation/map/","page":"map","title":"map","text":"In this scenario, the second subscriber doesn't receive any values because the first subscriber exhausts the single shared observable. Once the shared observable is used up, it doesn't produce any further values. This doesn't occur without the share() operator.","category":"page"},{"location":"operators/transformation/map/","page":"map","title":"map","text":"mapped = from([ 0, 1, 2 ]) |> map(Int, f)\n\nsubscription1 = subscribe!(mapped, logger())\nsubscription2 = subscribe!(mapped, logger())\n\nunsubscribe!(subscription1)\nunsubscribe!(subscription2)\nnothing #hide","category":"page"},{"location":"operators/transformation/map/#See-also","page":"map","title":"See also","text":"","category":"section"},{"location":"operators/transformation/map/","page":"map","title":"map","text":"Operators","category":"page"},{"location":"operators/utility/tap_on_complete/#operator_tap_on_complete","page":"tap_on_complete","title":"TapOnComplete Operator","text":"","category":"section"},{"location":"operators/utility/tap_on_complete/","page":"tap_on_complete","title":"tap_on_complete","text":"tap_on_complete","category":"page"},{"location":"operators/utility/tap_on_complete/#Rocket.tap_on_complete","page":"tap_on_complete","title":"Rocket.tap_on_complete","text":"tap_on_complete(tapFn::F) where { F <: Function }\n\nCreates a tap operator, which performs a side effect for only complete emission on the source Observable, but return an Observable that is identical to the source.\n\nArguments\n\ntapFn::Function: side-effect tap function with () -> Nothing signature\n\nProducing\n\nStream of type <: Subscribable{L} where L refers to type of source stream\n\nExamples\n\nusing Rocket\n\nsource = from([ 1, 2, 3 ])\nsubscribe!(source |> tap_on_complete(() -> println(\"Complete event received\")), logger())\n;\n\n# output\n\n[LogActor] Data: 1\n[LogActor] Data: 2\n[LogActor] Data: 3\n[LogActor] Completed\nComplete event received\n\n\nSee also: tap_on_subscribe, tap, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/utility/tap_on_complete/#Description","page":"tap_on_complete","title":"Description","text":"","category":"section"},{"location":"operators/utility/tap_on_complete/","page":"tap_on_complete","title":"tap_on_complete","text":"Returns an Observable that resembles the source Observable, but modifies it so that the provided Observer is called to perform a side effect on complete event emission by the source.","category":"page"},{"location":"operators/utility/tap_on_complete/","page":"tap_on_complete","title":"tap_on_complete","text":"This operator is useful for debugging your Observables, verifying correctness, or performing other side effects.","category":"page"},{"location":"operators/utility/tap_on_complete/","page":"tap_on_complete","title":"tap_on_complete","text":"Note: this operator differs from a subscribe on the Observable. If the Observable returned by tap_on_complete is not subscribed, the side effects specified by the Observer will never happen. tap_on_complete therefore simply spies on future execution, it does not trigger an execution to happen like subscribe does.","category":"page"},{"location":"operators/utility/tap_on_complete/#See-also","page":"tap_on_complete","title":"See also","text":"","category":"section"},{"location":"operators/utility/tap_on_complete/","page":"tap_on_complete","title":"tap_on_complete","text":"Operators","category":"page"},{"location":"observables/types/combined_updates/#observable_combined_updates","page":"Combined Updates","title":"CombinedUpdates Observable","text":"","category":"section"},{"location":"observables/types/combined_updates/","page":"Combined Updates","title":"Combined Updates","text":"combineLatestUpdates","category":"page"},{"location":"observables/types/combined_updates/#Rocket.combineLatestUpdates","page":"Combined Updates","title":"Rocket.combineLatestUpdates","text":"combineLatestUpdates(sources...; strategy = PushEach())\ncombineLatestUpdates(sources::S, strategy::G = PushEach()) where { S <: Tuple, U }\n\ncombineLatestUpdates is a more effiecient version of combineLatest(sources) + map_to(sources) operators chain.\n\nArguments\n\nsources: input sources\nstrategy: optional update strategy for batching new values together\n\nNote: combineLatestUpdates() completes immediately if sources are empty.\n\nSee also: Subscribable, subscribe!, PushEach, PushEachBut, PushNew, PushNewBut, PushStrategy\n\n\n\n\n\n","category":"function"},{"location":"observables/types/combined/#observable_combined","page":"Combined","title":"Combined Observable","text":"","category":"section"},{"location":"observables/types/combined/","page":"Combined","title":"Combined","text":"combineLatest\nPushEach\nPushEachBut\nPushNew\nPushNewBut\nPushStrategy","category":"page"},{"location":"observables/types/combined/#Rocket.combineLatest","page":"Combined","title":"Rocket.combineLatest","text":"combineLatest(sources...; strategy = PushEach())\ncombineLatest(sources::S, strategy::G = PushEach()) where { S <: Tuple, U }\n\nCombines multiple Observables to create an Observable whose values are calculated from the latest values of each of its input Observables. Accept optimal update strategy object.\n\nArguments\n\nsources: input sources\nstrategy: optional update strategy for batching new values together\n\nNote: combineLatest() completes immediately if sources are empty.\n\nExamples\n\nusing Rocket\n\nlatest = combineLatest(of(1), from(2:5))\n\nsubscribe!(latest, logger())\n;\n\n# output\n\n[LogActor] Data: (1, 2)\n[LogActor] Data: (1, 3)\n[LogActor] Data: (1, 4)\n[LogActor] Data: (1, 5)\n[LogActor] Completed\n\nusing Rocket\n\nlatest = combineLatest(of(1) |> async(0), from(2:5) |> async(0), strategy = PushNew())\n\nsubscribe!(latest, logger())\n;\n\n# output\n\n[LogActor] Data: (1, 2)\n[LogActor] Completed\n\nSee also: Subscribable, subscribe!, PushEach, PushEachBut, PushNew, PushNewBut, PushStrategy\n\n\n\n\n\n","category":"function"},{"location":"observables/types/combined/#Rocket.PushEach","page":"Combined","title":"Rocket.PushEach","text":"PushEach\n\nPushEach update strategy specifies the strategy to emit new value each time an inner observable emit a new value\n\nSee also: combineLatest, PushEachBut, PushNew, PushNewBut, PushStrategy\n\n\n\n\n\n","category":"type"},{"location":"observables/types/combined/#Rocket.PushEachBut","page":"Combined","title":"Rocket.PushEachBut","text":"PushEachBut{I}\n\nPushEachBut update strategy specifies the strategy to emit new value if and only if an inner observable with index I have a new value\n\nSee also: combineLatest, PushEach, PushNew, PushNewBut, PushStrategy\n\n\n\n\n\n","category":"type"},{"location":"observables/types/combined/#Rocket.PushNew","page":"Combined","title":"Rocket.PushNew","text":"PushNew\n\nPushNew update strategy specifies the strategy to emit new value if and only if all inner observables have a new value\n\nSee also: combineLatest, PushEach, PushEachBut, PushNewBut, PushStrategy\n\n\n\n\n\n","category":"type"},{"location":"observables/types/combined/#Rocket.PushNewBut","page":"Combined","title":"Rocket.PushNewBut","text":"PushNewBut{I}\n\nPushNewBut{I} update strategy specifies the strategy to emit new value if and only if all inner observables except with index I have a new value\n\nSee also: combineLatest, PushEach, PushEachBut, PushNew, PushStrategy\n\n\n\n\n\n","category":"type"},{"location":"observables/types/combined/#Rocket.PushStrategy","page":"Combined","title":"Rocket.PushStrategy","text":"PushStrategy(strategy::BitArray{1})\n\nPushStrategy update strategy specifies the strategy to emit new value if and only if all inner observables with index such that strategy[index] = false have a new value\n\nSee also: combineLatest, PushEach, PushEachBut, PushNew, PushNewBut, collectLatest\n\n\n\n\n\n","category":"type"},{"location":"observables/types/combined/#Description","page":"Combined","title":"Description","text":"","category":"section"},{"location":"observables/types/combined/","page":"Combined","title":"Combined","text":"combineLatest combines the values from all Observables in its arguments. This is done by subscribing to each Observable in order and, whenever an Observable emits, collecting a tuple of the most recent values from each Observable (in order). If you pass n Observables to combineLatest, the returned Observable will always emit an ordered tuple of n values.","category":"page"},{"location":"observables/types/combined/","page":"Combined","title":"Combined","text":"To ensure that the output tuple has a consistent length, combineLatest waits for all input Observables to emit at least once before it starts emitting results. This means that if some Observable emits values before other Observables started emitting, all these values but the last will be lost. On the other hand, if some Observable does not emit a value but completes, the resulting Observable will complete simultaneously without emitting anything. Furthermore, if some input Observable does not emit any value and never completes, combineLatest will also never emit and never complete.","category":"page"},{"location":"observables/types/combined/","page":"Combined","title":"Combined","text":"If at least one Observable was passed to combineLatest and all passed Observables emitted, then the resulting Observable will complete when all combined streams complete. So even if some Observable completes, the result of combineLatest will still emit values when the other Observables do. In case of a completed Observable, its value will now remain to be the last emitted value. On the other hand, if any Observable errors, combineLatest will also immediately error.","category":"page"},{"location":"observables/types/combined/","page":"Combined","title":"Combined","text":"It is possible to change default update/complete strategy behaviour with an optional strategy object.","category":"page"},{"location":"operators/filtering/about/#Filtering-category","page":"About filtering operators","title":"Filtering category","text":"","category":"section"},{"location":"operators/filtering/about/","page":"About filtering operators","title":"About filtering operators","text":"There are operators for different purposes, and they may be categorized as: creation, transformation, filtering, joining, multicasting, error handling, utility, etc. In the following list you will find all the operators organized in filtering category.","category":"page"},{"location":"operators/filtering/about/","page":"About filtering operators","title":"About filtering operators","text":"filter\nfilter_type\ntake\ntake_until\nfirst\nlast\nfind\nfind_index\nignore","category":"page"},{"location":"operators/filtering/about/#See-also","page":"About filtering operators","title":"See also","text":"","category":"section"},{"location":"operators/filtering/about/","page":"About filtering operators","title":"About filtering operators","text":"Operators","category":"page"},{"location":"observables/types/connectable/#observable_connectable","page":"Connectable","title":"Connectable Observable","text":"","category":"section"},{"location":"observables/types/connectable/","page":"Connectable","title":"Connectable","text":"connectable","category":"page"},{"location":"observables/types/connectable/#Rocket.connectable","page":"Connectable","title":"Rocket.connectable","text":"connectable(subject::J, source::S) where J where S\n\nCreates a ConnectableObservable with a given subject object and a source observable.\n\nExample\n\nusing Rocket\n\nc = connectable(Subject(Int; scheduler = AsapScheduler()), from(1:3))\n\nsubscribe!(c, logger());\n\nconnect(c);\n;\n\n# output\n\n[LogActor] Data: 1\n[LogActor] Data: 2\n[LogActor] Data: 3\n[LogActor] Completed\n\n\nSee also: ConnectableObservable, connect, subscribe!\n\n\n\n\n\n","category":"function"},{"location":"observables/types/connectable/","page":"Connectable","title":"Connectable","text":"connect","category":"page"},{"location":"observables/types/connectable/#Rocket.connect","page":"Connectable","title":"Rocket.connect","text":"connect(connectable::ConnectableObservable)\n\nWhen connect is called, the subject passed to the multicast operator is subscribed to the source and the subject’s observers receive the multicast notifications, which fits our basic mental model of stream multicasting. Returns a subscription.\n\nSee also: connectable, ConnectableObservable\n\n\n\n\n\n","category":"function"},{"location":"observables/types/connectable/","page":"Connectable","title":"Connectable","text":"ConnectableObservable","category":"page"},{"location":"observables/types/connectable/#Rocket.ConnectableObservable","page":"Connectable","title":"Rocket.ConnectableObservable","text":"ConnectableObservable{D}(subject, source)\n\nA connectable observable encapsulates the multicasting infrastructure with provided subject, but does not immediately subscribe to the source. It subscribes to the source when its connect method is called.\n\nSee also: connect, Subscribable\n\n\n\n\n\n","category":"type"},{"location":"operators/utility/tap_on_unsubscribe/#operator_tap_on_unsubscribe","page":"tap_on_unsubscribe","title":"TapOnUnsubscribe Operator","text":"","category":"section"},{"location":"operators/utility/tap_on_unsubscribe/","page":"tap_on_unsubscribe","title":"tap_on_unsubscribe","text":"TapBeforeUnsubscription\nTapAfterUnsubscription\ntap_on_unsubscribe","category":"page"},{"location":"operators/utility/tap_on_unsubscribe/#Rocket.TapBeforeUnsubscription","page":"tap_on_unsubscribe","title":"Rocket.TapBeforeUnsubscription","text":"TapBeforeUnsubscription\n\nOne of the strategies for tap_on_unsubscribe operator. With TapBeforeUnubscription tap callback will be called before actual unsubscription.\n\nSee also: tap_on_unsubscribe, TapAfterUnsubscription\n\n\n\n\n\n","category":"type"},{"location":"operators/utility/tap_on_unsubscribe/#Rocket.TapAfterUnsubscription","page":"tap_on_unsubscribe","title":"Rocket.TapAfterUnsubscription","text":"TapAfterUnsubscription\n\nOne of the strategies for tap_on_unsubscribe operator. With TapBeforeUnsubscription tap callback will be called after actual unsubscription.\n\nSee also: tap_on_unsubscribe, TapBeforeUnsubscription\n\n\n\n\n\n","category":"type"},{"location":"operators/utility/tap_on_unsubscribe/#Rocket.tap_on_unsubscribe","page":"tap_on_unsubscribe","title":"Rocket.tap_on_unsubscribe","text":"tap_on_unsubscribe(tapFn::F, strategy::S = TapBeforeUnsubscription()) where { F <: Function }\n\nCreates a tap operator, which performs a side effect on the unsubscription on the source Observable, but return an Observable that is identical to the source. Tap callback triggers only once.\n\nArguments\n\ntapFn::Function: side-effect tap function with () -> Nothing signature\nstrategy: (optional), specifies the order of a side-effect and an actual unsubscription, uses TapBeforeUnsubscription by default\n\nProducing\n\nStream of type <: Subscribable{L} where L refers to type of source stream\n\nExamples\n\nusing Rocket\n\nsource = from([ 1, 2, 3 ])\nsubscription = subscribe!(source |> tap_on_unsubscribe(() -> println(\"Someone unsubscribed\")), logger())\nunsubscribe!(subscription)\n;\n\n# output\n\n[LogActor] Data: 1\n[LogActor] Data: 2\n[LogActor] Data: 3\n[LogActor] Completed\nSomeone unsubscribed\n\nSee also: TapBeforeUnsubscription, TapAfterUnsubscription, tap, tap_on_subscribe, tap_on_complete, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/utility/tap_on_unsubscribe/#Description","page":"tap_on_unsubscribe","title":"Description","text":"","category":"section"},{"location":"operators/utility/tap_on_unsubscribe/","page":"tap_on_unsubscribe","title":"tap_on_unsubscribe","text":"Returns an Observable that resembles the source Observable, but modifies it so that the provided Observer is called to perform a side effect on unsubscription from the source.","category":"page"},{"location":"operators/utility/tap_on_unsubscribe/","page":"tap_on_unsubscribe","title":"tap_on_unsubscribe","text":"This operator is useful for debugging your Observables, verifying correctness, or performing other side effects.","category":"page"},{"location":"operators/utility/tap_on_unsubscribe/#See-also","page":"tap_on_unsubscribe","title":"See also","text":"","category":"section"},{"location":"operators/utility/tap_on_unsubscribe/","page":"tap_on_unsubscribe","title":"tap_on_unsubscribe","text":"Operators","category":"page"},{"location":"operators/errors/about/#Error-handling-category","page":"About error handling operators","title":"Error handling category","text":"","category":"section"},{"location":"operators/errors/about/","page":"About error handling operators","title":"About error handling operators","text":"There are operators for different purposes, and they may be categorized as: creation, transformation, filtering, joining, multicasting, error handling, utility, etc. In the following list you will find all the operators organized in error handling category.","category":"page"},{"location":"operators/errors/about/","page":"About error handling operators","title":"About error handling operators","text":"catch_error\nrerun\nerror_if\nerror_if_not","category":"page"},{"location":"operators/errors/about/#See-also","page":"About error handling operators","title":"See also","text":"","category":"section"},{"location":"operators/errors/about/","page":"About error handling operators","title":"About error handling operators","text":"Operators","category":"page"},{"location":"operators/utility/delay/#operator_delay","page":"delay","title":"Delay Operator","text":"","category":"section"},{"location":"operators/utility/delay/","page":"delay","title":"delay","text":"delay","category":"page"},{"location":"operators/utility/delay/#Rocket.delay","page":"delay","title":"Rocket.delay","text":"delay(delay::Int)\n\nCreates a delay operator, which delays the emission of items from the source Observable by a given timeout.\n\nArguments:\n\ndelay::Int: the delay duration in milliseconds (a number) until which the emission of the source items is delayed.\n\nProducing\n\nStream of type <: Subscribable{L} where L refers to type of source stream\n\nSee also: AbstractOperator, InferableOperator, ProxyObservable\n\n\n\n\n\n","category":"function"},{"location":"operators/utility/delay/#Description","page":"delay","title":"Description","text":"","category":"section"},{"location":"operators/utility/delay/","page":"delay","title":"delay","text":"Delays the emission of items from the source Observable by a given timeout","category":"page"},{"location":"operators/utility/delay/#Example","page":"delay","title":"Example","text":"","category":"section"},{"location":"operators/utility/delay/","page":"delay","title":"delay","text":"Delay every value with 1 second to the output","category":"page"},{"location":"operators/utility/delay/","page":"delay","title":"delay","text":"using Rocket\nusing Dates\n\nsource = from([ 1, 2, 3 ])\nprintln(Dates.format(now(), \"MM:SS\"))\nsubscription = subscribe!(source |> delay(2000), lambda(\n on_next = (d) -> println(\"$(Dates.format(now(), \"MM:SS\")): $d\")\n));\n\n# output\n\n03:41\n03:43: 1\n03:43: 2\n03:43: 3\n","category":"page"},{"location":"operators/utility/delay/#See-also","page":"delay","title":"See also","text":"","category":"section"},{"location":"operators/utility/delay/","page":"delay","title":"delay","text":"Operators","category":"page"},{"location":"operators/filtering/take/#operator_take","page":"take","title":"Take Operator","text":"","category":"section"},{"location":"operators/filtering/take/","page":"take","title":"take","text":"take","category":"page"},{"location":"operators/filtering/take/#Rocket.take","page":"take","title":"Rocket.take","text":"take(maxcount::Int)\n\nCreates a take operator, which returns an Observable that emits only the first maxcount values emitted by the source Observable.\n\nArguments\n\nmaxcount::Int: the maximum number of next values to emit.\n\nProducing\n\nStream of type <: Subscribable{L} where L refers to type of source stream\n\nExamples\n\nusing Rocket\n\nsource = from([ i for i in 1:100 ])\n\nsubscribe!(source |> take(5), logger())\n;\n\n# output\n\n[LogActor] Data: 1\n[LogActor] Data: 2\n[LogActor] Data: 3\n[LogActor] Data: 4\n[LogActor] Data: 5\n[LogActor] Completed\n\nSee also: AbstractOperator, InferableOperator, ProxyObservable, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/filtering/take/#Description","page":"take","title":"Description","text":"","category":"section"},{"location":"operators/filtering/take/","page":"take","title":"take","text":"take returns an Observable that emits only the first count values emitted by the source Observable. If the source emits fewer than count values, then all of its values are emitted. Afterwards, the Observable completes regardless of whether the source completed.","category":"page"},{"location":"operators/filtering/take/#See-also","page":"take","title":"See also","text":"","category":"section"},{"location":"operators/filtering/take/","page":"take","title":"take","text":"Operators","category":"page"},{"location":"operators/transformation/scan/#operator_scan","page":"scan","title":"Scan Operator","text":"","category":"section"},{"location":"operators/transformation/scan/","page":"scan","title":"scan","text":"scan","category":"page"},{"location":"operators/transformation/scan/#Rocket.scan","page":"scan","title":"Rocket.scan","text":"scan(::Type{R}, scanFn::F, seed::R) where { R, F <: Function }\nscan(scanFn::F) where { F <: Function }\n\nCreates a scan operator, which applies a given accumulator scanFn function to each value emmited by the source Observable, and returns each intermediate result with an optional seed value. If a seed value is specified, then that value will be used as the initial value for the accumulator. If no seed value is specified, the first item of the source is used as the seed.\n\nArguments\n\n::Type{R}: the type of data of transformed value, may be or may not be the same as type of input source\nscanFn::Function: accumulator function with (data::T, current::R) -> R signature\nseed::R: optional initial value for accumulator function\n\nProducing\n\nStream of type <: Subscribable{R}\n\nExamples\n\nusing Rocket\n\nsource = from([ 1, 2, 3 ])\nsubscribe!(source |> scan(+), logger())\n;\n\n# output\n\n[LogActor] Data: 1\n[LogActor] Data: 3\n[LogActor] Data: 6\n[LogActor] Completed\n\n\nusing Rocket\n\nsource = from([ 1, 2, 3 ])\nsubscribe!(source |> scan(Vector{Int}, (d, c) -> [ c..., d ], Int[]), logger())\n;\n\n# output\n\n[LogActor] Data: [1]\n[LogActor] Data: [1, 2]\n[LogActor] Data: [1, 2, 3]\n[LogActor] Completed\n\n\nSee also: AbstractOperator, RightTypedOperator, ProxyObservable, reduce, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/transformation/scan/#Description","page":"scan","title":"Description","text":"","category":"section"},{"location":"operators/transformation/scan/","page":"scan","title":"scan","text":"Combines all values emitted by the source, using an accumulator function that joins a new source value with the past accumulation. This is similar to reduce, but emits the intermediate accumulations.","category":"page"},{"location":"operators/transformation/scan/","page":"scan","title":"scan","text":"Returns an Observable that applies a specified accumulator function to each item emitted by the source Observable. If a seed value is specified, then that value will be used as the initial value for the accumulator. If no seed value is specified, the first item of the source is used as the seed.","category":"page"},{"location":"operators/transformation/scan/#See-also","page":"scan","title":"See also","text":"","category":"section"},{"location":"operators/transformation/scan/","page":"scan","title":"scan","text":"Operators","category":"page"},{"location":"actors/types/buffer/#actor_buffer","page":"Buffer","title":"Buffer actor","text":"","category":"section"},{"location":"actors/types/buffer/","page":"Buffer","title":"Buffer","text":"buffer","category":"page"},{"location":"actors/types/buffer/#Rocket.buffer","page":"Buffer","title":"Rocket.buffer","text":"buffer(::Type{T}, size::Int) where T\n\nArguments\n\n::Type{T}: Type of data in buffer\nsize::Int: size of buffer\n\nCreation operator for the BufferActor actor.\n\nExamples\n\nusing Rocket\n\nactor = buffer(Int, 3)\nactor isa BufferActor{Int}\n\n# output\ntrue\n\nSee also: BufferActor, AbstractActor\n\n\n\n\n\n","category":"function"},{"location":"actors/types/buffer/","page":"Buffer","title":"Buffer","text":"BufferActor","category":"page"},{"location":"actors/types/buffer/#Rocket.BufferActor","page":"Buffer","title":"Rocket.BufferActor","text":"BufferActor{D}() where D\n\nBuffer actor provides a storage actor. It copies last incoming successful next events in a values array, throws an ErrorException on error! event and does nothing on completion event. Note: Actor does not check the size of incoming data.\n\nExamples\n\nusing Rocket\n\nsource = of([ 1, 2, 3 ])\nactor = buffer(Int, 3)\n\nsubscribe!(source, actor)\nshow(getvalues(actor))\n\n# output\n[1, 2, 3]\n\nSee also: Actor, buffer\n\n\n\n\n\n","category":"type"},{"location":"operators/creation/about/#Creation-category","page":"Creation","title":"Creation category","text":"","category":"section"},{"location":"operators/creation/about/","page":"Creation","title":"Creation","text":"There are operators for different purposes, and they may be categorized as: creation, transformation, filtering, joining, multicasting, error handling, utility, etc. In the following list you will find all the operators organized in creation category.","category":"page"},{"location":"operators/creation/about/","page":"Creation","title":"Creation","text":"make\nof\nfrom\niterable\nfaulted\nnever\ncompleted\ntimer\ninterval\nproxy\nfile\ncombined\nrace\nconnectable\nmerged\nconcat\ngenerate\nnetwork\ndefer\nzipped","category":"page"},{"location":"operators/creation/about/#See-also","page":"Creation","title":"See also","text":"","category":"section"},{"location":"operators/creation/about/","page":"Creation","title":"Creation","text":"Operators","category":"page"},{"location":"subjects/types/recent/#subject_recent","page":"Recent","title":"RecentSubject","text":"","category":"section"},{"location":"subjects/types/recent/","page":"Recent","title":"Recent","text":"RecentSubject\nRecentSubjectFactory","category":"page"},{"location":"subjects/types/recent/#Rocket.RecentSubject","page":"Recent","title":"Rocket.RecentSubject","text":"RecentSubject(::Type{D}) where D\nRecentSubject(::Type{D}, factory::F) where { D, F <: AbstractSubjectFactory }\nRecentSubject(::Type{D}, subject::S) where { D, S }\n\nA variant of Subject that emits its recent value whenever it is subscribed to.\n\nSee also: RecentSubjectFactory, Subject, SubjectFactory\n\n\n\n\n\n","category":"function"},{"location":"subjects/types/recent/#Rocket.RecentSubjectFactory","page":"Recent","title":"Rocket.RecentSubjectFactory","text":"RecentSubjectFactory(factory::F) where { F <: AbstractSubjectFactory }\nRecentSubjectFactory(; scheduler::H = AsapScheduler()) where { H <: AbstractScheduler }\n\nA variant of SubjectFactory that creates an instance of RecentSubject.\n\nSee also: SubjectFactory, AbstractSubjectFactory, RecentSubject, Subject\n\n\n\n\n\n","category":"function"},{"location":"subjects/types/recent/#Description","page":"Recent","title":"Description","text":"","category":"section"},{"location":"subjects/types/recent/","page":"Recent","title":"Recent","text":"One of the variants of Subjects is the RecentSubject, which has a notion of \"the recent value\". It stores the latest value emitted to its consumers, and whenever a new Observer subscribes, it will immediately receive the \"recent value\" from the RecentSubject.","category":"page"},{"location":"subjects/types/recent/","page":"Recent","title":"Recent","text":"note: Note\nRecentSubjects is a more efficient version of ReplaySubjects with replay size equal to one.","category":"page"},{"location":"subjects/types/recent/#Examples","page":"Recent","title":"Examples","text":"","category":"section"},{"location":"subjects/types/recent/","page":"Recent","title":"Recent","text":"In the following example, after RecentSubject is initialized the first Observer receives nothing when it subscribes. The second Observer receives the value 2 even though it subscribed after the value 2 was sent.","category":"page"},{"location":"subjects/types/recent/","page":"Recent","title":"Recent","text":"using Rocket\n\nsubject = RecentSubject(Int)\n\nsubscription1 = subscribe!(subject, logger(\"1\"))\n\nnext!(subject, 1)\nnext!(subject, 2)\n\nsubscription2 = subscribe!(subject, logger(\"2\"))\n\nnext!(subject, 3)\n\nunsubscribe!(subscription1)\nunsubscribe!(subscription2)\n\n// Logs\n// [1] Data: 1\n// [1] Data: 2\n// [2] Data: 2\n// [1] Data: 3\n// [2] Data: 3","category":"page"},{"location":"operators/utility/noop/#operator_noop","page":"noop","title":"Noop Operator","text":"","category":"section"},{"location":"operators/utility/noop/","page":"noop","title":"noop","text":"noop","category":"page"},{"location":"operators/utility/noop/#Rocket.noop","page":"noop","title":"Rocket.noop","text":"noop()\n\nCreates a noop operator, which does nothing, but breaks operator composition type inference checking procedure for Julia's compiler. It might be useful for very long chain of operators, because Julia tries to statically infer data types at compile-time for the whole chain and can run into StackOverflow issues.\n\nusing Rocket\n\n# foo() block to enforce local scope for scope variable\nfunction foo()\n source = from(1:5)\n\n for i in 1:1000\n source = source |> map(Int, d -> d + 1) |> noop()\n end\n\n subscribe!(source, logger())\nend\n\nfoo()\n;\n\n# output\n\n[LogActor] Data: 1001\n[LogActor] Data: 1002\n[LogActor] Data: 1003\n[LogActor] Data: 1004\n[LogActor] Data: 1005\n[LogActor] Completed\n\nSee also: AbstractOperator, InferableOperator, logger, map\n\n\n\n\n\n","category":"function"},{"location":"operators/utility/noop/#See-also","page":"noop","title":"See also","text":"","category":"section"},{"location":"operators/utility/noop/","page":"noop","title":"noop","text":"Operators","category":"page"},{"location":"getting-started/#Getting-started","page":"Getting started","title":"Getting started","text":"","category":"section"},{"location":"getting-started/","page":"Getting started","title":"Getting started","text":"Rocket.jl is a Julia package for reactive programming that makes it easier to work with asynchronous data. It is inspired by the RxJS and ReactiveX communities.","category":"page"},{"location":"getting-started/","page":"Getting started","title":"Getting started","text":"In order to combine good performance with a convenient API, Rocket.jl employs Observer patterns, Actor models and Functional programming.","category":"page"},{"location":"getting-started/#Installation","page":"Getting started","title":"Installation","text":"","category":"section"},{"location":"getting-started/","page":"Getting started","title":"Getting started","text":"Install Rocket.jl through the Julia package manager:","category":"page"},{"location":"getting-started/","page":"Getting started","title":"Getting started","text":"] add Rocket","category":"page"},{"location":"getting-started/#Concepts","page":"Getting started","title":"Concepts","text":"","category":"section"},{"location":"getting-started/","page":"Getting started","title":"Getting started","text":"Rocket.jl has been designed with a focus on performance and modularity.","category":"page"},{"location":"getting-started/","page":"Getting started","title":"Getting started","text":"The essential concepts in Rocket.jl are:","category":"page"},{"location":"getting-started/","page":"Getting started","title":"Getting started","text":"Observable: represents a collection of future messages (data or/and events).\nActor: is an object that knows how to react on incoming messages delivered by the Observable.\nSubscription: represents a teardown logic that is useful for cancelling the execution of an Observable.\nOperator: an object that deals with collection operations, such as map, filter, reduce, etc.\nSubject: the way of multicasting a message to multiple Observers.","category":"page"},{"location":"getting-started/#First-example","page":"Getting started","title":"First example","text":"","category":"section"},{"location":"getting-started/","page":"Getting started","title":"Getting started","text":"Conventionally, arrays are used for processing data.","category":"page"},{"location":"getting-started/","page":"Getting started","title":"Getting started","text":"for value in array_of_values\n doSomethingWithMyData(value)\nend","category":"page"},{"location":"getting-started/","page":"Getting started","title":"Getting started","text":"In contrast, Rocket.jl uses observables.","category":"page"},{"location":"getting-started/","page":"Getting started","title":"Getting started","text":"subscription = subscribe!(source_of_values, lambda(\n on_next = (data) -> doSomethingWithMyData(data),\n on_error = (error) -> doSomethingWithAnError(error),\n on_complete = () -> println(\"Completed!\")\n))","category":"page"},{"location":"getting-started/","page":"Getting started","title":"Getting started","text":"At some point in time you may decide to stop listening for new messages.","category":"page"},{"location":"getting-started/","page":"Getting started","title":"Getting started","text":"unsubscribe!(subscription)","category":"page"},{"location":"getting-started/#Actors","page":"Getting started","title":"Actors","text":"","category":"section"},{"location":"getting-started/","page":"Getting started","title":"Getting started","text":"In order to process messages from an observable you will need to define an Actor that knows how to react to incoming messages.","category":"page"},{"location":"getting-started/","page":"Getting started","title":"Getting started","text":"struct MyActor <: Rocket.Actor{Int} end\n\nRocket.on_next!(actor::MyActor, data::Int) = doSomethingWithMyData(data)\nRocket.on_error!(actor::MyActor, error) = doSomethingWithAnError(error)\nRocket.on_complete!(actor::MyActor) = println(\"Completed!\")","category":"page"},{"location":"getting-started/","page":"Getting started","title":"Getting started","text":"An actor can also have its own local state.","category":"page"},{"location":"getting-started/","page":"Getting started","title":"Getting started","text":"struct StoreActor{D} <: Rocket.Actor{D}\n values :: Vector{D}\n\n StoreActor{D}() where D = new(Vector{D}())\nend\n\nRocket.on_next!(actor::StoreActor{D}, data::D) where D = push!(actor.values, data)\nRocket.on_error!(actor::StoreActor, error) = doSomethingWithAnError(error)\nRocket.on_complete!(actor::StoreActor) = println(\"Completed: $(actor.values)\")","category":"page"},{"location":"getting-started/","page":"Getting started","title":"Getting started","text":"For debugging purposes you can use a general LambdaActor actor or just pass a function object as an actor in subscribe! function..","category":"page"},{"location":"getting-started/#Operators","page":"Getting started","title":"Operators","text":"","category":"section"},{"location":"getting-started/","page":"Getting started","title":"Getting started","text":"What makes Rocket.jl powerful is its ability to help you process, transform and modify the messages that flow through your observables, using Operators.","category":"page"},{"location":"getting-started/","page":"Getting started","title":"Getting started","text":"subscribe!(squared_int_values |> map(Int, (d) -> d ^ 2), lambda(\n on_next = (data) -> println(data)\n))","category":"page"},{"location":"operators/transformation/pairwise/#operator_pairwise","page":"pairwise","title":"Pairwise Operator","text":"","category":"section"},{"location":"operators/transformation/pairwise/","page":"pairwise","title":"pairwise","text":"pairwise","category":"page"},{"location":"operators/transformation/pairwise/#Rocket.pairwise","page":"pairwise","title":"Rocket.pairwise","text":"pairwise([ initial ])\n\nCreates a pairwise operator, which groups pairs of consecutive emissions together and emits them as a tuple of two values. Accepts optional initial seed value to start pairing from.\n\nusing Rocket\n\nsource = from(1:5) |> pairwise()\n\nsubscribe!(source, logger())\n;\n\n# output\n\n[LogActor] Data: (1, 2)\n[LogActor] Data: (2, 3)\n[LogActor] Data: (3, 4)\n[LogActor] Data: (4, 5)\n[LogActor] Completed\n\nusing Rocket\n\nsource = from(1:5) |> pairwise(0)\n\nsubscribe!(source, logger())\n;\n\n# output\n\n[LogActor] Data: (0, 1)\n[LogActor] Data: (1, 2)\n[LogActor] Data: (2, 3)\n[LogActor] Data: (3, 4)\n[LogActor] Data: (4, 5)\n[LogActor] Completed\n\nSee also: AbstractOperator, InferableOperator, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/transformation/pairwise/#See-also","page":"pairwise","title":"See also","text":"","category":"section"},{"location":"operators/transformation/pairwise/","page":"pairwise","title":"pairwise","text":"Operators","category":"page"},{"location":"operators/filtering/first/#operator_first","page":"first","title":"First operator","text":"","category":"section"},{"location":"operators/filtering/first/","page":"first","title":"first","text":"first","category":"page"},{"location":"operators/filtering/first/#Base.first","page":"first","title":"Base.first","text":"first(; default = nothing)\n\nCreates a first operator, which returns an Observable that emits only the first value emitted by the source Observable. Sends FirstNotFoundException error message if a given source completes without emitting a single value.\n\nArguments\n\ndefault: an optional default value to provide if no values were emitted\n\nProducing\n\nStream of type <: Subscribable{L} where L refers to type of source stream\n\nExamples\n\nusing Rocket\n\nsource = from(1:100)\nsubscription = subscribe!(source |> first(), logger())\n;\n\n# output\n\n[LogActor] Data: 1\n[LogActor] Completed\n\nSee also: take, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/filtering/first/#Description","page":"first","title":"Description","text":"","category":"section"},{"location":"operators/filtering/first/","page":"first","title":"first","text":"An alias for take(1) operator.","category":"page"},{"location":"operators/filtering/first/#See-also","page":"first","title":"See also","text":"","category":"section"},{"location":"operators/filtering/first/","page":"first","title":"first","text":"Operators, take","category":"page"},{"location":"actors/types/function/#actor_function","page":"Function","title":"Function actor","text":"","category":"section"},{"location":"actors/types/function/","page":"Function","title":"Function","text":"FunctionActor","category":"page"},{"location":"actors/types/function/#Rocket.FunctionActor","page":"Function","title":"Rocket.FunctionActor","text":"FunctionActor{D} <: Actor{D}\n\nFunctionActor provides a simple interface to use a single function as a next! callback, error! callback throws an ErrorException and complete! callback does nothing. Should not be used explicitly because it will be created automatically when passing a Function object as an actor in subscribe! function.\n\nExamples\n\nusing Rocket\n\nsource = from(1:5)\nsubscribe!(source, (t) -> println(t))\n;\n\n# output\n1\n2\n3\n4\n5\n\nSee also: Actor, subscribe!\n\n\n\n\n\n","category":"type"},{"location":"operators/mathematical/min/#operator_min","page":"min","title":"Min Operator","text":"","category":"section"},{"location":"operators/mathematical/min/","page":"min","title":"min","text":"min","category":"page"},{"location":"operators/mathematical/min/#Base.min","page":"min","title":"Base.min","text":"min(; from = nothing)\n\nCreates a min operator, which emits a single item: the item with the smallest value.\n\nArguments\n\nfrom: optional initial minimal value, if nothing first item from the source will be used as initial instead\n\nProducing\n\nStream of type <: Subscribable{Union{L, Nothing}} where L refers to type of source stream\n\nExamples\n\nusing Rocket\n\nsource = from([ i for i in 1:42 ])\nsubscribe!(source |> min(), logger())\n;\n\n# output\n\n[LogActor] Data: 1\n[LogActor] Completed\n\n\nSee also: AbstractOperator, InferableOperator, ProxyObservable, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/mathematical/min/#Description","page":"min","title":"Description","text":"","category":"section"},{"location":"operators/mathematical/min/","page":"min","title":"min","text":"The min operator operates on an Observable of similar objects. When source Observable completes, it emits the item with the smallest value.","category":"page"},{"location":"operators/mathematical/min/#See-also","page":"min","title":"See also","text":"","category":"section"},{"location":"operators/mathematical/min/","page":"min","title":"min","text":"Operators","category":"page"},{"location":"operators/errors/error_if/#operator_error_if","page":"error_if","title":"Error If Operator","text":"","category":"section"},{"location":"operators/errors/error_if/","page":"error_if","title":"error_if","text":"error_if","category":"page"},{"location":"operators/errors/error_if/#Rocket.error_if","page":"error_if","title":"Rocket.error_if","text":"error_if(checkFn, errorFn)\n\nCreates an error_if operator, which performs a check for every emission on the source Observable with checkFn. If checkFn returns true, the operator sends an error event and unsubscribes from the observable.\n\nArguments\n\ncheckFn: check function with (data) -> Bool signature\nerrorFn: error object generating function with (data) -> Any signature, optional\n\nProducing\n\nStream of type <: Subscribable{L} where L refers to type of source stream\n\nExamples\n\nusing Rocket\n\nsource = from([1, 2, 3]) |> error_if((data) -> data > 2, (data) -> \"CustomError\")\n\nsubscription = subscribe!(source, lambda(\n on_next = (d) -> println(\"Next: \", d),\n on_error = (e) -> println(\"Error: \", e),\n on_complete = () -> println(\"Completed\")\n))\n;\n\n# output\nNext: 1\nNext: 2\nError: CustomError\n\nSee also: error_if_not, error_if_empty, default_if_empty, lambda\n\n\n\n\n\n","category":"function"},{"location":"operators/errors/error_if/#See-also","page":"error_if","title":"See also","text":"","category":"section"},{"location":"operators/errors/error_if/","page":"error_if","title":"error_if","text":"Operators","category":"page"},{"location":"subjects/about/#section_subjects","page":"Subject","title":"About subjects","text":"","category":"section"},{"location":"subjects/about/","page":"Subject","title":"Subject","text":"A Rocket.jl Subject is a special type of Observable that allows values to be multicasted to many Actors. While plain Observables are unicast (each subscribed Actor owns an independent execution of the Observable), Subjects are multicast.","category":"page"},{"location":"subjects/about/","page":"Subject","title":"Subject","text":"note: Note\nA Subject is like an Observable, but can multicast to many Actors. Subjects are like event emitters: they maintain a registry of many listeners.","category":"page"},{"location":"subjects/about/","page":"Subject","title":"Subject","text":"Every Subject is an Observable. Given a Subject, you can subscribe to it, providing an Actor, which will start receiving values normally. From the perspective of the Actor, it cannot tell whether the Observable execution is coming from a plain unicast Observable or a Subject.","category":"page"},{"location":"subjects/about/","page":"Subject","title":"Subject","text":"Internally to the Subject, subscribe! does not invoke a new execution that delivers values. Instead, it simply registers the given Actor in a list of Actors.","category":"page"},{"location":"subjects/about/","page":"Subject","title":"Subject","text":"Every Subject is an Actor itself. It is an object with the methods next!, error!, and complete!. Call next!(subject, theValue) to feed a new value to the Subject, and it will be multicasted to the Actors that listen to the Subject.","category":"page"},{"location":"subjects/about/","page":"Subject","title":"Subject","text":"In the example below, we have two Observers attached to a Subject, and we feed some values to the Subject:","category":"page"},{"location":"subjects/about/","page":"Subject","title":"Subject","text":"using Rocket\n\nsource = Subject(Int)\n\nsubscription1 = subscribe!(source, lambda(\n on_next = (d) -> println(\"Actor 1: $d\")\n))\n\nsubscription2 = subscribe!(source, lambda(\n on_next = (d) -> println(\"Actor 2: $d\")\n))\n\nnext!(source, 0)\n\n# Logs\n# Actor 1: 0\n# Actor 2: 0\n\nunsubscribe!(subscription1)\nunsubscribe!(subscription2)\n","category":"page"},{"location":"subjects/about/","page":"Subject","title":"Subject","text":"Since a Subject is an actor, this also means you may provide a Subject as the argument to the subscribe of any Observable:","category":"page"},{"location":"subjects/about/","page":"Subject","title":"Subject","text":"using Rocket\n\nsource = Subject(Int)\n\nsubscription1 = subscribe!(source, lambda(\n on_next = (d) -> println(\"Actor 1: $d\")\n))\n\nsubscription2 = subscribe!(source, lambda(\n on_next = (d) -> println(\"Actor 2: $d\")\n))\n\nother_source = from([ 1, 2, 3 ])\nsubscribe!(other_source, source);\n\n# Logs\n# Actor 1: 1\n# Actor 2: 1\n# Actor 1: 2\n# Actor 2: 2\n# Actor 1: 3\n# Actor 2: 3","category":"page"},{"location":"subjects/about/","page":"Subject","title":"Subject","text":"Here, we essentially convert a unicast Observable execution to multicast, through the Subject. This demonstrates how Subjects offer a unique way to share Observable execution with multiple Observers.","category":"page"},{"location":"subjects/about/#Schedulers","page":"Subject","title":"Schedulers","text":"","category":"section"},{"location":"subjects/about/","page":"Subject","title":"Subject","text":"A Subject (and some other observables) uses scheduler objects to schedule message delivery to their listeners.","category":"page"},{"location":"subjects/about/#Synchronous-scheduler","page":"Subject","title":"Synchronous scheduler","text":"","category":"section"},{"location":"subjects/about/","page":"Subject","title":"Subject","text":"One of the variants of schedulers is the AsapScheduler, which delivers every message synchronously. AsapScheduler is a default scheduler for all Subject objects.","category":"page"},{"location":"subjects/about/","page":"Subject","title":"Subject","text":"AsapScheduler","category":"page"},{"location":"subjects/about/#Rocket.AsapScheduler","page":"Subject","title":"Rocket.AsapScheduler","text":"AsapScheduler\n\nAsapScheduler executes scheduled actions as soon as possible and does not introduce any additional logic. AsapScheduler is a default scheduler for almost all observables.\n\n\n\n\n\n","category":"type"},{"location":"subjects/about/","page":"Subject","title":"Subject","text":"using Rocket\n\nsubject = Subject(Int, scheduler = AsapScheduler())\n\nsubscription1 = subscribe!(subject, logger(\"Actor 1\"))\n\nprintln(\"Before next\")\nnext!(subject, 1)\nnext!(subject, 2)\nprintln(\"After next\")\n\nsubscription2 = subscribe!(subject, logger(\"Actor 2\"))\n\nnext!(subject, 3)\n\n# Logs\n# Before next\n# [Actor 1] Data: 1\n# [Actor 1] Data: 2\n# After next\n# [Actor 1] Data: 3\n# [Actor 2] Data: 3","category":"page"},{"location":"subjects/about/#Asynchronous-Scheduler","page":"Subject","title":"Asynchronous Scheduler","text":"","category":"section"},{"location":"subjects/about/","page":"Subject","title":"Subject","text":"An AsyncScheduler is similar to a AsapScheduler. Both allows for Subject to scheduler their messages for multiple listeners, but a AsyncScheduler delivers all messages asynchronously (but still ordered) using a Julia's built-in Task object.","category":"page"},{"location":"subjects/about/","page":"Subject","title":"Subject","text":"AsyncScheduler","category":"page"},{"location":"subjects/about/#Rocket.AsyncScheduler","page":"Subject","title":"Rocket.AsyncScheduler","text":"AsyncScheduler\n\nAsyncScheduler executes scheduled actions asynchronously and uses Channel object to order different actions on a single asynchronous task\n\n\n\n\n\n","category":"type"},{"location":"subjects/about/","page":"Subject","title":"Subject","text":"using Rocket\n\nsubject = Subject(Int, scheduler = AsyncScheduler())\n\nsubscription1 = subscribe!(subject, logger(\"Actor 1\"))\n\nprintln(\"Before next\")\nnext!(subject, 1)\nnext!(subject, 2)\nprintln(\"After next\")\n\nsubscription2 = subscribe!(subject, logger(\"Actor 2\"))\n\nnext!(subject, 3)\n\n# Logs\n# Before next\n# After next\n# [Actor 1] Data: 1\n# [Actor 1] Data: 2\n# [Actor 1] Data: 3\n# [Actor 2] Data: 3\n","category":"page"},{"location":"operators/filtering/find_index/#operator_find_index","page":"find_index","title":"Find Index operator","text":"","category":"section"},{"location":"operators/filtering/find_index/","page":"find_index","title":"find_index","text":"find_index","category":"page"},{"location":"operators/filtering/find_index/#Rocket.find_index","page":"find_index","title":"Rocket.find_index","text":"find_index(conditionFn::F) where { F <: Function }\n\nCreates a find operator, which emits only the index of the first value emitted by the source Observable that meets some condition. Indices are 1-based.\n\nProducing\n\nStream of type <: Subscribable{L} where L refers to type of source stream\n\nArguments\n\nconditionFn::F: condition function with (data::T) -> Bool signature\n\nExamples\n\nusing Rocket\n\nsource = from([ 0, 1, 2, 3, 4, 5, 6, 7, 8 ])\nsubscribe!(source |> find_index((d) -> d !== 0 && d % 2 == 0), logger())\n;\n\n# output\n\n[LogActor] Data: 3\n[LogActor] Completed\n\nSee also: find, AbstractOperator, InferableOperator, ProxyObservable, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/filtering/find_index/#Description","page":"find_index","title":"Description","text":"","category":"section"},{"location":"operators/filtering/find_index/","page":"find_index","title":"find_index","text":"It's like find, but emits the index of the found value, not the value itself.","category":"page"},{"location":"operators/filtering/find_index/#See-also","page":"find_index","title":"See also","text":"","category":"section"},{"location":"operators/filtering/find_index/","page":"find_index","title":"find_index","text":"Operators, take","category":"page"},{"location":"api/subjects/#subjects_api","page":"Subjects","title":"Subjects API","text":"","category":"section"},{"location":"api/subjects/#Traits","page":"Subjects","title":"Traits","text":"","category":"section"},{"location":"api/subjects/","page":"Subjects","title":"Subjects","text":"SubjectTrait\nas_subject \nValidSubjectTrait\nInvalidSubjectTrait\nAbstractSubject","category":"page"},{"location":"api/subjects/#Rocket.SubjectTrait","page":"Subjects","title":"Rocket.SubjectTrait","text":"Abstract type for all possible subject traits\n\nSee also: ValidSubjectTrait, InvalidSubjectTrait, as_subject\n\n\n\n\n\n","category":"type"},{"location":"api/subjects/#Rocket.as_subject","page":"Subjects","title":"Rocket.as_subject","text":"as_subject(::Type)\n\nThis function checks subject trait behavior specification. Should be used explicitly to specify subject trait behavior for any object type.\n\nSee also: SubjectTrait\n\n\n\n\n\n","category":"function"},{"location":"api/subjects/#Rocket.ValidSubjectTrait","page":"Subjects","title":"Rocket.ValidSubjectTrait","text":"Valid subject trait behavior\n\nSee also: SubjectTrait\n\n\n\n\n\n","category":"type"},{"location":"api/subjects/#Rocket.InvalidSubjectTrait","page":"Subjects","title":"Rocket.InvalidSubjectTrait","text":"Default subject trait behavior for all types.\n\nSee also: SubjectTrait\n\n\n\n\n\n","category":"type"},{"location":"api/subjects/#Rocket.AbstractSubject","page":"Subjects","title":"Rocket.AbstractSubject","text":"Supertype for Subject types. Automatically specifies ValidSubject, SimpleSubscribableTrait and BaseActorTrait traits.\n\nSee also: Subject, ValidSubjectTrait, SimpleSubscribableTrait, BaseActorTrait\n\n\n\n\n\n","category":"type"},{"location":"api/subjects/#Factory","page":"Subjects","title":"Factory","text":"","category":"section"},{"location":"api/subjects/","page":"Subjects","title":"Subjects","text":"AbstractSubjectFactory\ncreate_subject","category":"page"},{"location":"api/subjects/#Rocket.AbstractSubjectFactory","page":"Subjects","title":"Rocket.AbstractSubjectFactory","text":"Abstract type for all possible subject factories\n\nSee also: SubjectTrait, ValidSubjectTrait, InvalidSubjectTrait\n\n\n\n\n\n","category":"type"},{"location":"api/subjects/#Rocket.create_subject","page":"Subjects","title":"Rocket.create_subject","text":"create_subject(::Type{L}, factory::F) where L where { F <: AbstractSubjectFactory }\n\nActor creator function for a given factory F. Should be implemented explicitly for any AbstractActorFactory object\n\nSee also: AbstractSubjectFactory, MissingCreateActorFactoryImplementationError\n\n\n\n\n\n","category":"function"},{"location":"api/subjects/#Errors","page":"Subjects","title":"Errors","text":"","category":"section"},{"location":"api/subjects/","page":"Subjects","title":"Subjects","text":"InvalidSubjectTraitUsageError\nInconsistentSubjectDataTypesError","category":"page"},{"location":"api/subjects/#Rocket.InvalidSubjectTraitUsageError","page":"Subjects","title":"Rocket.InvalidSubjectTraitUsageError","text":"InvalidSubject usage error\n\nSee also: as_subject\n\n\n\n\n\n","category":"type"},{"location":"api/subjects/#Rocket.InconsistentSubjectDataTypesError","page":"Subjects","title":"Rocket.InconsistentSubjectDataTypesError","text":"InconsistentSubjectDataTypesError\n\nSee also: as_subject\n\n\n\n\n\n","category":"type"},{"location":"operators/transformation/lowercase/#operator_lowercase","page":"lowercase","title":"Lowercase Operator","text":"","category":"section"},{"location":"operators/transformation/lowercase/","page":"lowercase","title":"lowercase","text":"lowercase","category":"page"},{"location":"operators/transformation/lowercase/#Base.Unicode.lowercase","page":"lowercase","title":"Base.Unicode.lowercase","text":"lowercase()\n\nCreates an lowercase operator, which forces each value to be in lower case\n\nProducing\n\nStream of type <: Subscribable{L} where L referes to type of data of input Observable\n\nExamples\n\nusing Rocket\n\nsource = of(\"Hello, world!\")\nsubscribe!(source |> lowercase(), logger())\n;\n\n# output\n\n[LogActor] Data: hello, world!\n[LogActor] Completed\n\nSee also: AbstractOperator, InferableOperator, ProxyObservable, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/transformation/lowercase/#See-also","page":"lowercase","title":"See also","text":"","category":"section"},{"location":"operators/transformation/lowercase/","page":"lowercase","title":"lowercase","text":"Operators, map, uppercase","category":"page"},{"location":"operators/transformation/merge_map/#operator_merge_map","page":"merge_map","title":"MergeMap Operator","text":"","category":"section"},{"location":"operators/transformation/merge_map/","page":"merge_map","title":"merge_map","text":"merge_map","category":"page"},{"location":"operators/transformation/merge_map/#Rocket.merge_map","page":"merge_map","title":"Rocket.merge_map","text":"merge_map(::Type{R}, mappingFn::F = identity; concurrent::Int = typemax(Int)) where { R, F <: Function }\n\nCreates a merge_map operator, which returns an Observable that emits the result of applying the projection function mappingFn to each item emitted by the source Observable and merging the results of the Observables obtained from this transformation.\n\nArguments\n\n::Type{R}: the type of data of output Observables after projection with mappingFn\nmappingFn::F: projection function with (data) -> Observable{R} signature\nconcurrent::Int: optional, default is typemax(Int), maximum number of input Observables being subscribed to concurrently\n\nProducing\n\nStream of type <: Subscribable{R}\n\nExamples\n\nusing Rocket\n\nsource = from([ 0, 0 ]) |> merge_map(Int, d -> from([ 1, 2, 3 ], scheduler = AsyncScheduler(0)))\nsubscribe!(source, logger())\n;\n\n# output\n\n[LogActor] Data: 1\n[LogActor] Data: 1\n[LogActor] Data: 2\n[LogActor] Data: 2\n[LogActor] Data: 3\n[LogActor] Data: 3\n[LogActor] Completed\n\nSee also: AbstractOperator, RightTypedOperator, ProxyObservable, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/transformation/merge_map/#See-also","page":"merge_map","title":"See also","text":"","category":"section"},{"location":"operators/transformation/merge_map/","page":"merge_map","title":"merge_map","text":"Operators","category":"page"},{"location":"teardown/types/void/#teardown_void","page":"Void","title":"Void Teardown","text":"","category":"section"},{"location":"teardown/types/void/","page":"Void","title":"Void","text":"VoidTeardown\nvoidTeardown","category":"page"},{"location":"teardown/types/void/#Rocket.VoidTeardown","page":"Void","title":"Rocket.VoidTeardown","text":"VoidTeardown()\n\nVoidTeardown object does nothing on unsubscription. It is usefull for synchronous observables and observables which cannot be cancelled after execution.\n\nSee also: Teardown, VoidTeardownLogic\n\n\n\n\n\n","category":"type"},{"location":"teardown/types/void/#Rocket.voidTeardown","page":"Void","title":"Rocket.voidTeardown","text":"voidTeardown\n\nAn instance of VoidTeardown singleton object.\n\nSee also: VoidTeardown\n\n\n\n\n\n","category":"constant"},{"location":"operators/transformation/substitute/#operator_substitute","page":"substitute","title":"Substitute Operator","text":"","category":"section"},{"location":"operators/transformation/substitute/","page":"substitute","title":"substitute","text":"substitute\nSubstituteHandler","category":"page"},{"location":"operators/transformation/substitute/#Rocket.substitute","page":"substitute","title":"Rocket.substitute","text":"substitute(::Type{T}, mapFn::F, handler::SubstituteHandler) where { T, F <: Function }\n\nThis operator forces observable to substitute each emmited value with the latest computed value with the corresponding handler and release! function. After release! on handler substitute operator computes new value with mapFn but does not emit it until next emission from source observable. Always calls mapFn on first value from source observable.\n\nProducing\n\nStream of type <: Subscribable{T} \n\nExamples\n\nusing Rocket\n\nsubject = Subject(Int)\n\nhandler = SubstituteHandler()\nsource = subject |> substitute(String, i -> string(\"i = \", i), handler)\n\nsubscription = subscribe!(source, logger())\n\nnext!(subject, 1)\nnext!(subject, 2)\nnext!(subject, 3)\n\nrelease!(handler)\n\nnext!(subject, 4)\nnext!(subject, 5)\nnext!(subject, 6)\n\nunsubscribe!(subscription)\n;\n\n# output\n\n[LogActor] Data: i = 1\n[LogActor] Data: i = 1\n[LogActor] Data: i = 1\n[LogActor] Data: i = 3\n[LogActor] Data: i = 3\n[LogActor] Data: i = 3\n\nSee also: SubstituteHandler\n\n\n\n\n\n","category":"function"},{"location":"operators/transformation/substitute/#Rocket.SubstituteHandler","page":"substitute","title":"Rocket.SubstituteHandler","text":"SubstituteHandler()\n\nhandler used to release! new values in substitute operator.\n\nSee also: substitute\n\n\n\n\n\n","category":"type"},{"location":"operators/transformation/substitute/#See-also","page":"substitute","title":"See also","text":"","category":"section"},{"location":"operators/transformation/substitute/","page":"substitute","title":"substitute","text":"Operators","category":"page"},{"location":"operators/mathematical/about/#Mathematical-and-Aggregate-category","page":"About mathematical operators","title":"Mathematical and Aggregate category","text":"","category":"section"},{"location":"operators/mathematical/about/","page":"About mathematical operators","title":"About mathematical operators","text":"There are operators for different purposes, and they may be categorized as: creation, transformation, filtering, joining, multicasting, error handling, utility, etc. In the following list you will find all the operators organized in mathematical and aggregate category.","category":"page"},{"location":"operators/mathematical/about/","page":"About mathematical operators","title":"About mathematical operators","text":"count\nmax\nmin\nreduce\nsum","category":"page"},{"location":"operators/mathematical/about/#See-also","page":"About mathematical operators","title":"See also","text":"","category":"section"},{"location":"operators/mathematical/about/","page":"About mathematical operators","title":"About mathematical operators","text":"Operators","category":"page"},{"location":"operators/utility/async/#operator_ref_async","page":"async","title":"Async Operator","text":"","category":"section"},{"location":"operators/utility/async/","page":"async","title":"async","text":"async","category":"page"},{"location":"operators/utility/async/#Rocket.async","page":"async","title":"Rocket.async","text":"async(size::Int = typemax(Int))\n\nCreates an async operator, which sends items from the source Observable asynchronously.\n\nArguments\n\nsize: Asynchronous messages buffer size, default is a typemax(Int)\n\nProducing\n\nStream of type <: Subscribable{L} where L refers to type of source stream\n\nSee also: AbstractOperator, InferableOperator, ProxyObservable\n\n\n\n\n\n","category":"function"},{"location":"operators/utility/async/#See-also","page":"async","title":"See also","text":"","category":"section"},{"location":"operators/utility/async/","page":"async","title":"async","text":"Operators","category":"page"},{"location":"operators/transformation/enumerate/#operator_enumerate","page":"enumerate","title":"Enumerate Operator","text":"","category":"section"},{"location":"operators/transformation/enumerate/","page":"enumerate","title":"enumerate","text":"enumerate","category":"page"},{"location":"operators/transformation/enumerate/#Base.Iterators.enumerate","page":"enumerate","title":"Base.Iterators.enumerate","text":"enumerate()\n\nCreates an enumerate operator, which converts each value emitted by the source Observable into a tuple of its order number and the value itself.\n\nThe enumerate operator is similar to scan(Tuple{Int, Int}, (d, c) -> (d, c[2] + 1), (0, 0)) (see scan).\n\nProducing\n\nStream of type <: Subscribable{Tuple{Int, L}} where L refers to type of source stream\n\nExamples\n\nusing Rocket\n\nsource = from([ 0 for _ in 1:3 ])\nsubscribe!(source |> enumerate(), logger())\n;\n\n# output\n\n[LogActor] Data: (1, 0)\n[LogActor] Data: (2, 0)\n[LogActor] Data: (3, 0)\n[LogActor] Completed\n\n\nSee also: AbstractOperator, InferableOperator, ProxyObservable, scan, map, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/transformation/enumerate/#Description","page":"enumerate","title":"Description","text":"","category":"section"},{"location":"operators/transformation/enumerate/","page":"enumerate","title":"enumerate","text":"enumerate returns an Observable that converts each value emitted by the source Observable into a tuple of its order number and the value itself.","category":"page"},{"location":"operators/transformation/enumerate/#Example","page":"enumerate","title":"Example","text":"","category":"section"},{"location":"operators/transformation/enumerate/","page":"enumerate","title":"enumerate","text":"Get a value from the source with its order number","category":"page"},{"location":"operators/transformation/enumerate/","page":"enumerate","title":"enumerate","text":"using Rocket\n\nsource = from([ 0.0, 0.2, 0.4, 0.6, 0.8, 1.0 ])\nsubscribe!(source |> enumerate(), logger())\n\n# output\n\n[LogActor] Data: (0.0, 1)\n[LogActor] Data: (0.2, 2)\n[LogActor] Data: (0.4, 3)\n[LogActor] Data: (0.6, 4)\n[LogActor] Data: (0.8, 5)\n[LogActor] Data: (1.0, 6)\n[LogActor] Completed","category":"page"},{"location":"operators/transformation/enumerate/#See-also","page":"enumerate","title":"See also","text":"","category":"section"},{"location":"operators/transformation/enumerate/","page":"enumerate","title":"enumerate","text":"Operators, scan","category":"page"},{"location":"actors/types/sync/#actor_sync","page":"Sync","title":"Sync actor","text":"","category":"section"},{"location":"actors/types/sync/","page":"Sync","title":"Sync","text":"sync","category":"page"},{"location":"actors/types/sync/#Rocket.sync","page":"Sync","title":"Rocket.sync","text":"sync(actor::A; withlock::Bool = true, timeout::Int = -1) where A\nsync(factory::F; withlock::Bool = true, timeout::Int = -1) where { F <: AbstractActorFactory }\n\nCreation operator for the SyncActor actor. Accepts optional named timeout argument which specifies maximum number of milliseconds to wait (throws SyncActorTimedOutException() on timeout). Also accepts optional withlock boolean flag indicating that every next!, error! and complete! event should be guarded with ReentrantLock.\n\nExamples\n\nusing Rocket\n\nactor = keep(Int)\nsynced = sync(actor)\n\nsubscribe!(from(0:5, scheduler = AsyncScheduler()), synced)\n\nyield()\n\nwait(synced)\nshow(synced.actor.values)\n\n# output\n[0, 1, 2, 3, 4, 5]\n\nCan also be used with an <: AbstractActorFactory as an argument. In this case sync function will return a special actor factory object, which will store all created actors in array and wrap them with a sync function. wait(sync_factory) method will wait for all of the created actors to be completed in the order of creation (but only once for each of them).\n\nusing Rocket\n\nvalues = Int[]\n\nfactory = lambda(on_next = (d) -> push!(values, d))\nsynced = sync(factory)\n\nsubscribe!(from(0:5, scheduler = AsyncScheduler()), synced)\n\nyield()\n\nwait(synced)\nshow(values)\n\n# output\n[0, 1, 2, 3, 4, 5]\n\nSee also: SyncActor, AbstractActor\n\n\n\n\n\n","category":"function"},{"location":"actors/types/sync/","page":"Sync","title":"Sync","text":"SyncActor","category":"page"},{"location":"actors/types/sync/#Rocket.SyncActor","page":"Sync","title":"Rocket.SyncActor","text":"SyncActor{T, A}(actor::A; withlock::Bool = true, timeout::Int = -1) where { T, A }\n\nSync actor provides a synchronized interface to wait for an actor to be notified with a complete event. By default creates a re-entrant lock for synchronizing next!, error! and complete! events.\n\nSee also: Actor, sync\n\n\n\n\n\n","category":"type"},{"location":"operators/utility/limit_subscribers/#operator_limit_subscribers","page":"limit_subscribers","title":"LimitSubscribers Operator","text":"","category":"section"},{"location":"operators/utility/limit_subscribers/","page":"limit_subscribers","title":"limit_subscribers","text":"LimitSubscribersGuard\nlimit_subscribers","category":"page"},{"location":"operators/utility/limit_subscribers/#Rocket.LimitSubscribersGuard","page":"limit_subscribers","title":"Rocket.LimitSubscribersGuard","text":"LimitSubscribersGuard(limit::Int = 1, exclusive = true)\n\nGuard structure used in limit_subscribers operator.\n\nArguments\n\nlimit: number of concurrent subscribers\nexclusive: boolean flag, which indicates whenever this guard can be shared with other observables in other limit_subscribers operator. If set to true, reusing this guard in a different limit_subscribers operator for other observable will result in automatic unsubscription of all present actors.\n\nNote\n\nThis structure is useful in Pluto.jl notebooks in particular, allowing for automatic subscription/unsubscription of observables.\n\nExample\n\n\n# Cell 1\nguard = LimitSubscribersGuard()\n\n# Cell 2\nsubscription = subscribe!(some_stream |> limit_subscribers(guard), logger())\n\nSee also: limit_subscribers, subscribe!\n\n\n\n\n\n","category":"type"},{"location":"operators/utility/limit_subscribers/#Rocket.limit_subscribers","page":"limit_subscribers","title":"Rocket.limit_subscribers","text":"limit_subscribers(limit::Int = 1, exclusive::Bool = true)\nlimit_subscribers(guard::LimitSubscribersGuard)\n\nCreates an operator that limits number of concurrent actors to the given observable. On new subscription, if limit is exceeded, oldest actor is automatically unsubscribed and receives a completion event.\n\nArguments\n\nlimit: number of concurrent subscribers\nexclusive: boolean flag, which indicates whenever this guard can be shared with other observables in other limit_subscribers operator. If set to true, reusing this guard in a different limit_subscribers operator for other observable will result in automatic unsubscription of all present actors.\n\nNote\n\nThis structure is useful in Pluto.jl notebooks in particular, allowing for automatic subscription/unsubscription of observables.\n\nExample\n\n\n# Cell 1\nguard = LimitSubscribersGuard()\n\n# Cell 2\nsubscription = subscribe!(some_stream |> limit_subscribers(guard), logger())\n\nSee also: LimitSubscribersGuard\n\n\n\n\n\n","category":"function"},{"location":"operators/utility/limit_subscribers/#See-also","page":"limit_subscribers","title":"See also","text":"","category":"section"},{"location":"operators/utility/limit_subscribers/","page":"limit_subscribers","title":"limit_subscribers","text":"Operators","category":"page"},{"location":"operators/utility/skip_error/#operator_skip_error","page":"skip_error","title":"SkipError Operator","text":"","category":"section"},{"location":"operators/utility/skip_error/","page":"skip_error","title":"skip_error","text":"skip_error","category":"page"},{"location":"operators/utility/skip_error/#Rocket.skip_error","page":"skip_error","title":"Rocket.skip_error","text":"skip_error()\n\nCreates a skip_error operator, which filters out error event by the source Observable by emitting only next and complete messages.\n\nProducing\n\nStream of type <: Subscribable{L} where L refers to type of source stream\n\nExamples\n\nusing Rocket\n\nsource = faulted(\"error\")\nsubscribe!(source |> skip_error(), logger())\n;\n\n# output\n\n\nSee also: AbstractOperator, InferableOperator, ProxyObservable, skip_error, skip_complete, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/utility/skip_error/#See-also","page":"skip_error","title":"See also","text":"","category":"section"},{"location":"operators/utility/skip_error/","page":"skip_error","title":"skip_error","text":"Operators","category":"page"},{"location":"api/observables/#observables_api","page":"Observables","title":"Observables API","text":"","category":"section"},{"location":"api/observables/","page":"Observables","title":"Observables","text":"Any observable-like should implement a valid subscribable logic.","category":"page"},{"location":"api/observables/#Traits","page":"Observables","title":"Traits","text":"","category":"section"},{"location":"api/observables/","page":"Observables","title":"Observables","text":"as_subscribable\nSubscribableTrait\nSimpleSubscribableTrait\nScheduledSubscribableTrait\nInvalidSubscribableTrait","category":"page"},{"location":"api/observables/#Rocket.as_subscribable","page":"Observables","title":"Rocket.as_subscribable","text":"as_subscribable(any)\n\nThis function checks subscribable trait behavior specification. Can be used explicitly to specify subscribable trait behavior for any object.\n\nSee also: SubscribableTrait\n\n\n\n\n\n","category":"function"},{"location":"api/observables/#Rocket.SubscribableTrait","page":"Observables","title":"Rocket.SubscribableTrait","text":"Abstract type for all possible subscribable traits\n\nSee also: SimpleSubscribableTrait, ScheduledSubscribableTrait, InvalidSubscribableTrait\n\n\n\n\n\n","category":"type"},{"location":"api/observables/#Rocket.SimpleSubscribableTrait","page":"Observables","title":"Rocket.SimpleSubscribableTrait","text":"Simple subscribable trait behavior. Simple subscribable can be used in subscribe! function and just executes on_subscribe! method for provided subscribable. SimpleSubscribableTrait is a subtype of SubscribableTrait.\n\nSee also: SubscribableTrait, Subscribable, subscribe!, on_subscribe!\n\n\n\n\n\n","category":"type"},{"location":"api/observables/#Rocket.ScheduledSubscribableTrait","page":"Observables","title":"Rocket.ScheduledSubscribableTrait","text":"Scheduled subscribable trait behavior. Scheduled subscribable can be used in subscribe! function and executes on_subscribe! method for provided subscribable with custom scheduling. ScheduledSubscribableTrait is a subtype of SubscribableTrait.\n\nSee also: SubscribableTrait, ScheduledSubscribable, subscribe!, on_subscribe!\n\n\n\n\n\n","category":"type"},{"location":"api/observables/#Rocket.InvalidSubscribableTrait","page":"Observables","title":"Rocket.InvalidSubscribableTrait","text":"Default subscribable trait behavior for all types. Invalid subscribable cannot be used in subscribe! function, doing so will throw an error. InvalidSubscribableTrait is a subtype of SubscribableTrait.\n\nSee also: SubscribableTrait, subscribe!\n\n\n\n\n\n","category":"type"},{"location":"api/observables/#Types","page":"Observables","title":"Types","text":"","category":"section"},{"location":"api/observables/","page":"Observables","title":"Observables","text":"AbstractSubscribable\nSubscribable\nScheduledSubscribable\nsubscribe!\non_subscribe!","category":"page"},{"location":"api/observables/#Rocket.AbstractSubscribable","page":"Observables","title":"Rocket.AbstractSubscribable","text":"Supertype type for Subscribable and ScheduledSubscribable types.\n\nSee also: Subscribable, ScheduledSubscribable\n\n\n\n\n\n","category":"type"},{"location":"api/observables/#Rocket.Subscribable","page":"Observables","title":"Rocket.Subscribable","text":"Super type for any simple subscribable object. Automatically specifies a SimpleSubscribableTrait trait behavior. Objects with specified SimpleSubscribableTrait subscribable trait must implement: on_subscribe!(subscribable, actor) method. Subscribable is a subtype of AbstractSubscribable type.\n\nExamples\n\nusing Rocket\n\nstruct MySubscribable <: Subscribable{String} end\n\nRocket.as_subscribable(MySubscribable)\n\n# output\n\nSimpleSubscribableTrait{String}()\n\nSee also: SubscribableTrait, SimpleSubscribableTrait\n\n\n\n\n\n","category":"type"},{"location":"api/observables/#Rocket.ScheduledSubscribable","page":"Observables","title":"Rocket.ScheduledSubscribable","text":"Super type for any scheduled subscribable object. Automatically specifies a ScheduledSubscribableTrait trait behavior. Objects with specified ScheduledSubscribableTrait subscribable trait must implement: on_subscribe!(subscribable, actor, scheduler) method. ScheduledSubscribable is a subtype of AbstractSubscribable type.\n\nExamples\n\nusing Rocket\n\nstruct MyScheduledSubscribable <: ScheduledSubscribable{String} end\n\nRocket.as_subscribable(MyScheduledSubscribable)\n\n# output\n\nScheduledSubscribableTrait{String}()\n\nSee also: SubscribableTrait, ScheduledSubscribableTrait\n\n\n\n\n\n","category":"type"},{"location":"api/observables/#Rocket.subscribe!","page":"Observables","title":"Rocket.subscribe!","text":"subscribe!(subscribable::T, actor::S) where { T, S }\nsubscribe!(subscribable::T, factory::F) where { T, F <: AbstractActorFactory }\nsubscribe!(subscriptions::Tuple)\nsubscribe!(subscriptions::AbstractVector)\n\nsubscribe! function is used to attach an actor to subscribable. It also checks types of subscribable and actors to be a valid Subscribable and Actor objects respectively. Passing not valid subscribable or/and actor object will throw an error. If the input argument to the subscribe! function is either a tuple or a vector, it will first check that all of the arguments are valid source and actor objects and if its true will subscribe for each of them individually. \n\nArguments\n\nsubscribable: valid subscribable object\nactor: valid actor object\n\nExamples\n\nusing Rocket\n\nsource = from((1, 2, 3))\nsubscribe!(source, logger())\n;\n\n# output\n\n[LogActor] Data: 1\n[LogActor] Data: 2\n[LogActor] Data: 3\n[LogActor] Completed\n\nusing Rocket\n\nsource = from((1, 2, 3))\nsubscribe!(source, 1)\n;\n\n# output\n\nERROR: Type Int64 is not a valid actor type.\n[...]\n\nusing Rocket\n\nsource = from((1, 2, 3))\nsubscribe!(1, logger())\n;\n\n# output\n\nERROR: Type Int64 is not a valid subscribable type.\n[...]\n\nSee also: on_subscribe!, as_subscribable\n\n\n\n\n\n","category":"function"},{"location":"api/observables/#Rocket.on_subscribe!","page":"Observables","title":"Rocket.on_subscribe!","text":"on_subscribe!(subscribable, actor)\non_subscribe!(subscribable, actor, scheduler)\n\nEvery valid subscribable object have to define its own method for on_subscribe! function which specifies subscription logic and has return a valid Teardown object.\n\nObjects with specified SimpleSubscribableTrait subscribable trait must implement: on_subscribe!(subscribable, actor) method. Objects with specified ScheduledSubscribableTrait subscribable trait must implement: on_subscribe!(subscribable, actor, scheduler) method.\n\nArguments\n\nsubscribable: Subscribable object\nactor: Actor object\nscheduler: Scheduler object (only for scheduled subscribables)\n\nExamples\n\nusing Rocket\n\nstruct MySubscribable <: Subscribable{Int} end\n\nfunction Rocket.on_subscribe!(subscribable::MySubscribable, actor)\n next!(actor, 0)\n complete!(actor)\n return voidTeardown\nend\n\nsubscribe!(MySubscribable(), logger())\n;\n\n# output\n\n[LogActor] Data: 0\n[LogActor] Completed\n\nusing Rocket\n\nstruct MyScheduledSubscribable <: ScheduledSubscribable{Int} end\n\nRocket.getscheduler(::MyScheduledSubscribable) = AsapScheduler()\n\nfunction Rocket.on_subscribe!(subscribable::MyScheduledSubscribable, actor, scheduler)\n next!(actor, 0, scheduler)\n complete!(actor, scheduler)\n return voidTeardown\nend\n\nsubscribe!(MyScheduledSubscribable(), logger())\n;\n\n# output\n\n[LogActor] Data: 0\n[LogActor] Completed\n\nSee also: Subscribable, ScheduledSubscribable, SimpleSubscribableTrait, ScheduledSubscribableTrait, Teardown, logger\n\n\n\n\n\n","category":"function"},{"location":"api/observables/#Errors","page":"Observables","title":"Errors","text":"","category":"section"},{"location":"api/observables/","page":"Observables","title":"Observables","text":"InvalidSubscribableTraitUsageError\nInconsistentActorWithSubscribableDataTypesError\nMissingOnSubscribeImplementationError\nMissingOnScheduledSubscribeImplementationError","category":"page"},{"location":"api/observables/#Rocket.InvalidSubscribableTraitUsageError","page":"Observables","title":"Rocket.InvalidSubscribableTraitUsageError","text":"This error will be thrown if subscribe! function is called with invalid subscribable object\n\nSee also: subscribe!\n\n\n\n\n\n","category":"type"},{"location":"api/observables/#Rocket.InconsistentActorWithSubscribableDataTypesError","page":"Observables","title":"Rocket.InconsistentActorWithSubscribableDataTypesError","text":"This error will be thrown if subscribe! function is called with inconsistent subscribable and actor objects\n\nSee also: subscribe!\n\n\n\n\n\n","category":"type"},{"location":"api/observables/#Rocket.MissingOnSubscribeImplementationError","page":"Observables","title":"Rocket.MissingOnSubscribeImplementationError","text":"This error will be thrown if Julia cannot find specific method of 'on_subscribe!()' function for given subscribable and actor\n\nSee also: on_subscribe!\n\n\n\n\n\n","category":"type"},{"location":"api/observables/#Rocket.MissingOnScheduledSubscribeImplementationError","page":"Observables","title":"Rocket.MissingOnScheduledSubscribeImplementationError","text":"This error will be thrown if Julia cannot find specific method of 'on_subscribe!()' function for given subscribable, actor and scheduler\n\nSee also: on_subscribe!\n\n\n\n\n\n","category":"type"},{"location":"operators/mathematical/sum/#operator_sum","page":"sum","title":"Sum Operator","text":"","category":"section"},{"location":"operators/mathematical/sum/","page":"sum","title":"sum","text":"sum","category":"page"},{"location":"operators/mathematical/sum/#Base.sum","page":"sum","title":"Base.sum","text":"sum(; from = nothing)\n\nCreates a sum operator, which applies a sum accumulator function over the source Observable, and returns the accumulated result when the source completes, given an optional initial value.\n\nThe sum operator is similar to reduce(T, T, +) (see reduce).\n\nArguments\n\nfrom: optional initial accumulation value, if nothing first value will be used instead\n\nProducing\n\nStream of type <: Subscribable{L} where L refers to type of source stream\n\nExamples\n\nusing Rocket\n\nsource = from([ i for i in 1:42 ])\nsubscribe!(source |> sum(), logger())\n;\n\n# output\n\n[LogActor] Data: 903\n[LogActor] Completed\n\n\nusing Rocket\n\nsource = from([ i for i in 1:42 ])\nsubscribe!(source |> sum(from = 97), logger())\n;\n\n# output\n\n[LogActor] Data: 1000\n[LogActor] Completed\n\n\nSee also: AbstractOperator, InferableOperator, ProxyObservable, reduce, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/mathematical/sum/#Description","page":"sum","title":"Description","text":"","category":"section"},{"location":"operators/mathematical/sum/","page":"sum","title":"sum","text":"sum operates on an Observable of objects on which + is defined. When the source Observable completes, it emits the sum of all previous items. The sum operator is similar to reduce(T, T, +) (see reduce).","category":"page"},{"location":"operators/mathematical/sum/#See-also","page":"sum","title":"See also","text":"","category":"section"},{"location":"operators/mathematical/sum/","page":"sum","title":"sum","text":"Operators, reduce","category":"page"},{"location":"actors/types/void/#actor_void","page":"Void","title":"Void actor","text":"","category":"section"},{"location":"actors/types/void/","page":"Void","title":"Void","text":"void","category":"page"},{"location":"actors/types/void/#Rocket.void","page":"Void","title":"Rocket.void","text":"void()\nvoid(::Type{T}) where T\n\nCreation operator for the VoidActor actor.\n\nExamples\n\nusing Rocket\n\nactor = void(Int)\nactor isa VoidActor{Int}\n\n# output\ntrue\n\n\nSee also: VoidActor, AbstractActor\n\n\n\n\n\n","category":"function"},{"location":"actors/types/void/","page":"Void","title":"Void","text":"VoidActor","category":"page"},{"location":"actors/types/void/#Rocket.VoidActor","page":"Void","title":"Rocket.VoidActor","text":"VoidActor{D}() where D\n\nVoid actor does nothing with input data, error and complete events, can be useful for debugging (e.g. to start side-effects with tap operator)\n\nExamples\n\nusing Rocket\n\nsource = from([ 0, 1, 2 ])\nactor = VoidActor{Int}()\n\nsubscribe!(source, actor)\n;\n\n# output\n\n\nSee also: Actor, void, tap\n\n\n\n\n\n","category":"type"},{"location":"observables/types/proxy/#observable_proxy","page":"Proxy","title":"Proxy Observable","text":"","category":"section"},{"location":"observables/types/proxy/","page":"Proxy","title":"Proxy","text":"ProxyObservable might help to create a custom operator. It wraps either source and/or actor with their proxied versions providing additional custom logic for on_subscribe! and/or for on_next!, on_error!, on_complete! methods.","category":"page"},{"location":"observables/types/proxy/","page":"Proxy","title":"Proxy","text":"proxy\nProxyObservable","category":"page"},{"location":"observables/types/proxy/#Rocket.proxy","page":"Proxy","title":"Rocket.proxy","text":"proxy(::Type{L}, source, proxy) where L\n\nCreation operator for the ProxyObservable with a given source and proxy objects.\n\nExample\n\nusing Rocket\n\nsource = from(1:5)\n\nstruct MyCustomProxy <: ActorProxy end\n\nstruct MyCustomActor{A} <: Actor{Int}\n actor :: A\nend\n\nRocket.on_next!(actor::MyCustomActor, data::Int) = next!(actor.actor, data ^ 2)\nRocket.on_error!(actor::MyCustomActor, err) = error!(actor.actor, err)\nRocket.on_complete!(actor::MyCustomActor) = complete!(actor.actor)\n\nRocket.actor_proxy!(::Type{Int}, proxy::MyCustomProxy, actor::A) where A = MyCustomActor{A}(actor)\n\nproxied = proxy(Int, source, MyCustomProxy())\n\nsubscribe!(proxied, logger())\n;\n\n# output\n\n[LogActor] Data: 1\n[LogActor] Data: 4\n[LogActor] Data: 9\n[LogActor] Data: 16\n[LogActor] Data: 25\n[LogActor] Completed\n\nSee also: ProxyObservable, ActorProxy, SourceProxy, ActorSourceProxy\n\n\n\n\n\n","category":"function"},{"location":"observables/types/proxy/#Rocket.ProxyObservable","page":"Proxy","title":"Rocket.ProxyObservable","text":"ProxyObservable{L, S, P}(proxied_source::S, proxy::P)\n\nAn interface for proxied Observables.\n\nSee also: proxy\n\n\n\n\n\n","category":"type"},{"location":"observables/types/proxy/","page":"Proxy","title":"Proxy","text":"ActorProxy\nSourceProxy\nActorSourceProxy","category":"page"},{"location":"observables/types/proxy/#Rocket.ActorProxy","page":"Proxy","title":"Rocket.ActorProxy","text":"ActorProxy\n\nCan be used as a super type for common proxy object. Automatically specifies ValidActorProxy trait behavior. Each ActorProxy must implement its own method for actor_proxy!(::Type, proxy, actor) function which have to return a valid actor object.\n\nSee also: proxy, actor_proxy!\n\n\n\n\n\n","category":"type"},{"location":"observables/types/proxy/#Rocket.SourceProxy","page":"Proxy","title":"Rocket.SourceProxy","text":"SourceProxy\n\nCan be used as a super type for common proxy object. Automatically specifies ValidSourceProxy trait behavior. Each SourceProxy must implement its own method for source_proxy!(::Type, proxy, source) function which have to return a valid subscribable object.\n\nSee also: proxy, source_proxy!\n\n\n\n\n\n","category":"type"},{"location":"observables/types/proxy/#Rocket.ActorSourceProxy","page":"Proxy","title":"Rocket.ActorSourceProxy","text":"ActorSourceProxy\n\nCan be used as a super type for common proxy object. Automatically specifies ValidActorSourceProxy trait behavior. Each ActorSourceProxy must implement its own method for source_proxy!(::Type, proxy, source) function which have to return a valid subscribable object and also for actor_proxy!(::Type, proxy, actor) function which have to return a valid actor object..\n\nSee also: proxy, actor_proxy!, source_proxy!\n\n\n\n\n\n","category":"type"},{"location":"observables/types/proxy/","page":"Proxy","title":"Proxy","text":"actor_proxy!\nsource_proxy!","category":"page"},{"location":"observables/types/proxy/#Rocket.actor_proxy!","page":"Proxy","title":"Rocket.actor_proxy!","text":"actor_proxy!(::Type, proxy, actor)\n\nThis is function is used to wrap an actor with its proxied version given a particular proxy object. Must return another actor. Each valid ActorProxy and ActorSourceProxy must implement its own method for actor_proxy! function. The first argument is the same as the type of data of the connected proxy observable.\n\nSee also: proxy, ActorProxy, ActorSourceProxy\n\n\n\n\n\n","category":"function"},{"location":"observables/types/proxy/#Rocket.source_proxy!","page":"Proxy","title":"Rocket.source_proxy!","text":"source_proxy!(::Type, proxy, source)\n\nThis is function is used to wrap a source with its proxied version given a particular proxy object. Must return another Observable. Each valid SourceProxy and ActorSourceProxy must implement its own method for source_proxy! function. The first argument is the same as the type of data of the connected proxy observable.\n\nSee also: proxy, SourceProxy, ActorSourceProxy\n\n\n\n\n\n","category":"function"},{"location":"operators/transformation/to_array/#operator_to_array","page":"to_array","title":"Uppercase Operator","text":"","category":"section"},{"location":"operators/transformation/to_array/","page":"to_array","title":"to_array","text":"to_array","category":"page"},{"location":"operators/transformation/to_array/#Rocket.to_array","page":"to_array","title":"Rocket.to_array","text":"to_array()\n\nCreates a to_array operator, which reduces all values into a single array and returns this result when the source completes.\n\nProducing\n\nStream of type <: Subscribable{Vector{L}} where L refers to type of source stream\n\nExamples\n\nusing Rocket\n\nsource = from([ 1, 2, 3 ])\nsubscribe!(source |> to_array(), logger())\n;\n\n# output\n\n[LogActor] Data: [1, 2, 3]\n[LogActor] Completed\n\n\nSee also: AbstractOperator, InferableOperator, ProxyObservable, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/transformation/to_array/#See-also","page":"to_array","title":"See also","text":"","category":"section"},{"location":"operators/transformation/to_array/","page":"to_array","title":"to_array","text":"Operators, map, lowercase","category":"page"},{"location":"operators/transformation/about/#Transformation-category","page":"About transformation operators","title":"Transformation category","text":"","category":"section"},{"location":"operators/transformation/about/","page":"About transformation operators","title":"About transformation operators","text":"There are operators for different purposes, and they may be categorized as: creation, transformation, filtering, joining, multicasting, error handling, utility, etc. In the following list you will find all the operators organized in transformation category.","category":"page"},{"location":"operators/transformation/about/","page":"About transformation operators","title":"About transformation operators","text":"map\nmap_to\nscan\naccumulated\nenumerate\nuppercase\nlowercase\nto_array\nswitch_map\nswitch_map_to\nmerge_map\nconcat_map\nconcat_map_to\nexhaust_map\nstart_with\npairwise\nsubstitute\noverride","category":"page"},{"location":"operators/transformation/about/#See-also","page":"About transformation operators","title":"See also","text":"","category":"section"},{"location":"operators/transformation/about/","page":"About transformation operators","title":"About transformation operators","text":"Operators","category":"page"}] +} diff --git a/v1.7.3/siteinfo.js b/v1.7.3/siteinfo.js new file mode 100644 index 000000000..d2e991204 --- /dev/null +++ b/v1.7.3/siteinfo.js @@ -0,0 +1 @@ +var DOCUMENTER_CURRENT_VERSION = "v1.7.3"; diff --git a/v1.7.3/subjects/about/index.html b/v1.7.3/subjects/about/index.html new file mode 100644 index 000000000..ae1f8196f --- /dev/null +++ b/v1.7.3/subjects/about/index.html @@ -0,0 +1,86 @@ + +Subject · Rocket.jl

      About subjects

      A Rocket.jl Subject is a special type of Observable that allows values to be multicasted to many Actors. While plain Observables are unicast (each subscribed Actor owns an independent execution of the Observable), Subjects are multicast.

      Note

      A Subject is like an Observable, but can multicast to many Actors. Subjects are like event emitters: they maintain a registry of many listeners.

      Every Subject is an Observable. Given a Subject, you can subscribe to it, providing an Actor, which will start receiving values normally. From the perspective of the Actor, it cannot tell whether the Observable execution is coming from a plain unicast Observable or a Subject.

      Internally to the Subject, subscribe! does not invoke a new execution that delivers values. Instead, it simply registers the given Actor in a list of Actors.

      Every Subject is an Actor itself. It is an object with the methods next!, error!, and complete!. Call next!(subject, theValue) to feed a new value to the Subject, and it will be multicasted to the Actors that listen to the Subject.

      In the example below, we have two Observers attached to a Subject, and we feed some values to the Subject:

      using Rocket
      +
      +source = Subject(Int)
      +
      +subscription1 = subscribe!(source, lambda(
      +    on_next = (d) -> println("Actor 1: $d")
      +))
      +
      +subscription2 = subscribe!(source, lambda(
      +    on_next = (d) -> println("Actor 2: $d")
      +))
      +
      +next!(source, 0)
      +
      +# Logs
      +# Actor 1: 0
      +# Actor 2: 0
      +
      +unsubscribe!(subscription1)
      +unsubscribe!(subscription2)
      +

      Since a Subject is an actor, this also means you may provide a Subject as the argument to the subscribe of any Observable:

      using Rocket
      +
      +source = Subject(Int)
      +
      +subscription1 = subscribe!(source, lambda(
      +    on_next = (d) -> println("Actor 1: $d")
      +))
      +
      +subscription2 = subscribe!(source, lambda(
      +    on_next = (d) -> println("Actor 2: $d")
      +))
      +
      +other_source = from([ 1, 2, 3 ])
      +subscribe!(other_source, source);
      +
      +# Logs
      +# Actor 1: 1
      +# Actor 2: 1
      +# Actor 1: 2
      +# Actor 2: 2
      +# Actor 1: 3
      +# Actor 2: 3

      Here, we essentially convert a unicast Observable execution to multicast, through the Subject. This demonstrates how Subjects offer a unique way to share Observable execution with multiple Observers.

      Schedulers

      A Subject (and some other observables) uses scheduler objects to schedule message delivery to their listeners.

      Synchronous scheduler

      One of the variants of schedulers is the AsapScheduler, which delivers every message synchronously. AsapScheduler is a default scheduler for all Subject objects.

      Rocket.AsapSchedulerType
      AsapScheduler

      AsapScheduler executes scheduled actions as soon as possible and does not introduce any additional logic. AsapScheduler is a default scheduler for almost all observables.

      source
      using Rocket
      +
      +subject = Subject(Int, scheduler = AsapScheduler())
      +
      +subscription1 = subscribe!(subject, logger("Actor 1"))
      +
      +println("Before next")
      +next!(subject, 1)
      +next!(subject, 2)
      +println("After next")
      +
      +subscription2 = subscribe!(subject, logger("Actor 2"))
      +
      +next!(subject, 3)
      +
      +# Logs
      +# Before next
      +# [Actor 1] Data: 1
      +# [Actor 1] Data: 2
      +# After next
      +# [Actor 1] Data: 3
      +# [Actor 2] Data: 3

      Asynchronous Scheduler

      An AsyncScheduler is similar to a AsapScheduler. Both allows for Subject to scheduler their messages for multiple listeners, but a AsyncScheduler delivers all messages asynchronously (but still ordered) using a Julia's built-in Task object.

      Rocket.AsyncSchedulerType
      AsyncScheduler

      AsyncScheduler executes scheduled actions asynchronously and uses Channel object to order different actions on a single asynchronous task

      source
      using Rocket
      +
      +subject = Subject(Int, scheduler = AsyncScheduler())
      +
      +subscription1 = subscribe!(subject, logger("Actor 1"))
      +
      +println("Before next")
      +next!(subject, 1)
      +next!(subject, 2)
      +println("After next")
      +
      +subscription2 = subscribe!(subject, logger("Actor 2"))
      +
      +next!(subject, 3)
      +
      +# Logs
      +# Before next
      +# After next
      +# [Actor 1] Data: 1
      +# [Actor 1] Data: 2
      +# [Actor 1] Data: 3
      +# [Actor 2] Data: 3
      +
      diff --git a/v1.7.3/subjects/types/behavior/index.html b/v1.7.3/subjects/types/behavior/index.html new file mode 100644 index 000000000..5258e9be3 --- /dev/null +++ b/v1.7.3/subjects/types/behavior/index.html @@ -0,0 +1,28 @@ + +Behavior · Rocket.jl

      BehaviorSubject

      Rocket.BehaviorSubjectFunction
      BehaviorSubject(value::D) where D
      +BehaviorSubject(::Type{D}, value) where D
      +BehaviorSubject(::Type{D}, value, factory::F) where { D, F <: AbstractSubjectFactory }
      +BehaviorSubject(::Type{D}, value, subject::S) where { D, S }

      A variant of Subject that requires an initial value and emits its current value whenever it is subscribed to.

      See also: BehaviorSubjectFactory, Subject, SubjectFactory

      source

      Description

      One of the variants of Subjects is the BehaviorSubject, which has a notion of "the current value". It stores the latest value emitted to its consumers, and whenever a new Observer subscribes, it will immediately receive the "current value" from the BehaviorSubject.

      Note

      BehaviorSubjects are useful for representing "values over time". For instance, an event stream of birthdays is a Subject, but the stream of a person's age would be a BehaviorSubject.

      Examples

      In the following example, the BehaviorSubject is initialized with the value 0 which the first Observer receives when it subscribes. The second Observer receives the value 2 even though it subscribed after the value 2 was sent.

      using Rocket
      +
      +subject = BehaviorSubject(Int, 0)
      +
      +subscription1 = subscribe!(subject, logger("1"))
      +
      +next!(subject, 1)
      +next!(subject, 2)
      +
      +subscription2 = subscribe!(subject, logger("2"))
      +
      +next!(subject, 3)
      +
      +unsubscribe!(subscription1)
      +unsubscribe!(subscription2)
      +
      +// Logs
      +// [1] Data: 0
      +// [1] Data: 1
      +// [1] Data: 2
      +// [2] Data: 2
      +// [1] Data: 3
      +// [2] Data: 3
      diff --git a/v1.7.3/subjects/types/pending/index.html b/v1.7.3/subjects/types/pending/index.html new file mode 100644 index 000000000..bd1dc551d --- /dev/null +++ b/v1.7.3/subjects/types/pending/index.html @@ -0,0 +1,27 @@ + +Pending · Rocket.jl

      PendingSubject

      Rocket.PendingSubjectFunction
      PendingSubject(::Type{D}) where D
      +PendingSubject(::Type{D}, factory::F) where { D, F <: AbstractFactory }
      +PendingSubject(::Type{D}, subject::S) where { D, S }

      A variant of Subject that emits its last value on completion. Reemits last value on further subscriptions and then completes.

      See also: PendingSubjectFactory, Subject, SubjectFactory

      source

      Description

      A variant of Subject that only emits a value when it completes. It will emit its latest value to all its observers on completion. It will reemit its latest value to all new observers on further subscription and then complete. It is not possible to overwrite last value after completion.

      Examples

      using Rocket
      +
      +subject = PendingSubject(Int)
      +
      +subscription1 = subscribe!(subject, logger("1"))
      +
      +next!(subject, 1) # Nothing is logged
      +next!(subject, 2) # Nothing is logged
      +
      +subscription2 = subscribe!(subject, logger("2"))
      +
      +next!(subject, 3) # Nothing is logged
      +
      +complete!(subject)
      +
      +subscription3 = subscribe!(subject, logger("3"))
      +
      +[1] Data: 3
      +[2] Data: 3
      +[1] Completed
      +[2] Completed
      +[3] Data: 3
      +[3] Completed
      diff --git a/v1.7.3/subjects/types/recent/index.html b/v1.7.3/subjects/types/recent/index.html new file mode 100644 index 000000000..6ab1f922e --- /dev/null +++ b/v1.7.3/subjects/types/recent/index.html @@ -0,0 +1,26 @@ + +Recent · Rocket.jl

      RecentSubject

      Rocket.RecentSubjectFunction
      RecentSubject(::Type{D}) where D
      +RecentSubject(::Type{D}, factory::F) where { D, F <: AbstractSubjectFactory }
      +RecentSubject(::Type{D}, subject::S) where { D, S }

      A variant of Subject that emits its recent value whenever it is subscribed to.

      See also: RecentSubjectFactory, Subject, SubjectFactory

      source

      Description

      One of the variants of Subjects is the RecentSubject, which has a notion of "the recent value". It stores the latest value emitted to its consumers, and whenever a new Observer subscribes, it will immediately receive the "recent value" from the RecentSubject.

      Note

      RecentSubjects is a more efficient version of ReplaySubjects with replay size equal to one.

      Examples

      In the following example, after RecentSubject is initialized the first Observer receives nothing when it subscribes. The second Observer receives the value 2 even though it subscribed after the value 2 was sent.

      using Rocket
      +
      +subject = RecentSubject(Int)
      +
      +subscription1 = subscribe!(subject, logger("1"))
      +
      +next!(subject, 1)
      +next!(subject, 2)
      +
      +subscription2 = subscribe!(subject, logger("2"))
      +
      +next!(subject, 3)
      +
      +unsubscribe!(subscription1)
      +unsubscribe!(subscription2)
      +
      +// Logs
      +// [1] Data: 1
      +// [1] Data: 2
      +// [2] Data: 2
      +// [1] Data: 3
      +// [2] Data: 3
      diff --git a/v1.7.3/subjects/types/replay/index.html b/v1.7.3/subjects/types/replay/index.html new file mode 100644 index 000000000..b10c43148 --- /dev/null +++ b/v1.7.3/subjects/types/replay/index.html @@ -0,0 +1,32 @@ + +Replay · Rocket.jl

      ReplaySubject

      Rocket.ReplaySubjectFunction
      ReplaySubject(::Type{D}, size::Int) where D
      +ReplaySubject(::Type{D}, size::Int, factory::F) where { D, F <: AbstractSubjectFactory }
      +ReplaySubject(::Type{D}, size::Int, subject::S) where { D, S }

      A variant of Subject that "replays" or emits old values to new subscribers. It buffers a set number of values and will emit those values immediately to any new subscribers in addition to emitting new values to existing subscribers.

      See also: ReplaySubjectFactory, Subject, SubjectFactory

      source

      Description

      A ReplaySubject is similar to a BehaviorSubject in that it can send old values to new subscribers, but it can also record a part of the Observable execution.

      Note

      A ReplaySubject records multiple values from the Observable execution and replays them to new subscribers.

      Examples

      When creating a ReplaySubject, you can specify how many values to replay:

      using Rocket
      +
      +subject = ReplaySubject(Int, 3) # buffer 3 values for new subscribers
      +
      +subscription1 = subscribe!(subject, logger("1"))
      +
      +next!(subject, 1)
      +next!(subject, 2)
      +next!(subject, 3)
      +next!(subject, 4)
      +
      +subscription2 = subscribe!(subject, logger("2"))
      +
      +next!(subject, 5)
      +
      +unsubscribe!(subscription1)
      +unsubscribe!(subscription2)
      +
      +// Logs
      +// [1] Data: 1
      +// [1] Data: 2
      +// [1] Data: 3
      +// [1] Data: 4
      +// [2] Data: 2
      +// [2] Data: 3
      +// [2] Data: 4
      +// [1] Data: 5
      +// [2] Data: 5
      diff --git a/v1.7.3/subjects/types/subject/index.html b/v1.7.3/subjects/types/subject/index.html new file mode 100644 index 000000000..02f9a51e0 --- /dev/null +++ b/v1.7.3/subjects/types/subject/index.html @@ -0,0 +1,22 @@ + +Subject · Rocket.jl

      Subject

      Rocket.SubjectType
      Subject(::Type{D}; scheduler::H = AsapScheduler())

      A Subject is a special type of Observable that allows values to be multicasted to many Observers. Subjects are like EventEmitters. Every Subject is an Observable and an Actor. You can subscribe to a Subject, and you can call next! to feed values as well as error! and complete!.

      Note: By convention, every actor subscribed to a Subject observable is not allowed to throw exceptions during next!, error! and complete! calls. Doing so would lead to undefined behaviour. Use safe() operator to bypass this rule.

      See also: SubjectFactory, ReplaySubject, BehaviorSubject, safe

      source

      Description

      Every Subject is an Observable. Given a Subject, you can subscribe to it, providing an Actor, which will start receiving values normally. From the perspective of the Observer, it cannot tell whether the Observable execution is coming from a plain unicast Observable or a Subject.

      Internally to the Subject, subscribe does not invoke a new execution that delivers values. It simply registers the given Observer in a list of Observers.

      Every Subject is an Actor. It is an object with the methods next!, error!, and complete!. To feed a new value to the Subject, just call next!(subject, theValue), and it will be multicasted to the Actors registered to listen to the Subject.

      Note

      By convention, every actor subscribed to a Subject observable is not allowed to throw exceptions during next!, error! and complete! calls. Doing so would lead to undefined behaviour. Use safe() operator to bypass this rule.

      Examples

      In the following example, the BehaviorSubject is initialized with the value 0 which the first Observer receives when it subscribes. The second Observer receives the value 2 even though it subscribed after the value 2 was sent.

      using Rocket
      +
      +subject = Subject(Int)
      +
      +subscription1 = subscribe!(subject, logger("1"))
      +
      +next!(subject, 1)
      +next!(subject, 2)
      +
      +subscription2 = subscribe!(subject, logger("2"))
      +
      +next!(subject, 3)
      +
      +unsubscribe!(subscription1)
      +unsubscribe!(subscription2)
      +
      +// Logs
      +// [1] Data: 1
      +// [1] Data: 2
      +// [1] Data: 3
      +// [2] Data: 3
      diff --git a/v1.7.3/teardown/about/index.html b/v1.7.3/teardown/about/index.html new file mode 100644 index 000000000..e12676513 --- /dev/null +++ b/v1.7.3/teardown/about/index.html @@ -0,0 +1,24 @@ + +Subscription · Rocket.jl

      Subscription

      A Subscription represents a disposable resource, usually the execution of an Observable. A Subscription has one important method: unsubscribe!(teardown), which takes some teardown logic object as one argument and disposes the resource held by the subscription.

      using Rocket
      +
      +source = Subject(Int)
      +
      +next!(source, 0) # Logs nothing as there is no subscribers
      +
      +subscription = subscribe!(source, logger())
      +
      +next!(source, 1) # Logs [LogActor] Data: 1 into standard output
      +
      +unsubscribe!(subscription)
      +
      +next!(source, 2) # Logs nothing as a single one actor has unsubscribed
      Note

      A Subscription essentially just has its own specific method for unsubscribe!() function which releases resources or cancel Observable executions. Any Observable has to return a valid Teardown object.

      The unsubscribe! function also supports multiple unsubscriptions at once. If the input argument to the unsubscribe! function is either a tuple or a vector, it will first check that all of the arguments are valid subscription objects and if this is true it will unsubscribe from each of them individually.

      
      +source = Subject(Int)
      +
      +subscription1 = subscribe!(source, logger())
      +subscription2 = subscribe!(source, logger())
      +
      +unsubscribe!((subscription1, subscription2))
      +
      +# or similarly
      +# unsubscribe!([ subscription1, subscription2 ])
      +

      For more information about subscription and teardown logic see the API Section

      diff --git a/v1.7.3/teardown/types/void/index.html b/v1.7.3/teardown/types/void/index.html new file mode 100644 index 000000000..b9ae7ce5e --- /dev/null +++ b/v1.7.3/teardown/types/void/index.html @@ -0,0 +1,2 @@ + +Void · Rocket.jl
      diff --git a/v1.7.3/todo/index.html b/v1.7.3/todo/index.html new file mode 100644 index 000000000..6fbe3302a --- /dev/null +++ b/v1.7.3/todo/index.html @@ -0,0 +1,2 @@ + +TODO · Rocket.jl

      TODO

      This package in under development and some features of the reactive framework not yet implemented.

      diff --git a/v1.7.3/utils/index.html b/v1.7.3/utils/index.html new file mode 100644 index 000000000..80cebaf5a --- /dev/null +++ b/v1.7.3/utils/index.html @@ -0,0 +1,20 @@ + +Utils · Rocket.jl

      Utils

      Rocket.setTimeoutFunction
      setTimeout(f::Function, timeout::Int)

      Creates a Task which will asynchornously invoke fucntion f after specified timeout time in milliseconds.

      Arguments

      • f::Function, function to be invoked asynchronously
      • timeout::Int, timeout in milliseconds

      Examples

      using Rocket
      +using Dates
      +
      +println("Before: ", Dates.format(now(), "MM:SS"))
      +setTimeout(1000) do
      +    println("Inside: ", Dates.format(now(), "MM:SS"))
      +end
      +println("Right after: ", Dates.format(now(), "MM:SS"))
      +;
      +
      +# Logs
      +# Before: 20:59
      +# Right after: 20:59
      +# Inside: 21:00
      source
      Rocket.combined_typeFunction
      combined_type(sources)

      Returns a Tuple el-type of observable el-types in sources argument in the same order

      source
      Rocket.union_typeFunction
      union_type(sources)

      Returns a Union el-type of observable el-types in sources argument

      source

      Helpers

      Rocket.@MStorageMacro
      @MStorage(n::Int)

      Helper function to generate tuple-like structure MStorageN, but with mutable fields and empty constructor. It is possible then to take a snapshot(::MStorage) which returns a tuple with the same types and values from storage. Some operators and observables use pregenerated MStorage to instatiate uninitialized mutable storage in case when stream is allowed to not emit any values before completion.

      Generated structure layout

      struct MStorageN{V1, V2, ..., VN}
      +    v1 :: V1
      +    v2 :: V2
      +    ...
      +    vn :: VN
      +end

      See also: setstorage!

      source
      Rocket.setstorage!Function
      setstorage!(s, v, ::Val{I}) where I

      This function can be used to set a new value v for storage s with a given value v and index I. Using parametrized Val{I} for indexing ensures for index to be resolved at compile-time and if-else branch optimization.

      See also: @MStorage

      source
      diff --git a/v1.7.4/.documenter-siteinfo.json b/v1.7.4/.documenter-siteinfo.json new file mode 100644 index 000000000..5ca93df2f --- /dev/null +++ b/v1.7.4/.documenter-siteinfo.json @@ -0,0 +1 @@ +{"documenter":{"julia_version":"1.10.2","generation_timestamp":"2024-04-02T08:13:26","documenter_version":"1.3.0"}} \ No newline at end of file diff --git a/v1.7.4/actors/about/index.html b/v1.7.4/actors/about/index.html new file mode 100644 index 000000000..320dbeb1a --- /dev/null +++ b/v1.7.4/actors/about/index.html @@ -0,0 +1,72 @@ + +Actor · Rocket.jl

      Actors

      An Actor is the most primitive unit of computation: it receives a message and performs a computation.

      An actor is analogous to an object in an object-oriented languages. An object receives a message (a method call) and does something depending on which message it receives (the method we are calling). The main difference is that actors are completely isolated from each other, and they will never share memory. It’s also worth mentioning that an actor can maintain a private state that should never be changed directly by another actor.

      For a quick introduction to Actor models, see this article.

      The API of Rocket.jl's Actors is similar to RxJS subscribers.

      First example

      The following example implements an Actor that retains each received value from an Observable.

      using Rocket
      +
      +struct CustomKeepActor <: Actor{Int}
      +    values::Vector{Int}
      +
      +    CustomKeepActor() = new(Vector{Int}())
      +end
      +
      +Rocket.on_next!(actor::CustomKeepActor, data::Int) = push!(actor.values, data)
      +Rocket.on_error!(actor::CustomKeepActor, err)      = error(err)
      +Rocket.on_complete!(actor::CustomKeepActor)        = println("Completed!")
      +
      +source     = from([ 1, 2, 3 ])
      +keep_actor = CustomKeepActor()
      +subscribe!(source, keep_actor)
      +
      +# Logs
      +# Completed!
      +
      +println(keep_actor.values)
      +
      +# Logs
      +# [1, 2, 3]

      An actor may be not interested in the values itself, but merely the completion of an event. In this case, Rocket.jl provides a CompletionActor abstract type. See also NextActor and ErrorActor.

      using Rocket
      +
      +struct CompletionNotificationActor <: CompletionActor{Int} end
      +
      +Rocket.on_complete!(::CompletionNotificationActor) = println("Completed!")
      +
      +source = from([ 1, 2, 3 ])
      +subscribe!(source, CompletionNotificationActor());
      +
      +# Logs
      +# Completed

      It is also possible to use Julia's multiple dispatch feature and dispatch on type of the event

      using Rocket
      +
      +struct MyCustomActor <: NextActor{Any} end
      +
      +Rocket.on_next!(::MyCustomActor, data::Int)     = println("Int: $data")
      +Rocket.on_next!(::MyCustomActor, data::Float64) = println("Float64: $data")
      +Rocket.on_next!(::MyCustomActor, data)          = println("Something else: $data")
      +
      +source = from([ 1, 1.0, "string" ])
      +subscribe!(source, MyCustomActor());
      +
      +# Logs
      +# Int: 1
      +# Float64: 1.0
      +# Something else: string
      +

      Lambda actor

      For debugging purposes it may be convenient to work with a LambdaActor. This provides an interface that defines callbacks for "next", "error" and "complete" events. But this generic actor does not allow to dispatch on the type of the event.

      using Rocket
      +
      +source = from([1, 2, 3])
      +
      +subscribe!(source, lambda(
      +    on_next     = (d) -> println(d),
      +    on_error    = (e) -> error(e),
      +    on_complete = ()  -> println("Completed")
      +))
      +
      +# Logs
      +# 1
      +# 2
      +# 3
      +# Completed

      Function actor

      Sometimes it is convenient to pass only on_next callback. Rocket.jl provides a FunctionActor which automatically converts any function object passed in the subscribe! function to a proper actor which listens only for data events, throws an exception on error event and ignores completion message.

      using Rocket
      +
      +source = from([1, 2, 3])
      +
      +subscribe!(source, (d) -> println(d))
      +
      +# Logs
      +# 1
      +# 2
      +# 3
      diff --git a/v1.7.4/actors/types/buffer/index.html b/v1.7.4/actors/types/buffer/index.html new file mode 100644 index 000000000..fa1380b63 --- /dev/null +++ b/v1.7.4/actors/types/buffer/index.html @@ -0,0 +1,17 @@ + +Buffer · Rocket.jl

      Buffer actor

      Rocket.bufferFunction
      buffer(::Type{T}, size::Int) where T

      Arguments

      • ::Type{T}: Type of data in buffer
      • size::Int: size of buffer

      Creation operator for the BufferActor actor.

      Examples

      using Rocket
      +
      +actor = buffer(Int, 3)
      +actor isa BufferActor{Int}
      +
      +# output
      +true

      See also: BufferActor, AbstractActor

      source
      Rocket.BufferActorType
      BufferActor{D}() where D

      Buffer actor provides a storage actor. It copies last incoming successful next events in a values array, throws an ErrorException on error! event and does nothing on completion event. Note: Actor does not check the size of incoming data.

      Examples

      using Rocket
      +
      +source = of([ 1, 2, 3 ])
      +actor  = buffer(Int, 3)
      +
      +subscribe!(source, actor)
      +show(getvalues(actor))
      +
      +# output
      +[1, 2, 3]

      See also: Actor, buffer

      source
      diff --git a/v1.7.4/actors/types/circularkeep/index.html b/v1.7.4/actors/types/circularkeep/index.html new file mode 100644 index 000000000..3a991c041 --- /dev/null +++ b/v1.7.4/actors/types/circularkeep/index.html @@ -0,0 +1,17 @@ + +CircularKeep · Rocket.jl

      CircularKeep actor

      Rocket.circularkeepFunction
      circularkeep(::Type{T}, capacity::Int) where T

      Arguments

      • ::Type{T}: Type of keep data
      • capacity::Int: circular buffer capacity

      Creation operator for the CircularKeepActor actor.

      Examples

      using Rocket
      +
      +actor = circularkeep(Int, 3)
      +actor isa CircularKeepActor{Int}
      +
      +# output
      +true

      See also: CircularKeepActor, AbstractActor

      source
      Rocket.CircularKeepActorType
      CirucalKeepActor{D}() where D

      Circual keep actor is similar to keep actor, but uses CircularBuffer as a storage. It saves all incoming successful next events in a values circular buffer, throws an ErrorException on error! event and does nothing on completion event.

      Examples

      using Rocket
      +
      +source = from(1:5)
      +actor  = circularkeep(Int, 3)
      +
      +subscribe!(source, actor)
      +show(getvalues(actor))
      +
      +# output
      +[3, 4, 5]

      See also: Actor, keep, circularkeep

      source
      diff --git a/v1.7.4/actors/types/function/index.html b/v1.7.4/actors/types/function/index.html new file mode 100644 index 000000000..b17d081ba --- /dev/null +++ b/v1.7.4/actors/types/function/index.html @@ -0,0 +1,13 @@ + +Function · Rocket.jl

      Function actor

      Rocket.FunctionActorType
      FunctionActor{D} <: Actor{D}

      FunctionActor provides a simple interface to use a single function as a next! callback, error! callback throws an ErrorException and complete! callback does nothing. Should not be used explicitly because it will be created automatically when passing a Function object as an actor in subscribe! function.

      Examples

      using Rocket
      +
      +source = from(1:5)
      +subscribe!(source, (t) -> println(t))
      +;
      +
      +# output
      +1
      +2
      +3
      +4
      +5

      See also: Actor, subscribe!

      source
      diff --git a/v1.7.4/actors/types/keep/index.html b/v1.7.4/actors/types/keep/index.html new file mode 100644 index 000000000..9a166d887 --- /dev/null +++ b/v1.7.4/actors/types/keep/index.html @@ -0,0 +1,17 @@ + +Keep · Rocket.jl

      Keep actor

      Rocket.keepFunction
      keep(::Type{T}) where T

      Arguments

      • ::Type{T}: Type of keep data

      Creation operator for the KeepActor actor.

      Examples

      using Rocket
      +
      +actor = keep(Int)
      +actor isa KeepActor{Int}
      +
      +# output
      +true

      See also: KeepActor, AbstractActor

      source
      Rocket.KeepActorType
      KeepActor{D}() where D

      Keep actor provides a storage actor. It saves all incoming successful next events in a values array, throws an ErrorException on error! event and does nothing on completion event.

      Examples

      using Rocket
      +
      +source = from(1:5)
      +actor  = keep(Int)
      +
      +subscribe!(source, actor)
      +show(getvalues(actor))
      +
      +# output
      +[1, 2, 3, 4, 5]

      See also: Actor, keep

      source
      diff --git a/v1.7.4/actors/types/lambda/index.html b/v1.7.4/actors/types/lambda/index.html new file mode 100644 index 000000000..a0f617dd8 --- /dev/null +++ b/v1.7.4/actors/types/lambda/index.html @@ -0,0 +1,9 @@ + +Lambda · Rocket.jl

      Lambda actor

      Rocket.lambdaFunction
      lambda(; on_next = nothing, on_error = nothing, on_complete = nothing)
      +lambda(::Type{T}; on_next = nothing, on_error = nothing, on_complete = nothing) where T

      Creation operator for the 'LambdaActor' actor.

      Examples

      using Rocket
      +
      +actor = lambda(Int; on_next = (d) -> println(d))
      +actor isa LambdaActor{Int}
      +
      +# output
      +true

      See also: LambdaActor, AbstractActor

      source
      Rocket.LambdaActorType
      LambdaActor{D, N, E, C}(on_next::N, on_error::E, on_complete::C) where D

      Lambda actor wraps on_next, on_error, on_complete callbacks for data, error and complete events. Should not be used explicitly, use lambda creation operator instead.

      Constructor arguments

      • on_next: Callback for data event. Optional. Default is nothing.
      • on_error: Callback for error event. Optional. Default is nothing.
      • on_complete: Callback for complete event. Optional. Default is nothing.

      See also: Actor, lambda

      source
      diff --git a/v1.7.4/actors/types/logger/index.html b/v1.7.4/actors/types/logger/index.html new file mode 100644 index 000000000..08812c96c --- /dev/null +++ b/v1.7.4/actors/types/logger/index.html @@ -0,0 +1,39 @@ + +Logger · Rocket.jl

      Logger actor

      Rocket.loggerFunction
      logger([ io::IO ], name::String = "LogActor")
      +logger(::Type{T}, [ io::IO ], name::String = "LogActor") where T

      Creation operator for the LoggerActor actor.

      Examples

      using Rocket
      +
      +source = from([ 0, 1, 2 ])
      +subscribe!(source, logger())
      +;
      +
      +# output
      +
      +[LogActor] Data: 0
      +[LogActor] Data: 1
      +[LogActor] Data: 2
      +[LogActor] Completed
      using Rocket
      +
      +source = from([ 0, 1, 2 ])
      +subscribe!(source, logger("CustomName"))
      +;
      +
      +# output
      +
      +[CustomName] Data: 0
      +[CustomName] Data: 1
      +[CustomName] Data: 2
      +[CustomName] Completed
      using Rocket
      +
      +buffer = IOBuffer()
      +
      +source = from([ 0, 1, 2 ])
      +subscribe!(source, logger(buffer, "CustomBuffer"))
      +;
      +
      +print(String(take!(buffer)))
      +# output
      +
      +[CustomBuffer] Data: 0
      +[CustomBuffer] Data: 1
      +[CustomBuffer] Data: 2
      +[CustomBuffer] Completed

      See also: LoggerActor, AbstractActor

      source
      Rocket.LoggerActorType
      LoggerActor{D}(name::String = "LogActor", io::O) where { D, O }

      The LoggerActor logs all next!/error!/complete! events that are sent from an Observable.

      Constructor arguments

      • name: name of the logger. Optional. Default is LogActor.
      • io: io stream to log in, maybe nothing to write to stdout

      See also: Actor, logger

      source
      diff --git a/v1.7.4/actors/types/server/index.html b/v1.7.4/actors/types/server/index.html new file mode 100644 index 000000000..87dde55b7 --- /dev/null +++ b/v1.7.4/actors/types/server/index.html @@ -0,0 +1,5 @@ + +Server · Rocket.jl

      Server actor

      Rocket.serverFunction
      server(port::Int)
      +server(address::A, port::Int) where { A <: IPAddr }
      +server(::Type{D}, port::Int)
      +server(::Type{D}, address::A, port::Int) where { A <: IPAddr }

      Creation operator for the ServerActor actor.

      See also: AbstractActor

      source
      Rocket.ServerActorType
      ServerActor{D, Address, Port}() where D

      The ServerActor sends all next!/error!/complete! events to the local network listeners with specified Address and Port parameters via TCPSocket.

      See also: Actor, server

      source
      diff --git a/v1.7.4/actors/types/storage/index.html b/v1.7.4/actors/types/storage/index.html new file mode 100644 index 000000000..60a3ccb42 --- /dev/null +++ b/v1.7.4/actors/types/storage/index.html @@ -0,0 +1,17 @@ + +Storage · Rocket.jl

      Storage actor

      Rocket.storageFunction
      storage(::Type{T}) where T

      Arguments

      • ::Type{T}: Type of storage data

      Creation operator for the StorageActor actor.

      Examples

      using Rocket
      +
      +actor = storage(Int)
      +actor isa StorageActor{Int}
      +
      +# output
      +true

      See also: StorageActor, AbstractActor

      source
      Rocket.StorageActorType
      StorageActor{D}() where D

      Storage actor provides an actor that stores a single (last) value passed to the next! callback. It saves last incoming successful next event in the value field, throws an ErrorException on error! event and does nothing on completion event. Before any events value initialised with nothing.

      Examples

      using Rocket
      +
      +source = from(1:5)
      +actor  = storage(Int)
      +
      +subscribe!(source, actor)
      +show(getvalues(actor))
      +
      +# output
      +5

      See also: Actor, storage

      source
      diff --git a/v1.7.4/actors/types/sync/index.html b/v1.7.4/actors/types/sync/index.html new file mode 100644 index 000000000..97c87a578 --- /dev/null +++ b/v1.7.4/actors/types/sync/index.html @@ -0,0 +1,31 @@ + +Sync · Rocket.jl

      Sync actor

      Rocket.syncFunction
      sync(actor::A; withlock::Bool = true, timeout::Int = -1) where A
      +sync(factory::F; withlock::Bool = true, timeout::Int = -1) where { F <: AbstractActorFactory }

      Creation operator for the SyncActor actor. Accepts optional named timeout argument which specifies maximum number of milliseconds to wait (throws SyncActorTimedOutException() on timeout). Also accepts optional withlock boolean flag indicating that every next!, error! and complete! event should be guarded with ReentrantLock.

      Examples

      using Rocket
      +
      +actor  = keep(Int)
      +synced = sync(actor)
      +
      +subscribe!(from(0:5, scheduler = AsyncScheduler()), synced)
      +
      +yield()
      +
      +wait(synced)
      +show(synced.actor.values)
      +
      +# output
      +[0, 1, 2, 3, 4, 5]

      Can also be used with an <: AbstractActorFactory as an argument. In this case sync function will return a special actor factory object, which will store all created actors in array and wrap them with a sync function. wait(sync_factory) method will wait for all of the created actors to be completed in the order of creation (but only once for each of them).

      using Rocket
      +
      +values = Int[]
      +
      +factory  = lambda(on_next = (d) -> push!(values, d))
      +synced   = sync(factory)
      +
      +subscribe!(from(0:5, scheduler = AsyncScheduler()), synced)
      +
      +yield()
      +
      +wait(synced)
      +show(values)
      +
      +# output
      +[0, 1, 2, 3, 4, 5]

      See also: SyncActor, AbstractActor

      source
      Rocket.SyncActorType
      SyncActor{T, A}(actor::A; withlock::Bool = true, timeout::Int = -1) where { T, A }

      Sync actor provides a synchronized interface to wait for an actor to be notified with a complete event. By default creates a re-entrant lock for synchronizing next!, error! and complete! events.

      See also: Actor, sync

      source
      diff --git a/v1.7.4/actors/types/void/index.html b/v1.7.4/actors/types/void/index.html new file mode 100644 index 000000000..8dadd4813 --- /dev/null +++ b/v1.7.4/actors/types/void/index.html @@ -0,0 +1,19 @@ + +Void · Rocket.jl

      Void actor

      Rocket.voidFunction
      void()
      +void(::Type{T}) where T

      Creation operator for the VoidActor actor.

      Examples

      using Rocket
      +
      +actor = void(Int)
      +actor isa VoidActor{Int}
      +
      +# output
      +true
      +

      See also: VoidActor, AbstractActor

      source
      Rocket.VoidActorType
      VoidActor{D}() where D

      Void actor does nothing with input data, error and complete events, can be useful for debugging (e.g. to start side-effects with tap operator)

      Examples

      using Rocket
      +
      +source = from([ 0, 1, 2 ])
      +actor  = VoidActor{Int}()
      +
      +subscribe!(source, actor)
      +;
      +
      +# output
      +

      See also: Actor, void, tap

      source
      diff --git a/v1.7.4/api/actors/index.html b/v1.7.4/api/actors/index.html new file mode 100644 index 000000000..ca5a8f295 --- /dev/null +++ b/v1.7.4/api/actors/index.html @@ -0,0 +1,54 @@ + +Actors · Rocket.jl

      Actors API

      How to create a custom Actor

      At first custom actor should implement a custom method for the as_actor function. Rocket.jl also provides a number of helper actor abstract types with predefined as_actor method behavior (see Traits API section).

      using Rocket
      +
      +struct MyCustomActor end
      +
      +as_actor(::Type{<:MyCustomActor}) = Rocket.BaseActorTrait{Int}()
      +

      or

      using Rocket
      +
      +struct MyCustomActor <: Actor{Int} end # Automatically specifies BaseActorTrait{Int} behavior.

      Additionally custom actor must provide a custom methods for on_next!, on_error! and/or on_complete! functions. Depending on specified actor trait behavior some methods may or may not be optional.

      using Rocket
      +
      +struct MyCustomActor <: Actor{Int} end
      +
      +Rocket.on_next!(actor::MyCustomActor, data::Int)  = # custom logic here
      +Rocket.on_error!(actor::MyCustomActor, err)       = # custom logic here
      +Rocket.on_complete!(actor::MyCustomActor)         = # custom logic here

      or

      using Rocket
      +
      +struct MyCustomCompletionActor <: CompletionActor{Int} end
      +
      +Rocket.on_complete!(actor::MyCustomCompletionActor) = # custom logic here

      Traits

      Rocket.as_actorFunction
      as_actor(any)

      This function checks actor trait behavior specification. May be used explicitly to specify actor trait behavior for any object.

      See also: ActorTrait

      source
      Rocket.BaseActorTraitType

      Base actor trait specifies actor to listen for all next!, error! and complete! events. BaseActorTrait is a subtype of ActorTrait.

      See also: Actor

      source
      Rocket.InvalidActorTraitType

      Default actor trait behavior for any object. Actor with such a trait specificaion cannot be used as a valid actor in subscribe! function. Doing so will raise an error. InvalidActorTrait is a subtype of ActorTrait.

      See also: ActorTrait

      source

      Types

      Rocket.ActorType

      Can be used as a super type for common actor. Automatically specifies a BaseActorTrait trait behavior. Every Actor must implement its own methods for on_next!(actor, data), on_error!(actor, err) and on_complete!(actor) functions. Actor is a subtype of AbstractActor type.

      Examples

      using Rocket
      +
      +struct MyActor <: Actor{String} end
      +
      +Rocket.as_actor(MyActor)
      +
      +# output
      +
      +BaseActorTrait{String}()

      See also: AbstractActor, as_actor, BaseActorTrait, ActorTrait, on_next!, on_error!, on_complete!

      source
      Rocket.NextActorType

      Can be used as a super type for "next-only" actor. Automatically specifies a NextActorTrait trait behavior. Every NextActor must implement its own methods for on_next!(actor, data) function only. NextActor is a subtype of AbstractActor type.

      Examples

      using Rocket
      +
      +struct MyNextActor <: NextActor{String} end
      +
      +Rocket.as_actor(MyNextActor)
      +
      +# output
      +
      +NextActorTrait{String}()

      See also: AbstractActor, as_actor, NextActorTrait, ActorTrait, on_next!

      source
      Rocket.ErrorActorType

      Can be used as a super type for "error-only" actor. Automatically specifies a ErrorActorTrait trait behavior. Every ErrorActor must implement its own methods for on_error!(actor, err) function only. ErrorActor is a subtype of AbstractActor type.

      Examples

      using Rocket
      +
      +struct MyErrorActor <: ErrorActor{String} end
      +
      +Rocket.as_actor(MyErrorActor)
      +
      +# output
      +
      +ErrorActorTrait{String}()

      See also: AbstractActor, as_actor, ErrorActorTrait, ActorTrait, on_error!

      source
      Rocket.CompletionActorType

      Can be used as a super type for "completion-only" actor. Automatically specifies a CompletionActorTrait trait behavior. Every CompletionActor must implement its own methods for on_complete!(actor) function only. CompletionActor is a subtype of AbstractActor type.

      Examples

      using Rocket
      +
      +struct MyCompletionActor <: CompletionActor{String} end
      +
      +Rocket.as_actor(MyCompletionActor)
      +
      +# output
      +
      +CompletionActorTrait{String}()

      See also: AbstractActor, as_actor, CompletionActorTrait, ActorTrait, on_complete!

      source

      Events

      Rocket.next!Function
      next!(actor, data)
      +next!(actor, data, scheduler)

      This function is used to deliver a "next" event to an actor with some data. Takes optional scheduler object to schedule execution of data delivery.

      See also: AbstractActor, on_next!

      source
      Rocket.error!Function
      error!(actor, err)
      +error!(actor, err, scheduler)

      This function is used to deliver a "error" event to an actor with some err. Takes optional scheduler object to schedule execution of error delivery.

      See also: AbstractActor, on_error!

      source
      Rocket.complete!Function
      complete!(actor)
      +complete!(actor, scheduler)

      This function is used to deliver a "complete" event to an actor. Takes optional scheduler object to schedule execution of complete event delivery.

      See also: AbstractActor, on_complete!

      source
      Rocket.on_next!Function
      on_next!(actor, data)

      Both Actor and NextActor objects must implement its own method for on_next! function which will be called on "next" event.

      See also: Actor, NextActor

      source
      Rocket.on_error!Function
      on_error!(actor, err)

      Both Actor and ErrorActor objects must implement its own method for on_error! function which will be called on "error" event.

      See also: Actor, ErrorActor

      source
      Rocket.on_complete!Function
      on_complete!(actor)

      Both Actor and CompletionActor objects must implement its own method for on_complete! function which will be called on "complete" event.

      See also: Actor, CompletionActor

      source

      Factory

      Errors

      diff --git a/v1.7.4/api/observables/index.html b/v1.7.4/api/observables/index.html new file mode 100644 index 000000000..9d74fffe2 --- /dev/null +++ b/v1.7.4/api/observables/index.html @@ -0,0 +1,85 @@ + +Observables · Rocket.jl

      Observables API

      Any observable-like should implement a valid subscribable logic.

      Traits

      Rocket.as_subscribableFunction
      as_subscribable(any)

      This function checks subscribable trait behavior specification. Can be used explicitly to specify subscribable trait behavior for any object.

      See also: SubscribableTrait

      source

      Types

      Rocket.SubscribableType

      Super type for any simple subscribable object. Automatically specifies a SimpleSubscribableTrait trait behavior. Objects with specified SimpleSubscribableTrait subscribable trait must implement: on_subscribe!(subscribable, actor) method. Subscribable is a subtype of AbstractSubscribable type.

      Examples

      using Rocket
      +
      +struct MySubscribable <: Subscribable{String} end
      +
      +Rocket.as_subscribable(MySubscribable)
      +
      +# output
      +
      +SimpleSubscribableTrait{String}()

      See also: SubscribableTrait, SimpleSubscribableTrait

      source
      Rocket.ScheduledSubscribableType

      Super type for any scheduled subscribable object. Automatically specifies a ScheduledSubscribableTrait trait behavior. Objects with specified ScheduledSubscribableTrait subscribable trait must implement: on_subscribe!(subscribable, actor, scheduler) method. ScheduledSubscribable is a subtype of AbstractSubscribable type.

      Examples

      using Rocket
      +
      +struct MyScheduledSubscribable <: ScheduledSubscribable{String} end
      +
      +Rocket.as_subscribable(MyScheduledSubscribable)
      +
      +# output
      +
      +ScheduledSubscribableTrait{String}()

      See also: SubscribableTrait, ScheduledSubscribableTrait

      source
      Rocket.subscribe!Function
      subscribe!(subscribable::T, actor::S)   where { T, S }
      +subscribe!(subscribable::T, factory::F) where { T, F <: AbstractActorFactory }
      +subscribe!(subscriptions::Tuple)
      +subscribe!(subscriptions::AbstractVector)

      subscribe! function is used to attach an actor to subscribable. It also checks types of subscribable and actors to be a valid Subscribable and Actor objects respectively. Passing not valid subscribable or/and actor object will throw an error. If the input argument to the subscribe! function is either a tuple or a vector, it will first check that all of the arguments are valid source and actor objects and if its true will subscribe for each of them individually.

      Arguments

      • subscribable: valid subscribable object
      • actor: valid actor object

      Examples

      using Rocket
      +
      +source = from((1, 2, 3))
      +subscribe!(source, logger())
      +;
      +
      +# output
      +
      +[LogActor] Data: 1
      +[LogActor] Data: 2
      +[LogActor] Data: 3
      +[LogActor] Completed
      using Rocket
      +
      +source = from((1, 2, 3))
      +subscribe!(source, 1)
      +;
      +
      +# output
      +
      +ERROR: Type Int64 is not a valid actor type.
      +[...]
      using Rocket
      +
      +source = from((1, 2, 3))
      +subscribe!(1, logger())
      +;
      +
      +# output
      +
      +ERROR: Type Int64 is not a valid subscribable type.
      +[...]

      See also: on_subscribe!, as_subscribable

      source
      Rocket.on_subscribe!Function
      on_subscribe!(subscribable, actor)
      +on_subscribe!(subscribable, actor, scheduler)

      Every valid subscribable object have to define its own method for on_subscribe! function which specifies subscription logic and has return a valid Teardown object.

      Objects with specified SimpleSubscribableTrait subscribable trait must implement: on_subscribe!(subscribable, actor) method. Objects with specified ScheduledSubscribableTrait subscribable trait must implement: on_subscribe!(subscribable, actor, scheduler) method.

      Arguments

      • subscribable: Subscribable object
      • actor: Actor object
      • scheduler: Scheduler object (only for scheduled subscribables)

      Examples

      using Rocket
      +
      +struct MySubscribable <: Subscribable{Int} end
      +
      +function Rocket.on_subscribe!(subscribable::MySubscribable, actor)
      +    next!(actor, 0)
      +    complete!(actor)
      +    return voidTeardown
      +end
      +
      +subscribe!(MySubscribable(), logger())
      +;
      +
      +# output
      +
      +[LogActor] Data: 0
      +[LogActor] Completed
      using Rocket
      +
      +struct MyScheduledSubscribable <: ScheduledSubscribable{Int} end
      +
      +Rocket.getscheduler(::MyScheduledSubscribable) = AsapScheduler()
      +
      +function Rocket.on_subscribe!(subscribable::MyScheduledSubscribable, actor, scheduler)
      +    next!(actor, 0, scheduler)
      +    complete!(actor, scheduler)
      +    return voidTeardown
      +end
      +
      +subscribe!(MyScheduledSubscribable(), logger())
      +;
      +
      +# output
      +
      +[LogActor] Data: 0
      +[LogActor] Completed

      See also: Subscribable, ScheduledSubscribable, SimpleSubscribableTrait, ScheduledSubscribableTrait, Teardown, logger

      source

      Errors

      diff --git a/v1.7.4/api/operators/index.html b/v1.7.4/api/operators/index.html new file mode 100644 index 000000000..9f5e3ff3d --- /dev/null +++ b/v1.7.4/api/operators/index.html @@ -0,0 +1,211 @@ + +Operators · Rocket.jl

      Operators API

      How to create a custom operator

      If you need to write an operator that cannot be made from a combination of existing operators, then you can write a custom operator from scratch.

      Each operator (e.g. MyFancyOperator) needs to either be (1) a subtype of one of abstract OperatorTrait trait types, or (2) define a

      Rocket.as_operator(::Type{<:MyFancyOperator}) = TypedOperatorTrait{T, R}()
      +# or
      +Rocket.as_operator(::Type{<:MyFancyOperator}) = InferableOperatorTrait()

      trait behavior.

      In addition, an operator must implement a specific method for on_call! function with custom logic which has to return another Observable as a result of applying MyFancyOperator to a source.

      Rocket.on_call!(::Type{L}, ::Type{R}, operator::MyFancyOperator, source) where L = # some custom logic here
      +
      +# or
      +# for inferable trait types you have to specify 'right' type with Rocket.operator_right which should specify a type of data of produced Observable
      +
      +Rocket.on_call(::Type{L}, ::Type{R}, operator::MyFancyOperator, source) where L = # some custom logic here
      +Rocket.operator_right(::MyFancyOperator, ::Type{L}) where L = R # where R should be an actual type, Int or even L itself e.g.
      +
      Note

      It is not allowed to modify the source Observable in any way; you have to return a new observable.

      See more examples on custom operators in Traits API section

      Note

      It might be useful to return a ProxyObservable from an on_call! function. ProxyObservable is a special Observable which proxying actors with the source and/or source with actors.

      Traits

      Rocket.TypedOperatorTraitType

      Typed operator trait specifies operator to be statically typed with input and output data types. Typed operator with input type L and output type R can only operate on input Observable with data type L and will always produce an Observable with data type R.

      Examples

      using Rocket
      +
      +struct MyTypedOperator <: TypedOperator{Int, Int} end
      +
      +function Rocket.on_call!(::Type{Int}, ::Type{Int}, op::MyTypedOperator, source)
      +    return proxy(Int, source, MyTypedOperatorProxy())
      +end
      +
      +struct MyTypedOperatorProxy <: ActorProxy end
      +
      +Rocket.actor_proxy!(::Type{Int}, ::MyTypedOperatorProxy, actor::A) where A = MyTypedOperatorProxiedActor{A}(actor)
      +
      +struct MyTypedOperatorProxiedActor{A} <: Actor{Int}
      +    actor :: A
      +end
      +
      +function Rocket.on_next!(actor::MyTypedOperatorProxiedActor, data::Int)
      +    # Do something with a data and/or redirect it to actor.actor
      +    next!(actor.actor, data + 1)
      +end
      +
      +Rocket.on_error!(actor::MyTypedOperatorProxiedActor, err) = error!(actor.actor, err)
      +Rocket.on_complete!(actor::MyTypedOperatorProxiedActor)   = complete!(actor.actor)
      +
      +source = from([ 0, 1, 2 ])
      +subscribe!(source |> MyTypedOperator(), logger())
      +;
      +
      +# output
      +
      +[LogActor] Data: 1
      +[LogActor] Data: 2
      +[LogActor] Data: 3
      +[LogActor] Completed

      See also: OperatorTrait, TypedOperator, OperatorTrait, ProxyObservable, ActorProxy, logger

      source
      Rocket.LeftTypedOperatorTraitType

      Left typed operator trait specifies operator to be statically typed with input data type. To infer output data type this object should specify a special function operator_right(operator, ::Type{L}) where L which will be used to infer output data type. Left typed operator with input type L can only operate on input Observable with data type L and will always produce an Observable with data type inferred from operator_right(operator, ::Type{L}).

      Examples

      using Rocket
      +
      +struct CountIntegersOperator <: LeftTypedOperator{Int} end
      +
      +function Rocket.on_call!(::Type{Int}, ::Type{Tuple{Int, Int}}, op::CountIntegersOperator, source)
      +    return proxy(Tuple{Int, Int}, source, CountIntegersOperatorProxy())
      +end
      +
      +Rocket.operator_right(::CountIntegersOperator, ::Type{Int}) = Tuple{Int, Int}
      +
      +struct CountIntegersOperatorProxy <: ActorProxy end
      +
      +Rocket.actor_proxy!(::Type{Tuple{Int, Int}}, ::CountIntegersOperatorProxy, actor::A) where A = CountIntegersProxiedActor{A}(0, actor)
      +
      +mutable struct CountIntegersProxiedActor{A} <: Actor{Int}
      +    current :: Int
      +    actor   :: A
      +end
      +
      +function Rocket.on_next!(actor::CountIntegersProxiedActor, data::Int)
      +    current = actor.current
      +    actor.current += 1
      +    next!(actor.actor, (current, data)) # e.g.
      +end
      +
      +Rocket.on_error!(actor::CountIntegersProxiedActor, err) = error!(actor.actor, err)
      +Rocket.on_complete!(actor::CountIntegersProxiedActor)   = complete!(actor.actor)
      +
      +source = from([ 0, 0, 0 ])
      +subscribe!(source |> CountIntegersOperator(), logger())
      +;
      +
      +# output
      +
      +[LogActor] Data: (0, 0)
      +[LogActor] Data: (1, 0)
      +[LogActor] Data: (2, 0)
      +[LogActor] Completed

      See also: OperatorTrait, LeftTypedOperator, operator_right, OperatorTrait, ProxyObservable, ActorProxy, enumerate, logger

      source
      Rocket.RightTypedOperatorTraitType

      Right typed operator trait specifies operator to be statically typed with output data type. It can operate on input Observable with any data type L but will always produce an Observable with data type R.

      Examples

      using Rocket
      +
      +struct ConvertToFloatOperator <: RightTypedOperator{Float64} end
      +
      +function Rocket.on_call!(::Type{L}, ::Type{Float64}, op::ConvertToFloatOperator, source) where L
      +    return proxy(Float64, source, ConvertToFloatProxy{L}())
      +end
      +
      +struct ConvertToFloatProxy{L} <: ActorProxy end
      +
      +function Rocket.actor_proxy!(::Type{Float64}, proxy::ConvertToFloatProxy{L}, actor::A) where { L, A }
      +    return ConvertToFloatProxyActor{L, A}(actor)
      +end
      +
      +struct ConvertToFloatProxyActor{L, A} <: Actor{L}
      +    actor :: A
      +end
      +
      +function Rocket.on_next!(actor::ConvertToFloatProxyActor{L}, data::L) where L
      +    next!(actor.actor, convert(Float64, data)) # e.g.
      +end
      +
      +Rocket.on_error!(actor::ConvertToFloatProxyActor, err) = error!(actor.actor, err)
      +Rocket.on_complete!(actor::ConvertToFloatProxyActor)   = complete!(actor.actor)
      +
      +source = from([ 1, 2, 3 ])
      +subscribe!(source |> ConvertToFloatOperator(), logger())
      +;
      +
      +# output
      +
      +[LogActor] Data: 1.0
      +[LogActor] Data: 2.0
      +[LogActor] Data: 3.0
      +[LogActor] Completed

      See also: OperatorTrait, RightTypedOperator, OperatorTrait, ProxyObservable, ActorProxy, logger

      source
      Rocket.InferableOperatorTraitType

      Inferable operator trait specifies operator to be statically typed neither with input data type nor with output data type. To infer output data type this object should specify a special function operator_right(operator, ::Type{L}) where L where L is input data type which will be used to infer output data type.

      using Rocket
      +
      +struct IdentityOperator <: InferableOperator end
      +
      +function Rocket.on_call!(::Type{L}, ::Type{L}, op::IdentityOperator, source) where L
      +    return proxy(L, source, IdentityProxy())
      +end
      +
      +struct IdentityProxy <: ActorProxy end
      +
      +Rocket.operator_right(::IdentityOperator, ::Type{L}) where L = L
      +
      +Rocket.actor_proxy!(::Type{L}, proxy::IdentityProxy, actor::A) where L where A = IdentityProxyActor{L, A}(actor)
      +
      +struct IdentityProxyActor{L, A} <: Actor{L}
      +    actor :: A
      +end
      +
      +function Rocket.on_next!(actor::IdentityProxyActor{L}, data::L) where L
      +    next!(actor.actor, data) # e.g.
      +end
      +
      +Rocket.on_error!(actor::IdentityProxyActor, err) = error!(actor.actor, err)
      +Rocket.on_complete!(actor::IdentityProxyActor)   = complete!(actor.actor)
      +
      +source = from([ 1, 2, 3 ])
      +subscribe!(source |> IdentityOperator(), logger())
      +
      +source = from([ 1.0, 2.0, 3.0 ])
      +subscribe!(source |> IdentityOperator(), logger())
      +;
      +
      +# output
      +
      +[LogActor] Data: 1
      +[LogActor] Data: 2
      +[LogActor] Data: 3
      +[LogActor] Completed
      +[LogActor] Data: 1.0
      +[LogActor] Data: 2.0
      +[LogActor] Data: 3.0
      +[LogActor] Completed
      +

      See also: OperatorTrait, InferableOperator, operator_right, OperatorTrait, ProxyObservable, ActorProxy, logger

      source
      Rocket.InvalidOperatorTraitType

      InvalidOperatorTrait trait specifies special 'invalid' behavior and types with such a trait specification cannot be used as an operator for an observable stream. By default any type has InvalidOperatorTrait trait specification

      See also: OperatorTrait

      source

      Types

      Rocket.TypedOperatorType

      Can be used as a supertype for any operator. Automatically specifies TypedOperatorTrait behavior.

      Examples

      using Rocket
      +
      +struct MyOperator <: TypedOperator{Float64,String} end
      +
      +as_operator(MyOperator) === TypedOperatorTrait{Float64,String}()
      +
      +# output
      +true

      See also: AbstractOperator, TypedOperatorTrait

      source
      Rocket.RightTypedOperatorType

      Can be used as a supertype for any operator. Automatically specifies RightTypedOperatorTrait behavior.

      Examples

      using Rocket
      +
      +struct MyOperator <: RightTypedOperator{Float64} end
      +
      +as_operator(MyOperator) === RightTypedOperatorTrait{Float64}()
      +
      +# output
      +true

      See also: AbstractOperator, RightTypedOperatorTrait

      source
      Rocket.on_call!Function
      on_call!(::Type, ::Type, operator, source)

      Each operator must implement its own method for on_call! function. This function is used to invoke operator on some Observable and to produce another Observable with new logic (operator specific).

      See also: AbstractOperator

      source
      Rocket.OperatorsCompositionType
      OperatorsComposition(operators)

      OperatorsComposition is an object which helps to create a composition of multiple operators. To create a composition of two or more operators overloaded + or |> can be used.

      using Rocket
      +
      +composition = map(Int, (d) -> d ^ 2) + filter(d -> d % 2 == 0)
      +
      +source = from(1:5) |> composition
      +
      +subscribe!(source, logger())
      +;
      +
      +# output
      +
      +[LogActor] Data: 4
      +[LogActor] Data: 16
      +[LogActor] Completed
      using Rocket
      +
      +composition = map(Int, (d) -> d ^ 2) |> filter(d -> d % 2 == 0)
      +
      +source = from(1:5) |> composition
      +
      +subscribe!(source, logger())
      +;
      +
      +# output
      +
      +[LogActor] Data: 4
      +[LogActor] Data: 16
      +[LogActor] Completed
      source

      Errors

      diff --git a/v1.7.4/api/subjects/index.html b/v1.7.4/api/subjects/index.html new file mode 100644 index 000000000..e7f683964 --- /dev/null +++ b/v1.7.4/api/subjects/index.html @@ -0,0 +1,2 @@ + +Subjects · Rocket.jl

      Subjects API

      Traits

      Rocket.as_subjectFunction
      as_subject(::Type)

      This function checks subject trait behavior specification. Should be used explicitly to specify subject trait behavior for any object type.

      See also: SubjectTrait

      source

      Factory

      Errors

      diff --git a/v1.7.4/api/teardown/index.html b/v1.7.4/api/teardown/index.html new file mode 100644 index 000000000..509299f24 --- /dev/null +++ b/v1.7.4/api/teardown/index.html @@ -0,0 +1,27 @@ + +Teardown · Rocket.jl

      Teardown API

      Any subscription-like object should implement a valid teardown logic.

      Example

      using Rocket
      +
      +struct MuCustomSubscription <: Teardown
      +    # some fields here
      +end
      +
      +Rocket.as_teardown(::Type{<:MuCustomSubscription}) = UnsubscribableTeardownLogic()
      +
      +function on_unsubscribe!(subscription::MyCustomSubscription)
      +    # dispose resources here
      +end

      Traits

      Rocket.as_teardownFunction
      as_teardown(::Type)

      This function checks teardown trait behavior specification. Should be used explicitly to specify teardown logic trait behavior for any object.

      Examples

      using Rocket
      +
      +struct MySubscription <: Teardown end
      +
      +Rocket.as_teardown(::Type{<:MySubscription}) = UnsubscribableTeardownLogic()
      +Rocket.on_unsubscribe!(s::MySubscription)    = println("Unsubscribed!")
      +
      +subscription = MySubscription()
      +unsubscribe!(subscription)
      +;
      +
      +# output
      +
      +Unsubscribed!

      See also: Teardown, TeardownLogic

      source

      Types

      Rocket.unsubscribe!Function
      unsubscribe!(subscription)
      +unsubscribe!(subscriptions::Tuple)
      +unsubscribe!(subscriptions::AbstractVector)

      unsubscribe! function is used to cancel Observable execution and to dispose any kind of resources used during an Observable execution. If the input argument to the unsubscribe! function is either a tuple or a vector, it will first check that all of the arguments are valid subscription objects and if its true will unsubscribe from each of them individually.

      See also: Teardown, TeardownLogic, on_unsubscribe!

      source

      Errors

      diff --git a/v1.7.4/assets/documenter.js b/v1.7.4/assets/documenter.js new file mode 100644 index 000000000..c6562b558 --- /dev/null +++ b/v1.7.4/assets/documenter.js @@ -0,0 +1,1050 @@ +// Generated by Documenter.jl +requirejs.config({ + paths: { + 'highlight-julia': 'https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.8.0/languages/julia.min', + 'headroom': 'https://cdnjs.cloudflare.com/ajax/libs/headroom/0.12.0/headroom.min', + 'jqueryui': 'https://cdnjs.cloudflare.com/ajax/libs/jqueryui/1.13.2/jquery-ui.min', + 'katex-auto-render': 'https://cdnjs.cloudflare.com/ajax/libs/KaTeX/0.16.8/contrib/auto-render.min', + 'jquery': 'https://cdnjs.cloudflare.com/ajax/libs/jquery/3.7.0/jquery.min', + 'headroom-jquery': 'https://cdnjs.cloudflare.com/ajax/libs/headroom/0.12.0/jQuery.headroom.min', + 'katex': 'https://cdnjs.cloudflare.com/ajax/libs/KaTeX/0.16.8/katex.min', + 'highlight': 'https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.8.0/highlight.min', + 'highlight-julia-repl': 'https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.8.0/languages/julia-repl.min', + }, + shim: { + "highlight-julia": { + "deps": [ + "highlight" + ] + }, + "katex-auto-render": { + "deps": [ + "katex" + ] + }, + "headroom-jquery": { + "deps": [ + "jquery", + "headroom" + ] + }, + "highlight-julia-repl": { + "deps": [ + "highlight" + ] + } +} +}); +//////////////////////////////////////////////////////////////////////////////// +require(['jquery', 'katex', 'katex-auto-render'], function($, katex, renderMathInElement) { +$(document).ready(function() { + renderMathInElement( + document.body, + { + "delimiters": [ + { + "left": "$", + "right": "$", + "display": false + }, + { + "left": "$$", + "right": "$$", + "display": true + }, + { + "left": "\\[", + "right": "\\]", + "display": true + } + ] +} + + ); +}) + +}) +//////////////////////////////////////////////////////////////////////////////// +require(['jquery', 'highlight', 'highlight-julia', 'highlight-julia-repl'], function($) { +$(document).ready(function() { + hljs.highlightAll(); +}) + +}) +//////////////////////////////////////////////////////////////////////////////// +require(['jquery'], function($) { + +let timer = 0; +var isExpanded = true; + +$(document).on("click", ".docstring header", function () { + let articleToggleTitle = "Expand docstring"; + + debounce(() => { + if ($(this).siblings("section").is(":visible")) { + $(this) + .find(".docstring-article-toggle-button") + .removeClass("fa-chevron-down") + .addClass("fa-chevron-right"); + } else { + $(this) + .find(".docstring-article-toggle-button") + .removeClass("fa-chevron-right") + .addClass("fa-chevron-down"); + + articleToggleTitle = "Collapse docstring"; + } + + $(this) + .find(".docstring-article-toggle-button") + .prop("title", articleToggleTitle); + $(this).siblings("section").slideToggle(); + }); +}); + +$(document).on("click", ".docs-article-toggle-button", function (event) { + let articleToggleTitle = "Expand docstring"; + let navArticleToggleTitle = "Expand all docstrings"; + let animationSpeed = event.noToggleAnimation ? 0 : 400; + + debounce(() => { + if (isExpanded) { + $(this).removeClass("fa-chevron-up").addClass("fa-chevron-down"); + $(".docstring-article-toggle-button") + .removeClass("fa-chevron-down") + .addClass("fa-chevron-right"); + + isExpanded = false; + + $(".docstring section").slideUp(animationSpeed); + } else { + $(this).removeClass("fa-chevron-down").addClass("fa-chevron-up"); + $(".docstring-article-toggle-button") + .removeClass("fa-chevron-right") + .addClass("fa-chevron-down"); + + isExpanded = true; + articleToggleTitle = "Collapse docstring"; + navArticleToggleTitle = "Collapse all docstrings"; + + $(".docstring section").slideDown(animationSpeed); + } + + $(this).prop("title", navArticleToggleTitle); + $(".docstring-article-toggle-button").prop("title", articleToggleTitle); + }); +}); + +function debounce(callback, timeout = 300) { + if (Date.now() - timer > timeout) { + callback(); + } + + clearTimeout(timer); + + timer = Date.now(); +} + +}) +//////////////////////////////////////////////////////////////////////////////// +require([], function() { +function addCopyButtonCallbacks() { + for (const el of document.getElementsByTagName("pre")) { + const button = document.createElement("button"); + button.classList.add("copy-button", "fa-solid", "fa-copy"); + button.setAttribute("aria-label", "Copy this code block"); + button.setAttribute("title", "Copy"); + + el.appendChild(button); + + const success = function () { + button.classList.add("success", "fa-check"); + button.classList.remove("fa-copy"); + }; + + const failure = function () { + button.classList.add("error", "fa-xmark"); + button.classList.remove("fa-copy"); + }; + + button.addEventListener("click", function () { + copyToClipboard(el.innerText).then(success, failure); + + setTimeout(function () { + button.classList.add("fa-copy"); + button.classList.remove("success", "fa-check", "fa-xmark"); + }, 5000); + }); + } +} + +function copyToClipboard(text) { + // clipboard API is only available in secure contexts + if (window.navigator && window.navigator.clipboard) { + return window.navigator.clipboard.writeText(text); + } else { + return new Promise(function (resolve, reject) { + try { + const el = document.createElement("textarea"); + el.textContent = text; + el.style.position = "fixed"; + el.style.opacity = 0; + document.body.appendChild(el); + el.select(); + document.execCommand("copy"); + + resolve(); + } catch (err) { + reject(err); + } finally { + document.body.removeChild(el); + } + }); + } +} + +if (document.readyState === "loading") { + document.addEventListener("DOMContentLoaded", addCopyButtonCallbacks); +} else { + addCopyButtonCallbacks(); +} + +}) +//////////////////////////////////////////////////////////////////////////////// +require(['jquery', 'headroom', 'headroom-jquery'], function($, Headroom) { + +// Manages the top navigation bar (hides it when the user starts scrolling down on the +// mobile). +window.Headroom = Headroom; // work around buggy module loading? +$(document).ready(function () { + $("#documenter .docs-navbar").headroom({ + tolerance: { up: 10, down: 10 }, + }); +}); + +}) +//////////////////////////////////////////////////////////////////////////////// +require(['jquery'], function($) { + +$(document).ready(function () { + let meta = $("div[data-docstringscollapsed]").data(); + + if (meta?.docstringscollapsed) { + $("#documenter-article-toggle-button").trigger({ + type: "click", + noToggleAnimation: true, + }); + } +}); + +}) +//////////////////////////////////////////////////////////////////////////////// +require(['jquery'], function($) { + +/* +To get an in-depth about the thought process you can refer: https://hetarth02.hashnode.dev/series/gsoc + +PSEUDOCODE: + +Searching happens automatically as the user types or adjusts the selected filters. +To preserve responsiveness, as much as possible of the slow parts of the search are done +in a web worker. Searching and result generation are done in the worker, and filtering and +DOM updates are done in the main thread. The filters are in the main thread as they should +be very quick to apply. This lets filters be changed without re-searching with minisearch +(which is possible even if filtering is on the worker thread) and also lets filters be +changed _while_ the worker is searching and without message passing (neither of which are +possible if filtering is on the worker thread) + +SEARCH WORKER: + +Import minisearch + +Build index + +On message from main thread + run search + find the first 200 unique results from each category, and compute their divs for display + note that this is necessary and sufficient information for the main thread to find the + first 200 unique results from any given filter set + post results to main thread + +MAIN: + +Launch worker + +Declare nonconstant globals (worker_is_running, last_search_text, unfiltered_results) + +On text update + if worker is not running, launch_search() + +launch_search + set worker_is_running to true, set last_search_text to the search text + post the search query to worker + +on message from worker + if last_search_text is not the same as the text in the search field, + the latest search result is not reflective of the latest search query, so update again + launch_search() + otherwise + set worker_is_running to false + + regardless, display the new search results to the user + save the unfiltered_results as a global + update_search() + +on filter click + adjust the filter selection + update_search() + +update_search + apply search filters by looping through the unfiltered_results and finding the first 200 + unique results that match the filters + + Update the DOM +*/ + +/////// SEARCH WORKER /////// + +function worker_function(documenterSearchIndex, documenterBaseURL, filters) { + importScripts( + "https://cdn.jsdelivr.net/npm/minisearch@6.1.0/dist/umd/index.min.js" + ); + + let data = documenterSearchIndex.map((x, key) => { + x["id"] = key; // minisearch requires a unique for each object + return x; + }); + + // list below is the lunr 2.1.3 list minus the intersect with names(Base) + // (all, any, get, in, is, only, which) and (do, else, for, let, where, while, with) + // ideally we'd just filter the original list but it's not available as a variable + const stopWords = new Set([ + "a", + "able", + "about", + "across", + "after", + "almost", + "also", + "am", + "among", + "an", + "and", + "are", + "as", + "at", + "be", + "because", + "been", + "but", + "by", + "can", + "cannot", + "could", + "dear", + "did", + "does", + "either", + "ever", + "every", + "from", + "got", + "had", + "has", + "have", + "he", + "her", + "hers", + "him", + "his", + "how", + "however", + "i", + "if", + "into", + "it", + "its", + "just", + "least", + "like", + "likely", + "may", + "me", + "might", + "most", + "must", + "my", + "neither", + "no", + "nor", + "not", + "of", + "off", + "often", + "on", + "or", + "other", + "our", + "own", + "rather", + "said", + "say", + "says", + "she", + "should", + "since", + "so", + "some", + "than", + "that", + "the", + "their", + "them", + "then", + "there", + "these", + "they", + "this", + "tis", + "to", + "too", + "twas", + "us", + "wants", + "was", + "we", + "were", + "what", + "when", + "who", + "whom", + "why", + "will", + "would", + "yet", + "you", + "your", + ]); + + let index = new MiniSearch({ + fields: ["title", "text"], // fields to index for full-text search + storeFields: ["location", "title", "text", "category", "page"], // fields to return with results + processTerm: (term) => { + let word = stopWords.has(term) ? null : term; + if (word) { + // custom trimmer that doesn't strip @ and !, which are used in julia macro and function names + word = word + .replace(/^[^a-zA-Z0-9@!]+/, "") + .replace(/[^a-zA-Z0-9@!]+$/, ""); + + word = word.toLowerCase(); + } + + return word ?? null; + }, + // add . as a separator, because otherwise "title": "Documenter.Anchors.add!", would not + // find anything if searching for "add!", only for the entire qualification + tokenize: (string) => string.split(/[\s\-\.]+/), + // options which will be applied during the search + searchOptions: { + prefix: true, + boost: { title: 100 }, + fuzzy: 2, + }, + }); + + index.addAll(data); + + /** + * Used to map characters to HTML entities. + * Refer: https://github.com/lodash/lodash/blob/main/src/escape.ts + */ + const htmlEscapes = { + "&": "&", + "<": "<", + ">": ">", + '"': """, + "'": "'", + }; + + /** + * Used to match HTML entities and HTML characters. + * Refer: https://github.com/lodash/lodash/blob/main/src/escape.ts + */ + const reUnescapedHtml = /[&<>"']/g; + const reHasUnescapedHtml = RegExp(reUnescapedHtml.source); + + /** + * Escape function from lodash + * Refer: https://github.com/lodash/lodash/blob/main/src/escape.ts + */ + function escape(string) { + return string && reHasUnescapedHtml.test(string) + ? string.replace(reUnescapedHtml, (chr) => htmlEscapes[chr]) + : string || ""; + } + + /** + * Make the result component given a minisearch result data object and the value + * of the search input as queryString. To view the result object structure, refer: + * https://lucaong.github.io/minisearch/modules/_minisearch_.html#searchresult + * + * @param {object} result + * @param {string} querystring + * @returns string + */ + function make_search_result(result, querystring) { + let search_divider = `
      `; + let display_link = + result.location.slice(Math.max(0), Math.min(50, result.location.length)) + + (result.location.length > 30 ? "..." : ""); // To cut-off the link because it messes with the overflow of the whole div + + if (result.page !== "") { + display_link += ` (${result.page})`; + } + + let textindex = new RegExp(`${querystring}`, "i").exec(result.text); + let text = + textindex !== null + ? result.text.slice( + Math.max(textindex.index - 100, 0), + Math.min( + textindex.index + querystring.length + 100, + result.text.length + ) + ) + : ""; // cut-off text before and after from the match + + text = text.length ? escape(text) : ""; + + let display_result = text.length + ? "..." + + text.replace( + new RegExp(`${escape(querystring)}`, "i"), // For first occurrence + '$&' + ) + + "..." + : ""; // highlights the match + + let in_code = false; + if (!["page", "section"].includes(result.category.toLowerCase())) { + in_code = true; + } + + // We encode the full url to escape some special characters which can lead to broken links + let result_div = ` + +
      +
      ${escape(result.title)}
      +
      ${result.category}
      +
      +

      + ${display_result} +

      +
      + ${display_link} +
      +
      + ${search_divider} + `; + + return result_div; + } + + self.onmessage = function (e) { + let query = e.data; + let results = index.search(query, { + filter: (result) => { + // Only return relevant results + return result.score >= 1; + }, + }); + + // Pre-filter to deduplicate and limit to 200 per category to the extent + // possible without knowing what the filters are. + let filtered_results = []; + let counts = {}; + for (let filter of filters) { + counts[filter] = 0; + } + let present = {}; + + for (let result of results) { + cat = result.category; + cnt = counts[cat]; + if (cnt < 200) { + id = cat + "---" + result.location; + if (present[id]) { + continue; + } + present[id] = true; + filtered_results.push({ + location: result.location, + category: cat, + div: make_search_result(result, query), + }); + } + } + + postMessage(filtered_results); + }; +} + +// `worker = Threads.@spawn worker_function(documenterSearchIndex)`, but in JavaScript! +const filters = [ + ...new Set(documenterSearchIndex["docs"].map((x) => x.category)), +]; +const worker_str = + "(" + + worker_function.toString() + + ")(" + + JSON.stringify(documenterSearchIndex["docs"]) + + "," + + JSON.stringify(documenterBaseURL) + + "," + + JSON.stringify(filters) + + ")"; +const worker_blob = new Blob([worker_str], { type: "text/javascript" }); +const worker = new Worker(URL.createObjectURL(worker_blob)); + +/////// SEARCH MAIN /////// + +// Whether the worker is currently handling a search. This is a boolean +// as the worker only ever handles 1 or 0 searches at a time. +var worker_is_running = false; + +// The last search text that was sent to the worker. This is used to determine +// if the worker should be launched again when it reports back results. +var last_search_text = ""; + +// The results of the last search. This, in combination with the state of the filters +// in the DOM, is used compute the results to display on calls to update_search. +var unfiltered_results = []; + +// Which filter is currently selected +var selected_filter = ""; + +$(document).on("input", ".documenter-search-input", function (event) { + if (!worker_is_running) { + launch_search(); + } +}); + +function launch_search() { + worker_is_running = true; + last_search_text = $(".documenter-search-input").val(); + worker.postMessage(last_search_text); +} + +worker.onmessage = function (e) { + if (last_search_text !== $(".documenter-search-input").val()) { + launch_search(); + } else { + worker_is_running = false; + } + + unfiltered_results = e.data; + update_search(); +}; + +$(document).on("click", ".search-filter", function () { + if ($(this).hasClass("search-filter-selected")) { + selected_filter = ""; + } else { + selected_filter = $(this).text().toLowerCase(); + } + + // This updates search results and toggles classes for UI: + update_search(); +}); + +/** + * Make/Update the search component + */ +function update_search() { + let querystring = $(".documenter-search-input").val(); + + if (querystring.trim()) { + if (selected_filter == "") { + results = unfiltered_results; + } else { + results = unfiltered_results.filter((result) => { + return selected_filter == result.category.toLowerCase(); + }); + } + + let search_result_container = ``; + let modal_filters = make_modal_body_filters(); + let search_divider = `
      `; + + if (results.length) { + let links = []; + let count = 0; + let search_results = ""; + + for (var i = 0, n = results.length; i < n && count < 200; ++i) { + let result = results[i]; + if (result.location && !links.includes(result.location)) { + search_results += result.div; + count++; + links.push(result.location); + } + } + + if (count == 1) { + count_str = "1 result"; + } else if (count == 200) { + count_str = "200+ results"; + } else { + count_str = count + " results"; + } + let result_count = `
      ${count_str}
      `; + + search_result_container = ` +
      + ${modal_filters} + ${search_divider} + ${result_count} +
      + ${search_results} +
      +
      + `; + } else { + search_result_container = ` +
      + ${modal_filters} + ${search_divider} +
      0 result(s)
      +
      +
      No result found!
      + `; + } + + if ($(".search-modal-card-body").hasClass("is-justify-content-center")) { + $(".search-modal-card-body").removeClass("is-justify-content-center"); + } + + $(".search-modal-card-body").html(search_result_container); + } else { + if (!$(".search-modal-card-body").hasClass("is-justify-content-center")) { + $(".search-modal-card-body").addClass("is-justify-content-center"); + } + + $(".search-modal-card-body").html(` +
      Type something to get started!
      + `); + } +} + +/** + * Make the modal filter html + * + * @returns string + */ +function make_modal_body_filters() { + let str = filters + .map((val) => { + if (selected_filter == val.toLowerCase()) { + return `${val}`; + } else { + return `${val}`; + } + }) + .join(""); + + return ` +
      + Filters: + ${str} +
      `; +} + +}) +//////////////////////////////////////////////////////////////////////////////// +require(['jquery'], function($) { + +// Modal settings dialog +$(document).ready(function () { + var settings = $("#documenter-settings"); + $("#documenter-settings-button").click(function () { + settings.toggleClass("is-active"); + }); + // Close the dialog if X is clicked + $("#documenter-settings button.delete").click(function () { + settings.removeClass("is-active"); + }); + // Close dialog if ESC is pressed + $(document).keyup(function (e) { + if (e.keyCode == 27) settings.removeClass("is-active"); + }); +}); + +}) +//////////////////////////////////////////////////////////////////////////////// +require(['jquery'], function($) { + +$(document).ready(function () { + let search_modal_header = ` + + `; + + let initial_search_body = ` +
      Type something to get started!
      + `; + + let search_modal_footer = ` +
      + + Ctrl + + / to search + + esc to close +
      + `; + + $(document.body).append( + ` + + ` + ); + + document.querySelector(".docs-search-query").addEventListener("click", () => { + openModal(); + }); + + document + .querySelector(".close-search-modal") + .addEventListener("click", () => { + closeModal(); + }); + + $(document).on("click", ".search-result-link", function () { + closeModal(); + }); + + document.addEventListener("keydown", (event) => { + if ((event.ctrlKey || event.metaKey) && event.key === "/") { + openModal(); + } else if (event.key === "Escape") { + closeModal(); + } + + return false; + }); + + // Functions to open and close a modal + function openModal() { + let searchModal = document.querySelector("#search-modal"); + + searchModal.classList.add("is-active"); + document.querySelector(".documenter-search-input").focus(); + } + + function closeModal() { + let searchModal = document.querySelector("#search-modal"); + let initial_search_body = ` +
      Type something to get started!
      + `; + + searchModal.classList.remove("is-active"); + document.querySelector(".documenter-search-input").blur(); + + if (!$(".search-modal-card-body").hasClass("is-justify-content-center")) { + $(".search-modal-card-body").addClass("is-justify-content-center"); + } + + $(".documenter-search-input").val(""); + $(".search-modal-card-body").html(initial_search_body); + } + + document + .querySelector("#search-modal .modal-background") + .addEventListener("click", () => { + closeModal(); + }); +}); + +}) +//////////////////////////////////////////////////////////////////////////////// +require(['jquery'], function($) { + +// Manages the showing and hiding of the sidebar. +$(document).ready(function () { + var sidebar = $("#documenter > .docs-sidebar"); + var sidebar_button = $("#documenter-sidebar-button"); + sidebar_button.click(function (ev) { + ev.preventDefault(); + sidebar.toggleClass("visible"); + if (sidebar.hasClass("visible")) { + // Makes sure that the current menu item is visible in the sidebar. + $("#documenter .docs-menu a.is-active").focus(); + } + }); + $("#documenter > .docs-main").bind("click", function (ev) { + if ($(ev.target).is(sidebar_button)) { + return; + } + if (sidebar.hasClass("visible")) { + sidebar.removeClass("visible"); + } + }); +}); + +// Resizes the package name / sitename in the sidebar if it is too wide. +// Inspired by: https://github.com/davatron5000/FitText.js +$(document).ready(function () { + e = $("#documenter .docs-autofit"); + function resize() { + var L = parseInt(e.css("max-width"), 10); + var L0 = e.width(); + if (L0 > L) { + var h0 = parseInt(e.css("font-size"), 10); + e.css("font-size", (L * h0) / L0); + // TODO: make sure it survives resizes? + } + } + // call once and then register events + resize(); + $(window).resize(resize); + $(window).on("orientationchange", resize); +}); + +// Scroll the navigation bar to the currently selected menu item +$(document).ready(function () { + var sidebar = $("#documenter .docs-menu").get(0); + var active = $("#documenter .docs-menu .is-active").get(0); + if (typeof active !== "undefined") { + sidebar.scrollTop = active.offsetTop - sidebar.offsetTop - 15; + } +}); + +}) +//////////////////////////////////////////////////////////////////////////////// +require(['jquery'], function($) { + +// Theme picker setup +$(document).ready(function () { + // onchange callback + $("#documenter-themepicker").change(function themepick_callback(ev) { + var themename = $("#documenter-themepicker option:selected").attr("value"); + if (themename === "auto") { + // set_theme(window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light'); + window.localStorage.removeItem("documenter-theme"); + } else { + // set_theme(themename); + window.localStorage.setItem("documenter-theme", themename); + } + // We re-use the global function from themeswap.js to actually do the swapping. + set_theme_from_local_storage(); + }); + + // Make sure that the themepicker displays the correct theme when the theme is retrieved + // from localStorage + if (typeof window.localStorage !== "undefined") { + var theme = window.localStorage.getItem("documenter-theme"); + if (theme !== null) { + $("#documenter-themepicker option").each(function (i, e) { + e.selected = e.value === theme; + }); + } + } +}); + +}) +//////////////////////////////////////////////////////////////////////////////// +require(['jquery'], function($) { + +// update the version selector with info from the siteinfo.js and ../versions.js files +$(document).ready(function () { + // If the version selector is disabled with DOCUMENTER_VERSION_SELECTOR_DISABLED in the + // siteinfo.js file, we just return immediately and not display the version selector. + if ( + typeof DOCUMENTER_VERSION_SELECTOR_DISABLED === "boolean" && + DOCUMENTER_VERSION_SELECTOR_DISABLED + ) { + return; + } + + var version_selector = $("#documenter .docs-version-selector"); + var version_selector_select = $("#documenter .docs-version-selector select"); + + version_selector_select.change(function (x) { + target_href = version_selector_select + .children("option:selected") + .get(0).value; + window.location.href = target_href; + }); + + // add the current version to the selector based on siteinfo.js, but only if the selector is empty + if ( + typeof DOCUMENTER_CURRENT_VERSION !== "undefined" && + $("#version-selector > option").length == 0 + ) { + var option = $( + "" + ); + version_selector_select.append(option); + } + + if (typeof DOC_VERSIONS !== "undefined") { + var existing_versions = version_selector_select.children("option"); + var existing_versions_texts = existing_versions.map(function (i, x) { + return x.text; + }); + DOC_VERSIONS.forEach(function (each) { + var version_url = documenterBaseURL + "/../" + each + "/"; + var existing_id = $.inArray(each, existing_versions_texts); + // if not already in the version selector, add it as a new option, + // otherwise update the old option with the URL and enable it + if (existing_id == -1) { + var option = $( + "" + ); + version_selector_select.append(option); + } else { + var option = existing_versions[existing_id]; + option.value = version_url; + option.disabled = false; + } + }); + } + + // only show the version selector if the selector has been populated + if (version_selector_select.children("option").length > 0) { + version_selector.toggleClass("visible"); + } +}); + +}) diff --git a/v1.7.4/assets/themes/documenter-dark.css b/v1.7.4/assets/themes/documenter-dark.css new file mode 100644 index 000000000..53889fb99 --- /dev/null +++ b/v1.7.4/assets/themes/documenter-dark.css @@ -0,0 +1,7 @@ +html.theme--documenter-dark .pagination-previous,html.theme--documenter-dark .pagination-next,html.theme--documenter-dark .pagination-link,html.theme--documenter-dark .pagination-ellipsis,html.theme--documenter-dark .file-cta,html.theme--documenter-dark .file-name,html.theme--documenter-dark .select select,html.theme--documenter-dark .textarea,html.theme--documenter-dark .input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input,html.theme--documenter-dark .button{-moz-appearance:none;-webkit-appearance:none;align-items:center;border:1px solid transparent;border-radius:.4em;box-shadow:none;display:inline-flex;font-size:1rem;height:2.5em;justify-content:flex-start;line-height:1.5;padding-bottom:calc(0.5em - 1px);padding-left:calc(0.75em - 1px);padding-right:calc(0.75em - 1px);padding-top:calc(0.5em - 1px);position:relative;vertical-align:top}html.theme--documenter-dark .pagination-previous:focus,html.theme--documenter-dark .pagination-next:focus,html.theme--documenter-dark .pagination-link:focus,html.theme--documenter-dark .pagination-ellipsis:focus,html.theme--documenter-dark .file-cta:focus,html.theme--documenter-dark .file-name:focus,html.theme--documenter-dark .select select:focus,html.theme--documenter-dark .textarea:focus,html.theme--documenter-dark .input:focus,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input:focus,html.theme--documenter-dark .button:focus,html.theme--documenter-dark .is-focused.pagination-previous,html.theme--documenter-dark .is-focused.pagination-next,html.theme--documenter-dark .is-focused.pagination-link,html.theme--documenter-dark .is-focused.pagination-ellipsis,html.theme--documenter-dark .is-focused.file-cta,html.theme--documenter-dark .is-focused.file-name,html.theme--documenter-dark .select select.is-focused,html.theme--documenter-dark .is-focused.textarea,html.theme--documenter-dark .is-focused.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-focused,html.theme--documenter-dark .is-focused.button,html.theme--documenter-dark .pagination-previous:active,html.theme--documenter-dark .pagination-next:active,html.theme--documenter-dark .pagination-link:active,html.theme--documenter-dark .pagination-ellipsis:active,html.theme--documenter-dark .file-cta:active,html.theme--documenter-dark .file-name:active,html.theme--documenter-dark .select select:active,html.theme--documenter-dark .textarea:active,html.theme--documenter-dark .input:active,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input:active,html.theme--documenter-dark .button:active,html.theme--documenter-dark .is-active.pagination-previous,html.theme--documenter-dark .is-active.pagination-next,html.theme--documenter-dark .is-active.pagination-link,html.theme--documenter-dark .is-active.pagination-ellipsis,html.theme--documenter-dark .is-active.file-cta,html.theme--documenter-dark .is-active.file-name,html.theme--documenter-dark .select select.is-active,html.theme--documenter-dark .is-active.textarea,html.theme--documenter-dark .is-active.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-active,html.theme--documenter-dark .is-active.button{outline:none}html.theme--documenter-dark .pagination-previous[disabled],html.theme--documenter-dark .pagination-next[disabled],html.theme--documenter-dark .pagination-link[disabled],html.theme--documenter-dark .pagination-ellipsis[disabled],html.theme--documenter-dark .file-cta[disabled],html.theme--documenter-dark .file-name[disabled],html.theme--documenter-dark .select select[disabled],html.theme--documenter-dark .textarea[disabled],html.theme--documenter-dark .input[disabled],html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input[disabled],html.theme--documenter-dark .button[disabled],fieldset[disabled] html.theme--documenter-dark .pagination-previous,html.theme--documenter-dark fieldset[disabled] .pagination-previous,fieldset[disabled] html.theme--documenter-dark .pagination-next,html.theme--documenter-dark fieldset[disabled] .pagination-next,fieldset[disabled] html.theme--documenter-dark .pagination-link,html.theme--documenter-dark fieldset[disabled] .pagination-link,fieldset[disabled] html.theme--documenter-dark .pagination-ellipsis,html.theme--documenter-dark fieldset[disabled] .pagination-ellipsis,fieldset[disabled] html.theme--documenter-dark .file-cta,html.theme--documenter-dark fieldset[disabled] .file-cta,fieldset[disabled] html.theme--documenter-dark .file-name,html.theme--documenter-dark fieldset[disabled] .file-name,fieldset[disabled] html.theme--documenter-dark .select select,fieldset[disabled] html.theme--documenter-dark .textarea,fieldset[disabled] html.theme--documenter-dark .input,fieldset[disabled] html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input,html.theme--documenter-dark fieldset[disabled] .select select,html.theme--documenter-dark .select fieldset[disabled] select,html.theme--documenter-dark fieldset[disabled] .textarea,html.theme--documenter-dark fieldset[disabled] .input,html.theme--documenter-dark fieldset[disabled] #documenter .docs-sidebar form.docs-search>input,html.theme--documenter-dark #documenter .docs-sidebar fieldset[disabled] form.docs-search>input,fieldset[disabled] html.theme--documenter-dark .button,html.theme--documenter-dark fieldset[disabled] .button{cursor:not-allowed}html.theme--documenter-dark .tabs,html.theme--documenter-dark .pagination-previous,html.theme--documenter-dark .pagination-next,html.theme--documenter-dark .pagination-link,html.theme--documenter-dark .pagination-ellipsis,html.theme--documenter-dark .breadcrumb,html.theme--documenter-dark .file,html.theme--documenter-dark .button,.is-unselectable{-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}html.theme--documenter-dark .navbar-link:not(.is-arrowless)::after,html.theme--documenter-dark .select:not(.is-multiple):not(.is-loading)::after{border:3px solid rgba(0,0,0,0);border-radius:2px;border-right:0;border-top:0;content:" ";display:block;height:0.625em;margin-top:-0.4375em;pointer-events:none;position:absolute;top:50%;transform:rotate(-45deg);transform-origin:center;width:0.625em}html.theme--documenter-dark .admonition:not(:last-child),html.theme--documenter-dark .tabs:not(:last-child),html.theme--documenter-dark .pagination:not(:last-child),html.theme--documenter-dark .message:not(:last-child),html.theme--documenter-dark .level:not(:last-child),html.theme--documenter-dark .breadcrumb:not(:last-child),html.theme--documenter-dark .block:not(:last-child),html.theme--documenter-dark .title:not(:last-child),html.theme--documenter-dark .subtitle:not(:last-child),html.theme--documenter-dark .table-container:not(:last-child),html.theme--documenter-dark .table:not(:last-child),html.theme--documenter-dark .progress:not(:last-child),html.theme--documenter-dark .notification:not(:last-child),html.theme--documenter-dark .content:not(:last-child),html.theme--documenter-dark .box:not(:last-child){margin-bottom:1.5rem}html.theme--documenter-dark .modal-close,html.theme--documenter-dark .delete{-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-moz-appearance:none;-webkit-appearance:none;background-color:rgba(10,10,10,0.2);border:none;border-radius:9999px;cursor:pointer;pointer-events:auto;display:inline-block;flex-grow:0;flex-shrink:0;font-size:0;height:20px;max-height:20px;max-width:20px;min-height:20px;min-width:20px;outline:none;position:relative;vertical-align:top;width:20px}html.theme--documenter-dark .modal-close::before,html.theme--documenter-dark .delete::before,html.theme--documenter-dark .modal-close::after,html.theme--documenter-dark .delete::after{background-color:#fff;content:"";display:block;left:50%;position:absolute;top:50%;transform:translateX(-50%) translateY(-50%) rotate(45deg);transform-origin:center center}html.theme--documenter-dark .modal-close::before,html.theme--documenter-dark .delete::before{height:2px;width:50%}html.theme--documenter-dark .modal-close::after,html.theme--documenter-dark .delete::after{height:50%;width:2px}html.theme--documenter-dark .modal-close:hover,html.theme--documenter-dark .delete:hover,html.theme--documenter-dark .modal-close:focus,html.theme--documenter-dark .delete:focus{background-color:rgba(10,10,10,0.3)}html.theme--documenter-dark .modal-close:active,html.theme--documenter-dark .delete:active{background-color:rgba(10,10,10,0.4)}html.theme--documenter-dark .is-small.modal-close,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.modal-close,html.theme--documenter-dark .is-small.delete,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.delete{height:16px;max-height:16px;max-width:16px;min-height:16px;min-width:16px;width:16px}html.theme--documenter-dark .is-medium.modal-close,html.theme--documenter-dark .is-medium.delete{height:24px;max-height:24px;max-width:24px;min-height:24px;min-width:24px;width:24px}html.theme--documenter-dark .is-large.modal-close,html.theme--documenter-dark .is-large.delete{height:32px;max-height:32px;max-width:32px;min-height:32px;min-width:32px;width:32px}html.theme--documenter-dark .control.is-loading::after,html.theme--documenter-dark .select.is-loading::after,html.theme--documenter-dark .loader,html.theme--documenter-dark .button.is-loading::after{animation:spinAround 500ms infinite linear;border:2px solid #dbdee0;border-radius:9999px;border-right-color:transparent;border-top-color:transparent;content:"";display:block;height:1em;position:relative;width:1em}html.theme--documenter-dark .hero-video,html.theme--documenter-dark .modal-background,html.theme--documenter-dark .modal,html.theme--documenter-dark .image.is-square img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-square img,html.theme--documenter-dark .image.is-square .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-square .has-ratio,html.theme--documenter-dark .image.is-1by1 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-1by1 img,html.theme--documenter-dark .image.is-1by1 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-1by1 .has-ratio,html.theme--documenter-dark .image.is-5by4 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-5by4 img,html.theme--documenter-dark .image.is-5by4 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-5by4 .has-ratio,html.theme--documenter-dark .image.is-4by3 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-4by3 img,html.theme--documenter-dark .image.is-4by3 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-4by3 .has-ratio,html.theme--documenter-dark .image.is-3by2 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by2 img,html.theme--documenter-dark .image.is-3by2 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by2 .has-ratio,html.theme--documenter-dark .image.is-5by3 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-5by3 img,html.theme--documenter-dark .image.is-5by3 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-5by3 .has-ratio,html.theme--documenter-dark .image.is-16by9 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-16by9 img,html.theme--documenter-dark .image.is-16by9 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-16by9 .has-ratio,html.theme--documenter-dark .image.is-2by1 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-2by1 img,html.theme--documenter-dark .image.is-2by1 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-2by1 .has-ratio,html.theme--documenter-dark .image.is-3by1 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by1 img,html.theme--documenter-dark .image.is-3by1 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by1 .has-ratio,html.theme--documenter-dark .image.is-4by5 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-4by5 img,html.theme--documenter-dark .image.is-4by5 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-4by5 .has-ratio,html.theme--documenter-dark .image.is-3by4 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by4 img,html.theme--documenter-dark .image.is-3by4 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by4 .has-ratio,html.theme--documenter-dark .image.is-2by3 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-2by3 img,html.theme--documenter-dark .image.is-2by3 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-2by3 .has-ratio,html.theme--documenter-dark .image.is-3by5 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by5 img,html.theme--documenter-dark .image.is-3by5 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by5 .has-ratio,html.theme--documenter-dark .image.is-9by16 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-9by16 img,html.theme--documenter-dark .image.is-9by16 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-9by16 .has-ratio,html.theme--documenter-dark .image.is-1by2 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-1by2 img,html.theme--documenter-dark .image.is-1by2 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-1by2 .has-ratio,html.theme--documenter-dark .image.is-1by3 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-1by3 img,html.theme--documenter-dark .image.is-1by3 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-1by3 .has-ratio,.is-overlay{bottom:0;left:0;position:absolute;right:0;top:0}html.theme--documenter-dark .navbar-burger{-moz-appearance:none;-webkit-appearance:none;appearance:none;background:none;border:none;color:currentColor;font-family:inherit;font-size:1em;margin:0;padding:0}/*! minireset.css v0.0.6 | MIT License | github.com/jgthms/minireset.css */html,body,p,ol,ul,li,dl,dt,dd,blockquote,figure,fieldset,legend,textarea,pre,iframe,hr,h1,h2,h3,h4,h5,h6{margin:0;padding:0}h1,h2,h3,h4,h5,h6{font-size:100%;font-weight:normal}ul{list-style:none}button,input,select,textarea{margin:0}html{box-sizing:border-box}*,*::before,*::after{box-sizing:inherit}img,video{height:auto;max-width:100%}iframe{border:0}table{border-collapse:collapse;border-spacing:0}td,th{padding:0}td:not([align]),th:not([align]){text-align:inherit}.has-text-white{color:#fff !important}a.has-text-white:hover,a.has-text-white:focus{color:#e6e6e6 !important}.has-background-white{background-color:#fff !important}.has-text-black{color:#0a0a0a !important}a.has-text-black:hover,a.has-text-black:focus{color:#000 !important}.has-background-black{background-color:#0a0a0a !important}.has-text-light{color:#ecf0f1 !important}a.has-text-light:hover,a.has-text-light:focus{color:#cfd9db !important}.has-background-light{background-color:#ecf0f1 !important}.has-text-dark{color:#282f2f !important}a.has-text-dark:hover,a.has-text-dark:focus{color:#111414 !important}.has-background-dark{background-color:#282f2f !important}.has-text-primary{color:#375a7f !important}a.has-text-primary:hover,a.has-text-primary:focus{color:#28415b !important}.has-background-primary{background-color:#375a7f !important}.has-text-primary-light{color:#f1f5f9 !important}a.has-text-primary-light:hover,a.has-text-primary-light:focus{color:#cddbe9 !important}.has-background-primary-light{background-color:#f1f5f9 !important}.has-text-primary-dark{color:#4d7eb2 !important}a.has-text-primary-dark:hover,a.has-text-primary-dark:focus{color:#7198c1 !important}.has-background-primary-dark{background-color:#4d7eb2 !important}.has-text-link{color:#1abc9c !important}a.has-text-link:hover,a.has-text-link:focus{color:#148f77 !important}.has-background-link{background-color:#1abc9c !important}.has-text-link-light{color:#edfdf9 !important}a.has-text-link-light:hover,a.has-text-link-light:focus{color:#c0f6ec !important}.has-background-link-light{background-color:#edfdf9 !important}.has-text-link-dark{color:#15987e !important}a.has-text-link-dark:hover,a.has-text-link-dark:focus{color:#1bc5a4 !important}.has-background-link-dark{background-color:#15987e !important}.has-text-info{color:#024c7d !important}a.has-text-info:hover,a.has-text-info:focus{color:#012d4b !important}.has-background-info{background-color:#024c7d !important}.has-text-info-light{color:#ebf7ff !important}a.has-text-info-light:hover,a.has-text-info-light:focus{color:#b9e2fe !important}.has-background-info-light{background-color:#ebf7ff !important}.has-text-info-dark{color:#0e9dfb !important}a.has-text-info-dark:hover,a.has-text-info-dark:focus{color:#40b1fc !important}.has-background-info-dark{background-color:#0e9dfb !important}.has-text-success{color:#008438 !important}a.has-text-success:hover,a.has-text-success:focus{color:#005122 !important}.has-background-success{background-color:#008438 !important}.has-text-success-light{color:#ebfff3 !important}a.has-text-success-light:hover,a.has-text-success-light:focus{color:#b8ffd6 !important}.has-background-success-light{background-color:#ebfff3 !important}.has-text-success-dark{color:#00eb64 !important}a.has-text-success-dark:hover,a.has-text-success-dark:focus{color:#1fff7e !important}.has-background-success-dark{background-color:#00eb64 !important}.has-text-warning{color:#ad8100 !important}a.has-text-warning:hover,a.has-text-warning:focus{color:#7a5b00 !important}.has-background-warning{background-color:#ad8100 !important}.has-text-warning-light{color:#fffaeb !important}a.has-text-warning-light:hover,a.has-text-warning-light:focus{color:#ffedb8 !important}.has-background-warning-light{background-color:#fffaeb !important}.has-text-warning-dark{color:#d19c00 !important}a.has-text-warning-dark:hover,a.has-text-warning-dark:focus{color:#ffbf05 !important}.has-background-warning-dark{background-color:#d19c00 !important}.has-text-danger{color:#9e1b0d !important}a.has-text-danger:hover,a.has-text-danger:focus{color:#6f1309 !important}.has-background-danger{background-color:#9e1b0d !important}.has-text-danger-light{color:#fdeeec !important}a.has-text-danger-light:hover,a.has-text-danger-light:focus{color:#fac3bd !important}.has-background-danger-light{background-color:#fdeeec !important}.has-text-danger-dark{color:#ec311d !important}a.has-text-danger-dark:hover,a.has-text-danger-dark:focus{color:#f05c4c !important}.has-background-danger-dark{background-color:#ec311d !important}.has-text-black-bis{color:#121212 !important}.has-background-black-bis{background-color:#121212 !important}.has-text-black-ter{color:#242424 !important}.has-background-black-ter{background-color:#242424 !important}.has-text-grey-darker{color:#282f2f !important}.has-background-grey-darker{background-color:#282f2f !important}.has-text-grey-dark{color:#343c3d !important}.has-background-grey-dark{background-color:#343c3d !important}.has-text-grey{color:#5e6d6f !important}.has-background-grey{background-color:#5e6d6f !important}.has-text-grey-light{color:#8c9b9d !important}.has-background-grey-light{background-color:#8c9b9d !important}.has-text-grey-lighter{color:#dbdee0 !important}.has-background-grey-lighter{background-color:#dbdee0 !important}.has-text-white-ter{color:#ecf0f1 !important}.has-background-white-ter{background-color:#ecf0f1 !important}.has-text-white-bis{color:#fafafa !important}.has-background-white-bis{background-color:#fafafa !important}.is-flex-direction-row{flex-direction:row !important}.is-flex-direction-row-reverse{flex-direction:row-reverse !important}.is-flex-direction-column{flex-direction:column !important}.is-flex-direction-column-reverse{flex-direction:column-reverse !important}.is-flex-wrap-nowrap{flex-wrap:nowrap !important}.is-flex-wrap-wrap{flex-wrap:wrap !important}.is-flex-wrap-wrap-reverse{flex-wrap:wrap-reverse !important}.is-justify-content-flex-start{justify-content:flex-start !important}.is-justify-content-flex-end{justify-content:flex-end !important}.is-justify-content-center{justify-content:center !important}.is-justify-content-space-between{justify-content:space-between !important}.is-justify-content-space-around{justify-content:space-around !important}.is-justify-content-space-evenly{justify-content:space-evenly !important}.is-justify-content-start{justify-content:start !important}.is-justify-content-end{justify-content:end !important}.is-justify-content-left{justify-content:left !important}.is-justify-content-right{justify-content:right !important}.is-align-content-flex-start{align-content:flex-start !important}.is-align-content-flex-end{align-content:flex-end !important}.is-align-content-center{align-content:center !important}.is-align-content-space-between{align-content:space-between !important}.is-align-content-space-around{align-content:space-around !important}.is-align-content-space-evenly{align-content:space-evenly !important}.is-align-content-stretch{align-content:stretch !important}.is-align-content-start{align-content:start !important}.is-align-content-end{align-content:end !important}.is-align-content-baseline{align-content:baseline !important}.is-align-items-stretch{align-items:stretch !important}.is-align-items-flex-start{align-items:flex-start !important}.is-align-items-flex-end{align-items:flex-end !important}.is-align-items-center{align-items:center !important}.is-align-items-baseline{align-items:baseline !important}.is-align-items-start{align-items:start !important}.is-align-items-end{align-items:end !important}.is-align-items-self-start{align-items:self-start !important}.is-align-items-self-end{align-items:self-end !important}.is-align-self-auto{align-self:auto !important}.is-align-self-flex-start{align-self:flex-start !important}.is-align-self-flex-end{align-self:flex-end !important}.is-align-self-center{align-self:center !important}.is-align-self-baseline{align-self:baseline !important}.is-align-self-stretch{align-self:stretch !important}.is-flex-grow-0{flex-grow:0 !important}.is-flex-grow-1{flex-grow:1 !important}.is-flex-grow-2{flex-grow:2 !important}.is-flex-grow-3{flex-grow:3 !important}.is-flex-grow-4{flex-grow:4 !important}.is-flex-grow-5{flex-grow:5 !important}.is-flex-shrink-0{flex-shrink:0 !important}.is-flex-shrink-1{flex-shrink:1 !important}.is-flex-shrink-2{flex-shrink:2 !important}.is-flex-shrink-3{flex-shrink:3 !important}.is-flex-shrink-4{flex-shrink:4 !important}.is-flex-shrink-5{flex-shrink:5 !important}.is-clearfix::after{clear:both;content:" ";display:table}.is-pulled-left{float:left !important}.is-pulled-right{float:right !important}.is-radiusless{border-radius:0 !important}.is-shadowless{box-shadow:none !important}.is-clickable{cursor:pointer !important;pointer-events:all !important}.is-clipped{overflow:hidden !important}.is-relative{position:relative !important}.is-marginless{margin:0 !important}.is-paddingless{padding:0 !important}.m-0{margin:0 !important}.mt-0{margin-top:0 !important}.mr-0{margin-right:0 !important}.mb-0{margin-bottom:0 !important}.ml-0{margin-left:0 !important}.mx-0{margin-left:0 !important;margin-right:0 !important}.my-0{margin-top:0 !important;margin-bottom:0 !important}.m-1{margin:.25rem !important}.mt-1{margin-top:.25rem !important}.mr-1{margin-right:.25rem !important}.mb-1{margin-bottom:.25rem !important}.ml-1{margin-left:.25rem !important}.mx-1{margin-left:.25rem !important;margin-right:.25rem !important}.my-1{margin-top:.25rem !important;margin-bottom:.25rem !important}.m-2{margin:.5rem !important}.mt-2{margin-top:.5rem !important}.mr-2{margin-right:.5rem !important}.mb-2{margin-bottom:.5rem !important}.ml-2{margin-left:.5rem !important}.mx-2{margin-left:.5rem !important;margin-right:.5rem !important}.my-2{margin-top:.5rem !important;margin-bottom:.5rem !important}.m-3{margin:.75rem !important}.mt-3{margin-top:.75rem !important}.mr-3{margin-right:.75rem !important}.mb-3{margin-bottom:.75rem !important}.ml-3{margin-left:.75rem !important}.mx-3{margin-left:.75rem !important;margin-right:.75rem !important}.my-3{margin-top:.75rem !important;margin-bottom:.75rem !important}.m-4{margin:1rem !important}.mt-4{margin-top:1rem !important}.mr-4{margin-right:1rem !important}.mb-4{margin-bottom:1rem !important}.ml-4{margin-left:1rem !important}.mx-4{margin-left:1rem !important;margin-right:1rem !important}.my-4{margin-top:1rem !important;margin-bottom:1rem !important}.m-5{margin:1.5rem !important}.mt-5{margin-top:1.5rem !important}.mr-5{margin-right:1.5rem !important}.mb-5{margin-bottom:1.5rem !important}.ml-5{margin-left:1.5rem !important}.mx-5{margin-left:1.5rem !important;margin-right:1.5rem !important}.my-5{margin-top:1.5rem !important;margin-bottom:1.5rem !important}.m-6{margin:3rem !important}.mt-6{margin-top:3rem !important}.mr-6{margin-right:3rem !important}.mb-6{margin-bottom:3rem !important}.ml-6{margin-left:3rem !important}.mx-6{margin-left:3rem !important;margin-right:3rem !important}.my-6{margin-top:3rem !important;margin-bottom:3rem !important}.m-auto{margin:auto !important}.mt-auto{margin-top:auto !important}.mr-auto{margin-right:auto !important}.mb-auto{margin-bottom:auto !important}.ml-auto{margin-left:auto !important}.mx-auto{margin-left:auto !important;margin-right:auto !important}.my-auto{margin-top:auto !important;margin-bottom:auto !important}.p-0{padding:0 !important}.pt-0{padding-top:0 !important}.pr-0{padding-right:0 !important}.pb-0{padding-bottom:0 !important}.pl-0{padding-left:0 !important}.px-0{padding-left:0 !important;padding-right:0 !important}.py-0{padding-top:0 !important;padding-bottom:0 !important}.p-1{padding:.25rem !important}.pt-1{padding-top:.25rem !important}.pr-1{padding-right:.25rem !important}.pb-1{padding-bottom:.25rem !important}.pl-1{padding-left:.25rem !important}.px-1{padding-left:.25rem !important;padding-right:.25rem !important}.py-1{padding-top:.25rem !important;padding-bottom:.25rem !important}.p-2{padding:.5rem !important}.pt-2{padding-top:.5rem !important}.pr-2{padding-right:.5rem !important}.pb-2{padding-bottom:.5rem !important}.pl-2{padding-left:.5rem !important}.px-2{padding-left:.5rem !important;padding-right:.5rem !important}.py-2{padding-top:.5rem !important;padding-bottom:.5rem !important}.p-3{padding:.75rem !important}.pt-3{padding-top:.75rem !important}.pr-3{padding-right:.75rem !important}.pb-3{padding-bottom:.75rem !important}.pl-3{padding-left:.75rem !important}.px-3{padding-left:.75rem !important;padding-right:.75rem !important}.py-3{padding-top:.75rem !important;padding-bottom:.75rem !important}.p-4{padding:1rem !important}.pt-4{padding-top:1rem !important}.pr-4{padding-right:1rem !important}.pb-4{padding-bottom:1rem !important}.pl-4{padding-left:1rem !important}.px-4{padding-left:1rem !important;padding-right:1rem !important}.py-4{padding-top:1rem !important;padding-bottom:1rem !important}.p-5{padding:1.5rem !important}.pt-5{padding-top:1.5rem !important}.pr-5{padding-right:1.5rem !important}.pb-5{padding-bottom:1.5rem !important}.pl-5{padding-left:1.5rem !important}.px-5{padding-left:1.5rem !important;padding-right:1.5rem !important}.py-5{padding-top:1.5rem !important;padding-bottom:1.5rem !important}.p-6{padding:3rem !important}.pt-6{padding-top:3rem !important}.pr-6{padding-right:3rem !important}.pb-6{padding-bottom:3rem !important}.pl-6{padding-left:3rem !important}.px-6{padding-left:3rem !important;padding-right:3rem !important}.py-6{padding-top:3rem !important;padding-bottom:3rem !important}.p-auto{padding:auto !important}.pt-auto{padding-top:auto !important}.pr-auto{padding-right:auto !important}.pb-auto{padding-bottom:auto !important}.pl-auto{padding-left:auto !important}.px-auto{padding-left:auto !important;padding-right:auto !important}.py-auto{padding-top:auto !important;padding-bottom:auto !important}.is-size-1{font-size:3rem !important}.is-size-2{font-size:2.5rem !important}.is-size-3{font-size:2rem !important}.is-size-4{font-size:1.5rem !important}.is-size-5{font-size:1.25rem !important}.is-size-6{font-size:1rem !important}.is-size-7,html.theme--documenter-dark .docstring>section>a.docs-sourcelink{font-size:.75rem !important}@media screen and (max-width: 768px){.is-size-1-mobile{font-size:3rem !important}.is-size-2-mobile{font-size:2.5rem !important}.is-size-3-mobile{font-size:2rem !important}.is-size-4-mobile{font-size:1.5rem !important}.is-size-5-mobile{font-size:1.25rem !important}.is-size-6-mobile{font-size:1rem !important}.is-size-7-mobile{font-size:.75rem !important}}@media screen and (min-width: 769px),print{.is-size-1-tablet{font-size:3rem !important}.is-size-2-tablet{font-size:2.5rem !important}.is-size-3-tablet{font-size:2rem !important}.is-size-4-tablet{font-size:1.5rem !important}.is-size-5-tablet{font-size:1.25rem !important}.is-size-6-tablet{font-size:1rem !important}.is-size-7-tablet{font-size:.75rem !important}}@media screen and (max-width: 1055px){.is-size-1-touch{font-size:3rem !important}.is-size-2-touch{font-size:2.5rem !important}.is-size-3-touch{font-size:2rem !important}.is-size-4-touch{font-size:1.5rem !important}.is-size-5-touch{font-size:1.25rem !important}.is-size-6-touch{font-size:1rem !important}.is-size-7-touch{font-size:.75rem !important}}@media screen and (min-width: 1056px){.is-size-1-desktop{font-size:3rem !important}.is-size-2-desktop{font-size:2.5rem !important}.is-size-3-desktop{font-size:2rem !important}.is-size-4-desktop{font-size:1.5rem !important}.is-size-5-desktop{font-size:1.25rem !important}.is-size-6-desktop{font-size:1rem !important}.is-size-7-desktop{font-size:.75rem !important}}@media screen and (min-width: 1216px){.is-size-1-widescreen{font-size:3rem !important}.is-size-2-widescreen{font-size:2.5rem !important}.is-size-3-widescreen{font-size:2rem !important}.is-size-4-widescreen{font-size:1.5rem !important}.is-size-5-widescreen{font-size:1.25rem !important}.is-size-6-widescreen{font-size:1rem !important}.is-size-7-widescreen{font-size:.75rem !important}}@media screen and (min-width: 1408px){.is-size-1-fullhd{font-size:3rem !important}.is-size-2-fullhd{font-size:2.5rem !important}.is-size-3-fullhd{font-size:2rem !important}.is-size-4-fullhd{font-size:1.5rem !important}.is-size-5-fullhd{font-size:1.25rem !important}.is-size-6-fullhd{font-size:1rem !important}.is-size-7-fullhd{font-size:.75rem !important}}.has-text-centered{text-align:center !important}.has-text-justified{text-align:justify !important}.has-text-left{text-align:left !important}.has-text-right{text-align:right !important}@media screen and (max-width: 768px){.has-text-centered-mobile{text-align:center !important}}@media screen and (min-width: 769px),print{.has-text-centered-tablet{text-align:center !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.has-text-centered-tablet-only{text-align:center !important}}@media screen and (max-width: 1055px){.has-text-centered-touch{text-align:center !important}}@media screen and (min-width: 1056px){.has-text-centered-desktop{text-align:center !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.has-text-centered-desktop-only{text-align:center !important}}@media screen and (min-width: 1216px){.has-text-centered-widescreen{text-align:center !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.has-text-centered-widescreen-only{text-align:center !important}}@media screen and (min-width: 1408px){.has-text-centered-fullhd{text-align:center !important}}@media screen and (max-width: 768px){.has-text-justified-mobile{text-align:justify !important}}@media screen and (min-width: 769px),print{.has-text-justified-tablet{text-align:justify !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.has-text-justified-tablet-only{text-align:justify !important}}@media screen and (max-width: 1055px){.has-text-justified-touch{text-align:justify !important}}@media screen and (min-width: 1056px){.has-text-justified-desktop{text-align:justify !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.has-text-justified-desktop-only{text-align:justify !important}}@media screen and (min-width: 1216px){.has-text-justified-widescreen{text-align:justify !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.has-text-justified-widescreen-only{text-align:justify !important}}@media screen and (min-width: 1408px){.has-text-justified-fullhd{text-align:justify !important}}@media screen and (max-width: 768px){.has-text-left-mobile{text-align:left !important}}@media screen and (min-width: 769px),print{.has-text-left-tablet{text-align:left !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.has-text-left-tablet-only{text-align:left !important}}@media screen and (max-width: 1055px){.has-text-left-touch{text-align:left !important}}@media screen and (min-width: 1056px){.has-text-left-desktop{text-align:left !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.has-text-left-desktop-only{text-align:left !important}}@media screen and (min-width: 1216px){.has-text-left-widescreen{text-align:left !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.has-text-left-widescreen-only{text-align:left !important}}@media screen and (min-width: 1408px){.has-text-left-fullhd{text-align:left !important}}@media screen and (max-width: 768px){.has-text-right-mobile{text-align:right !important}}@media screen and (min-width: 769px),print{.has-text-right-tablet{text-align:right !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.has-text-right-tablet-only{text-align:right !important}}@media screen and (max-width: 1055px){.has-text-right-touch{text-align:right !important}}@media screen and (min-width: 1056px){.has-text-right-desktop{text-align:right !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.has-text-right-desktop-only{text-align:right !important}}@media screen and (min-width: 1216px){.has-text-right-widescreen{text-align:right !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.has-text-right-widescreen-only{text-align:right !important}}@media screen and (min-width: 1408px){.has-text-right-fullhd{text-align:right !important}}.is-capitalized{text-transform:capitalize !important}.is-lowercase{text-transform:lowercase !important}.is-uppercase{text-transform:uppercase !important}.is-italic{font-style:italic !important}.is-underlined{text-decoration:underline !important}.has-text-weight-light{font-weight:300 !important}.has-text-weight-normal{font-weight:400 !important}.has-text-weight-medium{font-weight:500 !important}.has-text-weight-semibold{font-weight:600 !important}.has-text-weight-bold{font-weight:700 !important}.is-family-primary{font-family:"Lato Medium",-apple-system,BlinkMacSystemFont,"Segoe UI","Helvetica Neue","Helvetica","Arial",sans-serif !important}.is-family-secondary{font-family:"Lato Medium",-apple-system,BlinkMacSystemFont,"Segoe UI","Helvetica Neue","Helvetica","Arial",sans-serif !important}.is-family-sans-serif{font-family:"Lato Medium",-apple-system,BlinkMacSystemFont,"Segoe UI","Helvetica Neue","Helvetica","Arial",sans-serif !important}.is-family-monospace{font-family:"JuliaMono","SFMono-Regular","Menlo","Consolas","Liberation Mono","DejaVu Sans Mono",monospace !important}.is-family-code{font-family:"JuliaMono","SFMono-Regular","Menlo","Consolas","Liberation Mono","DejaVu Sans Mono",monospace !important}.is-block{display:block !important}@media screen and (max-width: 768px){.is-block-mobile{display:block !important}}@media screen and (min-width: 769px),print{.is-block-tablet{display:block !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.is-block-tablet-only{display:block !important}}@media screen and (max-width: 1055px){.is-block-touch{display:block !important}}@media screen and (min-width: 1056px){.is-block-desktop{display:block !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.is-block-desktop-only{display:block !important}}@media screen and (min-width: 1216px){.is-block-widescreen{display:block !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.is-block-widescreen-only{display:block !important}}@media screen and (min-width: 1408px){.is-block-fullhd{display:block !important}}.is-flex{display:flex !important}@media screen and (max-width: 768px){.is-flex-mobile{display:flex !important}}@media screen and (min-width: 769px),print{.is-flex-tablet{display:flex !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.is-flex-tablet-only{display:flex !important}}@media screen and (max-width: 1055px){.is-flex-touch{display:flex !important}}@media screen and (min-width: 1056px){.is-flex-desktop{display:flex !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.is-flex-desktop-only{display:flex !important}}@media screen and (min-width: 1216px){.is-flex-widescreen{display:flex !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.is-flex-widescreen-only{display:flex !important}}@media screen and (min-width: 1408px){.is-flex-fullhd{display:flex !important}}.is-inline{display:inline !important}@media screen and (max-width: 768px){.is-inline-mobile{display:inline !important}}@media screen and (min-width: 769px),print{.is-inline-tablet{display:inline !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.is-inline-tablet-only{display:inline !important}}@media screen and (max-width: 1055px){.is-inline-touch{display:inline !important}}@media screen and (min-width: 1056px){.is-inline-desktop{display:inline !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.is-inline-desktop-only{display:inline !important}}@media screen and (min-width: 1216px){.is-inline-widescreen{display:inline !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.is-inline-widescreen-only{display:inline !important}}@media screen and (min-width: 1408px){.is-inline-fullhd{display:inline !important}}.is-inline-block{display:inline-block !important}@media screen and (max-width: 768px){.is-inline-block-mobile{display:inline-block !important}}@media screen and (min-width: 769px),print{.is-inline-block-tablet{display:inline-block !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.is-inline-block-tablet-only{display:inline-block !important}}@media screen and (max-width: 1055px){.is-inline-block-touch{display:inline-block !important}}@media screen and (min-width: 1056px){.is-inline-block-desktop{display:inline-block !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.is-inline-block-desktop-only{display:inline-block !important}}@media screen and (min-width: 1216px){.is-inline-block-widescreen{display:inline-block !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.is-inline-block-widescreen-only{display:inline-block !important}}@media screen and (min-width: 1408px){.is-inline-block-fullhd{display:inline-block !important}}.is-inline-flex{display:inline-flex !important}@media screen and (max-width: 768px){.is-inline-flex-mobile{display:inline-flex !important}}@media screen and (min-width: 769px),print{.is-inline-flex-tablet{display:inline-flex !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.is-inline-flex-tablet-only{display:inline-flex !important}}@media screen and (max-width: 1055px){.is-inline-flex-touch{display:inline-flex !important}}@media screen and (min-width: 1056px){.is-inline-flex-desktop{display:inline-flex !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.is-inline-flex-desktop-only{display:inline-flex !important}}@media screen and (min-width: 1216px){.is-inline-flex-widescreen{display:inline-flex !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.is-inline-flex-widescreen-only{display:inline-flex !important}}@media screen and (min-width: 1408px){.is-inline-flex-fullhd{display:inline-flex !important}}.is-hidden{display:none !important}.is-sr-only{border:none !important;clip:rect(0, 0, 0, 0) !important;height:0.01em !important;overflow:hidden !important;padding:0 !important;position:absolute !important;white-space:nowrap !important;width:0.01em !important}@media screen and (max-width: 768px){.is-hidden-mobile{display:none !important}}@media screen and (min-width: 769px),print{.is-hidden-tablet{display:none !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.is-hidden-tablet-only{display:none !important}}@media screen and (max-width: 1055px){.is-hidden-touch{display:none !important}}@media screen and (min-width: 1056px){.is-hidden-desktop{display:none !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.is-hidden-desktop-only{display:none !important}}@media screen and (min-width: 1216px){.is-hidden-widescreen{display:none !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.is-hidden-widescreen-only{display:none !important}}@media screen and (min-width: 1408px){.is-hidden-fullhd{display:none !important}}.is-invisible{visibility:hidden !important}@media screen and (max-width: 768px){.is-invisible-mobile{visibility:hidden !important}}@media screen and (min-width: 769px),print{.is-invisible-tablet{visibility:hidden !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.is-invisible-tablet-only{visibility:hidden !important}}@media screen and (max-width: 1055px){.is-invisible-touch{visibility:hidden !important}}@media screen and (min-width: 1056px){.is-invisible-desktop{visibility:hidden !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.is-invisible-desktop-only{visibility:hidden !important}}@media screen and (min-width: 1216px){.is-invisible-widescreen{visibility:hidden !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.is-invisible-widescreen-only{visibility:hidden !important}}@media screen and (min-width: 1408px){.is-invisible-fullhd{visibility:hidden !important}}html.theme--documenter-dark{/*! + Theme: a11y-dark + Author: @ericwbailey + Maintainer: @ericwbailey + + Based on the Tomorrow Night Eighties theme: https://github.com/isagalaev/highlight.js/blob/master/src/styles/tomorrow-night-eighties.css +*/}html.theme--documenter-dark html{background-color:#1f2424;font-size:16px;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;min-width:300px;overflow-x:auto;overflow-y:scroll;text-rendering:optimizeLegibility;text-size-adjust:100%}html.theme--documenter-dark article,html.theme--documenter-dark aside,html.theme--documenter-dark figure,html.theme--documenter-dark footer,html.theme--documenter-dark header,html.theme--documenter-dark hgroup,html.theme--documenter-dark section{display:block}html.theme--documenter-dark body,html.theme--documenter-dark button,html.theme--documenter-dark input,html.theme--documenter-dark optgroup,html.theme--documenter-dark select,html.theme--documenter-dark textarea{font-family:"Lato Medium",-apple-system,BlinkMacSystemFont,"Segoe UI","Helvetica Neue","Helvetica","Arial",sans-serif}html.theme--documenter-dark code,html.theme--documenter-dark pre{-moz-osx-font-smoothing:auto;-webkit-font-smoothing:auto;font-family:"JuliaMono","SFMono-Regular","Menlo","Consolas","Liberation Mono","DejaVu Sans Mono",monospace}html.theme--documenter-dark body{color:#fff;font-size:1em;font-weight:400;line-height:1.5}html.theme--documenter-dark a{color:#1abc9c;cursor:pointer;text-decoration:none}html.theme--documenter-dark a strong{color:currentColor}html.theme--documenter-dark a:hover{color:#1dd2af}html.theme--documenter-dark code{background-color:rgba(255,255,255,0.05);color:#ececec;font-size:.875em;font-weight:normal;padding:.1em}html.theme--documenter-dark hr{background-color:#282f2f;border:none;display:block;height:2px;margin:1.5rem 0}html.theme--documenter-dark img{height:auto;max-width:100%}html.theme--documenter-dark input[type="checkbox"],html.theme--documenter-dark input[type="radio"]{vertical-align:baseline}html.theme--documenter-dark small{font-size:.875em}html.theme--documenter-dark span{font-style:inherit;font-weight:inherit}html.theme--documenter-dark strong{color:#f2f2f2;font-weight:700}html.theme--documenter-dark fieldset{border:none}html.theme--documenter-dark pre{-webkit-overflow-scrolling:touch;background-color:#282f2f;color:#fff;font-size:.875em;overflow-x:auto;padding:1.25rem 1.5rem;white-space:pre;word-wrap:normal}html.theme--documenter-dark pre code{background-color:transparent;color:currentColor;font-size:1em;padding:0}html.theme--documenter-dark table td,html.theme--documenter-dark table th{vertical-align:top}html.theme--documenter-dark table td:not([align]),html.theme--documenter-dark table th:not([align]){text-align:inherit}html.theme--documenter-dark table th{color:#f2f2f2}html.theme--documenter-dark .box{background-color:#343c3d;border-radius:8px;box-shadow:none;color:#fff;display:block;padding:1.25rem}html.theme--documenter-dark a.box:hover,html.theme--documenter-dark a.box:focus{box-shadow:0 0.5em 1em -0.125em rgba(10,10,10,0.1),0 0 0 1px #1abc9c}html.theme--documenter-dark a.box:active{box-shadow:inset 0 1px 2px rgba(10,10,10,0.2),0 0 0 1px #1abc9c}html.theme--documenter-dark .button{background-color:#282f2f;border-color:#4c5759;border-width:1px;color:#375a7f;cursor:pointer;justify-content:center;padding-bottom:calc(0.5em - 1px);padding-left:1em;padding-right:1em;padding-top:calc(0.5em - 1px);text-align:center;white-space:nowrap}html.theme--documenter-dark .button strong{color:inherit}html.theme--documenter-dark .button .icon,html.theme--documenter-dark .button .icon.is-small,html.theme--documenter-dark .button #documenter .docs-sidebar form.docs-search>input.icon,html.theme--documenter-dark #documenter .docs-sidebar .button form.docs-search>input.icon,html.theme--documenter-dark .button .icon.is-medium,html.theme--documenter-dark .button .icon.is-large{height:1.5em;width:1.5em}html.theme--documenter-dark .button .icon:first-child:not(:last-child){margin-left:calc(-0.5em - 1px);margin-right:.25em}html.theme--documenter-dark .button .icon:last-child:not(:first-child){margin-left:.25em;margin-right:calc(-0.5em - 1px)}html.theme--documenter-dark .button .icon:first-child:last-child{margin-left:calc(-0.5em - 1px);margin-right:calc(-0.5em - 1px)}html.theme--documenter-dark .button:hover,html.theme--documenter-dark .button.is-hovered{border-color:#8c9b9d;color:#f2f2f2}html.theme--documenter-dark .button:focus,html.theme--documenter-dark .button.is-focused{border-color:#8c9b9d;color:#17a689}html.theme--documenter-dark .button:focus:not(:active),html.theme--documenter-dark .button.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(26,188,156,0.25)}html.theme--documenter-dark .button:active,html.theme--documenter-dark .button.is-active{border-color:#343c3d;color:#f2f2f2}html.theme--documenter-dark .button.is-text{background-color:transparent;border-color:transparent;color:#fff;text-decoration:underline}html.theme--documenter-dark .button.is-text:hover,html.theme--documenter-dark .button.is-text.is-hovered,html.theme--documenter-dark .button.is-text:focus,html.theme--documenter-dark .button.is-text.is-focused{background-color:#282f2f;color:#f2f2f2}html.theme--documenter-dark .button.is-text:active,html.theme--documenter-dark .button.is-text.is-active{background-color:#1d2122;color:#f2f2f2}html.theme--documenter-dark .button.is-text[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-text{background-color:transparent;border-color:transparent;box-shadow:none}html.theme--documenter-dark .button.is-ghost{background:none;border-color:rgba(0,0,0,0);color:#1abc9c;text-decoration:none}html.theme--documenter-dark .button.is-ghost:hover,html.theme--documenter-dark .button.is-ghost.is-hovered{color:#1abc9c;text-decoration:underline}html.theme--documenter-dark .button.is-white{background-color:#fff;border-color:transparent;color:#0a0a0a}html.theme--documenter-dark .button.is-white:hover,html.theme--documenter-dark .button.is-white.is-hovered{background-color:#f9f9f9;border-color:transparent;color:#0a0a0a}html.theme--documenter-dark .button.is-white:focus,html.theme--documenter-dark .button.is-white.is-focused{border-color:transparent;color:#0a0a0a}html.theme--documenter-dark .button.is-white:focus:not(:active),html.theme--documenter-dark .button.is-white.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(255,255,255,0.25)}html.theme--documenter-dark .button.is-white:active,html.theme--documenter-dark .button.is-white.is-active{background-color:#f2f2f2;border-color:transparent;color:#0a0a0a}html.theme--documenter-dark .button.is-white[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-white{background-color:#fff;border-color:#fff;box-shadow:none}html.theme--documenter-dark .button.is-white.is-inverted{background-color:#0a0a0a;color:#fff}html.theme--documenter-dark .button.is-white.is-inverted:hover,html.theme--documenter-dark .button.is-white.is-inverted.is-hovered{background-color:#000}html.theme--documenter-dark .button.is-white.is-inverted[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-white.is-inverted{background-color:#0a0a0a;border-color:transparent;box-shadow:none;color:#fff}html.theme--documenter-dark .button.is-white.is-loading::after{border-color:transparent transparent #0a0a0a #0a0a0a !important}html.theme--documenter-dark .button.is-white.is-outlined{background-color:transparent;border-color:#fff;color:#fff}html.theme--documenter-dark .button.is-white.is-outlined:hover,html.theme--documenter-dark .button.is-white.is-outlined.is-hovered,html.theme--documenter-dark .button.is-white.is-outlined:focus,html.theme--documenter-dark .button.is-white.is-outlined.is-focused{background-color:#fff;border-color:#fff;color:#0a0a0a}html.theme--documenter-dark .button.is-white.is-outlined.is-loading::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-white.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-white.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-white.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-white.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #0a0a0a #0a0a0a !important}html.theme--documenter-dark .button.is-white.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-white.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}html.theme--documenter-dark .button.is-white.is-inverted.is-outlined{background-color:transparent;border-color:#0a0a0a;color:#0a0a0a}html.theme--documenter-dark .button.is-white.is-inverted.is-outlined:hover,html.theme--documenter-dark .button.is-white.is-inverted.is-outlined.is-hovered,html.theme--documenter-dark .button.is-white.is-inverted.is-outlined:focus,html.theme--documenter-dark .button.is-white.is-inverted.is-outlined.is-focused{background-color:#0a0a0a;color:#fff}html.theme--documenter-dark .button.is-white.is-inverted.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-white.is-inverted.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-white.is-inverted.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-white.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-white.is-inverted.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-white.is-inverted.is-outlined{background-color:transparent;border-color:#0a0a0a;box-shadow:none;color:#0a0a0a}html.theme--documenter-dark .button.is-black{background-color:#0a0a0a;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-black:hover,html.theme--documenter-dark .button.is-black.is-hovered{background-color:#040404;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-black:focus,html.theme--documenter-dark .button.is-black.is-focused{border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-black:focus:not(:active),html.theme--documenter-dark .button.is-black.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(10,10,10,0.25)}html.theme--documenter-dark .button.is-black:active,html.theme--documenter-dark .button.is-black.is-active{background-color:#000;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-black[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-black{background-color:#0a0a0a;border-color:#0a0a0a;box-shadow:none}html.theme--documenter-dark .button.is-black.is-inverted{background-color:#fff;color:#0a0a0a}html.theme--documenter-dark .button.is-black.is-inverted:hover,html.theme--documenter-dark .button.is-black.is-inverted.is-hovered{background-color:#f2f2f2}html.theme--documenter-dark .button.is-black.is-inverted[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-black.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#0a0a0a}html.theme--documenter-dark .button.is-black.is-loading::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-black.is-outlined{background-color:transparent;border-color:#0a0a0a;color:#0a0a0a}html.theme--documenter-dark .button.is-black.is-outlined:hover,html.theme--documenter-dark .button.is-black.is-outlined.is-hovered,html.theme--documenter-dark .button.is-black.is-outlined:focus,html.theme--documenter-dark .button.is-black.is-outlined.is-focused{background-color:#0a0a0a;border-color:#0a0a0a;color:#fff}html.theme--documenter-dark .button.is-black.is-outlined.is-loading::after{border-color:transparent transparent #0a0a0a #0a0a0a !important}html.theme--documenter-dark .button.is-black.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-black.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-black.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-black.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-black.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-black.is-outlined{background-color:transparent;border-color:#0a0a0a;box-shadow:none;color:#0a0a0a}html.theme--documenter-dark .button.is-black.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}html.theme--documenter-dark .button.is-black.is-inverted.is-outlined:hover,html.theme--documenter-dark .button.is-black.is-inverted.is-outlined.is-hovered,html.theme--documenter-dark .button.is-black.is-inverted.is-outlined:focus,html.theme--documenter-dark .button.is-black.is-inverted.is-outlined.is-focused{background-color:#fff;color:#0a0a0a}html.theme--documenter-dark .button.is-black.is-inverted.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-black.is-inverted.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-black.is-inverted.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-black.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #0a0a0a #0a0a0a !important}html.theme--documenter-dark .button.is-black.is-inverted.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-black.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}html.theme--documenter-dark .button.is-light{background-color:#ecf0f1;border-color:transparent;color:rgba(0,0,0,0.7)}html.theme--documenter-dark .button.is-light:hover,html.theme--documenter-dark .button.is-light.is-hovered{background-color:#e5eaec;border-color:transparent;color:rgba(0,0,0,0.7)}html.theme--documenter-dark .button.is-light:focus,html.theme--documenter-dark .button.is-light.is-focused{border-color:transparent;color:rgba(0,0,0,0.7)}html.theme--documenter-dark .button.is-light:focus:not(:active),html.theme--documenter-dark .button.is-light.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(236,240,241,0.25)}html.theme--documenter-dark .button.is-light:active,html.theme--documenter-dark .button.is-light.is-active{background-color:#dde4e6;border-color:transparent;color:rgba(0,0,0,0.7)}html.theme--documenter-dark .button.is-light[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-light{background-color:#ecf0f1;border-color:#ecf0f1;box-shadow:none}html.theme--documenter-dark .button.is-light.is-inverted{background-color:rgba(0,0,0,0.7);color:#ecf0f1}html.theme--documenter-dark .button.is-light.is-inverted:hover,html.theme--documenter-dark .button.is-light.is-inverted.is-hovered{background-color:rgba(0,0,0,0.7)}html.theme--documenter-dark .button.is-light.is-inverted[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-light.is-inverted{background-color:rgba(0,0,0,0.7);border-color:transparent;box-shadow:none;color:#ecf0f1}html.theme--documenter-dark .button.is-light.is-loading::after{border-color:transparent transparent rgba(0,0,0,0.7) rgba(0,0,0,0.7) !important}html.theme--documenter-dark .button.is-light.is-outlined{background-color:transparent;border-color:#ecf0f1;color:#ecf0f1}html.theme--documenter-dark .button.is-light.is-outlined:hover,html.theme--documenter-dark .button.is-light.is-outlined.is-hovered,html.theme--documenter-dark .button.is-light.is-outlined:focus,html.theme--documenter-dark .button.is-light.is-outlined.is-focused{background-color:#ecf0f1;border-color:#ecf0f1;color:rgba(0,0,0,0.7)}html.theme--documenter-dark .button.is-light.is-outlined.is-loading::after{border-color:transparent transparent #ecf0f1 #ecf0f1 !important}html.theme--documenter-dark .button.is-light.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-light.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-light.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-light.is-outlined.is-loading.is-focused::after{border-color:transparent transparent rgba(0,0,0,0.7) rgba(0,0,0,0.7) !important}html.theme--documenter-dark .button.is-light.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-light.is-outlined{background-color:transparent;border-color:#ecf0f1;box-shadow:none;color:#ecf0f1}html.theme--documenter-dark .button.is-light.is-inverted.is-outlined{background-color:transparent;border-color:rgba(0,0,0,0.7);color:rgba(0,0,0,0.7)}html.theme--documenter-dark .button.is-light.is-inverted.is-outlined:hover,html.theme--documenter-dark .button.is-light.is-inverted.is-outlined.is-hovered,html.theme--documenter-dark .button.is-light.is-inverted.is-outlined:focus,html.theme--documenter-dark .button.is-light.is-inverted.is-outlined.is-focused{background-color:rgba(0,0,0,0.7);color:#ecf0f1}html.theme--documenter-dark .button.is-light.is-inverted.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-light.is-inverted.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-light.is-inverted.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-light.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #ecf0f1 #ecf0f1 !important}html.theme--documenter-dark .button.is-light.is-inverted.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-light.is-inverted.is-outlined{background-color:transparent;border-color:rgba(0,0,0,0.7);box-shadow:none;color:rgba(0,0,0,0.7)}html.theme--documenter-dark .button.is-dark,html.theme--documenter-dark .content kbd.button{background-color:#282f2f;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-dark:hover,html.theme--documenter-dark .content kbd.button:hover,html.theme--documenter-dark .button.is-dark.is-hovered,html.theme--documenter-dark .content kbd.button.is-hovered{background-color:#232829;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-dark:focus,html.theme--documenter-dark .content kbd.button:focus,html.theme--documenter-dark .button.is-dark.is-focused,html.theme--documenter-dark .content kbd.button.is-focused{border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-dark:focus:not(:active),html.theme--documenter-dark .content kbd.button:focus:not(:active),html.theme--documenter-dark .button.is-dark.is-focused:not(:active),html.theme--documenter-dark .content kbd.button.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(40,47,47,0.25)}html.theme--documenter-dark .button.is-dark:active,html.theme--documenter-dark .content kbd.button:active,html.theme--documenter-dark .button.is-dark.is-active,html.theme--documenter-dark .content kbd.button.is-active{background-color:#1d2122;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-dark[disabled],html.theme--documenter-dark .content kbd.button[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-dark,fieldset[disabled] html.theme--documenter-dark .content kbd.button{background-color:#282f2f;border-color:#282f2f;box-shadow:none}html.theme--documenter-dark .button.is-dark.is-inverted,html.theme--documenter-dark .content kbd.button.is-inverted{background-color:#fff;color:#282f2f}html.theme--documenter-dark .button.is-dark.is-inverted:hover,html.theme--documenter-dark .content kbd.button.is-inverted:hover,html.theme--documenter-dark .button.is-dark.is-inverted.is-hovered,html.theme--documenter-dark .content kbd.button.is-inverted.is-hovered{background-color:#f2f2f2}html.theme--documenter-dark .button.is-dark.is-inverted[disabled],html.theme--documenter-dark .content kbd.button.is-inverted[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-dark.is-inverted,fieldset[disabled] html.theme--documenter-dark .content kbd.button.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#282f2f}html.theme--documenter-dark .button.is-dark.is-loading::after,html.theme--documenter-dark .content kbd.button.is-loading::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-dark.is-outlined,html.theme--documenter-dark .content kbd.button.is-outlined{background-color:transparent;border-color:#282f2f;color:#282f2f}html.theme--documenter-dark .button.is-dark.is-outlined:hover,html.theme--documenter-dark .content kbd.button.is-outlined:hover,html.theme--documenter-dark .button.is-dark.is-outlined.is-hovered,html.theme--documenter-dark .content kbd.button.is-outlined.is-hovered,html.theme--documenter-dark .button.is-dark.is-outlined:focus,html.theme--documenter-dark .content kbd.button.is-outlined:focus,html.theme--documenter-dark .button.is-dark.is-outlined.is-focused,html.theme--documenter-dark .content kbd.button.is-outlined.is-focused{background-color:#282f2f;border-color:#282f2f;color:#fff}html.theme--documenter-dark .button.is-dark.is-outlined.is-loading::after,html.theme--documenter-dark .content kbd.button.is-outlined.is-loading::after{border-color:transparent transparent #282f2f #282f2f !important}html.theme--documenter-dark .button.is-dark.is-outlined.is-loading:hover::after,html.theme--documenter-dark .content kbd.button.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-dark.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .content kbd.button.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-dark.is-outlined.is-loading:focus::after,html.theme--documenter-dark .content kbd.button.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-dark.is-outlined.is-loading.is-focused::after,html.theme--documenter-dark .content kbd.button.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-dark.is-outlined[disabled],html.theme--documenter-dark .content kbd.button.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-dark.is-outlined,fieldset[disabled] html.theme--documenter-dark .content kbd.button.is-outlined{background-color:transparent;border-color:#282f2f;box-shadow:none;color:#282f2f}html.theme--documenter-dark .button.is-dark.is-inverted.is-outlined,html.theme--documenter-dark .content kbd.button.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}html.theme--documenter-dark .button.is-dark.is-inverted.is-outlined:hover,html.theme--documenter-dark .content kbd.button.is-inverted.is-outlined:hover,html.theme--documenter-dark .button.is-dark.is-inverted.is-outlined.is-hovered,html.theme--documenter-dark .content kbd.button.is-inverted.is-outlined.is-hovered,html.theme--documenter-dark .button.is-dark.is-inverted.is-outlined:focus,html.theme--documenter-dark .content kbd.button.is-inverted.is-outlined:focus,html.theme--documenter-dark .button.is-dark.is-inverted.is-outlined.is-focused,html.theme--documenter-dark .content kbd.button.is-inverted.is-outlined.is-focused{background-color:#fff;color:#282f2f}html.theme--documenter-dark .button.is-dark.is-inverted.is-outlined.is-loading:hover::after,html.theme--documenter-dark .content kbd.button.is-inverted.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-dark.is-inverted.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .content kbd.button.is-inverted.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-dark.is-inverted.is-outlined.is-loading:focus::after,html.theme--documenter-dark .content kbd.button.is-inverted.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-dark.is-inverted.is-outlined.is-loading.is-focused::after,html.theme--documenter-dark .content kbd.button.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #282f2f #282f2f !important}html.theme--documenter-dark .button.is-dark.is-inverted.is-outlined[disabled],html.theme--documenter-dark .content kbd.button.is-inverted.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-dark.is-inverted.is-outlined,fieldset[disabled] html.theme--documenter-dark .content kbd.button.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}html.theme--documenter-dark .button.is-primary,html.theme--documenter-dark .docstring>section>a.button.docs-sourcelink{background-color:#375a7f;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-primary:hover,html.theme--documenter-dark .docstring>section>a.button.docs-sourcelink:hover,html.theme--documenter-dark .button.is-primary.is-hovered,html.theme--documenter-dark .docstring>section>a.button.is-hovered.docs-sourcelink{background-color:#335476;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-primary:focus,html.theme--documenter-dark .docstring>section>a.button.docs-sourcelink:focus,html.theme--documenter-dark .button.is-primary.is-focused,html.theme--documenter-dark .docstring>section>a.button.is-focused.docs-sourcelink{border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-primary:focus:not(:active),html.theme--documenter-dark .docstring>section>a.button.docs-sourcelink:focus:not(:active),html.theme--documenter-dark .button.is-primary.is-focused:not(:active),html.theme--documenter-dark .docstring>section>a.button.is-focused.docs-sourcelink:not(:active){box-shadow:0 0 0 0.125em rgba(55,90,127,0.25)}html.theme--documenter-dark .button.is-primary:active,html.theme--documenter-dark .docstring>section>a.button.docs-sourcelink:active,html.theme--documenter-dark .button.is-primary.is-active,html.theme--documenter-dark .docstring>section>a.button.is-active.docs-sourcelink{background-color:#2f4d6d;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-primary[disabled],html.theme--documenter-dark .docstring>section>a.button.docs-sourcelink[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-primary,fieldset[disabled] html.theme--documenter-dark .docstring>section>a.button.docs-sourcelink{background-color:#375a7f;border-color:#375a7f;box-shadow:none}html.theme--documenter-dark .button.is-primary.is-inverted,html.theme--documenter-dark .docstring>section>a.button.is-inverted.docs-sourcelink{background-color:#fff;color:#375a7f}html.theme--documenter-dark .button.is-primary.is-inverted:hover,html.theme--documenter-dark .docstring>section>a.button.is-inverted.docs-sourcelink:hover,html.theme--documenter-dark .button.is-primary.is-inverted.is-hovered,html.theme--documenter-dark .docstring>section>a.button.is-inverted.is-hovered.docs-sourcelink{background-color:#f2f2f2}html.theme--documenter-dark .button.is-primary.is-inverted[disabled],html.theme--documenter-dark .docstring>section>a.button.is-inverted.docs-sourcelink[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-primary.is-inverted,fieldset[disabled] html.theme--documenter-dark .docstring>section>a.button.is-inverted.docs-sourcelink{background-color:#fff;border-color:transparent;box-shadow:none;color:#375a7f}html.theme--documenter-dark .button.is-primary.is-loading::after,html.theme--documenter-dark .docstring>section>a.button.is-loading.docs-sourcelink::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-primary.is-outlined,html.theme--documenter-dark .docstring>section>a.button.is-outlined.docs-sourcelink{background-color:transparent;border-color:#375a7f;color:#375a7f}html.theme--documenter-dark .button.is-primary.is-outlined:hover,html.theme--documenter-dark .docstring>section>a.button.is-outlined.docs-sourcelink:hover,html.theme--documenter-dark .button.is-primary.is-outlined.is-hovered,html.theme--documenter-dark .docstring>section>a.button.is-outlined.is-hovered.docs-sourcelink,html.theme--documenter-dark .button.is-primary.is-outlined:focus,html.theme--documenter-dark .docstring>section>a.button.is-outlined.docs-sourcelink:focus,html.theme--documenter-dark .button.is-primary.is-outlined.is-focused,html.theme--documenter-dark .docstring>section>a.button.is-outlined.is-focused.docs-sourcelink{background-color:#375a7f;border-color:#375a7f;color:#fff}html.theme--documenter-dark .button.is-primary.is-outlined.is-loading::after,html.theme--documenter-dark .docstring>section>a.button.is-outlined.is-loading.docs-sourcelink::after{border-color:transparent transparent #375a7f #375a7f !important}html.theme--documenter-dark .button.is-primary.is-outlined.is-loading:hover::after,html.theme--documenter-dark .docstring>section>a.button.is-outlined.is-loading.docs-sourcelink:hover::after,html.theme--documenter-dark .button.is-primary.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .docstring>section>a.button.is-outlined.is-loading.is-hovered.docs-sourcelink::after,html.theme--documenter-dark .button.is-primary.is-outlined.is-loading:focus::after,html.theme--documenter-dark .docstring>section>a.button.is-outlined.is-loading.docs-sourcelink:focus::after,html.theme--documenter-dark .button.is-primary.is-outlined.is-loading.is-focused::after,html.theme--documenter-dark .docstring>section>a.button.is-outlined.is-loading.is-focused.docs-sourcelink::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-primary.is-outlined[disabled],html.theme--documenter-dark .docstring>section>a.button.is-outlined.docs-sourcelink[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-primary.is-outlined,fieldset[disabled] html.theme--documenter-dark .docstring>section>a.button.is-outlined.docs-sourcelink{background-color:transparent;border-color:#375a7f;box-shadow:none;color:#375a7f}html.theme--documenter-dark .button.is-primary.is-inverted.is-outlined,html.theme--documenter-dark .docstring>section>a.button.is-inverted.is-outlined.docs-sourcelink{background-color:transparent;border-color:#fff;color:#fff}html.theme--documenter-dark .button.is-primary.is-inverted.is-outlined:hover,html.theme--documenter-dark .docstring>section>a.button.is-inverted.is-outlined.docs-sourcelink:hover,html.theme--documenter-dark .button.is-primary.is-inverted.is-outlined.is-hovered,html.theme--documenter-dark .docstring>section>a.button.is-inverted.is-outlined.is-hovered.docs-sourcelink,html.theme--documenter-dark .button.is-primary.is-inverted.is-outlined:focus,html.theme--documenter-dark .docstring>section>a.button.is-inverted.is-outlined.docs-sourcelink:focus,html.theme--documenter-dark .button.is-primary.is-inverted.is-outlined.is-focused,html.theme--documenter-dark .docstring>section>a.button.is-inverted.is-outlined.is-focused.docs-sourcelink{background-color:#fff;color:#375a7f}html.theme--documenter-dark .button.is-primary.is-inverted.is-outlined.is-loading:hover::after,html.theme--documenter-dark .docstring>section>a.button.is-inverted.is-outlined.is-loading.docs-sourcelink:hover::after,html.theme--documenter-dark .button.is-primary.is-inverted.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .docstring>section>a.button.is-inverted.is-outlined.is-loading.is-hovered.docs-sourcelink::after,html.theme--documenter-dark .button.is-primary.is-inverted.is-outlined.is-loading:focus::after,html.theme--documenter-dark .docstring>section>a.button.is-inverted.is-outlined.is-loading.docs-sourcelink:focus::after,html.theme--documenter-dark .button.is-primary.is-inverted.is-outlined.is-loading.is-focused::after,html.theme--documenter-dark .docstring>section>a.button.is-inverted.is-outlined.is-loading.is-focused.docs-sourcelink::after{border-color:transparent transparent #375a7f #375a7f !important}html.theme--documenter-dark .button.is-primary.is-inverted.is-outlined[disabled],html.theme--documenter-dark .docstring>section>a.button.is-inverted.is-outlined.docs-sourcelink[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-primary.is-inverted.is-outlined,fieldset[disabled] html.theme--documenter-dark .docstring>section>a.button.is-inverted.is-outlined.docs-sourcelink{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}html.theme--documenter-dark .button.is-primary.is-light,html.theme--documenter-dark .docstring>section>a.button.is-light.docs-sourcelink{background-color:#f1f5f9;color:#4d7eb2}html.theme--documenter-dark .button.is-primary.is-light:hover,html.theme--documenter-dark .docstring>section>a.button.is-light.docs-sourcelink:hover,html.theme--documenter-dark .button.is-primary.is-light.is-hovered,html.theme--documenter-dark .docstring>section>a.button.is-light.is-hovered.docs-sourcelink{background-color:#e8eef5;border-color:transparent;color:#4d7eb2}html.theme--documenter-dark .button.is-primary.is-light:active,html.theme--documenter-dark .docstring>section>a.button.is-light.docs-sourcelink:active,html.theme--documenter-dark .button.is-primary.is-light.is-active,html.theme--documenter-dark .docstring>section>a.button.is-light.is-active.docs-sourcelink{background-color:#dfe8f1;border-color:transparent;color:#4d7eb2}html.theme--documenter-dark .button.is-link{background-color:#1abc9c;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-link:hover,html.theme--documenter-dark .button.is-link.is-hovered{background-color:#18b193;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-link:focus,html.theme--documenter-dark .button.is-link.is-focused{border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-link:focus:not(:active),html.theme--documenter-dark .button.is-link.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(26,188,156,0.25)}html.theme--documenter-dark .button.is-link:active,html.theme--documenter-dark .button.is-link.is-active{background-color:#17a689;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-link[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-link{background-color:#1abc9c;border-color:#1abc9c;box-shadow:none}html.theme--documenter-dark .button.is-link.is-inverted{background-color:#fff;color:#1abc9c}html.theme--documenter-dark .button.is-link.is-inverted:hover,html.theme--documenter-dark .button.is-link.is-inverted.is-hovered{background-color:#f2f2f2}html.theme--documenter-dark .button.is-link.is-inverted[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-link.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#1abc9c}html.theme--documenter-dark .button.is-link.is-loading::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-link.is-outlined{background-color:transparent;border-color:#1abc9c;color:#1abc9c}html.theme--documenter-dark .button.is-link.is-outlined:hover,html.theme--documenter-dark .button.is-link.is-outlined.is-hovered,html.theme--documenter-dark .button.is-link.is-outlined:focus,html.theme--documenter-dark .button.is-link.is-outlined.is-focused{background-color:#1abc9c;border-color:#1abc9c;color:#fff}html.theme--documenter-dark .button.is-link.is-outlined.is-loading::after{border-color:transparent transparent #1abc9c #1abc9c !important}html.theme--documenter-dark .button.is-link.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-link.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-link.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-link.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-link.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-link.is-outlined{background-color:transparent;border-color:#1abc9c;box-shadow:none;color:#1abc9c}html.theme--documenter-dark .button.is-link.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}html.theme--documenter-dark .button.is-link.is-inverted.is-outlined:hover,html.theme--documenter-dark .button.is-link.is-inverted.is-outlined.is-hovered,html.theme--documenter-dark .button.is-link.is-inverted.is-outlined:focus,html.theme--documenter-dark .button.is-link.is-inverted.is-outlined.is-focused{background-color:#fff;color:#1abc9c}html.theme--documenter-dark .button.is-link.is-inverted.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-link.is-inverted.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-link.is-inverted.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-link.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #1abc9c #1abc9c !important}html.theme--documenter-dark .button.is-link.is-inverted.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-link.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}html.theme--documenter-dark .button.is-link.is-light{background-color:#edfdf9;color:#15987e}html.theme--documenter-dark .button.is-link.is-light:hover,html.theme--documenter-dark .button.is-link.is-light.is-hovered{background-color:#e2fbf6;border-color:transparent;color:#15987e}html.theme--documenter-dark .button.is-link.is-light:active,html.theme--documenter-dark .button.is-link.is-light.is-active{background-color:#d7f9f3;border-color:transparent;color:#15987e}html.theme--documenter-dark .button.is-info{background-color:#024c7d;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-info:hover,html.theme--documenter-dark .button.is-info.is-hovered{background-color:#024470;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-info:focus,html.theme--documenter-dark .button.is-info.is-focused{border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-info:focus:not(:active),html.theme--documenter-dark .button.is-info.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(2,76,125,0.25)}html.theme--documenter-dark .button.is-info:active,html.theme--documenter-dark .button.is-info.is-active{background-color:#023d64;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-info[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-info{background-color:#024c7d;border-color:#024c7d;box-shadow:none}html.theme--documenter-dark .button.is-info.is-inverted{background-color:#fff;color:#024c7d}html.theme--documenter-dark .button.is-info.is-inverted:hover,html.theme--documenter-dark .button.is-info.is-inverted.is-hovered{background-color:#f2f2f2}html.theme--documenter-dark .button.is-info.is-inverted[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-info.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#024c7d}html.theme--documenter-dark .button.is-info.is-loading::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-info.is-outlined{background-color:transparent;border-color:#024c7d;color:#024c7d}html.theme--documenter-dark .button.is-info.is-outlined:hover,html.theme--documenter-dark .button.is-info.is-outlined.is-hovered,html.theme--documenter-dark .button.is-info.is-outlined:focus,html.theme--documenter-dark .button.is-info.is-outlined.is-focused{background-color:#024c7d;border-color:#024c7d;color:#fff}html.theme--documenter-dark .button.is-info.is-outlined.is-loading::after{border-color:transparent transparent #024c7d #024c7d !important}html.theme--documenter-dark .button.is-info.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-info.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-info.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-info.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-info.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-info.is-outlined{background-color:transparent;border-color:#024c7d;box-shadow:none;color:#024c7d}html.theme--documenter-dark .button.is-info.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}html.theme--documenter-dark .button.is-info.is-inverted.is-outlined:hover,html.theme--documenter-dark .button.is-info.is-inverted.is-outlined.is-hovered,html.theme--documenter-dark .button.is-info.is-inverted.is-outlined:focus,html.theme--documenter-dark .button.is-info.is-inverted.is-outlined.is-focused{background-color:#fff;color:#024c7d}html.theme--documenter-dark .button.is-info.is-inverted.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-info.is-inverted.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-info.is-inverted.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-info.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #024c7d #024c7d !important}html.theme--documenter-dark .button.is-info.is-inverted.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-info.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}html.theme--documenter-dark .button.is-info.is-light{background-color:#ebf7ff;color:#0e9dfb}html.theme--documenter-dark .button.is-info.is-light:hover,html.theme--documenter-dark .button.is-info.is-light.is-hovered{background-color:#def2fe;border-color:transparent;color:#0e9dfb}html.theme--documenter-dark .button.is-info.is-light:active,html.theme--documenter-dark .button.is-info.is-light.is-active{background-color:#d2edfe;border-color:transparent;color:#0e9dfb}html.theme--documenter-dark .button.is-success{background-color:#008438;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-success:hover,html.theme--documenter-dark .button.is-success.is-hovered{background-color:#073;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-success:focus,html.theme--documenter-dark .button.is-success.is-focused{border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-success:focus:not(:active),html.theme--documenter-dark .button.is-success.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(0,132,56,0.25)}html.theme--documenter-dark .button.is-success:active,html.theme--documenter-dark .button.is-success.is-active{background-color:#006b2d;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-success[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-success{background-color:#008438;border-color:#008438;box-shadow:none}html.theme--documenter-dark .button.is-success.is-inverted{background-color:#fff;color:#008438}html.theme--documenter-dark .button.is-success.is-inverted:hover,html.theme--documenter-dark .button.is-success.is-inverted.is-hovered{background-color:#f2f2f2}html.theme--documenter-dark .button.is-success.is-inverted[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-success.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#008438}html.theme--documenter-dark .button.is-success.is-loading::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-success.is-outlined{background-color:transparent;border-color:#008438;color:#008438}html.theme--documenter-dark .button.is-success.is-outlined:hover,html.theme--documenter-dark .button.is-success.is-outlined.is-hovered,html.theme--documenter-dark .button.is-success.is-outlined:focus,html.theme--documenter-dark .button.is-success.is-outlined.is-focused{background-color:#008438;border-color:#008438;color:#fff}html.theme--documenter-dark .button.is-success.is-outlined.is-loading::after{border-color:transparent transparent #008438 #008438 !important}html.theme--documenter-dark .button.is-success.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-success.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-success.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-success.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-success.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-success.is-outlined{background-color:transparent;border-color:#008438;box-shadow:none;color:#008438}html.theme--documenter-dark .button.is-success.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}html.theme--documenter-dark .button.is-success.is-inverted.is-outlined:hover,html.theme--documenter-dark .button.is-success.is-inverted.is-outlined.is-hovered,html.theme--documenter-dark .button.is-success.is-inverted.is-outlined:focus,html.theme--documenter-dark .button.is-success.is-inverted.is-outlined.is-focused{background-color:#fff;color:#008438}html.theme--documenter-dark .button.is-success.is-inverted.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-success.is-inverted.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-success.is-inverted.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-success.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #008438 #008438 !important}html.theme--documenter-dark .button.is-success.is-inverted.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-success.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}html.theme--documenter-dark .button.is-success.is-light{background-color:#ebfff3;color:#00eb64}html.theme--documenter-dark .button.is-success.is-light:hover,html.theme--documenter-dark .button.is-success.is-light.is-hovered{background-color:#deffec;border-color:transparent;color:#00eb64}html.theme--documenter-dark .button.is-success.is-light:active,html.theme--documenter-dark .button.is-success.is-light.is-active{background-color:#d1ffe5;border-color:transparent;color:#00eb64}html.theme--documenter-dark .button.is-warning{background-color:#ad8100;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-warning:hover,html.theme--documenter-dark .button.is-warning.is-hovered{background-color:#a07700;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-warning:focus,html.theme--documenter-dark .button.is-warning.is-focused{border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-warning:focus:not(:active),html.theme--documenter-dark .button.is-warning.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(173,129,0,0.25)}html.theme--documenter-dark .button.is-warning:active,html.theme--documenter-dark .button.is-warning.is-active{background-color:#946e00;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-warning[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-warning{background-color:#ad8100;border-color:#ad8100;box-shadow:none}html.theme--documenter-dark .button.is-warning.is-inverted{background-color:#fff;color:#ad8100}html.theme--documenter-dark .button.is-warning.is-inverted:hover,html.theme--documenter-dark .button.is-warning.is-inverted.is-hovered{background-color:#f2f2f2}html.theme--documenter-dark .button.is-warning.is-inverted[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-warning.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#ad8100}html.theme--documenter-dark .button.is-warning.is-loading::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-warning.is-outlined{background-color:transparent;border-color:#ad8100;color:#ad8100}html.theme--documenter-dark .button.is-warning.is-outlined:hover,html.theme--documenter-dark .button.is-warning.is-outlined.is-hovered,html.theme--documenter-dark .button.is-warning.is-outlined:focus,html.theme--documenter-dark .button.is-warning.is-outlined.is-focused{background-color:#ad8100;border-color:#ad8100;color:#fff}html.theme--documenter-dark .button.is-warning.is-outlined.is-loading::after{border-color:transparent transparent #ad8100 #ad8100 !important}html.theme--documenter-dark .button.is-warning.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-warning.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-warning.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-warning.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-warning.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-warning.is-outlined{background-color:transparent;border-color:#ad8100;box-shadow:none;color:#ad8100}html.theme--documenter-dark .button.is-warning.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}html.theme--documenter-dark .button.is-warning.is-inverted.is-outlined:hover,html.theme--documenter-dark .button.is-warning.is-inverted.is-outlined.is-hovered,html.theme--documenter-dark .button.is-warning.is-inverted.is-outlined:focus,html.theme--documenter-dark .button.is-warning.is-inverted.is-outlined.is-focused{background-color:#fff;color:#ad8100}html.theme--documenter-dark .button.is-warning.is-inverted.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-warning.is-inverted.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-warning.is-inverted.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-warning.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #ad8100 #ad8100 !important}html.theme--documenter-dark .button.is-warning.is-inverted.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-warning.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}html.theme--documenter-dark .button.is-warning.is-light{background-color:#fffaeb;color:#d19c00}html.theme--documenter-dark .button.is-warning.is-light:hover,html.theme--documenter-dark .button.is-warning.is-light.is-hovered{background-color:#fff7de;border-color:transparent;color:#d19c00}html.theme--documenter-dark .button.is-warning.is-light:active,html.theme--documenter-dark .button.is-warning.is-light.is-active{background-color:#fff3d1;border-color:transparent;color:#d19c00}html.theme--documenter-dark .button.is-danger{background-color:#9e1b0d;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-danger:hover,html.theme--documenter-dark .button.is-danger.is-hovered{background-color:#92190c;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-danger:focus,html.theme--documenter-dark .button.is-danger.is-focused{border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-danger:focus:not(:active),html.theme--documenter-dark .button.is-danger.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(158,27,13,0.25)}html.theme--documenter-dark .button.is-danger:active,html.theme--documenter-dark .button.is-danger.is-active{background-color:#86170b;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-danger[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-danger{background-color:#9e1b0d;border-color:#9e1b0d;box-shadow:none}html.theme--documenter-dark .button.is-danger.is-inverted{background-color:#fff;color:#9e1b0d}html.theme--documenter-dark .button.is-danger.is-inverted:hover,html.theme--documenter-dark .button.is-danger.is-inverted.is-hovered{background-color:#f2f2f2}html.theme--documenter-dark .button.is-danger.is-inverted[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-danger.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#9e1b0d}html.theme--documenter-dark .button.is-danger.is-loading::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-danger.is-outlined{background-color:transparent;border-color:#9e1b0d;color:#9e1b0d}html.theme--documenter-dark .button.is-danger.is-outlined:hover,html.theme--documenter-dark .button.is-danger.is-outlined.is-hovered,html.theme--documenter-dark .button.is-danger.is-outlined:focus,html.theme--documenter-dark .button.is-danger.is-outlined.is-focused{background-color:#9e1b0d;border-color:#9e1b0d;color:#fff}html.theme--documenter-dark .button.is-danger.is-outlined.is-loading::after{border-color:transparent transparent #9e1b0d #9e1b0d !important}html.theme--documenter-dark .button.is-danger.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-danger.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-danger.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-danger.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-danger.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-danger.is-outlined{background-color:transparent;border-color:#9e1b0d;box-shadow:none;color:#9e1b0d}html.theme--documenter-dark .button.is-danger.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}html.theme--documenter-dark .button.is-danger.is-inverted.is-outlined:hover,html.theme--documenter-dark .button.is-danger.is-inverted.is-outlined.is-hovered,html.theme--documenter-dark .button.is-danger.is-inverted.is-outlined:focus,html.theme--documenter-dark .button.is-danger.is-inverted.is-outlined.is-focused{background-color:#fff;color:#9e1b0d}html.theme--documenter-dark .button.is-danger.is-inverted.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-danger.is-inverted.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-danger.is-inverted.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-danger.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #9e1b0d #9e1b0d !important}html.theme--documenter-dark .button.is-danger.is-inverted.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-danger.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}html.theme--documenter-dark .button.is-danger.is-light{background-color:#fdeeec;color:#ec311d}html.theme--documenter-dark .button.is-danger.is-light:hover,html.theme--documenter-dark .button.is-danger.is-light.is-hovered{background-color:#fce3e0;border-color:transparent;color:#ec311d}html.theme--documenter-dark .button.is-danger.is-light:active,html.theme--documenter-dark .button.is-danger.is-light.is-active{background-color:#fcd8d5;border-color:transparent;color:#ec311d}html.theme--documenter-dark .button.is-small,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.button{font-size:.75rem}html.theme--documenter-dark .button.is-small:not(.is-rounded),html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.button:not(.is-rounded){border-radius:3px}html.theme--documenter-dark .button.is-normal{font-size:1rem}html.theme--documenter-dark .button.is-medium{font-size:1.25rem}html.theme--documenter-dark .button.is-large{font-size:1.5rem}html.theme--documenter-dark .button[disabled],fieldset[disabled] html.theme--documenter-dark .button{background-color:#8c9b9d;border-color:#5e6d6f;box-shadow:none;opacity:.5}html.theme--documenter-dark .button.is-fullwidth{display:flex;width:100%}html.theme--documenter-dark .button.is-loading{color:transparent !important;pointer-events:none}html.theme--documenter-dark .button.is-loading::after{position:absolute;left:calc(50% - (1em * 0.5));top:calc(50% - (1em * 0.5));position:absolute !important}html.theme--documenter-dark .button.is-static{background-color:#282f2f;border-color:#5e6d6f;color:#dbdee0;box-shadow:none;pointer-events:none}html.theme--documenter-dark .button.is-rounded,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.button{border-radius:9999px;padding-left:calc(1em + 0.25em);padding-right:calc(1em + 0.25em)}html.theme--documenter-dark .buttons{align-items:center;display:flex;flex-wrap:wrap;justify-content:flex-start}html.theme--documenter-dark .buttons .button{margin-bottom:0.5rem}html.theme--documenter-dark .buttons .button:not(:last-child):not(.is-fullwidth){margin-right:.5rem}html.theme--documenter-dark .buttons:last-child{margin-bottom:-0.5rem}html.theme--documenter-dark .buttons:not(:last-child){margin-bottom:1rem}html.theme--documenter-dark .buttons.are-small .button:not(.is-normal):not(.is-medium):not(.is-large){font-size:.75rem}html.theme--documenter-dark .buttons.are-small .button:not(.is-normal):not(.is-medium):not(.is-large):not(.is-rounded){border-radius:3px}html.theme--documenter-dark .buttons.are-medium .button:not(.is-small):not(.is-normal):not(.is-large){font-size:1.25rem}html.theme--documenter-dark .buttons.are-large .button:not(.is-small):not(.is-normal):not(.is-medium){font-size:1.5rem}html.theme--documenter-dark .buttons.has-addons .button:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}html.theme--documenter-dark .buttons.has-addons .button:not(:last-child){border-bottom-right-radius:0;border-top-right-radius:0;margin-right:-1px}html.theme--documenter-dark .buttons.has-addons .button:last-child{margin-right:0}html.theme--documenter-dark .buttons.has-addons .button:hover,html.theme--documenter-dark .buttons.has-addons .button.is-hovered{z-index:2}html.theme--documenter-dark .buttons.has-addons .button:focus,html.theme--documenter-dark .buttons.has-addons .button.is-focused,html.theme--documenter-dark .buttons.has-addons .button:active,html.theme--documenter-dark .buttons.has-addons .button.is-active,html.theme--documenter-dark .buttons.has-addons .button.is-selected{z-index:3}html.theme--documenter-dark .buttons.has-addons .button:focus:hover,html.theme--documenter-dark .buttons.has-addons .button.is-focused:hover,html.theme--documenter-dark .buttons.has-addons .button:active:hover,html.theme--documenter-dark .buttons.has-addons .button.is-active:hover,html.theme--documenter-dark .buttons.has-addons .button.is-selected:hover{z-index:4}html.theme--documenter-dark .buttons.has-addons .button.is-expanded{flex-grow:1;flex-shrink:1}html.theme--documenter-dark .buttons.is-centered{justify-content:center}html.theme--documenter-dark .buttons.is-centered:not(.has-addons) .button:not(.is-fullwidth){margin-left:0.25rem;margin-right:0.25rem}html.theme--documenter-dark .buttons.is-right{justify-content:flex-end}html.theme--documenter-dark .buttons.is-right:not(.has-addons) .button:not(.is-fullwidth){margin-left:0.25rem;margin-right:0.25rem}@media screen and (max-width: 768px){html.theme--documenter-dark .button.is-responsive.is-small,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-responsive{font-size:.5625rem}html.theme--documenter-dark .button.is-responsive,html.theme--documenter-dark .button.is-responsive.is-normal{font-size:.65625rem}html.theme--documenter-dark .button.is-responsive.is-medium{font-size:.75rem}html.theme--documenter-dark .button.is-responsive.is-large{font-size:1rem}}@media screen and (min-width: 769px) and (max-width: 1055px){html.theme--documenter-dark .button.is-responsive.is-small,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-responsive{font-size:.65625rem}html.theme--documenter-dark .button.is-responsive,html.theme--documenter-dark .button.is-responsive.is-normal{font-size:.75rem}html.theme--documenter-dark .button.is-responsive.is-medium{font-size:1rem}html.theme--documenter-dark .button.is-responsive.is-large{font-size:1.25rem}}html.theme--documenter-dark .container{flex-grow:1;margin:0 auto;position:relative;width:auto}html.theme--documenter-dark .container.is-fluid{max-width:none !important;padding-left:32px;padding-right:32px;width:100%}@media screen and (min-width: 1056px){html.theme--documenter-dark .container{max-width:992px}}@media screen and (max-width: 1215px){html.theme--documenter-dark .container.is-widescreen:not(.is-max-desktop){max-width:1152px}}@media screen and (max-width: 1407px){html.theme--documenter-dark .container.is-fullhd:not(.is-max-desktop):not(.is-max-widescreen){max-width:1344px}}@media screen and (min-width: 1216px){html.theme--documenter-dark .container:not(.is-max-desktop){max-width:1152px}}@media screen and (min-width: 1408px){html.theme--documenter-dark .container:not(.is-max-desktop):not(.is-max-widescreen){max-width:1344px}}html.theme--documenter-dark .content li+li{margin-top:0.25em}html.theme--documenter-dark .content p:not(:last-child),html.theme--documenter-dark .content dl:not(:last-child),html.theme--documenter-dark .content ol:not(:last-child),html.theme--documenter-dark .content ul:not(:last-child),html.theme--documenter-dark .content blockquote:not(:last-child),html.theme--documenter-dark .content pre:not(:last-child),html.theme--documenter-dark .content table:not(:last-child){margin-bottom:1em}html.theme--documenter-dark .content h1,html.theme--documenter-dark .content h2,html.theme--documenter-dark .content h3,html.theme--documenter-dark .content h4,html.theme--documenter-dark .content h5,html.theme--documenter-dark .content h6{color:#f2f2f2;font-weight:600;line-height:1.125}html.theme--documenter-dark .content h1{font-size:2em;margin-bottom:0.5em}html.theme--documenter-dark .content h1:not(:first-child){margin-top:1em}html.theme--documenter-dark .content h2{font-size:1.75em;margin-bottom:0.5714em}html.theme--documenter-dark .content h2:not(:first-child){margin-top:1.1428em}html.theme--documenter-dark .content h3{font-size:1.5em;margin-bottom:0.6666em}html.theme--documenter-dark .content h3:not(:first-child){margin-top:1.3333em}html.theme--documenter-dark .content h4{font-size:1.25em;margin-bottom:0.8em}html.theme--documenter-dark .content h5{font-size:1.125em;margin-bottom:0.8888em}html.theme--documenter-dark .content h6{font-size:1em;margin-bottom:1em}html.theme--documenter-dark .content blockquote{background-color:#282f2f;border-left:5px solid #5e6d6f;padding:1.25em 1.5em}html.theme--documenter-dark .content ol{list-style-position:outside;margin-left:2em;margin-top:1em}html.theme--documenter-dark .content ol:not([type]){list-style-type:decimal}html.theme--documenter-dark .content ol.is-lower-alpha:not([type]){list-style-type:lower-alpha}html.theme--documenter-dark .content ol.is-lower-roman:not([type]){list-style-type:lower-roman}html.theme--documenter-dark .content ol.is-upper-alpha:not([type]){list-style-type:upper-alpha}html.theme--documenter-dark .content ol.is-upper-roman:not([type]){list-style-type:upper-roman}html.theme--documenter-dark .content ul{list-style:disc outside;margin-left:2em;margin-top:1em}html.theme--documenter-dark .content ul ul{list-style-type:circle;margin-top:0.5em}html.theme--documenter-dark .content ul ul ul{list-style-type:square}html.theme--documenter-dark .content dd{margin-left:2em}html.theme--documenter-dark .content figure{margin-left:2em;margin-right:2em;text-align:center}html.theme--documenter-dark .content figure:not(:first-child){margin-top:2em}html.theme--documenter-dark .content figure:not(:last-child){margin-bottom:2em}html.theme--documenter-dark .content figure img{display:inline-block}html.theme--documenter-dark .content figure figcaption{font-style:italic}html.theme--documenter-dark .content pre{-webkit-overflow-scrolling:touch;overflow-x:auto;padding:0;white-space:pre;word-wrap:normal}html.theme--documenter-dark .content sup,html.theme--documenter-dark .content sub{font-size:75%}html.theme--documenter-dark .content table{width:100%}html.theme--documenter-dark .content table td,html.theme--documenter-dark .content table th{border:1px solid #5e6d6f;border-width:0 0 1px;padding:0.5em 0.75em;vertical-align:top}html.theme--documenter-dark .content table th{color:#f2f2f2}html.theme--documenter-dark .content table th:not([align]){text-align:inherit}html.theme--documenter-dark .content table thead td,html.theme--documenter-dark .content table thead th{border-width:0 0 2px;color:#f2f2f2}html.theme--documenter-dark .content table tfoot td,html.theme--documenter-dark .content table tfoot th{border-width:2px 0 0;color:#f2f2f2}html.theme--documenter-dark .content table tbody tr:last-child td,html.theme--documenter-dark .content table tbody tr:last-child th{border-bottom-width:0}html.theme--documenter-dark .content .tabs li+li{margin-top:0}html.theme--documenter-dark .content.is-small,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.content{font-size:.75rem}html.theme--documenter-dark .content.is-normal{font-size:1rem}html.theme--documenter-dark .content.is-medium{font-size:1.25rem}html.theme--documenter-dark .content.is-large{font-size:1.5rem}html.theme--documenter-dark .icon{align-items:center;display:inline-flex;justify-content:center;height:1.5rem;width:1.5rem}html.theme--documenter-dark .icon.is-small,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.icon{height:1rem;width:1rem}html.theme--documenter-dark .icon.is-medium{height:2rem;width:2rem}html.theme--documenter-dark .icon.is-large{height:3rem;width:3rem}html.theme--documenter-dark .icon-text{align-items:flex-start;color:inherit;display:inline-flex;flex-wrap:wrap;line-height:1.5rem;vertical-align:top}html.theme--documenter-dark .icon-text .icon{flex-grow:0;flex-shrink:0}html.theme--documenter-dark .icon-text .icon:not(:last-child){margin-right:.25em}html.theme--documenter-dark .icon-text .icon:not(:first-child){margin-left:.25em}html.theme--documenter-dark div.icon-text{display:flex}html.theme--documenter-dark .image,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img{display:block;position:relative}html.theme--documenter-dark .image img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img img{display:block;height:auto;width:100%}html.theme--documenter-dark .image img.is-rounded,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img img.is-rounded{border-radius:9999px}html.theme--documenter-dark .image.is-fullwidth,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-fullwidth{width:100%}html.theme--documenter-dark .image.is-square img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-square img,html.theme--documenter-dark .image.is-square .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-square .has-ratio,html.theme--documenter-dark .image.is-1by1 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-1by1 img,html.theme--documenter-dark .image.is-1by1 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-1by1 .has-ratio,html.theme--documenter-dark .image.is-5by4 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-5by4 img,html.theme--documenter-dark .image.is-5by4 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-5by4 .has-ratio,html.theme--documenter-dark .image.is-4by3 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-4by3 img,html.theme--documenter-dark .image.is-4by3 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-4by3 .has-ratio,html.theme--documenter-dark .image.is-3by2 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by2 img,html.theme--documenter-dark .image.is-3by2 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by2 .has-ratio,html.theme--documenter-dark .image.is-5by3 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-5by3 img,html.theme--documenter-dark .image.is-5by3 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-5by3 .has-ratio,html.theme--documenter-dark .image.is-16by9 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-16by9 img,html.theme--documenter-dark .image.is-16by9 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-16by9 .has-ratio,html.theme--documenter-dark .image.is-2by1 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-2by1 img,html.theme--documenter-dark .image.is-2by1 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-2by1 .has-ratio,html.theme--documenter-dark .image.is-3by1 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by1 img,html.theme--documenter-dark .image.is-3by1 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by1 .has-ratio,html.theme--documenter-dark .image.is-4by5 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-4by5 img,html.theme--documenter-dark .image.is-4by5 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-4by5 .has-ratio,html.theme--documenter-dark .image.is-3by4 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by4 img,html.theme--documenter-dark .image.is-3by4 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by4 .has-ratio,html.theme--documenter-dark .image.is-2by3 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-2by3 img,html.theme--documenter-dark .image.is-2by3 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-2by3 .has-ratio,html.theme--documenter-dark .image.is-3by5 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by5 img,html.theme--documenter-dark .image.is-3by5 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by5 .has-ratio,html.theme--documenter-dark .image.is-9by16 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-9by16 img,html.theme--documenter-dark .image.is-9by16 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-9by16 .has-ratio,html.theme--documenter-dark .image.is-1by2 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-1by2 img,html.theme--documenter-dark .image.is-1by2 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-1by2 .has-ratio,html.theme--documenter-dark .image.is-1by3 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-1by3 img,html.theme--documenter-dark .image.is-1by3 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-1by3 .has-ratio{height:100%;width:100%}html.theme--documenter-dark .image.is-square,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-square,html.theme--documenter-dark .image.is-1by1,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-1by1{padding-top:100%}html.theme--documenter-dark .image.is-5by4,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-5by4{padding-top:80%}html.theme--documenter-dark .image.is-4by3,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-4by3{padding-top:75%}html.theme--documenter-dark .image.is-3by2,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by2{padding-top:66.6666%}html.theme--documenter-dark .image.is-5by3,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-5by3{padding-top:60%}html.theme--documenter-dark .image.is-16by9,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-16by9{padding-top:56.25%}html.theme--documenter-dark .image.is-2by1,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-2by1{padding-top:50%}html.theme--documenter-dark .image.is-3by1,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by1{padding-top:33.3333%}html.theme--documenter-dark .image.is-4by5,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-4by5{padding-top:125%}html.theme--documenter-dark .image.is-3by4,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by4{padding-top:133.3333%}html.theme--documenter-dark .image.is-2by3,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-2by3{padding-top:150%}html.theme--documenter-dark .image.is-3by5,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by5{padding-top:166.6666%}html.theme--documenter-dark .image.is-9by16,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-9by16{padding-top:177.7777%}html.theme--documenter-dark .image.is-1by2,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-1by2{padding-top:200%}html.theme--documenter-dark .image.is-1by3,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-1by3{padding-top:300%}html.theme--documenter-dark .image.is-16x16,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-16x16{height:16px;width:16px}html.theme--documenter-dark .image.is-24x24,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-24x24{height:24px;width:24px}html.theme--documenter-dark .image.is-32x32,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-32x32{height:32px;width:32px}html.theme--documenter-dark .image.is-48x48,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-48x48{height:48px;width:48px}html.theme--documenter-dark .image.is-64x64,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-64x64{height:64px;width:64px}html.theme--documenter-dark .image.is-96x96,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-96x96{height:96px;width:96px}html.theme--documenter-dark .image.is-128x128,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-128x128{height:128px;width:128px}html.theme--documenter-dark .notification{background-color:#282f2f;border-radius:.4em;position:relative;padding:1.25rem 2.5rem 1.25rem 1.5rem}html.theme--documenter-dark .notification a:not(.button):not(.dropdown-item){color:currentColor;text-decoration:underline}html.theme--documenter-dark .notification strong{color:currentColor}html.theme--documenter-dark .notification code,html.theme--documenter-dark .notification pre{background:#fff}html.theme--documenter-dark .notification pre code{background:transparent}html.theme--documenter-dark .notification>.delete{right:.5rem;position:absolute;top:0.5rem}html.theme--documenter-dark .notification .title,html.theme--documenter-dark .notification .subtitle,html.theme--documenter-dark .notification .content{color:currentColor}html.theme--documenter-dark .notification.is-white{background-color:#fff;color:#0a0a0a}html.theme--documenter-dark .notification.is-black{background-color:#0a0a0a;color:#fff}html.theme--documenter-dark .notification.is-light{background-color:#ecf0f1;color:rgba(0,0,0,0.7)}html.theme--documenter-dark .notification.is-dark,html.theme--documenter-dark .content kbd.notification{background-color:#282f2f;color:#fff}html.theme--documenter-dark .notification.is-primary,html.theme--documenter-dark .docstring>section>a.notification.docs-sourcelink{background-color:#375a7f;color:#fff}html.theme--documenter-dark .notification.is-primary.is-light,html.theme--documenter-dark .docstring>section>a.notification.is-light.docs-sourcelink{background-color:#f1f5f9;color:#4d7eb2}html.theme--documenter-dark .notification.is-link{background-color:#1abc9c;color:#fff}html.theme--documenter-dark .notification.is-link.is-light{background-color:#edfdf9;color:#15987e}html.theme--documenter-dark .notification.is-info{background-color:#024c7d;color:#fff}html.theme--documenter-dark .notification.is-info.is-light{background-color:#ebf7ff;color:#0e9dfb}html.theme--documenter-dark .notification.is-success{background-color:#008438;color:#fff}html.theme--documenter-dark .notification.is-success.is-light{background-color:#ebfff3;color:#00eb64}html.theme--documenter-dark .notification.is-warning{background-color:#ad8100;color:#fff}html.theme--documenter-dark .notification.is-warning.is-light{background-color:#fffaeb;color:#d19c00}html.theme--documenter-dark .notification.is-danger{background-color:#9e1b0d;color:#fff}html.theme--documenter-dark .notification.is-danger.is-light{background-color:#fdeeec;color:#ec311d}html.theme--documenter-dark .progress{-moz-appearance:none;-webkit-appearance:none;border:none;border-radius:9999px;display:block;height:1rem;overflow:hidden;padding:0;width:100%}html.theme--documenter-dark .progress::-webkit-progress-bar{background-color:#343c3d}html.theme--documenter-dark .progress::-webkit-progress-value{background-color:#dbdee0}html.theme--documenter-dark .progress::-moz-progress-bar{background-color:#dbdee0}html.theme--documenter-dark .progress::-ms-fill{background-color:#dbdee0;border:none}html.theme--documenter-dark .progress.is-white::-webkit-progress-value{background-color:#fff}html.theme--documenter-dark .progress.is-white::-moz-progress-bar{background-color:#fff}html.theme--documenter-dark .progress.is-white::-ms-fill{background-color:#fff}html.theme--documenter-dark .progress.is-white:indeterminate{background-image:linear-gradient(to right, #fff 30%, #343c3d 30%)}html.theme--documenter-dark .progress.is-black::-webkit-progress-value{background-color:#0a0a0a}html.theme--documenter-dark .progress.is-black::-moz-progress-bar{background-color:#0a0a0a}html.theme--documenter-dark .progress.is-black::-ms-fill{background-color:#0a0a0a}html.theme--documenter-dark .progress.is-black:indeterminate{background-image:linear-gradient(to right, #0a0a0a 30%, #343c3d 30%)}html.theme--documenter-dark .progress.is-light::-webkit-progress-value{background-color:#ecf0f1}html.theme--documenter-dark .progress.is-light::-moz-progress-bar{background-color:#ecf0f1}html.theme--documenter-dark .progress.is-light::-ms-fill{background-color:#ecf0f1}html.theme--documenter-dark .progress.is-light:indeterminate{background-image:linear-gradient(to right, #ecf0f1 30%, #343c3d 30%)}html.theme--documenter-dark .progress.is-dark::-webkit-progress-value,html.theme--documenter-dark .content kbd.progress::-webkit-progress-value{background-color:#282f2f}html.theme--documenter-dark .progress.is-dark::-moz-progress-bar,html.theme--documenter-dark .content kbd.progress::-moz-progress-bar{background-color:#282f2f}html.theme--documenter-dark .progress.is-dark::-ms-fill,html.theme--documenter-dark .content kbd.progress::-ms-fill{background-color:#282f2f}html.theme--documenter-dark .progress.is-dark:indeterminate,html.theme--documenter-dark .content kbd.progress:indeterminate{background-image:linear-gradient(to right, #282f2f 30%, #343c3d 30%)}html.theme--documenter-dark .progress.is-primary::-webkit-progress-value,html.theme--documenter-dark .docstring>section>a.progress.docs-sourcelink::-webkit-progress-value{background-color:#375a7f}html.theme--documenter-dark .progress.is-primary::-moz-progress-bar,html.theme--documenter-dark .docstring>section>a.progress.docs-sourcelink::-moz-progress-bar{background-color:#375a7f}html.theme--documenter-dark .progress.is-primary::-ms-fill,html.theme--documenter-dark .docstring>section>a.progress.docs-sourcelink::-ms-fill{background-color:#375a7f}html.theme--documenter-dark .progress.is-primary:indeterminate,html.theme--documenter-dark .docstring>section>a.progress.docs-sourcelink:indeterminate{background-image:linear-gradient(to right, #375a7f 30%, #343c3d 30%)}html.theme--documenter-dark .progress.is-link::-webkit-progress-value{background-color:#1abc9c}html.theme--documenter-dark .progress.is-link::-moz-progress-bar{background-color:#1abc9c}html.theme--documenter-dark .progress.is-link::-ms-fill{background-color:#1abc9c}html.theme--documenter-dark .progress.is-link:indeterminate{background-image:linear-gradient(to right, #1abc9c 30%, #343c3d 30%)}html.theme--documenter-dark .progress.is-info::-webkit-progress-value{background-color:#024c7d}html.theme--documenter-dark .progress.is-info::-moz-progress-bar{background-color:#024c7d}html.theme--documenter-dark .progress.is-info::-ms-fill{background-color:#024c7d}html.theme--documenter-dark .progress.is-info:indeterminate{background-image:linear-gradient(to right, #024c7d 30%, #343c3d 30%)}html.theme--documenter-dark .progress.is-success::-webkit-progress-value{background-color:#008438}html.theme--documenter-dark .progress.is-success::-moz-progress-bar{background-color:#008438}html.theme--documenter-dark .progress.is-success::-ms-fill{background-color:#008438}html.theme--documenter-dark .progress.is-success:indeterminate{background-image:linear-gradient(to right, #008438 30%, #343c3d 30%)}html.theme--documenter-dark .progress.is-warning::-webkit-progress-value{background-color:#ad8100}html.theme--documenter-dark .progress.is-warning::-moz-progress-bar{background-color:#ad8100}html.theme--documenter-dark .progress.is-warning::-ms-fill{background-color:#ad8100}html.theme--documenter-dark .progress.is-warning:indeterminate{background-image:linear-gradient(to right, #ad8100 30%, #343c3d 30%)}html.theme--documenter-dark .progress.is-danger::-webkit-progress-value{background-color:#9e1b0d}html.theme--documenter-dark .progress.is-danger::-moz-progress-bar{background-color:#9e1b0d}html.theme--documenter-dark .progress.is-danger::-ms-fill{background-color:#9e1b0d}html.theme--documenter-dark .progress.is-danger:indeterminate{background-image:linear-gradient(to right, #9e1b0d 30%, #343c3d 30%)}html.theme--documenter-dark .progress:indeterminate{animation-duration:1.5s;animation-iteration-count:infinite;animation-name:moveIndeterminate;animation-timing-function:linear;background-color:#343c3d;background-image:linear-gradient(to right, #fff 30%, #343c3d 30%);background-position:top left;background-repeat:no-repeat;background-size:150% 150%}html.theme--documenter-dark .progress:indeterminate::-webkit-progress-bar{background-color:transparent}html.theme--documenter-dark .progress:indeterminate::-moz-progress-bar{background-color:transparent}html.theme--documenter-dark .progress:indeterminate::-ms-fill{animation-name:none}html.theme--documenter-dark .progress.is-small,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.progress{height:.75rem}html.theme--documenter-dark .progress.is-medium{height:1.25rem}html.theme--documenter-dark .progress.is-large{height:1.5rem}@keyframes moveIndeterminate{from{background-position:200% 0}to{background-position:-200% 0}}html.theme--documenter-dark .table{background-color:#343c3d;color:#fff}html.theme--documenter-dark .table td,html.theme--documenter-dark .table th{border:1px solid #5e6d6f;border-width:0 0 1px;padding:0.5em 0.75em;vertical-align:top}html.theme--documenter-dark .table td.is-white,html.theme--documenter-dark .table th.is-white{background-color:#fff;border-color:#fff;color:#0a0a0a}html.theme--documenter-dark .table td.is-black,html.theme--documenter-dark .table th.is-black{background-color:#0a0a0a;border-color:#0a0a0a;color:#fff}html.theme--documenter-dark .table td.is-light,html.theme--documenter-dark .table th.is-light{background-color:#ecf0f1;border-color:#ecf0f1;color:rgba(0,0,0,0.7)}html.theme--documenter-dark .table td.is-dark,html.theme--documenter-dark .table th.is-dark{background-color:#282f2f;border-color:#282f2f;color:#fff}html.theme--documenter-dark .table td.is-primary,html.theme--documenter-dark .table th.is-primary{background-color:#375a7f;border-color:#375a7f;color:#fff}html.theme--documenter-dark .table td.is-link,html.theme--documenter-dark .table th.is-link{background-color:#1abc9c;border-color:#1abc9c;color:#fff}html.theme--documenter-dark .table td.is-info,html.theme--documenter-dark .table th.is-info{background-color:#024c7d;border-color:#024c7d;color:#fff}html.theme--documenter-dark .table td.is-success,html.theme--documenter-dark .table th.is-success{background-color:#008438;border-color:#008438;color:#fff}html.theme--documenter-dark .table td.is-warning,html.theme--documenter-dark .table th.is-warning{background-color:#ad8100;border-color:#ad8100;color:#fff}html.theme--documenter-dark .table td.is-danger,html.theme--documenter-dark .table th.is-danger{background-color:#9e1b0d;border-color:#9e1b0d;color:#fff}html.theme--documenter-dark .table td.is-narrow,html.theme--documenter-dark .table th.is-narrow{white-space:nowrap;width:1%}html.theme--documenter-dark .table td.is-selected,html.theme--documenter-dark .table th.is-selected{background-color:#375a7f;color:#fff}html.theme--documenter-dark .table td.is-selected a,html.theme--documenter-dark .table td.is-selected strong,html.theme--documenter-dark .table th.is-selected a,html.theme--documenter-dark .table th.is-selected strong{color:currentColor}html.theme--documenter-dark .table td.is-vcentered,html.theme--documenter-dark .table th.is-vcentered{vertical-align:middle}html.theme--documenter-dark .table th{color:#f2f2f2}html.theme--documenter-dark .table th:not([align]){text-align:left}html.theme--documenter-dark .table tr.is-selected{background-color:#375a7f;color:#fff}html.theme--documenter-dark .table tr.is-selected a,html.theme--documenter-dark .table tr.is-selected strong{color:currentColor}html.theme--documenter-dark .table tr.is-selected td,html.theme--documenter-dark .table tr.is-selected th{border-color:#fff;color:currentColor}html.theme--documenter-dark .table thead{background-color:rgba(0,0,0,0)}html.theme--documenter-dark .table thead td,html.theme--documenter-dark .table thead th{border-width:0 0 2px;color:#f2f2f2}html.theme--documenter-dark .table tfoot{background-color:rgba(0,0,0,0)}html.theme--documenter-dark .table tfoot td,html.theme--documenter-dark .table tfoot th{border-width:2px 0 0;color:#f2f2f2}html.theme--documenter-dark .table tbody{background-color:rgba(0,0,0,0)}html.theme--documenter-dark .table tbody tr:last-child td,html.theme--documenter-dark .table tbody tr:last-child th{border-bottom-width:0}html.theme--documenter-dark .table.is-bordered td,html.theme--documenter-dark .table.is-bordered th{border-width:1px}html.theme--documenter-dark .table.is-bordered tr:last-child td,html.theme--documenter-dark .table.is-bordered tr:last-child th{border-bottom-width:1px}html.theme--documenter-dark .table.is-fullwidth{width:100%}html.theme--documenter-dark .table.is-hoverable tbody tr:not(.is-selected):hover{background-color:#282f2f}html.theme--documenter-dark .table.is-hoverable.is-striped tbody tr:not(.is-selected):hover{background-color:#282f2f}html.theme--documenter-dark .table.is-hoverable.is-striped tbody tr:not(.is-selected):hover:nth-child(even){background-color:#2d3435}html.theme--documenter-dark .table.is-narrow td,html.theme--documenter-dark .table.is-narrow th{padding:0.25em 0.5em}html.theme--documenter-dark .table.is-striped tbody tr:not(.is-selected):nth-child(even){background-color:#282f2f}html.theme--documenter-dark .table-container{-webkit-overflow-scrolling:touch;overflow:auto;overflow-y:hidden;max-width:100%}html.theme--documenter-dark .tags{align-items:center;display:flex;flex-wrap:wrap;justify-content:flex-start}html.theme--documenter-dark .tags .tag,html.theme--documenter-dark .tags .content kbd,html.theme--documenter-dark .content .tags kbd,html.theme--documenter-dark .tags .docstring>section>a.docs-sourcelink{margin-bottom:0.5rem}html.theme--documenter-dark .tags .tag:not(:last-child),html.theme--documenter-dark .tags .content kbd:not(:last-child),html.theme--documenter-dark .content .tags kbd:not(:last-child),html.theme--documenter-dark .tags .docstring>section>a.docs-sourcelink:not(:last-child){margin-right:.5rem}html.theme--documenter-dark .tags:last-child{margin-bottom:-0.5rem}html.theme--documenter-dark .tags:not(:last-child){margin-bottom:1rem}html.theme--documenter-dark .tags.are-medium .tag:not(.is-normal):not(.is-large),html.theme--documenter-dark .tags.are-medium .content kbd:not(.is-normal):not(.is-large),html.theme--documenter-dark .content .tags.are-medium kbd:not(.is-normal):not(.is-large),html.theme--documenter-dark .tags.are-medium .docstring>section>a.docs-sourcelink:not(.is-normal):not(.is-large){font-size:1rem}html.theme--documenter-dark .tags.are-large .tag:not(.is-normal):not(.is-medium),html.theme--documenter-dark .tags.are-large .content kbd:not(.is-normal):not(.is-medium),html.theme--documenter-dark .content .tags.are-large kbd:not(.is-normal):not(.is-medium),html.theme--documenter-dark .tags.are-large .docstring>section>a.docs-sourcelink:not(.is-normal):not(.is-medium){font-size:1.25rem}html.theme--documenter-dark .tags.is-centered{justify-content:center}html.theme--documenter-dark .tags.is-centered .tag,html.theme--documenter-dark .tags.is-centered .content kbd,html.theme--documenter-dark .content .tags.is-centered kbd,html.theme--documenter-dark .tags.is-centered .docstring>section>a.docs-sourcelink{margin-right:0.25rem;margin-left:0.25rem}html.theme--documenter-dark .tags.is-right{justify-content:flex-end}html.theme--documenter-dark .tags.is-right .tag:not(:first-child),html.theme--documenter-dark .tags.is-right .content kbd:not(:first-child),html.theme--documenter-dark .content .tags.is-right kbd:not(:first-child),html.theme--documenter-dark .tags.is-right .docstring>section>a.docs-sourcelink:not(:first-child){margin-left:0.5rem}html.theme--documenter-dark .tags.is-right .tag:not(:last-child),html.theme--documenter-dark .tags.is-right .content kbd:not(:last-child),html.theme--documenter-dark .content .tags.is-right kbd:not(:last-child),html.theme--documenter-dark .tags.is-right .docstring>section>a.docs-sourcelink:not(:last-child){margin-right:0}html.theme--documenter-dark .tags.has-addons .tag,html.theme--documenter-dark .tags.has-addons .content kbd,html.theme--documenter-dark .content .tags.has-addons kbd,html.theme--documenter-dark .tags.has-addons .docstring>section>a.docs-sourcelink{margin-right:0}html.theme--documenter-dark .tags.has-addons .tag:not(:first-child),html.theme--documenter-dark .tags.has-addons .content kbd:not(:first-child),html.theme--documenter-dark .content .tags.has-addons kbd:not(:first-child),html.theme--documenter-dark .tags.has-addons .docstring>section>a.docs-sourcelink:not(:first-child){margin-left:0;border-top-left-radius:0;border-bottom-left-radius:0}html.theme--documenter-dark .tags.has-addons .tag:not(:last-child),html.theme--documenter-dark .tags.has-addons .content kbd:not(:last-child),html.theme--documenter-dark .content .tags.has-addons kbd:not(:last-child),html.theme--documenter-dark .tags.has-addons .docstring>section>a.docs-sourcelink:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}html.theme--documenter-dark .tag:not(body),html.theme--documenter-dark .content kbd:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink:not(body){align-items:center;background-color:#282f2f;border-radius:.4em;color:#fff;display:inline-flex;font-size:.75rem;height:2em;justify-content:center;line-height:1.5;padding-left:0.75em;padding-right:0.75em;white-space:nowrap}html.theme--documenter-dark .tag:not(body) .delete,html.theme--documenter-dark .content kbd:not(body) .delete,html.theme--documenter-dark .docstring>section>a.docs-sourcelink:not(body) .delete{margin-left:.25rem;margin-right:-.375rem}html.theme--documenter-dark .tag.is-white:not(body),html.theme--documenter-dark .content kbd.is-white:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-white:not(body){background-color:#fff;color:#0a0a0a}html.theme--documenter-dark .tag.is-black:not(body),html.theme--documenter-dark .content kbd.is-black:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-black:not(body){background-color:#0a0a0a;color:#fff}html.theme--documenter-dark .tag.is-light:not(body),html.theme--documenter-dark .content kbd.is-light:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-light:not(body){background-color:#ecf0f1;color:rgba(0,0,0,0.7)}html.theme--documenter-dark .tag.is-dark:not(body),html.theme--documenter-dark .content kbd:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-dark:not(body),html.theme--documenter-dark .content .docstring>section>kbd:not(body){background-color:#282f2f;color:#fff}html.theme--documenter-dark .tag.is-primary:not(body),html.theme--documenter-dark .content kbd.is-primary:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink:not(body){background-color:#375a7f;color:#fff}html.theme--documenter-dark .tag.is-primary.is-light:not(body),html.theme--documenter-dark .content kbd.is-primary.is-light:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-light:not(body){background-color:#f1f5f9;color:#4d7eb2}html.theme--documenter-dark .tag.is-link:not(body),html.theme--documenter-dark .content kbd.is-link:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-link:not(body){background-color:#1abc9c;color:#fff}html.theme--documenter-dark .tag.is-link.is-light:not(body),html.theme--documenter-dark .content kbd.is-link.is-light:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-link.is-light:not(body){background-color:#edfdf9;color:#15987e}html.theme--documenter-dark .tag.is-info:not(body),html.theme--documenter-dark .content kbd.is-info:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-info:not(body){background-color:#024c7d;color:#fff}html.theme--documenter-dark .tag.is-info.is-light:not(body),html.theme--documenter-dark .content kbd.is-info.is-light:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-info.is-light:not(body){background-color:#ebf7ff;color:#0e9dfb}html.theme--documenter-dark .tag.is-success:not(body),html.theme--documenter-dark .content kbd.is-success:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-success:not(body){background-color:#008438;color:#fff}html.theme--documenter-dark .tag.is-success.is-light:not(body),html.theme--documenter-dark .content kbd.is-success.is-light:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-success.is-light:not(body){background-color:#ebfff3;color:#00eb64}html.theme--documenter-dark .tag.is-warning:not(body),html.theme--documenter-dark .content kbd.is-warning:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-warning:not(body){background-color:#ad8100;color:#fff}html.theme--documenter-dark .tag.is-warning.is-light:not(body),html.theme--documenter-dark .content kbd.is-warning.is-light:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-warning.is-light:not(body){background-color:#fffaeb;color:#d19c00}html.theme--documenter-dark .tag.is-danger:not(body),html.theme--documenter-dark .content kbd.is-danger:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-danger:not(body){background-color:#9e1b0d;color:#fff}html.theme--documenter-dark .tag.is-danger.is-light:not(body),html.theme--documenter-dark .content kbd.is-danger.is-light:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-danger.is-light:not(body){background-color:#fdeeec;color:#ec311d}html.theme--documenter-dark .tag.is-normal:not(body),html.theme--documenter-dark .content kbd.is-normal:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-normal:not(body){font-size:.75rem}html.theme--documenter-dark .tag.is-medium:not(body),html.theme--documenter-dark .content kbd.is-medium:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-medium:not(body){font-size:1rem}html.theme--documenter-dark .tag.is-large:not(body),html.theme--documenter-dark .content kbd.is-large:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-large:not(body){font-size:1.25rem}html.theme--documenter-dark .tag:not(body) .icon:first-child:not(:last-child),html.theme--documenter-dark .content kbd:not(body) .icon:first-child:not(:last-child),html.theme--documenter-dark .docstring>section>a.docs-sourcelink:not(body) .icon:first-child:not(:last-child){margin-left:-.375em;margin-right:.1875em}html.theme--documenter-dark .tag:not(body) .icon:last-child:not(:first-child),html.theme--documenter-dark .content kbd:not(body) .icon:last-child:not(:first-child),html.theme--documenter-dark .docstring>section>a.docs-sourcelink:not(body) .icon:last-child:not(:first-child){margin-left:.1875em;margin-right:-.375em}html.theme--documenter-dark .tag:not(body) .icon:first-child:last-child,html.theme--documenter-dark .content kbd:not(body) .icon:first-child:last-child,html.theme--documenter-dark .docstring>section>a.docs-sourcelink:not(body) .icon:first-child:last-child{margin-left:-.375em;margin-right:-.375em}html.theme--documenter-dark .tag.is-delete:not(body),html.theme--documenter-dark .content kbd.is-delete:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-delete:not(body){margin-left:1px;padding:0;position:relative;width:2em}html.theme--documenter-dark .tag.is-delete:not(body)::before,html.theme--documenter-dark .content kbd.is-delete:not(body)::before,html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-delete:not(body)::before,html.theme--documenter-dark .tag.is-delete:not(body)::after,html.theme--documenter-dark .content kbd.is-delete:not(body)::after,html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-delete:not(body)::after{background-color:currentColor;content:"";display:block;left:50%;position:absolute;top:50%;transform:translateX(-50%) translateY(-50%) rotate(45deg);transform-origin:center center}html.theme--documenter-dark .tag.is-delete:not(body)::before,html.theme--documenter-dark .content kbd.is-delete:not(body)::before,html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-delete:not(body)::before{height:1px;width:50%}html.theme--documenter-dark .tag.is-delete:not(body)::after,html.theme--documenter-dark .content kbd.is-delete:not(body)::after,html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-delete:not(body)::after{height:50%;width:1px}html.theme--documenter-dark .tag.is-delete:not(body):hover,html.theme--documenter-dark .content kbd.is-delete:not(body):hover,html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-delete:not(body):hover,html.theme--documenter-dark .tag.is-delete:not(body):focus,html.theme--documenter-dark .content kbd.is-delete:not(body):focus,html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-delete:not(body):focus{background-color:#1d2122}html.theme--documenter-dark .tag.is-delete:not(body):active,html.theme--documenter-dark .content kbd.is-delete:not(body):active,html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-delete:not(body):active{background-color:#111414}html.theme--documenter-dark .tag.is-rounded:not(body),html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input:not(body),html.theme--documenter-dark .content kbd.is-rounded:not(body),html.theme--documenter-dark #documenter .docs-sidebar .content form.docs-search>input:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-rounded:not(body){border-radius:9999px}html.theme--documenter-dark a.tag:hover,html.theme--documenter-dark .docstring>section>a.docs-sourcelink:hover{text-decoration:underline}html.theme--documenter-dark .title,html.theme--documenter-dark .subtitle{word-break:break-word}html.theme--documenter-dark .title em,html.theme--documenter-dark .title span,html.theme--documenter-dark .subtitle em,html.theme--documenter-dark .subtitle span{font-weight:inherit}html.theme--documenter-dark .title sub,html.theme--documenter-dark .subtitle sub{font-size:.75em}html.theme--documenter-dark .title sup,html.theme--documenter-dark .subtitle sup{font-size:.75em}html.theme--documenter-dark .title .tag,html.theme--documenter-dark .title .content kbd,html.theme--documenter-dark .content .title kbd,html.theme--documenter-dark .title .docstring>section>a.docs-sourcelink,html.theme--documenter-dark .subtitle .tag,html.theme--documenter-dark .subtitle .content kbd,html.theme--documenter-dark .content .subtitle kbd,html.theme--documenter-dark .subtitle .docstring>section>a.docs-sourcelink{vertical-align:middle}html.theme--documenter-dark .title{color:#fff;font-size:2rem;font-weight:500;line-height:1.125}html.theme--documenter-dark .title strong{color:inherit;font-weight:inherit}html.theme--documenter-dark .title:not(.is-spaced)+.subtitle{margin-top:-1.25rem}html.theme--documenter-dark .title.is-1{font-size:3rem}html.theme--documenter-dark .title.is-2{font-size:2.5rem}html.theme--documenter-dark .title.is-3{font-size:2rem}html.theme--documenter-dark .title.is-4{font-size:1.5rem}html.theme--documenter-dark .title.is-5{font-size:1.25rem}html.theme--documenter-dark .title.is-6{font-size:1rem}html.theme--documenter-dark .title.is-7{font-size:.75rem}html.theme--documenter-dark .subtitle{color:#8c9b9d;font-size:1.25rem;font-weight:400;line-height:1.25}html.theme--documenter-dark .subtitle strong{color:#8c9b9d;font-weight:600}html.theme--documenter-dark .subtitle:not(.is-spaced)+.title{margin-top:-1.25rem}html.theme--documenter-dark .subtitle.is-1{font-size:3rem}html.theme--documenter-dark .subtitle.is-2{font-size:2.5rem}html.theme--documenter-dark .subtitle.is-3{font-size:2rem}html.theme--documenter-dark .subtitle.is-4{font-size:1.5rem}html.theme--documenter-dark .subtitle.is-5{font-size:1.25rem}html.theme--documenter-dark .subtitle.is-6{font-size:1rem}html.theme--documenter-dark .subtitle.is-7{font-size:.75rem}html.theme--documenter-dark .heading{display:block;font-size:11px;letter-spacing:1px;margin-bottom:5px;text-transform:uppercase}html.theme--documenter-dark .number{align-items:center;background-color:#282f2f;border-radius:9999px;display:inline-flex;font-size:1.25rem;height:2em;justify-content:center;margin-right:1.5rem;min-width:2.5em;padding:0.25rem 0.5rem;text-align:center;vertical-align:top}html.theme--documenter-dark .select select,html.theme--documenter-dark .textarea,html.theme--documenter-dark .input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input{background-color:#1f2424;border-color:#5e6d6f;border-radius:.4em;color:#dbdee0}html.theme--documenter-dark .select select::-moz-placeholder,html.theme--documenter-dark .textarea::-moz-placeholder,html.theme--documenter-dark .input::-moz-placeholder,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input::-moz-placeholder{color:#868c98}html.theme--documenter-dark .select select::-webkit-input-placeholder,html.theme--documenter-dark .textarea::-webkit-input-placeholder,html.theme--documenter-dark .input::-webkit-input-placeholder,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input::-webkit-input-placeholder{color:#868c98}html.theme--documenter-dark .select select:-moz-placeholder,html.theme--documenter-dark .textarea:-moz-placeholder,html.theme--documenter-dark .input:-moz-placeholder,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input:-moz-placeholder{color:#868c98}html.theme--documenter-dark .select select:-ms-input-placeholder,html.theme--documenter-dark .textarea:-ms-input-placeholder,html.theme--documenter-dark .input:-ms-input-placeholder,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input:-ms-input-placeholder{color:#868c98}html.theme--documenter-dark .select select:hover,html.theme--documenter-dark .textarea:hover,html.theme--documenter-dark .input:hover,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input:hover,html.theme--documenter-dark .select select.is-hovered,html.theme--documenter-dark .is-hovered.textarea,html.theme--documenter-dark .is-hovered.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-hovered{border-color:#8c9b9d}html.theme--documenter-dark .select select:focus,html.theme--documenter-dark .textarea:focus,html.theme--documenter-dark .input:focus,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input:focus,html.theme--documenter-dark .select select.is-focused,html.theme--documenter-dark .is-focused.textarea,html.theme--documenter-dark .is-focused.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-focused,html.theme--documenter-dark .select select:active,html.theme--documenter-dark .textarea:active,html.theme--documenter-dark .input:active,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input:active,html.theme--documenter-dark .select select.is-active,html.theme--documenter-dark .is-active.textarea,html.theme--documenter-dark .is-active.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-active{border-color:#1abc9c;box-shadow:0 0 0 0.125em rgba(26,188,156,0.25)}html.theme--documenter-dark .select select[disabled],html.theme--documenter-dark .textarea[disabled],html.theme--documenter-dark .input[disabled],html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input[disabled],fieldset[disabled] html.theme--documenter-dark .select select,fieldset[disabled] html.theme--documenter-dark .textarea,fieldset[disabled] html.theme--documenter-dark .input,fieldset[disabled] html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input{background-color:#8c9b9d;border-color:#282f2f;box-shadow:none;color:#fff}html.theme--documenter-dark .select select[disabled]::-moz-placeholder,html.theme--documenter-dark .textarea[disabled]::-moz-placeholder,html.theme--documenter-dark .input[disabled]::-moz-placeholder,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input[disabled]::-moz-placeholder,fieldset[disabled] html.theme--documenter-dark .select select::-moz-placeholder,fieldset[disabled] html.theme--documenter-dark .textarea::-moz-placeholder,fieldset[disabled] html.theme--documenter-dark .input::-moz-placeholder,fieldset[disabled] html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input::-moz-placeholder{color:rgba(255,255,255,0.3)}html.theme--documenter-dark .select select[disabled]::-webkit-input-placeholder,html.theme--documenter-dark .textarea[disabled]::-webkit-input-placeholder,html.theme--documenter-dark .input[disabled]::-webkit-input-placeholder,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input[disabled]::-webkit-input-placeholder,fieldset[disabled] html.theme--documenter-dark .select select::-webkit-input-placeholder,fieldset[disabled] html.theme--documenter-dark .textarea::-webkit-input-placeholder,fieldset[disabled] html.theme--documenter-dark .input::-webkit-input-placeholder,fieldset[disabled] html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input::-webkit-input-placeholder{color:rgba(255,255,255,0.3)}html.theme--documenter-dark .select select[disabled]:-moz-placeholder,html.theme--documenter-dark .textarea[disabled]:-moz-placeholder,html.theme--documenter-dark .input[disabled]:-moz-placeholder,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input[disabled]:-moz-placeholder,fieldset[disabled] html.theme--documenter-dark .select select:-moz-placeholder,fieldset[disabled] html.theme--documenter-dark .textarea:-moz-placeholder,fieldset[disabled] html.theme--documenter-dark .input:-moz-placeholder,fieldset[disabled] html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input:-moz-placeholder{color:rgba(255,255,255,0.3)}html.theme--documenter-dark .select select[disabled]:-ms-input-placeholder,html.theme--documenter-dark .textarea[disabled]:-ms-input-placeholder,html.theme--documenter-dark .input[disabled]:-ms-input-placeholder,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input[disabled]:-ms-input-placeholder,fieldset[disabled] html.theme--documenter-dark .select select:-ms-input-placeholder,fieldset[disabled] html.theme--documenter-dark .textarea:-ms-input-placeholder,fieldset[disabled] html.theme--documenter-dark .input:-ms-input-placeholder,fieldset[disabled] html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input:-ms-input-placeholder{color:rgba(255,255,255,0.3)}html.theme--documenter-dark .textarea,html.theme--documenter-dark .input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input{box-shadow:inset 0 0.0625em 0.125em rgba(10,10,10,0.05);max-width:100%;width:100%}html.theme--documenter-dark .textarea[readonly],html.theme--documenter-dark .input[readonly],html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input[readonly]{box-shadow:none}html.theme--documenter-dark .is-white.textarea,html.theme--documenter-dark .is-white.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-white{border-color:#fff}html.theme--documenter-dark .is-white.textarea:focus,html.theme--documenter-dark .is-white.input:focus,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-white:focus,html.theme--documenter-dark .is-white.is-focused.textarea,html.theme--documenter-dark .is-white.is-focused.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-focused,html.theme--documenter-dark .is-white.textarea:active,html.theme--documenter-dark .is-white.input:active,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-white:active,html.theme--documenter-dark .is-white.is-active.textarea,html.theme--documenter-dark .is-white.is-active.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(255,255,255,0.25)}html.theme--documenter-dark .is-black.textarea,html.theme--documenter-dark .is-black.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-black{border-color:#0a0a0a}html.theme--documenter-dark .is-black.textarea:focus,html.theme--documenter-dark .is-black.input:focus,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-black:focus,html.theme--documenter-dark .is-black.is-focused.textarea,html.theme--documenter-dark .is-black.is-focused.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-focused,html.theme--documenter-dark .is-black.textarea:active,html.theme--documenter-dark .is-black.input:active,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-black:active,html.theme--documenter-dark .is-black.is-active.textarea,html.theme--documenter-dark .is-black.is-active.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(10,10,10,0.25)}html.theme--documenter-dark .is-light.textarea,html.theme--documenter-dark .is-light.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-light{border-color:#ecf0f1}html.theme--documenter-dark .is-light.textarea:focus,html.theme--documenter-dark .is-light.input:focus,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-light:focus,html.theme--documenter-dark .is-light.is-focused.textarea,html.theme--documenter-dark .is-light.is-focused.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-focused,html.theme--documenter-dark .is-light.textarea:active,html.theme--documenter-dark .is-light.input:active,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-light:active,html.theme--documenter-dark .is-light.is-active.textarea,html.theme--documenter-dark .is-light.is-active.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(236,240,241,0.25)}html.theme--documenter-dark .is-dark.textarea,html.theme--documenter-dark .content kbd.textarea,html.theme--documenter-dark .is-dark.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-dark,html.theme--documenter-dark .content kbd.input{border-color:#282f2f}html.theme--documenter-dark .is-dark.textarea:focus,html.theme--documenter-dark .content kbd.textarea:focus,html.theme--documenter-dark .is-dark.input:focus,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-dark:focus,html.theme--documenter-dark .content kbd.input:focus,html.theme--documenter-dark .is-dark.is-focused.textarea,html.theme--documenter-dark .content kbd.is-focused.textarea,html.theme--documenter-dark .is-dark.is-focused.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-focused,html.theme--documenter-dark .content kbd.is-focused.input,html.theme--documenter-dark #documenter .docs-sidebar .content form.docs-search>input.is-focused,html.theme--documenter-dark .is-dark.textarea:active,html.theme--documenter-dark .content kbd.textarea:active,html.theme--documenter-dark .is-dark.input:active,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-dark:active,html.theme--documenter-dark .content kbd.input:active,html.theme--documenter-dark .is-dark.is-active.textarea,html.theme--documenter-dark .content kbd.is-active.textarea,html.theme--documenter-dark .is-dark.is-active.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-active,html.theme--documenter-dark .content kbd.is-active.input,html.theme--documenter-dark #documenter .docs-sidebar .content form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(40,47,47,0.25)}html.theme--documenter-dark .is-primary.textarea,html.theme--documenter-dark .docstring>section>a.textarea.docs-sourcelink,html.theme--documenter-dark .is-primary.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-primary,html.theme--documenter-dark .docstring>section>a.input.docs-sourcelink{border-color:#375a7f}html.theme--documenter-dark .is-primary.textarea:focus,html.theme--documenter-dark .docstring>section>a.textarea.docs-sourcelink:focus,html.theme--documenter-dark .is-primary.input:focus,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-primary:focus,html.theme--documenter-dark .docstring>section>a.input.docs-sourcelink:focus,html.theme--documenter-dark .is-primary.is-focused.textarea,html.theme--documenter-dark .docstring>section>a.is-focused.textarea.docs-sourcelink,html.theme--documenter-dark .is-primary.is-focused.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-focused,html.theme--documenter-dark .docstring>section>a.is-focused.input.docs-sourcelink,html.theme--documenter-dark .is-primary.textarea:active,html.theme--documenter-dark .docstring>section>a.textarea.docs-sourcelink:active,html.theme--documenter-dark .is-primary.input:active,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-primary:active,html.theme--documenter-dark .docstring>section>a.input.docs-sourcelink:active,html.theme--documenter-dark .is-primary.is-active.textarea,html.theme--documenter-dark .docstring>section>a.is-active.textarea.docs-sourcelink,html.theme--documenter-dark .is-primary.is-active.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-active,html.theme--documenter-dark .docstring>section>a.is-active.input.docs-sourcelink{box-shadow:0 0 0 0.125em rgba(55,90,127,0.25)}html.theme--documenter-dark .is-link.textarea,html.theme--documenter-dark .is-link.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-link{border-color:#1abc9c}html.theme--documenter-dark .is-link.textarea:focus,html.theme--documenter-dark .is-link.input:focus,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-link:focus,html.theme--documenter-dark .is-link.is-focused.textarea,html.theme--documenter-dark .is-link.is-focused.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-focused,html.theme--documenter-dark .is-link.textarea:active,html.theme--documenter-dark .is-link.input:active,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-link:active,html.theme--documenter-dark .is-link.is-active.textarea,html.theme--documenter-dark .is-link.is-active.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(26,188,156,0.25)}html.theme--documenter-dark .is-info.textarea,html.theme--documenter-dark .is-info.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-info{border-color:#024c7d}html.theme--documenter-dark .is-info.textarea:focus,html.theme--documenter-dark .is-info.input:focus,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-info:focus,html.theme--documenter-dark .is-info.is-focused.textarea,html.theme--documenter-dark .is-info.is-focused.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-focused,html.theme--documenter-dark .is-info.textarea:active,html.theme--documenter-dark .is-info.input:active,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-info:active,html.theme--documenter-dark .is-info.is-active.textarea,html.theme--documenter-dark .is-info.is-active.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(2,76,125,0.25)}html.theme--documenter-dark .is-success.textarea,html.theme--documenter-dark .is-success.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-success{border-color:#008438}html.theme--documenter-dark .is-success.textarea:focus,html.theme--documenter-dark .is-success.input:focus,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-success:focus,html.theme--documenter-dark .is-success.is-focused.textarea,html.theme--documenter-dark .is-success.is-focused.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-focused,html.theme--documenter-dark .is-success.textarea:active,html.theme--documenter-dark .is-success.input:active,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-success:active,html.theme--documenter-dark .is-success.is-active.textarea,html.theme--documenter-dark .is-success.is-active.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(0,132,56,0.25)}html.theme--documenter-dark .is-warning.textarea,html.theme--documenter-dark .is-warning.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-warning{border-color:#ad8100}html.theme--documenter-dark .is-warning.textarea:focus,html.theme--documenter-dark .is-warning.input:focus,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-warning:focus,html.theme--documenter-dark .is-warning.is-focused.textarea,html.theme--documenter-dark .is-warning.is-focused.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-focused,html.theme--documenter-dark .is-warning.textarea:active,html.theme--documenter-dark .is-warning.input:active,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-warning:active,html.theme--documenter-dark .is-warning.is-active.textarea,html.theme--documenter-dark .is-warning.is-active.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(173,129,0,0.25)}html.theme--documenter-dark .is-danger.textarea,html.theme--documenter-dark .is-danger.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-danger{border-color:#9e1b0d}html.theme--documenter-dark .is-danger.textarea:focus,html.theme--documenter-dark .is-danger.input:focus,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-danger:focus,html.theme--documenter-dark .is-danger.is-focused.textarea,html.theme--documenter-dark .is-danger.is-focused.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-focused,html.theme--documenter-dark .is-danger.textarea:active,html.theme--documenter-dark .is-danger.input:active,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-danger:active,html.theme--documenter-dark .is-danger.is-active.textarea,html.theme--documenter-dark .is-danger.is-active.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(158,27,13,0.25)}html.theme--documenter-dark .is-small.textarea,html.theme--documenter-dark .is-small.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input{border-radius:3px;font-size:.75rem}html.theme--documenter-dark .is-medium.textarea,html.theme--documenter-dark .is-medium.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-medium{font-size:1.25rem}html.theme--documenter-dark .is-large.textarea,html.theme--documenter-dark .is-large.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-large{font-size:1.5rem}html.theme--documenter-dark .is-fullwidth.textarea,html.theme--documenter-dark .is-fullwidth.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-fullwidth{display:block;width:100%}html.theme--documenter-dark .is-inline.textarea,html.theme--documenter-dark .is-inline.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-inline{display:inline;width:auto}html.theme--documenter-dark .input.is-rounded,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input{border-radius:9999px;padding-left:calc(calc(0.75em - 1px) + 0.375em);padding-right:calc(calc(0.75em - 1px) + 0.375em)}html.theme--documenter-dark .input.is-static,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-static{background-color:transparent;border-color:transparent;box-shadow:none;padding-left:0;padding-right:0}html.theme--documenter-dark .textarea{display:block;max-width:100%;min-width:100%;padding:calc(0.75em - 1px);resize:vertical}html.theme--documenter-dark .textarea:not([rows]){max-height:40em;min-height:8em}html.theme--documenter-dark .textarea[rows]{height:initial}html.theme--documenter-dark .textarea.has-fixed-size{resize:none}html.theme--documenter-dark .radio,html.theme--documenter-dark .checkbox{cursor:pointer;display:inline-block;line-height:1.25;position:relative}html.theme--documenter-dark .radio input,html.theme--documenter-dark .checkbox input{cursor:pointer}html.theme--documenter-dark .radio:hover,html.theme--documenter-dark .checkbox:hover{color:#8c9b9d}html.theme--documenter-dark .radio[disabled],html.theme--documenter-dark .checkbox[disabled],fieldset[disabled] html.theme--documenter-dark .radio,fieldset[disabled] html.theme--documenter-dark .checkbox,html.theme--documenter-dark .radio input[disabled],html.theme--documenter-dark .checkbox input[disabled]{color:#fff;cursor:not-allowed}html.theme--documenter-dark .radio+.radio{margin-left:.5em}html.theme--documenter-dark .select{display:inline-block;max-width:100%;position:relative;vertical-align:top}html.theme--documenter-dark .select:not(.is-multiple){height:2.5em}html.theme--documenter-dark .select:not(.is-multiple):not(.is-loading)::after{border-color:#1abc9c;right:1.125em;z-index:4}html.theme--documenter-dark .select.is-rounded select,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.select select{border-radius:9999px;padding-left:1em}html.theme--documenter-dark .select select{cursor:pointer;display:block;font-size:1em;max-width:100%;outline:none}html.theme--documenter-dark .select select::-ms-expand{display:none}html.theme--documenter-dark .select select[disabled]:hover,fieldset[disabled] html.theme--documenter-dark .select select:hover{border-color:#282f2f}html.theme--documenter-dark .select select:not([multiple]){padding-right:2.5em}html.theme--documenter-dark .select select[multiple]{height:auto;padding:0}html.theme--documenter-dark .select select[multiple] option{padding:0.5em 1em}html.theme--documenter-dark .select:not(.is-multiple):not(.is-loading):hover::after{border-color:#8c9b9d}html.theme--documenter-dark .select.is-white:not(:hover)::after{border-color:#fff}html.theme--documenter-dark .select.is-white select{border-color:#fff}html.theme--documenter-dark .select.is-white select:hover,html.theme--documenter-dark .select.is-white select.is-hovered{border-color:#f2f2f2}html.theme--documenter-dark .select.is-white select:focus,html.theme--documenter-dark .select.is-white select.is-focused,html.theme--documenter-dark .select.is-white select:active,html.theme--documenter-dark .select.is-white select.is-active{box-shadow:0 0 0 0.125em rgba(255,255,255,0.25)}html.theme--documenter-dark .select.is-black:not(:hover)::after{border-color:#0a0a0a}html.theme--documenter-dark .select.is-black select{border-color:#0a0a0a}html.theme--documenter-dark .select.is-black select:hover,html.theme--documenter-dark .select.is-black select.is-hovered{border-color:#000}html.theme--documenter-dark .select.is-black select:focus,html.theme--documenter-dark .select.is-black select.is-focused,html.theme--documenter-dark .select.is-black select:active,html.theme--documenter-dark .select.is-black select.is-active{box-shadow:0 0 0 0.125em rgba(10,10,10,0.25)}html.theme--documenter-dark .select.is-light:not(:hover)::after{border-color:#ecf0f1}html.theme--documenter-dark .select.is-light select{border-color:#ecf0f1}html.theme--documenter-dark .select.is-light select:hover,html.theme--documenter-dark .select.is-light select.is-hovered{border-color:#dde4e6}html.theme--documenter-dark .select.is-light select:focus,html.theme--documenter-dark .select.is-light select.is-focused,html.theme--documenter-dark .select.is-light select:active,html.theme--documenter-dark .select.is-light select.is-active{box-shadow:0 0 0 0.125em rgba(236,240,241,0.25)}html.theme--documenter-dark .select.is-dark:not(:hover)::after,html.theme--documenter-dark .content kbd.select:not(:hover)::after{border-color:#282f2f}html.theme--documenter-dark .select.is-dark select,html.theme--documenter-dark .content kbd.select select{border-color:#282f2f}html.theme--documenter-dark .select.is-dark select:hover,html.theme--documenter-dark .content kbd.select select:hover,html.theme--documenter-dark .select.is-dark select.is-hovered,html.theme--documenter-dark .content kbd.select select.is-hovered{border-color:#1d2122}html.theme--documenter-dark .select.is-dark select:focus,html.theme--documenter-dark .content kbd.select select:focus,html.theme--documenter-dark .select.is-dark select.is-focused,html.theme--documenter-dark .content kbd.select select.is-focused,html.theme--documenter-dark .select.is-dark select:active,html.theme--documenter-dark .content kbd.select select:active,html.theme--documenter-dark .select.is-dark select.is-active,html.theme--documenter-dark .content kbd.select select.is-active{box-shadow:0 0 0 0.125em rgba(40,47,47,0.25)}html.theme--documenter-dark .select.is-primary:not(:hover)::after,html.theme--documenter-dark .docstring>section>a.select.docs-sourcelink:not(:hover)::after{border-color:#375a7f}html.theme--documenter-dark .select.is-primary select,html.theme--documenter-dark .docstring>section>a.select.docs-sourcelink select{border-color:#375a7f}html.theme--documenter-dark .select.is-primary select:hover,html.theme--documenter-dark .docstring>section>a.select.docs-sourcelink select:hover,html.theme--documenter-dark .select.is-primary select.is-hovered,html.theme--documenter-dark .docstring>section>a.select.docs-sourcelink select.is-hovered{border-color:#2f4d6d}html.theme--documenter-dark .select.is-primary select:focus,html.theme--documenter-dark .docstring>section>a.select.docs-sourcelink select:focus,html.theme--documenter-dark .select.is-primary select.is-focused,html.theme--documenter-dark .docstring>section>a.select.docs-sourcelink select.is-focused,html.theme--documenter-dark .select.is-primary select:active,html.theme--documenter-dark .docstring>section>a.select.docs-sourcelink select:active,html.theme--documenter-dark .select.is-primary select.is-active,html.theme--documenter-dark .docstring>section>a.select.docs-sourcelink select.is-active{box-shadow:0 0 0 0.125em rgba(55,90,127,0.25)}html.theme--documenter-dark .select.is-link:not(:hover)::after{border-color:#1abc9c}html.theme--documenter-dark .select.is-link select{border-color:#1abc9c}html.theme--documenter-dark .select.is-link select:hover,html.theme--documenter-dark .select.is-link select.is-hovered{border-color:#17a689}html.theme--documenter-dark .select.is-link select:focus,html.theme--documenter-dark .select.is-link select.is-focused,html.theme--documenter-dark .select.is-link select:active,html.theme--documenter-dark .select.is-link select.is-active{box-shadow:0 0 0 0.125em rgba(26,188,156,0.25)}html.theme--documenter-dark .select.is-info:not(:hover)::after{border-color:#024c7d}html.theme--documenter-dark .select.is-info select{border-color:#024c7d}html.theme--documenter-dark .select.is-info select:hover,html.theme--documenter-dark .select.is-info select.is-hovered{border-color:#023d64}html.theme--documenter-dark .select.is-info select:focus,html.theme--documenter-dark .select.is-info select.is-focused,html.theme--documenter-dark .select.is-info select:active,html.theme--documenter-dark .select.is-info select.is-active{box-shadow:0 0 0 0.125em rgba(2,76,125,0.25)}html.theme--documenter-dark .select.is-success:not(:hover)::after{border-color:#008438}html.theme--documenter-dark .select.is-success select{border-color:#008438}html.theme--documenter-dark .select.is-success select:hover,html.theme--documenter-dark .select.is-success select.is-hovered{border-color:#006b2d}html.theme--documenter-dark .select.is-success select:focus,html.theme--documenter-dark .select.is-success select.is-focused,html.theme--documenter-dark .select.is-success select:active,html.theme--documenter-dark .select.is-success select.is-active{box-shadow:0 0 0 0.125em rgba(0,132,56,0.25)}html.theme--documenter-dark .select.is-warning:not(:hover)::after{border-color:#ad8100}html.theme--documenter-dark .select.is-warning select{border-color:#ad8100}html.theme--documenter-dark .select.is-warning select:hover,html.theme--documenter-dark .select.is-warning select.is-hovered{border-color:#946e00}html.theme--documenter-dark .select.is-warning select:focus,html.theme--documenter-dark .select.is-warning select.is-focused,html.theme--documenter-dark .select.is-warning select:active,html.theme--documenter-dark .select.is-warning select.is-active{box-shadow:0 0 0 0.125em rgba(173,129,0,0.25)}html.theme--documenter-dark .select.is-danger:not(:hover)::after{border-color:#9e1b0d}html.theme--documenter-dark .select.is-danger select{border-color:#9e1b0d}html.theme--documenter-dark .select.is-danger select:hover,html.theme--documenter-dark .select.is-danger select.is-hovered{border-color:#86170b}html.theme--documenter-dark .select.is-danger select:focus,html.theme--documenter-dark .select.is-danger select.is-focused,html.theme--documenter-dark .select.is-danger select:active,html.theme--documenter-dark .select.is-danger select.is-active{box-shadow:0 0 0 0.125em rgba(158,27,13,0.25)}html.theme--documenter-dark .select.is-small,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.select{border-radius:3px;font-size:.75rem}html.theme--documenter-dark .select.is-medium{font-size:1.25rem}html.theme--documenter-dark .select.is-large{font-size:1.5rem}html.theme--documenter-dark .select.is-disabled::after{border-color:#fff !important;opacity:0.5}html.theme--documenter-dark .select.is-fullwidth{width:100%}html.theme--documenter-dark .select.is-fullwidth select{width:100%}html.theme--documenter-dark .select.is-loading::after{margin-top:0;position:absolute;right:.625em;top:0.625em;transform:none}html.theme--documenter-dark .select.is-loading.is-small:after,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-loading:after{font-size:.75rem}html.theme--documenter-dark .select.is-loading.is-medium:after{font-size:1.25rem}html.theme--documenter-dark .select.is-loading.is-large:after{font-size:1.5rem}html.theme--documenter-dark .file{align-items:stretch;display:flex;justify-content:flex-start;position:relative}html.theme--documenter-dark .file.is-white .file-cta{background-color:#fff;border-color:transparent;color:#0a0a0a}html.theme--documenter-dark .file.is-white:hover .file-cta,html.theme--documenter-dark .file.is-white.is-hovered .file-cta{background-color:#f9f9f9;border-color:transparent;color:#0a0a0a}html.theme--documenter-dark .file.is-white:focus .file-cta,html.theme--documenter-dark .file.is-white.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(255,255,255,0.25);color:#0a0a0a}html.theme--documenter-dark .file.is-white:active .file-cta,html.theme--documenter-dark .file.is-white.is-active .file-cta{background-color:#f2f2f2;border-color:transparent;color:#0a0a0a}html.theme--documenter-dark .file.is-black .file-cta{background-color:#0a0a0a;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-black:hover .file-cta,html.theme--documenter-dark .file.is-black.is-hovered .file-cta{background-color:#040404;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-black:focus .file-cta,html.theme--documenter-dark .file.is-black.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(10,10,10,0.25);color:#fff}html.theme--documenter-dark .file.is-black:active .file-cta,html.theme--documenter-dark .file.is-black.is-active .file-cta{background-color:#000;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-light .file-cta{background-color:#ecf0f1;border-color:transparent;color:rgba(0,0,0,0.7)}html.theme--documenter-dark .file.is-light:hover .file-cta,html.theme--documenter-dark .file.is-light.is-hovered .file-cta{background-color:#e5eaec;border-color:transparent;color:rgba(0,0,0,0.7)}html.theme--documenter-dark .file.is-light:focus .file-cta,html.theme--documenter-dark .file.is-light.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(236,240,241,0.25);color:rgba(0,0,0,0.7)}html.theme--documenter-dark .file.is-light:active .file-cta,html.theme--documenter-dark .file.is-light.is-active .file-cta{background-color:#dde4e6;border-color:transparent;color:rgba(0,0,0,0.7)}html.theme--documenter-dark .file.is-dark .file-cta,html.theme--documenter-dark .content kbd.file .file-cta{background-color:#282f2f;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-dark:hover .file-cta,html.theme--documenter-dark .content kbd.file:hover .file-cta,html.theme--documenter-dark .file.is-dark.is-hovered .file-cta,html.theme--documenter-dark .content kbd.file.is-hovered .file-cta{background-color:#232829;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-dark:focus .file-cta,html.theme--documenter-dark .content kbd.file:focus .file-cta,html.theme--documenter-dark .file.is-dark.is-focused .file-cta,html.theme--documenter-dark .content kbd.file.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(40,47,47,0.25);color:#fff}html.theme--documenter-dark .file.is-dark:active .file-cta,html.theme--documenter-dark .content kbd.file:active .file-cta,html.theme--documenter-dark .file.is-dark.is-active .file-cta,html.theme--documenter-dark .content kbd.file.is-active .file-cta{background-color:#1d2122;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-primary .file-cta,html.theme--documenter-dark .docstring>section>a.file.docs-sourcelink .file-cta{background-color:#375a7f;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-primary:hover .file-cta,html.theme--documenter-dark .docstring>section>a.file.docs-sourcelink:hover .file-cta,html.theme--documenter-dark .file.is-primary.is-hovered .file-cta,html.theme--documenter-dark .docstring>section>a.file.is-hovered.docs-sourcelink .file-cta{background-color:#335476;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-primary:focus .file-cta,html.theme--documenter-dark .docstring>section>a.file.docs-sourcelink:focus .file-cta,html.theme--documenter-dark .file.is-primary.is-focused .file-cta,html.theme--documenter-dark .docstring>section>a.file.is-focused.docs-sourcelink .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(55,90,127,0.25);color:#fff}html.theme--documenter-dark .file.is-primary:active .file-cta,html.theme--documenter-dark .docstring>section>a.file.docs-sourcelink:active .file-cta,html.theme--documenter-dark .file.is-primary.is-active .file-cta,html.theme--documenter-dark .docstring>section>a.file.is-active.docs-sourcelink .file-cta{background-color:#2f4d6d;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-link .file-cta{background-color:#1abc9c;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-link:hover .file-cta,html.theme--documenter-dark .file.is-link.is-hovered .file-cta{background-color:#18b193;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-link:focus .file-cta,html.theme--documenter-dark .file.is-link.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(26,188,156,0.25);color:#fff}html.theme--documenter-dark .file.is-link:active .file-cta,html.theme--documenter-dark .file.is-link.is-active .file-cta{background-color:#17a689;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-info .file-cta{background-color:#024c7d;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-info:hover .file-cta,html.theme--documenter-dark .file.is-info.is-hovered .file-cta{background-color:#024470;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-info:focus .file-cta,html.theme--documenter-dark .file.is-info.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(2,76,125,0.25);color:#fff}html.theme--documenter-dark .file.is-info:active .file-cta,html.theme--documenter-dark .file.is-info.is-active .file-cta{background-color:#023d64;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-success .file-cta{background-color:#008438;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-success:hover .file-cta,html.theme--documenter-dark .file.is-success.is-hovered .file-cta{background-color:#073;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-success:focus .file-cta,html.theme--documenter-dark .file.is-success.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(0,132,56,0.25);color:#fff}html.theme--documenter-dark .file.is-success:active .file-cta,html.theme--documenter-dark .file.is-success.is-active .file-cta{background-color:#006b2d;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-warning .file-cta{background-color:#ad8100;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-warning:hover .file-cta,html.theme--documenter-dark .file.is-warning.is-hovered .file-cta{background-color:#a07700;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-warning:focus .file-cta,html.theme--documenter-dark .file.is-warning.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(173,129,0,0.25);color:#fff}html.theme--documenter-dark .file.is-warning:active .file-cta,html.theme--documenter-dark .file.is-warning.is-active .file-cta{background-color:#946e00;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-danger .file-cta{background-color:#9e1b0d;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-danger:hover .file-cta,html.theme--documenter-dark .file.is-danger.is-hovered .file-cta{background-color:#92190c;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-danger:focus .file-cta,html.theme--documenter-dark .file.is-danger.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(158,27,13,0.25);color:#fff}html.theme--documenter-dark .file.is-danger:active .file-cta,html.theme--documenter-dark .file.is-danger.is-active .file-cta{background-color:#86170b;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-small,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.file{font-size:.75rem}html.theme--documenter-dark .file.is-normal{font-size:1rem}html.theme--documenter-dark .file.is-medium{font-size:1.25rem}html.theme--documenter-dark .file.is-medium .file-icon .fa{font-size:21px}html.theme--documenter-dark .file.is-large{font-size:1.5rem}html.theme--documenter-dark .file.is-large .file-icon .fa{font-size:28px}html.theme--documenter-dark .file.has-name .file-cta{border-bottom-right-radius:0;border-top-right-radius:0}html.theme--documenter-dark .file.has-name .file-name{border-bottom-left-radius:0;border-top-left-radius:0}html.theme--documenter-dark .file.has-name.is-empty .file-cta{border-radius:.4em}html.theme--documenter-dark .file.has-name.is-empty .file-name{display:none}html.theme--documenter-dark .file.is-boxed .file-label{flex-direction:column}html.theme--documenter-dark .file.is-boxed .file-cta{flex-direction:column;height:auto;padding:1em 3em}html.theme--documenter-dark .file.is-boxed .file-name{border-width:0 1px 1px}html.theme--documenter-dark .file.is-boxed .file-icon{height:1.5em;width:1.5em}html.theme--documenter-dark .file.is-boxed .file-icon .fa{font-size:21px}html.theme--documenter-dark .file.is-boxed.is-small .file-icon .fa,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-boxed .file-icon .fa{font-size:14px}html.theme--documenter-dark .file.is-boxed.is-medium .file-icon .fa{font-size:28px}html.theme--documenter-dark .file.is-boxed.is-large .file-icon .fa{font-size:35px}html.theme--documenter-dark .file.is-boxed.has-name .file-cta{border-radius:.4em .4em 0 0}html.theme--documenter-dark .file.is-boxed.has-name .file-name{border-radius:0 0 .4em .4em;border-width:0 1px 1px}html.theme--documenter-dark .file.is-centered{justify-content:center}html.theme--documenter-dark .file.is-fullwidth .file-label{width:100%}html.theme--documenter-dark .file.is-fullwidth .file-name{flex-grow:1;max-width:none}html.theme--documenter-dark .file.is-right{justify-content:flex-end}html.theme--documenter-dark .file.is-right .file-cta{border-radius:0 .4em .4em 0}html.theme--documenter-dark .file.is-right .file-name{border-radius:.4em 0 0 .4em;border-width:1px 0 1px 1px;order:-1}html.theme--documenter-dark .file-label{align-items:stretch;display:flex;cursor:pointer;justify-content:flex-start;overflow:hidden;position:relative}html.theme--documenter-dark .file-label:hover .file-cta{background-color:#232829;color:#f2f2f2}html.theme--documenter-dark .file-label:hover .file-name{border-color:#596668}html.theme--documenter-dark .file-label:active .file-cta{background-color:#1d2122;color:#f2f2f2}html.theme--documenter-dark .file-label:active .file-name{border-color:#535f61}html.theme--documenter-dark .file-input{height:100%;left:0;opacity:0;outline:none;position:absolute;top:0;width:100%}html.theme--documenter-dark .file-cta,html.theme--documenter-dark .file-name{border-color:#5e6d6f;border-radius:.4em;font-size:1em;padding-left:1em;padding-right:1em;white-space:nowrap}html.theme--documenter-dark .file-cta{background-color:#282f2f;color:#fff}html.theme--documenter-dark .file-name{border-color:#5e6d6f;border-style:solid;border-width:1px 1px 1px 0;display:block;max-width:16em;overflow:hidden;text-align:inherit;text-overflow:ellipsis}html.theme--documenter-dark .file-icon{align-items:center;display:flex;height:1em;justify-content:center;margin-right:.5em;width:1em}html.theme--documenter-dark .file-icon .fa{font-size:14px}html.theme--documenter-dark .label{color:#f2f2f2;display:block;font-size:1rem;font-weight:700}html.theme--documenter-dark .label:not(:last-child){margin-bottom:0.5em}html.theme--documenter-dark .label.is-small,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.label{font-size:.75rem}html.theme--documenter-dark .label.is-medium{font-size:1.25rem}html.theme--documenter-dark .label.is-large{font-size:1.5rem}html.theme--documenter-dark .help{display:block;font-size:.75rem;margin-top:0.25rem}html.theme--documenter-dark .help.is-white{color:#fff}html.theme--documenter-dark .help.is-black{color:#0a0a0a}html.theme--documenter-dark .help.is-light{color:#ecf0f1}html.theme--documenter-dark .help.is-dark,html.theme--documenter-dark .content kbd.help{color:#282f2f}html.theme--documenter-dark .help.is-primary,html.theme--documenter-dark .docstring>section>a.help.docs-sourcelink{color:#375a7f}html.theme--documenter-dark .help.is-link{color:#1abc9c}html.theme--documenter-dark .help.is-info{color:#024c7d}html.theme--documenter-dark .help.is-success{color:#008438}html.theme--documenter-dark .help.is-warning{color:#ad8100}html.theme--documenter-dark .help.is-danger{color:#9e1b0d}html.theme--documenter-dark .field:not(:last-child){margin-bottom:0.75rem}html.theme--documenter-dark .field.has-addons{display:flex;justify-content:flex-start}html.theme--documenter-dark .field.has-addons .control:not(:last-child){margin-right:-1px}html.theme--documenter-dark .field.has-addons .control:not(:first-child):not(:last-child) .button,html.theme--documenter-dark .field.has-addons .control:not(:first-child):not(:last-child) .input,html.theme--documenter-dark .field.has-addons .control:not(:first-child):not(:last-child) #documenter .docs-sidebar form.docs-search>input,html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control:not(:first-child):not(:last-child) form.docs-search>input,html.theme--documenter-dark .field.has-addons .control:not(:first-child):not(:last-child) .select select{border-radius:0}html.theme--documenter-dark .field.has-addons .control:first-child:not(:only-child) .button,html.theme--documenter-dark .field.has-addons .control:first-child:not(:only-child) .input,html.theme--documenter-dark .field.has-addons .control:first-child:not(:only-child) #documenter .docs-sidebar form.docs-search>input,html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control:first-child:not(:only-child) form.docs-search>input,html.theme--documenter-dark .field.has-addons .control:first-child:not(:only-child) .select select{border-bottom-right-radius:0;border-top-right-radius:0}html.theme--documenter-dark .field.has-addons .control:last-child:not(:only-child) .button,html.theme--documenter-dark .field.has-addons .control:last-child:not(:only-child) .input,html.theme--documenter-dark .field.has-addons .control:last-child:not(:only-child) #documenter .docs-sidebar form.docs-search>input,html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control:last-child:not(:only-child) form.docs-search>input,html.theme--documenter-dark .field.has-addons .control:last-child:not(:only-child) .select select{border-bottom-left-radius:0;border-top-left-radius:0}html.theme--documenter-dark .field.has-addons .control .button:not([disabled]):hover,html.theme--documenter-dark .field.has-addons .control .button.is-hovered:not([disabled]),html.theme--documenter-dark .field.has-addons .control .input:not([disabled]):hover,html.theme--documenter-dark .field.has-addons .control #documenter .docs-sidebar form.docs-search>input:not([disabled]):hover,html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control form.docs-search>input:not([disabled]):hover,html.theme--documenter-dark .field.has-addons .control .input.is-hovered:not([disabled]),html.theme--documenter-dark .field.has-addons .control #documenter .docs-sidebar form.docs-search>input.is-hovered:not([disabled]),html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control form.docs-search>input.is-hovered:not([disabled]),html.theme--documenter-dark .field.has-addons .control .select select:not([disabled]):hover,html.theme--documenter-dark .field.has-addons .control .select select.is-hovered:not([disabled]){z-index:2}html.theme--documenter-dark .field.has-addons .control .button:not([disabled]):focus,html.theme--documenter-dark .field.has-addons .control .button.is-focused:not([disabled]),html.theme--documenter-dark .field.has-addons .control .button:not([disabled]):active,html.theme--documenter-dark .field.has-addons .control .button.is-active:not([disabled]),html.theme--documenter-dark .field.has-addons .control .input:not([disabled]):focus,html.theme--documenter-dark .field.has-addons .control #documenter .docs-sidebar form.docs-search>input:not([disabled]):focus,html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control form.docs-search>input:not([disabled]):focus,html.theme--documenter-dark .field.has-addons .control .input.is-focused:not([disabled]),html.theme--documenter-dark .field.has-addons .control #documenter .docs-sidebar form.docs-search>input.is-focused:not([disabled]),html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control form.docs-search>input.is-focused:not([disabled]),html.theme--documenter-dark .field.has-addons .control .input:not([disabled]):active,html.theme--documenter-dark .field.has-addons .control #documenter .docs-sidebar form.docs-search>input:not([disabled]):active,html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control form.docs-search>input:not([disabled]):active,html.theme--documenter-dark .field.has-addons .control .input.is-active:not([disabled]),html.theme--documenter-dark .field.has-addons .control #documenter .docs-sidebar form.docs-search>input.is-active:not([disabled]),html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control form.docs-search>input.is-active:not([disabled]),html.theme--documenter-dark .field.has-addons .control .select select:not([disabled]):focus,html.theme--documenter-dark .field.has-addons .control .select select.is-focused:not([disabled]),html.theme--documenter-dark .field.has-addons .control .select select:not([disabled]):active,html.theme--documenter-dark .field.has-addons .control .select select.is-active:not([disabled]){z-index:3}html.theme--documenter-dark .field.has-addons .control .button:not([disabled]):focus:hover,html.theme--documenter-dark .field.has-addons .control .button.is-focused:not([disabled]):hover,html.theme--documenter-dark .field.has-addons .control .button:not([disabled]):active:hover,html.theme--documenter-dark .field.has-addons .control .button.is-active:not([disabled]):hover,html.theme--documenter-dark .field.has-addons .control .input:not([disabled]):focus:hover,html.theme--documenter-dark .field.has-addons .control #documenter .docs-sidebar form.docs-search>input:not([disabled]):focus:hover,html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control form.docs-search>input:not([disabled]):focus:hover,html.theme--documenter-dark .field.has-addons .control .input.is-focused:not([disabled]):hover,html.theme--documenter-dark .field.has-addons .control #documenter .docs-sidebar form.docs-search>input.is-focused:not([disabled]):hover,html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control form.docs-search>input.is-focused:not([disabled]):hover,html.theme--documenter-dark .field.has-addons .control .input:not([disabled]):active:hover,html.theme--documenter-dark .field.has-addons .control #documenter .docs-sidebar form.docs-search>input:not([disabled]):active:hover,html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control form.docs-search>input:not([disabled]):active:hover,html.theme--documenter-dark .field.has-addons .control .input.is-active:not([disabled]):hover,html.theme--documenter-dark .field.has-addons .control #documenter .docs-sidebar form.docs-search>input.is-active:not([disabled]):hover,html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control form.docs-search>input.is-active:not([disabled]):hover,html.theme--documenter-dark .field.has-addons .control .select select:not([disabled]):focus:hover,html.theme--documenter-dark .field.has-addons .control .select select.is-focused:not([disabled]):hover,html.theme--documenter-dark .field.has-addons .control .select select:not([disabled]):active:hover,html.theme--documenter-dark .field.has-addons .control .select select.is-active:not([disabled]):hover{z-index:4}html.theme--documenter-dark .field.has-addons .control.is-expanded{flex-grow:1;flex-shrink:1}html.theme--documenter-dark .field.has-addons.has-addons-centered{justify-content:center}html.theme--documenter-dark .field.has-addons.has-addons-right{justify-content:flex-end}html.theme--documenter-dark .field.has-addons.has-addons-fullwidth .control{flex-grow:1;flex-shrink:0}html.theme--documenter-dark .field.is-grouped{display:flex;justify-content:flex-start}html.theme--documenter-dark .field.is-grouped>.control{flex-shrink:0}html.theme--documenter-dark .field.is-grouped>.control:not(:last-child){margin-bottom:0;margin-right:.75rem}html.theme--documenter-dark .field.is-grouped>.control.is-expanded{flex-grow:1;flex-shrink:1}html.theme--documenter-dark .field.is-grouped.is-grouped-centered{justify-content:center}html.theme--documenter-dark .field.is-grouped.is-grouped-right{justify-content:flex-end}html.theme--documenter-dark .field.is-grouped.is-grouped-multiline{flex-wrap:wrap}html.theme--documenter-dark .field.is-grouped.is-grouped-multiline>.control:last-child,html.theme--documenter-dark .field.is-grouped.is-grouped-multiline>.control:not(:last-child){margin-bottom:0.75rem}html.theme--documenter-dark .field.is-grouped.is-grouped-multiline:last-child{margin-bottom:-0.75rem}html.theme--documenter-dark .field.is-grouped.is-grouped-multiline:not(:last-child){margin-bottom:0}@media screen and (min-width: 769px),print{html.theme--documenter-dark .field.is-horizontal{display:flex}}html.theme--documenter-dark .field-label .label{font-size:inherit}@media screen and (max-width: 768px){html.theme--documenter-dark .field-label{margin-bottom:0.5rem}}@media screen and (min-width: 769px),print{html.theme--documenter-dark .field-label{flex-basis:0;flex-grow:1;flex-shrink:0;margin-right:1.5rem;text-align:right}html.theme--documenter-dark .field-label.is-small,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.field-label{font-size:.75rem;padding-top:0.375em}html.theme--documenter-dark .field-label.is-normal{padding-top:0.375em}html.theme--documenter-dark .field-label.is-medium{font-size:1.25rem;padding-top:0.375em}html.theme--documenter-dark .field-label.is-large{font-size:1.5rem;padding-top:0.375em}}html.theme--documenter-dark .field-body .field .field{margin-bottom:0}@media screen and (min-width: 769px),print{html.theme--documenter-dark .field-body{display:flex;flex-basis:0;flex-grow:5;flex-shrink:1}html.theme--documenter-dark .field-body .field{margin-bottom:0}html.theme--documenter-dark .field-body>.field{flex-shrink:1}html.theme--documenter-dark .field-body>.field:not(.is-narrow){flex-grow:1}html.theme--documenter-dark .field-body>.field:not(:last-child){margin-right:.75rem}}html.theme--documenter-dark .control{box-sizing:border-box;clear:both;font-size:1rem;position:relative;text-align:inherit}html.theme--documenter-dark .control.has-icons-left .input:focus~.icon,html.theme--documenter-dark .control.has-icons-left #documenter .docs-sidebar form.docs-search>input:focus~.icon,html.theme--documenter-dark #documenter .docs-sidebar .control.has-icons-left form.docs-search>input:focus~.icon,html.theme--documenter-dark .control.has-icons-left .select:focus~.icon,html.theme--documenter-dark .control.has-icons-right .input:focus~.icon,html.theme--documenter-dark .control.has-icons-right #documenter .docs-sidebar form.docs-search>input:focus~.icon,html.theme--documenter-dark #documenter .docs-sidebar .control.has-icons-right form.docs-search>input:focus~.icon,html.theme--documenter-dark .control.has-icons-right .select:focus~.icon{color:#282f2f}html.theme--documenter-dark .control.has-icons-left .input.is-small~.icon,html.theme--documenter-dark .control.has-icons-left #documenter .docs-sidebar form.docs-search>input~.icon,html.theme--documenter-dark #documenter .docs-sidebar .control.has-icons-left form.docs-search>input~.icon,html.theme--documenter-dark .control.has-icons-left .select.is-small~.icon,html.theme--documenter-dark .control.has-icons-right .input.is-small~.icon,html.theme--documenter-dark .control.has-icons-right #documenter .docs-sidebar form.docs-search>input~.icon,html.theme--documenter-dark #documenter .docs-sidebar .control.has-icons-right form.docs-search>input~.icon,html.theme--documenter-dark .control.has-icons-right .select.is-small~.icon{font-size:.75rem}html.theme--documenter-dark .control.has-icons-left .input.is-medium~.icon,html.theme--documenter-dark .control.has-icons-left #documenter .docs-sidebar form.docs-search>input.is-medium~.icon,html.theme--documenter-dark #documenter .docs-sidebar .control.has-icons-left form.docs-search>input.is-medium~.icon,html.theme--documenter-dark .control.has-icons-left .select.is-medium~.icon,html.theme--documenter-dark .control.has-icons-right .input.is-medium~.icon,html.theme--documenter-dark .control.has-icons-right #documenter .docs-sidebar form.docs-search>input.is-medium~.icon,html.theme--documenter-dark #documenter .docs-sidebar .control.has-icons-right form.docs-search>input.is-medium~.icon,html.theme--documenter-dark .control.has-icons-right .select.is-medium~.icon{font-size:1.25rem}html.theme--documenter-dark .control.has-icons-left .input.is-large~.icon,html.theme--documenter-dark .control.has-icons-left #documenter .docs-sidebar form.docs-search>input.is-large~.icon,html.theme--documenter-dark #documenter .docs-sidebar .control.has-icons-left form.docs-search>input.is-large~.icon,html.theme--documenter-dark .control.has-icons-left .select.is-large~.icon,html.theme--documenter-dark .control.has-icons-right .input.is-large~.icon,html.theme--documenter-dark .control.has-icons-right #documenter .docs-sidebar form.docs-search>input.is-large~.icon,html.theme--documenter-dark #documenter .docs-sidebar .control.has-icons-right form.docs-search>input.is-large~.icon,html.theme--documenter-dark .control.has-icons-right .select.is-large~.icon{font-size:1.5rem}html.theme--documenter-dark .control.has-icons-left .icon,html.theme--documenter-dark .control.has-icons-right .icon{color:#5e6d6f;height:2.5em;pointer-events:none;position:absolute;top:0;width:2.5em;z-index:4}html.theme--documenter-dark .control.has-icons-left .input,html.theme--documenter-dark .control.has-icons-left #documenter .docs-sidebar form.docs-search>input,html.theme--documenter-dark #documenter .docs-sidebar .control.has-icons-left form.docs-search>input,html.theme--documenter-dark .control.has-icons-left .select select{padding-left:2.5em}html.theme--documenter-dark .control.has-icons-left .icon.is-left{left:0}html.theme--documenter-dark .control.has-icons-right .input,html.theme--documenter-dark .control.has-icons-right #documenter .docs-sidebar form.docs-search>input,html.theme--documenter-dark #documenter .docs-sidebar .control.has-icons-right form.docs-search>input,html.theme--documenter-dark .control.has-icons-right .select select{padding-right:2.5em}html.theme--documenter-dark .control.has-icons-right .icon.is-right{right:0}html.theme--documenter-dark .control.is-loading::after{position:absolute !important;right:.625em;top:0.625em;z-index:4}html.theme--documenter-dark .control.is-loading.is-small:after,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-loading:after{font-size:.75rem}html.theme--documenter-dark .control.is-loading.is-medium:after{font-size:1.25rem}html.theme--documenter-dark .control.is-loading.is-large:after{font-size:1.5rem}html.theme--documenter-dark .breadcrumb{font-size:1rem;white-space:nowrap}html.theme--documenter-dark .breadcrumb a{align-items:center;color:#1abc9c;display:flex;justify-content:center;padding:0 .75em}html.theme--documenter-dark .breadcrumb a:hover{color:#1dd2af}html.theme--documenter-dark .breadcrumb li{align-items:center;display:flex}html.theme--documenter-dark .breadcrumb li:first-child a{padding-left:0}html.theme--documenter-dark .breadcrumb li.is-active a{color:#f2f2f2;cursor:default;pointer-events:none}html.theme--documenter-dark .breadcrumb li+li::before{color:#8c9b9d;content:"\0002f"}html.theme--documenter-dark .breadcrumb ul,html.theme--documenter-dark .breadcrumb ol{align-items:flex-start;display:flex;flex-wrap:wrap;justify-content:flex-start}html.theme--documenter-dark .breadcrumb .icon:first-child{margin-right:.5em}html.theme--documenter-dark .breadcrumb .icon:last-child{margin-left:.5em}html.theme--documenter-dark .breadcrumb.is-centered ol,html.theme--documenter-dark .breadcrumb.is-centered ul{justify-content:center}html.theme--documenter-dark .breadcrumb.is-right ol,html.theme--documenter-dark .breadcrumb.is-right ul{justify-content:flex-end}html.theme--documenter-dark .breadcrumb.is-small,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.breadcrumb{font-size:.75rem}html.theme--documenter-dark .breadcrumb.is-medium{font-size:1.25rem}html.theme--documenter-dark .breadcrumb.is-large{font-size:1.5rem}html.theme--documenter-dark .breadcrumb.has-arrow-separator li+li::before{content:"\02192"}html.theme--documenter-dark .breadcrumb.has-bullet-separator li+li::before{content:"\02022"}html.theme--documenter-dark .breadcrumb.has-dot-separator li+li::before{content:"\000b7"}html.theme--documenter-dark .breadcrumb.has-succeeds-separator li+li::before{content:"\0227B"}html.theme--documenter-dark .card{background-color:#fff;border-radius:.25rem;box-shadow:#171717;color:#fff;max-width:100%;position:relative}html.theme--documenter-dark .card-footer:first-child,html.theme--documenter-dark .card-content:first-child,html.theme--documenter-dark .card-header:first-child{border-top-left-radius:.25rem;border-top-right-radius:.25rem}html.theme--documenter-dark .card-footer:last-child,html.theme--documenter-dark .card-content:last-child,html.theme--documenter-dark .card-header:last-child{border-bottom-left-radius:.25rem;border-bottom-right-radius:.25rem}html.theme--documenter-dark .card-header{background-color:rgba(0,0,0,0);align-items:stretch;box-shadow:0 0.125em 0.25em rgba(10,10,10,0.1);display:flex}html.theme--documenter-dark .card-header-title{align-items:center;color:#f2f2f2;display:flex;flex-grow:1;font-weight:700;padding:0.75rem 1rem}html.theme--documenter-dark .card-header-title.is-centered{justify-content:center}html.theme--documenter-dark .card-header-icon{-moz-appearance:none;-webkit-appearance:none;appearance:none;background:none;border:none;color:currentColor;font-family:inherit;font-size:1em;margin:0;padding:0;align-items:center;cursor:pointer;display:flex;justify-content:center;padding:0.75rem 1rem}html.theme--documenter-dark .card-image{display:block;position:relative}html.theme--documenter-dark .card-image:first-child img{border-top-left-radius:.25rem;border-top-right-radius:.25rem}html.theme--documenter-dark .card-image:last-child img{border-bottom-left-radius:.25rem;border-bottom-right-radius:.25rem}html.theme--documenter-dark .card-content{background-color:rgba(0,0,0,0);padding:1.5rem}html.theme--documenter-dark .card-footer{background-color:rgba(0,0,0,0);border-top:1px solid #ededed;align-items:stretch;display:flex}html.theme--documenter-dark .card-footer-item{align-items:center;display:flex;flex-basis:0;flex-grow:1;flex-shrink:0;justify-content:center;padding:.75rem}html.theme--documenter-dark .card-footer-item:not(:last-child){border-right:1px solid #ededed}html.theme--documenter-dark .card .media:not(:last-child){margin-bottom:1.5rem}html.theme--documenter-dark .dropdown{display:inline-flex;position:relative;vertical-align:top}html.theme--documenter-dark .dropdown.is-active .dropdown-menu,html.theme--documenter-dark .dropdown.is-hoverable:hover .dropdown-menu{display:block}html.theme--documenter-dark .dropdown.is-right .dropdown-menu{left:auto;right:0}html.theme--documenter-dark .dropdown.is-up .dropdown-menu{bottom:100%;padding-bottom:4px;padding-top:initial;top:auto}html.theme--documenter-dark .dropdown-menu{display:none;left:0;min-width:12rem;padding-top:4px;position:absolute;top:100%;z-index:20}html.theme--documenter-dark .dropdown-content{background-color:#282f2f;border-radius:.4em;box-shadow:#171717;padding-bottom:.5rem;padding-top:.5rem}html.theme--documenter-dark .dropdown-item{color:#fff;display:block;font-size:0.875rem;line-height:1.5;padding:0.375rem 1rem;position:relative}html.theme--documenter-dark a.dropdown-item,html.theme--documenter-dark button.dropdown-item{padding-right:3rem;text-align:inherit;white-space:nowrap;width:100%}html.theme--documenter-dark a.dropdown-item:hover,html.theme--documenter-dark button.dropdown-item:hover{background-color:#282f2f;color:#0a0a0a}html.theme--documenter-dark a.dropdown-item.is-active,html.theme--documenter-dark button.dropdown-item.is-active{background-color:#1abc9c;color:#fff}html.theme--documenter-dark .dropdown-divider{background-color:#ededed;border:none;display:block;height:1px;margin:0.5rem 0}html.theme--documenter-dark .level{align-items:center;justify-content:space-between}html.theme--documenter-dark .level code{border-radius:.4em}html.theme--documenter-dark .level img{display:inline-block;vertical-align:top}html.theme--documenter-dark .level.is-mobile{display:flex}html.theme--documenter-dark .level.is-mobile .level-left,html.theme--documenter-dark .level.is-mobile .level-right{display:flex}html.theme--documenter-dark .level.is-mobile .level-left+.level-right{margin-top:0}html.theme--documenter-dark .level.is-mobile .level-item:not(:last-child){margin-bottom:0;margin-right:.75rem}html.theme--documenter-dark .level.is-mobile .level-item:not(.is-narrow){flex-grow:1}@media screen and (min-width: 769px),print{html.theme--documenter-dark .level{display:flex}html.theme--documenter-dark .level>.level-item:not(.is-narrow){flex-grow:1}}html.theme--documenter-dark .level-item{align-items:center;display:flex;flex-basis:auto;flex-grow:0;flex-shrink:0;justify-content:center}html.theme--documenter-dark .level-item .title,html.theme--documenter-dark .level-item .subtitle{margin-bottom:0}@media screen and (max-width: 768px){html.theme--documenter-dark .level-item:not(:last-child){margin-bottom:.75rem}}html.theme--documenter-dark .level-left,html.theme--documenter-dark .level-right{flex-basis:auto;flex-grow:0;flex-shrink:0}html.theme--documenter-dark .level-left .level-item.is-flexible,html.theme--documenter-dark .level-right .level-item.is-flexible{flex-grow:1}@media screen and (min-width: 769px),print{html.theme--documenter-dark .level-left .level-item:not(:last-child),html.theme--documenter-dark .level-right .level-item:not(:last-child){margin-right:.75rem}}html.theme--documenter-dark .level-left{align-items:center;justify-content:flex-start}@media screen and (max-width: 768px){html.theme--documenter-dark .level-left+.level-right{margin-top:1.5rem}}@media screen and (min-width: 769px),print{html.theme--documenter-dark .level-left{display:flex}}html.theme--documenter-dark .level-right{align-items:center;justify-content:flex-end}@media screen and (min-width: 769px),print{html.theme--documenter-dark .level-right{display:flex}}html.theme--documenter-dark .media{align-items:flex-start;display:flex;text-align:inherit}html.theme--documenter-dark .media .content:not(:last-child){margin-bottom:.75rem}html.theme--documenter-dark .media .media{border-top:1px solid rgba(94,109,111,0.5);display:flex;padding-top:.75rem}html.theme--documenter-dark .media .media .content:not(:last-child),html.theme--documenter-dark .media .media .control:not(:last-child){margin-bottom:.5rem}html.theme--documenter-dark .media .media .media{padding-top:.5rem}html.theme--documenter-dark .media .media .media+.media{margin-top:.5rem}html.theme--documenter-dark .media+.media{border-top:1px solid rgba(94,109,111,0.5);margin-top:1rem;padding-top:1rem}html.theme--documenter-dark .media.is-large+.media{margin-top:1.5rem;padding-top:1.5rem}html.theme--documenter-dark .media-left,html.theme--documenter-dark .media-right{flex-basis:auto;flex-grow:0;flex-shrink:0}html.theme--documenter-dark .media-left{margin-right:1rem}html.theme--documenter-dark .media-right{margin-left:1rem}html.theme--documenter-dark .media-content{flex-basis:auto;flex-grow:1;flex-shrink:1;text-align:inherit}@media screen and (max-width: 768px){html.theme--documenter-dark .media-content{overflow-x:auto}}html.theme--documenter-dark .menu{font-size:1rem}html.theme--documenter-dark .menu.is-small,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.menu{font-size:.75rem}html.theme--documenter-dark .menu.is-medium{font-size:1.25rem}html.theme--documenter-dark .menu.is-large{font-size:1.5rem}html.theme--documenter-dark .menu-list{line-height:1.25}html.theme--documenter-dark .menu-list a{border-radius:3px;color:#fff;display:block;padding:0.5em 0.75em}html.theme--documenter-dark .menu-list a:hover{background-color:#282f2f;color:#f2f2f2}html.theme--documenter-dark .menu-list a.is-active{background-color:#1abc9c;color:#fff}html.theme--documenter-dark .menu-list li ul{border-left:1px solid #5e6d6f;margin:.75em;padding-left:.75em}html.theme--documenter-dark .menu-label{color:#fff;font-size:.75em;letter-spacing:.1em;text-transform:uppercase}html.theme--documenter-dark .menu-label:not(:first-child){margin-top:1em}html.theme--documenter-dark .menu-label:not(:last-child){margin-bottom:1em}html.theme--documenter-dark .message{background-color:#282f2f;border-radius:.4em;font-size:1rem}html.theme--documenter-dark .message strong{color:currentColor}html.theme--documenter-dark .message a:not(.button):not(.tag):not(.dropdown-item){color:currentColor;text-decoration:underline}html.theme--documenter-dark .message.is-small,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.message{font-size:.75rem}html.theme--documenter-dark .message.is-medium{font-size:1.25rem}html.theme--documenter-dark .message.is-large{font-size:1.5rem}html.theme--documenter-dark .message.is-white{background-color:#fff}html.theme--documenter-dark .message.is-white .message-header{background-color:#fff;color:#0a0a0a}html.theme--documenter-dark .message.is-white .message-body{border-color:#fff}html.theme--documenter-dark .message.is-black{background-color:#fafafa}html.theme--documenter-dark .message.is-black .message-header{background-color:#0a0a0a;color:#fff}html.theme--documenter-dark .message.is-black .message-body{border-color:#0a0a0a}html.theme--documenter-dark .message.is-light{background-color:#f9fafb}html.theme--documenter-dark .message.is-light .message-header{background-color:#ecf0f1;color:rgba(0,0,0,0.7)}html.theme--documenter-dark .message.is-light .message-body{border-color:#ecf0f1}html.theme--documenter-dark .message.is-dark,html.theme--documenter-dark .content kbd.message{background-color:#f9fafa}html.theme--documenter-dark .message.is-dark .message-header,html.theme--documenter-dark .content kbd.message .message-header{background-color:#282f2f;color:#fff}html.theme--documenter-dark .message.is-dark .message-body,html.theme--documenter-dark .content kbd.message .message-body{border-color:#282f2f}html.theme--documenter-dark .message.is-primary,html.theme--documenter-dark .docstring>section>a.message.docs-sourcelink{background-color:#f1f5f9}html.theme--documenter-dark .message.is-primary .message-header,html.theme--documenter-dark .docstring>section>a.message.docs-sourcelink .message-header{background-color:#375a7f;color:#fff}html.theme--documenter-dark .message.is-primary .message-body,html.theme--documenter-dark .docstring>section>a.message.docs-sourcelink .message-body{border-color:#375a7f;color:#4d7eb2}html.theme--documenter-dark .message.is-link{background-color:#edfdf9}html.theme--documenter-dark .message.is-link .message-header{background-color:#1abc9c;color:#fff}html.theme--documenter-dark .message.is-link .message-body{border-color:#1abc9c;color:#15987e}html.theme--documenter-dark .message.is-info{background-color:#ebf7ff}html.theme--documenter-dark .message.is-info .message-header{background-color:#024c7d;color:#fff}html.theme--documenter-dark .message.is-info .message-body{border-color:#024c7d;color:#0e9dfb}html.theme--documenter-dark .message.is-success{background-color:#ebfff3}html.theme--documenter-dark .message.is-success .message-header{background-color:#008438;color:#fff}html.theme--documenter-dark .message.is-success .message-body{border-color:#008438;color:#00eb64}html.theme--documenter-dark .message.is-warning{background-color:#fffaeb}html.theme--documenter-dark .message.is-warning .message-header{background-color:#ad8100;color:#fff}html.theme--documenter-dark .message.is-warning .message-body{border-color:#ad8100;color:#d19c00}html.theme--documenter-dark .message.is-danger{background-color:#fdeeec}html.theme--documenter-dark .message.is-danger .message-header{background-color:#9e1b0d;color:#fff}html.theme--documenter-dark .message.is-danger .message-body{border-color:#9e1b0d;color:#ec311d}html.theme--documenter-dark .message-header{align-items:center;background-color:#fff;border-radius:.4em .4em 0 0;color:rgba(0,0,0,0.7);display:flex;font-weight:700;justify-content:space-between;line-height:1.25;padding:0.75em 1em;position:relative}html.theme--documenter-dark .message-header .delete{flex-grow:0;flex-shrink:0;margin-left:.75em}html.theme--documenter-dark .message-header+.message-body{border-width:0;border-top-left-radius:0;border-top-right-radius:0}html.theme--documenter-dark .message-body{border-color:#5e6d6f;border-radius:.4em;border-style:solid;border-width:0 0 0 4px;color:#fff;padding:1.25em 1.5em}html.theme--documenter-dark .message-body code,html.theme--documenter-dark .message-body pre{background-color:#fff}html.theme--documenter-dark .message-body pre code{background-color:rgba(0,0,0,0)}html.theme--documenter-dark .modal{align-items:center;display:none;flex-direction:column;justify-content:center;overflow:hidden;position:fixed;z-index:40}html.theme--documenter-dark .modal.is-active{display:flex}html.theme--documenter-dark .modal-background{background-color:rgba(10,10,10,0.86)}html.theme--documenter-dark .modal-content,html.theme--documenter-dark .modal-card{margin:0 20px;max-height:calc(100vh - 160px);overflow:auto;position:relative;width:100%}@media screen and (min-width: 769px){html.theme--documenter-dark .modal-content,html.theme--documenter-dark .modal-card{margin:0 auto;max-height:calc(100vh - 40px);width:640px}}html.theme--documenter-dark .modal-close{background:none;height:40px;position:fixed;right:20px;top:20px;width:40px}html.theme--documenter-dark .modal-card{display:flex;flex-direction:column;max-height:calc(100vh - 40px);overflow:hidden;-ms-overflow-y:visible}html.theme--documenter-dark .modal-card-head,html.theme--documenter-dark .modal-card-foot{align-items:center;background-color:#282f2f;display:flex;flex-shrink:0;justify-content:flex-start;padding:20px;position:relative}html.theme--documenter-dark .modal-card-head{border-bottom:1px solid #5e6d6f;border-top-left-radius:8px;border-top-right-radius:8px}html.theme--documenter-dark .modal-card-title{color:#f2f2f2;flex-grow:1;flex-shrink:0;font-size:1.5rem;line-height:1}html.theme--documenter-dark .modal-card-foot{border-bottom-left-radius:8px;border-bottom-right-radius:8px;border-top:1px solid #5e6d6f}html.theme--documenter-dark .modal-card-foot .button:not(:last-child){margin-right:.5em}html.theme--documenter-dark .modal-card-body{-webkit-overflow-scrolling:touch;background-color:#fff;flex-grow:1;flex-shrink:1;overflow:auto;padding:20px}html.theme--documenter-dark .navbar{background-color:#375a7f;min-height:4rem;position:relative;z-index:30}html.theme--documenter-dark .navbar.is-white{background-color:#fff;color:#0a0a0a}html.theme--documenter-dark .navbar.is-white .navbar-brand>.navbar-item,html.theme--documenter-dark .navbar.is-white .navbar-brand .navbar-link{color:#0a0a0a}html.theme--documenter-dark .navbar.is-white .navbar-brand>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-white .navbar-brand>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-white .navbar-brand>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-white .navbar-brand .navbar-link:focus,html.theme--documenter-dark .navbar.is-white .navbar-brand .navbar-link:hover,html.theme--documenter-dark .navbar.is-white .navbar-brand .navbar-link.is-active{background-color:#f2f2f2;color:#0a0a0a}html.theme--documenter-dark .navbar.is-white .navbar-brand .navbar-link::after{border-color:#0a0a0a}html.theme--documenter-dark .navbar.is-white .navbar-burger{color:#0a0a0a}@media screen and (min-width: 1056px){html.theme--documenter-dark .navbar.is-white .navbar-start>.navbar-item,html.theme--documenter-dark .navbar.is-white .navbar-start .navbar-link,html.theme--documenter-dark .navbar.is-white .navbar-end>.navbar-item,html.theme--documenter-dark .navbar.is-white .navbar-end .navbar-link{color:#0a0a0a}html.theme--documenter-dark .navbar.is-white .navbar-start>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-white .navbar-start>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-white .navbar-start>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-white .navbar-start .navbar-link:focus,html.theme--documenter-dark .navbar.is-white .navbar-start .navbar-link:hover,html.theme--documenter-dark .navbar.is-white .navbar-start .navbar-link.is-active,html.theme--documenter-dark .navbar.is-white .navbar-end>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-white .navbar-end>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-white .navbar-end>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-white .navbar-end .navbar-link:focus,html.theme--documenter-dark .navbar.is-white .navbar-end .navbar-link:hover,html.theme--documenter-dark .navbar.is-white .navbar-end .navbar-link.is-active{background-color:#f2f2f2;color:#0a0a0a}html.theme--documenter-dark .navbar.is-white .navbar-start .navbar-link::after,html.theme--documenter-dark .navbar.is-white .navbar-end .navbar-link::after{border-color:#0a0a0a}html.theme--documenter-dark .navbar.is-white .navbar-item.has-dropdown:focus .navbar-link,html.theme--documenter-dark .navbar.is-white .navbar-item.has-dropdown:hover .navbar-link,html.theme--documenter-dark .navbar.is-white .navbar-item.has-dropdown.is-active .navbar-link{background-color:#f2f2f2;color:#0a0a0a}html.theme--documenter-dark .navbar.is-white .navbar-dropdown a.navbar-item.is-active{background-color:#fff;color:#0a0a0a}}html.theme--documenter-dark .navbar.is-black{background-color:#0a0a0a;color:#fff}html.theme--documenter-dark .navbar.is-black .navbar-brand>.navbar-item,html.theme--documenter-dark .navbar.is-black .navbar-brand .navbar-link{color:#fff}html.theme--documenter-dark .navbar.is-black .navbar-brand>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-black .navbar-brand>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-black .navbar-brand>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-black .navbar-brand .navbar-link:focus,html.theme--documenter-dark .navbar.is-black .navbar-brand .navbar-link:hover,html.theme--documenter-dark .navbar.is-black .navbar-brand .navbar-link.is-active{background-color:#000;color:#fff}html.theme--documenter-dark .navbar.is-black .navbar-brand .navbar-link::after{border-color:#fff}html.theme--documenter-dark .navbar.is-black .navbar-burger{color:#fff}@media screen and (min-width: 1056px){html.theme--documenter-dark .navbar.is-black .navbar-start>.navbar-item,html.theme--documenter-dark .navbar.is-black .navbar-start .navbar-link,html.theme--documenter-dark .navbar.is-black .navbar-end>.navbar-item,html.theme--documenter-dark .navbar.is-black .navbar-end .navbar-link{color:#fff}html.theme--documenter-dark .navbar.is-black .navbar-start>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-black .navbar-start>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-black .navbar-start>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-black .navbar-start .navbar-link:focus,html.theme--documenter-dark .navbar.is-black .navbar-start .navbar-link:hover,html.theme--documenter-dark .navbar.is-black .navbar-start .navbar-link.is-active,html.theme--documenter-dark .navbar.is-black .navbar-end>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-black .navbar-end>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-black .navbar-end>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-black .navbar-end .navbar-link:focus,html.theme--documenter-dark .navbar.is-black .navbar-end .navbar-link:hover,html.theme--documenter-dark .navbar.is-black .navbar-end .navbar-link.is-active{background-color:#000;color:#fff}html.theme--documenter-dark .navbar.is-black .navbar-start .navbar-link::after,html.theme--documenter-dark .navbar.is-black .navbar-end .navbar-link::after{border-color:#fff}html.theme--documenter-dark .navbar.is-black .navbar-item.has-dropdown:focus .navbar-link,html.theme--documenter-dark .navbar.is-black .navbar-item.has-dropdown:hover .navbar-link,html.theme--documenter-dark .navbar.is-black .navbar-item.has-dropdown.is-active .navbar-link{background-color:#000;color:#fff}html.theme--documenter-dark .navbar.is-black .navbar-dropdown a.navbar-item.is-active{background-color:#0a0a0a;color:#fff}}html.theme--documenter-dark .navbar.is-light{background-color:#ecf0f1;color:rgba(0,0,0,0.7)}html.theme--documenter-dark .navbar.is-light .navbar-brand>.navbar-item,html.theme--documenter-dark .navbar.is-light .navbar-brand .navbar-link{color:rgba(0,0,0,0.7)}html.theme--documenter-dark .navbar.is-light .navbar-brand>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-light .navbar-brand>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-light .navbar-brand>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-light .navbar-brand .navbar-link:focus,html.theme--documenter-dark .navbar.is-light .navbar-brand .navbar-link:hover,html.theme--documenter-dark .navbar.is-light .navbar-brand .navbar-link.is-active{background-color:#dde4e6;color:rgba(0,0,0,0.7)}html.theme--documenter-dark .navbar.is-light .navbar-brand .navbar-link::after{border-color:rgba(0,0,0,0.7)}html.theme--documenter-dark .navbar.is-light .navbar-burger{color:rgba(0,0,0,0.7)}@media screen and (min-width: 1056px){html.theme--documenter-dark .navbar.is-light .navbar-start>.navbar-item,html.theme--documenter-dark .navbar.is-light .navbar-start .navbar-link,html.theme--documenter-dark .navbar.is-light .navbar-end>.navbar-item,html.theme--documenter-dark .navbar.is-light .navbar-end .navbar-link{color:rgba(0,0,0,0.7)}html.theme--documenter-dark .navbar.is-light .navbar-start>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-light .navbar-start>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-light .navbar-start>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-light .navbar-start .navbar-link:focus,html.theme--documenter-dark .navbar.is-light .navbar-start .navbar-link:hover,html.theme--documenter-dark .navbar.is-light .navbar-start .navbar-link.is-active,html.theme--documenter-dark .navbar.is-light .navbar-end>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-light .navbar-end>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-light .navbar-end>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-light .navbar-end .navbar-link:focus,html.theme--documenter-dark .navbar.is-light .navbar-end .navbar-link:hover,html.theme--documenter-dark .navbar.is-light .navbar-end .navbar-link.is-active{background-color:#dde4e6;color:rgba(0,0,0,0.7)}html.theme--documenter-dark .navbar.is-light .navbar-start .navbar-link::after,html.theme--documenter-dark .navbar.is-light .navbar-end .navbar-link::after{border-color:rgba(0,0,0,0.7)}html.theme--documenter-dark .navbar.is-light .navbar-item.has-dropdown:focus .navbar-link,html.theme--documenter-dark .navbar.is-light .navbar-item.has-dropdown:hover .navbar-link,html.theme--documenter-dark .navbar.is-light .navbar-item.has-dropdown.is-active .navbar-link{background-color:#dde4e6;color:rgba(0,0,0,0.7)}html.theme--documenter-dark .navbar.is-light .navbar-dropdown a.navbar-item.is-active{background-color:#ecf0f1;color:rgba(0,0,0,0.7)}}html.theme--documenter-dark .navbar.is-dark,html.theme--documenter-dark .content kbd.navbar{background-color:#282f2f;color:#fff}html.theme--documenter-dark .navbar.is-dark .navbar-brand>.navbar-item,html.theme--documenter-dark .content kbd.navbar .navbar-brand>.navbar-item,html.theme--documenter-dark .navbar.is-dark .navbar-brand .navbar-link,html.theme--documenter-dark .content kbd.navbar .navbar-brand .navbar-link{color:#fff}html.theme--documenter-dark .navbar.is-dark .navbar-brand>a.navbar-item:focus,html.theme--documenter-dark .content kbd.navbar .navbar-brand>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-dark .navbar-brand>a.navbar-item:hover,html.theme--documenter-dark .content kbd.navbar .navbar-brand>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-dark .navbar-brand>a.navbar-item.is-active,html.theme--documenter-dark .content kbd.navbar .navbar-brand>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-dark .navbar-brand .navbar-link:focus,html.theme--documenter-dark .content kbd.navbar .navbar-brand .navbar-link:focus,html.theme--documenter-dark .navbar.is-dark .navbar-brand .navbar-link:hover,html.theme--documenter-dark .content kbd.navbar .navbar-brand .navbar-link:hover,html.theme--documenter-dark .navbar.is-dark .navbar-brand .navbar-link.is-active,html.theme--documenter-dark .content kbd.navbar .navbar-brand .navbar-link.is-active{background-color:#1d2122;color:#fff}html.theme--documenter-dark .navbar.is-dark .navbar-brand .navbar-link::after,html.theme--documenter-dark .content kbd.navbar .navbar-brand .navbar-link::after{border-color:#fff}html.theme--documenter-dark .navbar.is-dark .navbar-burger,html.theme--documenter-dark .content kbd.navbar .navbar-burger{color:#fff}@media screen and (min-width: 1056px){html.theme--documenter-dark .navbar.is-dark .navbar-start>.navbar-item,html.theme--documenter-dark .content kbd.navbar .navbar-start>.navbar-item,html.theme--documenter-dark .navbar.is-dark .navbar-start .navbar-link,html.theme--documenter-dark .content kbd.navbar .navbar-start .navbar-link,html.theme--documenter-dark .navbar.is-dark .navbar-end>.navbar-item,html.theme--documenter-dark .content kbd.navbar .navbar-end>.navbar-item,html.theme--documenter-dark .navbar.is-dark .navbar-end .navbar-link,html.theme--documenter-dark .content kbd.navbar .navbar-end .navbar-link{color:#fff}html.theme--documenter-dark .navbar.is-dark .navbar-start>a.navbar-item:focus,html.theme--documenter-dark .content kbd.navbar .navbar-start>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-dark .navbar-start>a.navbar-item:hover,html.theme--documenter-dark .content kbd.navbar .navbar-start>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-dark .navbar-start>a.navbar-item.is-active,html.theme--documenter-dark .content kbd.navbar .navbar-start>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-dark .navbar-start .navbar-link:focus,html.theme--documenter-dark .content kbd.navbar .navbar-start .navbar-link:focus,html.theme--documenter-dark .navbar.is-dark .navbar-start .navbar-link:hover,html.theme--documenter-dark .content kbd.navbar .navbar-start .navbar-link:hover,html.theme--documenter-dark .navbar.is-dark .navbar-start .navbar-link.is-active,html.theme--documenter-dark .content kbd.navbar .navbar-start .navbar-link.is-active,html.theme--documenter-dark .navbar.is-dark .navbar-end>a.navbar-item:focus,html.theme--documenter-dark .content kbd.navbar .navbar-end>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-dark .navbar-end>a.navbar-item:hover,html.theme--documenter-dark .content kbd.navbar .navbar-end>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-dark .navbar-end>a.navbar-item.is-active,html.theme--documenter-dark .content kbd.navbar .navbar-end>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-dark .navbar-end .navbar-link:focus,html.theme--documenter-dark .content kbd.navbar .navbar-end .navbar-link:focus,html.theme--documenter-dark .navbar.is-dark .navbar-end .navbar-link:hover,html.theme--documenter-dark .content kbd.navbar .navbar-end .navbar-link:hover,html.theme--documenter-dark .navbar.is-dark .navbar-end .navbar-link.is-active,html.theme--documenter-dark .content kbd.navbar .navbar-end .navbar-link.is-active{background-color:#1d2122;color:#fff}html.theme--documenter-dark .navbar.is-dark .navbar-start .navbar-link::after,html.theme--documenter-dark .content kbd.navbar .navbar-start .navbar-link::after,html.theme--documenter-dark .navbar.is-dark .navbar-end .navbar-link::after,html.theme--documenter-dark .content kbd.navbar .navbar-end .navbar-link::after{border-color:#fff}html.theme--documenter-dark .navbar.is-dark .navbar-item.has-dropdown:focus .navbar-link,html.theme--documenter-dark .content kbd.navbar .navbar-item.has-dropdown:focus .navbar-link,html.theme--documenter-dark .navbar.is-dark .navbar-item.has-dropdown:hover .navbar-link,html.theme--documenter-dark .content kbd.navbar .navbar-item.has-dropdown:hover .navbar-link,html.theme--documenter-dark .navbar.is-dark .navbar-item.has-dropdown.is-active .navbar-link,html.theme--documenter-dark .content kbd.navbar .navbar-item.has-dropdown.is-active .navbar-link{background-color:#1d2122;color:#fff}html.theme--documenter-dark .navbar.is-dark .navbar-dropdown a.navbar-item.is-active,html.theme--documenter-dark .content kbd.navbar .navbar-dropdown a.navbar-item.is-active{background-color:#282f2f;color:#fff}}html.theme--documenter-dark .navbar.is-primary,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink{background-color:#375a7f;color:#fff}html.theme--documenter-dark .navbar.is-primary .navbar-brand>.navbar-item,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-brand>.navbar-item,html.theme--documenter-dark .navbar.is-primary .navbar-brand .navbar-link,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-brand .navbar-link{color:#fff}html.theme--documenter-dark .navbar.is-primary .navbar-brand>a.navbar-item:focus,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-brand>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-primary .navbar-brand>a.navbar-item:hover,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-brand>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-primary .navbar-brand>a.navbar-item.is-active,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-brand>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-primary .navbar-brand .navbar-link:focus,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-brand .navbar-link:focus,html.theme--documenter-dark .navbar.is-primary .navbar-brand .navbar-link:hover,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-brand .navbar-link:hover,html.theme--documenter-dark .navbar.is-primary .navbar-brand .navbar-link.is-active,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-brand .navbar-link.is-active{background-color:#2f4d6d;color:#fff}html.theme--documenter-dark .navbar.is-primary .navbar-brand .navbar-link::after,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-brand .navbar-link::after{border-color:#fff}html.theme--documenter-dark .navbar.is-primary .navbar-burger,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-burger{color:#fff}@media screen and (min-width: 1056px){html.theme--documenter-dark .navbar.is-primary .navbar-start>.navbar-item,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-start>.navbar-item,html.theme--documenter-dark .navbar.is-primary .navbar-start .navbar-link,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-start .navbar-link,html.theme--documenter-dark .navbar.is-primary .navbar-end>.navbar-item,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-end>.navbar-item,html.theme--documenter-dark .navbar.is-primary .navbar-end .navbar-link,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-end .navbar-link{color:#fff}html.theme--documenter-dark .navbar.is-primary .navbar-start>a.navbar-item:focus,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-start>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-primary .navbar-start>a.navbar-item:hover,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-start>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-primary .navbar-start>a.navbar-item.is-active,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-start>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-primary .navbar-start .navbar-link:focus,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-start .navbar-link:focus,html.theme--documenter-dark .navbar.is-primary .navbar-start .navbar-link:hover,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-start .navbar-link:hover,html.theme--documenter-dark .navbar.is-primary .navbar-start .navbar-link.is-active,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-start .navbar-link.is-active,html.theme--documenter-dark .navbar.is-primary .navbar-end>a.navbar-item:focus,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-end>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-primary .navbar-end>a.navbar-item:hover,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-end>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-primary .navbar-end>a.navbar-item.is-active,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-end>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-primary .navbar-end .navbar-link:focus,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-end .navbar-link:focus,html.theme--documenter-dark .navbar.is-primary .navbar-end .navbar-link:hover,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-end .navbar-link:hover,html.theme--documenter-dark .navbar.is-primary .navbar-end .navbar-link.is-active,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-end .navbar-link.is-active{background-color:#2f4d6d;color:#fff}html.theme--documenter-dark .navbar.is-primary .navbar-start .navbar-link::after,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-start .navbar-link::after,html.theme--documenter-dark .navbar.is-primary .navbar-end .navbar-link::after,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-end .navbar-link::after{border-color:#fff}html.theme--documenter-dark .navbar.is-primary .navbar-item.has-dropdown:focus .navbar-link,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-item.has-dropdown:focus .navbar-link,html.theme--documenter-dark .navbar.is-primary .navbar-item.has-dropdown:hover .navbar-link,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-item.has-dropdown:hover .navbar-link,html.theme--documenter-dark .navbar.is-primary .navbar-item.has-dropdown.is-active .navbar-link,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-item.has-dropdown.is-active .navbar-link{background-color:#2f4d6d;color:#fff}html.theme--documenter-dark .navbar.is-primary .navbar-dropdown a.navbar-item.is-active,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-dropdown a.navbar-item.is-active{background-color:#375a7f;color:#fff}}html.theme--documenter-dark .navbar.is-link{background-color:#1abc9c;color:#fff}html.theme--documenter-dark .navbar.is-link .navbar-brand>.navbar-item,html.theme--documenter-dark .navbar.is-link .navbar-brand .navbar-link{color:#fff}html.theme--documenter-dark .navbar.is-link .navbar-brand>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-link .navbar-brand>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-link .navbar-brand>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-link .navbar-brand .navbar-link:focus,html.theme--documenter-dark .navbar.is-link .navbar-brand .navbar-link:hover,html.theme--documenter-dark .navbar.is-link .navbar-brand .navbar-link.is-active{background-color:#17a689;color:#fff}html.theme--documenter-dark .navbar.is-link .navbar-brand .navbar-link::after{border-color:#fff}html.theme--documenter-dark .navbar.is-link .navbar-burger{color:#fff}@media screen and (min-width: 1056px){html.theme--documenter-dark .navbar.is-link .navbar-start>.navbar-item,html.theme--documenter-dark .navbar.is-link .navbar-start .navbar-link,html.theme--documenter-dark .navbar.is-link .navbar-end>.navbar-item,html.theme--documenter-dark .navbar.is-link .navbar-end .navbar-link{color:#fff}html.theme--documenter-dark .navbar.is-link .navbar-start>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-link .navbar-start>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-link .navbar-start>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-link .navbar-start .navbar-link:focus,html.theme--documenter-dark .navbar.is-link .navbar-start .navbar-link:hover,html.theme--documenter-dark .navbar.is-link .navbar-start .navbar-link.is-active,html.theme--documenter-dark .navbar.is-link .navbar-end>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-link .navbar-end>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-link .navbar-end>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-link .navbar-end .navbar-link:focus,html.theme--documenter-dark .navbar.is-link .navbar-end .navbar-link:hover,html.theme--documenter-dark .navbar.is-link .navbar-end .navbar-link.is-active{background-color:#17a689;color:#fff}html.theme--documenter-dark .navbar.is-link .navbar-start .navbar-link::after,html.theme--documenter-dark .navbar.is-link .navbar-end .navbar-link::after{border-color:#fff}html.theme--documenter-dark .navbar.is-link .navbar-item.has-dropdown:focus .navbar-link,html.theme--documenter-dark .navbar.is-link .navbar-item.has-dropdown:hover .navbar-link,html.theme--documenter-dark .navbar.is-link .navbar-item.has-dropdown.is-active .navbar-link{background-color:#17a689;color:#fff}html.theme--documenter-dark .navbar.is-link .navbar-dropdown a.navbar-item.is-active{background-color:#1abc9c;color:#fff}}html.theme--documenter-dark .navbar.is-info{background-color:#024c7d;color:#fff}html.theme--documenter-dark .navbar.is-info .navbar-brand>.navbar-item,html.theme--documenter-dark .navbar.is-info .navbar-brand .navbar-link{color:#fff}html.theme--documenter-dark .navbar.is-info .navbar-brand>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-info .navbar-brand>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-info .navbar-brand>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-info .navbar-brand .navbar-link:focus,html.theme--documenter-dark .navbar.is-info .navbar-brand .navbar-link:hover,html.theme--documenter-dark .navbar.is-info .navbar-brand .navbar-link.is-active{background-color:#023d64;color:#fff}html.theme--documenter-dark .navbar.is-info .navbar-brand .navbar-link::after{border-color:#fff}html.theme--documenter-dark .navbar.is-info .navbar-burger{color:#fff}@media screen and (min-width: 1056px){html.theme--documenter-dark .navbar.is-info .navbar-start>.navbar-item,html.theme--documenter-dark .navbar.is-info .navbar-start .navbar-link,html.theme--documenter-dark .navbar.is-info .navbar-end>.navbar-item,html.theme--documenter-dark .navbar.is-info .navbar-end .navbar-link{color:#fff}html.theme--documenter-dark .navbar.is-info .navbar-start>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-info .navbar-start>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-info .navbar-start>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-info .navbar-start .navbar-link:focus,html.theme--documenter-dark .navbar.is-info .navbar-start .navbar-link:hover,html.theme--documenter-dark .navbar.is-info .navbar-start .navbar-link.is-active,html.theme--documenter-dark .navbar.is-info .navbar-end>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-info .navbar-end>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-info .navbar-end>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-info .navbar-end .navbar-link:focus,html.theme--documenter-dark .navbar.is-info .navbar-end .navbar-link:hover,html.theme--documenter-dark .navbar.is-info .navbar-end .navbar-link.is-active{background-color:#023d64;color:#fff}html.theme--documenter-dark .navbar.is-info .navbar-start .navbar-link::after,html.theme--documenter-dark .navbar.is-info .navbar-end .navbar-link::after{border-color:#fff}html.theme--documenter-dark .navbar.is-info .navbar-item.has-dropdown:focus .navbar-link,html.theme--documenter-dark .navbar.is-info .navbar-item.has-dropdown:hover .navbar-link,html.theme--documenter-dark .navbar.is-info .navbar-item.has-dropdown.is-active .navbar-link{background-color:#023d64;color:#fff}html.theme--documenter-dark .navbar.is-info .navbar-dropdown a.navbar-item.is-active{background-color:#024c7d;color:#fff}}html.theme--documenter-dark .navbar.is-success{background-color:#008438;color:#fff}html.theme--documenter-dark .navbar.is-success .navbar-brand>.navbar-item,html.theme--documenter-dark .navbar.is-success .navbar-brand .navbar-link{color:#fff}html.theme--documenter-dark .navbar.is-success .navbar-brand>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-success .navbar-brand>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-success .navbar-brand>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-success .navbar-brand .navbar-link:focus,html.theme--documenter-dark .navbar.is-success .navbar-brand .navbar-link:hover,html.theme--documenter-dark .navbar.is-success .navbar-brand .navbar-link.is-active{background-color:#006b2d;color:#fff}html.theme--documenter-dark .navbar.is-success .navbar-brand .navbar-link::after{border-color:#fff}html.theme--documenter-dark .navbar.is-success .navbar-burger{color:#fff}@media screen and (min-width: 1056px){html.theme--documenter-dark .navbar.is-success .navbar-start>.navbar-item,html.theme--documenter-dark .navbar.is-success .navbar-start .navbar-link,html.theme--documenter-dark .navbar.is-success .navbar-end>.navbar-item,html.theme--documenter-dark .navbar.is-success .navbar-end .navbar-link{color:#fff}html.theme--documenter-dark .navbar.is-success .navbar-start>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-success .navbar-start>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-success .navbar-start>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-success .navbar-start .navbar-link:focus,html.theme--documenter-dark .navbar.is-success .navbar-start .navbar-link:hover,html.theme--documenter-dark .navbar.is-success .navbar-start .navbar-link.is-active,html.theme--documenter-dark .navbar.is-success .navbar-end>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-success .navbar-end>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-success .navbar-end>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-success .navbar-end .navbar-link:focus,html.theme--documenter-dark .navbar.is-success .navbar-end .navbar-link:hover,html.theme--documenter-dark .navbar.is-success .navbar-end .navbar-link.is-active{background-color:#006b2d;color:#fff}html.theme--documenter-dark .navbar.is-success .navbar-start .navbar-link::after,html.theme--documenter-dark .navbar.is-success .navbar-end .navbar-link::after{border-color:#fff}html.theme--documenter-dark .navbar.is-success .navbar-item.has-dropdown:focus .navbar-link,html.theme--documenter-dark .navbar.is-success .navbar-item.has-dropdown:hover .navbar-link,html.theme--documenter-dark .navbar.is-success .navbar-item.has-dropdown.is-active .navbar-link{background-color:#006b2d;color:#fff}html.theme--documenter-dark .navbar.is-success .navbar-dropdown a.navbar-item.is-active{background-color:#008438;color:#fff}}html.theme--documenter-dark .navbar.is-warning{background-color:#ad8100;color:#fff}html.theme--documenter-dark .navbar.is-warning .navbar-brand>.navbar-item,html.theme--documenter-dark .navbar.is-warning .navbar-brand .navbar-link{color:#fff}html.theme--documenter-dark .navbar.is-warning .navbar-brand>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-warning .navbar-brand>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-warning .navbar-brand>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-warning .navbar-brand .navbar-link:focus,html.theme--documenter-dark .navbar.is-warning .navbar-brand .navbar-link:hover,html.theme--documenter-dark .navbar.is-warning .navbar-brand .navbar-link.is-active{background-color:#946e00;color:#fff}html.theme--documenter-dark .navbar.is-warning .navbar-brand .navbar-link::after{border-color:#fff}html.theme--documenter-dark .navbar.is-warning .navbar-burger{color:#fff}@media screen and (min-width: 1056px){html.theme--documenter-dark .navbar.is-warning .navbar-start>.navbar-item,html.theme--documenter-dark .navbar.is-warning .navbar-start .navbar-link,html.theme--documenter-dark .navbar.is-warning .navbar-end>.navbar-item,html.theme--documenter-dark .navbar.is-warning .navbar-end .navbar-link{color:#fff}html.theme--documenter-dark .navbar.is-warning .navbar-start>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-warning .navbar-start>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-warning .navbar-start>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-warning .navbar-start .navbar-link:focus,html.theme--documenter-dark .navbar.is-warning .navbar-start .navbar-link:hover,html.theme--documenter-dark .navbar.is-warning .navbar-start .navbar-link.is-active,html.theme--documenter-dark .navbar.is-warning .navbar-end>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-warning .navbar-end>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-warning .navbar-end>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-warning .navbar-end .navbar-link:focus,html.theme--documenter-dark .navbar.is-warning .navbar-end .navbar-link:hover,html.theme--documenter-dark .navbar.is-warning .navbar-end .navbar-link.is-active{background-color:#946e00;color:#fff}html.theme--documenter-dark .navbar.is-warning .navbar-start .navbar-link::after,html.theme--documenter-dark .navbar.is-warning .navbar-end .navbar-link::after{border-color:#fff}html.theme--documenter-dark .navbar.is-warning .navbar-item.has-dropdown:focus .navbar-link,html.theme--documenter-dark .navbar.is-warning .navbar-item.has-dropdown:hover .navbar-link,html.theme--documenter-dark .navbar.is-warning .navbar-item.has-dropdown.is-active .navbar-link{background-color:#946e00;color:#fff}html.theme--documenter-dark .navbar.is-warning .navbar-dropdown a.navbar-item.is-active{background-color:#ad8100;color:#fff}}html.theme--documenter-dark .navbar.is-danger{background-color:#9e1b0d;color:#fff}html.theme--documenter-dark .navbar.is-danger .navbar-brand>.navbar-item,html.theme--documenter-dark .navbar.is-danger .navbar-brand .navbar-link{color:#fff}html.theme--documenter-dark .navbar.is-danger .navbar-brand>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-danger .navbar-brand>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-danger .navbar-brand>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-danger .navbar-brand .navbar-link:focus,html.theme--documenter-dark .navbar.is-danger .navbar-brand .navbar-link:hover,html.theme--documenter-dark .navbar.is-danger .navbar-brand .navbar-link.is-active{background-color:#86170b;color:#fff}html.theme--documenter-dark .navbar.is-danger .navbar-brand .navbar-link::after{border-color:#fff}html.theme--documenter-dark .navbar.is-danger .navbar-burger{color:#fff}@media screen and (min-width: 1056px){html.theme--documenter-dark .navbar.is-danger .navbar-start>.navbar-item,html.theme--documenter-dark .navbar.is-danger .navbar-start .navbar-link,html.theme--documenter-dark .navbar.is-danger .navbar-end>.navbar-item,html.theme--documenter-dark .navbar.is-danger .navbar-end .navbar-link{color:#fff}html.theme--documenter-dark .navbar.is-danger .navbar-start>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-danger .navbar-start>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-danger .navbar-start>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-danger .navbar-start .navbar-link:focus,html.theme--documenter-dark .navbar.is-danger .navbar-start .navbar-link:hover,html.theme--documenter-dark .navbar.is-danger .navbar-start .navbar-link.is-active,html.theme--documenter-dark .navbar.is-danger .navbar-end>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-danger .navbar-end>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-danger .navbar-end>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-danger .navbar-end .navbar-link:focus,html.theme--documenter-dark .navbar.is-danger .navbar-end .navbar-link:hover,html.theme--documenter-dark .navbar.is-danger .navbar-end .navbar-link.is-active{background-color:#86170b;color:#fff}html.theme--documenter-dark .navbar.is-danger .navbar-start .navbar-link::after,html.theme--documenter-dark .navbar.is-danger .navbar-end .navbar-link::after{border-color:#fff}html.theme--documenter-dark .navbar.is-danger .navbar-item.has-dropdown:focus .navbar-link,html.theme--documenter-dark .navbar.is-danger .navbar-item.has-dropdown:hover .navbar-link,html.theme--documenter-dark .navbar.is-danger .navbar-item.has-dropdown.is-active .navbar-link{background-color:#86170b;color:#fff}html.theme--documenter-dark .navbar.is-danger .navbar-dropdown a.navbar-item.is-active{background-color:#9e1b0d;color:#fff}}html.theme--documenter-dark .navbar>.container{align-items:stretch;display:flex;min-height:4rem;width:100%}html.theme--documenter-dark .navbar.has-shadow{box-shadow:0 2px 0 0 #282f2f}html.theme--documenter-dark .navbar.is-fixed-bottom,html.theme--documenter-dark .navbar.is-fixed-top{left:0;position:fixed;right:0;z-index:30}html.theme--documenter-dark .navbar.is-fixed-bottom{bottom:0}html.theme--documenter-dark .navbar.is-fixed-bottom.has-shadow{box-shadow:0 -2px 0 0 #282f2f}html.theme--documenter-dark .navbar.is-fixed-top{top:0}html.theme--documenter-dark html.has-navbar-fixed-top,html.theme--documenter-dark body.has-navbar-fixed-top{padding-top:4rem}html.theme--documenter-dark html.has-navbar-fixed-bottom,html.theme--documenter-dark body.has-navbar-fixed-bottom{padding-bottom:4rem}html.theme--documenter-dark .navbar-brand,html.theme--documenter-dark .navbar-tabs{align-items:stretch;display:flex;flex-shrink:0;min-height:4rem}html.theme--documenter-dark .navbar-brand a.navbar-item:focus,html.theme--documenter-dark .navbar-brand a.navbar-item:hover{background-color:transparent}html.theme--documenter-dark .navbar-tabs{-webkit-overflow-scrolling:touch;max-width:100vw;overflow-x:auto;overflow-y:hidden}html.theme--documenter-dark .navbar-burger{color:#fff;-moz-appearance:none;-webkit-appearance:none;appearance:none;background:none;border:none;cursor:pointer;display:block;height:4rem;position:relative;width:4rem;margin-left:auto}html.theme--documenter-dark .navbar-burger span{background-color:currentColor;display:block;height:1px;left:calc(50% - 8px);position:absolute;transform-origin:center;transition-duration:86ms;transition-property:background-color, opacity, transform;transition-timing-function:ease-out;width:16px}html.theme--documenter-dark .navbar-burger span:nth-child(1){top:calc(50% - 6px)}html.theme--documenter-dark .navbar-burger span:nth-child(2){top:calc(50% - 1px)}html.theme--documenter-dark .navbar-burger span:nth-child(3){top:calc(50% + 4px)}html.theme--documenter-dark .navbar-burger:hover{background-color:rgba(0,0,0,0.05)}html.theme--documenter-dark .navbar-burger.is-active span:nth-child(1){transform:translateY(5px) rotate(45deg)}html.theme--documenter-dark .navbar-burger.is-active span:nth-child(2){opacity:0}html.theme--documenter-dark .navbar-burger.is-active span:nth-child(3){transform:translateY(-5px) rotate(-45deg)}html.theme--documenter-dark .navbar-menu{display:none}html.theme--documenter-dark .navbar-item,html.theme--documenter-dark .navbar-link{color:#fff;display:block;line-height:1.5;padding:0.5rem 0.75rem;position:relative}html.theme--documenter-dark .navbar-item .icon:only-child,html.theme--documenter-dark .navbar-link .icon:only-child{margin-left:-0.25rem;margin-right:-0.25rem}html.theme--documenter-dark a.navbar-item,html.theme--documenter-dark .navbar-link{cursor:pointer}html.theme--documenter-dark a.navbar-item:focus,html.theme--documenter-dark a.navbar-item:focus-within,html.theme--documenter-dark a.navbar-item:hover,html.theme--documenter-dark a.navbar-item.is-active,html.theme--documenter-dark .navbar-link:focus,html.theme--documenter-dark .navbar-link:focus-within,html.theme--documenter-dark .navbar-link:hover,html.theme--documenter-dark .navbar-link.is-active{background-color:rgba(0,0,0,0);color:#1abc9c}html.theme--documenter-dark .navbar-item{flex-grow:0;flex-shrink:0}html.theme--documenter-dark .navbar-item img{max-height:1.75rem}html.theme--documenter-dark .navbar-item.has-dropdown{padding:0}html.theme--documenter-dark .navbar-item.is-expanded{flex-grow:1;flex-shrink:1}html.theme--documenter-dark .navbar-item.is-tab{border-bottom:1px solid transparent;min-height:4rem;padding-bottom:calc(0.5rem - 1px)}html.theme--documenter-dark .navbar-item.is-tab:focus,html.theme--documenter-dark .navbar-item.is-tab:hover{background-color:rgba(0,0,0,0);border-bottom-color:#1abc9c}html.theme--documenter-dark .navbar-item.is-tab.is-active{background-color:rgba(0,0,0,0);border-bottom-color:#1abc9c;border-bottom-style:solid;border-bottom-width:3px;color:#1abc9c;padding-bottom:calc(0.5rem - 3px)}html.theme--documenter-dark .navbar-content{flex-grow:1;flex-shrink:1}html.theme--documenter-dark .navbar-link:not(.is-arrowless){padding-right:2.5em}html.theme--documenter-dark .navbar-link:not(.is-arrowless)::after{border-color:#fff;margin-top:-0.375em;right:1.125em}html.theme--documenter-dark .navbar-dropdown{font-size:0.875rem;padding-bottom:0.5rem;padding-top:0.5rem}html.theme--documenter-dark .navbar-dropdown .navbar-item{padding-left:1.5rem;padding-right:1.5rem}html.theme--documenter-dark .navbar-divider{background-color:rgba(0,0,0,0.2);border:none;display:none;height:2px;margin:0.5rem 0}@media screen and (max-width: 1055px){html.theme--documenter-dark .navbar>.container{display:block}html.theme--documenter-dark .navbar-brand .navbar-item,html.theme--documenter-dark .navbar-tabs .navbar-item{align-items:center;display:flex}html.theme--documenter-dark .navbar-link::after{display:none}html.theme--documenter-dark .navbar-menu{background-color:#375a7f;box-shadow:0 8px 16px rgba(10,10,10,0.1);padding:0.5rem 0}html.theme--documenter-dark .navbar-menu.is-active{display:block}html.theme--documenter-dark .navbar.is-fixed-bottom-touch,html.theme--documenter-dark .navbar.is-fixed-top-touch{left:0;position:fixed;right:0;z-index:30}html.theme--documenter-dark .navbar.is-fixed-bottom-touch{bottom:0}html.theme--documenter-dark .navbar.is-fixed-bottom-touch.has-shadow{box-shadow:0 -2px 3px rgba(10,10,10,0.1)}html.theme--documenter-dark .navbar.is-fixed-top-touch{top:0}html.theme--documenter-dark .navbar.is-fixed-top .navbar-menu,html.theme--documenter-dark .navbar.is-fixed-top-touch .navbar-menu{-webkit-overflow-scrolling:touch;max-height:calc(100vh - 4rem);overflow:auto}html.theme--documenter-dark html.has-navbar-fixed-top-touch,html.theme--documenter-dark body.has-navbar-fixed-top-touch{padding-top:4rem}html.theme--documenter-dark html.has-navbar-fixed-bottom-touch,html.theme--documenter-dark body.has-navbar-fixed-bottom-touch{padding-bottom:4rem}}@media screen and (min-width: 1056px){html.theme--documenter-dark .navbar,html.theme--documenter-dark .navbar-menu,html.theme--documenter-dark .navbar-start,html.theme--documenter-dark .navbar-end{align-items:stretch;display:flex}html.theme--documenter-dark .navbar{min-height:4rem}html.theme--documenter-dark .navbar.is-spaced{padding:1rem 2rem}html.theme--documenter-dark .navbar.is-spaced .navbar-start,html.theme--documenter-dark .navbar.is-spaced .navbar-end{align-items:center}html.theme--documenter-dark .navbar.is-spaced a.navbar-item,html.theme--documenter-dark .navbar.is-spaced .navbar-link{border-radius:.4em}html.theme--documenter-dark .navbar.is-transparent a.navbar-item:focus,html.theme--documenter-dark .navbar.is-transparent a.navbar-item:hover,html.theme--documenter-dark .navbar.is-transparent a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-transparent .navbar-link:focus,html.theme--documenter-dark .navbar.is-transparent .navbar-link:hover,html.theme--documenter-dark .navbar.is-transparent .navbar-link.is-active{background-color:transparent !important}html.theme--documenter-dark .navbar.is-transparent .navbar-item.has-dropdown.is-active .navbar-link,html.theme--documenter-dark .navbar.is-transparent .navbar-item.has-dropdown.is-hoverable:focus .navbar-link,html.theme--documenter-dark .navbar.is-transparent .navbar-item.has-dropdown.is-hoverable:focus-within .navbar-link,html.theme--documenter-dark .navbar.is-transparent .navbar-item.has-dropdown.is-hoverable:hover .navbar-link{background-color:transparent !important}html.theme--documenter-dark .navbar.is-transparent .navbar-dropdown a.navbar-item:focus,html.theme--documenter-dark .navbar.is-transparent .navbar-dropdown a.navbar-item:hover{background-color:rgba(0,0,0,0);color:#dbdee0}html.theme--documenter-dark .navbar.is-transparent .navbar-dropdown a.navbar-item.is-active{background-color:rgba(0,0,0,0);color:#1abc9c}html.theme--documenter-dark .navbar-burger{display:none}html.theme--documenter-dark .navbar-item,html.theme--documenter-dark .navbar-link{align-items:center;display:flex}html.theme--documenter-dark .navbar-item.has-dropdown{align-items:stretch}html.theme--documenter-dark .navbar-item.has-dropdown-up .navbar-link::after{transform:rotate(135deg) translate(0.25em, -0.25em)}html.theme--documenter-dark .navbar-item.has-dropdown-up .navbar-dropdown{border-bottom:1px solid rgba(0,0,0,0.2);border-radius:8px 8px 0 0;border-top:none;bottom:100%;box-shadow:0 -8px 8px rgba(10,10,10,0.1);top:auto}html.theme--documenter-dark .navbar-item.is-active .navbar-dropdown,html.theme--documenter-dark .navbar-item.is-hoverable:focus .navbar-dropdown,html.theme--documenter-dark .navbar-item.is-hoverable:focus-within .navbar-dropdown,html.theme--documenter-dark .navbar-item.is-hoverable:hover .navbar-dropdown{display:block}.navbar.is-spaced html.theme--documenter-dark .navbar-item.is-active .navbar-dropdown,html.theme--documenter-dark .navbar-item.is-active .navbar-dropdown.is-boxed,.navbar.is-spaced html.theme--documenter-dark .navbar-item.is-hoverable:focus .navbar-dropdown,html.theme--documenter-dark .navbar-item.is-hoverable:focus .navbar-dropdown.is-boxed,.navbar.is-spaced html.theme--documenter-dark .navbar-item.is-hoverable:focus-within .navbar-dropdown,html.theme--documenter-dark .navbar-item.is-hoverable:focus-within .navbar-dropdown.is-boxed,.navbar.is-spaced html.theme--documenter-dark .navbar-item.is-hoverable:hover .navbar-dropdown,html.theme--documenter-dark .navbar-item.is-hoverable:hover .navbar-dropdown.is-boxed{opacity:1;pointer-events:auto;transform:translateY(0)}html.theme--documenter-dark .navbar-menu{flex-grow:1;flex-shrink:0}html.theme--documenter-dark .navbar-start{justify-content:flex-start;margin-right:auto}html.theme--documenter-dark .navbar-end{justify-content:flex-end;margin-left:auto}html.theme--documenter-dark .navbar-dropdown{background-color:#375a7f;border-bottom-left-radius:8px;border-bottom-right-radius:8px;border-top:1px solid rgba(0,0,0,0.2);box-shadow:0 8px 8px rgba(10,10,10,0.1);display:none;font-size:0.875rem;left:0;min-width:100%;position:absolute;top:100%;z-index:20}html.theme--documenter-dark .navbar-dropdown .navbar-item{padding:0.375rem 1rem;white-space:nowrap}html.theme--documenter-dark .navbar-dropdown a.navbar-item{padding-right:3rem}html.theme--documenter-dark .navbar-dropdown a.navbar-item:focus,html.theme--documenter-dark .navbar-dropdown a.navbar-item:hover{background-color:rgba(0,0,0,0);color:#dbdee0}html.theme--documenter-dark .navbar-dropdown a.navbar-item.is-active{background-color:rgba(0,0,0,0);color:#1abc9c}.navbar.is-spaced html.theme--documenter-dark .navbar-dropdown,html.theme--documenter-dark .navbar-dropdown.is-boxed{border-radius:8px;border-top:none;box-shadow:0 8px 8px rgba(10,10,10,0.1), 0 0 0 1px rgba(10,10,10,0.1);display:block;opacity:0;pointer-events:none;top:calc(100% + (-4px));transform:translateY(-5px);transition-duration:86ms;transition-property:opacity, transform}html.theme--documenter-dark .navbar-dropdown.is-right{left:auto;right:0}html.theme--documenter-dark .navbar-divider{display:block}html.theme--documenter-dark .navbar>.container .navbar-brand,html.theme--documenter-dark .container>.navbar .navbar-brand{margin-left:-.75rem}html.theme--documenter-dark .navbar>.container .navbar-menu,html.theme--documenter-dark .container>.navbar .navbar-menu{margin-right:-.75rem}html.theme--documenter-dark .navbar.is-fixed-bottom-desktop,html.theme--documenter-dark .navbar.is-fixed-top-desktop{left:0;position:fixed;right:0;z-index:30}html.theme--documenter-dark .navbar.is-fixed-bottom-desktop{bottom:0}html.theme--documenter-dark .navbar.is-fixed-bottom-desktop.has-shadow{box-shadow:0 -2px 3px rgba(10,10,10,0.1)}html.theme--documenter-dark .navbar.is-fixed-top-desktop{top:0}html.theme--documenter-dark html.has-navbar-fixed-top-desktop,html.theme--documenter-dark body.has-navbar-fixed-top-desktop{padding-top:4rem}html.theme--documenter-dark html.has-navbar-fixed-bottom-desktop,html.theme--documenter-dark body.has-navbar-fixed-bottom-desktop{padding-bottom:4rem}html.theme--documenter-dark html.has-spaced-navbar-fixed-top,html.theme--documenter-dark body.has-spaced-navbar-fixed-top{padding-top:6rem}html.theme--documenter-dark html.has-spaced-navbar-fixed-bottom,html.theme--documenter-dark body.has-spaced-navbar-fixed-bottom{padding-bottom:6rem}html.theme--documenter-dark a.navbar-item.is-active,html.theme--documenter-dark .navbar-link.is-active{color:#1abc9c}html.theme--documenter-dark a.navbar-item.is-active:not(:focus):not(:hover),html.theme--documenter-dark .navbar-link.is-active:not(:focus):not(:hover){background-color:rgba(0,0,0,0)}html.theme--documenter-dark .navbar-item.has-dropdown:focus .navbar-link,html.theme--documenter-dark .navbar-item.has-dropdown:hover .navbar-link,html.theme--documenter-dark .navbar-item.has-dropdown.is-active .navbar-link{background-color:rgba(0,0,0,0)}}html.theme--documenter-dark .hero.is-fullheight-with-navbar{min-height:calc(100vh - 4rem)}html.theme--documenter-dark .pagination{font-size:1rem;margin:-.25rem}html.theme--documenter-dark .pagination.is-small,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.pagination{font-size:.75rem}html.theme--documenter-dark .pagination.is-medium{font-size:1.25rem}html.theme--documenter-dark .pagination.is-large{font-size:1.5rem}html.theme--documenter-dark .pagination.is-rounded .pagination-previous,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.pagination .pagination-previous,html.theme--documenter-dark .pagination.is-rounded .pagination-next,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.pagination .pagination-next{padding-left:1em;padding-right:1em;border-radius:9999px}html.theme--documenter-dark .pagination.is-rounded .pagination-link,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.pagination .pagination-link{border-radius:9999px}html.theme--documenter-dark .pagination,html.theme--documenter-dark .pagination-list{align-items:center;display:flex;justify-content:center;text-align:center}html.theme--documenter-dark .pagination-previous,html.theme--documenter-dark .pagination-next,html.theme--documenter-dark .pagination-link,html.theme--documenter-dark .pagination-ellipsis{font-size:1em;justify-content:center;margin:.25rem;padding-left:.5em;padding-right:.5em;text-align:center}html.theme--documenter-dark .pagination-previous,html.theme--documenter-dark .pagination-next,html.theme--documenter-dark .pagination-link{border-color:#5e6d6f;color:#1abc9c;min-width:2.5em}html.theme--documenter-dark .pagination-previous:hover,html.theme--documenter-dark .pagination-next:hover,html.theme--documenter-dark .pagination-link:hover{border-color:#8c9b9d;color:#1dd2af}html.theme--documenter-dark .pagination-previous:focus,html.theme--documenter-dark .pagination-next:focus,html.theme--documenter-dark .pagination-link:focus{border-color:#8c9b9d}html.theme--documenter-dark .pagination-previous:active,html.theme--documenter-dark .pagination-next:active,html.theme--documenter-dark .pagination-link:active{box-shadow:inset 0 1px 2px rgba(10,10,10,0.2)}html.theme--documenter-dark .pagination-previous[disabled],html.theme--documenter-dark .pagination-previous.is-disabled,html.theme--documenter-dark .pagination-next[disabled],html.theme--documenter-dark .pagination-next.is-disabled,html.theme--documenter-dark .pagination-link[disabled],html.theme--documenter-dark .pagination-link.is-disabled{background-color:#5e6d6f;border-color:#5e6d6f;box-shadow:none;color:#fff;opacity:0.5}html.theme--documenter-dark .pagination-previous,html.theme--documenter-dark .pagination-next{padding-left:.75em;padding-right:.75em;white-space:nowrap}html.theme--documenter-dark .pagination-link.is-current{background-color:#1abc9c;border-color:#1abc9c;color:#fff}html.theme--documenter-dark .pagination-ellipsis{color:#8c9b9d;pointer-events:none}html.theme--documenter-dark .pagination-list{flex-wrap:wrap}html.theme--documenter-dark .pagination-list li{list-style:none}@media screen and (max-width: 768px){html.theme--documenter-dark .pagination{flex-wrap:wrap}html.theme--documenter-dark .pagination-previous,html.theme--documenter-dark .pagination-next{flex-grow:1;flex-shrink:1}html.theme--documenter-dark .pagination-list li{flex-grow:1;flex-shrink:1}}@media screen and (min-width: 769px),print{html.theme--documenter-dark .pagination-list{flex-grow:1;flex-shrink:1;justify-content:flex-start;order:1}html.theme--documenter-dark .pagination-previous,html.theme--documenter-dark .pagination-next,html.theme--documenter-dark .pagination-link,html.theme--documenter-dark .pagination-ellipsis{margin-bottom:0;margin-top:0}html.theme--documenter-dark .pagination-previous{order:2}html.theme--documenter-dark .pagination-next{order:3}html.theme--documenter-dark .pagination{justify-content:space-between;margin-bottom:0;margin-top:0}html.theme--documenter-dark .pagination.is-centered .pagination-previous{order:1}html.theme--documenter-dark .pagination.is-centered .pagination-list{justify-content:center;order:2}html.theme--documenter-dark .pagination.is-centered .pagination-next{order:3}html.theme--documenter-dark .pagination.is-right .pagination-previous{order:1}html.theme--documenter-dark .pagination.is-right .pagination-next{order:2}html.theme--documenter-dark .pagination.is-right .pagination-list{justify-content:flex-end;order:3}}html.theme--documenter-dark .panel{border-radius:8px;box-shadow:#171717;font-size:1rem}html.theme--documenter-dark .panel:not(:last-child){margin-bottom:1.5rem}html.theme--documenter-dark .panel.is-white .panel-heading{background-color:#fff;color:#0a0a0a}html.theme--documenter-dark .panel.is-white .panel-tabs a.is-active{border-bottom-color:#fff}html.theme--documenter-dark .panel.is-white .panel-block.is-active .panel-icon{color:#fff}html.theme--documenter-dark .panel.is-black .panel-heading{background-color:#0a0a0a;color:#fff}html.theme--documenter-dark .panel.is-black .panel-tabs a.is-active{border-bottom-color:#0a0a0a}html.theme--documenter-dark .panel.is-black .panel-block.is-active .panel-icon{color:#0a0a0a}html.theme--documenter-dark .panel.is-light .panel-heading{background-color:#ecf0f1;color:rgba(0,0,0,0.7)}html.theme--documenter-dark .panel.is-light .panel-tabs a.is-active{border-bottom-color:#ecf0f1}html.theme--documenter-dark .panel.is-light .panel-block.is-active .panel-icon{color:#ecf0f1}html.theme--documenter-dark .panel.is-dark .panel-heading,html.theme--documenter-dark .content kbd.panel .panel-heading{background-color:#282f2f;color:#fff}html.theme--documenter-dark .panel.is-dark .panel-tabs a.is-active,html.theme--documenter-dark .content kbd.panel .panel-tabs a.is-active{border-bottom-color:#282f2f}html.theme--documenter-dark .panel.is-dark .panel-block.is-active .panel-icon,html.theme--documenter-dark .content kbd.panel .panel-block.is-active .panel-icon{color:#282f2f}html.theme--documenter-dark .panel.is-primary .panel-heading,html.theme--documenter-dark .docstring>section>a.panel.docs-sourcelink .panel-heading{background-color:#375a7f;color:#fff}html.theme--documenter-dark .panel.is-primary .panel-tabs a.is-active,html.theme--documenter-dark .docstring>section>a.panel.docs-sourcelink .panel-tabs a.is-active{border-bottom-color:#375a7f}html.theme--documenter-dark .panel.is-primary .panel-block.is-active .panel-icon,html.theme--documenter-dark .docstring>section>a.panel.docs-sourcelink .panel-block.is-active .panel-icon{color:#375a7f}html.theme--documenter-dark .panel.is-link .panel-heading{background-color:#1abc9c;color:#fff}html.theme--documenter-dark .panel.is-link .panel-tabs a.is-active{border-bottom-color:#1abc9c}html.theme--documenter-dark .panel.is-link .panel-block.is-active .panel-icon{color:#1abc9c}html.theme--documenter-dark .panel.is-info .panel-heading{background-color:#024c7d;color:#fff}html.theme--documenter-dark .panel.is-info .panel-tabs a.is-active{border-bottom-color:#024c7d}html.theme--documenter-dark .panel.is-info .panel-block.is-active .panel-icon{color:#024c7d}html.theme--documenter-dark .panel.is-success .panel-heading{background-color:#008438;color:#fff}html.theme--documenter-dark .panel.is-success .panel-tabs a.is-active{border-bottom-color:#008438}html.theme--documenter-dark .panel.is-success .panel-block.is-active .panel-icon{color:#008438}html.theme--documenter-dark .panel.is-warning .panel-heading{background-color:#ad8100;color:#fff}html.theme--documenter-dark .panel.is-warning .panel-tabs a.is-active{border-bottom-color:#ad8100}html.theme--documenter-dark .panel.is-warning .panel-block.is-active .panel-icon{color:#ad8100}html.theme--documenter-dark .panel.is-danger .panel-heading{background-color:#9e1b0d;color:#fff}html.theme--documenter-dark .panel.is-danger .panel-tabs a.is-active{border-bottom-color:#9e1b0d}html.theme--documenter-dark .panel.is-danger .panel-block.is-active .panel-icon{color:#9e1b0d}html.theme--documenter-dark .panel-tabs:not(:last-child),html.theme--documenter-dark .panel-block:not(:last-child){border-bottom:1px solid #ededed}html.theme--documenter-dark .panel-heading{background-color:#343c3d;border-radius:8px 8px 0 0;color:#f2f2f2;font-size:1.25em;font-weight:700;line-height:1.25;padding:0.75em 1em}html.theme--documenter-dark .panel-tabs{align-items:flex-end;display:flex;font-size:.875em;justify-content:center}html.theme--documenter-dark .panel-tabs a{border-bottom:1px solid #5e6d6f;margin-bottom:-1px;padding:0.5em}html.theme--documenter-dark .panel-tabs a.is-active{border-bottom-color:#343c3d;color:#17a689}html.theme--documenter-dark .panel-list a{color:#fff}html.theme--documenter-dark .panel-list a:hover{color:#1abc9c}html.theme--documenter-dark .panel-block{align-items:center;color:#f2f2f2;display:flex;justify-content:flex-start;padding:0.5em 0.75em}html.theme--documenter-dark .panel-block input[type="checkbox"]{margin-right:.75em}html.theme--documenter-dark .panel-block>.control{flex-grow:1;flex-shrink:1;width:100%}html.theme--documenter-dark .panel-block.is-wrapped{flex-wrap:wrap}html.theme--documenter-dark .panel-block.is-active{border-left-color:#1abc9c;color:#17a689}html.theme--documenter-dark .panel-block.is-active .panel-icon{color:#1abc9c}html.theme--documenter-dark .panel-block:last-child{border-bottom-left-radius:8px;border-bottom-right-radius:8px}html.theme--documenter-dark a.panel-block,html.theme--documenter-dark label.panel-block{cursor:pointer}html.theme--documenter-dark a.panel-block:hover,html.theme--documenter-dark label.panel-block:hover{background-color:#282f2f}html.theme--documenter-dark .panel-icon{display:inline-block;font-size:14px;height:1em;line-height:1em;text-align:center;vertical-align:top;width:1em;color:#fff;margin-right:.75em}html.theme--documenter-dark .panel-icon .fa{font-size:inherit;line-height:inherit}html.theme--documenter-dark .tabs{-webkit-overflow-scrolling:touch;align-items:stretch;display:flex;font-size:1rem;justify-content:space-between;overflow:hidden;overflow-x:auto;white-space:nowrap}html.theme--documenter-dark .tabs a{align-items:center;border-bottom-color:#5e6d6f;border-bottom-style:solid;border-bottom-width:1px;color:#fff;display:flex;justify-content:center;margin-bottom:-1px;padding:0.5em 1em;vertical-align:top}html.theme--documenter-dark .tabs a:hover{border-bottom-color:#f2f2f2;color:#f2f2f2}html.theme--documenter-dark .tabs li{display:block}html.theme--documenter-dark .tabs li.is-active a{border-bottom-color:#1abc9c;color:#1abc9c}html.theme--documenter-dark .tabs ul{align-items:center;border-bottom-color:#5e6d6f;border-bottom-style:solid;border-bottom-width:1px;display:flex;flex-grow:1;flex-shrink:0;justify-content:flex-start}html.theme--documenter-dark .tabs ul.is-left{padding-right:0.75em}html.theme--documenter-dark .tabs ul.is-center{flex:none;justify-content:center;padding-left:0.75em;padding-right:0.75em}html.theme--documenter-dark .tabs ul.is-right{justify-content:flex-end;padding-left:0.75em}html.theme--documenter-dark .tabs .icon:first-child{margin-right:.5em}html.theme--documenter-dark .tabs .icon:last-child{margin-left:.5em}html.theme--documenter-dark .tabs.is-centered ul{justify-content:center}html.theme--documenter-dark .tabs.is-right ul{justify-content:flex-end}html.theme--documenter-dark .tabs.is-boxed a{border:1px solid transparent;border-radius:.4em .4em 0 0}html.theme--documenter-dark .tabs.is-boxed a:hover{background-color:#282f2f;border-bottom-color:#5e6d6f}html.theme--documenter-dark .tabs.is-boxed li.is-active a{background-color:#fff;border-color:#5e6d6f;border-bottom-color:rgba(0,0,0,0) !important}html.theme--documenter-dark .tabs.is-fullwidth li{flex-grow:1;flex-shrink:0}html.theme--documenter-dark .tabs.is-toggle a{border-color:#5e6d6f;border-style:solid;border-width:1px;margin-bottom:0;position:relative}html.theme--documenter-dark .tabs.is-toggle a:hover{background-color:#282f2f;border-color:#8c9b9d;z-index:2}html.theme--documenter-dark .tabs.is-toggle li+li{margin-left:-1px}html.theme--documenter-dark .tabs.is-toggle li:first-child a{border-top-left-radius:.4em;border-bottom-left-radius:.4em}html.theme--documenter-dark .tabs.is-toggle li:last-child a{border-top-right-radius:.4em;border-bottom-right-radius:.4em}html.theme--documenter-dark .tabs.is-toggle li.is-active a{background-color:#1abc9c;border-color:#1abc9c;color:#fff;z-index:1}html.theme--documenter-dark .tabs.is-toggle ul{border-bottom:none}html.theme--documenter-dark .tabs.is-toggle.is-toggle-rounded li:first-child a{border-bottom-left-radius:9999px;border-top-left-radius:9999px;padding-left:1.25em}html.theme--documenter-dark .tabs.is-toggle.is-toggle-rounded li:last-child a{border-bottom-right-radius:9999px;border-top-right-radius:9999px;padding-right:1.25em}html.theme--documenter-dark .tabs.is-small,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.tabs{font-size:.75rem}html.theme--documenter-dark .tabs.is-medium{font-size:1.25rem}html.theme--documenter-dark .tabs.is-large{font-size:1.5rem}html.theme--documenter-dark .column{display:block;flex-basis:0;flex-grow:1;flex-shrink:1;padding:.75rem}.columns.is-mobile>html.theme--documenter-dark .column.is-narrow{flex:none;width:unset}.columns.is-mobile>html.theme--documenter-dark .column.is-full{flex:none;width:100%}.columns.is-mobile>html.theme--documenter-dark .column.is-three-quarters{flex:none;width:75%}.columns.is-mobile>html.theme--documenter-dark .column.is-two-thirds{flex:none;width:66.6666%}.columns.is-mobile>html.theme--documenter-dark .column.is-half{flex:none;width:50%}.columns.is-mobile>html.theme--documenter-dark .column.is-one-third{flex:none;width:33.3333%}.columns.is-mobile>html.theme--documenter-dark .column.is-one-quarter{flex:none;width:25%}.columns.is-mobile>html.theme--documenter-dark .column.is-one-fifth{flex:none;width:20%}.columns.is-mobile>html.theme--documenter-dark .column.is-two-fifths{flex:none;width:40%}.columns.is-mobile>html.theme--documenter-dark .column.is-three-fifths{flex:none;width:60%}.columns.is-mobile>html.theme--documenter-dark .column.is-four-fifths{flex:none;width:80%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-three-quarters{margin-left:75%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-two-thirds{margin-left:66.6666%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-half{margin-left:50%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-one-third{margin-left:33.3333%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-one-quarter{margin-left:25%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-one-fifth{margin-left:20%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-two-fifths{margin-left:40%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-three-fifths{margin-left:60%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-four-fifths{margin-left:80%}.columns.is-mobile>html.theme--documenter-dark .column.is-0{flex:none;width:0%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-0{margin-left:0%}.columns.is-mobile>html.theme--documenter-dark .column.is-1{flex:none;width:8.33333337%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-1{margin-left:8.33333337%}.columns.is-mobile>html.theme--documenter-dark .column.is-2{flex:none;width:16.66666674%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-2{margin-left:16.66666674%}.columns.is-mobile>html.theme--documenter-dark .column.is-3{flex:none;width:25%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-3{margin-left:25%}.columns.is-mobile>html.theme--documenter-dark .column.is-4{flex:none;width:33.33333337%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-4{margin-left:33.33333337%}.columns.is-mobile>html.theme--documenter-dark .column.is-5{flex:none;width:41.66666674%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-5{margin-left:41.66666674%}.columns.is-mobile>html.theme--documenter-dark .column.is-6{flex:none;width:50%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-6{margin-left:50%}.columns.is-mobile>html.theme--documenter-dark .column.is-7{flex:none;width:58.33333337%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-7{margin-left:58.33333337%}.columns.is-mobile>html.theme--documenter-dark .column.is-8{flex:none;width:66.66666674%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-8{margin-left:66.66666674%}.columns.is-mobile>html.theme--documenter-dark .column.is-9{flex:none;width:75%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-9{margin-left:75%}.columns.is-mobile>html.theme--documenter-dark .column.is-10{flex:none;width:83.33333337%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-10{margin-left:83.33333337%}.columns.is-mobile>html.theme--documenter-dark .column.is-11{flex:none;width:91.66666674%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-11{margin-left:91.66666674%}.columns.is-mobile>html.theme--documenter-dark .column.is-12{flex:none;width:100%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-12{margin-left:100%}@media screen and (max-width: 768px){html.theme--documenter-dark .column.is-narrow-mobile{flex:none;width:unset}html.theme--documenter-dark .column.is-full-mobile{flex:none;width:100%}html.theme--documenter-dark .column.is-three-quarters-mobile{flex:none;width:75%}html.theme--documenter-dark .column.is-two-thirds-mobile{flex:none;width:66.6666%}html.theme--documenter-dark .column.is-half-mobile{flex:none;width:50%}html.theme--documenter-dark .column.is-one-third-mobile{flex:none;width:33.3333%}html.theme--documenter-dark .column.is-one-quarter-mobile{flex:none;width:25%}html.theme--documenter-dark .column.is-one-fifth-mobile{flex:none;width:20%}html.theme--documenter-dark .column.is-two-fifths-mobile{flex:none;width:40%}html.theme--documenter-dark .column.is-three-fifths-mobile{flex:none;width:60%}html.theme--documenter-dark .column.is-four-fifths-mobile{flex:none;width:80%}html.theme--documenter-dark .column.is-offset-three-quarters-mobile{margin-left:75%}html.theme--documenter-dark .column.is-offset-two-thirds-mobile{margin-left:66.6666%}html.theme--documenter-dark .column.is-offset-half-mobile{margin-left:50%}html.theme--documenter-dark .column.is-offset-one-third-mobile{margin-left:33.3333%}html.theme--documenter-dark .column.is-offset-one-quarter-mobile{margin-left:25%}html.theme--documenter-dark .column.is-offset-one-fifth-mobile{margin-left:20%}html.theme--documenter-dark .column.is-offset-two-fifths-mobile{margin-left:40%}html.theme--documenter-dark .column.is-offset-three-fifths-mobile{margin-left:60%}html.theme--documenter-dark .column.is-offset-four-fifths-mobile{margin-left:80%}html.theme--documenter-dark .column.is-0-mobile{flex:none;width:0%}html.theme--documenter-dark .column.is-offset-0-mobile{margin-left:0%}html.theme--documenter-dark .column.is-1-mobile{flex:none;width:8.33333337%}html.theme--documenter-dark .column.is-offset-1-mobile{margin-left:8.33333337%}html.theme--documenter-dark .column.is-2-mobile{flex:none;width:16.66666674%}html.theme--documenter-dark .column.is-offset-2-mobile{margin-left:16.66666674%}html.theme--documenter-dark .column.is-3-mobile{flex:none;width:25%}html.theme--documenter-dark .column.is-offset-3-mobile{margin-left:25%}html.theme--documenter-dark .column.is-4-mobile{flex:none;width:33.33333337%}html.theme--documenter-dark .column.is-offset-4-mobile{margin-left:33.33333337%}html.theme--documenter-dark .column.is-5-mobile{flex:none;width:41.66666674%}html.theme--documenter-dark .column.is-offset-5-mobile{margin-left:41.66666674%}html.theme--documenter-dark .column.is-6-mobile{flex:none;width:50%}html.theme--documenter-dark .column.is-offset-6-mobile{margin-left:50%}html.theme--documenter-dark .column.is-7-mobile{flex:none;width:58.33333337%}html.theme--documenter-dark .column.is-offset-7-mobile{margin-left:58.33333337%}html.theme--documenter-dark .column.is-8-mobile{flex:none;width:66.66666674%}html.theme--documenter-dark .column.is-offset-8-mobile{margin-left:66.66666674%}html.theme--documenter-dark .column.is-9-mobile{flex:none;width:75%}html.theme--documenter-dark .column.is-offset-9-mobile{margin-left:75%}html.theme--documenter-dark .column.is-10-mobile{flex:none;width:83.33333337%}html.theme--documenter-dark .column.is-offset-10-mobile{margin-left:83.33333337%}html.theme--documenter-dark .column.is-11-mobile{flex:none;width:91.66666674%}html.theme--documenter-dark .column.is-offset-11-mobile{margin-left:91.66666674%}html.theme--documenter-dark .column.is-12-mobile{flex:none;width:100%}html.theme--documenter-dark .column.is-offset-12-mobile{margin-left:100%}}@media screen and (min-width: 769px),print{html.theme--documenter-dark .column.is-narrow,html.theme--documenter-dark .column.is-narrow-tablet{flex:none;width:unset}html.theme--documenter-dark .column.is-full,html.theme--documenter-dark .column.is-full-tablet{flex:none;width:100%}html.theme--documenter-dark .column.is-three-quarters,html.theme--documenter-dark .column.is-three-quarters-tablet{flex:none;width:75%}html.theme--documenter-dark .column.is-two-thirds,html.theme--documenter-dark .column.is-two-thirds-tablet{flex:none;width:66.6666%}html.theme--documenter-dark .column.is-half,html.theme--documenter-dark .column.is-half-tablet{flex:none;width:50%}html.theme--documenter-dark .column.is-one-third,html.theme--documenter-dark .column.is-one-third-tablet{flex:none;width:33.3333%}html.theme--documenter-dark .column.is-one-quarter,html.theme--documenter-dark .column.is-one-quarter-tablet{flex:none;width:25%}html.theme--documenter-dark .column.is-one-fifth,html.theme--documenter-dark .column.is-one-fifth-tablet{flex:none;width:20%}html.theme--documenter-dark .column.is-two-fifths,html.theme--documenter-dark .column.is-two-fifths-tablet{flex:none;width:40%}html.theme--documenter-dark .column.is-three-fifths,html.theme--documenter-dark .column.is-three-fifths-tablet{flex:none;width:60%}html.theme--documenter-dark .column.is-four-fifths,html.theme--documenter-dark .column.is-four-fifths-tablet{flex:none;width:80%}html.theme--documenter-dark .column.is-offset-three-quarters,html.theme--documenter-dark .column.is-offset-three-quarters-tablet{margin-left:75%}html.theme--documenter-dark .column.is-offset-two-thirds,html.theme--documenter-dark .column.is-offset-two-thirds-tablet{margin-left:66.6666%}html.theme--documenter-dark .column.is-offset-half,html.theme--documenter-dark .column.is-offset-half-tablet{margin-left:50%}html.theme--documenter-dark .column.is-offset-one-third,html.theme--documenter-dark .column.is-offset-one-third-tablet{margin-left:33.3333%}html.theme--documenter-dark .column.is-offset-one-quarter,html.theme--documenter-dark .column.is-offset-one-quarter-tablet{margin-left:25%}html.theme--documenter-dark .column.is-offset-one-fifth,html.theme--documenter-dark .column.is-offset-one-fifth-tablet{margin-left:20%}html.theme--documenter-dark .column.is-offset-two-fifths,html.theme--documenter-dark .column.is-offset-two-fifths-tablet{margin-left:40%}html.theme--documenter-dark .column.is-offset-three-fifths,html.theme--documenter-dark .column.is-offset-three-fifths-tablet{margin-left:60%}html.theme--documenter-dark .column.is-offset-four-fifths,html.theme--documenter-dark .column.is-offset-four-fifths-tablet{margin-left:80%}html.theme--documenter-dark .column.is-0,html.theme--documenter-dark .column.is-0-tablet{flex:none;width:0%}html.theme--documenter-dark .column.is-offset-0,html.theme--documenter-dark .column.is-offset-0-tablet{margin-left:0%}html.theme--documenter-dark .column.is-1,html.theme--documenter-dark .column.is-1-tablet{flex:none;width:8.33333337%}html.theme--documenter-dark .column.is-offset-1,html.theme--documenter-dark .column.is-offset-1-tablet{margin-left:8.33333337%}html.theme--documenter-dark .column.is-2,html.theme--documenter-dark .column.is-2-tablet{flex:none;width:16.66666674%}html.theme--documenter-dark .column.is-offset-2,html.theme--documenter-dark .column.is-offset-2-tablet{margin-left:16.66666674%}html.theme--documenter-dark .column.is-3,html.theme--documenter-dark .column.is-3-tablet{flex:none;width:25%}html.theme--documenter-dark .column.is-offset-3,html.theme--documenter-dark .column.is-offset-3-tablet{margin-left:25%}html.theme--documenter-dark .column.is-4,html.theme--documenter-dark .column.is-4-tablet{flex:none;width:33.33333337%}html.theme--documenter-dark .column.is-offset-4,html.theme--documenter-dark .column.is-offset-4-tablet{margin-left:33.33333337%}html.theme--documenter-dark .column.is-5,html.theme--documenter-dark .column.is-5-tablet{flex:none;width:41.66666674%}html.theme--documenter-dark .column.is-offset-5,html.theme--documenter-dark .column.is-offset-5-tablet{margin-left:41.66666674%}html.theme--documenter-dark .column.is-6,html.theme--documenter-dark .column.is-6-tablet{flex:none;width:50%}html.theme--documenter-dark .column.is-offset-6,html.theme--documenter-dark .column.is-offset-6-tablet{margin-left:50%}html.theme--documenter-dark .column.is-7,html.theme--documenter-dark .column.is-7-tablet{flex:none;width:58.33333337%}html.theme--documenter-dark .column.is-offset-7,html.theme--documenter-dark .column.is-offset-7-tablet{margin-left:58.33333337%}html.theme--documenter-dark .column.is-8,html.theme--documenter-dark .column.is-8-tablet{flex:none;width:66.66666674%}html.theme--documenter-dark .column.is-offset-8,html.theme--documenter-dark .column.is-offset-8-tablet{margin-left:66.66666674%}html.theme--documenter-dark .column.is-9,html.theme--documenter-dark .column.is-9-tablet{flex:none;width:75%}html.theme--documenter-dark .column.is-offset-9,html.theme--documenter-dark .column.is-offset-9-tablet{margin-left:75%}html.theme--documenter-dark .column.is-10,html.theme--documenter-dark .column.is-10-tablet{flex:none;width:83.33333337%}html.theme--documenter-dark .column.is-offset-10,html.theme--documenter-dark .column.is-offset-10-tablet{margin-left:83.33333337%}html.theme--documenter-dark .column.is-11,html.theme--documenter-dark .column.is-11-tablet{flex:none;width:91.66666674%}html.theme--documenter-dark .column.is-offset-11,html.theme--documenter-dark .column.is-offset-11-tablet{margin-left:91.66666674%}html.theme--documenter-dark .column.is-12,html.theme--documenter-dark .column.is-12-tablet{flex:none;width:100%}html.theme--documenter-dark .column.is-offset-12,html.theme--documenter-dark .column.is-offset-12-tablet{margin-left:100%}}@media screen and (max-width: 1055px){html.theme--documenter-dark .column.is-narrow-touch{flex:none;width:unset}html.theme--documenter-dark .column.is-full-touch{flex:none;width:100%}html.theme--documenter-dark .column.is-three-quarters-touch{flex:none;width:75%}html.theme--documenter-dark .column.is-two-thirds-touch{flex:none;width:66.6666%}html.theme--documenter-dark .column.is-half-touch{flex:none;width:50%}html.theme--documenter-dark .column.is-one-third-touch{flex:none;width:33.3333%}html.theme--documenter-dark .column.is-one-quarter-touch{flex:none;width:25%}html.theme--documenter-dark .column.is-one-fifth-touch{flex:none;width:20%}html.theme--documenter-dark .column.is-two-fifths-touch{flex:none;width:40%}html.theme--documenter-dark .column.is-three-fifths-touch{flex:none;width:60%}html.theme--documenter-dark .column.is-four-fifths-touch{flex:none;width:80%}html.theme--documenter-dark .column.is-offset-three-quarters-touch{margin-left:75%}html.theme--documenter-dark .column.is-offset-two-thirds-touch{margin-left:66.6666%}html.theme--documenter-dark .column.is-offset-half-touch{margin-left:50%}html.theme--documenter-dark .column.is-offset-one-third-touch{margin-left:33.3333%}html.theme--documenter-dark .column.is-offset-one-quarter-touch{margin-left:25%}html.theme--documenter-dark .column.is-offset-one-fifth-touch{margin-left:20%}html.theme--documenter-dark .column.is-offset-two-fifths-touch{margin-left:40%}html.theme--documenter-dark .column.is-offset-three-fifths-touch{margin-left:60%}html.theme--documenter-dark .column.is-offset-four-fifths-touch{margin-left:80%}html.theme--documenter-dark .column.is-0-touch{flex:none;width:0%}html.theme--documenter-dark .column.is-offset-0-touch{margin-left:0%}html.theme--documenter-dark .column.is-1-touch{flex:none;width:8.33333337%}html.theme--documenter-dark .column.is-offset-1-touch{margin-left:8.33333337%}html.theme--documenter-dark .column.is-2-touch{flex:none;width:16.66666674%}html.theme--documenter-dark .column.is-offset-2-touch{margin-left:16.66666674%}html.theme--documenter-dark .column.is-3-touch{flex:none;width:25%}html.theme--documenter-dark .column.is-offset-3-touch{margin-left:25%}html.theme--documenter-dark .column.is-4-touch{flex:none;width:33.33333337%}html.theme--documenter-dark .column.is-offset-4-touch{margin-left:33.33333337%}html.theme--documenter-dark .column.is-5-touch{flex:none;width:41.66666674%}html.theme--documenter-dark .column.is-offset-5-touch{margin-left:41.66666674%}html.theme--documenter-dark .column.is-6-touch{flex:none;width:50%}html.theme--documenter-dark .column.is-offset-6-touch{margin-left:50%}html.theme--documenter-dark .column.is-7-touch{flex:none;width:58.33333337%}html.theme--documenter-dark .column.is-offset-7-touch{margin-left:58.33333337%}html.theme--documenter-dark .column.is-8-touch{flex:none;width:66.66666674%}html.theme--documenter-dark .column.is-offset-8-touch{margin-left:66.66666674%}html.theme--documenter-dark .column.is-9-touch{flex:none;width:75%}html.theme--documenter-dark .column.is-offset-9-touch{margin-left:75%}html.theme--documenter-dark .column.is-10-touch{flex:none;width:83.33333337%}html.theme--documenter-dark .column.is-offset-10-touch{margin-left:83.33333337%}html.theme--documenter-dark .column.is-11-touch{flex:none;width:91.66666674%}html.theme--documenter-dark .column.is-offset-11-touch{margin-left:91.66666674%}html.theme--documenter-dark .column.is-12-touch{flex:none;width:100%}html.theme--documenter-dark .column.is-offset-12-touch{margin-left:100%}}@media screen and (min-width: 1056px){html.theme--documenter-dark .column.is-narrow-desktop{flex:none;width:unset}html.theme--documenter-dark .column.is-full-desktop{flex:none;width:100%}html.theme--documenter-dark .column.is-three-quarters-desktop{flex:none;width:75%}html.theme--documenter-dark .column.is-two-thirds-desktop{flex:none;width:66.6666%}html.theme--documenter-dark .column.is-half-desktop{flex:none;width:50%}html.theme--documenter-dark .column.is-one-third-desktop{flex:none;width:33.3333%}html.theme--documenter-dark .column.is-one-quarter-desktop{flex:none;width:25%}html.theme--documenter-dark .column.is-one-fifth-desktop{flex:none;width:20%}html.theme--documenter-dark .column.is-two-fifths-desktop{flex:none;width:40%}html.theme--documenter-dark .column.is-three-fifths-desktop{flex:none;width:60%}html.theme--documenter-dark .column.is-four-fifths-desktop{flex:none;width:80%}html.theme--documenter-dark .column.is-offset-three-quarters-desktop{margin-left:75%}html.theme--documenter-dark .column.is-offset-two-thirds-desktop{margin-left:66.6666%}html.theme--documenter-dark .column.is-offset-half-desktop{margin-left:50%}html.theme--documenter-dark .column.is-offset-one-third-desktop{margin-left:33.3333%}html.theme--documenter-dark .column.is-offset-one-quarter-desktop{margin-left:25%}html.theme--documenter-dark .column.is-offset-one-fifth-desktop{margin-left:20%}html.theme--documenter-dark .column.is-offset-two-fifths-desktop{margin-left:40%}html.theme--documenter-dark .column.is-offset-three-fifths-desktop{margin-left:60%}html.theme--documenter-dark .column.is-offset-four-fifths-desktop{margin-left:80%}html.theme--documenter-dark .column.is-0-desktop{flex:none;width:0%}html.theme--documenter-dark .column.is-offset-0-desktop{margin-left:0%}html.theme--documenter-dark .column.is-1-desktop{flex:none;width:8.33333337%}html.theme--documenter-dark .column.is-offset-1-desktop{margin-left:8.33333337%}html.theme--documenter-dark .column.is-2-desktop{flex:none;width:16.66666674%}html.theme--documenter-dark .column.is-offset-2-desktop{margin-left:16.66666674%}html.theme--documenter-dark .column.is-3-desktop{flex:none;width:25%}html.theme--documenter-dark .column.is-offset-3-desktop{margin-left:25%}html.theme--documenter-dark .column.is-4-desktop{flex:none;width:33.33333337%}html.theme--documenter-dark .column.is-offset-4-desktop{margin-left:33.33333337%}html.theme--documenter-dark .column.is-5-desktop{flex:none;width:41.66666674%}html.theme--documenter-dark .column.is-offset-5-desktop{margin-left:41.66666674%}html.theme--documenter-dark .column.is-6-desktop{flex:none;width:50%}html.theme--documenter-dark .column.is-offset-6-desktop{margin-left:50%}html.theme--documenter-dark .column.is-7-desktop{flex:none;width:58.33333337%}html.theme--documenter-dark .column.is-offset-7-desktop{margin-left:58.33333337%}html.theme--documenter-dark .column.is-8-desktop{flex:none;width:66.66666674%}html.theme--documenter-dark .column.is-offset-8-desktop{margin-left:66.66666674%}html.theme--documenter-dark .column.is-9-desktop{flex:none;width:75%}html.theme--documenter-dark .column.is-offset-9-desktop{margin-left:75%}html.theme--documenter-dark .column.is-10-desktop{flex:none;width:83.33333337%}html.theme--documenter-dark .column.is-offset-10-desktop{margin-left:83.33333337%}html.theme--documenter-dark .column.is-11-desktop{flex:none;width:91.66666674%}html.theme--documenter-dark .column.is-offset-11-desktop{margin-left:91.66666674%}html.theme--documenter-dark .column.is-12-desktop{flex:none;width:100%}html.theme--documenter-dark .column.is-offset-12-desktop{margin-left:100%}}@media screen and (min-width: 1216px){html.theme--documenter-dark .column.is-narrow-widescreen{flex:none;width:unset}html.theme--documenter-dark .column.is-full-widescreen{flex:none;width:100%}html.theme--documenter-dark .column.is-three-quarters-widescreen{flex:none;width:75%}html.theme--documenter-dark .column.is-two-thirds-widescreen{flex:none;width:66.6666%}html.theme--documenter-dark .column.is-half-widescreen{flex:none;width:50%}html.theme--documenter-dark .column.is-one-third-widescreen{flex:none;width:33.3333%}html.theme--documenter-dark .column.is-one-quarter-widescreen{flex:none;width:25%}html.theme--documenter-dark .column.is-one-fifth-widescreen{flex:none;width:20%}html.theme--documenter-dark .column.is-two-fifths-widescreen{flex:none;width:40%}html.theme--documenter-dark .column.is-three-fifths-widescreen{flex:none;width:60%}html.theme--documenter-dark .column.is-four-fifths-widescreen{flex:none;width:80%}html.theme--documenter-dark .column.is-offset-three-quarters-widescreen{margin-left:75%}html.theme--documenter-dark .column.is-offset-two-thirds-widescreen{margin-left:66.6666%}html.theme--documenter-dark .column.is-offset-half-widescreen{margin-left:50%}html.theme--documenter-dark .column.is-offset-one-third-widescreen{margin-left:33.3333%}html.theme--documenter-dark .column.is-offset-one-quarter-widescreen{margin-left:25%}html.theme--documenter-dark .column.is-offset-one-fifth-widescreen{margin-left:20%}html.theme--documenter-dark .column.is-offset-two-fifths-widescreen{margin-left:40%}html.theme--documenter-dark .column.is-offset-three-fifths-widescreen{margin-left:60%}html.theme--documenter-dark .column.is-offset-four-fifths-widescreen{margin-left:80%}html.theme--documenter-dark .column.is-0-widescreen{flex:none;width:0%}html.theme--documenter-dark .column.is-offset-0-widescreen{margin-left:0%}html.theme--documenter-dark .column.is-1-widescreen{flex:none;width:8.33333337%}html.theme--documenter-dark .column.is-offset-1-widescreen{margin-left:8.33333337%}html.theme--documenter-dark .column.is-2-widescreen{flex:none;width:16.66666674%}html.theme--documenter-dark .column.is-offset-2-widescreen{margin-left:16.66666674%}html.theme--documenter-dark .column.is-3-widescreen{flex:none;width:25%}html.theme--documenter-dark .column.is-offset-3-widescreen{margin-left:25%}html.theme--documenter-dark .column.is-4-widescreen{flex:none;width:33.33333337%}html.theme--documenter-dark .column.is-offset-4-widescreen{margin-left:33.33333337%}html.theme--documenter-dark .column.is-5-widescreen{flex:none;width:41.66666674%}html.theme--documenter-dark .column.is-offset-5-widescreen{margin-left:41.66666674%}html.theme--documenter-dark .column.is-6-widescreen{flex:none;width:50%}html.theme--documenter-dark .column.is-offset-6-widescreen{margin-left:50%}html.theme--documenter-dark .column.is-7-widescreen{flex:none;width:58.33333337%}html.theme--documenter-dark .column.is-offset-7-widescreen{margin-left:58.33333337%}html.theme--documenter-dark .column.is-8-widescreen{flex:none;width:66.66666674%}html.theme--documenter-dark .column.is-offset-8-widescreen{margin-left:66.66666674%}html.theme--documenter-dark .column.is-9-widescreen{flex:none;width:75%}html.theme--documenter-dark .column.is-offset-9-widescreen{margin-left:75%}html.theme--documenter-dark .column.is-10-widescreen{flex:none;width:83.33333337%}html.theme--documenter-dark .column.is-offset-10-widescreen{margin-left:83.33333337%}html.theme--documenter-dark .column.is-11-widescreen{flex:none;width:91.66666674%}html.theme--documenter-dark .column.is-offset-11-widescreen{margin-left:91.66666674%}html.theme--documenter-dark .column.is-12-widescreen{flex:none;width:100%}html.theme--documenter-dark .column.is-offset-12-widescreen{margin-left:100%}}@media screen and (min-width: 1408px){html.theme--documenter-dark .column.is-narrow-fullhd{flex:none;width:unset}html.theme--documenter-dark .column.is-full-fullhd{flex:none;width:100%}html.theme--documenter-dark .column.is-three-quarters-fullhd{flex:none;width:75%}html.theme--documenter-dark .column.is-two-thirds-fullhd{flex:none;width:66.6666%}html.theme--documenter-dark .column.is-half-fullhd{flex:none;width:50%}html.theme--documenter-dark .column.is-one-third-fullhd{flex:none;width:33.3333%}html.theme--documenter-dark .column.is-one-quarter-fullhd{flex:none;width:25%}html.theme--documenter-dark .column.is-one-fifth-fullhd{flex:none;width:20%}html.theme--documenter-dark .column.is-two-fifths-fullhd{flex:none;width:40%}html.theme--documenter-dark .column.is-three-fifths-fullhd{flex:none;width:60%}html.theme--documenter-dark .column.is-four-fifths-fullhd{flex:none;width:80%}html.theme--documenter-dark .column.is-offset-three-quarters-fullhd{margin-left:75%}html.theme--documenter-dark .column.is-offset-two-thirds-fullhd{margin-left:66.6666%}html.theme--documenter-dark .column.is-offset-half-fullhd{margin-left:50%}html.theme--documenter-dark .column.is-offset-one-third-fullhd{margin-left:33.3333%}html.theme--documenter-dark .column.is-offset-one-quarter-fullhd{margin-left:25%}html.theme--documenter-dark .column.is-offset-one-fifth-fullhd{margin-left:20%}html.theme--documenter-dark .column.is-offset-two-fifths-fullhd{margin-left:40%}html.theme--documenter-dark .column.is-offset-three-fifths-fullhd{margin-left:60%}html.theme--documenter-dark .column.is-offset-four-fifths-fullhd{margin-left:80%}html.theme--documenter-dark .column.is-0-fullhd{flex:none;width:0%}html.theme--documenter-dark .column.is-offset-0-fullhd{margin-left:0%}html.theme--documenter-dark .column.is-1-fullhd{flex:none;width:8.33333337%}html.theme--documenter-dark .column.is-offset-1-fullhd{margin-left:8.33333337%}html.theme--documenter-dark .column.is-2-fullhd{flex:none;width:16.66666674%}html.theme--documenter-dark .column.is-offset-2-fullhd{margin-left:16.66666674%}html.theme--documenter-dark .column.is-3-fullhd{flex:none;width:25%}html.theme--documenter-dark .column.is-offset-3-fullhd{margin-left:25%}html.theme--documenter-dark .column.is-4-fullhd{flex:none;width:33.33333337%}html.theme--documenter-dark .column.is-offset-4-fullhd{margin-left:33.33333337%}html.theme--documenter-dark .column.is-5-fullhd{flex:none;width:41.66666674%}html.theme--documenter-dark .column.is-offset-5-fullhd{margin-left:41.66666674%}html.theme--documenter-dark .column.is-6-fullhd{flex:none;width:50%}html.theme--documenter-dark .column.is-offset-6-fullhd{margin-left:50%}html.theme--documenter-dark .column.is-7-fullhd{flex:none;width:58.33333337%}html.theme--documenter-dark .column.is-offset-7-fullhd{margin-left:58.33333337%}html.theme--documenter-dark .column.is-8-fullhd{flex:none;width:66.66666674%}html.theme--documenter-dark .column.is-offset-8-fullhd{margin-left:66.66666674%}html.theme--documenter-dark .column.is-9-fullhd{flex:none;width:75%}html.theme--documenter-dark .column.is-offset-9-fullhd{margin-left:75%}html.theme--documenter-dark .column.is-10-fullhd{flex:none;width:83.33333337%}html.theme--documenter-dark .column.is-offset-10-fullhd{margin-left:83.33333337%}html.theme--documenter-dark .column.is-11-fullhd{flex:none;width:91.66666674%}html.theme--documenter-dark .column.is-offset-11-fullhd{margin-left:91.66666674%}html.theme--documenter-dark .column.is-12-fullhd{flex:none;width:100%}html.theme--documenter-dark .column.is-offset-12-fullhd{margin-left:100%}}html.theme--documenter-dark .columns{margin-left:-.75rem;margin-right:-.75rem;margin-top:-.75rem}html.theme--documenter-dark .columns:last-child{margin-bottom:-.75rem}html.theme--documenter-dark .columns:not(:last-child){margin-bottom:calc(1.5rem - .75rem)}html.theme--documenter-dark .columns.is-centered{justify-content:center}html.theme--documenter-dark .columns.is-gapless{margin-left:0;margin-right:0;margin-top:0}html.theme--documenter-dark .columns.is-gapless>.column{margin:0;padding:0 !important}html.theme--documenter-dark .columns.is-gapless:not(:last-child){margin-bottom:1.5rem}html.theme--documenter-dark .columns.is-gapless:last-child{margin-bottom:0}html.theme--documenter-dark .columns.is-mobile{display:flex}html.theme--documenter-dark .columns.is-multiline{flex-wrap:wrap}html.theme--documenter-dark .columns.is-vcentered{align-items:center}@media screen and (min-width: 769px),print{html.theme--documenter-dark .columns:not(.is-desktop){display:flex}}@media screen and (min-width: 1056px){html.theme--documenter-dark .columns.is-desktop{display:flex}}html.theme--documenter-dark .columns.is-variable{--columnGap: 0.75rem;margin-left:calc(-1 * var(--columnGap));margin-right:calc(-1 * var(--columnGap))}html.theme--documenter-dark .columns.is-variable>.column{padding-left:var(--columnGap);padding-right:var(--columnGap)}html.theme--documenter-dark .columns.is-variable.is-0{--columnGap: 0rem}@media screen and (max-width: 768px){html.theme--documenter-dark .columns.is-variable.is-0-mobile{--columnGap: 0rem}}@media screen and (min-width: 769px),print{html.theme--documenter-dark .columns.is-variable.is-0-tablet{--columnGap: 0rem}}@media screen and (min-width: 769px) and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-0-tablet-only{--columnGap: 0rem}}@media screen and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-0-touch{--columnGap: 0rem}}@media screen and (min-width: 1056px){html.theme--documenter-dark .columns.is-variable.is-0-desktop{--columnGap: 0rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){html.theme--documenter-dark .columns.is-variable.is-0-desktop-only{--columnGap: 0rem}}@media screen and (min-width: 1216px){html.theme--documenter-dark .columns.is-variable.is-0-widescreen{--columnGap: 0rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){html.theme--documenter-dark .columns.is-variable.is-0-widescreen-only{--columnGap: 0rem}}@media screen and (min-width: 1408px){html.theme--documenter-dark .columns.is-variable.is-0-fullhd{--columnGap: 0rem}}html.theme--documenter-dark .columns.is-variable.is-1{--columnGap: .25rem}@media screen and (max-width: 768px){html.theme--documenter-dark .columns.is-variable.is-1-mobile{--columnGap: .25rem}}@media screen and (min-width: 769px),print{html.theme--documenter-dark .columns.is-variable.is-1-tablet{--columnGap: .25rem}}@media screen and (min-width: 769px) and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-1-tablet-only{--columnGap: .25rem}}@media screen and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-1-touch{--columnGap: .25rem}}@media screen and (min-width: 1056px){html.theme--documenter-dark .columns.is-variable.is-1-desktop{--columnGap: .25rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){html.theme--documenter-dark .columns.is-variable.is-1-desktop-only{--columnGap: .25rem}}@media screen and (min-width: 1216px){html.theme--documenter-dark .columns.is-variable.is-1-widescreen{--columnGap: .25rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){html.theme--documenter-dark .columns.is-variable.is-1-widescreen-only{--columnGap: .25rem}}@media screen and (min-width: 1408px){html.theme--documenter-dark .columns.is-variable.is-1-fullhd{--columnGap: .25rem}}html.theme--documenter-dark .columns.is-variable.is-2{--columnGap: .5rem}@media screen and (max-width: 768px){html.theme--documenter-dark .columns.is-variable.is-2-mobile{--columnGap: .5rem}}@media screen and (min-width: 769px),print{html.theme--documenter-dark .columns.is-variable.is-2-tablet{--columnGap: .5rem}}@media screen and (min-width: 769px) and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-2-tablet-only{--columnGap: .5rem}}@media screen and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-2-touch{--columnGap: .5rem}}@media screen and (min-width: 1056px){html.theme--documenter-dark .columns.is-variable.is-2-desktop{--columnGap: .5rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){html.theme--documenter-dark .columns.is-variable.is-2-desktop-only{--columnGap: .5rem}}@media screen and (min-width: 1216px){html.theme--documenter-dark .columns.is-variable.is-2-widescreen{--columnGap: .5rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){html.theme--documenter-dark .columns.is-variable.is-2-widescreen-only{--columnGap: .5rem}}@media screen and (min-width: 1408px){html.theme--documenter-dark .columns.is-variable.is-2-fullhd{--columnGap: .5rem}}html.theme--documenter-dark .columns.is-variable.is-3{--columnGap: .75rem}@media screen and (max-width: 768px){html.theme--documenter-dark .columns.is-variable.is-3-mobile{--columnGap: .75rem}}@media screen and (min-width: 769px),print{html.theme--documenter-dark .columns.is-variable.is-3-tablet{--columnGap: .75rem}}@media screen and (min-width: 769px) and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-3-tablet-only{--columnGap: .75rem}}@media screen and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-3-touch{--columnGap: .75rem}}@media screen and (min-width: 1056px){html.theme--documenter-dark .columns.is-variable.is-3-desktop{--columnGap: .75rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){html.theme--documenter-dark .columns.is-variable.is-3-desktop-only{--columnGap: .75rem}}@media screen and (min-width: 1216px){html.theme--documenter-dark .columns.is-variable.is-3-widescreen{--columnGap: .75rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){html.theme--documenter-dark .columns.is-variable.is-3-widescreen-only{--columnGap: .75rem}}@media screen and (min-width: 1408px){html.theme--documenter-dark .columns.is-variable.is-3-fullhd{--columnGap: .75rem}}html.theme--documenter-dark .columns.is-variable.is-4{--columnGap: 1rem}@media screen and (max-width: 768px){html.theme--documenter-dark .columns.is-variable.is-4-mobile{--columnGap: 1rem}}@media screen and (min-width: 769px),print{html.theme--documenter-dark .columns.is-variable.is-4-tablet{--columnGap: 1rem}}@media screen and (min-width: 769px) and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-4-tablet-only{--columnGap: 1rem}}@media screen and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-4-touch{--columnGap: 1rem}}@media screen and (min-width: 1056px){html.theme--documenter-dark .columns.is-variable.is-4-desktop{--columnGap: 1rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){html.theme--documenter-dark .columns.is-variable.is-4-desktop-only{--columnGap: 1rem}}@media screen and (min-width: 1216px){html.theme--documenter-dark .columns.is-variable.is-4-widescreen{--columnGap: 1rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){html.theme--documenter-dark .columns.is-variable.is-4-widescreen-only{--columnGap: 1rem}}@media screen and (min-width: 1408px){html.theme--documenter-dark .columns.is-variable.is-4-fullhd{--columnGap: 1rem}}html.theme--documenter-dark .columns.is-variable.is-5{--columnGap: 1.25rem}@media screen and (max-width: 768px){html.theme--documenter-dark .columns.is-variable.is-5-mobile{--columnGap: 1.25rem}}@media screen and (min-width: 769px),print{html.theme--documenter-dark .columns.is-variable.is-5-tablet{--columnGap: 1.25rem}}@media screen and (min-width: 769px) and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-5-tablet-only{--columnGap: 1.25rem}}@media screen and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-5-touch{--columnGap: 1.25rem}}@media screen and (min-width: 1056px){html.theme--documenter-dark .columns.is-variable.is-5-desktop{--columnGap: 1.25rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){html.theme--documenter-dark .columns.is-variable.is-5-desktop-only{--columnGap: 1.25rem}}@media screen and (min-width: 1216px){html.theme--documenter-dark .columns.is-variable.is-5-widescreen{--columnGap: 1.25rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){html.theme--documenter-dark .columns.is-variable.is-5-widescreen-only{--columnGap: 1.25rem}}@media screen and (min-width: 1408px){html.theme--documenter-dark .columns.is-variable.is-5-fullhd{--columnGap: 1.25rem}}html.theme--documenter-dark .columns.is-variable.is-6{--columnGap: 1.5rem}@media screen and (max-width: 768px){html.theme--documenter-dark .columns.is-variable.is-6-mobile{--columnGap: 1.5rem}}@media screen and (min-width: 769px),print{html.theme--documenter-dark .columns.is-variable.is-6-tablet{--columnGap: 1.5rem}}@media screen and (min-width: 769px) and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-6-tablet-only{--columnGap: 1.5rem}}@media screen and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-6-touch{--columnGap: 1.5rem}}@media screen and (min-width: 1056px){html.theme--documenter-dark .columns.is-variable.is-6-desktop{--columnGap: 1.5rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){html.theme--documenter-dark .columns.is-variable.is-6-desktop-only{--columnGap: 1.5rem}}@media screen and (min-width: 1216px){html.theme--documenter-dark .columns.is-variable.is-6-widescreen{--columnGap: 1.5rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){html.theme--documenter-dark .columns.is-variable.is-6-widescreen-only{--columnGap: 1.5rem}}@media screen and (min-width: 1408px){html.theme--documenter-dark .columns.is-variable.is-6-fullhd{--columnGap: 1.5rem}}html.theme--documenter-dark .columns.is-variable.is-7{--columnGap: 1.75rem}@media screen and (max-width: 768px){html.theme--documenter-dark .columns.is-variable.is-7-mobile{--columnGap: 1.75rem}}@media screen and (min-width: 769px),print{html.theme--documenter-dark .columns.is-variable.is-7-tablet{--columnGap: 1.75rem}}@media screen and (min-width: 769px) and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-7-tablet-only{--columnGap: 1.75rem}}@media screen and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-7-touch{--columnGap: 1.75rem}}@media screen and (min-width: 1056px){html.theme--documenter-dark .columns.is-variable.is-7-desktop{--columnGap: 1.75rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){html.theme--documenter-dark .columns.is-variable.is-7-desktop-only{--columnGap: 1.75rem}}@media screen and (min-width: 1216px){html.theme--documenter-dark .columns.is-variable.is-7-widescreen{--columnGap: 1.75rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){html.theme--documenter-dark .columns.is-variable.is-7-widescreen-only{--columnGap: 1.75rem}}@media screen and (min-width: 1408px){html.theme--documenter-dark .columns.is-variable.is-7-fullhd{--columnGap: 1.75rem}}html.theme--documenter-dark .columns.is-variable.is-8{--columnGap: 2rem}@media screen and (max-width: 768px){html.theme--documenter-dark .columns.is-variable.is-8-mobile{--columnGap: 2rem}}@media screen and (min-width: 769px),print{html.theme--documenter-dark .columns.is-variable.is-8-tablet{--columnGap: 2rem}}@media screen and (min-width: 769px) and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-8-tablet-only{--columnGap: 2rem}}@media screen and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-8-touch{--columnGap: 2rem}}@media screen and (min-width: 1056px){html.theme--documenter-dark .columns.is-variable.is-8-desktop{--columnGap: 2rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){html.theme--documenter-dark .columns.is-variable.is-8-desktop-only{--columnGap: 2rem}}@media screen and (min-width: 1216px){html.theme--documenter-dark .columns.is-variable.is-8-widescreen{--columnGap: 2rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){html.theme--documenter-dark .columns.is-variable.is-8-widescreen-only{--columnGap: 2rem}}@media screen and (min-width: 1408px){html.theme--documenter-dark .columns.is-variable.is-8-fullhd{--columnGap: 2rem}}html.theme--documenter-dark .tile{align-items:stretch;display:block;flex-basis:0;flex-grow:1;flex-shrink:1;min-height:min-content}html.theme--documenter-dark .tile.is-ancestor{margin-left:-.75rem;margin-right:-.75rem;margin-top:-.75rem}html.theme--documenter-dark .tile.is-ancestor:last-child{margin-bottom:-.75rem}html.theme--documenter-dark .tile.is-ancestor:not(:last-child){margin-bottom:.75rem}html.theme--documenter-dark .tile.is-child{margin:0 !important}html.theme--documenter-dark .tile.is-parent{padding:.75rem}html.theme--documenter-dark .tile.is-vertical{flex-direction:column}html.theme--documenter-dark .tile.is-vertical>.tile.is-child:not(:last-child){margin-bottom:1.5rem !important}@media screen and (min-width: 769px),print{html.theme--documenter-dark .tile:not(.is-child){display:flex}html.theme--documenter-dark .tile.is-1{flex:none;width:8.33333337%}html.theme--documenter-dark .tile.is-2{flex:none;width:16.66666674%}html.theme--documenter-dark .tile.is-3{flex:none;width:25%}html.theme--documenter-dark .tile.is-4{flex:none;width:33.33333337%}html.theme--documenter-dark .tile.is-5{flex:none;width:41.66666674%}html.theme--documenter-dark .tile.is-6{flex:none;width:50%}html.theme--documenter-dark .tile.is-7{flex:none;width:58.33333337%}html.theme--documenter-dark .tile.is-8{flex:none;width:66.66666674%}html.theme--documenter-dark .tile.is-9{flex:none;width:75%}html.theme--documenter-dark .tile.is-10{flex:none;width:83.33333337%}html.theme--documenter-dark .tile.is-11{flex:none;width:91.66666674%}html.theme--documenter-dark .tile.is-12{flex:none;width:100%}}html.theme--documenter-dark .hero{align-items:stretch;display:flex;flex-direction:column;justify-content:space-between}html.theme--documenter-dark .hero .navbar{background:none}html.theme--documenter-dark .hero .tabs ul{border-bottom:none}html.theme--documenter-dark .hero.is-white{background-color:#fff;color:#0a0a0a}html.theme--documenter-dark .hero.is-white a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),html.theme--documenter-dark .hero.is-white strong{color:inherit}html.theme--documenter-dark .hero.is-white .title{color:#0a0a0a}html.theme--documenter-dark .hero.is-white .subtitle{color:rgba(10,10,10,0.9)}html.theme--documenter-dark .hero.is-white .subtitle a:not(.button),html.theme--documenter-dark .hero.is-white .subtitle strong{color:#0a0a0a}@media screen and (max-width: 1055px){html.theme--documenter-dark .hero.is-white .navbar-menu{background-color:#fff}}html.theme--documenter-dark .hero.is-white .navbar-item,html.theme--documenter-dark .hero.is-white .navbar-link{color:rgba(10,10,10,0.7)}html.theme--documenter-dark .hero.is-white a.navbar-item:hover,html.theme--documenter-dark .hero.is-white a.navbar-item.is-active,html.theme--documenter-dark .hero.is-white .navbar-link:hover,html.theme--documenter-dark .hero.is-white .navbar-link.is-active{background-color:#f2f2f2;color:#0a0a0a}html.theme--documenter-dark .hero.is-white .tabs a{color:#0a0a0a;opacity:0.9}html.theme--documenter-dark .hero.is-white .tabs a:hover{opacity:1}html.theme--documenter-dark .hero.is-white .tabs li.is-active a{color:#fff !important;opacity:1}html.theme--documenter-dark .hero.is-white .tabs.is-boxed a,html.theme--documenter-dark .hero.is-white .tabs.is-toggle a{color:#0a0a0a}html.theme--documenter-dark .hero.is-white .tabs.is-boxed a:hover,html.theme--documenter-dark .hero.is-white .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}html.theme--documenter-dark .hero.is-white .tabs.is-boxed li.is-active a,html.theme--documenter-dark .hero.is-white .tabs.is-boxed li.is-active a:hover,html.theme--documenter-dark .hero.is-white .tabs.is-toggle li.is-active a,html.theme--documenter-dark .hero.is-white .tabs.is-toggle li.is-active a:hover{background-color:#0a0a0a;border-color:#0a0a0a;color:#fff}html.theme--documenter-dark .hero.is-white.is-bold{background-image:linear-gradient(141deg, #e8e3e4 0%, #fff 71%, #fff 100%)}@media screen and (max-width: 768px){html.theme--documenter-dark .hero.is-white.is-bold .navbar-menu{background-image:linear-gradient(141deg, #e8e3e4 0%, #fff 71%, #fff 100%)}}html.theme--documenter-dark .hero.is-black{background-color:#0a0a0a;color:#fff}html.theme--documenter-dark .hero.is-black a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),html.theme--documenter-dark .hero.is-black strong{color:inherit}html.theme--documenter-dark .hero.is-black .title{color:#fff}html.theme--documenter-dark .hero.is-black .subtitle{color:rgba(255,255,255,0.9)}html.theme--documenter-dark .hero.is-black .subtitle a:not(.button),html.theme--documenter-dark .hero.is-black .subtitle strong{color:#fff}@media screen and (max-width: 1055px){html.theme--documenter-dark .hero.is-black .navbar-menu{background-color:#0a0a0a}}html.theme--documenter-dark .hero.is-black .navbar-item,html.theme--documenter-dark .hero.is-black .navbar-link{color:rgba(255,255,255,0.7)}html.theme--documenter-dark .hero.is-black a.navbar-item:hover,html.theme--documenter-dark .hero.is-black a.navbar-item.is-active,html.theme--documenter-dark .hero.is-black .navbar-link:hover,html.theme--documenter-dark .hero.is-black .navbar-link.is-active{background-color:#000;color:#fff}html.theme--documenter-dark .hero.is-black .tabs a{color:#fff;opacity:0.9}html.theme--documenter-dark .hero.is-black .tabs a:hover{opacity:1}html.theme--documenter-dark .hero.is-black .tabs li.is-active a{color:#0a0a0a !important;opacity:1}html.theme--documenter-dark .hero.is-black .tabs.is-boxed a,html.theme--documenter-dark .hero.is-black .tabs.is-toggle a{color:#fff}html.theme--documenter-dark .hero.is-black .tabs.is-boxed a:hover,html.theme--documenter-dark .hero.is-black .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}html.theme--documenter-dark .hero.is-black .tabs.is-boxed li.is-active a,html.theme--documenter-dark .hero.is-black .tabs.is-boxed li.is-active a:hover,html.theme--documenter-dark .hero.is-black .tabs.is-toggle li.is-active a,html.theme--documenter-dark .hero.is-black .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#0a0a0a}html.theme--documenter-dark .hero.is-black.is-bold{background-image:linear-gradient(141deg, #000 0%, #0a0a0a 71%, #181616 100%)}@media screen and (max-width: 768px){html.theme--documenter-dark .hero.is-black.is-bold .navbar-menu{background-image:linear-gradient(141deg, #000 0%, #0a0a0a 71%, #181616 100%)}}html.theme--documenter-dark .hero.is-light{background-color:#ecf0f1;color:rgba(0,0,0,0.7)}html.theme--documenter-dark .hero.is-light a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),html.theme--documenter-dark .hero.is-light strong{color:inherit}html.theme--documenter-dark .hero.is-light .title{color:rgba(0,0,0,0.7)}html.theme--documenter-dark .hero.is-light .subtitle{color:rgba(0,0,0,0.9)}html.theme--documenter-dark .hero.is-light .subtitle a:not(.button),html.theme--documenter-dark .hero.is-light .subtitle strong{color:rgba(0,0,0,0.7)}@media screen and (max-width: 1055px){html.theme--documenter-dark .hero.is-light .navbar-menu{background-color:#ecf0f1}}html.theme--documenter-dark .hero.is-light .navbar-item,html.theme--documenter-dark .hero.is-light .navbar-link{color:rgba(0,0,0,0.7)}html.theme--documenter-dark .hero.is-light a.navbar-item:hover,html.theme--documenter-dark .hero.is-light a.navbar-item.is-active,html.theme--documenter-dark .hero.is-light .navbar-link:hover,html.theme--documenter-dark .hero.is-light .navbar-link.is-active{background-color:#dde4e6;color:rgba(0,0,0,0.7)}html.theme--documenter-dark .hero.is-light .tabs a{color:rgba(0,0,0,0.7);opacity:0.9}html.theme--documenter-dark .hero.is-light .tabs a:hover{opacity:1}html.theme--documenter-dark .hero.is-light .tabs li.is-active a{color:#ecf0f1 !important;opacity:1}html.theme--documenter-dark .hero.is-light .tabs.is-boxed a,html.theme--documenter-dark .hero.is-light .tabs.is-toggle a{color:rgba(0,0,0,0.7)}html.theme--documenter-dark .hero.is-light .tabs.is-boxed a:hover,html.theme--documenter-dark .hero.is-light .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}html.theme--documenter-dark .hero.is-light .tabs.is-boxed li.is-active a,html.theme--documenter-dark .hero.is-light .tabs.is-boxed li.is-active a:hover,html.theme--documenter-dark .hero.is-light .tabs.is-toggle li.is-active a,html.theme--documenter-dark .hero.is-light .tabs.is-toggle li.is-active a:hover{background-color:rgba(0,0,0,0.7);border-color:rgba(0,0,0,0.7);color:#ecf0f1}html.theme--documenter-dark .hero.is-light.is-bold{background-image:linear-gradient(141deg, #cadfe0 0%, #ecf0f1 71%, #fafbfc 100%)}@media screen and (max-width: 768px){html.theme--documenter-dark .hero.is-light.is-bold .navbar-menu{background-image:linear-gradient(141deg, #cadfe0 0%, #ecf0f1 71%, #fafbfc 100%)}}html.theme--documenter-dark .hero.is-dark,html.theme--documenter-dark .content kbd.hero{background-color:#282f2f;color:#fff}html.theme--documenter-dark .hero.is-dark a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),html.theme--documenter-dark .content kbd.hero a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),html.theme--documenter-dark .hero.is-dark strong,html.theme--documenter-dark .content kbd.hero strong{color:inherit}html.theme--documenter-dark .hero.is-dark .title,html.theme--documenter-dark .content kbd.hero .title{color:#fff}html.theme--documenter-dark .hero.is-dark .subtitle,html.theme--documenter-dark .content kbd.hero .subtitle{color:rgba(255,255,255,0.9)}html.theme--documenter-dark .hero.is-dark .subtitle a:not(.button),html.theme--documenter-dark .content kbd.hero .subtitle a:not(.button),html.theme--documenter-dark .hero.is-dark .subtitle strong,html.theme--documenter-dark .content kbd.hero .subtitle strong{color:#fff}@media screen and (max-width: 1055px){html.theme--documenter-dark .hero.is-dark .navbar-menu,html.theme--documenter-dark .content kbd.hero .navbar-menu{background-color:#282f2f}}html.theme--documenter-dark .hero.is-dark .navbar-item,html.theme--documenter-dark .content kbd.hero .navbar-item,html.theme--documenter-dark .hero.is-dark .navbar-link,html.theme--documenter-dark .content kbd.hero .navbar-link{color:rgba(255,255,255,0.7)}html.theme--documenter-dark .hero.is-dark a.navbar-item:hover,html.theme--documenter-dark .content kbd.hero a.navbar-item:hover,html.theme--documenter-dark .hero.is-dark a.navbar-item.is-active,html.theme--documenter-dark .content kbd.hero a.navbar-item.is-active,html.theme--documenter-dark .hero.is-dark .navbar-link:hover,html.theme--documenter-dark .content kbd.hero .navbar-link:hover,html.theme--documenter-dark .hero.is-dark .navbar-link.is-active,html.theme--documenter-dark .content kbd.hero .navbar-link.is-active{background-color:#1d2122;color:#fff}html.theme--documenter-dark .hero.is-dark .tabs a,html.theme--documenter-dark .content kbd.hero .tabs a{color:#fff;opacity:0.9}html.theme--documenter-dark .hero.is-dark .tabs a:hover,html.theme--documenter-dark .content kbd.hero .tabs a:hover{opacity:1}html.theme--documenter-dark .hero.is-dark .tabs li.is-active a,html.theme--documenter-dark .content kbd.hero .tabs li.is-active a{color:#282f2f !important;opacity:1}html.theme--documenter-dark .hero.is-dark .tabs.is-boxed a,html.theme--documenter-dark .content kbd.hero .tabs.is-boxed a,html.theme--documenter-dark .hero.is-dark .tabs.is-toggle a,html.theme--documenter-dark .content kbd.hero .tabs.is-toggle a{color:#fff}html.theme--documenter-dark .hero.is-dark .tabs.is-boxed a:hover,html.theme--documenter-dark .content kbd.hero .tabs.is-boxed a:hover,html.theme--documenter-dark .hero.is-dark .tabs.is-toggle a:hover,html.theme--documenter-dark .content kbd.hero .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}html.theme--documenter-dark .hero.is-dark .tabs.is-boxed li.is-active a,html.theme--documenter-dark .content kbd.hero .tabs.is-boxed li.is-active a,html.theme--documenter-dark .hero.is-dark .tabs.is-boxed li.is-active a:hover,html.theme--documenter-dark .hero.is-dark .tabs.is-toggle li.is-active a,html.theme--documenter-dark .content kbd.hero .tabs.is-toggle li.is-active a,html.theme--documenter-dark .hero.is-dark .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#282f2f}html.theme--documenter-dark .hero.is-dark.is-bold,html.theme--documenter-dark .content kbd.hero.is-bold{background-image:linear-gradient(141deg, #0f1615 0%, #282f2f 71%, #313c40 100%)}@media screen and (max-width: 768px){html.theme--documenter-dark .hero.is-dark.is-bold .navbar-menu,html.theme--documenter-dark .content kbd.hero.is-bold .navbar-menu{background-image:linear-gradient(141deg, #0f1615 0%, #282f2f 71%, #313c40 100%)}}html.theme--documenter-dark .hero.is-primary,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink{background-color:#375a7f;color:#fff}html.theme--documenter-dark .hero.is-primary a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),html.theme--documenter-dark .hero.is-primary strong,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink strong{color:inherit}html.theme--documenter-dark .hero.is-primary .title,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .title{color:#fff}html.theme--documenter-dark .hero.is-primary .subtitle,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .subtitle{color:rgba(255,255,255,0.9)}html.theme--documenter-dark .hero.is-primary .subtitle a:not(.button),html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .subtitle a:not(.button),html.theme--documenter-dark .hero.is-primary .subtitle strong,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .subtitle strong{color:#fff}@media screen and (max-width: 1055px){html.theme--documenter-dark .hero.is-primary .navbar-menu,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .navbar-menu{background-color:#375a7f}}html.theme--documenter-dark .hero.is-primary .navbar-item,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .navbar-item,html.theme--documenter-dark .hero.is-primary .navbar-link,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .navbar-link{color:rgba(255,255,255,0.7)}html.theme--documenter-dark .hero.is-primary a.navbar-item:hover,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink a.navbar-item:hover,html.theme--documenter-dark .hero.is-primary a.navbar-item.is-active,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink a.navbar-item.is-active,html.theme--documenter-dark .hero.is-primary .navbar-link:hover,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .navbar-link:hover,html.theme--documenter-dark .hero.is-primary .navbar-link.is-active,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .navbar-link.is-active{background-color:#2f4d6d;color:#fff}html.theme--documenter-dark .hero.is-primary .tabs a,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .tabs a{color:#fff;opacity:0.9}html.theme--documenter-dark .hero.is-primary .tabs a:hover,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .tabs a:hover{opacity:1}html.theme--documenter-dark .hero.is-primary .tabs li.is-active a,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .tabs li.is-active a{color:#375a7f !important;opacity:1}html.theme--documenter-dark .hero.is-primary .tabs.is-boxed a,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .tabs.is-boxed a,html.theme--documenter-dark .hero.is-primary .tabs.is-toggle a,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .tabs.is-toggle a{color:#fff}html.theme--documenter-dark .hero.is-primary .tabs.is-boxed a:hover,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .tabs.is-boxed a:hover,html.theme--documenter-dark .hero.is-primary .tabs.is-toggle a:hover,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}html.theme--documenter-dark .hero.is-primary .tabs.is-boxed li.is-active a,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .tabs.is-boxed li.is-active a,html.theme--documenter-dark .hero.is-primary .tabs.is-boxed li.is-active a:hover,html.theme--documenter-dark .hero.is-primary .tabs.is-toggle li.is-active a,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .tabs.is-toggle li.is-active a,html.theme--documenter-dark .hero.is-primary .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#375a7f}html.theme--documenter-dark .hero.is-primary.is-bold,html.theme--documenter-dark .docstring>section>a.hero.is-bold.docs-sourcelink{background-image:linear-gradient(141deg, #214b62 0%, #375a7f 71%, #3a5796 100%)}@media screen and (max-width: 768px){html.theme--documenter-dark .hero.is-primary.is-bold .navbar-menu,html.theme--documenter-dark .docstring>section>a.hero.is-bold.docs-sourcelink .navbar-menu{background-image:linear-gradient(141deg, #214b62 0%, #375a7f 71%, #3a5796 100%)}}html.theme--documenter-dark .hero.is-link{background-color:#1abc9c;color:#fff}html.theme--documenter-dark .hero.is-link a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),html.theme--documenter-dark .hero.is-link strong{color:inherit}html.theme--documenter-dark .hero.is-link .title{color:#fff}html.theme--documenter-dark .hero.is-link .subtitle{color:rgba(255,255,255,0.9)}html.theme--documenter-dark .hero.is-link .subtitle a:not(.button),html.theme--documenter-dark .hero.is-link .subtitle strong{color:#fff}@media screen and (max-width: 1055px){html.theme--documenter-dark .hero.is-link .navbar-menu{background-color:#1abc9c}}html.theme--documenter-dark .hero.is-link .navbar-item,html.theme--documenter-dark .hero.is-link .navbar-link{color:rgba(255,255,255,0.7)}html.theme--documenter-dark .hero.is-link a.navbar-item:hover,html.theme--documenter-dark .hero.is-link a.navbar-item.is-active,html.theme--documenter-dark .hero.is-link .navbar-link:hover,html.theme--documenter-dark .hero.is-link .navbar-link.is-active{background-color:#17a689;color:#fff}html.theme--documenter-dark .hero.is-link .tabs a{color:#fff;opacity:0.9}html.theme--documenter-dark .hero.is-link .tabs a:hover{opacity:1}html.theme--documenter-dark .hero.is-link .tabs li.is-active a{color:#1abc9c !important;opacity:1}html.theme--documenter-dark .hero.is-link .tabs.is-boxed a,html.theme--documenter-dark .hero.is-link .tabs.is-toggle a{color:#fff}html.theme--documenter-dark .hero.is-link .tabs.is-boxed a:hover,html.theme--documenter-dark .hero.is-link .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}html.theme--documenter-dark .hero.is-link .tabs.is-boxed li.is-active a,html.theme--documenter-dark .hero.is-link .tabs.is-boxed li.is-active a:hover,html.theme--documenter-dark .hero.is-link .tabs.is-toggle li.is-active a,html.theme--documenter-dark .hero.is-link .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#1abc9c}html.theme--documenter-dark .hero.is-link.is-bold{background-image:linear-gradient(141deg, #0c9764 0%, #1abc9c 71%, #17d8d2 100%)}@media screen and (max-width: 768px){html.theme--documenter-dark .hero.is-link.is-bold .navbar-menu{background-image:linear-gradient(141deg, #0c9764 0%, #1abc9c 71%, #17d8d2 100%)}}html.theme--documenter-dark .hero.is-info{background-color:#024c7d;color:#fff}html.theme--documenter-dark .hero.is-info a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),html.theme--documenter-dark .hero.is-info strong{color:inherit}html.theme--documenter-dark .hero.is-info .title{color:#fff}html.theme--documenter-dark .hero.is-info .subtitle{color:rgba(255,255,255,0.9)}html.theme--documenter-dark .hero.is-info .subtitle a:not(.button),html.theme--documenter-dark .hero.is-info .subtitle strong{color:#fff}@media screen and (max-width: 1055px){html.theme--documenter-dark .hero.is-info .navbar-menu{background-color:#024c7d}}html.theme--documenter-dark .hero.is-info .navbar-item,html.theme--documenter-dark .hero.is-info .navbar-link{color:rgba(255,255,255,0.7)}html.theme--documenter-dark .hero.is-info a.navbar-item:hover,html.theme--documenter-dark .hero.is-info a.navbar-item.is-active,html.theme--documenter-dark .hero.is-info .navbar-link:hover,html.theme--documenter-dark .hero.is-info .navbar-link.is-active{background-color:#023d64;color:#fff}html.theme--documenter-dark .hero.is-info .tabs a{color:#fff;opacity:0.9}html.theme--documenter-dark .hero.is-info .tabs a:hover{opacity:1}html.theme--documenter-dark .hero.is-info .tabs li.is-active a{color:#024c7d !important;opacity:1}html.theme--documenter-dark .hero.is-info .tabs.is-boxed a,html.theme--documenter-dark .hero.is-info .tabs.is-toggle a{color:#fff}html.theme--documenter-dark .hero.is-info .tabs.is-boxed a:hover,html.theme--documenter-dark .hero.is-info .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}html.theme--documenter-dark .hero.is-info .tabs.is-boxed li.is-active a,html.theme--documenter-dark .hero.is-info .tabs.is-boxed li.is-active a:hover,html.theme--documenter-dark .hero.is-info .tabs.is-toggle li.is-active a,html.theme--documenter-dark .hero.is-info .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#024c7d}html.theme--documenter-dark .hero.is-info.is-bold{background-image:linear-gradient(141deg, #003a4c 0%, #024c7d 71%, #004299 100%)}@media screen and (max-width: 768px){html.theme--documenter-dark .hero.is-info.is-bold .navbar-menu{background-image:linear-gradient(141deg, #003a4c 0%, #024c7d 71%, #004299 100%)}}html.theme--documenter-dark .hero.is-success{background-color:#008438;color:#fff}html.theme--documenter-dark .hero.is-success a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),html.theme--documenter-dark .hero.is-success strong{color:inherit}html.theme--documenter-dark .hero.is-success .title{color:#fff}html.theme--documenter-dark .hero.is-success .subtitle{color:rgba(255,255,255,0.9)}html.theme--documenter-dark .hero.is-success .subtitle a:not(.button),html.theme--documenter-dark .hero.is-success .subtitle strong{color:#fff}@media screen and (max-width: 1055px){html.theme--documenter-dark .hero.is-success .navbar-menu{background-color:#008438}}html.theme--documenter-dark .hero.is-success .navbar-item,html.theme--documenter-dark .hero.is-success .navbar-link{color:rgba(255,255,255,0.7)}html.theme--documenter-dark .hero.is-success a.navbar-item:hover,html.theme--documenter-dark .hero.is-success a.navbar-item.is-active,html.theme--documenter-dark .hero.is-success .navbar-link:hover,html.theme--documenter-dark .hero.is-success .navbar-link.is-active{background-color:#006b2d;color:#fff}html.theme--documenter-dark .hero.is-success .tabs a{color:#fff;opacity:0.9}html.theme--documenter-dark .hero.is-success .tabs a:hover{opacity:1}html.theme--documenter-dark .hero.is-success .tabs li.is-active a{color:#008438 !important;opacity:1}html.theme--documenter-dark .hero.is-success .tabs.is-boxed a,html.theme--documenter-dark .hero.is-success .tabs.is-toggle a{color:#fff}html.theme--documenter-dark .hero.is-success .tabs.is-boxed a:hover,html.theme--documenter-dark .hero.is-success .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}html.theme--documenter-dark .hero.is-success .tabs.is-boxed li.is-active a,html.theme--documenter-dark .hero.is-success .tabs.is-boxed li.is-active a:hover,html.theme--documenter-dark .hero.is-success .tabs.is-toggle li.is-active a,html.theme--documenter-dark .hero.is-success .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#008438}html.theme--documenter-dark .hero.is-success.is-bold{background-image:linear-gradient(141deg, #005115 0%, #008438 71%, #009e5d 100%)}@media screen and (max-width: 768px){html.theme--documenter-dark .hero.is-success.is-bold .navbar-menu{background-image:linear-gradient(141deg, #005115 0%, #008438 71%, #009e5d 100%)}}html.theme--documenter-dark .hero.is-warning{background-color:#ad8100;color:#fff}html.theme--documenter-dark .hero.is-warning a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),html.theme--documenter-dark .hero.is-warning strong{color:inherit}html.theme--documenter-dark .hero.is-warning .title{color:#fff}html.theme--documenter-dark .hero.is-warning .subtitle{color:rgba(255,255,255,0.9)}html.theme--documenter-dark .hero.is-warning .subtitle a:not(.button),html.theme--documenter-dark .hero.is-warning .subtitle strong{color:#fff}@media screen and (max-width: 1055px){html.theme--documenter-dark .hero.is-warning .navbar-menu{background-color:#ad8100}}html.theme--documenter-dark .hero.is-warning .navbar-item,html.theme--documenter-dark .hero.is-warning .navbar-link{color:rgba(255,255,255,0.7)}html.theme--documenter-dark .hero.is-warning a.navbar-item:hover,html.theme--documenter-dark .hero.is-warning a.navbar-item.is-active,html.theme--documenter-dark .hero.is-warning .navbar-link:hover,html.theme--documenter-dark .hero.is-warning .navbar-link.is-active{background-color:#946e00;color:#fff}html.theme--documenter-dark .hero.is-warning .tabs a{color:#fff;opacity:0.9}html.theme--documenter-dark .hero.is-warning .tabs a:hover{opacity:1}html.theme--documenter-dark .hero.is-warning .tabs li.is-active a{color:#ad8100 !important;opacity:1}html.theme--documenter-dark .hero.is-warning .tabs.is-boxed a,html.theme--documenter-dark .hero.is-warning .tabs.is-toggle a{color:#fff}html.theme--documenter-dark .hero.is-warning .tabs.is-boxed a:hover,html.theme--documenter-dark .hero.is-warning .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}html.theme--documenter-dark .hero.is-warning .tabs.is-boxed li.is-active a,html.theme--documenter-dark .hero.is-warning .tabs.is-boxed li.is-active a:hover,html.theme--documenter-dark .hero.is-warning .tabs.is-toggle li.is-active a,html.theme--documenter-dark .hero.is-warning .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#ad8100}html.theme--documenter-dark .hero.is-warning.is-bold{background-image:linear-gradient(141deg, #7a4700 0%, #ad8100 71%, #c7b500 100%)}@media screen and (max-width: 768px){html.theme--documenter-dark .hero.is-warning.is-bold .navbar-menu{background-image:linear-gradient(141deg, #7a4700 0%, #ad8100 71%, #c7b500 100%)}}html.theme--documenter-dark .hero.is-danger{background-color:#9e1b0d;color:#fff}html.theme--documenter-dark .hero.is-danger a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),html.theme--documenter-dark .hero.is-danger strong{color:inherit}html.theme--documenter-dark .hero.is-danger .title{color:#fff}html.theme--documenter-dark .hero.is-danger .subtitle{color:rgba(255,255,255,0.9)}html.theme--documenter-dark .hero.is-danger .subtitle a:not(.button),html.theme--documenter-dark .hero.is-danger .subtitle strong{color:#fff}@media screen and (max-width: 1055px){html.theme--documenter-dark .hero.is-danger .navbar-menu{background-color:#9e1b0d}}html.theme--documenter-dark .hero.is-danger .navbar-item,html.theme--documenter-dark .hero.is-danger .navbar-link{color:rgba(255,255,255,0.7)}html.theme--documenter-dark .hero.is-danger a.navbar-item:hover,html.theme--documenter-dark .hero.is-danger a.navbar-item.is-active,html.theme--documenter-dark .hero.is-danger .navbar-link:hover,html.theme--documenter-dark .hero.is-danger .navbar-link.is-active{background-color:#86170b;color:#fff}html.theme--documenter-dark .hero.is-danger .tabs a{color:#fff;opacity:0.9}html.theme--documenter-dark .hero.is-danger .tabs a:hover{opacity:1}html.theme--documenter-dark .hero.is-danger .tabs li.is-active a{color:#9e1b0d !important;opacity:1}html.theme--documenter-dark .hero.is-danger .tabs.is-boxed a,html.theme--documenter-dark .hero.is-danger .tabs.is-toggle a{color:#fff}html.theme--documenter-dark .hero.is-danger .tabs.is-boxed a:hover,html.theme--documenter-dark .hero.is-danger .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}html.theme--documenter-dark .hero.is-danger .tabs.is-boxed li.is-active a,html.theme--documenter-dark .hero.is-danger .tabs.is-boxed li.is-active a:hover,html.theme--documenter-dark .hero.is-danger .tabs.is-toggle li.is-active a,html.theme--documenter-dark .hero.is-danger .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#9e1b0d}html.theme--documenter-dark .hero.is-danger.is-bold{background-image:linear-gradient(141deg, #75030b 0%, #9e1b0d 71%, #ba380a 100%)}@media screen and (max-width: 768px){html.theme--documenter-dark .hero.is-danger.is-bold .navbar-menu{background-image:linear-gradient(141deg, #75030b 0%, #9e1b0d 71%, #ba380a 100%)}}html.theme--documenter-dark .hero.is-small .hero-body,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.hero .hero-body{padding:1.5rem}@media screen and (min-width: 769px),print{html.theme--documenter-dark .hero.is-medium .hero-body{padding:9rem 4.5rem}}@media screen and (min-width: 769px),print{html.theme--documenter-dark .hero.is-large .hero-body{padding:18rem 6rem}}html.theme--documenter-dark .hero.is-halfheight .hero-body,html.theme--documenter-dark .hero.is-fullheight .hero-body,html.theme--documenter-dark .hero.is-fullheight-with-navbar .hero-body{align-items:center;display:flex}html.theme--documenter-dark .hero.is-halfheight .hero-body>.container,html.theme--documenter-dark .hero.is-fullheight .hero-body>.container,html.theme--documenter-dark .hero.is-fullheight-with-navbar .hero-body>.container{flex-grow:1;flex-shrink:1}html.theme--documenter-dark .hero.is-halfheight{min-height:50vh}html.theme--documenter-dark .hero.is-fullheight{min-height:100vh}html.theme--documenter-dark .hero-video{overflow:hidden}html.theme--documenter-dark .hero-video video{left:50%;min-height:100%;min-width:100%;position:absolute;top:50%;transform:translate3d(-50%, -50%, 0)}html.theme--documenter-dark .hero-video.is-transparent{opacity:0.3}@media screen and (max-width: 768px){html.theme--documenter-dark .hero-video{display:none}}html.theme--documenter-dark .hero-buttons{margin-top:1.5rem}@media screen and (max-width: 768px){html.theme--documenter-dark .hero-buttons .button{display:flex}html.theme--documenter-dark .hero-buttons .button:not(:last-child){margin-bottom:0.75rem}}@media screen and (min-width: 769px),print{html.theme--documenter-dark .hero-buttons{display:flex;justify-content:center}html.theme--documenter-dark .hero-buttons .button:not(:last-child){margin-right:1.5rem}}html.theme--documenter-dark .hero-head,html.theme--documenter-dark .hero-foot{flex-grow:0;flex-shrink:0}html.theme--documenter-dark .hero-body{flex-grow:1;flex-shrink:0;padding:3rem 1.5rem}@media screen and (min-width: 769px),print{html.theme--documenter-dark .hero-body{padding:3rem 3rem}}html.theme--documenter-dark .section{padding:3rem 1.5rem}@media screen and (min-width: 1056px){html.theme--documenter-dark .section{padding:3rem 3rem}html.theme--documenter-dark .section.is-medium{padding:9rem 4.5rem}html.theme--documenter-dark .section.is-large{padding:18rem 6rem}}html.theme--documenter-dark .footer{background-color:#282f2f;padding:3rem 1.5rem 6rem}html.theme--documenter-dark hr{height:1px}html.theme--documenter-dark h6{text-transform:uppercase;letter-spacing:0.5px}html.theme--documenter-dark .hero{background-color:#343c3d}html.theme--documenter-dark a{transition:all 200ms ease}html.theme--documenter-dark .button{transition:all 200ms ease;border-width:1px;color:#fff}html.theme--documenter-dark .button.is-active,html.theme--documenter-dark .button.is-focused,html.theme--documenter-dark .button:active,html.theme--documenter-dark .button:focus{box-shadow:0 0 0 2px rgba(140,155,157,0.5)}html.theme--documenter-dark .button.is-white.is-hovered,html.theme--documenter-dark .button.is-white:hover{background-color:#fff}html.theme--documenter-dark .button.is-white.is-active,html.theme--documenter-dark .button.is-white.is-focused,html.theme--documenter-dark .button.is-white:active,html.theme--documenter-dark .button.is-white:focus{border-color:#fff;box-shadow:0 0 0 2px rgba(255,255,255,0.5)}html.theme--documenter-dark .button.is-black.is-hovered,html.theme--documenter-dark .button.is-black:hover{background-color:#1d1d1d}html.theme--documenter-dark .button.is-black.is-active,html.theme--documenter-dark .button.is-black.is-focused,html.theme--documenter-dark .button.is-black:active,html.theme--documenter-dark .button.is-black:focus{border-color:#0a0a0a;box-shadow:0 0 0 2px rgba(10,10,10,0.5)}html.theme--documenter-dark .button.is-light.is-hovered,html.theme--documenter-dark .button.is-light:hover{background-color:#fff}html.theme--documenter-dark .button.is-light.is-active,html.theme--documenter-dark .button.is-light.is-focused,html.theme--documenter-dark .button.is-light:active,html.theme--documenter-dark .button.is-light:focus{border-color:#ecf0f1;box-shadow:0 0 0 2px rgba(236,240,241,0.5)}html.theme--documenter-dark .button.is-dark.is-hovered,html.theme--documenter-dark .content kbd.button.is-hovered,html.theme--documenter-dark .button.is-dark:hover,html.theme--documenter-dark .content kbd.button:hover{background-color:#3a4344}html.theme--documenter-dark .button.is-dark.is-active,html.theme--documenter-dark .content kbd.button.is-active,html.theme--documenter-dark .button.is-dark.is-focused,html.theme--documenter-dark .content kbd.button.is-focused,html.theme--documenter-dark .button.is-dark:active,html.theme--documenter-dark .content kbd.button:active,html.theme--documenter-dark .button.is-dark:focus,html.theme--documenter-dark .content kbd.button:focus{border-color:#282f2f;box-shadow:0 0 0 2px rgba(40,47,47,0.5)}html.theme--documenter-dark .button.is-primary.is-hovered,html.theme--documenter-dark .docstring>section>a.button.is-hovered.docs-sourcelink,html.theme--documenter-dark .button.is-primary:hover,html.theme--documenter-dark .docstring>section>a.button.docs-sourcelink:hover{background-color:#436d9a}html.theme--documenter-dark .button.is-primary.is-active,html.theme--documenter-dark .docstring>section>a.button.is-active.docs-sourcelink,html.theme--documenter-dark .button.is-primary.is-focused,html.theme--documenter-dark .docstring>section>a.button.is-focused.docs-sourcelink,html.theme--documenter-dark .button.is-primary:active,html.theme--documenter-dark .docstring>section>a.button.docs-sourcelink:active,html.theme--documenter-dark .button.is-primary:focus,html.theme--documenter-dark .docstring>section>a.button.docs-sourcelink:focus{border-color:#375a7f;box-shadow:0 0 0 2px rgba(55,90,127,0.5)}html.theme--documenter-dark .button.is-link.is-hovered,html.theme--documenter-dark .button.is-link:hover{background-color:#1fdeb8}html.theme--documenter-dark .button.is-link.is-active,html.theme--documenter-dark .button.is-link.is-focused,html.theme--documenter-dark .button.is-link:active,html.theme--documenter-dark .button.is-link:focus{border-color:#1abc9c;box-shadow:0 0 0 2px rgba(26,188,156,0.5)}html.theme--documenter-dark .button.is-info.is-hovered,html.theme--documenter-dark .button.is-info:hover{background-color:#0363a3}html.theme--documenter-dark .button.is-info.is-active,html.theme--documenter-dark .button.is-info.is-focused,html.theme--documenter-dark .button.is-info:active,html.theme--documenter-dark .button.is-info:focus{border-color:#024c7d;box-shadow:0 0 0 2px rgba(2,76,125,0.5)}html.theme--documenter-dark .button.is-success.is-hovered,html.theme--documenter-dark .button.is-success:hover{background-color:#00aa48}html.theme--documenter-dark .button.is-success.is-active,html.theme--documenter-dark .button.is-success.is-focused,html.theme--documenter-dark .button.is-success:active,html.theme--documenter-dark .button.is-success:focus{border-color:#008438;box-shadow:0 0 0 2px rgba(0,132,56,0.5)}html.theme--documenter-dark .button.is-warning.is-hovered,html.theme--documenter-dark .button.is-warning:hover{background-color:#d39e00}html.theme--documenter-dark .button.is-warning.is-active,html.theme--documenter-dark .button.is-warning.is-focused,html.theme--documenter-dark .button.is-warning:active,html.theme--documenter-dark .button.is-warning:focus{border-color:#ad8100;box-shadow:0 0 0 2px rgba(173,129,0,0.5)}html.theme--documenter-dark .button.is-danger.is-hovered,html.theme--documenter-dark .button.is-danger:hover{background-color:#c12110}html.theme--documenter-dark .button.is-danger.is-active,html.theme--documenter-dark .button.is-danger.is-focused,html.theme--documenter-dark .button.is-danger:active,html.theme--documenter-dark .button.is-danger:focus{border-color:#9e1b0d;box-shadow:0 0 0 2px rgba(158,27,13,0.5)}html.theme--documenter-dark .label{color:#dbdee0}html.theme--documenter-dark .button,html.theme--documenter-dark .control.has-icons-left .icon,html.theme--documenter-dark .control.has-icons-right .icon,html.theme--documenter-dark .input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input,html.theme--documenter-dark .pagination-ellipsis,html.theme--documenter-dark .pagination-link,html.theme--documenter-dark .pagination-next,html.theme--documenter-dark .pagination-previous,html.theme--documenter-dark .select,html.theme--documenter-dark .select select,html.theme--documenter-dark .textarea{height:2.5em}html.theme--documenter-dark .input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input,html.theme--documenter-dark .textarea{transition:all 200ms ease;box-shadow:none;border-width:1px;padding-left:1em;padding-right:1em}html.theme--documenter-dark .select:after,html.theme--documenter-dark .select select{border-width:1px}html.theme--documenter-dark .control.has-addons .button,html.theme--documenter-dark .control.has-addons .input,html.theme--documenter-dark .control.has-addons #documenter .docs-sidebar form.docs-search>input,html.theme--documenter-dark #documenter .docs-sidebar .control.has-addons form.docs-search>input,html.theme--documenter-dark .control.has-addons .select{margin-right:-1px}html.theme--documenter-dark .notification{background-color:#343c3d}html.theme--documenter-dark .card{box-shadow:none;border:1px solid #343c3d;background-color:#282f2f;border-radius:.4em}html.theme--documenter-dark .card .card-image img{border-radius:.4em .4em 0 0}html.theme--documenter-dark .card .card-header{box-shadow:none;background-color:rgba(18,18,18,0.2);border-radius:.4em .4em 0 0}html.theme--documenter-dark .card .card-footer{background-color:rgba(18,18,18,0.2)}html.theme--documenter-dark .card .card-footer,html.theme--documenter-dark .card .card-footer-item{border-width:1px;border-color:#343c3d}html.theme--documenter-dark .notification.is-white a:not(.button){color:#0a0a0a;text-decoration:underline}html.theme--documenter-dark .notification.is-black a:not(.button){color:#fff;text-decoration:underline}html.theme--documenter-dark .notification.is-light a:not(.button){color:rgba(0,0,0,0.7);text-decoration:underline}html.theme--documenter-dark .notification.is-dark a:not(.button),html.theme--documenter-dark .content kbd.notification a:not(.button){color:#fff;text-decoration:underline}html.theme--documenter-dark .notification.is-primary a:not(.button),html.theme--documenter-dark .docstring>section>a.notification.docs-sourcelink a:not(.button){color:#fff;text-decoration:underline}html.theme--documenter-dark .notification.is-link a:not(.button){color:#fff;text-decoration:underline}html.theme--documenter-dark .notification.is-info a:not(.button){color:#fff;text-decoration:underline}html.theme--documenter-dark .notification.is-success a:not(.button){color:#fff;text-decoration:underline}html.theme--documenter-dark .notification.is-warning a:not(.button){color:#fff;text-decoration:underline}html.theme--documenter-dark .notification.is-danger a:not(.button){color:#fff;text-decoration:underline}html.theme--documenter-dark .tag,html.theme--documenter-dark .content kbd,html.theme--documenter-dark .docstring>section>a.docs-sourcelink{border-radius:.4em}html.theme--documenter-dark .menu-list a{transition:all 300ms ease}html.theme--documenter-dark .modal-card-body{background-color:#282f2f}html.theme--documenter-dark .modal-card-foot,html.theme--documenter-dark .modal-card-head{border-color:#343c3d}html.theme--documenter-dark .message-header{font-weight:700;background-color:#343c3d;color:#fff}html.theme--documenter-dark .message-body{border-width:1px;border-color:#343c3d}html.theme--documenter-dark .navbar{border-radius:.4em}html.theme--documenter-dark .navbar.is-transparent{background:none}html.theme--documenter-dark .navbar.is-primary .navbar-dropdown a.navbar-item.is-active,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-dropdown a.navbar-item.is-active{background-color:#1abc9c}@media screen and (max-width: 1055px){html.theme--documenter-dark .navbar .navbar-menu{background-color:#375a7f;border-radius:0 0 .4em .4em}}html.theme--documenter-dark .hero .navbar,html.theme--documenter-dark body>.navbar{border-radius:0}html.theme--documenter-dark .pagination-link,html.theme--documenter-dark .pagination-next,html.theme--documenter-dark .pagination-previous{border-width:1px}html.theme--documenter-dark .panel-block,html.theme--documenter-dark .panel-heading,html.theme--documenter-dark .panel-tabs{border-width:1px}html.theme--documenter-dark .panel-block:first-child,html.theme--documenter-dark .panel-heading:first-child,html.theme--documenter-dark .panel-tabs:first-child{border-top-width:1px}html.theme--documenter-dark .panel-heading{font-weight:700}html.theme--documenter-dark .panel-tabs a{border-width:1px;margin-bottom:-1px}html.theme--documenter-dark .panel-tabs a.is-active{border-bottom-color:#17a689}html.theme--documenter-dark .panel-block:hover{color:#1dd2af}html.theme--documenter-dark .panel-block:hover .panel-icon{color:#1dd2af}html.theme--documenter-dark .panel-block.is-active .panel-icon{color:#17a689}html.theme--documenter-dark .tabs a{border-bottom-width:1px;margin-bottom:-1px}html.theme--documenter-dark .tabs ul{border-bottom-width:1px}html.theme--documenter-dark .tabs.is-boxed a{border-width:1px}html.theme--documenter-dark .tabs.is-boxed li.is-active a{background-color:#1f2424}html.theme--documenter-dark .tabs.is-toggle li a{border-width:1px;margin-bottom:0}html.theme--documenter-dark .tabs.is-toggle li+li{margin-left:-1px}html.theme--documenter-dark .hero.is-white .navbar .navbar-dropdown .navbar-item:hover{background-color:rgba(0,0,0,0)}html.theme--documenter-dark .hero.is-black .navbar .navbar-dropdown .navbar-item:hover{background-color:rgba(0,0,0,0)}html.theme--documenter-dark .hero.is-light .navbar .navbar-dropdown .navbar-item:hover{background-color:rgba(0,0,0,0)}html.theme--documenter-dark .hero.is-dark .navbar .navbar-dropdown .navbar-item:hover,html.theme--documenter-dark .content kbd.hero .navbar .navbar-dropdown .navbar-item:hover{background-color:rgba(0,0,0,0)}html.theme--documenter-dark .hero.is-primary .navbar .navbar-dropdown .navbar-item:hover,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .navbar .navbar-dropdown .navbar-item:hover{background-color:rgba(0,0,0,0)}html.theme--documenter-dark .hero.is-link .navbar .navbar-dropdown .navbar-item:hover{background-color:rgba(0,0,0,0)}html.theme--documenter-dark .hero.is-info .navbar .navbar-dropdown .navbar-item:hover{background-color:rgba(0,0,0,0)}html.theme--documenter-dark .hero.is-success .navbar .navbar-dropdown .navbar-item:hover{background-color:rgba(0,0,0,0)}html.theme--documenter-dark .hero.is-warning .navbar .navbar-dropdown .navbar-item:hover{background-color:rgba(0,0,0,0)}html.theme--documenter-dark .hero.is-danger .navbar .navbar-dropdown .navbar-item:hover{background-color:rgba(0,0,0,0)}html.theme--documenter-dark h1 .docs-heading-anchor,html.theme--documenter-dark h1 .docs-heading-anchor:hover,html.theme--documenter-dark h1 .docs-heading-anchor:visited,html.theme--documenter-dark h2 .docs-heading-anchor,html.theme--documenter-dark h2 .docs-heading-anchor:hover,html.theme--documenter-dark h2 .docs-heading-anchor:visited,html.theme--documenter-dark h3 .docs-heading-anchor,html.theme--documenter-dark h3 .docs-heading-anchor:hover,html.theme--documenter-dark h3 .docs-heading-anchor:visited,html.theme--documenter-dark h4 .docs-heading-anchor,html.theme--documenter-dark h4 .docs-heading-anchor:hover,html.theme--documenter-dark h4 .docs-heading-anchor:visited,html.theme--documenter-dark h5 .docs-heading-anchor,html.theme--documenter-dark h5 .docs-heading-anchor:hover,html.theme--documenter-dark h5 .docs-heading-anchor:visited,html.theme--documenter-dark h6 .docs-heading-anchor,html.theme--documenter-dark h6 .docs-heading-anchor:hover,html.theme--documenter-dark h6 .docs-heading-anchor:visited{color:#f2f2f2}html.theme--documenter-dark h1 .docs-heading-anchor-permalink,html.theme--documenter-dark h2 .docs-heading-anchor-permalink,html.theme--documenter-dark h3 .docs-heading-anchor-permalink,html.theme--documenter-dark h4 .docs-heading-anchor-permalink,html.theme--documenter-dark h5 .docs-heading-anchor-permalink,html.theme--documenter-dark h6 .docs-heading-anchor-permalink{visibility:hidden;vertical-align:middle;margin-left:0.5em;font-size:0.7rem}html.theme--documenter-dark h1 .docs-heading-anchor-permalink::before,html.theme--documenter-dark h2 .docs-heading-anchor-permalink::before,html.theme--documenter-dark h3 .docs-heading-anchor-permalink::before,html.theme--documenter-dark h4 .docs-heading-anchor-permalink::before,html.theme--documenter-dark h5 .docs-heading-anchor-permalink::before,html.theme--documenter-dark h6 .docs-heading-anchor-permalink::before{font-family:"Font Awesome 6 Free";font-weight:900;content:"\f0c1"}html.theme--documenter-dark h1:hover .docs-heading-anchor-permalink,html.theme--documenter-dark h2:hover .docs-heading-anchor-permalink,html.theme--documenter-dark h3:hover .docs-heading-anchor-permalink,html.theme--documenter-dark h4:hover .docs-heading-anchor-permalink,html.theme--documenter-dark h5:hover .docs-heading-anchor-permalink,html.theme--documenter-dark h6:hover .docs-heading-anchor-permalink{visibility:visible}html.theme--documenter-dark .docs-light-only{display:none !important}html.theme--documenter-dark pre{position:relative;overflow:hidden}html.theme--documenter-dark pre code,html.theme--documenter-dark pre code.hljs{padding:0 .75rem !important;overflow:auto;display:block}html.theme--documenter-dark pre code:first-of-type,html.theme--documenter-dark pre code.hljs:first-of-type{padding-top:0.5rem !important}html.theme--documenter-dark pre code:last-of-type,html.theme--documenter-dark pre code.hljs:last-of-type{padding-bottom:0.5rem !important}html.theme--documenter-dark pre .copy-button{opacity:0.2;transition:opacity 0.2s;position:absolute;right:0em;top:0em;padding:0.5em;width:2.5em;height:2.5em;background:transparent;border:none;font-family:"Font Awesome 6 Free";color:#fff;cursor:pointer;text-align:center}html.theme--documenter-dark pre .copy-button:focus,html.theme--documenter-dark pre .copy-button:hover{opacity:1;background:rgba(255,255,255,0.1);color:#1abc9c}html.theme--documenter-dark pre .copy-button.success{color:#259a12;opacity:1}html.theme--documenter-dark pre .copy-button.error{color:#cb3c33;opacity:1}html.theme--documenter-dark pre:hover .copy-button{opacity:1}html.theme--documenter-dark .admonition{background-color:#282f2f;border-style:solid;border-width:1px;border-color:#5e6d6f;border-radius:.4em;font-size:1rem}html.theme--documenter-dark .admonition strong{color:currentColor}html.theme--documenter-dark .admonition.is-small,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.admonition{font-size:.75rem}html.theme--documenter-dark .admonition.is-medium{font-size:1.25rem}html.theme--documenter-dark .admonition.is-large{font-size:1.5rem}html.theme--documenter-dark .admonition.is-default{background-color:#282f2f;border-color:#5e6d6f}html.theme--documenter-dark .admonition.is-default>.admonition-header{background-color:#5e6d6f;color:#fff}html.theme--documenter-dark .admonition.is-default>.admonition-body{color:#fff}html.theme--documenter-dark .admonition.is-info{background-color:#282f2f;border-color:#024c7d}html.theme--documenter-dark .admonition.is-info>.admonition-header{background-color:#024c7d;color:#fff}html.theme--documenter-dark .admonition.is-info>.admonition-body{color:#fff}html.theme--documenter-dark .admonition.is-success{background-color:#282f2f;border-color:#008438}html.theme--documenter-dark .admonition.is-success>.admonition-header{background-color:#008438;color:#fff}html.theme--documenter-dark .admonition.is-success>.admonition-body{color:#fff}html.theme--documenter-dark .admonition.is-warning{background-color:#282f2f;border-color:#ad8100}html.theme--documenter-dark .admonition.is-warning>.admonition-header{background-color:#ad8100;color:#fff}html.theme--documenter-dark .admonition.is-warning>.admonition-body{color:#fff}html.theme--documenter-dark .admonition.is-danger{background-color:#282f2f;border-color:#9e1b0d}html.theme--documenter-dark .admonition.is-danger>.admonition-header{background-color:#9e1b0d;color:#fff}html.theme--documenter-dark .admonition.is-danger>.admonition-body{color:#fff}html.theme--documenter-dark .admonition.is-compat{background-color:#282f2f;border-color:#137886}html.theme--documenter-dark .admonition.is-compat>.admonition-header{background-color:#137886;color:#fff}html.theme--documenter-dark .admonition.is-compat>.admonition-body{color:#fff}html.theme--documenter-dark .admonition-header{color:#fff;background-color:#5e6d6f;align-items:center;font-weight:700;justify-content:space-between;line-height:1.25;padding:0.5rem .75rem;position:relative}html.theme--documenter-dark .admonition-header:before{font-family:"Font Awesome 6 Free";font-weight:900;margin-right:.75rem;content:"\f06a"}html.theme--documenter-dark details.admonition.is-details>.admonition-header{list-style:none}html.theme--documenter-dark details.admonition.is-details>.admonition-header:before{font-family:"Font Awesome 6 Free";font-weight:900;content:"\f055"}html.theme--documenter-dark details.admonition.is-details[open]>.admonition-header:before{font-family:"Font Awesome 6 Free";font-weight:900;content:"\f056"}html.theme--documenter-dark .admonition-body{color:#fff;padding:0.5rem .75rem}html.theme--documenter-dark .admonition-body pre{background-color:#282f2f}html.theme--documenter-dark .admonition-body code{background-color:rgba(255,255,255,0.05)}html.theme--documenter-dark .docstring{margin-bottom:1em;background-color:rgba(0,0,0,0);border:1px solid #5e6d6f;box-shadow:none;max-width:100%}html.theme--documenter-dark .docstring>header{cursor:pointer;display:flex;flex-grow:1;align-items:stretch;padding:0.5rem .75rem;background-color:#282f2f;box-shadow:0 0.125em 0.25em rgba(10,10,10,0.1);box-shadow:none;border-bottom:1px solid #5e6d6f;overflow:auto}html.theme--documenter-dark .docstring>header code{background-color:transparent}html.theme--documenter-dark .docstring>header .docstring-article-toggle-button{min-width:1.1rem;padding:0.2rem 0.2rem 0.2rem 0}html.theme--documenter-dark .docstring>header .docstring-binding{margin-right:0.3em}html.theme--documenter-dark .docstring>header .docstring-category{margin-left:0.3em}html.theme--documenter-dark .docstring>section{position:relative;padding:.75rem .75rem;border-bottom:1px solid #5e6d6f}html.theme--documenter-dark .docstring>section:last-child{border-bottom:none}html.theme--documenter-dark .docstring>section>a.docs-sourcelink{transition:opacity 0.3s;opacity:0;position:absolute;right:.375rem;bottom:.375rem}html.theme--documenter-dark .docstring>section>a.docs-sourcelink:focus{opacity:1 !important}html.theme--documenter-dark .docstring:hover>section>a.docs-sourcelink{opacity:0.2}html.theme--documenter-dark .docstring:focus-within>section>a.docs-sourcelink{opacity:0.2}html.theme--documenter-dark .docstring>section:hover a.docs-sourcelink{opacity:1}html.theme--documenter-dark .documenter-example-output{background-color:#1f2424}html.theme--documenter-dark .outdated-warning-overlay{position:fixed;top:0;left:0;right:0;box-shadow:0 0 10px rgba(0,0,0,0.3);z-index:999;background-color:#282f2f;color:#fff;border-bottom:3px solid #9e1b0d;padding:10px 35px;text-align:center;font-size:15px}html.theme--documenter-dark .outdated-warning-overlay .outdated-warning-closer{position:absolute;top:calc(50% - 10px);right:18px;cursor:pointer;width:12px}html.theme--documenter-dark .outdated-warning-overlay a{color:#1abc9c}html.theme--documenter-dark .outdated-warning-overlay a:hover{color:#1dd2af}html.theme--documenter-dark .content pre{border:1px solid #5e6d6f}html.theme--documenter-dark .content code{font-weight:inherit}html.theme--documenter-dark .content a code{color:#1abc9c}html.theme--documenter-dark .content h1 code,html.theme--documenter-dark .content h2 code,html.theme--documenter-dark .content h3 code,html.theme--documenter-dark .content h4 code,html.theme--documenter-dark .content h5 code,html.theme--documenter-dark .content h6 code{color:#f2f2f2}html.theme--documenter-dark .content table{display:block;width:initial;max-width:100%;overflow-x:auto}html.theme--documenter-dark .content blockquote>ul:first-child,html.theme--documenter-dark .content blockquote>ol:first-child,html.theme--documenter-dark .content .admonition-body>ul:first-child,html.theme--documenter-dark .content .admonition-body>ol:first-child{margin-top:0}html.theme--documenter-dark pre,html.theme--documenter-dark code{font-variant-ligatures:no-contextual}html.theme--documenter-dark .breadcrumb a.is-disabled{cursor:default;pointer-events:none}html.theme--documenter-dark .breadcrumb a.is-disabled,html.theme--documenter-dark .breadcrumb a.is-disabled:hover{color:#f2f2f2}html.theme--documenter-dark .hljs{background:initial !important}html.theme--documenter-dark .katex .katex-mathml{top:0;right:0}html.theme--documenter-dark .katex-display,html.theme--documenter-dark mjx-container,html.theme--documenter-dark .MathJax_Display{margin:0.5em 0 !important}html.theme--documenter-dark html{-moz-osx-font-smoothing:auto;-webkit-font-smoothing:auto}html.theme--documenter-dark li.no-marker{list-style:none}html.theme--documenter-dark #documenter .docs-main>article{overflow-wrap:break-word}html.theme--documenter-dark #documenter .docs-main>article .math-container{overflow-x:auto;overflow-y:hidden}@media screen and (min-width: 1056px){html.theme--documenter-dark #documenter .docs-main{max-width:52rem;margin-left:20rem;padding-right:1rem}}@media screen and (max-width: 1055px){html.theme--documenter-dark #documenter .docs-main{width:100%}html.theme--documenter-dark #documenter .docs-main>article{max-width:52rem;margin-left:auto;margin-right:auto;margin-bottom:1rem;padding:0 1rem}html.theme--documenter-dark #documenter .docs-main>header,html.theme--documenter-dark #documenter .docs-main>nav{max-width:100%;width:100%;margin:0}}html.theme--documenter-dark #documenter .docs-main header.docs-navbar{background-color:#1f2424;border-bottom:1px solid #5e6d6f;z-index:2;min-height:4rem;margin-bottom:1rem;display:flex}html.theme--documenter-dark #documenter .docs-main header.docs-navbar .breadcrumb{flex-grow:1;overflow-x:hidden}html.theme--documenter-dark #documenter .docs-main header.docs-navbar .docs-sidebar-button{display:block;font-size:1.5rem;padding-bottom:0.1rem;margin-right:1rem}html.theme--documenter-dark #documenter .docs-main header.docs-navbar .docs-right{display:flex;white-space:nowrap;gap:1rem;align-items:center}html.theme--documenter-dark #documenter .docs-main header.docs-navbar .docs-right .docs-icon,html.theme--documenter-dark #documenter .docs-main header.docs-navbar .docs-right .docs-label{display:inline-block}html.theme--documenter-dark #documenter .docs-main header.docs-navbar .docs-right .docs-label{padding:0;margin-left:0.3em}@media screen and (max-width: 1055px){html.theme--documenter-dark #documenter .docs-main header.docs-navbar .docs-right .docs-navbar-link{margin-left:0.4rem;margin-right:0.4rem}}html.theme--documenter-dark #documenter .docs-main header.docs-navbar>*{margin:auto 0}@media screen and (max-width: 1055px){html.theme--documenter-dark #documenter .docs-main header.docs-navbar{position:sticky;top:0;padding:0 1rem;transition-property:top, box-shadow;-webkit-transition-property:top, box-shadow;transition-duration:0.3s;-webkit-transition-duration:0.3s}html.theme--documenter-dark #documenter .docs-main header.docs-navbar.headroom--not-top{box-shadow:.2rem 0rem .4rem #171717;transition-duration:0.7s;-webkit-transition-duration:0.7s}html.theme--documenter-dark #documenter .docs-main header.docs-navbar.headroom--unpinned.headroom--not-top.headroom--not-bottom{top:-4.5rem;transition-duration:0.7s;-webkit-transition-duration:0.7s}}html.theme--documenter-dark #documenter .docs-main section.footnotes{border-top:1px solid #5e6d6f}html.theme--documenter-dark #documenter .docs-main section.footnotes li .tag:first-child,html.theme--documenter-dark #documenter .docs-main section.footnotes li .docstring>section>a.docs-sourcelink:first-child,html.theme--documenter-dark #documenter .docs-main section.footnotes li .content kbd:first-child,html.theme--documenter-dark .content #documenter .docs-main section.footnotes li kbd:first-child{margin-right:1em;margin-bottom:0.4em}html.theme--documenter-dark #documenter .docs-main .docs-footer{display:flex;flex-wrap:wrap;margin-left:0;margin-right:0;border-top:1px solid #5e6d6f;padding-top:1rem;padding-bottom:1rem}@media screen and (max-width: 1055px){html.theme--documenter-dark #documenter .docs-main .docs-footer{padding-left:1rem;padding-right:1rem}}html.theme--documenter-dark #documenter .docs-main .docs-footer .docs-footer-nextpage,html.theme--documenter-dark #documenter .docs-main .docs-footer .docs-footer-prevpage{flex-grow:1}html.theme--documenter-dark #documenter .docs-main .docs-footer .docs-footer-nextpage{text-align:right}html.theme--documenter-dark #documenter .docs-main .docs-footer .flexbox-break{flex-basis:100%;height:0}html.theme--documenter-dark #documenter .docs-main .docs-footer .footer-message{font-size:0.8em;margin:0.5em auto 0 auto;text-align:center}html.theme--documenter-dark #documenter .docs-sidebar{display:flex;flex-direction:column;color:#fff;background-color:#282f2f;border-right:1px solid #5e6d6f;padding:0;flex:0 0 18rem;z-index:5;font-size:1rem;position:fixed;left:-18rem;width:18rem;height:100%;transition:left 0.3s}html.theme--documenter-dark #documenter .docs-sidebar.visible{left:0;box-shadow:.4rem 0rem .8rem #171717}@media screen and (min-width: 1056px){html.theme--documenter-dark #documenter .docs-sidebar.visible{box-shadow:none}}@media screen and (min-width: 1056px){html.theme--documenter-dark #documenter .docs-sidebar{left:0;top:0}}html.theme--documenter-dark #documenter .docs-sidebar .docs-logo{margin-top:1rem;padding:0 1rem}html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img{max-height:6rem;margin:auto}html.theme--documenter-dark #documenter .docs-sidebar .docs-package-name{flex-shrink:0;font-size:1.5rem;font-weight:700;text-align:center;white-space:nowrap;overflow:hidden;padding:0.5rem 0}html.theme--documenter-dark #documenter .docs-sidebar .docs-package-name .docs-autofit{max-width:16.2rem}html.theme--documenter-dark #documenter .docs-sidebar .docs-package-name a,html.theme--documenter-dark #documenter .docs-sidebar .docs-package-name a:hover{color:#fff}html.theme--documenter-dark #documenter .docs-sidebar .docs-version-selector{border-top:1px solid #5e6d6f;display:none;padding:0.5rem}html.theme--documenter-dark #documenter .docs-sidebar .docs-version-selector.visible{display:flex}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu{flex-grow:1;user-select:none;border-top:1px solid #5e6d6f;padding-bottom:1.5rem}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu>li>.tocitem{font-weight:bold}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu>li li{font-size:.95rem;margin-left:1em;border-left:1px solid #5e6d6f}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu input.collapse-toggle{display:none}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu ul.collapsed{display:none}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu input:checked~ul.collapsed{display:block}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu label.tocitem{display:flex}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu label.tocitem .docs-label{flex-grow:2}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu label.tocitem .docs-chevron{display:inline-block;font-style:normal;font-variant:normal;text-rendering:auto;line-height:1;font-size:.75rem;margin-left:1rem;margin-top:auto;margin-bottom:auto}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu label.tocitem .docs-chevron::before{font-family:"Font Awesome 6 Free";font-weight:900;content:"\f054"}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu input:checked~label.tocitem .docs-chevron::before{content:"\f078"}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu .tocitem{display:block;padding:0.5rem 0.5rem}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu .tocitem,html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu .tocitem:hover{color:#fff;background:#282f2f}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu a.tocitem:hover,html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu label.tocitem:hover{color:#fff;background-color:#32393a}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu li.is-active{border-top:1px solid #5e6d6f;border-bottom:1px solid #5e6d6f;background-color:#1f2424}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu li.is-active .tocitem,html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu li.is-active .tocitem:hover{background-color:#1f2424;color:#fff}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu li.is-active ul.internal .tocitem:hover{background-color:#32393a;color:#fff}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu>li.is-active:first-child{border-top:none}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu ul.internal{margin:0 0.5rem 0.5rem;border-top:1px solid #5e6d6f}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu ul.internal li{font-size:.85rem;border-left:none;margin-left:0;margin-top:0.5rem}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu ul.internal .tocitem{width:100%;padding:0}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu ul.internal .tocitem::before{content:"⚬";margin-right:0.4em}html.theme--documenter-dark #documenter .docs-sidebar form.docs-search{margin:auto;margin-top:0.5rem;margin-bottom:0.5rem}html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input{width:14.4rem}html.theme--documenter-dark #documenter .docs-sidebar #documenter-search-query{color:#868c98;width:14.4rem;box-shadow:inset 0 1px 2px rgba(10,10,10,0.1)}@media screen and (min-width: 1056px){html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu{overflow-y:auto;-webkit-overflow-scroll:touch}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu::-webkit-scrollbar{width:.3rem;background:none}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu::-webkit-scrollbar-thumb{border-radius:5px 0px 0px 5px;background:#3b4445}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu::-webkit-scrollbar-thumb:hover{background:#4e5a5c}}@media screen and (max-width: 1055px){html.theme--documenter-dark #documenter .docs-sidebar{overflow-y:auto;-webkit-overflow-scroll:touch}html.theme--documenter-dark #documenter .docs-sidebar::-webkit-scrollbar{width:.3rem;background:none}html.theme--documenter-dark #documenter .docs-sidebar::-webkit-scrollbar-thumb{border-radius:5px 0px 0px 5px;background:#3b4445}html.theme--documenter-dark #documenter .docs-sidebar::-webkit-scrollbar-thumb:hover{background:#4e5a5c}}html.theme--documenter-dark kbd.search-modal-key-hints{border-radius:0.25rem;border:1px solid rgba(245,245,245,0.6);box-shadow:0 2px 0 1px rgba(245,245,245,0.6);cursor:default;font-size:0.9rem;line-height:1.5;min-width:0.75rem;text-align:center;padding:0.1rem 0.3rem;position:relative;top:-1px}html.theme--documenter-dark .search-min-width-50{min-width:50%}html.theme--documenter-dark .search-min-height-100{min-height:100%}html.theme--documenter-dark .search-modal-card-body{max-height:calc(100vh - 15rem)}html.theme--documenter-dark .search-result-link{border-radius:0.7em;transition:all 300ms}html.theme--documenter-dark .search-result-link:hover,html.theme--documenter-dark .search-result-link:focus{background-color:rgba(0,128,128,0.1)}html.theme--documenter-dark .search-result-link .property-search-result-badge,html.theme--documenter-dark .search-result-link .search-filter{transition:all 300ms}html.theme--documenter-dark .property-search-result-badge,html.theme--documenter-dark .search-filter{padding:0.15em 0.5em;font-size:0.8em;font-style:italic;text-transform:none !important;line-height:1.5;color:#f5f5f5;background-color:rgba(51,65,85,0.501961);border-radius:0.6rem}html.theme--documenter-dark .search-result-link:hover .property-search-result-badge,html.theme--documenter-dark .search-result-link:hover .search-filter,html.theme--documenter-dark .search-result-link:focus .property-search-result-badge,html.theme--documenter-dark .search-result-link:focus .search-filter{color:#333;background-color:#f1f5f9}html.theme--documenter-dark .search-filter{color:#333;background-color:#f5f5f5;transition:all 300ms}html.theme--documenter-dark .search-filter:hover,html.theme--documenter-dark .search-filter:focus{color:#333}html.theme--documenter-dark .search-filter-selected{color:#f5f5f5;background-color:rgba(139,0,139,0.5)}html.theme--documenter-dark .search-filter-selected:hover,html.theme--documenter-dark .search-filter-selected:focus{color:#f5f5f5}html.theme--documenter-dark .search-result-highlight{background-color:#ffdd57;color:black}html.theme--documenter-dark .search-divider{border-bottom:1px solid #5e6d6f}html.theme--documenter-dark .search-result-title{width:85%;color:#f5f5f5}html.theme--documenter-dark .search-result-code-title{font-size:0.875rem;font-family:"JuliaMono","SFMono-Regular","Menlo","Consolas","Liberation Mono","DejaVu Sans Mono",monospace}html.theme--documenter-dark #search-modal .modal-card-body::-webkit-scrollbar,html.theme--documenter-dark #search-modal .filter-tabs::-webkit-scrollbar{height:10px;width:10px;background-color:transparent}html.theme--documenter-dark #search-modal .modal-card-body::-webkit-scrollbar-thumb,html.theme--documenter-dark #search-modal .filter-tabs::-webkit-scrollbar-thumb{background-color:gray;border-radius:1rem}html.theme--documenter-dark #search-modal .modal-card-body::-webkit-scrollbar-track,html.theme--documenter-dark #search-modal .filter-tabs::-webkit-scrollbar-track{-webkit-box-shadow:inset 0 0 6px rgba(0,0,0,0.6);background-color:transparent}html.theme--documenter-dark .w-100{width:100%}html.theme--documenter-dark .gap-2{gap:0.5rem}html.theme--documenter-dark .gap-4{gap:1rem}html.theme--documenter-dark .gap-8{gap:2rem}html.theme--documenter-dark{background-color:#1f2424;font-size:16px;min-width:300px;overflow-x:auto;overflow-y:scroll;text-rendering:optimizeLegibility;text-size-adjust:100%}html.theme--documenter-dark .ansi span.sgr1{font-weight:bolder}html.theme--documenter-dark .ansi span.sgr2{font-weight:lighter}html.theme--documenter-dark .ansi span.sgr3{font-style:italic}html.theme--documenter-dark .ansi span.sgr4{text-decoration:underline}html.theme--documenter-dark .ansi span.sgr7{color:#1f2424;background-color:#fff}html.theme--documenter-dark .ansi span.sgr8{color:transparent}html.theme--documenter-dark .ansi span.sgr8 span{color:transparent}html.theme--documenter-dark .ansi span.sgr9{text-decoration:line-through}html.theme--documenter-dark .ansi span.sgr30{color:#242424}html.theme--documenter-dark .ansi span.sgr31{color:#f6705f}html.theme--documenter-dark .ansi span.sgr32{color:#4fb43a}html.theme--documenter-dark .ansi span.sgr33{color:#f4c72f}html.theme--documenter-dark .ansi span.sgr34{color:#7587f0}html.theme--documenter-dark .ansi span.sgr35{color:#bc89d3}html.theme--documenter-dark .ansi span.sgr36{color:#49b6ca}html.theme--documenter-dark .ansi span.sgr37{color:#b3bdbe}html.theme--documenter-dark .ansi span.sgr40{background-color:#242424}html.theme--documenter-dark .ansi span.sgr41{background-color:#f6705f}html.theme--documenter-dark .ansi span.sgr42{background-color:#4fb43a}html.theme--documenter-dark .ansi span.sgr43{background-color:#f4c72f}html.theme--documenter-dark .ansi span.sgr44{background-color:#7587f0}html.theme--documenter-dark .ansi span.sgr45{background-color:#bc89d3}html.theme--documenter-dark .ansi span.sgr46{background-color:#49b6ca}html.theme--documenter-dark .ansi span.sgr47{background-color:#b3bdbe}html.theme--documenter-dark .ansi span.sgr90{color:#92a0a2}html.theme--documenter-dark .ansi span.sgr91{color:#ff8674}html.theme--documenter-dark .ansi span.sgr92{color:#79d462}html.theme--documenter-dark .ansi span.sgr93{color:#ffe76b}html.theme--documenter-dark .ansi span.sgr94{color:#8a98ff}html.theme--documenter-dark .ansi span.sgr95{color:#d2a4e6}html.theme--documenter-dark .ansi span.sgr96{color:#6bc8db}html.theme--documenter-dark .ansi span.sgr97{color:#ecf0f1}html.theme--documenter-dark .ansi span.sgr100{background-color:#92a0a2}html.theme--documenter-dark .ansi span.sgr101{background-color:#ff8674}html.theme--documenter-dark .ansi span.sgr102{background-color:#79d462}html.theme--documenter-dark .ansi span.sgr103{background-color:#ffe76b}html.theme--documenter-dark .ansi span.sgr104{background-color:#8a98ff}html.theme--documenter-dark .ansi span.sgr105{background-color:#d2a4e6}html.theme--documenter-dark .ansi span.sgr106{background-color:#6bc8db}html.theme--documenter-dark .ansi span.sgr107{background-color:#ecf0f1}html.theme--documenter-dark code.language-julia-repl>span.hljs-meta{color:#4fb43a;font-weight:bolder}html.theme--documenter-dark .hljs{background:#2b2b2b;color:#f8f8f2}html.theme--documenter-dark .hljs-comment,html.theme--documenter-dark .hljs-quote{color:#d4d0ab}html.theme--documenter-dark .hljs-variable,html.theme--documenter-dark .hljs-template-variable,html.theme--documenter-dark .hljs-tag,html.theme--documenter-dark .hljs-name,html.theme--documenter-dark .hljs-selector-id,html.theme--documenter-dark .hljs-selector-class,html.theme--documenter-dark .hljs-regexp,html.theme--documenter-dark .hljs-deletion{color:#ffa07a}html.theme--documenter-dark .hljs-number,html.theme--documenter-dark .hljs-built_in,html.theme--documenter-dark .hljs-literal,html.theme--documenter-dark .hljs-type,html.theme--documenter-dark .hljs-params,html.theme--documenter-dark .hljs-meta,html.theme--documenter-dark .hljs-link{color:#f5ab35}html.theme--documenter-dark .hljs-attribute{color:#ffd700}html.theme--documenter-dark .hljs-string,html.theme--documenter-dark .hljs-symbol,html.theme--documenter-dark .hljs-bullet,html.theme--documenter-dark .hljs-addition{color:#abe338}html.theme--documenter-dark .hljs-title,html.theme--documenter-dark .hljs-section{color:#00e0e0}html.theme--documenter-dark .hljs-keyword,html.theme--documenter-dark .hljs-selector-tag{color:#dcc6e0}html.theme--documenter-dark .hljs-emphasis{font-style:italic}html.theme--documenter-dark .hljs-strong{font-weight:bold}@media screen and (-ms-high-contrast: active){html.theme--documenter-dark .hljs-addition,html.theme--documenter-dark .hljs-attribute,html.theme--documenter-dark .hljs-built_in,html.theme--documenter-dark .hljs-bullet,html.theme--documenter-dark .hljs-comment,html.theme--documenter-dark .hljs-link,html.theme--documenter-dark .hljs-literal,html.theme--documenter-dark .hljs-meta,html.theme--documenter-dark .hljs-number,html.theme--documenter-dark .hljs-params,html.theme--documenter-dark .hljs-string,html.theme--documenter-dark .hljs-symbol,html.theme--documenter-dark .hljs-type,html.theme--documenter-dark .hljs-quote{color:highlight}html.theme--documenter-dark .hljs-keyword,html.theme--documenter-dark .hljs-selector-tag{font-weight:bold}}html.theme--documenter-dark .hljs-subst{color:#f8f8f2}html.theme--documenter-dark .search-result-link{border-radius:0.7em;transition:all 300ms}html.theme--documenter-dark .search-result-link:hover,html.theme--documenter-dark .search-result-link:focus{background-color:rgba(0,128,128,0.1)}html.theme--documenter-dark .search-result-link .property-search-result-badge,html.theme--documenter-dark .search-result-link .search-filter{transition:all 300ms}html.theme--documenter-dark .search-result-link:hover .property-search-result-badge,html.theme--documenter-dark .search-result-link:hover .search-filter,html.theme--documenter-dark .search-result-link:focus .property-search-result-badge,html.theme--documenter-dark .search-result-link:focus .search-filter{color:#333 !important;background-color:#f1f5f9 !important}html.theme--documenter-dark .search-result-title{color:whitesmoke}html.theme--documenter-dark .search-result-highlight{background-color:greenyellow;color:black}html.theme--documenter-dark .search-divider{border-bottom:1px solid #5e6d6f50}html.theme--documenter-dark .w-100{width:100%}html.theme--documenter-dark .gap-2{gap:0.5rem}html.theme--documenter-dark .gap-4{gap:1rem} diff --git a/v1.7.4/assets/themes/documenter-light.css b/v1.7.4/assets/themes/documenter-light.css new file mode 100644 index 000000000..2f168c77b --- /dev/null +++ b/v1.7.4/assets/themes/documenter-light.css @@ -0,0 +1,9 @@ +.pagination-previous,.pagination-next,.pagination-link,.pagination-ellipsis,.file-cta,.file-name,.select select,.textarea,.input,#documenter .docs-sidebar form.docs-search>input,.button{-moz-appearance:none;-webkit-appearance:none;align-items:center;border:1px solid transparent;border-radius:4px;box-shadow:none;display:inline-flex;font-size:1rem;height:2.5em;justify-content:flex-start;line-height:1.5;padding-bottom:calc(0.5em - 1px);padding-left:calc(0.75em - 1px);padding-right:calc(0.75em - 1px);padding-top:calc(0.5em - 1px);position:relative;vertical-align:top}.pagination-previous:focus,.pagination-next:focus,.pagination-link:focus,.pagination-ellipsis:focus,.file-cta:focus,.file-name:focus,.select select:focus,.textarea:focus,.input:focus,#documenter .docs-sidebar form.docs-search>input:focus,.button:focus,.is-focused.pagination-previous,.is-focused.pagination-next,.is-focused.pagination-link,.is-focused.pagination-ellipsis,.is-focused.file-cta,.is-focused.file-name,.select select.is-focused,.is-focused.textarea,.is-focused.input,#documenter .docs-sidebar form.docs-search>input.is-focused,.is-focused.button,.pagination-previous:active,.pagination-next:active,.pagination-link:active,.pagination-ellipsis:active,.file-cta:active,.file-name:active,.select select:active,.textarea:active,.input:active,#documenter .docs-sidebar form.docs-search>input:active,.button:active,.is-active.pagination-previous,.is-active.pagination-next,.is-active.pagination-link,.is-active.pagination-ellipsis,.is-active.file-cta,.is-active.file-name,.select select.is-active,.is-active.textarea,.is-active.input,#documenter .docs-sidebar form.docs-search>input.is-active,.is-active.button{outline:none}.pagination-previous[disabled],.pagination-next[disabled],.pagination-link[disabled],.pagination-ellipsis[disabled],.file-cta[disabled],.file-name[disabled],.select select[disabled],.textarea[disabled],.input[disabled],#documenter .docs-sidebar form.docs-search>input[disabled],.button[disabled],fieldset[disabled] .pagination-previous,fieldset[disabled] .pagination-next,fieldset[disabled] .pagination-link,fieldset[disabled] .pagination-ellipsis,fieldset[disabled] .file-cta,fieldset[disabled] .file-name,fieldset[disabled] .select select,.select fieldset[disabled] select,fieldset[disabled] .textarea,fieldset[disabled] .input,fieldset[disabled] #documenter .docs-sidebar form.docs-search>input,#documenter .docs-sidebar fieldset[disabled] form.docs-search>input,fieldset[disabled] .button{cursor:not-allowed}.tabs,.pagination-previous,.pagination-next,.pagination-link,.pagination-ellipsis,.breadcrumb,.file,.button,.is-unselectable{-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.navbar-link:not(.is-arrowless)::after,.select:not(.is-multiple):not(.is-loading)::after{border:3px solid rgba(0,0,0,0);border-radius:2px;border-right:0;border-top:0;content:" ";display:block;height:0.625em;margin-top:-0.4375em;pointer-events:none;position:absolute;top:50%;transform:rotate(-45deg);transform-origin:center;width:0.625em}.admonition:not(:last-child),.tabs:not(:last-child),.pagination:not(:last-child),.message:not(:last-child),.level:not(:last-child),.breadcrumb:not(:last-child),.block:not(:last-child),.title:not(:last-child),.subtitle:not(:last-child),.table-container:not(:last-child),.table:not(:last-child),.progress:not(:last-child),.notification:not(:last-child),.content:not(:last-child),.box:not(:last-child){margin-bottom:1.5rem}.modal-close,.delete{-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-moz-appearance:none;-webkit-appearance:none;background-color:rgba(10,10,10,0.2);border:none;border-radius:9999px;cursor:pointer;pointer-events:auto;display:inline-block;flex-grow:0;flex-shrink:0;font-size:0;height:20px;max-height:20px;max-width:20px;min-height:20px;min-width:20px;outline:none;position:relative;vertical-align:top;width:20px}.modal-close::before,.delete::before,.modal-close::after,.delete::after{background-color:#fff;content:"";display:block;left:50%;position:absolute;top:50%;transform:translateX(-50%) translateY(-50%) rotate(45deg);transform-origin:center center}.modal-close::before,.delete::before{height:2px;width:50%}.modal-close::after,.delete::after{height:50%;width:2px}.modal-close:hover,.delete:hover,.modal-close:focus,.delete:focus{background-color:rgba(10,10,10,0.3)}.modal-close:active,.delete:active{background-color:rgba(10,10,10,0.4)}.is-small.modal-close,#documenter .docs-sidebar form.docs-search>input.modal-close,.is-small.delete,#documenter .docs-sidebar form.docs-search>input.delete{height:16px;max-height:16px;max-width:16px;min-height:16px;min-width:16px;width:16px}.is-medium.modal-close,.is-medium.delete{height:24px;max-height:24px;max-width:24px;min-height:24px;min-width:24px;width:24px}.is-large.modal-close,.is-large.delete{height:32px;max-height:32px;max-width:32px;min-height:32px;min-width:32px;width:32px}.control.is-loading::after,.select.is-loading::after,.loader,.button.is-loading::after{animation:spinAround 500ms infinite linear;border:2px solid #dbdbdb;border-radius:9999px;border-right-color:transparent;border-top-color:transparent;content:"";display:block;height:1em;position:relative;width:1em}.hero-video,.modal-background,.modal,.image.is-square img,#documenter .docs-sidebar .docs-logo>img.is-square img,.image.is-square .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-square .has-ratio,.image.is-1by1 img,#documenter .docs-sidebar .docs-logo>img.is-1by1 img,.image.is-1by1 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-1by1 .has-ratio,.image.is-5by4 img,#documenter .docs-sidebar .docs-logo>img.is-5by4 img,.image.is-5by4 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-5by4 .has-ratio,.image.is-4by3 img,#documenter .docs-sidebar .docs-logo>img.is-4by3 img,.image.is-4by3 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-4by3 .has-ratio,.image.is-3by2 img,#documenter .docs-sidebar .docs-logo>img.is-3by2 img,.image.is-3by2 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-3by2 .has-ratio,.image.is-5by3 img,#documenter .docs-sidebar .docs-logo>img.is-5by3 img,.image.is-5by3 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-5by3 .has-ratio,.image.is-16by9 img,#documenter .docs-sidebar .docs-logo>img.is-16by9 img,.image.is-16by9 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-16by9 .has-ratio,.image.is-2by1 img,#documenter .docs-sidebar .docs-logo>img.is-2by1 img,.image.is-2by1 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-2by1 .has-ratio,.image.is-3by1 img,#documenter .docs-sidebar .docs-logo>img.is-3by1 img,.image.is-3by1 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-3by1 .has-ratio,.image.is-4by5 img,#documenter .docs-sidebar .docs-logo>img.is-4by5 img,.image.is-4by5 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-4by5 .has-ratio,.image.is-3by4 img,#documenter .docs-sidebar .docs-logo>img.is-3by4 img,.image.is-3by4 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-3by4 .has-ratio,.image.is-2by3 img,#documenter .docs-sidebar .docs-logo>img.is-2by3 img,.image.is-2by3 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-2by3 .has-ratio,.image.is-3by5 img,#documenter .docs-sidebar .docs-logo>img.is-3by5 img,.image.is-3by5 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-3by5 .has-ratio,.image.is-9by16 img,#documenter .docs-sidebar .docs-logo>img.is-9by16 img,.image.is-9by16 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-9by16 .has-ratio,.image.is-1by2 img,#documenter .docs-sidebar .docs-logo>img.is-1by2 img,.image.is-1by2 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-1by2 .has-ratio,.image.is-1by3 img,#documenter .docs-sidebar .docs-logo>img.is-1by3 img,.image.is-1by3 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-1by3 .has-ratio,.is-overlay{bottom:0;left:0;position:absolute;right:0;top:0}.navbar-burger{-moz-appearance:none;-webkit-appearance:none;appearance:none;background:none;border:none;color:currentColor;font-family:inherit;font-size:1em;margin:0;padding:0}.has-text-white{color:#fff !important}a.has-text-white:hover,a.has-text-white:focus{color:#e6e6e6 !important}.has-background-white{background-color:#fff !important}.has-text-black{color:#0a0a0a !important}a.has-text-black:hover,a.has-text-black:focus{color:#000 !important}.has-background-black{background-color:#0a0a0a !important}.has-text-light{color:#f5f5f5 !important}a.has-text-light:hover,a.has-text-light:focus{color:#dbdbdb !important}.has-background-light{background-color:#f5f5f5 !important}.has-text-dark{color:#363636 !important}a.has-text-dark:hover,a.has-text-dark:focus{color:#1c1c1c !important}.has-background-dark{background-color:#363636 !important}.has-text-primary{color:#4eb5de !important}a.has-text-primary:hover,a.has-text-primary:focus{color:#27a1d2 !important}.has-background-primary{background-color:#4eb5de !important}.has-text-primary-light{color:#eef8fc !important}a.has-text-primary-light:hover,a.has-text-primary-light:focus{color:#c3e6f4 !important}.has-background-primary-light{background-color:#eef8fc !important}.has-text-primary-dark{color:#1a6d8e !important}a.has-text-primary-dark:hover,a.has-text-primary-dark:focus{color:#228eb9 !important}.has-background-primary-dark{background-color:#1a6d8e !important}.has-text-link{color:#2e63b8 !important}a.has-text-link:hover,a.has-text-link:focus{color:#244d8f !important}.has-background-link{background-color:#2e63b8 !important}.has-text-link-light{color:#eff3fb !important}a.has-text-link-light:hover,a.has-text-link-light:focus{color:#c6d6f1 !important}.has-background-link-light{background-color:#eff3fb !important}.has-text-link-dark{color:#3169c4 !important}a.has-text-link-dark:hover,a.has-text-link-dark:focus{color:#5485d4 !important}.has-background-link-dark{background-color:#3169c4 !important}.has-text-info{color:#209cee !important}a.has-text-info:hover,a.has-text-info:focus{color:#1081cb !important}.has-background-info{background-color:#209cee !important}.has-text-info-light{color:#ecf7fe !important}a.has-text-info-light:hover,a.has-text-info-light:focus{color:#bde2fa !important}.has-background-info-light{background-color:#ecf7fe !important}.has-text-info-dark{color:#0e72b4 !important}a.has-text-info-dark:hover,a.has-text-info-dark:focus{color:#1190e3 !important}.has-background-info-dark{background-color:#0e72b4 !important}.has-text-success{color:#22c35b !important}a.has-text-success:hover,a.has-text-success:focus{color:#1a9847 !important}.has-background-success{background-color:#22c35b !important}.has-text-success-light{color:#eefcf3 !important}a.has-text-success-light:hover,a.has-text-success-light:focus{color:#c2f4d4 !important}.has-background-success-light{background-color:#eefcf3 !important}.has-text-success-dark{color:#198f43 !important}a.has-text-success-dark:hover,a.has-text-success-dark:focus{color:#21bb57 !important}.has-background-success-dark{background-color:#198f43 !important}.has-text-warning{color:#ffdd57 !important}a.has-text-warning:hover,a.has-text-warning:focus{color:#ffd324 !important}.has-background-warning{background-color:#ffdd57 !important}.has-text-warning-light{color:#fffbeb !important}a.has-text-warning-light:hover,a.has-text-warning-light:focus{color:#fff1b8 !important}.has-background-warning-light{background-color:#fffbeb !important}.has-text-warning-dark{color:#947600 !important}a.has-text-warning-dark:hover,a.has-text-warning-dark:focus{color:#c79f00 !important}.has-background-warning-dark{background-color:#947600 !important}.has-text-danger{color:#da0b00 !important}a.has-text-danger:hover,a.has-text-danger:focus{color:#a70800 !important}.has-background-danger{background-color:#da0b00 !important}.has-text-danger-light{color:#ffeceb !important}a.has-text-danger-light:hover,a.has-text-danger-light:focus{color:#ffbbb8 !important}.has-background-danger-light{background-color:#ffeceb !important}.has-text-danger-dark{color:#f50c00 !important}a.has-text-danger-dark:hover,a.has-text-danger-dark:focus{color:#ff3429 !important}.has-background-danger-dark{background-color:#f50c00 !important}.has-text-black-bis{color:#121212 !important}.has-background-black-bis{background-color:#121212 !important}.has-text-black-ter{color:#242424 !important}.has-background-black-ter{background-color:#242424 !important}.has-text-grey-darker{color:#363636 !important}.has-background-grey-darker{background-color:#363636 !important}.has-text-grey-dark{color:#4a4a4a !important}.has-background-grey-dark{background-color:#4a4a4a !important}.has-text-grey{color:#6b6b6b !important}.has-background-grey{background-color:#6b6b6b !important}.has-text-grey-light{color:#b5b5b5 !important}.has-background-grey-light{background-color:#b5b5b5 !important}.has-text-grey-lighter{color:#dbdbdb !important}.has-background-grey-lighter{background-color:#dbdbdb !important}.has-text-white-ter{color:#f5f5f5 !important}.has-background-white-ter{background-color:#f5f5f5 !important}.has-text-white-bis{color:#fafafa !important}.has-background-white-bis{background-color:#fafafa !important}.is-flex-direction-row{flex-direction:row !important}.is-flex-direction-row-reverse{flex-direction:row-reverse !important}.is-flex-direction-column{flex-direction:column !important}.is-flex-direction-column-reverse{flex-direction:column-reverse !important}.is-flex-wrap-nowrap{flex-wrap:nowrap !important}.is-flex-wrap-wrap{flex-wrap:wrap !important}.is-flex-wrap-wrap-reverse{flex-wrap:wrap-reverse !important}.is-justify-content-flex-start{justify-content:flex-start !important}.is-justify-content-flex-end{justify-content:flex-end !important}.is-justify-content-center{justify-content:center !important}.is-justify-content-space-between{justify-content:space-between !important}.is-justify-content-space-around{justify-content:space-around !important}.is-justify-content-space-evenly{justify-content:space-evenly !important}.is-justify-content-start{justify-content:start !important}.is-justify-content-end{justify-content:end !important}.is-justify-content-left{justify-content:left !important}.is-justify-content-right{justify-content:right !important}.is-align-content-flex-start{align-content:flex-start !important}.is-align-content-flex-end{align-content:flex-end !important}.is-align-content-center{align-content:center !important}.is-align-content-space-between{align-content:space-between !important}.is-align-content-space-around{align-content:space-around !important}.is-align-content-space-evenly{align-content:space-evenly !important}.is-align-content-stretch{align-content:stretch !important}.is-align-content-start{align-content:start !important}.is-align-content-end{align-content:end !important}.is-align-content-baseline{align-content:baseline !important}.is-align-items-stretch{align-items:stretch !important}.is-align-items-flex-start{align-items:flex-start !important}.is-align-items-flex-end{align-items:flex-end !important}.is-align-items-center{align-items:center !important}.is-align-items-baseline{align-items:baseline !important}.is-align-items-start{align-items:start !important}.is-align-items-end{align-items:end !important}.is-align-items-self-start{align-items:self-start !important}.is-align-items-self-end{align-items:self-end !important}.is-align-self-auto{align-self:auto !important}.is-align-self-flex-start{align-self:flex-start !important}.is-align-self-flex-end{align-self:flex-end !important}.is-align-self-center{align-self:center !important}.is-align-self-baseline{align-self:baseline !important}.is-align-self-stretch{align-self:stretch !important}.is-flex-grow-0{flex-grow:0 !important}.is-flex-grow-1{flex-grow:1 !important}.is-flex-grow-2{flex-grow:2 !important}.is-flex-grow-3{flex-grow:3 !important}.is-flex-grow-4{flex-grow:4 !important}.is-flex-grow-5{flex-grow:5 !important}.is-flex-shrink-0{flex-shrink:0 !important}.is-flex-shrink-1{flex-shrink:1 !important}.is-flex-shrink-2{flex-shrink:2 !important}.is-flex-shrink-3{flex-shrink:3 !important}.is-flex-shrink-4{flex-shrink:4 !important}.is-flex-shrink-5{flex-shrink:5 !important}.is-clearfix::after{clear:both;content:" ";display:table}.is-pulled-left{float:left !important}.is-pulled-right{float:right !important}.is-radiusless{border-radius:0 !important}.is-shadowless{box-shadow:none !important}.is-clickable{cursor:pointer !important;pointer-events:all !important}.is-clipped{overflow:hidden !important}.is-relative{position:relative !important}.is-marginless{margin:0 !important}.is-paddingless{padding:0 !important}.m-0{margin:0 !important}.mt-0{margin-top:0 !important}.mr-0{margin-right:0 !important}.mb-0{margin-bottom:0 !important}.ml-0{margin-left:0 !important}.mx-0{margin-left:0 !important;margin-right:0 !important}.my-0{margin-top:0 !important;margin-bottom:0 !important}.m-1{margin:.25rem !important}.mt-1{margin-top:.25rem !important}.mr-1{margin-right:.25rem !important}.mb-1{margin-bottom:.25rem !important}.ml-1{margin-left:.25rem !important}.mx-1{margin-left:.25rem !important;margin-right:.25rem !important}.my-1{margin-top:.25rem !important;margin-bottom:.25rem !important}.m-2{margin:.5rem !important}.mt-2{margin-top:.5rem !important}.mr-2{margin-right:.5rem !important}.mb-2{margin-bottom:.5rem !important}.ml-2{margin-left:.5rem !important}.mx-2{margin-left:.5rem !important;margin-right:.5rem !important}.my-2{margin-top:.5rem !important;margin-bottom:.5rem !important}.m-3{margin:.75rem !important}.mt-3{margin-top:.75rem !important}.mr-3{margin-right:.75rem !important}.mb-3{margin-bottom:.75rem !important}.ml-3{margin-left:.75rem !important}.mx-3{margin-left:.75rem !important;margin-right:.75rem !important}.my-3{margin-top:.75rem !important;margin-bottom:.75rem !important}.m-4{margin:1rem !important}.mt-4{margin-top:1rem !important}.mr-4{margin-right:1rem !important}.mb-4{margin-bottom:1rem !important}.ml-4{margin-left:1rem !important}.mx-4{margin-left:1rem !important;margin-right:1rem !important}.my-4{margin-top:1rem !important;margin-bottom:1rem !important}.m-5{margin:1.5rem !important}.mt-5{margin-top:1.5rem !important}.mr-5{margin-right:1.5rem !important}.mb-5{margin-bottom:1.5rem !important}.ml-5{margin-left:1.5rem !important}.mx-5{margin-left:1.5rem !important;margin-right:1.5rem !important}.my-5{margin-top:1.5rem !important;margin-bottom:1.5rem !important}.m-6{margin:3rem !important}.mt-6{margin-top:3rem !important}.mr-6{margin-right:3rem !important}.mb-6{margin-bottom:3rem !important}.ml-6{margin-left:3rem !important}.mx-6{margin-left:3rem !important;margin-right:3rem !important}.my-6{margin-top:3rem !important;margin-bottom:3rem !important}.m-auto{margin:auto !important}.mt-auto{margin-top:auto !important}.mr-auto{margin-right:auto !important}.mb-auto{margin-bottom:auto !important}.ml-auto{margin-left:auto !important}.mx-auto{margin-left:auto !important;margin-right:auto !important}.my-auto{margin-top:auto !important;margin-bottom:auto !important}.p-0{padding:0 !important}.pt-0{padding-top:0 !important}.pr-0{padding-right:0 !important}.pb-0{padding-bottom:0 !important}.pl-0{padding-left:0 !important}.px-0{padding-left:0 !important;padding-right:0 !important}.py-0{padding-top:0 !important;padding-bottom:0 !important}.p-1{padding:.25rem !important}.pt-1{padding-top:.25rem !important}.pr-1{padding-right:.25rem !important}.pb-1{padding-bottom:.25rem !important}.pl-1{padding-left:.25rem !important}.px-1{padding-left:.25rem !important;padding-right:.25rem !important}.py-1{padding-top:.25rem !important;padding-bottom:.25rem !important}.p-2{padding:.5rem !important}.pt-2{padding-top:.5rem !important}.pr-2{padding-right:.5rem !important}.pb-2{padding-bottom:.5rem !important}.pl-2{padding-left:.5rem !important}.px-2{padding-left:.5rem !important;padding-right:.5rem !important}.py-2{padding-top:.5rem !important;padding-bottom:.5rem !important}.p-3{padding:.75rem !important}.pt-3{padding-top:.75rem !important}.pr-3{padding-right:.75rem !important}.pb-3{padding-bottom:.75rem !important}.pl-3{padding-left:.75rem !important}.px-3{padding-left:.75rem !important;padding-right:.75rem !important}.py-3{padding-top:.75rem !important;padding-bottom:.75rem !important}.p-4{padding:1rem !important}.pt-4{padding-top:1rem !important}.pr-4{padding-right:1rem !important}.pb-4{padding-bottom:1rem !important}.pl-4{padding-left:1rem !important}.px-4{padding-left:1rem !important;padding-right:1rem !important}.py-4{padding-top:1rem !important;padding-bottom:1rem !important}.p-5{padding:1.5rem !important}.pt-5{padding-top:1.5rem !important}.pr-5{padding-right:1.5rem !important}.pb-5{padding-bottom:1.5rem !important}.pl-5{padding-left:1.5rem !important}.px-5{padding-left:1.5rem !important;padding-right:1.5rem !important}.py-5{padding-top:1.5rem !important;padding-bottom:1.5rem !important}.p-6{padding:3rem !important}.pt-6{padding-top:3rem !important}.pr-6{padding-right:3rem !important}.pb-6{padding-bottom:3rem !important}.pl-6{padding-left:3rem !important}.px-6{padding-left:3rem !important;padding-right:3rem !important}.py-6{padding-top:3rem !important;padding-bottom:3rem !important}.p-auto{padding:auto !important}.pt-auto{padding-top:auto !important}.pr-auto{padding-right:auto !important}.pb-auto{padding-bottom:auto !important}.pl-auto{padding-left:auto !important}.px-auto{padding-left:auto !important;padding-right:auto !important}.py-auto{padding-top:auto !important;padding-bottom:auto !important}.is-size-1{font-size:3rem !important}.is-size-2{font-size:2.5rem !important}.is-size-3{font-size:2rem !important}.is-size-4{font-size:1.5rem !important}.is-size-5{font-size:1.25rem !important}.is-size-6{font-size:1rem !important}.is-size-7,.docstring>section>a.docs-sourcelink{font-size:.75rem !important}@media screen and (max-width: 768px){.is-size-1-mobile{font-size:3rem !important}.is-size-2-mobile{font-size:2.5rem !important}.is-size-3-mobile{font-size:2rem !important}.is-size-4-mobile{font-size:1.5rem !important}.is-size-5-mobile{font-size:1.25rem !important}.is-size-6-mobile{font-size:1rem !important}.is-size-7-mobile{font-size:.75rem !important}}@media screen and (min-width: 769px),print{.is-size-1-tablet{font-size:3rem !important}.is-size-2-tablet{font-size:2.5rem !important}.is-size-3-tablet{font-size:2rem !important}.is-size-4-tablet{font-size:1.5rem !important}.is-size-5-tablet{font-size:1.25rem !important}.is-size-6-tablet{font-size:1rem !important}.is-size-7-tablet{font-size:.75rem !important}}@media screen and (max-width: 1055px){.is-size-1-touch{font-size:3rem !important}.is-size-2-touch{font-size:2.5rem !important}.is-size-3-touch{font-size:2rem !important}.is-size-4-touch{font-size:1.5rem !important}.is-size-5-touch{font-size:1.25rem !important}.is-size-6-touch{font-size:1rem !important}.is-size-7-touch{font-size:.75rem !important}}@media screen and (min-width: 1056px){.is-size-1-desktop{font-size:3rem !important}.is-size-2-desktop{font-size:2.5rem !important}.is-size-3-desktop{font-size:2rem !important}.is-size-4-desktop{font-size:1.5rem !important}.is-size-5-desktop{font-size:1.25rem !important}.is-size-6-desktop{font-size:1rem !important}.is-size-7-desktop{font-size:.75rem !important}}@media screen and (min-width: 1216px){.is-size-1-widescreen{font-size:3rem !important}.is-size-2-widescreen{font-size:2.5rem !important}.is-size-3-widescreen{font-size:2rem !important}.is-size-4-widescreen{font-size:1.5rem !important}.is-size-5-widescreen{font-size:1.25rem !important}.is-size-6-widescreen{font-size:1rem !important}.is-size-7-widescreen{font-size:.75rem !important}}@media screen and (min-width: 1408px){.is-size-1-fullhd{font-size:3rem !important}.is-size-2-fullhd{font-size:2.5rem !important}.is-size-3-fullhd{font-size:2rem !important}.is-size-4-fullhd{font-size:1.5rem !important}.is-size-5-fullhd{font-size:1.25rem !important}.is-size-6-fullhd{font-size:1rem !important}.is-size-7-fullhd{font-size:.75rem !important}}.has-text-centered{text-align:center !important}.has-text-justified{text-align:justify !important}.has-text-left{text-align:left !important}.has-text-right{text-align:right !important}@media screen and (max-width: 768px){.has-text-centered-mobile{text-align:center !important}}@media screen and (min-width: 769px),print{.has-text-centered-tablet{text-align:center !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.has-text-centered-tablet-only{text-align:center !important}}@media screen and (max-width: 1055px){.has-text-centered-touch{text-align:center !important}}@media screen and (min-width: 1056px){.has-text-centered-desktop{text-align:center !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.has-text-centered-desktop-only{text-align:center !important}}@media screen and (min-width: 1216px){.has-text-centered-widescreen{text-align:center !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.has-text-centered-widescreen-only{text-align:center !important}}@media screen and (min-width: 1408px){.has-text-centered-fullhd{text-align:center !important}}@media screen and (max-width: 768px){.has-text-justified-mobile{text-align:justify !important}}@media screen and (min-width: 769px),print{.has-text-justified-tablet{text-align:justify !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.has-text-justified-tablet-only{text-align:justify !important}}@media screen and (max-width: 1055px){.has-text-justified-touch{text-align:justify !important}}@media screen and (min-width: 1056px){.has-text-justified-desktop{text-align:justify !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.has-text-justified-desktop-only{text-align:justify !important}}@media screen and (min-width: 1216px){.has-text-justified-widescreen{text-align:justify !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.has-text-justified-widescreen-only{text-align:justify !important}}@media screen and (min-width: 1408px){.has-text-justified-fullhd{text-align:justify !important}}@media screen and (max-width: 768px){.has-text-left-mobile{text-align:left !important}}@media screen and (min-width: 769px),print{.has-text-left-tablet{text-align:left !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.has-text-left-tablet-only{text-align:left !important}}@media screen and (max-width: 1055px){.has-text-left-touch{text-align:left !important}}@media screen and (min-width: 1056px){.has-text-left-desktop{text-align:left !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.has-text-left-desktop-only{text-align:left !important}}@media screen and (min-width: 1216px){.has-text-left-widescreen{text-align:left !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.has-text-left-widescreen-only{text-align:left !important}}@media screen and (min-width: 1408px){.has-text-left-fullhd{text-align:left !important}}@media screen and (max-width: 768px){.has-text-right-mobile{text-align:right !important}}@media screen and (min-width: 769px),print{.has-text-right-tablet{text-align:right !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.has-text-right-tablet-only{text-align:right !important}}@media screen and (max-width: 1055px){.has-text-right-touch{text-align:right !important}}@media screen and (min-width: 1056px){.has-text-right-desktop{text-align:right !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.has-text-right-desktop-only{text-align:right !important}}@media screen and (min-width: 1216px){.has-text-right-widescreen{text-align:right !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.has-text-right-widescreen-only{text-align:right !important}}@media screen and (min-width: 1408px){.has-text-right-fullhd{text-align:right !important}}.is-capitalized{text-transform:capitalize !important}.is-lowercase{text-transform:lowercase !important}.is-uppercase{text-transform:uppercase !important}.is-italic{font-style:italic !important}.is-underlined{text-decoration:underline !important}.has-text-weight-light{font-weight:300 !important}.has-text-weight-normal{font-weight:400 !important}.has-text-weight-medium{font-weight:500 !important}.has-text-weight-semibold{font-weight:600 !important}.has-text-weight-bold{font-weight:700 !important}.is-family-primary{font-family:"Lato Medium",-apple-system,BlinkMacSystemFont,"Segoe UI","Helvetica Neue","Helvetica","Arial",sans-serif !important}.is-family-secondary{font-family:"Lato Medium",-apple-system,BlinkMacSystemFont,"Segoe UI","Helvetica Neue","Helvetica","Arial",sans-serif !important}.is-family-sans-serif{font-family:"Lato Medium",-apple-system,BlinkMacSystemFont,"Segoe UI","Helvetica Neue","Helvetica","Arial",sans-serif !important}.is-family-monospace{font-family:"JuliaMono","SFMono-Regular","Menlo","Consolas","Liberation Mono","DejaVu Sans Mono",monospace !important}.is-family-code{font-family:"JuliaMono","SFMono-Regular","Menlo","Consolas","Liberation Mono","DejaVu Sans Mono",monospace !important}.is-block{display:block !important}@media screen and (max-width: 768px){.is-block-mobile{display:block !important}}@media screen and (min-width: 769px),print{.is-block-tablet{display:block !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.is-block-tablet-only{display:block !important}}@media screen and (max-width: 1055px){.is-block-touch{display:block !important}}@media screen and (min-width: 1056px){.is-block-desktop{display:block !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.is-block-desktop-only{display:block !important}}@media screen and (min-width: 1216px){.is-block-widescreen{display:block !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.is-block-widescreen-only{display:block !important}}@media screen and (min-width: 1408px){.is-block-fullhd{display:block !important}}.is-flex{display:flex !important}@media screen and (max-width: 768px){.is-flex-mobile{display:flex !important}}@media screen and (min-width: 769px),print{.is-flex-tablet{display:flex !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.is-flex-tablet-only{display:flex !important}}@media screen and (max-width: 1055px){.is-flex-touch{display:flex !important}}@media screen and (min-width: 1056px){.is-flex-desktop{display:flex !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.is-flex-desktop-only{display:flex !important}}@media screen and (min-width: 1216px){.is-flex-widescreen{display:flex !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.is-flex-widescreen-only{display:flex !important}}@media screen and (min-width: 1408px){.is-flex-fullhd{display:flex !important}}.is-inline{display:inline !important}@media screen and (max-width: 768px){.is-inline-mobile{display:inline !important}}@media screen and (min-width: 769px),print{.is-inline-tablet{display:inline !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.is-inline-tablet-only{display:inline !important}}@media screen and (max-width: 1055px){.is-inline-touch{display:inline !important}}@media screen and (min-width: 1056px){.is-inline-desktop{display:inline !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.is-inline-desktop-only{display:inline !important}}@media screen and (min-width: 1216px){.is-inline-widescreen{display:inline !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.is-inline-widescreen-only{display:inline !important}}@media screen and (min-width: 1408px){.is-inline-fullhd{display:inline !important}}.is-inline-block{display:inline-block !important}@media screen and (max-width: 768px){.is-inline-block-mobile{display:inline-block !important}}@media screen and (min-width: 769px),print{.is-inline-block-tablet{display:inline-block !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.is-inline-block-tablet-only{display:inline-block !important}}@media screen and (max-width: 1055px){.is-inline-block-touch{display:inline-block !important}}@media screen and (min-width: 1056px){.is-inline-block-desktop{display:inline-block !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.is-inline-block-desktop-only{display:inline-block !important}}@media screen and (min-width: 1216px){.is-inline-block-widescreen{display:inline-block !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.is-inline-block-widescreen-only{display:inline-block !important}}@media screen and (min-width: 1408px){.is-inline-block-fullhd{display:inline-block !important}}.is-inline-flex{display:inline-flex !important}@media screen and (max-width: 768px){.is-inline-flex-mobile{display:inline-flex !important}}@media screen and (min-width: 769px),print{.is-inline-flex-tablet{display:inline-flex !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.is-inline-flex-tablet-only{display:inline-flex !important}}@media screen and (max-width: 1055px){.is-inline-flex-touch{display:inline-flex !important}}@media screen and (min-width: 1056px){.is-inline-flex-desktop{display:inline-flex !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.is-inline-flex-desktop-only{display:inline-flex !important}}@media screen and (min-width: 1216px){.is-inline-flex-widescreen{display:inline-flex !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.is-inline-flex-widescreen-only{display:inline-flex !important}}@media screen and (min-width: 1408px){.is-inline-flex-fullhd{display:inline-flex !important}}.is-hidden{display:none !important}.is-sr-only{border:none !important;clip:rect(0, 0, 0, 0) !important;height:0.01em !important;overflow:hidden !important;padding:0 !important;position:absolute !important;white-space:nowrap !important;width:0.01em !important}@media screen and (max-width: 768px){.is-hidden-mobile{display:none !important}}@media screen and (min-width: 769px),print{.is-hidden-tablet{display:none !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.is-hidden-tablet-only{display:none !important}}@media screen and (max-width: 1055px){.is-hidden-touch{display:none !important}}@media screen and (min-width: 1056px){.is-hidden-desktop{display:none !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.is-hidden-desktop-only{display:none !important}}@media screen and (min-width: 1216px){.is-hidden-widescreen{display:none !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.is-hidden-widescreen-only{display:none !important}}@media screen and (min-width: 1408px){.is-hidden-fullhd{display:none !important}}.is-invisible{visibility:hidden !important}@media screen and (max-width: 768px){.is-invisible-mobile{visibility:hidden !important}}@media screen and (min-width: 769px),print{.is-invisible-tablet{visibility:hidden !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.is-invisible-tablet-only{visibility:hidden !important}}@media screen and (max-width: 1055px){.is-invisible-touch{visibility:hidden !important}}@media screen and (min-width: 1056px){.is-invisible-desktop{visibility:hidden !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.is-invisible-desktop-only{visibility:hidden !important}}@media screen and (min-width: 1216px){.is-invisible-widescreen{visibility:hidden !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.is-invisible-widescreen-only{visibility:hidden !important}}@media screen and (min-width: 1408px){.is-invisible-fullhd{visibility:hidden !important}}/*! minireset.css v0.0.6 | MIT License | github.com/jgthms/minireset.css */html,body,p,ol,ul,li,dl,dt,dd,blockquote,figure,fieldset,legend,textarea,pre,iframe,hr,h1,h2,h3,h4,h5,h6{margin:0;padding:0}h1,h2,h3,h4,h5,h6{font-size:100%;font-weight:normal}ul{list-style:none}button,input,select,textarea{margin:0}html{box-sizing:border-box}*,*::before,*::after{box-sizing:inherit}img,video{height:auto;max-width:100%}iframe{border:0}table{border-collapse:collapse;border-spacing:0}td,th{padding:0}td:not([align]),th:not([align]){text-align:inherit}html{background-color:#fff;font-size:16px;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;min-width:300px;overflow-x:auto;overflow-y:scroll;text-rendering:optimizeLegibility;text-size-adjust:100%}article,aside,figure,footer,header,hgroup,section{display:block}body,button,input,optgroup,select,textarea{font-family:"Lato Medium",-apple-system,BlinkMacSystemFont,"Segoe UI","Helvetica Neue","Helvetica","Arial",sans-serif}code,pre{-moz-osx-font-smoothing:auto;-webkit-font-smoothing:auto;font-family:"JuliaMono","SFMono-Regular","Menlo","Consolas","Liberation Mono","DejaVu Sans Mono",monospace}body{color:#222;font-size:1em;font-weight:400;line-height:1.5}a{color:#2e63b8;cursor:pointer;text-decoration:none}a strong{color:currentColor}a:hover{color:#363636}code{background-color:rgba(0,0,0,0.05);color:#000;font-size:.875em;font-weight:normal;padding:.1em}hr{background-color:#f5f5f5;border:none;display:block;height:2px;margin:1.5rem 0}img{height:auto;max-width:100%}input[type="checkbox"],input[type="radio"]{vertical-align:baseline}small{font-size:.875em}span{font-style:inherit;font-weight:inherit}strong{color:#222;font-weight:700}fieldset{border:none}pre{-webkit-overflow-scrolling:touch;background-color:#f5f5f5;color:#222;font-size:.875em;overflow-x:auto;padding:1.25rem 1.5rem;white-space:pre;word-wrap:normal}pre code{background-color:transparent;color:currentColor;font-size:1em;padding:0}table td,table th{vertical-align:top}table td:not([align]),table th:not([align]){text-align:inherit}table th{color:#222}@keyframes spinAround{from{transform:rotate(0deg)}to{transform:rotate(359deg)}}.box{background-color:#fff;border-radius:6px;box-shadow:#bbb;color:#222;display:block;padding:1.25rem}a.box:hover,a.box:focus{box-shadow:0 0.5em 1em -0.125em rgba(10,10,10,0.1),0 0 0 1px #2e63b8}a.box:active{box-shadow:inset 0 1px 2px rgba(10,10,10,0.2),0 0 0 1px #2e63b8}.button{background-color:#fff;border-color:#dbdbdb;border-width:1px;color:#222;cursor:pointer;justify-content:center;padding-bottom:calc(0.5em - 1px);padding-left:1em;padding-right:1em;padding-top:calc(0.5em - 1px);text-align:center;white-space:nowrap}.button strong{color:inherit}.button .icon,.button .icon.is-small,.button #documenter .docs-sidebar form.docs-search>input.icon,#documenter .docs-sidebar .button form.docs-search>input.icon,.button .icon.is-medium,.button .icon.is-large{height:1.5em;width:1.5em}.button .icon:first-child:not(:last-child){margin-left:calc(-0.5em - 1px);margin-right:.25em}.button .icon:last-child:not(:first-child){margin-left:.25em;margin-right:calc(-0.5em - 1px)}.button .icon:first-child:last-child{margin-left:calc(-0.5em - 1px);margin-right:calc(-0.5em - 1px)}.button:hover,.button.is-hovered{border-color:#b5b5b5;color:#363636}.button:focus,.button.is-focused{border-color:#3c5dcd;color:#363636}.button:focus:not(:active),.button.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(46,99,184,0.25)}.button:active,.button.is-active{border-color:#4a4a4a;color:#363636}.button.is-text{background-color:transparent;border-color:transparent;color:#222;text-decoration:underline}.button.is-text:hover,.button.is-text.is-hovered,.button.is-text:focus,.button.is-text.is-focused{background-color:#f5f5f5;color:#222}.button.is-text:active,.button.is-text.is-active{background-color:#e8e8e8;color:#222}.button.is-text[disabled],fieldset[disabled] .button.is-text{background-color:transparent;border-color:transparent;box-shadow:none}.button.is-ghost{background:none;border-color:rgba(0,0,0,0);color:#2e63b8;text-decoration:none}.button.is-ghost:hover,.button.is-ghost.is-hovered{color:#2e63b8;text-decoration:underline}.button.is-white{background-color:#fff;border-color:transparent;color:#0a0a0a}.button.is-white:hover,.button.is-white.is-hovered{background-color:#f9f9f9;border-color:transparent;color:#0a0a0a}.button.is-white:focus,.button.is-white.is-focused{border-color:transparent;color:#0a0a0a}.button.is-white:focus:not(:active),.button.is-white.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(255,255,255,0.25)}.button.is-white:active,.button.is-white.is-active{background-color:#f2f2f2;border-color:transparent;color:#0a0a0a}.button.is-white[disabled],fieldset[disabled] .button.is-white{background-color:#fff;border-color:#fff;box-shadow:none}.button.is-white.is-inverted{background-color:#0a0a0a;color:#fff}.button.is-white.is-inverted:hover,.button.is-white.is-inverted.is-hovered{background-color:#000}.button.is-white.is-inverted[disabled],fieldset[disabled] .button.is-white.is-inverted{background-color:#0a0a0a;border-color:transparent;box-shadow:none;color:#fff}.button.is-white.is-loading::after{border-color:transparent transparent #0a0a0a #0a0a0a !important}.button.is-white.is-outlined{background-color:transparent;border-color:#fff;color:#fff}.button.is-white.is-outlined:hover,.button.is-white.is-outlined.is-hovered,.button.is-white.is-outlined:focus,.button.is-white.is-outlined.is-focused{background-color:#fff;border-color:#fff;color:#0a0a0a}.button.is-white.is-outlined.is-loading::after{border-color:transparent transparent #fff #fff !important}.button.is-white.is-outlined.is-loading:hover::after,.button.is-white.is-outlined.is-loading.is-hovered::after,.button.is-white.is-outlined.is-loading:focus::after,.button.is-white.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #0a0a0a #0a0a0a !important}.button.is-white.is-outlined[disabled],fieldset[disabled] .button.is-white.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}.button.is-white.is-inverted.is-outlined{background-color:transparent;border-color:#0a0a0a;color:#0a0a0a}.button.is-white.is-inverted.is-outlined:hover,.button.is-white.is-inverted.is-outlined.is-hovered,.button.is-white.is-inverted.is-outlined:focus,.button.is-white.is-inverted.is-outlined.is-focused{background-color:#0a0a0a;color:#fff}.button.is-white.is-inverted.is-outlined.is-loading:hover::after,.button.is-white.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-white.is-inverted.is-outlined.is-loading:focus::after,.button.is-white.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #fff #fff !important}.button.is-white.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-white.is-inverted.is-outlined{background-color:transparent;border-color:#0a0a0a;box-shadow:none;color:#0a0a0a}.button.is-black{background-color:#0a0a0a;border-color:transparent;color:#fff}.button.is-black:hover,.button.is-black.is-hovered{background-color:#040404;border-color:transparent;color:#fff}.button.is-black:focus,.button.is-black.is-focused{border-color:transparent;color:#fff}.button.is-black:focus:not(:active),.button.is-black.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(10,10,10,0.25)}.button.is-black:active,.button.is-black.is-active{background-color:#000;border-color:transparent;color:#fff}.button.is-black[disabled],fieldset[disabled] .button.is-black{background-color:#0a0a0a;border-color:#0a0a0a;box-shadow:none}.button.is-black.is-inverted{background-color:#fff;color:#0a0a0a}.button.is-black.is-inverted:hover,.button.is-black.is-inverted.is-hovered{background-color:#f2f2f2}.button.is-black.is-inverted[disabled],fieldset[disabled] .button.is-black.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#0a0a0a}.button.is-black.is-loading::after{border-color:transparent transparent #fff #fff !important}.button.is-black.is-outlined{background-color:transparent;border-color:#0a0a0a;color:#0a0a0a}.button.is-black.is-outlined:hover,.button.is-black.is-outlined.is-hovered,.button.is-black.is-outlined:focus,.button.is-black.is-outlined.is-focused{background-color:#0a0a0a;border-color:#0a0a0a;color:#fff}.button.is-black.is-outlined.is-loading::after{border-color:transparent transparent #0a0a0a #0a0a0a !important}.button.is-black.is-outlined.is-loading:hover::after,.button.is-black.is-outlined.is-loading.is-hovered::after,.button.is-black.is-outlined.is-loading:focus::after,.button.is-black.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #fff #fff !important}.button.is-black.is-outlined[disabled],fieldset[disabled] .button.is-black.is-outlined{background-color:transparent;border-color:#0a0a0a;box-shadow:none;color:#0a0a0a}.button.is-black.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}.button.is-black.is-inverted.is-outlined:hover,.button.is-black.is-inverted.is-outlined.is-hovered,.button.is-black.is-inverted.is-outlined:focus,.button.is-black.is-inverted.is-outlined.is-focused{background-color:#fff;color:#0a0a0a}.button.is-black.is-inverted.is-outlined.is-loading:hover::after,.button.is-black.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-black.is-inverted.is-outlined.is-loading:focus::after,.button.is-black.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #0a0a0a #0a0a0a !important}.button.is-black.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-black.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}.button.is-light{background-color:#f5f5f5;border-color:transparent;color:rgba(0,0,0,0.7)}.button.is-light:hover,.button.is-light.is-hovered{background-color:#eee;border-color:transparent;color:rgba(0,0,0,0.7)}.button.is-light:focus,.button.is-light.is-focused{border-color:transparent;color:rgba(0,0,0,0.7)}.button.is-light:focus:not(:active),.button.is-light.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(245,245,245,0.25)}.button.is-light:active,.button.is-light.is-active{background-color:#e8e8e8;border-color:transparent;color:rgba(0,0,0,0.7)}.button.is-light[disabled],fieldset[disabled] .button.is-light{background-color:#f5f5f5;border-color:#f5f5f5;box-shadow:none}.button.is-light.is-inverted{background-color:rgba(0,0,0,0.7);color:#f5f5f5}.button.is-light.is-inverted:hover,.button.is-light.is-inverted.is-hovered{background-color:rgba(0,0,0,0.7)}.button.is-light.is-inverted[disabled],fieldset[disabled] .button.is-light.is-inverted{background-color:rgba(0,0,0,0.7);border-color:transparent;box-shadow:none;color:#f5f5f5}.button.is-light.is-loading::after{border-color:transparent transparent rgba(0,0,0,0.7) rgba(0,0,0,0.7) !important}.button.is-light.is-outlined{background-color:transparent;border-color:#f5f5f5;color:#f5f5f5}.button.is-light.is-outlined:hover,.button.is-light.is-outlined.is-hovered,.button.is-light.is-outlined:focus,.button.is-light.is-outlined.is-focused{background-color:#f5f5f5;border-color:#f5f5f5;color:rgba(0,0,0,0.7)}.button.is-light.is-outlined.is-loading::after{border-color:transparent transparent #f5f5f5 #f5f5f5 !important}.button.is-light.is-outlined.is-loading:hover::after,.button.is-light.is-outlined.is-loading.is-hovered::after,.button.is-light.is-outlined.is-loading:focus::after,.button.is-light.is-outlined.is-loading.is-focused::after{border-color:transparent transparent rgba(0,0,0,0.7) rgba(0,0,0,0.7) !important}.button.is-light.is-outlined[disabled],fieldset[disabled] .button.is-light.is-outlined{background-color:transparent;border-color:#f5f5f5;box-shadow:none;color:#f5f5f5}.button.is-light.is-inverted.is-outlined{background-color:transparent;border-color:rgba(0,0,0,0.7);color:rgba(0,0,0,0.7)}.button.is-light.is-inverted.is-outlined:hover,.button.is-light.is-inverted.is-outlined.is-hovered,.button.is-light.is-inverted.is-outlined:focus,.button.is-light.is-inverted.is-outlined.is-focused{background-color:rgba(0,0,0,0.7);color:#f5f5f5}.button.is-light.is-inverted.is-outlined.is-loading:hover::after,.button.is-light.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-light.is-inverted.is-outlined.is-loading:focus::after,.button.is-light.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #f5f5f5 #f5f5f5 !important}.button.is-light.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-light.is-inverted.is-outlined{background-color:transparent;border-color:rgba(0,0,0,0.7);box-shadow:none;color:rgba(0,0,0,0.7)}.button.is-dark,.content kbd.button{background-color:#363636;border-color:transparent;color:#fff}.button.is-dark:hover,.content kbd.button:hover,.button.is-dark.is-hovered,.content kbd.button.is-hovered{background-color:#2f2f2f;border-color:transparent;color:#fff}.button.is-dark:focus,.content kbd.button:focus,.button.is-dark.is-focused,.content kbd.button.is-focused{border-color:transparent;color:#fff}.button.is-dark:focus:not(:active),.content kbd.button:focus:not(:active),.button.is-dark.is-focused:not(:active),.content kbd.button.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(54,54,54,0.25)}.button.is-dark:active,.content kbd.button:active,.button.is-dark.is-active,.content kbd.button.is-active{background-color:#292929;border-color:transparent;color:#fff}.button.is-dark[disabled],.content kbd.button[disabled],fieldset[disabled] .button.is-dark,fieldset[disabled] .content kbd.button,.content fieldset[disabled] kbd.button{background-color:#363636;border-color:#363636;box-shadow:none}.button.is-dark.is-inverted,.content kbd.button.is-inverted{background-color:#fff;color:#363636}.button.is-dark.is-inverted:hover,.content kbd.button.is-inverted:hover,.button.is-dark.is-inverted.is-hovered,.content kbd.button.is-inverted.is-hovered{background-color:#f2f2f2}.button.is-dark.is-inverted[disabled],.content kbd.button.is-inverted[disabled],fieldset[disabled] .button.is-dark.is-inverted,fieldset[disabled] .content kbd.button.is-inverted,.content fieldset[disabled] kbd.button.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#363636}.button.is-dark.is-loading::after,.content kbd.button.is-loading::after{border-color:transparent transparent #fff #fff !important}.button.is-dark.is-outlined,.content kbd.button.is-outlined{background-color:transparent;border-color:#363636;color:#363636}.button.is-dark.is-outlined:hover,.content kbd.button.is-outlined:hover,.button.is-dark.is-outlined.is-hovered,.content kbd.button.is-outlined.is-hovered,.button.is-dark.is-outlined:focus,.content kbd.button.is-outlined:focus,.button.is-dark.is-outlined.is-focused,.content kbd.button.is-outlined.is-focused{background-color:#363636;border-color:#363636;color:#fff}.button.is-dark.is-outlined.is-loading::after,.content kbd.button.is-outlined.is-loading::after{border-color:transparent transparent #363636 #363636 !important}.button.is-dark.is-outlined.is-loading:hover::after,.content kbd.button.is-outlined.is-loading:hover::after,.button.is-dark.is-outlined.is-loading.is-hovered::after,.content kbd.button.is-outlined.is-loading.is-hovered::after,.button.is-dark.is-outlined.is-loading:focus::after,.content kbd.button.is-outlined.is-loading:focus::after,.button.is-dark.is-outlined.is-loading.is-focused::after,.content kbd.button.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #fff #fff !important}.button.is-dark.is-outlined[disabled],.content kbd.button.is-outlined[disabled],fieldset[disabled] .button.is-dark.is-outlined,fieldset[disabled] .content kbd.button.is-outlined,.content fieldset[disabled] kbd.button.is-outlined{background-color:transparent;border-color:#363636;box-shadow:none;color:#363636}.button.is-dark.is-inverted.is-outlined,.content kbd.button.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}.button.is-dark.is-inverted.is-outlined:hover,.content kbd.button.is-inverted.is-outlined:hover,.button.is-dark.is-inverted.is-outlined.is-hovered,.content kbd.button.is-inverted.is-outlined.is-hovered,.button.is-dark.is-inverted.is-outlined:focus,.content kbd.button.is-inverted.is-outlined:focus,.button.is-dark.is-inverted.is-outlined.is-focused,.content kbd.button.is-inverted.is-outlined.is-focused{background-color:#fff;color:#363636}.button.is-dark.is-inverted.is-outlined.is-loading:hover::after,.content kbd.button.is-inverted.is-outlined.is-loading:hover::after,.button.is-dark.is-inverted.is-outlined.is-loading.is-hovered::after,.content kbd.button.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-dark.is-inverted.is-outlined.is-loading:focus::after,.content kbd.button.is-inverted.is-outlined.is-loading:focus::after,.button.is-dark.is-inverted.is-outlined.is-loading.is-focused::after,.content kbd.button.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #363636 #363636 !important}.button.is-dark.is-inverted.is-outlined[disabled],.content kbd.button.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-dark.is-inverted.is-outlined,fieldset[disabled] .content kbd.button.is-inverted.is-outlined,.content fieldset[disabled] kbd.button.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}.button.is-primary,.docstring>section>a.button.docs-sourcelink{background-color:#4eb5de;border-color:transparent;color:#fff}.button.is-primary:hover,.docstring>section>a.button.docs-sourcelink:hover,.button.is-primary.is-hovered,.docstring>section>a.button.is-hovered.docs-sourcelink{background-color:#43b1dc;border-color:transparent;color:#fff}.button.is-primary:focus,.docstring>section>a.button.docs-sourcelink:focus,.button.is-primary.is-focused,.docstring>section>a.button.is-focused.docs-sourcelink{border-color:transparent;color:#fff}.button.is-primary:focus:not(:active),.docstring>section>a.button.docs-sourcelink:focus:not(:active),.button.is-primary.is-focused:not(:active),.docstring>section>a.button.is-focused.docs-sourcelink:not(:active){box-shadow:0 0 0 0.125em rgba(78,181,222,0.25)}.button.is-primary:active,.docstring>section>a.button.docs-sourcelink:active,.button.is-primary.is-active,.docstring>section>a.button.is-active.docs-sourcelink{background-color:#39acda;border-color:transparent;color:#fff}.button.is-primary[disabled],.docstring>section>a.button.docs-sourcelink[disabled],fieldset[disabled] .button.is-primary,fieldset[disabled] .docstring>section>a.button.docs-sourcelink{background-color:#4eb5de;border-color:#4eb5de;box-shadow:none}.button.is-primary.is-inverted,.docstring>section>a.button.is-inverted.docs-sourcelink{background-color:#fff;color:#4eb5de}.button.is-primary.is-inverted:hover,.docstring>section>a.button.is-inverted.docs-sourcelink:hover,.button.is-primary.is-inverted.is-hovered,.docstring>section>a.button.is-inverted.is-hovered.docs-sourcelink{background-color:#f2f2f2}.button.is-primary.is-inverted[disabled],.docstring>section>a.button.is-inverted.docs-sourcelink[disabled],fieldset[disabled] .button.is-primary.is-inverted,fieldset[disabled] .docstring>section>a.button.is-inverted.docs-sourcelink{background-color:#fff;border-color:transparent;box-shadow:none;color:#4eb5de}.button.is-primary.is-loading::after,.docstring>section>a.button.is-loading.docs-sourcelink::after{border-color:transparent transparent #fff #fff !important}.button.is-primary.is-outlined,.docstring>section>a.button.is-outlined.docs-sourcelink{background-color:transparent;border-color:#4eb5de;color:#4eb5de}.button.is-primary.is-outlined:hover,.docstring>section>a.button.is-outlined.docs-sourcelink:hover,.button.is-primary.is-outlined.is-hovered,.docstring>section>a.button.is-outlined.is-hovered.docs-sourcelink,.button.is-primary.is-outlined:focus,.docstring>section>a.button.is-outlined.docs-sourcelink:focus,.button.is-primary.is-outlined.is-focused,.docstring>section>a.button.is-outlined.is-focused.docs-sourcelink{background-color:#4eb5de;border-color:#4eb5de;color:#fff}.button.is-primary.is-outlined.is-loading::after,.docstring>section>a.button.is-outlined.is-loading.docs-sourcelink::after{border-color:transparent transparent #4eb5de #4eb5de !important}.button.is-primary.is-outlined.is-loading:hover::after,.docstring>section>a.button.is-outlined.is-loading.docs-sourcelink:hover::after,.button.is-primary.is-outlined.is-loading.is-hovered::after,.docstring>section>a.button.is-outlined.is-loading.is-hovered.docs-sourcelink::after,.button.is-primary.is-outlined.is-loading:focus::after,.docstring>section>a.button.is-outlined.is-loading.docs-sourcelink:focus::after,.button.is-primary.is-outlined.is-loading.is-focused::after,.docstring>section>a.button.is-outlined.is-loading.is-focused.docs-sourcelink::after{border-color:transparent transparent #fff #fff !important}.button.is-primary.is-outlined[disabled],.docstring>section>a.button.is-outlined.docs-sourcelink[disabled],fieldset[disabled] .button.is-primary.is-outlined,fieldset[disabled] .docstring>section>a.button.is-outlined.docs-sourcelink{background-color:transparent;border-color:#4eb5de;box-shadow:none;color:#4eb5de}.button.is-primary.is-inverted.is-outlined,.docstring>section>a.button.is-inverted.is-outlined.docs-sourcelink{background-color:transparent;border-color:#fff;color:#fff}.button.is-primary.is-inverted.is-outlined:hover,.docstring>section>a.button.is-inverted.is-outlined.docs-sourcelink:hover,.button.is-primary.is-inverted.is-outlined.is-hovered,.docstring>section>a.button.is-inverted.is-outlined.is-hovered.docs-sourcelink,.button.is-primary.is-inverted.is-outlined:focus,.docstring>section>a.button.is-inverted.is-outlined.docs-sourcelink:focus,.button.is-primary.is-inverted.is-outlined.is-focused,.docstring>section>a.button.is-inverted.is-outlined.is-focused.docs-sourcelink{background-color:#fff;color:#4eb5de}.button.is-primary.is-inverted.is-outlined.is-loading:hover::after,.docstring>section>a.button.is-inverted.is-outlined.is-loading.docs-sourcelink:hover::after,.button.is-primary.is-inverted.is-outlined.is-loading.is-hovered::after,.docstring>section>a.button.is-inverted.is-outlined.is-loading.is-hovered.docs-sourcelink::after,.button.is-primary.is-inverted.is-outlined.is-loading:focus::after,.docstring>section>a.button.is-inverted.is-outlined.is-loading.docs-sourcelink:focus::after,.button.is-primary.is-inverted.is-outlined.is-loading.is-focused::after,.docstring>section>a.button.is-inverted.is-outlined.is-loading.is-focused.docs-sourcelink::after{border-color:transparent transparent #4eb5de #4eb5de !important}.button.is-primary.is-inverted.is-outlined[disabled],.docstring>section>a.button.is-inverted.is-outlined.docs-sourcelink[disabled],fieldset[disabled] .button.is-primary.is-inverted.is-outlined,fieldset[disabled] .docstring>section>a.button.is-inverted.is-outlined.docs-sourcelink{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}.button.is-primary.is-light,.docstring>section>a.button.is-light.docs-sourcelink{background-color:#eef8fc;color:#1a6d8e}.button.is-primary.is-light:hover,.docstring>section>a.button.is-light.docs-sourcelink:hover,.button.is-primary.is-light.is-hovered,.docstring>section>a.button.is-light.is-hovered.docs-sourcelink{background-color:#e3f3fa;border-color:transparent;color:#1a6d8e}.button.is-primary.is-light:active,.docstring>section>a.button.is-light.docs-sourcelink:active,.button.is-primary.is-light.is-active,.docstring>section>a.button.is-light.is-active.docs-sourcelink{background-color:#d8eff8;border-color:transparent;color:#1a6d8e}.button.is-link{background-color:#2e63b8;border-color:transparent;color:#fff}.button.is-link:hover,.button.is-link.is-hovered{background-color:#2b5eae;border-color:transparent;color:#fff}.button.is-link:focus,.button.is-link.is-focused{border-color:transparent;color:#fff}.button.is-link:focus:not(:active),.button.is-link.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(46,99,184,0.25)}.button.is-link:active,.button.is-link.is-active{background-color:#2958a4;border-color:transparent;color:#fff}.button.is-link[disabled],fieldset[disabled] .button.is-link{background-color:#2e63b8;border-color:#2e63b8;box-shadow:none}.button.is-link.is-inverted{background-color:#fff;color:#2e63b8}.button.is-link.is-inverted:hover,.button.is-link.is-inverted.is-hovered{background-color:#f2f2f2}.button.is-link.is-inverted[disabled],fieldset[disabled] .button.is-link.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#2e63b8}.button.is-link.is-loading::after{border-color:transparent transparent #fff #fff !important}.button.is-link.is-outlined{background-color:transparent;border-color:#2e63b8;color:#2e63b8}.button.is-link.is-outlined:hover,.button.is-link.is-outlined.is-hovered,.button.is-link.is-outlined:focus,.button.is-link.is-outlined.is-focused{background-color:#2e63b8;border-color:#2e63b8;color:#fff}.button.is-link.is-outlined.is-loading::after{border-color:transparent transparent #2e63b8 #2e63b8 !important}.button.is-link.is-outlined.is-loading:hover::after,.button.is-link.is-outlined.is-loading.is-hovered::after,.button.is-link.is-outlined.is-loading:focus::after,.button.is-link.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #fff #fff !important}.button.is-link.is-outlined[disabled],fieldset[disabled] .button.is-link.is-outlined{background-color:transparent;border-color:#2e63b8;box-shadow:none;color:#2e63b8}.button.is-link.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}.button.is-link.is-inverted.is-outlined:hover,.button.is-link.is-inverted.is-outlined.is-hovered,.button.is-link.is-inverted.is-outlined:focus,.button.is-link.is-inverted.is-outlined.is-focused{background-color:#fff;color:#2e63b8}.button.is-link.is-inverted.is-outlined.is-loading:hover::after,.button.is-link.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-link.is-inverted.is-outlined.is-loading:focus::after,.button.is-link.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #2e63b8 #2e63b8 !important}.button.is-link.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-link.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}.button.is-link.is-light{background-color:#eff3fb;color:#3169c4}.button.is-link.is-light:hover,.button.is-link.is-light.is-hovered{background-color:#e4ecf8;border-color:transparent;color:#3169c4}.button.is-link.is-light:active,.button.is-link.is-light.is-active{background-color:#dae5f6;border-color:transparent;color:#3169c4}.button.is-info{background-color:#209cee;border-color:transparent;color:#fff}.button.is-info:hover,.button.is-info.is-hovered{background-color:#1497ed;border-color:transparent;color:#fff}.button.is-info:focus,.button.is-info.is-focused{border-color:transparent;color:#fff}.button.is-info:focus:not(:active),.button.is-info.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(32,156,238,0.25)}.button.is-info:active,.button.is-info.is-active{background-color:#1190e3;border-color:transparent;color:#fff}.button.is-info[disabled],fieldset[disabled] .button.is-info{background-color:#209cee;border-color:#209cee;box-shadow:none}.button.is-info.is-inverted{background-color:#fff;color:#209cee}.button.is-info.is-inverted:hover,.button.is-info.is-inverted.is-hovered{background-color:#f2f2f2}.button.is-info.is-inverted[disabled],fieldset[disabled] .button.is-info.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#209cee}.button.is-info.is-loading::after{border-color:transparent transparent #fff #fff !important}.button.is-info.is-outlined{background-color:transparent;border-color:#209cee;color:#209cee}.button.is-info.is-outlined:hover,.button.is-info.is-outlined.is-hovered,.button.is-info.is-outlined:focus,.button.is-info.is-outlined.is-focused{background-color:#209cee;border-color:#209cee;color:#fff}.button.is-info.is-outlined.is-loading::after{border-color:transparent transparent #209cee #209cee !important}.button.is-info.is-outlined.is-loading:hover::after,.button.is-info.is-outlined.is-loading.is-hovered::after,.button.is-info.is-outlined.is-loading:focus::after,.button.is-info.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #fff #fff !important}.button.is-info.is-outlined[disabled],fieldset[disabled] .button.is-info.is-outlined{background-color:transparent;border-color:#209cee;box-shadow:none;color:#209cee}.button.is-info.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}.button.is-info.is-inverted.is-outlined:hover,.button.is-info.is-inverted.is-outlined.is-hovered,.button.is-info.is-inverted.is-outlined:focus,.button.is-info.is-inverted.is-outlined.is-focused{background-color:#fff;color:#209cee}.button.is-info.is-inverted.is-outlined.is-loading:hover::after,.button.is-info.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-info.is-inverted.is-outlined.is-loading:focus::after,.button.is-info.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #209cee #209cee !important}.button.is-info.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-info.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}.button.is-info.is-light{background-color:#ecf7fe;color:#0e72b4}.button.is-info.is-light:hover,.button.is-info.is-light.is-hovered{background-color:#e0f1fd;border-color:transparent;color:#0e72b4}.button.is-info.is-light:active,.button.is-info.is-light.is-active{background-color:#d4ecfc;border-color:transparent;color:#0e72b4}.button.is-success{background-color:#22c35b;border-color:transparent;color:#fff}.button.is-success:hover,.button.is-success.is-hovered{background-color:#20b856;border-color:transparent;color:#fff}.button.is-success:focus,.button.is-success.is-focused{border-color:transparent;color:#fff}.button.is-success:focus:not(:active),.button.is-success.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(34,195,91,0.25)}.button.is-success:active,.button.is-success.is-active{background-color:#1ead51;border-color:transparent;color:#fff}.button.is-success[disabled],fieldset[disabled] .button.is-success{background-color:#22c35b;border-color:#22c35b;box-shadow:none}.button.is-success.is-inverted{background-color:#fff;color:#22c35b}.button.is-success.is-inverted:hover,.button.is-success.is-inverted.is-hovered{background-color:#f2f2f2}.button.is-success.is-inverted[disabled],fieldset[disabled] .button.is-success.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#22c35b}.button.is-success.is-loading::after{border-color:transparent transparent #fff #fff !important}.button.is-success.is-outlined{background-color:transparent;border-color:#22c35b;color:#22c35b}.button.is-success.is-outlined:hover,.button.is-success.is-outlined.is-hovered,.button.is-success.is-outlined:focus,.button.is-success.is-outlined.is-focused{background-color:#22c35b;border-color:#22c35b;color:#fff}.button.is-success.is-outlined.is-loading::after{border-color:transparent transparent #22c35b #22c35b !important}.button.is-success.is-outlined.is-loading:hover::after,.button.is-success.is-outlined.is-loading.is-hovered::after,.button.is-success.is-outlined.is-loading:focus::after,.button.is-success.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #fff #fff !important}.button.is-success.is-outlined[disabled],fieldset[disabled] .button.is-success.is-outlined{background-color:transparent;border-color:#22c35b;box-shadow:none;color:#22c35b}.button.is-success.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}.button.is-success.is-inverted.is-outlined:hover,.button.is-success.is-inverted.is-outlined.is-hovered,.button.is-success.is-inverted.is-outlined:focus,.button.is-success.is-inverted.is-outlined.is-focused{background-color:#fff;color:#22c35b}.button.is-success.is-inverted.is-outlined.is-loading:hover::after,.button.is-success.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-success.is-inverted.is-outlined.is-loading:focus::after,.button.is-success.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #22c35b #22c35b !important}.button.is-success.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-success.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}.button.is-success.is-light{background-color:#eefcf3;color:#198f43}.button.is-success.is-light:hover,.button.is-success.is-light.is-hovered{background-color:#e3faeb;border-color:transparent;color:#198f43}.button.is-success.is-light:active,.button.is-success.is-light.is-active{background-color:#d8f8e3;border-color:transparent;color:#198f43}.button.is-warning{background-color:#ffdd57;border-color:transparent;color:rgba(0,0,0,0.7)}.button.is-warning:hover,.button.is-warning.is-hovered{background-color:#ffda4a;border-color:transparent;color:rgba(0,0,0,0.7)}.button.is-warning:focus,.button.is-warning.is-focused{border-color:transparent;color:rgba(0,0,0,0.7)}.button.is-warning:focus:not(:active),.button.is-warning.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(255,221,87,0.25)}.button.is-warning:active,.button.is-warning.is-active{background-color:#ffd83e;border-color:transparent;color:rgba(0,0,0,0.7)}.button.is-warning[disabled],fieldset[disabled] .button.is-warning{background-color:#ffdd57;border-color:#ffdd57;box-shadow:none}.button.is-warning.is-inverted{background-color:rgba(0,0,0,0.7);color:#ffdd57}.button.is-warning.is-inverted:hover,.button.is-warning.is-inverted.is-hovered{background-color:rgba(0,0,0,0.7)}.button.is-warning.is-inverted[disabled],fieldset[disabled] .button.is-warning.is-inverted{background-color:rgba(0,0,0,0.7);border-color:transparent;box-shadow:none;color:#ffdd57}.button.is-warning.is-loading::after{border-color:transparent transparent rgba(0,0,0,0.7) rgba(0,0,0,0.7) !important}.button.is-warning.is-outlined{background-color:transparent;border-color:#ffdd57;color:#ffdd57}.button.is-warning.is-outlined:hover,.button.is-warning.is-outlined.is-hovered,.button.is-warning.is-outlined:focus,.button.is-warning.is-outlined.is-focused{background-color:#ffdd57;border-color:#ffdd57;color:rgba(0,0,0,0.7)}.button.is-warning.is-outlined.is-loading::after{border-color:transparent transparent #ffdd57 #ffdd57 !important}.button.is-warning.is-outlined.is-loading:hover::after,.button.is-warning.is-outlined.is-loading.is-hovered::after,.button.is-warning.is-outlined.is-loading:focus::after,.button.is-warning.is-outlined.is-loading.is-focused::after{border-color:transparent transparent rgba(0,0,0,0.7) rgba(0,0,0,0.7) !important}.button.is-warning.is-outlined[disabled],fieldset[disabled] .button.is-warning.is-outlined{background-color:transparent;border-color:#ffdd57;box-shadow:none;color:#ffdd57}.button.is-warning.is-inverted.is-outlined{background-color:transparent;border-color:rgba(0,0,0,0.7);color:rgba(0,0,0,0.7)}.button.is-warning.is-inverted.is-outlined:hover,.button.is-warning.is-inverted.is-outlined.is-hovered,.button.is-warning.is-inverted.is-outlined:focus,.button.is-warning.is-inverted.is-outlined.is-focused{background-color:rgba(0,0,0,0.7);color:#ffdd57}.button.is-warning.is-inverted.is-outlined.is-loading:hover::after,.button.is-warning.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-warning.is-inverted.is-outlined.is-loading:focus::after,.button.is-warning.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #ffdd57 #ffdd57 !important}.button.is-warning.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-warning.is-inverted.is-outlined{background-color:transparent;border-color:rgba(0,0,0,0.7);box-shadow:none;color:rgba(0,0,0,0.7)}.button.is-warning.is-light{background-color:#fffbeb;color:#947600}.button.is-warning.is-light:hover,.button.is-warning.is-light.is-hovered{background-color:#fff8de;border-color:transparent;color:#947600}.button.is-warning.is-light:active,.button.is-warning.is-light.is-active{background-color:#fff6d1;border-color:transparent;color:#947600}.button.is-danger{background-color:#da0b00;border-color:transparent;color:#fff}.button.is-danger:hover,.button.is-danger.is-hovered{background-color:#cd0a00;border-color:transparent;color:#fff}.button.is-danger:focus,.button.is-danger.is-focused{border-color:transparent;color:#fff}.button.is-danger:focus:not(:active),.button.is-danger.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(218,11,0,0.25)}.button.is-danger:active,.button.is-danger.is-active{background-color:#c10a00;border-color:transparent;color:#fff}.button.is-danger[disabled],fieldset[disabled] .button.is-danger{background-color:#da0b00;border-color:#da0b00;box-shadow:none}.button.is-danger.is-inverted{background-color:#fff;color:#da0b00}.button.is-danger.is-inverted:hover,.button.is-danger.is-inverted.is-hovered{background-color:#f2f2f2}.button.is-danger.is-inverted[disabled],fieldset[disabled] .button.is-danger.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#da0b00}.button.is-danger.is-loading::after{border-color:transparent transparent #fff #fff !important}.button.is-danger.is-outlined{background-color:transparent;border-color:#da0b00;color:#da0b00}.button.is-danger.is-outlined:hover,.button.is-danger.is-outlined.is-hovered,.button.is-danger.is-outlined:focus,.button.is-danger.is-outlined.is-focused{background-color:#da0b00;border-color:#da0b00;color:#fff}.button.is-danger.is-outlined.is-loading::after{border-color:transparent transparent #da0b00 #da0b00 !important}.button.is-danger.is-outlined.is-loading:hover::after,.button.is-danger.is-outlined.is-loading.is-hovered::after,.button.is-danger.is-outlined.is-loading:focus::after,.button.is-danger.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #fff #fff !important}.button.is-danger.is-outlined[disabled],fieldset[disabled] .button.is-danger.is-outlined{background-color:transparent;border-color:#da0b00;box-shadow:none;color:#da0b00}.button.is-danger.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}.button.is-danger.is-inverted.is-outlined:hover,.button.is-danger.is-inverted.is-outlined.is-hovered,.button.is-danger.is-inverted.is-outlined:focus,.button.is-danger.is-inverted.is-outlined.is-focused{background-color:#fff;color:#da0b00}.button.is-danger.is-inverted.is-outlined.is-loading:hover::after,.button.is-danger.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-danger.is-inverted.is-outlined.is-loading:focus::after,.button.is-danger.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #da0b00 #da0b00 !important}.button.is-danger.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-danger.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}.button.is-danger.is-light{background-color:#ffeceb;color:#f50c00}.button.is-danger.is-light:hover,.button.is-danger.is-light.is-hovered{background-color:#ffe0de;border-color:transparent;color:#f50c00}.button.is-danger.is-light:active,.button.is-danger.is-light.is-active{background-color:#ffd3d1;border-color:transparent;color:#f50c00}.button.is-small,#documenter .docs-sidebar form.docs-search>input.button{font-size:.75rem}.button.is-small:not(.is-rounded),#documenter .docs-sidebar form.docs-search>input.button:not(.is-rounded){border-radius:2px}.button.is-normal{font-size:1rem}.button.is-medium{font-size:1.25rem}.button.is-large{font-size:1.5rem}.button[disabled],fieldset[disabled] .button{background-color:#fff;border-color:#dbdbdb;box-shadow:none;opacity:.5}.button.is-fullwidth{display:flex;width:100%}.button.is-loading{color:transparent !important;pointer-events:none}.button.is-loading::after{position:absolute;left:calc(50% - (1em * 0.5));top:calc(50% - (1em * 0.5));position:absolute !important}.button.is-static{background-color:#f5f5f5;border-color:#dbdbdb;color:#6b6b6b;box-shadow:none;pointer-events:none}.button.is-rounded,#documenter .docs-sidebar form.docs-search>input.button{border-radius:9999px;padding-left:calc(1em + 0.25em);padding-right:calc(1em + 0.25em)}.buttons{align-items:center;display:flex;flex-wrap:wrap;justify-content:flex-start}.buttons .button{margin-bottom:0.5rem}.buttons .button:not(:last-child):not(.is-fullwidth){margin-right:.5rem}.buttons:last-child{margin-bottom:-0.5rem}.buttons:not(:last-child){margin-bottom:1rem}.buttons.are-small .button:not(.is-normal):not(.is-medium):not(.is-large){font-size:.75rem}.buttons.are-small .button:not(.is-normal):not(.is-medium):not(.is-large):not(.is-rounded){border-radius:2px}.buttons.are-medium .button:not(.is-small):not(.is-normal):not(.is-large){font-size:1.25rem}.buttons.are-large .button:not(.is-small):not(.is-normal):not(.is-medium){font-size:1.5rem}.buttons.has-addons .button:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}.buttons.has-addons .button:not(:last-child){border-bottom-right-radius:0;border-top-right-radius:0;margin-right:-1px}.buttons.has-addons .button:last-child{margin-right:0}.buttons.has-addons .button:hover,.buttons.has-addons .button.is-hovered{z-index:2}.buttons.has-addons .button:focus,.buttons.has-addons .button.is-focused,.buttons.has-addons .button:active,.buttons.has-addons .button.is-active,.buttons.has-addons .button.is-selected{z-index:3}.buttons.has-addons .button:focus:hover,.buttons.has-addons .button.is-focused:hover,.buttons.has-addons .button:active:hover,.buttons.has-addons .button.is-active:hover,.buttons.has-addons .button.is-selected:hover{z-index:4}.buttons.has-addons .button.is-expanded{flex-grow:1;flex-shrink:1}.buttons.is-centered{justify-content:center}.buttons.is-centered:not(.has-addons) .button:not(.is-fullwidth){margin-left:0.25rem;margin-right:0.25rem}.buttons.is-right{justify-content:flex-end}.buttons.is-right:not(.has-addons) .button:not(.is-fullwidth){margin-left:0.25rem;margin-right:0.25rem}@media screen and (max-width: 768px){.button.is-responsive.is-small,#documenter .docs-sidebar form.docs-search>input.is-responsive{font-size:.5625rem}.button.is-responsive,.button.is-responsive.is-normal{font-size:.65625rem}.button.is-responsive.is-medium{font-size:.75rem}.button.is-responsive.is-large{font-size:1rem}}@media screen and (min-width: 769px) and (max-width: 1055px){.button.is-responsive.is-small,#documenter .docs-sidebar form.docs-search>input.is-responsive{font-size:.65625rem}.button.is-responsive,.button.is-responsive.is-normal{font-size:.75rem}.button.is-responsive.is-medium{font-size:1rem}.button.is-responsive.is-large{font-size:1.25rem}}.container{flex-grow:1;margin:0 auto;position:relative;width:auto}.container.is-fluid{max-width:none !important;padding-left:32px;padding-right:32px;width:100%}@media screen and (min-width: 1056px){.container{max-width:992px}}@media screen and (max-width: 1215px){.container.is-widescreen:not(.is-max-desktop){max-width:1152px}}@media screen and (max-width: 1407px){.container.is-fullhd:not(.is-max-desktop):not(.is-max-widescreen){max-width:1344px}}@media screen and (min-width: 1216px){.container:not(.is-max-desktop){max-width:1152px}}@media screen and (min-width: 1408px){.container:not(.is-max-desktop):not(.is-max-widescreen){max-width:1344px}}.content li+li{margin-top:0.25em}.content p:not(:last-child),.content dl:not(:last-child),.content ol:not(:last-child),.content ul:not(:last-child),.content blockquote:not(:last-child),.content pre:not(:last-child),.content table:not(:last-child){margin-bottom:1em}.content h1,.content h2,.content h3,.content h4,.content h5,.content h6{color:#222;font-weight:600;line-height:1.125}.content h1{font-size:2em;margin-bottom:0.5em}.content h1:not(:first-child){margin-top:1em}.content h2{font-size:1.75em;margin-bottom:0.5714em}.content h2:not(:first-child){margin-top:1.1428em}.content h3{font-size:1.5em;margin-bottom:0.6666em}.content h3:not(:first-child){margin-top:1.3333em}.content h4{font-size:1.25em;margin-bottom:0.8em}.content h5{font-size:1.125em;margin-bottom:0.8888em}.content h6{font-size:1em;margin-bottom:1em}.content blockquote{background-color:#f5f5f5;border-left:5px solid #dbdbdb;padding:1.25em 1.5em}.content ol{list-style-position:outside;margin-left:2em;margin-top:1em}.content ol:not([type]){list-style-type:decimal}.content ol.is-lower-alpha:not([type]){list-style-type:lower-alpha}.content ol.is-lower-roman:not([type]){list-style-type:lower-roman}.content ol.is-upper-alpha:not([type]){list-style-type:upper-alpha}.content ol.is-upper-roman:not([type]){list-style-type:upper-roman}.content ul{list-style:disc outside;margin-left:2em;margin-top:1em}.content ul ul{list-style-type:circle;margin-top:0.5em}.content ul ul ul{list-style-type:square}.content dd{margin-left:2em}.content figure{margin-left:2em;margin-right:2em;text-align:center}.content figure:not(:first-child){margin-top:2em}.content figure:not(:last-child){margin-bottom:2em}.content figure img{display:inline-block}.content figure figcaption{font-style:italic}.content pre{-webkit-overflow-scrolling:touch;overflow-x:auto;padding:0;white-space:pre;word-wrap:normal}.content sup,.content sub{font-size:75%}.content table{width:100%}.content table td,.content table th{border:1px solid #dbdbdb;border-width:0 0 1px;padding:0.5em 0.75em;vertical-align:top}.content table th{color:#222}.content table th:not([align]){text-align:inherit}.content table thead td,.content table thead th{border-width:0 0 2px;color:#222}.content table tfoot td,.content table tfoot th{border-width:2px 0 0;color:#222}.content table tbody tr:last-child td,.content table tbody tr:last-child th{border-bottom-width:0}.content .tabs li+li{margin-top:0}.content.is-small,#documenter .docs-sidebar form.docs-search>input.content{font-size:.75rem}.content.is-normal{font-size:1rem}.content.is-medium{font-size:1.25rem}.content.is-large{font-size:1.5rem}.icon{align-items:center;display:inline-flex;justify-content:center;height:1.5rem;width:1.5rem}.icon.is-small,#documenter .docs-sidebar form.docs-search>input.icon{height:1rem;width:1rem}.icon.is-medium{height:2rem;width:2rem}.icon.is-large{height:3rem;width:3rem}.icon-text{align-items:flex-start;color:inherit;display:inline-flex;flex-wrap:wrap;line-height:1.5rem;vertical-align:top}.icon-text .icon{flex-grow:0;flex-shrink:0}.icon-text .icon:not(:last-child){margin-right:.25em}.icon-text .icon:not(:first-child){margin-left:.25em}div.icon-text{display:flex}.image,#documenter .docs-sidebar .docs-logo>img{display:block;position:relative}.image img,#documenter .docs-sidebar .docs-logo>img img{display:block;height:auto;width:100%}.image img.is-rounded,#documenter .docs-sidebar .docs-logo>img img.is-rounded{border-radius:9999px}.image.is-fullwidth,#documenter .docs-sidebar .docs-logo>img.is-fullwidth{width:100%}.image.is-square img,#documenter .docs-sidebar .docs-logo>img.is-square img,.image.is-square .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-square .has-ratio,.image.is-1by1 img,#documenter .docs-sidebar .docs-logo>img.is-1by1 img,.image.is-1by1 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-1by1 .has-ratio,.image.is-5by4 img,#documenter .docs-sidebar .docs-logo>img.is-5by4 img,.image.is-5by4 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-5by4 .has-ratio,.image.is-4by3 img,#documenter .docs-sidebar .docs-logo>img.is-4by3 img,.image.is-4by3 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-4by3 .has-ratio,.image.is-3by2 img,#documenter .docs-sidebar .docs-logo>img.is-3by2 img,.image.is-3by2 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-3by2 .has-ratio,.image.is-5by3 img,#documenter .docs-sidebar .docs-logo>img.is-5by3 img,.image.is-5by3 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-5by3 .has-ratio,.image.is-16by9 img,#documenter .docs-sidebar .docs-logo>img.is-16by9 img,.image.is-16by9 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-16by9 .has-ratio,.image.is-2by1 img,#documenter .docs-sidebar .docs-logo>img.is-2by1 img,.image.is-2by1 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-2by1 .has-ratio,.image.is-3by1 img,#documenter .docs-sidebar .docs-logo>img.is-3by1 img,.image.is-3by1 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-3by1 .has-ratio,.image.is-4by5 img,#documenter .docs-sidebar .docs-logo>img.is-4by5 img,.image.is-4by5 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-4by5 .has-ratio,.image.is-3by4 img,#documenter .docs-sidebar .docs-logo>img.is-3by4 img,.image.is-3by4 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-3by4 .has-ratio,.image.is-2by3 img,#documenter .docs-sidebar .docs-logo>img.is-2by3 img,.image.is-2by3 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-2by3 .has-ratio,.image.is-3by5 img,#documenter .docs-sidebar .docs-logo>img.is-3by5 img,.image.is-3by5 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-3by5 .has-ratio,.image.is-9by16 img,#documenter .docs-sidebar .docs-logo>img.is-9by16 img,.image.is-9by16 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-9by16 .has-ratio,.image.is-1by2 img,#documenter .docs-sidebar .docs-logo>img.is-1by2 img,.image.is-1by2 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-1by2 .has-ratio,.image.is-1by3 img,#documenter .docs-sidebar .docs-logo>img.is-1by3 img,.image.is-1by3 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-1by3 .has-ratio{height:100%;width:100%}.image.is-square,#documenter .docs-sidebar .docs-logo>img.is-square,.image.is-1by1,#documenter .docs-sidebar .docs-logo>img.is-1by1{padding-top:100%}.image.is-5by4,#documenter .docs-sidebar .docs-logo>img.is-5by4{padding-top:80%}.image.is-4by3,#documenter .docs-sidebar .docs-logo>img.is-4by3{padding-top:75%}.image.is-3by2,#documenter .docs-sidebar .docs-logo>img.is-3by2{padding-top:66.6666%}.image.is-5by3,#documenter .docs-sidebar .docs-logo>img.is-5by3{padding-top:60%}.image.is-16by9,#documenter .docs-sidebar .docs-logo>img.is-16by9{padding-top:56.25%}.image.is-2by1,#documenter .docs-sidebar .docs-logo>img.is-2by1{padding-top:50%}.image.is-3by1,#documenter .docs-sidebar .docs-logo>img.is-3by1{padding-top:33.3333%}.image.is-4by5,#documenter .docs-sidebar .docs-logo>img.is-4by5{padding-top:125%}.image.is-3by4,#documenter .docs-sidebar .docs-logo>img.is-3by4{padding-top:133.3333%}.image.is-2by3,#documenter .docs-sidebar .docs-logo>img.is-2by3{padding-top:150%}.image.is-3by5,#documenter .docs-sidebar .docs-logo>img.is-3by5{padding-top:166.6666%}.image.is-9by16,#documenter .docs-sidebar .docs-logo>img.is-9by16{padding-top:177.7777%}.image.is-1by2,#documenter .docs-sidebar .docs-logo>img.is-1by2{padding-top:200%}.image.is-1by3,#documenter .docs-sidebar .docs-logo>img.is-1by3{padding-top:300%}.image.is-16x16,#documenter .docs-sidebar .docs-logo>img.is-16x16{height:16px;width:16px}.image.is-24x24,#documenter .docs-sidebar .docs-logo>img.is-24x24{height:24px;width:24px}.image.is-32x32,#documenter .docs-sidebar .docs-logo>img.is-32x32{height:32px;width:32px}.image.is-48x48,#documenter .docs-sidebar .docs-logo>img.is-48x48{height:48px;width:48px}.image.is-64x64,#documenter .docs-sidebar .docs-logo>img.is-64x64{height:64px;width:64px}.image.is-96x96,#documenter .docs-sidebar .docs-logo>img.is-96x96{height:96px;width:96px}.image.is-128x128,#documenter .docs-sidebar .docs-logo>img.is-128x128{height:128px;width:128px}.notification{background-color:#f5f5f5;border-radius:4px;position:relative;padding:1.25rem 2.5rem 1.25rem 1.5rem}.notification a:not(.button):not(.dropdown-item){color:currentColor;text-decoration:underline}.notification strong{color:currentColor}.notification code,.notification pre{background:#fff}.notification pre code{background:transparent}.notification>.delete{right:.5rem;position:absolute;top:0.5rem}.notification .title,.notification .subtitle,.notification .content{color:currentColor}.notification.is-white{background-color:#fff;color:#0a0a0a}.notification.is-black{background-color:#0a0a0a;color:#fff}.notification.is-light{background-color:#f5f5f5;color:rgba(0,0,0,0.7)}.notification.is-dark,.content kbd.notification{background-color:#363636;color:#fff}.notification.is-primary,.docstring>section>a.notification.docs-sourcelink{background-color:#4eb5de;color:#fff}.notification.is-primary.is-light,.docstring>section>a.notification.is-light.docs-sourcelink{background-color:#eef8fc;color:#1a6d8e}.notification.is-link{background-color:#2e63b8;color:#fff}.notification.is-link.is-light{background-color:#eff3fb;color:#3169c4}.notification.is-info{background-color:#209cee;color:#fff}.notification.is-info.is-light{background-color:#ecf7fe;color:#0e72b4}.notification.is-success{background-color:#22c35b;color:#fff}.notification.is-success.is-light{background-color:#eefcf3;color:#198f43}.notification.is-warning{background-color:#ffdd57;color:rgba(0,0,0,0.7)}.notification.is-warning.is-light{background-color:#fffbeb;color:#947600}.notification.is-danger{background-color:#da0b00;color:#fff}.notification.is-danger.is-light{background-color:#ffeceb;color:#f50c00}.progress{-moz-appearance:none;-webkit-appearance:none;border:none;border-radius:9999px;display:block;height:1rem;overflow:hidden;padding:0;width:100%}.progress::-webkit-progress-bar{background-color:#ededed}.progress::-webkit-progress-value{background-color:#222}.progress::-moz-progress-bar{background-color:#222}.progress::-ms-fill{background-color:#222;border:none}.progress.is-white::-webkit-progress-value{background-color:#fff}.progress.is-white::-moz-progress-bar{background-color:#fff}.progress.is-white::-ms-fill{background-color:#fff}.progress.is-white:indeterminate{background-image:linear-gradient(to right, #fff 30%, #ededed 30%)}.progress.is-black::-webkit-progress-value{background-color:#0a0a0a}.progress.is-black::-moz-progress-bar{background-color:#0a0a0a}.progress.is-black::-ms-fill{background-color:#0a0a0a}.progress.is-black:indeterminate{background-image:linear-gradient(to right, #0a0a0a 30%, #ededed 30%)}.progress.is-light::-webkit-progress-value{background-color:#f5f5f5}.progress.is-light::-moz-progress-bar{background-color:#f5f5f5}.progress.is-light::-ms-fill{background-color:#f5f5f5}.progress.is-light:indeterminate{background-image:linear-gradient(to right, #f5f5f5 30%, #ededed 30%)}.progress.is-dark::-webkit-progress-value,.content kbd.progress::-webkit-progress-value{background-color:#363636}.progress.is-dark::-moz-progress-bar,.content kbd.progress::-moz-progress-bar{background-color:#363636}.progress.is-dark::-ms-fill,.content kbd.progress::-ms-fill{background-color:#363636}.progress.is-dark:indeterminate,.content kbd.progress:indeterminate{background-image:linear-gradient(to right, #363636 30%, #ededed 30%)}.progress.is-primary::-webkit-progress-value,.docstring>section>a.progress.docs-sourcelink::-webkit-progress-value{background-color:#4eb5de}.progress.is-primary::-moz-progress-bar,.docstring>section>a.progress.docs-sourcelink::-moz-progress-bar{background-color:#4eb5de}.progress.is-primary::-ms-fill,.docstring>section>a.progress.docs-sourcelink::-ms-fill{background-color:#4eb5de}.progress.is-primary:indeterminate,.docstring>section>a.progress.docs-sourcelink:indeterminate{background-image:linear-gradient(to right, #4eb5de 30%, #ededed 30%)}.progress.is-link::-webkit-progress-value{background-color:#2e63b8}.progress.is-link::-moz-progress-bar{background-color:#2e63b8}.progress.is-link::-ms-fill{background-color:#2e63b8}.progress.is-link:indeterminate{background-image:linear-gradient(to right, #2e63b8 30%, #ededed 30%)}.progress.is-info::-webkit-progress-value{background-color:#209cee}.progress.is-info::-moz-progress-bar{background-color:#209cee}.progress.is-info::-ms-fill{background-color:#209cee}.progress.is-info:indeterminate{background-image:linear-gradient(to right, #209cee 30%, #ededed 30%)}.progress.is-success::-webkit-progress-value{background-color:#22c35b}.progress.is-success::-moz-progress-bar{background-color:#22c35b}.progress.is-success::-ms-fill{background-color:#22c35b}.progress.is-success:indeterminate{background-image:linear-gradient(to right, #22c35b 30%, #ededed 30%)}.progress.is-warning::-webkit-progress-value{background-color:#ffdd57}.progress.is-warning::-moz-progress-bar{background-color:#ffdd57}.progress.is-warning::-ms-fill{background-color:#ffdd57}.progress.is-warning:indeterminate{background-image:linear-gradient(to right, #ffdd57 30%, #ededed 30%)}.progress.is-danger::-webkit-progress-value{background-color:#da0b00}.progress.is-danger::-moz-progress-bar{background-color:#da0b00}.progress.is-danger::-ms-fill{background-color:#da0b00}.progress.is-danger:indeterminate{background-image:linear-gradient(to right, #da0b00 30%, #ededed 30%)}.progress:indeterminate{animation-duration:1.5s;animation-iteration-count:infinite;animation-name:moveIndeterminate;animation-timing-function:linear;background-color:#ededed;background-image:linear-gradient(to right, #222 30%, #ededed 30%);background-position:top left;background-repeat:no-repeat;background-size:150% 150%}.progress:indeterminate::-webkit-progress-bar{background-color:transparent}.progress:indeterminate::-moz-progress-bar{background-color:transparent}.progress:indeterminate::-ms-fill{animation-name:none}.progress.is-small,#documenter .docs-sidebar form.docs-search>input.progress{height:.75rem}.progress.is-medium{height:1.25rem}.progress.is-large{height:1.5rem}@keyframes moveIndeterminate{from{background-position:200% 0}to{background-position:-200% 0}}.table{background-color:#fff;color:#222}.table td,.table th{border:1px solid #dbdbdb;border-width:0 0 1px;padding:0.5em 0.75em;vertical-align:top}.table td.is-white,.table th.is-white{background-color:#fff;border-color:#fff;color:#0a0a0a}.table td.is-black,.table th.is-black{background-color:#0a0a0a;border-color:#0a0a0a;color:#fff}.table td.is-light,.table th.is-light{background-color:#f5f5f5;border-color:#f5f5f5;color:rgba(0,0,0,0.7)}.table td.is-dark,.table th.is-dark{background-color:#363636;border-color:#363636;color:#fff}.table td.is-primary,.table th.is-primary{background-color:#4eb5de;border-color:#4eb5de;color:#fff}.table td.is-link,.table th.is-link{background-color:#2e63b8;border-color:#2e63b8;color:#fff}.table td.is-info,.table th.is-info{background-color:#209cee;border-color:#209cee;color:#fff}.table td.is-success,.table th.is-success{background-color:#22c35b;border-color:#22c35b;color:#fff}.table td.is-warning,.table th.is-warning{background-color:#ffdd57;border-color:#ffdd57;color:rgba(0,0,0,0.7)}.table td.is-danger,.table th.is-danger{background-color:#da0b00;border-color:#da0b00;color:#fff}.table td.is-narrow,.table th.is-narrow{white-space:nowrap;width:1%}.table td.is-selected,.table th.is-selected{background-color:#4eb5de;color:#fff}.table td.is-selected a,.table td.is-selected strong,.table th.is-selected a,.table th.is-selected strong{color:currentColor}.table td.is-vcentered,.table th.is-vcentered{vertical-align:middle}.table th{color:#222}.table th:not([align]){text-align:left}.table tr.is-selected{background-color:#4eb5de;color:#fff}.table tr.is-selected a,.table tr.is-selected strong{color:currentColor}.table tr.is-selected td,.table tr.is-selected th{border-color:#fff;color:currentColor}.table thead{background-color:rgba(0,0,0,0)}.table thead td,.table thead th{border-width:0 0 2px;color:#222}.table tfoot{background-color:rgba(0,0,0,0)}.table tfoot td,.table tfoot th{border-width:2px 0 0;color:#222}.table tbody{background-color:rgba(0,0,0,0)}.table tbody tr:last-child td,.table tbody tr:last-child th{border-bottom-width:0}.table.is-bordered td,.table.is-bordered th{border-width:1px}.table.is-bordered tr:last-child td,.table.is-bordered tr:last-child th{border-bottom-width:1px}.table.is-fullwidth{width:100%}.table.is-hoverable tbody tr:not(.is-selected):hover{background-color:#fafafa}.table.is-hoverable.is-striped tbody tr:not(.is-selected):hover{background-color:#fafafa}.table.is-hoverable.is-striped tbody tr:not(.is-selected):hover:nth-child(even){background-color:#f5f5f5}.table.is-narrow td,.table.is-narrow th{padding:0.25em 0.5em}.table.is-striped tbody tr:not(.is-selected):nth-child(even){background-color:#fafafa}.table-container{-webkit-overflow-scrolling:touch;overflow:auto;overflow-y:hidden;max-width:100%}.tags{align-items:center;display:flex;flex-wrap:wrap;justify-content:flex-start}.tags .tag,.tags .content kbd,.content .tags kbd,.tags .docstring>section>a.docs-sourcelink{margin-bottom:0.5rem}.tags .tag:not(:last-child),.tags .content kbd:not(:last-child),.content .tags kbd:not(:last-child),.tags .docstring>section>a.docs-sourcelink:not(:last-child){margin-right:.5rem}.tags:last-child{margin-bottom:-0.5rem}.tags:not(:last-child){margin-bottom:1rem}.tags.are-medium .tag:not(.is-normal):not(.is-large),.tags.are-medium .content kbd:not(.is-normal):not(.is-large),.content .tags.are-medium kbd:not(.is-normal):not(.is-large),.tags.are-medium .docstring>section>a.docs-sourcelink:not(.is-normal):not(.is-large){font-size:1rem}.tags.are-large .tag:not(.is-normal):not(.is-medium),.tags.are-large .content kbd:not(.is-normal):not(.is-medium),.content .tags.are-large kbd:not(.is-normal):not(.is-medium),.tags.are-large .docstring>section>a.docs-sourcelink:not(.is-normal):not(.is-medium){font-size:1.25rem}.tags.is-centered{justify-content:center}.tags.is-centered .tag,.tags.is-centered .content kbd,.content .tags.is-centered kbd,.tags.is-centered .docstring>section>a.docs-sourcelink{margin-right:0.25rem;margin-left:0.25rem}.tags.is-right{justify-content:flex-end}.tags.is-right .tag:not(:first-child),.tags.is-right .content kbd:not(:first-child),.content .tags.is-right kbd:not(:first-child),.tags.is-right .docstring>section>a.docs-sourcelink:not(:first-child){margin-left:0.5rem}.tags.is-right .tag:not(:last-child),.tags.is-right .content kbd:not(:last-child),.content .tags.is-right kbd:not(:last-child),.tags.is-right .docstring>section>a.docs-sourcelink:not(:last-child){margin-right:0}.tags.has-addons .tag,.tags.has-addons .content kbd,.content .tags.has-addons kbd,.tags.has-addons .docstring>section>a.docs-sourcelink{margin-right:0}.tags.has-addons .tag:not(:first-child),.tags.has-addons .content kbd:not(:first-child),.content .tags.has-addons kbd:not(:first-child),.tags.has-addons .docstring>section>a.docs-sourcelink:not(:first-child){margin-left:0;border-top-left-radius:0;border-bottom-left-radius:0}.tags.has-addons .tag:not(:last-child),.tags.has-addons .content kbd:not(:last-child),.content .tags.has-addons kbd:not(:last-child),.tags.has-addons .docstring>section>a.docs-sourcelink:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.tag:not(body),.content kbd:not(body),.docstring>section>a.docs-sourcelink:not(body){align-items:center;background-color:#f5f5f5;border-radius:4px;color:#222;display:inline-flex;font-size:.75rem;height:2em;justify-content:center;line-height:1.5;padding-left:0.75em;padding-right:0.75em;white-space:nowrap}.tag:not(body) .delete,.content kbd:not(body) .delete,.docstring>section>a.docs-sourcelink:not(body) .delete{margin-left:.25rem;margin-right:-.375rem}.tag.is-white:not(body),.content kbd.is-white:not(body),.docstring>section>a.docs-sourcelink.is-white:not(body){background-color:#fff;color:#0a0a0a}.tag.is-black:not(body),.content kbd.is-black:not(body),.docstring>section>a.docs-sourcelink.is-black:not(body){background-color:#0a0a0a;color:#fff}.tag.is-light:not(body),.content kbd.is-light:not(body),.docstring>section>a.docs-sourcelink.is-light:not(body){background-color:#f5f5f5;color:rgba(0,0,0,0.7)}.tag.is-dark:not(body),.content kbd:not(body),.docstring>section>a.docs-sourcelink.is-dark:not(body),.content .docstring>section>kbd:not(body){background-color:#363636;color:#fff}.tag.is-primary:not(body),.content kbd.is-primary:not(body),.docstring>section>a.docs-sourcelink:not(body){background-color:#4eb5de;color:#fff}.tag.is-primary.is-light:not(body),.content kbd.is-primary.is-light:not(body),.docstring>section>a.docs-sourcelink.is-light:not(body){background-color:#eef8fc;color:#1a6d8e}.tag.is-link:not(body),.content kbd.is-link:not(body),.docstring>section>a.docs-sourcelink.is-link:not(body){background-color:#2e63b8;color:#fff}.tag.is-link.is-light:not(body),.content kbd.is-link.is-light:not(body),.docstring>section>a.docs-sourcelink.is-link.is-light:not(body){background-color:#eff3fb;color:#3169c4}.tag.is-info:not(body),.content kbd.is-info:not(body),.docstring>section>a.docs-sourcelink.is-info:not(body){background-color:#209cee;color:#fff}.tag.is-info.is-light:not(body),.content kbd.is-info.is-light:not(body),.docstring>section>a.docs-sourcelink.is-info.is-light:not(body){background-color:#ecf7fe;color:#0e72b4}.tag.is-success:not(body),.content kbd.is-success:not(body),.docstring>section>a.docs-sourcelink.is-success:not(body){background-color:#22c35b;color:#fff}.tag.is-success.is-light:not(body),.content kbd.is-success.is-light:not(body),.docstring>section>a.docs-sourcelink.is-success.is-light:not(body){background-color:#eefcf3;color:#198f43}.tag.is-warning:not(body),.content kbd.is-warning:not(body),.docstring>section>a.docs-sourcelink.is-warning:not(body){background-color:#ffdd57;color:rgba(0,0,0,0.7)}.tag.is-warning.is-light:not(body),.content kbd.is-warning.is-light:not(body),.docstring>section>a.docs-sourcelink.is-warning.is-light:not(body){background-color:#fffbeb;color:#947600}.tag.is-danger:not(body),.content kbd.is-danger:not(body),.docstring>section>a.docs-sourcelink.is-danger:not(body){background-color:#da0b00;color:#fff}.tag.is-danger.is-light:not(body),.content kbd.is-danger.is-light:not(body),.docstring>section>a.docs-sourcelink.is-danger.is-light:not(body){background-color:#ffeceb;color:#f50c00}.tag.is-normal:not(body),.content kbd.is-normal:not(body),.docstring>section>a.docs-sourcelink.is-normal:not(body){font-size:.75rem}.tag.is-medium:not(body),.content kbd.is-medium:not(body),.docstring>section>a.docs-sourcelink.is-medium:not(body){font-size:1rem}.tag.is-large:not(body),.content kbd.is-large:not(body),.docstring>section>a.docs-sourcelink.is-large:not(body){font-size:1.25rem}.tag:not(body) .icon:first-child:not(:last-child),.content kbd:not(body) .icon:first-child:not(:last-child),.docstring>section>a.docs-sourcelink:not(body) .icon:first-child:not(:last-child){margin-left:-.375em;margin-right:.1875em}.tag:not(body) .icon:last-child:not(:first-child),.content kbd:not(body) .icon:last-child:not(:first-child),.docstring>section>a.docs-sourcelink:not(body) .icon:last-child:not(:first-child){margin-left:.1875em;margin-right:-.375em}.tag:not(body) .icon:first-child:last-child,.content kbd:not(body) .icon:first-child:last-child,.docstring>section>a.docs-sourcelink:not(body) .icon:first-child:last-child{margin-left:-.375em;margin-right:-.375em}.tag.is-delete:not(body),.content kbd.is-delete:not(body),.docstring>section>a.docs-sourcelink.is-delete:not(body){margin-left:1px;padding:0;position:relative;width:2em}.tag.is-delete:not(body)::before,.content kbd.is-delete:not(body)::before,.docstring>section>a.docs-sourcelink.is-delete:not(body)::before,.tag.is-delete:not(body)::after,.content kbd.is-delete:not(body)::after,.docstring>section>a.docs-sourcelink.is-delete:not(body)::after{background-color:currentColor;content:"";display:block;left:50%;position:absolute;top:50%;transform:translateX(-50%) translateY(-50%) rotate(45deg);transform-origin:center center}.tag.is-delete:not(body)::before,.content kbd.is-delete:not(body)::before,.docstring>section>a.docs-sourcelink.is-delete:not(body)::before{height:1px;width:50%}.tag.is-delete:not(body)::after,.content kbd.is-delete:not(body)::after,.docstring>section>a.docs-sourcelink.is-delete:not(body)::after{height:50%;width:1px}.tag.is-delete:not(body):hover,.content kbd.is-delete:not(body):hover,.docstring>section>a.docs-sourcelink.is-delete:not(body):hover,.tag.is-delete:not(body):focus,.content kbd.is-delete:not(body):focus,.docstring>section>a.docs-sourcelink.is-delete:not(body):focus{background-color:#e8e8e8}.tag.is-delete:not(body):active,.content kbd.is-delete:not(body):active,.docstring>section>a.docs-sourcelink.is-delete:not(body):active{background-color:#dbdbdb}.tag.is-rounded:not(body),#documenter .docs-sidebar form.docs-search>input:not(body),.content kbd.is-rounded:not(body),#documenter .docs-sidebar .content form.docs-search>input:not(body),.docstring>section>a.docs-sourcelink.is-rounded:not(body){border-radius:9999px}a.tag:hover,.docstring>section>a.docs-sourcelink:hover{text-decoration:underline}.title,.subtitle{word-break:break-word}.title em,.title span,.subtitle em,.subtitle span{font-weight:inherit}.title sub,.subtitle sub{font-size:.75em}.title sup,.subtitle sup{font-size:.75em}.title .tag,.title .content kbd,.content .title kbd,.title .docstring>section>a.docs-sourcelink,.subtitle .tag,.subtitle .content kbd,.content .subtitle kbd,.subtitle .docstring>section>a.docs-sourcelink{vertical-align:middle}.title{color:#222;font-size:2rem;font-weight:600;line-height:1.125}.title strong{color:inherit;font-weight:inherit}.title:not(.is-spaced)+.subtitle{margin-top:-1.25rem}.title.is-1{font-size:3rem}.title.is-2{font-size:2.5rem}.title.is-3{font-size:2rem}.title.is-4{font-size:1.5rem}.title.is-5{font-size:1.25rem}.title.is-6{font-size:1rem}.title.is-7{font-size:.75rem}.subtitle{color:#222;font-size:1.25rem;font-weight:400;line-height:1.25}.subtitle strong{color:#222;font-weight:600}.subtitle:not(.is-spaced)+.title{margin-top:-1.25rem}.subtitle.is-1{font-size:3rem}.subtitle.is-2{font-size:2.5rem}.subtitle.is-3{font-size:2rem}.subtitle.is-4{font-size:1.5rem}.subtitle.is-5{font-size:1.25rem}.subtitle.is-6{font-size:1rem}.subtitle.is-7{font-size:.75rem}.heading{display:block;font-size:11px;letter-spacing:1px;margin-bottom:5px;text-transform:uppercase}.number{align-items:center;background-color:#f5f5f5;border-radius:9999px;display:inline-flex;font-size:1.25rem;height:2em;justify-content:center;margin-right:1.5rem;min-width:2.5em;padding:0.25rem 0.5rem;text-align:center;vertical-align:top}.select select,.textarea,.input,#documenter .docs-sidebar form.docs-search>input{background-color:#fff;border-color:#dbdbdb;border-radius:4px;color:#222}.select select::-moz-placeholder,.textarea::-moz-placeholder,.input::-moz-placeholder,#documenter .docs-sidebar form.docs-search>input::-moz-placeholder{color:#707070}.select select::-webkit-input-placeholder,.textarea::-webkit-input-placeholder,.input::-webkit-input-placeholder,#documenter .docs-sidebar form.docs-search>input::-webkit-input-placeholder{color:#707070}.select select:-moz-placeholder,.textarea:-moz-placeholder,.input:-moz-placeholder,#documenter .docs-sidebar form.docs-search>input:-moz-placeholder{color:#707070}.select select:-ms-input-placeholder,.textarea:-ms-input-placeholder,.input:-ms-input-placeholder,#documenter .docs-sidebar form.docs-search>input:-ms-input-placeholder{color:#707070}.select select:hover,.textarea:hover,.input:hover,#documenter .docs-sidebar form.docs-search>input:hover,.select select.is-hovered,.is-hovered.textarea,.is-hovered.input,#documenter .docs-sidebar form.docs-search>input.is-hovered{border-color:#b5b5b5}.select select:focus,.textarea:focus,.input:focus,#documenter .docs-sidebar form.docs-search>input:focus,.select select.is-focused,.is-focused.textarea,.is-focused.input,#documenter .docs-sidebar form.docs-search>input.is-focused,.select select:active,.textarea:active,.input:active,#documenter .docs-sidebar form.docs-search>input:active,.select select.is-active,.is-active.textarea,.is-active.input,#documenter .docs-sidebar form.docs-search>input.is-active{border-color:#2e63b8;box-shadow:0 0 0 0.125em rgba(46,99,184,0.25)}.select select[disabled],.textarea[disabled],.input[disabled],#documenter .docs-sidebar form.docs-search>input[disabled],fieldset[disabled] .select select,.select fieldset[disabled] select,fieldset[disabled] .textarea,fieldset[disabled] .input,fieldset[disabled] #documenter .docs-sidebar form.docs-search>input,#documenter .docs-sidebar fieldset[disabled] form.docs-search>input{background-color:#f5f5f5;border-color:#f5f5f5;box-shadow:none;color:#6b6b6b}.select select[disabled]::-moz-placeholder,.textarea[disabled]::-moz-placeholder,.input[disabled]::-moz-placeholder,#documenter .docs-sidebar form.docs-search>input[disabled]::-moz-placeholder,fieldset[disabled] .select select::-moz-placeholder,.select fieldset[disabled] select::-moz-placeholder,fieldset[disabled] .textarea::-moz-placeholder,fieldset[disabled] .input::-moz-placeholder,fieldset[disabled] #documenter .docs-sidebar form.docs-search>input::-moz-placeholder,#documenter .docs-sidebar fieldset[disabled] form.docs-search>input::-moz-placeholder{color:rgba(107,107,107,0.3)}.select select[disabled]::-webkit-input-placeholder,.textarea[disabled]::-webkit-input-placeholder,.input[disabled]::-webkit-input-placeholder,#documenter .docs-sidebar form.docs-search>input[disabled]::-webkit-input-placeholder,fieldset[disabled] .select select::-webkit-input-placeholder,.select fieldset[disabled] select::-webkit-input-placeholder,fieldset[disabled] .textarea::-webkit-input-placeholder,fieldset[disabled] .input::-webkit-input-placeholder,fieldset[disabled] #documenter .docs-sidebar form.docs-search>input::-webkit-input-placeholder,#documenter .docs-sidebar fieldset[disabled] form.docs-search>input::-webkit-input-placeholder{color:rgba(107,107,107,0.3)}.select select[disabled]:-moz-placeholder,.textarea[disabled]:-moz-placeholder,.input[disabled]:-moz-placeholder,#documenter .docs-sidebar form.docs-search>input[disabled]:-moz-placeholder,fieldset[disabled] .select select:-moz-placeholder,.select fieldset[disabled] select:-moz-placeholder,fieldset[disabled] .textarea:-moz-placeholder,fieldset[disabled] .input:-moz-placeholder,fieldset[disabled] #documenter .docs-sidebar form.docs-search>input:-moz-placeholder,#documenter .docs-sidebar fieldset[disabled] form.docs-search>input:-moz-placeholder{color:rgba(107,107,107,0.3)}.select select[disabled]:-ms-input-placeholder,.textarea[disabled]:-ms-input-placeholder,.input[disabled]:-ms-input-placeholder,#documenter .docs-sidebar form.docs-search>input[disabled]:-ms-input-placeholder,fieldset[disabled] .select select:-ms-input-placeholder,.select fieldset[disabled] select:-ms-input-placeholder,fieldset[disabled] .textarea:-ms-input-placeholder,fieldset[disabled] .input:-ms-input-placeholder,fieldset[disabled] #documenter .docs-sidebar form.docs-search>input:-ms-input-placeholder,#documenter .docs-sidebar fieldset[disabled] form.docs-search>input:-ms-input-placeholder{color:rgba(107,107,107,0.3)}.textarea,.input,#documenter .docs-sidebar form.docs-search>input{box-shadow:inset 0 0.0625em 0.125em rgba(10,10,10,0.05);max-width:100%;width:100%}.textarea[readonly],.input[readonly],#documenter .docs-sidebar form.docs-search>input[readonly]{box-shadow:none}.is-white.textarea,.is-white.input,#documenter .docs-sidebar form.docs-search>input.is-white{border-color:#fff}.is-white.textarea:focus,.is-white.input:focus,#documenter .docs-sidebar form.docs-search>input.is-white:focus,.is-white.is-focused.textarea,.is-white.is-focused.input,#documenter .docs-sidebar form.docs-search>input.is-focused,.is-white.textarea:active,.is-white.input:active,#documenter .docs-sidebar form.docs-search>input.is-white:active,.is-white.is-active.textarea,.is-white.is-active.input,#documenter .docs-sidebar form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(255,255,255,0.25)}.is-black.textarea,.is-black.input,#documenter .docs-sidebar form.docs-search>input.is-black{border-color:#0a0a0a}.is-black.textarea:focus,.is-black.input:focus,#documenter .docs-sidebar form.docs-search>input.is-black:focus,.is-black.is-focused.textarea,.is-black.is-focused.input,#documenter .docs-sidebar form.docs-search>input.is-focused,.is-black.textarea:active,.is-black.input:active,#documenter .docs-sidebar form.docs-search>input.is-black:active,.is-black.is-active.textarea,.is-black.is-active.input,#documenter .docs-sidebar form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(10,10,10,0.25)}.is-light.textarea,.is-light.input,#documenter .docs-sidebar form.docs-search>input.is-light{border-color:#f5f5f5}.is-light.textarea:focus,.is-light.input:focus,#documenter .docs-sidebar form.docs-search>input.is-light:focus,.is-light.is-focused.textarea,.is-light.is-focused.input,#documenter .docs-sidebar form.docs-search>input.is-focused,.is-light.textarea:active,.is-light.input:active,#documenter .docs-sidebar form.docs-search>input.is-light:active,.is-light.is-active.textarea,.is-light.is-active.input,#documenter .docs-sidebar form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(245,245,245,0.25)}.is-dark.textarea,.content kbd.textarea,.is-dark.input,#documenter .docs-sidebar form.docs-search>input.is-dark,.content kbd.input{border-color:#363636}.is-dark.textarea:focus,.content kbd.textarea:focus,.is-dark.input:focus,#documenter .docs-sidebar form.docs-search>input.is-dark:focus,.content kbd.input:focus,.is-dark.is-focused.textarea,.content kbd.is-focused.textarea,.is-dark.is-focused.input,#documenter .docs-sidebar form.docs-search>input.is-focused,.content kbd.is-focused.input,#documenter .docs-sidebar .content form.docs-search>input.is-focused,.is-dark.textarea:active,.content kbd.textarea:active,.is-dark.input:active,#documenter .docs-sidebar form.docs-search>input.is-dark:active,.content kbd.input:active,.is-dark.is-active.textarea,.content kbd.is-active.textarea,.is-dark.is-active.input,#documenter .docs-sidebar form.docs-search>input.is-active,.content kbd.is-active.input,#documenter .docs-sidebar .content form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(54,54,54,0.25)}.is-primary.textarea,.docstring>section>a.textarea.docs-sourcelink,.is-primary.input,#documenter .docs-sidebar form.docs-search>input.is-primary,.docstring>section>a.input.docs-sourcelink{border-color:#4eb5de}.is-primary.textarea:focus,.docstring>section>a.textarea.docs-sourcelink:focus,.is-primary.input:focus,#documenter .docs-sidebar form.docs-search>input.is-primary:focus,.docstring>section>a.input.docs-sourcelink:focus,.is-primary.is-focused.textarea,.docstring>section>a.is-focused.textarea.docs-sourcelink,.is-primary.is-focused.input,#documenter .docs-sidebar form.docs-search>input.is-focused,.docstring>section>a.is-focused.input.docs-sourcelink,.is-primary.textarea:active,.docstring>section>a.textarea.docs-sourcelink:active,.is-primary.input:active,#documenter .docs-sidebar form.docs-search>input.is-primary:active,.docstring>section>a.input.docs-sourcelink:active,.is-primary.is-active.textarea,.docstring>section>a.is-active.textarea.docs-sourcelink,.is-primary.is-active.input,#documenter .docs-sidebar form.docs-search>input.is-active,.docstring>section>a.is-active.input.docs-sourcelink{box-shadow:0 0 0 0.125em rgba(78,181,222,0.25)}.is-link.textarea,.is-link.input,#documenter .docs-sidebar form.docs-search>input.is-link{border-color:#2e63b8}.is-link.textarea:focus,.is-link.input:focus,#documenter .docs-sidebar form.docs-search>input.is-link:focus,.is-link.is-focused.textarea,.is-link.is-focused.input,#documenter .docs-sidebar form.docs-search>input.is-focused,.is-link.textarea:active,.is-link.input:active,#documenter .docs-sidebar form.docs-search>input.is-link:active,.is-link.is-active.textarea,.is-link.is-active.input,#documenter .docs-sidebar form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(46,99,184,0.25)}.is-info.textarea,.is-info.input,#documenter .docs-sidebar form.docs-search>input.is-info{border-color:#209cee}.is-info.textarea:focus,.is-info.input:focus,#documenter .docs-sidebar form.docs-search>input.is-info:focus,.is-info.is-focused.textarea,.is-info.is-focused.input,#documenter .docs-sidebar form.docs-search>input.is-focused,.is-info.textarea:active,.is-info.input:active,#documenter .docs-sidebar form.docs-search>input.is-info:active,.is-info.is-active.textarea,.is-info.is-active.input,#documenter .docs-sidebar form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(32,156,238,0.25)}.is-success.textarea,.is-success.input,#documenter .docs-sidebar form.docs-search>input.is-success{border-color:#22c35b}.is-success.textarea:focus,.is-success.input:focus,#documenter .docs-sidebar form.docs-search>input.is-success:focus,.is-success.is-focused.textarea,.is-success.is-focused.input,#documenter .docs-sidebar form.docs-search>input.is-focused,.is-success.textarea:active,.is-success.input:active,#documenter .docs-sidebar form.docs-search>input.is-success:active,.is-success.is-active.textarea,.is-success.is-active.input,#documenter .docs-sidebar form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(34,195,91,0.25)}.is-warning.textarea,.is-warning.input,#documenter .docs-sidebar form.docs-search>input.is-warning{border-color:#ffdd57}.is-warning.textarea:focus,.is-warning.input:focus,#documenter .docs-sidebar form.docs-search>input.is-warning:focus,.is-warning.is-focused.textarea,.is-warning.is-focused.input,#documenter .docs-sidebar form.docs-search>input.is-focused,.is-warning.textarea:active,.is-warning.input:active,#documenter .docs-sidebar form.docs-search>input.is-warning:active,.is-warning.is-active.textarea,.is-warning.is-active.input,#documenter .docs-sidebar form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(255,221,87,0.25)}.is-danger.textarea,.is-danger.input,#documenter .docs-sidebar form.docs-search>input.is-danger{border-color:#da0b00}.is-danger.textarea:focus,.is-danger.input:focus,#documenter .docs-sidebar form.docs-search>input.is-danger:focus,.is-danger.is-focused.textarea,.is-danger.is-focused.input,#documenter .docs-sidebar form.docs-search>input.is-focused,.is-danger.textarea:active,.is-danger.input:active,#documenter .docs-sidebar form.docs-search>input.is-danger:active,.is-danger.is-active.textarea,.is-danger.is-active.input,#documenter .docs-sidebar form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(218,11,0,0.25)}.is-small.textarea,.is-small.input,#documenter .docs-sidebar form.docs-search>input{border-radius:2px;font-size:.75rem}.is-medium.textarea,.is-medium.input,#documenter .docs-sidebar form.docs-search>input.is-medium{font-size:1.25rem}.is-large.textarea,.is-large.input,#documenter .docs-sidebar form.docs-search>input.is-large{font-size:1.5rem}.is-fullwidth.textarea,.is-fullwidth.input,#documenter .docs-sidebar form.docs-search>input.is-fullwidth{display:block;width:100%}.is-inline.textarea,.is-inline.input,#documenter .docs-sidebar form.docs-search>input.is-inline{display:inline;width:auto}.input.is-rounded,#documenter .docs-sidebar form.docs-search>input{border-radius:9999px;padding-left:calc(calc(0.75em - 1px) + 0.375em);padding-right:calc(calc(0.75em - 1px) + 0.375em)}.input.is-static,#documenter .docs-sidebar form.docs-search>input.is-static{background-color:transparent;border-color:transparent;box-shadow:none;padding-left:0;padding-right:0}.textarea{display:block;max-width:100%;min-width:100%;padding:calc(0.75em - 1px);resize:vertical}.textarea:not([rows]){max-height:40em;min-height:8em}.textarea[rows]{height:initial}.textarea.has-fixed-size{resize:none}.radio,.checkbox{cursor:pointer;display:inline-block;line-height:1.25;position:relative}.radio input,.checkbox input{cursor:pointer}.radio:hover,.checkbox:hover{color:#222}.radio[disabled],.checkbox[disabled],fieldset[disabled] .radio,fieldset[disabled] .checkbox,.radio input[disabled],.checkbox input[disabled]{color:#6b6b6b;cursor:not-allowed}.radio+.radio{margin-left:.5em}.select{display:inline-block;max-width:100%;position:relative;vertical-align:top}.select:not(.is-multiple){height:2.5em}.select:not(.is-multiple):not(.is-loading)::after{border-color:#2e63b8;right:1.125em;z-index:4}.select.is-rounded select,#documenter .docs-sidebar form.docs-search>input.select select{border-radius:9999px;padding-left:1em}.select select{cursor:pointer;display:block;font-size:1em;max-width:100%;outline:none}.select select::-ms-expand{display:none}.select select[disabled]:hover,fieldset[disabled] .select select:hover{border-color:#f5f5f5}.select select:not([multiple]){padding-right:2.5em}.select select[multiple]{height:auto;padding:0}.select select[multiple] option{padding:0.5em 1em}.select:not(.is-multiple):not(.is-loading):hover::after{border-color:#222}.select.is-white:not(:hover)::after{border-color:#fff}.select.is-white select{border-color:#fff}.select.is-white select:hover,.select.is-white select.is-hovered{border-color:#f2f2f2}.select.is-white select:focus,.select.is-white select.is-focused,.select.is-white select:active,.select.is-white select.is-active{box-shadow:0 0 0 0.125em rgba(255,255,255,0.25)}.select.is-black:not(:hover)::after{border-color:#0a0a0a}.select.is-black select{border-color:#0a0a0a}.select.is-black select:hover,.select.is-black select.is-hovered{border-color:#000}.select.is-black select:focus,.select.is-black select.is-focused,.select.is-black select:active,.select.is-black select.is-active{box-shadow:0 0 0 0.125em rgba(10,10,10,0.25)}.select.is-light:not(:hover)::after{border-color:#f5f5f5}.select.is-light select{border-color:#f5f5f5}.select.is-light select:hover,.select.is-light select.is-hovered{border-color:#e8e8e8}.select.is-light select:focus,.select.is-light select.is-focused,.select.is-light select:active,.select.is-light select.is-active{box-shadow:0 0 0 0.125em rgba(245,245,245,0.25)}.select.is-dark:not(:hover)::after,.content kbd.select:not(:hover)::after{border-color:#363636}.select.is-dark select,.content kbd.select select{border-color:#363636}.select.is-dark select:hover,.content kbd.select select:hover,.select.is-dark select.is-hovered,.content kbd.select select.is-hovered{border-color:#292929}.select.is-dark select:focus,.content kbd.select select:focus,.select.is-dark select.is-focused,.content kbd.select select.is-focused,.select.is-dark select:active,.content kbd.select select:active,.select.is-dark select.is-active,.content kbd.select select.is-active{box-shadow:0 0 0 0.125em rgba(54,54,54,0.25)}.select.is-primary:not(:hover)::after,.docstring>section>a.select.docs-sourcelink:not(:hover)::after{border-color:#4eb5de}.select.is-primary select,.docstring>section>a.select.docs-sourcelink select{border-color:#4eb5de}.select.is-primary select:hover,.docstring>section>a.select.docs-sourcelink select:hover,.select.is-primary select.is-hovered,.docstring>section>a.select.docs-sourcelink select.is-hovered{border-color:#39acda}.select.is-primary select:focus,.docstring>section>a.select.docs-sourcelink select:focus,.select.is-primary select.is-focused,.docstring>section>a.select.docs-sourcelink select.is-focused,.select.is-primary select:active,.docstring>section>a.select.docs-sourcelink select:active,.select.is-primary select.is-active,.docstring>section>a.select.docs-sourcelink select.is-active{box-shadow:0 0 0 0.125em rgba(78,181,222,0.25)}.select.is-link:not(:hover)::after{border-color:#2e63b8}.select.is-link select{border-color:#2e63b8}.select.is-link select:hover,.select.is-link select.is-hovered{border-color:#2958a4}.select.is-link select:focus,.select.is-link select.is-focused,.select.is-link select:active,.select.is-link select.is-active{box-shadow:0 0 0 0.125em rgba(46,99,184,0.25)}.select.is-info:not(:hover)::after{border-color:#209cee}.select.is-info select{border-color:#209cee}.select.is-info select:hover,.select.is-info select.is-hovered{border-color:#1190e3}.select.is-info select:focus,.select.is-info select.is-focused,.select.is-info select:active,.select.is-info select.is-active{box-shadow:0 0 0 0.125em rgba(32,156,238,0.25)}.select.is-success:not(:hover)::after{border-color:#22c35b}.select.is-success select{border-color:#22c35b}.select.is-success select:hover,.select.is-success select.is-hovered{border-color:#1ead51}.select.is-success select:focus,.select.is-success select.is-focused,.select.is-success select:active,.select.is-success select.is-active{box-shadow:0 0 0 0.125em rgba(34,195,91,0.25)}.select.is-warning:not(:hover)::after{border-color:#ffdd57}.select.is-warning select{border-color:#ffdd57}.select.is-warning select:hover,.select.is-warning select.is-hovered{border-color:#ffd83e}.select.is-warning select:focus,.select.is-warning select.is-focused,.select.is-warning select:active,.select.is-warning select.is-active{box-shadow:0 0 0 0.125em rgba(255,221,87,0.25)}.select.is-danger:not(:hover)::after{border-color:#da0b00}.select.is-danger select{border-color:#da0b00}.select.is-danger select:hover,.select.is-danger select.is-hovered{border-color:#c10a00}.select.is-danger select:focus,.select.is-danger select.is-focused,.select.is-danger select:active,.select.is-danger select.is-active{box-shadow:0 0 0 0.125em rgba(218,11,0,0.25)}.select.is-small,#documenter .docs-sidebar form.docs-search>input.select{border-radius:2px;font-size:.75rem}.select.is-medium{font-size:1.25rem}.select.is-large{font-size:1.5rem}.select.is-disabled::after{border-color:#6b6b6b !important;opacity:0.5}.select.is-fullwidth{width:100%}.select.is-fullwidth select{width:100%}.select.is-loading::after{margin-top:0;position:absolute;right:.625em;top:0.625em;transform:none}.select.is-loading.is-small:after,#documenter .docs-sidebar form.docs-search>input.is-loading:after{font-size:.75rem}.select.is-loading.is-medium:after{font-size:1.25rem}.select.is-loading.is-large:after{font-size:1.5rem}.file{align-items:stretch;display:flex;justify-content:flex-start;position:relative}.file.is-white .file-cta{background-color:#fff;border-color:transparent;color:#0a0a0a}.file.is-white:hover .file-cta,.file.is-white.is-hovered .file-cta{background-color:#f9f9f9;border-color:transparent;color:#0a0a0a}.file.is-white:focus .file-cta,.file.is-white.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(255,255,255,0.25);color:#0a0a0a}.file.is-white:active .file-cta,.file.is-white.is-active .file-cta{background-color:#f2f2f2;border-color:transparent;color:#0a0a0a}.file.is-black .file-cta{background-color:#0a0a0a;border-color:transparent;color:#fff}.file.is-black:hover .file-cta,.file.is-black.is-hovered .file-cta{background-color:#040404;border-color:transparent;color:#fff}.file.is-black:focus .file-cta,.file.is-black.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(10,10,10,0.25);color:#fff}.file.is-black:active .file-cta,.file.is-black.is-active .file-cta{background-color:#000;border-color:transparent;color:#fff}.file.is-light .file-cta{background-color:#f5f5f5;border-color:transparent;color:rgba(0,0,0,0.7)}.file.is-light:hover .file-cta,.file.is-light.is-hovered .file-cta{background-color:#eee;border-color:transparent;color:rgba(0,0,0,0.7)}.file.is-light:focus .file-cta,.file.is-light.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(245,245,245,0.25);color:rgba(0,0,0,0.7)}.file.is-light:active .file-cta,.file.is-light.is-active .file-cta{background-color:#e8e8e8;border-color:transparent;color:rgba(0,0,0,0.7)}.file.is-dark .file-cta,.content kbd.file .file-cta{background-color:#363636;border-color:transparent;color:#fff}.file.is-dark:hover .file-cta,.content kbd.file:hover .file-cta,.file.is-dark.is-hovered .file-cta,.content kbd.file.is-hovered .file-cta{background-color:#2f2f2f;border-color:transparent;color:#fff}.file.is-dark:focus .file-cta,.content kbd.file:focus .file-cta,.file.is-dark.is-focused .file-cta,.content kbd.file.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(54,54,54,0.25);color:#fff}.file.is-dark:active .file-cta,.content kbd.file:active .file-cta,.file.is-dark.is-active .file-cta,.content kbd.file.is-active .file-cta{background-color:#292929;border-color:transparent;color:#fff}.file.is-primary .file-cta,.docstring>section>a.file.docs-sourcelink .file-cta{background-color:#4eb5de;border-color:transparent;color:#fff}.file.is-primary:hover .file-cta,.docstring>section>a.file.docs-sourcelink:hover .file-cta,.file.is-primary.is-hovered .file-cta,.docstring>section>a.file.is-hovered.docs-sourcelink .file-cta{background-color:#43b1dc;border-color:transparent;color:#fff}.file.is-primary:focus .file-cta,.docstring>section>a.file.docs-sourcelink:focus .file-cta,.file.is-primary.is-focused .file-cta,.docstring>section>a.file.is-focused.docs-sourcelink .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(78,181,222,0.25);color:#fff}.file.is-primary:active .file-cta,.docstring>section>a.file.docs-sourcelink:active .file-cta,.file.is-primary.is-active .file-cta,.docstring>section>a.file.is-active.docs-sourcelink .file-cta{background-color:#39acda;border-color:transparent;color:#fff}.file.is-link .file-cta{background-color:#2e63b8;border-color:transparent;color:#fff}.file.is-link:hover .file-cta,.file.is-link.is-hovered .file-cta{background-color:#2b5eae;border-color:transparent;color:#fff}.file.is-link:focus .file-cta,.file.is-link.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(46,99,184,0.25);color:#fff}.file.is-link:active .file-cta,.file.is-link.is-active .file-cta{background-color:#2958a4;border-color:transparent;color:#fff}.file.is-info .file-cta{background-color:#209cee;border-color:transparent;color:#fff}.file.is-info:hover .file-cta,.file.is-info.is-hovered .file-cta{background-color:#1497ed;border-color:transparent;color:#fff}.file.is-info:focus .file-cta,.file.is-info.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(32,156,238,0.25);color:#fff}.file.is-info:active .file-cta,.file.is-info.is-active .file-cta{background-color:#1190e3;border-color:transparent;color:#fff}.file.is-success .file-cta{background-color:#22c35b;border-color:transparent;color:#fff}.file.is-success:hover .file-cta,.file.is-success.is-hovered .file-cta{background-color:#20b856;border-color:transparent;color:#fff}.file.is-success:focus .file-cta,.file.is-success.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(34,195,91,0.25);color:#fff}.file.is-success:active .file-cta,.file.is-success.is-active .file-cta{background-color:#1ead51;border-color:transparent;color:#fff}.file.is-warning .file-cta{background-color:#ffdd57;border-color:transparent;color:rgba(0,0,0,0.7)}.file.is-warning:hover .file-cta,.file.is-warning.is-hovered .file-cta{background-color:#ffda4a;border-color:transparent;color:rgba(0,0,0,0.7)}.file.is-warning:focus .file-cta,.file.is-warning.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(255,221,87,0.25);color:rgba(0,0,0,0.7)}.file.is-warning:active .file-cta,.file.is-warning.is-active .file-cta{background-color:#ffd83e;border-color:transparent;color:rgba(0,0,0,0.7)}.file.is-danger .file-cta{background-color:#da0b00;border-color:transparent;color:#fff}.file.is-danger:hover .file-cta,.file.is-danger.is-hovered .file-cta{background-color:#cd0a00;border-color:transparent;color:#fff}.file.is-danger:focus .file-cta,.file.is-danger.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(218,11,0,0.25);color:#fff}.file.is-danger:active .file-cta,.file.is-danger.is-active .file-cta{background-color:#c10a00;border-color:transparent;color:#fff}.file.is-small,#documenter .docs-sidebar form.docs-search>input.file{font-size:.75rem}.file.is-normal{font-size:1rem}.file.is-medium{font-size:1.25rem}.file.is-medium .file-icon .fa{font-size:21px}.file.is-large{font-size:1.5rem}.file.is-large .file-icon .fa{font-size:28px}.file.has-name .file-cta{border-bottom-right-radius:0;border-top-right-radius:0}.file.has-name .file-name{border-bottom-left-radius:0;border-top-left-radius:0}.file.has-name.is-empty .file-cta{border-radius:4px}.file.has-name.is-empty .file-name{display:none}.file.is-boxed .file-label{flex-direction:column}.file.is-boxed .file-cta{flex-direction:column;height:auto;padding:1em 3em}.file.is-boxed .file-name{border-width:0 1px 1px}.file.is-boxed .file-icon{height:1.5em;width:1.5em}.file.is-boxed .file-icon .fa{font-size:21px}.file.is-boxed.is-small .file-icon .fa,#documenter .docs-sidebar form.docs-search>input.is-boxed .file-icon .fa{font-size:14px}.file.is-boxed.is-medium .file-icon .fa{font-size:28px}.file.is-boxed.is-large .file-icon .fa{font-size:35px}.file.is-boxed.has-name .file-cta{border-radius:4px 4px 0 0}.file.is-boxed.has-name .file-name{border-radius:0 0 4px 4px;border-width:0 1px 1px}.file.is-centered{justify-content:center}.file.is-fullwidth .file-label{width:100%}.file.is-fullwidth .file-name{flex-grow:1;max-width:none}.file.is-right{justify-content:flex-end}.file.is-right .file-cta{border-radius:0 4px 4px 0}.file.is-right .file-name{border-radius:4px 0 0 4px;border-width:1px 0 1px 1px;order:-1}.file-label{align-items:stretch;display:flex;cursor:pointer;justify-content:flex-start;overflow:hidden;position:relative}.file-label:hover .file-cta{background-color:#eee;color:#222}.file-label:hover .file-name{border-color:#d5d5d5}.file-label:active .file-cta{background-color:#e8e8e8;color:#222}.file-label:active .file-name{border-color:#cfcfcf}.file-input{height:100%;left:0;opacity:0;outline:none;position:absolute;top:0;width:100%}.file-cta,.file-name{border-color:#dbdbdb;border-radius:4px;font-size:1em;padding-left:1em;padding-right:1em;white-space:nowrap}.file-cta{background-color:#f5f5f5;color:#222}.file-name{border-color:#dbdbdb;border-style:solid;border-width:1px 1px 1px 0;display:block;max-width:16em;overflow:hidden;text-align:inherit;text-overflow:ellipsis}.file-icon{align-items:center;display:flex;height:1em;justify-content:center;margin-right:.5em;width:1em}.file-icon .fa{font-size:14px}.label{color:#222;display:block;font-size:1rem;font-weight:700}.label:not(:last-child){margin-bottom:0.5em}.label.is-small,#documenter .docs-sidebar form.docs-search>input.label{font-size:.75rem}.label.is-medium{font-size:1.25rem}.label.is-large{font-size:1.5rem}.help{display:block;font-size:.75rem;margin-top:0.25rem}.help.is-white{color:#fff}.help.is-black{color:#0a0a0a}.help.is-light{color:#f5f5f5}.help.is-dark,.content kbd.help{color:#363636}.help.is-primary,.docstring>section>a.help.docs-sourcelink{color:#4eb5de}.help.is-link{color:#2e63b8}.help.is-info{color:#209cee}.help.is-success{color:#22c35b}.help.is-warning{color:#ffdd57}.help.is-danger{color:#da0b00}.field:not(:last-child){margin-bottom:0.75rem}.field.has-addons{display:flex;justify-content:flex-start}.field.has-addons .control:not(:last-child){margin-right:-1px}.field.has-addons .control:not(:first-child):not(:last-child) .button,.field.has-addons .control:not(:first-child):not(:last-child) .input,.field.has-addons .control:not(:first-child):not(:last-child) #documenter .docs-sidebar form.docs-search>input,#documenter .docs-sidebar .field.has-addons .control:not(:first-child):not(:last-child) form.docs-search>input,.field.has-addons .control:not(:first-child):not(:last-child) .select select{border-radius:0}.field.has-addons .control:first-child:not(:only-child) .button,.field.has-addons .control:first-child:not(:only-child) .input,.field.has-addons .control:first-child:not(:only-child) #documenter .docs-sidebar form.docs-search>input,#documenter .docs-sidebar .field.has-addons .control:first-child:not(:only-child) form.docs-search>input,.field.has-addons .control:first-child:not(:only-child) .select select{border-bottom-right-radius:0;border-top-right-radius:0}.field.has-addons .control:last-child:not(:only-child) .button,.field.has-addons .control:last-child:not(:only-child) .input,.field.has-addons .control:last-child:not(:only-child) #documenter .docs-sidebar form.docs-search>input,#documenter .docs-sidebar .field.has-addons .control:last-child:not(:only-child) form.docs-search>input,.field.has-addons .control:last-child:not(:only-child) .select select{border-bottom-left-radius:0;border-top-left-radius:0}.field.has-addons .control .button:not([disabled]):hover,.field.has-addons .control .button.is-hovered:not([disabled]),.field.has-addons .control .input:not([disabled]):hover,.field.has-addons .control #documenter .docs-sidebar form.docs-search>input:not([disabled]):hover,#documenter .docs-sidebar .field.has-addons .control form.docs-search>input:not([disabled]):hover,.field.has-addons .control .input.is-hovered:not([disabled]),.field.has-addons .control #documenter .docs-sidebar form.docs-search>input.is-hovered:not([disabled]),#documenter .docs-sidebar .field.has-addons .control form.docs-search>input.is-hovered:not([disabled]),.field.has-addons .control .select select:not([disabled]):hover,.field.has-addons .control .select select.is-hovered:not([disabled]){z-index:2}.field.has-addons .control .button:not([disabled]):focus,.field.has-addons .control .button.is-focused:not([disabled]),.field.has-addons .control .button:not([disabled]):active,.field.has-addons .control .button.is-active:not([disabled]),.field.has-addons .control .input:not([disabled]):focus,.field.has-addons .control #documenter .docs-sidebar form.docs-search>input:not([disabled]):focus,#documenter .docs-sidebar .field.has-addons .control form.docs-search>input:not([disabled]):focus,.field.has-addons .control .input.is-focused:not([disabled]),.field.has-addons .control #documenter .docs-sidebar form.docs-search>input.is-focused:not([disabled]),#documenter .docs-sidebar .field.has-addons .control form.docs-search>input.is-focused:not([disabled]),.field.has-addons .control .input:not([disabled]):active,.field.has-addons .control #documenter .docs-sidebar form.docs-search>input:not([disabled]):active,#documenter .docs-sidebar .field.has-addons .control form.docs-search>input:not([disabled]):active,.field.has-addons .control .input.is-active:not([disabled]),.field.has-addons .control #documenter .docs-sidebar form.docs-search>input.is-active:not([disabled]),#documenter .docs-sidebar .field.has-addons .control form.docs-search>input.is-active:not([disabled]),.field.has-addons .control .select select:not([disabled]):focus,.field.has-addons .control .select select.is-focused:not([disabled]),.field.has-addons .control .select select:not([disabled]):active,.field.has-addons .control .select select.is-active:not([disabled]){z-index:3}.field.has-addons .control .button:not([disabled]):focus:hover,.field.has-addons .control .button.is-focused:not([disabled]):hover,.field.has-addons .control .button:not([disabled]):active:hover,.field.has-addons .control .button.is-active:not([disabled]):hover,.field.has-addons .control .input:not([disabled]):focus:hover,.field.has-addons .control #documenter .docs-sidebar form.docs-search>input:not([disabled]):focus:hover,#documenter .docs-sidebar .field.has-addons .control form.docs-search>input:not([disabled]):focus:hover,.field.has-addons .control .input.is-focused:not([disabled]):hover,.field.has-addons .control #documenter .docs-sidebar form.docs-search>input.is-focused:not([disabled]):hover,#documenter .docs-sidebar .field.has-addons .control form.docs-search>input.is-focused:not([disabled]):hover,.field.has-addons .control .input:not([disabled]):active:hover,.field.has-addons .control #documenter .docs-sidebar form.docs-search>input:not([disabled]):active:hover,#documenter .docs-sidebar .field.has-addons .control form.docs-search>input:not([disabled]):active:hover,.field.has-addons .control .input.is-active:not([disabled]):hover,.field.has-addons .control #documenter .docs-sidebar form.docs-search>input.is-active:not([disabled]):hover,#documenter .docs-sidebar .field.has-addons .control form.docs-search>input.is-active:not([disabled]):hover,.field.has-addons .control .select select:not([disabled]):focus:hover,.field.has-addons .control .select select.is-focused:not([disabled]):hover,.field.has-addons .control .select select:not([disabled]):active:hover,.field.has-addons .control .select select.is-active:not([disabled]):hover{z-index:4}.field.has-addons .control.is-expanded{flex-grow:1;flex-shrink:1}.field.has-addons.has-addons-centered{justify-content:center}.field.has-addons.has-addons-right{justify-content:flex-end}.field.has-addons.has-addons-fullwidth .control{flex-grow:1;flex-shrink:0}.field.is-grouped{display:flex;justify-content:flex-start}.field.is-grouped>.control{flex-shrink:0}.field.is-grouped>.control:not(:last-child){margin-bottom:0;margin-right:.75rem}.field.is-grouped>.control.is-expanded{flex-grow:1;flex-shrink:1}.field.is-grouped.is-grouped-centered{justify-content:center}.field.is-grouped.is-grouped-right{justify-content:flex-end}.field.is-grouped.is-grouped-multiline{flex-wrap:wrap}.field.is-grouped.is-grouped-multiline>.control:last-child,.field.is-grouped.is-grouped-multiline>.control:not(:last-child){margin-bottom:0.75rem}.field.is-grouped.is-grouped-multiline:last-child{margin-bottom:-0.75rem}.field.is-grouped.is-grouped-multiline:not(:last-child){margin-bottom:0}@media screen and (min-width: 769px),print{.field.is-horizontal{display:flex}}.field-label .label{font-size:inherit}@media screen and (max-width: 768px){.field-label{margin-bottom:0.5rem}}@media screen and (min-width: 769px),print{.field-label{flex-basis:0;flex-grow:1;flex-shrink:0;margin-right:1.5rem;text-align:right}.field-label.is-small,#documenter .docs-sidebar form.docs-search>input.field-label{font-size:.75rem;padding-top:0.375em}.field-label.is-normal{padding-top:0.375em}.field-label.is-medium{font-size:1.25rem;padding-top:0.375em}.field-label.is-large{font-size:1.5rem;padding-top:0.375em}}.field-body .field .field{margin-bottom:0}@media screen and (min-width: 769px),print{.field-body{display:flex;flex-basis:0;flex-grow:5;flex-shrink:1}.field-body .field{margin-bottom:0}.field-body>.field{flex-shrink:1}.field-body>.field:not(.is-narrow){flex-grow:1}.field-body>.field:not(:last-child){margin-right:.75rem}}.control{box-sizing:border-box;clear:both;font-size:1rem;position:relative;text-align:inherit}.control.has-icons-left .input:focus~.icon,.control.has-icons-left #documenter .docs-sidebar form.docs-search>input:focus~.icon,#documenter .docs-sidebar .control.has-icons-left form.docs-search>input:focus~.icon,.control.has-icons-left .select:focus~.icon,.control.has-icons-right .input:focus~.icon,.control.has-icons-right #documenter .docs-sidebar form.docs-search>input:focus~.icon,#documenter .docs-sidebar .control.has-icons-right form.docs-search>input:focus~.icon,.control.has-icons-right .select:focus~.icon{color:#222}.control.has-icons-left .input.is-small~.icon,.control.has-icons-left #documenter .docs-sidebar form.docs-search>input~.icon,#documenter .docs-sidebar .control.has-icons-left form.docs-search>input~.icon,.control.has-icons-left .select.is-small~.icon,.control.has-icons-right .input.is-small~.icon,.control.has-icons-right #documenter .docs-sidebar form.docs-search>input~.icon,#documenter .docs-sidebar .control.has-icons-right form.docs-search>input~.icon,.control.has-icons-right .select.is-small~.icon{font-size:.75rem}.control.has-icons-left .input.is-medium~.icon,.control.has-icons-left #documenter .docs-sidebar form.docs-search>input.is-medium~.icon,#documenter .docs-sidebar .control.has-icons-left form.docs-search>input.is-medium~.icon,.control.has-icons-left .select.is-medium~.icon,.control.has-icons-right .input.is-medium~.icon,.control.has-icons-right #documenter .docs-sidebar form.docs-search>input.is-medium~.icon,#documenter .docs-sidebar .control.has-icons-right form.docs-search>input.is-medium~.icon,.control.has-icons-right .select.is-medium~.icon{font-size:1.25rem}.control.has-icons-left .input.is-large~.icon,.control.has-icons-left #documenter .docs-sidebar form.docs-search>input.is-large~.icon,#documenter .docs-sidebar .control.has-icons-left form.docs-search>input.is-large~.icon,.control.has-icons-left .select.is-large~.icon,.control.has-icons-right .input.is-large~.icon,.control.has-icons-right #documenter .docs-sidebar form.docs-search>input.is-large~.icon,#documenter .docs-sidebar .control.has-icons-right form.docs-search>input.is-large~.icon,.control.has-icons-right .select.is-large~.icon{font-size:1.5rem}.control.has-icons-left .icon,.control.has-icons-right .icon{color:#dbdbdb;height:2.5em;pointer-events:none;position:absolute;top:0;width:2.5em;z-index:4}.control.has-icons-left .input,.control.has-icons-left #documenter .docs-sidebar form.docs-search>input,#documenter .docs-sidebar .control.has-icons-left form.docs-search>input,.control.has-icons-left .select select{padding-left:2.5em}.control.has-icons-left .icon.is-left{left:0}.control.has-icons-right .input,.control.has-icons-right #documenter .docs-sidebar form.docs-search>input,#documenter .docs-sidebar .control.has-icons-right form.docs-search>input,.control.has-icons-right .select select{padding-right:2.5em}.control.has-icons-right .icon.is-right{right:0}.control.is-loading::after{position:absolute !important;right:.625em;top:0.625em;z-index:4}.control.is-loading.is-small:after,#documenter .docs-sidebar form.docs-search>input.is-loading:after{font-size:.75rem}.control.is-loading.is-medium:after{font-size:1.25rem}.control.is-loading.is-large:after{font-size:1.5rem}.breadcrumb{font-size:1rem;white-space:nowrap}.breadcrumb a{align-items:center;color:#2e63b8;display:flex;justify-content:center;padding:0 .75em}.breadcrumb a:hover{color:#363636}.breadcrumb li{align-items:center;display:flex}.breadcrumb li:first-child a{padding-left:0}.breadcrumb li.is-active a{color:#222;cursor:default;pointer-events:none}.breadcrumb li+li::before{color:#b5b5b5;content:"\0002f"}.breadcrumb ul,.breadcrumb ol{align-items:flex-start;display:flex;flex-wrap:wrap;justify-content:flex-start}.breadcrumb .icon:first-child{margin-right:.5em}.breadcrumb .icon:last-child{margin-left:.5em}.breadcrumb.is-centered ol,.breadcrumb.is-centered ul{justify-content:center}.breadcrumb.is-right ol,.breadcrumb.is-right ul{justify-content:flex-end}.breadcrumb.is-small,#documenter .docs-sidebar form.docs-search>input.breadcrumb{font-size:.75rem}.breadcrumb.is-medium{font-size:1.25rem}.breadcrumb.is-large{font-size:1.5rem}.breadcrumb.has-arrow-separator li+li::before{content:"\02192"}.breadcrumb.has-bullet-separator li+li::before{content:"\02022"}.breadcrumb.has-dot-separator li+li::before{content:"\000b7"}.breadcrumb.has-succeeds-separator li+li::before{content:"\0227B"}.card{background-color:#fff;border-radius:.25rem;box-shadow:#bbb;color:#222;max-width:100%;position:relative}.card-footer:first-child,.card-content:first-child,.card-header:first-child{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.card-footer:last-child,.card-content:last-child,.card-header:last-child{border-bottom-left-radius:.25rem;border-bottom-right-radius:.25rem}.card-header{background-color:rgba(0,0,0,0);align-items:stretch;box-shadow:0 0.125em 0.25em rgba(10,10,10,0.1);display:flex}.card-header-title{align-items:center;color:#222;display:flex;flex-grow:1;font-weight:700;padding:0.75rem 1rem}.card-header-title.is-centered{justify-content:center}.card-header-icon{-moz-appearance:none;-webkit-appearance:none;appearance:none;background:none;border:none;color:currentColor;font-family:inherit;font-size:1em;margin:0;padding:0;align-items:center;cursor:pointer;display:flex;justify-content:center;padding:0.75rem 1rem}.card-image{display:block;position:relative}.card-image:first-child img{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.card-image:last-child img{border-bottom-left-radius:.25rem;border-bottom-right-radius:.25rem}.card-content{background-color:rgba(0,0,0,0);padding:1.5rem}.card-footer{background-color:rgba(0,0,0,0);border-top:1px solid #ededed;align-items:stretch;display:flex}.card-footer-item{align-items:center;display:flex;flex-basis:0;flex-grow:1;flex-shrink:0;justify-content:center;padding:.75rem}.card-footer-item:not(:last-child){border-right:1px solid #ededed}.card .media:not(:last-child){margin-bottom:1.5rem}.dropdown{display:inline-flex;position:relative;vertical-align:top}.dropdown.is-active .dropdown-menu,.dropdown.is-hoverable:hover .dropdown-menu{display:block}.dropdown.is-right .dropdown-menu{left:auto;right:0}.dropdown.is-up .dropdown-menu{bottom:100%;padding-bottom:4px;padding-top:initial;top:auto}.dropdown-menu{display:none;left:0;min-width:12rem;padding-top:4px;position:absolute;top:100%;z-index:20}.dropdown-content{background-color:#fff;border-radius:4px;box-shadow:#bbb;padding-bottom:.5rem;padding-top:.5rem}.dropdown-item{color:#222;display:block;font-size:0.875rem;line-height:1.5;padding:0.375rem 1rem;position:relative}a.dropdown-item,button.dropdown-item{padding-right:3rem;text-align:inherit;white-space:nowrap;width:100%}a.dropdown-item:hover,button.dropdown-item:hover{background-color:#f5f5f5;color:#0a0a0a}a.dropdown-item.is-active,button.dropdown-item.is-active{background-color:#2e63b8;color:#fff}.dropdown-divider{background-color:#ededed;border:none;display:block;height:1px;margin:0.5rem 0}.level{align-items:center;justify-content:space-between}.level code{border-radius:4px}.level img{display:inline-block;vertical-align:top}.level.is-mobile{display:flex}.level.is-mobile .level-left,.level.is-mobile .level-right{display:flex}.level.is-mobile .level-left+.level-right{margin-top:0}.level.is-mobile .level-item:not(:last-child){margin-bottom:0;margin-right:.75rem}.level.is-mobile .level-item:not(.is-narrow){flex-grow:1}@media screen and (min-width: 769px),print{.level{display:flex}.level>.level-item:not(.is-narrow){flex-grow:1}}.level-item{align-items:center;display:flex;flex-basis:auto;flex-grow:0;flex-shrink:0;justify-content:center}.level-item .title,.level-item .subtitle{margin-bottom:0}@media screen and (max-width: 768px){.level-item:not(:last-child){margin-bottom:.75rem}}.level-left,.level-right{flex-basis:auto;flex-grow:0;flex-shrink:0}.level-left .level-item.is-flexible,.level-right .level-item.is-flexible{flex-grow:1}@media screen and (min-width: 769px),print{.level-left .level-item:not(:last-child),.level-right .level-item:not(:last-child){margin-right:.75rem}}.level-left{align-items:center;justify-content:flex-start}@media screen and (max-width: 768px){.level-left+.level-right{margin-top:1.5rem}}@media screen and (min-width: 769px),print{.level-left{display:flex}}.level-right{align-items:center;justify-content:flex-end}@media screen and (min-width: 769px),print{.level-right{display:flex}}.media{align-items:flex-start;display:flex;text-align:inherit}.media .content:not(:last-child){margin-bottom:.75rem}.media .media{border-top:1px solid rgba(219,219,219,0.5);display:flex;padding-top:.75rem}.media .media .content:not(:last-child),.media .media .control:not(:last-child){margin-bottom:.5rem}.media .media .media{padding-top:.5rem}.media .media .media+.media{margin-top:.5rem}.media+.media{border-top:1px solid rgba(219,219,219,0.5);margin-top:1rem;padding-top:1rem}.media.is-large+.media{margin-top:1.5rem;padding-top:1.5rem}.media-left,.media-right{flex-basis:auto;flex-grow:0;flex-shrink:0}.media-left{margin-right:1rem}.media-right{margin-left:1rem}.media-content{flex-basis:auto;flex-grow:1;flex-shrink:1;text-align:inherit}@media screen and (max-width: 768px){.media-content{overflow-x:auto}}.menu{font-size:1rem}.menu.is-small,#documenter .docs-sidebar form.docs-search>input.menu{font-size:.75rem}.menu.is-medium{font-size:1.25rem}.menu.is-large{font-size:1.5rem}.menu-list{line-height:1.25}.menu-list a{border-radius:2px;color:#222;display:block;padding:0.5em 0.75em}.menu-list a:hover{background-color:#f5f5f5;color:#222}.menu-list a.is-active{background-color:#2e63b8;color:#fff}.menu-list li ul{border-left:1px solid #dbdbdb;margin:.75em;padding-left:.75em}.menu-label{color:#6b6b6b;font-size:.75em;letter-spacing:.1em;text-transform:uppercase}.menu-label:not(:first-child){margin-top:1em}.menu-label:not(:last-child){margin-bottom:1em}.message{background-color:#f5f5f5;border-radius:4px;font-size:1rem}.message strong{color:currentColor}.message a:not(.button):not(.tag):not(.dropdown-item){color:currentColor;text-decoration:underline}.message.is-small,#documenter .docs-sidebar form.docs-search>input.message{font-size:.75rem}.message.is-medium{font-size:1.25rem}.message.is-large{font-size:1.5rem}.message.is-white{background-color:#fff}.message.is-white .message-header{background-color:#fff;color:#0a0a0a}.message.is-white .message-body{border-color:#fff}.message.is-black{background-color:#fafafa}.message.is-black .message-header{background-color:#0a0a0a;color:#fff}.message.is-black .message-body{border-color:#0a0a0a}.message.is-light{background-color:#fafafa}.message.is-light .message-header{background-color:#f5f5f5;color:rgba(0,0,0,0.7)}.message.is-light .message-body{border-color:#f5f5f5}.message.is-dark,.content kbd.message{background-color:#fafafa}.message.is-dark .message-header,.content kbd.message .message-header{background-color:#363636;color:#fff}.message.is-dark .message-body,.content kbd.message .message-body{border-color:#363636}.message.is-primary,.docstring>section>a.message.docs-sourcelink{background-color:#eef8fc}.message.is-primary .message-header,.docstring>section>a.message.docs-sourcelink .message-header{background-color:#4eb5de;color:#fff}.message.is-primary .message-body,.docstring>section>a.message.docs-sourcelink .message-body{border-color:#4eb5de;color:#1a6d8e}.message.is-link{background-color:#eff3fb}.message.is-link .message-header{background-color:#2e63b8;color:#fff}.message.is-link .message-body{border-color:#2e63b8;color:#3169c4}.message.is-info{background-color:#ecf7fe}.message.is-info .message-header{background-color:#209cee;color:#fff}.message.is-info .message-body{border-color:#209cee;color:#0e72b4}.message.is-success{background-color:#eefcf3}.message.is-success .message-header{background-color:#22c35b;color:#fff}.message.is-success .message-body{border-color:#22c35b;color:#198f43}.message.is-warning{background-color:#fffbeb}.message.is-warning .message-header{background-color:#ffdd57;color:rgba(0,0,0,0.7)}.message.is-warning .message-body{border-color:#ffdd57;color:#947600}.message.is-danger{background-color:#ffeceb}.message.is-danger .message-header{background-color:#da0b00;color:#fff}.message.is-danger .message-body{border-color:#da0b00;color:#f50c00}.message-header{align-items:center;background-color:#222;border-radius:4px 4px 0 0;color:#fff;display:flex;font-weight:700;justify-content:space-between;line-height:1.25;padding:0.75em 1em;position:relative}.message-header .delete{flex-grow:0;flex-shrink:0;margin-left:.75em}.message-header+.message-body{border-width:0;border-top-left-radius:0;border-top-right-radius:0}.message-body{border-color:#dbdbdb;border-radius:4px;border-style:solid;border-width:0 0 0 4px;color:#222;padding:1.25em 1.5em}.message-body code,.message-body pre{background-color:#fff}.message-body pre code{background-color:rgba(0,0,0,0)}.modal{align-items:center;display:none;flex-direction:column;justify-content:center;overflow:hidden;position:fixed;z-index:40}.modal.is-active{display:flex}.modal-background{background-color:rgba(10,10,10,0.86)}.modal-content,.modal-card{margin:0 20px;max-height:calc(100vh - 160px);overflow:auto;position:relative;width:100%}@media screen and (min-width: 769px){.modal-content,.modal-card{margin:0 auto;max-height:calc(100vh - 40px);width:640px}}.modal-close{background:none;height:40px;position:fixed;right:20px;top:20px;width:40px}.modal-card{display:flex;flex-direction:column;max-height:calc(100vh - 40px);overflow:hidden;-ms-overflow-y:visible}.modal-card-head,.modal-card-foot{align-items:center;background-color:#f5f5f5;display:flex;flex-shrink:0;justify-content:flex-start;padding:20px;position:relative}.modal-card-head{border-bottom:1px solid #dbdbdb;border-top-left-radius:6px;border-top-right-radius:6px}.modal-card-title{color:#222;flex-grow:1;flex-shrink:0;font-size:1.5rem;line-height:1}.modal-card-foot{border-bottom-left-radius:6px;border-bottom-right-radius:6px;border-top:1px solid #dbdbdb}.modal-card-foot .button:not(:last-child){margin-right:.5em}.modal-card-body{-webkit-overflow-scrolling:touch;background-color:#fff;flex-grow:1;flex-shrink:1;overflow:auto;padding:20px}.navbar{background-color:#fff;min-height:3.25rem;position:relative;z-index:30}.navbar.is-white{background-color:#fff;color:#0a0a0a}.navbar.is-white .navbar-brand>.navbar-item,.navbar.is-white .navbar-brand .navbar-link{color:#0a0a0a}.navbar.is-white .navbar-brand>a.navbar-item:focus,.navbar.is-white .navbar-brand>a.navbar-item:hover,.navbar.is-white .navbar-brand>a.navbar-item.is-active,.navbar.is-white .navbar-brand .navbar-link:focus,.navbar.is-white .navbar-brand .navbar-link:hover,.navbar.is-white .navbar-brand .navbar-link.is-active{background-color:#f2f2f2;color:#0a0a0a}.navbar.is-white .navbar-brand .navbar-link::after{border-color:#0a0a0a}.navbar.is-white .navbar-burger{color:#0a0a0a}@media screen and (min-width: 1056px){.navbar.is-white .navbar-start>.navbar-item,.navbar.is-white .navbar-start .navbar-link,.navbar.is-white .navbar-end>.navbar-item,.navbar.is-white .navbar-end .navbar-link{color:#0a0a0a}.navbar.is-white .navbar-start>a.navbar-item:focus,.navbar.is-white .navbar-start>a.navbar-item:hover,.navbar.is-white .navbar-start>a.navbar-item.is-active,.navbar.is-white .navbar-start .navbar-link:focus,.navbar.is-white .navbar-start .navbar-link:hover,.navbar.is-white .navbar-start .navbar-link.is-active,.navbar.is-white .navbar-end>a.navbar-item:focus,.navbar.is-white .navbar-end>a.navbar-item:hover,.navbar.is-white .navbar-end>a.navbar-item.is-active,.navbar.is-white .navbar-end .navbar-link:focus,.navbar.is-white .navbar-end .navbar-link:hover,.navbar.is-white .navbar-end .navbar-link.is-active{background-color:#f2f2f2;color:#0a0a0a}.navbar.is-white .navbar-start .navbar-link::after,.navbar.is-white .navbar-end .navbar-link::after{border-color:#0a0a0a}.navbar.is-white .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-white .navbar-item.has-dropdown:hover .navbar-link,.navbar.is-white .navbar-item.has-dropdown.is-active .navbar-link{background-color:#f2f2f2;color:#0a0a0a}.navbar.is-white .navbar-dropdown a.navbar-item.is-active{background-color:#fff;color:#0a0a0a}}.navbar.is-black{background-color:#0a0a0a;color:#fff}.navbar.is-black .navbar-brand>.navbar-item,.navbar.is-black .navbar-brand .navbar-link{color:#fff}.navbar.is-black .navbar-brand>a.navbar-item:focus,.navbar.is-black .navbar-brand>a.navbar-item:hover,.navbar.is-black .navbar-brand>a.navbar-item.is-active,.navbar.is-black .navbar-brand .navbar-link:focus,.navbar.is-black .navbar-brand .navbar-link:hover,.navbar.is-black .navbar-brand .navbar-link.is-active{background-color:#000;color:#fff}.navbar.is-black .navbar-brand .navbar-link::after{border-color:#fff}.navbar.is-black .navbar-burger{color:#fff}@media screen and (min-width: 1056px){.navbar.is-black .navbar-start>.navbar-item,.navbar.is-black .navbar-start .navbar-link,.navbar.is-black .navbar-end>.navbar-item,.navbar.is-black .navbar-end .navbar-link{color:#fff}.navbar.is-black .navbar-start>a.navbar-item:focus,.navbar.is-black .navbar-start>a.navbar-item:hover,.navbar.is-black .navbar-start>a.navbar-item.is-active,.navbar.is-black .navbar-start .navbar-link:focus,.navbar.is-black .navbar-start .navbar-link:hover,.navbar.is-black .navbar-start .navbar-link.is-active,.navbar.is-black .navbar-end>a.navbar-item:focus,.navbar.is-black .navbar-end>a.navbar-item:hover,.navbar.is-black .navbar-end>a.navbar-item.is-active,.navbar.is-black .navbar-end .navbar-link:focus,.navbar.is-black .navbar-end .navbar-link:hover,.navbar.is-black .navbar-end .navbar-link.is-active{background-color:#000;color:#fff}.navbar.is-black .navbar-start .navbar-link::after,.navbar.is-black .navbar-end .navbar-link::after{border-color:#fff}.navbar.is-black .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-black .navbar-item.has-dropdown:hover .navbar-link,.navbar.is-black .navbar-item.has-dropdown.is-active .navbar-link{background-color:#000;color:#fff}.navbar.is-black .navbar-dropdown a.navbar-item.is-active{background-color:#0a0a0a;color:#fff}}.navbar.is-light{background-color:#f5f5f5;color:rgba(0,0,0,0.7)}.navbar.is-light .navbar-brand>.navbar-item,.navbar.is-light .navbar-brand .navbar-link{color:rgba(0,0,0,0.7)}.navbar.is-light .navbar-brand>a.navbar-item:focus,.navbar.is-light .navbar-brand>a.navbar-item:hover,.navbar.is-light .navbar-brand>a.navbar-item.is-active,.navbar.is-light .navbar-brand .navbar-link:focus,.navbar.is-light .navbar-brand .navbar-link:hover,.navbar.is-light .navbar-brand .navbar-link.is-active{background-color:#e8e8e8;color:rgba(0,0,0,0.7)}.navbar.is-light .navbar-brand .navbar-link::after{border-color:rgba(0,0,0,0.7)}.navbar.is-light .navbar-burger{color:rgba(0,0,0,0.7)}@media screen and (min-width: 1056px){.navbar.is-light .navbar-start>.navbar-item,.navbar.is-light .navbar-start .navbar-link,.navbar.is-light .navbar-end>.navbar-item,.navbar.is-light .navbar-end .navbar-link{color:rgba(0,0,0,0.7)}.navbar.is-light .navbar-start>a.navbar-item:focus,.navbar.is-light .navbar-start>a.navbar-item:hover,.navbar.is-light .navbar-start>a.navbar-item.is-active,.navbar.is-light .navbar-start .navbar-link:focus,.navbar.is-light .navbar-start .navbar-link:hover,.navbar.is-light .navbar-start .navbar-link.is-active,.navbar.is-light .navbar-end>a.navbar-item:focus,.navbar.is-light .navbar-end>a.navbar-item:hover,.navbar.is-light .navbar-end>a.navbar-item.is-active,.navbar.is-light .navbar-end .navbar-link:focus,.navbar.is-light .navbar-end .navbar-link:hover,.navbar.is-light .navbar-end .navbar-link.is-active{background-color:#e8e8e8;color:rgba(0,0,0,0.7)}.navbar.is-light .navbar-start .navbar-link::after,.navbar.is-light .navbar-end .navbar-link::after{border-color:rgba(0,0,0,0.7)}.navbar.is-light .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-light .navbar-item.has-dropdown:hover .navbar-link,.navbar.is-light .navbar-item.has-dropdown.is-active .navbar-link{background-color:#e8e8e8;color:rgba(0,0,0,0.7)}.navbar.is-light .navbar-dropdown a.navbar-item.is-active{background-color:#f5f5f5;color:rgba(0,0,0,0.7)}}.navbar.is-dark,.content kbd.navbar{background-color:#363636;color:#fff}.navbar.is-dark .navbar-brand>.navbar-item,.content kbd.navbar .navbar-brand>.navbar-item,.navbar.is-dark .navbar-brand .navbar-link,.content kbd.navbar .navbar-brand .navbar-link{color:#fff}.navbar.is-dark .navbar-brand>a.navbar-item:focus,.content kbd.navbar .navbar-brand>a.navbar-item:focus,.navbar.is-dark .navbar-brand>a.navbar-item:hover,.content kbd.navbar .navbar-brand>a.navbar-item:hover,.navbar.is-dark .navbar-brand>a.navbar-item.is-active,.content kbd.navbar .navbar-brand>a.navbar-item.is-active,.navbar.is-dark .navbar-brand .navbar-link:focus,.content kbd.navbar .navbar-brand .navbar-link:focus,.navbar.is-dark .navbar-brand .navbar-link:hover,.content kbd.navbar .navbar-brand .navbar-link:hover,.navbar.is-dark .navbar-brand .navbar-link.is-active,.content kbd.navbar .navbar-brand .navbar-link.is-active{background-color:#292929;color:#fff}.navbar.is-dark .navbar-brand .navbar-link::after,.content kbd.navbar .navbar-brand .navbar-link::after{border-color:#fff}.navbar.is-dark .navbar-burger,.content kbd.navbar .navbar-burger{color:#fff}@media screen and (min-width: 1056px){.navbar.is-dark .navbar-start>.navbar-item,.content kbd.navbar .navbar-start>.navbar-item,.navbar.is-dark .navbar-start .navbar-link,.content kbd.navbar .navbar-start .navbar-link,.navbar.is-dark .navbar-end>.navbar-item,.content kbd.navbar .navbar-end>.navbar-item,.navbar.is-dark .navbar-end .navbar-link,.content kbd.navbar .navbar-end .navbar-link{color:#fff}.navbar.is-dark .navbar-start>a.navbar-item:focus,.content kbd.navbar .navbar-start>a.navbar-item:focus,.navbar.is-dark .navbar-start>a.navbar-item:hover,.content kbd.navbar .navbar-start>a.navbar-item:hover,.navbar.is-dark .navbar-start>a.navbar-item.is-active,.content kbd.navbar .navbar-start>a.navbar-item.is-active,.navbar.is-dark .navbar-start .navbar-link:focus,.content kbd.navbar .navbar-start .navbar-link:focus,.navbar.is-dark .navbar-start .navbar-link:hover,.content kbd.navbar .navbar-start .navbar-link:hover,.navbar.is-dark .navbar-start .navbar-link.is-active,.content kbd.navbar .navbar-start .navbar-link.is-active,.navbar.is-dark .navbar-end>a.navbar-item:focus,.content kbd.navbar .navbar-end>a.navbar-item:focus,.navbar.is-dark .navbar-end>a.navbar-item:hover,.content kbd.navbar .navbar-end>a.navbar-item:hover,.navbar.is-dark .navbar-end>a.navbar-item.is-active,.content kbd.navbar .navbar-end>a.navbar-item.is-active,.navbar.is-dark .navbar-end .navbar-link:focus,.content kbd.navbar .navbar-end .navbar-link:focus,.navbar.is-dark .navbar-end .navbar-link:hover,.content kbd.navbar .navbar-end .navbar-link:hover,.navbar.is-dark .navbar-end .navbar-link.is-active,.content kbd.navbar .navbar-end .navbar-link.is-active{background-color:#292929;color:#fff}.navbar.is-dark .navbar-start .navbar-link::after,.content kbd.navbar .navbar-start .navbar-link::after,.navbar.is-dark .navbar-end .navbar-link::after,.content kbd.navbar .navbar-end .navbar-link::after{border-color:#fff}.navbar.is-dark .navbar-item.has-dropdown:focus .navbar-link,.content kbd.navbar .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-dark .navbar-item.has-dropdown:hover .navbar-link,.content kbd.navbar .navbar-item.has-dropdown:hover .navbar-link,.navbar.is-dark .navbar-item.has-dropdown.is-active .navbar-link,.content kbd.navbar .navbar-item.has-dropdown.is-active .navbar-link{background-color:#292929;color:#fff}.navbar.is-dark .navbar-dropdown a.navbar-item.is-active,.content kbd.navbar .navbar-dropdown a.navbar-item.is-active{background-color:#363636;color:#fff}}.navbar.is-primary,.docstring>section>a.navbar.docs-sourcelink{background-color:#4eb5de;color:#fff}.navbar.is-primary .navbar-brand>.navbar-item,.docstring>section>a.navbar.docs-sourcelink .navbar-brand>.navbar-item,.navbar.is-primary .navbar-brand .navbar-link,.docstring>section>a.navbar.docs-sourcelink .navbar-brand .navbar-link{color:#fff}.navbar.is-primary .navbar-brand>a.navbar-item:focus,.docstring>section>a.navbar.docs-sourcelink .navbar-brand>a.navbar-item:focus,.navbar.is-primary .navbar-brand>a.navbar-item:hover,.docstring>section>a.navbar.docs-sourcelink .navbar-brand>a.navbar-item:hover,.navbar.is-primary .navbar-brand>a.navbar-item.is-active,.docstring>section>a.navbar.docs-sourcelink .navbar-brand>a.navbar-item.is-active,.navbar.is-primary .navbar-brand .navbar-link:focus,.docstring>section>a.navbar.docs-sourcelink .navbar-brand .navbar-link:focus,.navbar.is-primary .navbar-brand .navbar-link:hover,.docstring>section>a.navbar.docs-sourcelink .navbar-brand .navbar-link:hover,.navbar.is-primary .navbar-brand .navbar-link.is-active,.docstring>section>a.navbar.docs-sourcelink .navbar-brand .navbar-link.is-active{background-color:#39acda;color:#fff}.navbar.is-primary .navbar-brand .navbar-link::after,.docstring>section>a.navbar.docs-sourcelink .navbar-brand .navbar-link::after{border-color:#fff}.navbar.is-primary .navbar-burger,.docstring>section>a.navbar.docs-sourcelink .navbar-burger{color:#fff}@media screen and (min-width: 1056px){.navbar.is-primary .navbar-start>.navbar-item,.docstring>section>a.navbar.docs-sourcelink .navbar-start>.navbar-item,.navbar.is-primary .navbar-start .navbar-link,.docstring>section>a.navbar.docs-sourcelink .navbar-start .navbar-link,.navbar.is-primary .navbar-end>.navbar-item,.docstring>section>a.navbar.docs-sourcelink .navbar-end>.navbar-item,.navbar.is-primary .navbar-end .navbar-link,.docstring>section>a.navbar.docs-sourcelink .navbar-end .navbar-link{color:#fff}.navbar.is-primary .navbar-start>a.navbar-item:focus,.docstring>section>a.navbar.docs-sourcelink .navbar-start>a.navbar-item:focus,.navbar.is-primary .navbar-start>a.navbar-item:hover,.docstring>section>a.navbar.docs-sourcelink .navbar-start>a.navbar-item:hover,.navbar.is-primary .navbar-start>a.navbar-item.is-active,.docstring>section>a.navbar.docs-sourcelink .navbar-start>a.navbar-item.is-active,.navbar.is-primary .navbar-start .navbar-link:focus,.docstring>section>a.navbar.docs-sourcelink .navbar-start .navbar-link:focus,.navbar.is-primary .navbar-start .navbar-link:hover,.docstring>section>a.navbar.docs-sourcelink .navbar-start .navbar-link:hover,.navbar.is-primary .navbar-start .navbar-link.is-active,.docstring>section>a.navbar.docs-sourcelink .navbar-start .navbar-link.is-active,.navbar.is-primary .navbar-end>a.navbar-item:focus,.docstring>section>a.navbar.docs-sourcelink .navbar-end>a.navbar-item:focus,.navbar.is-primary .navbar-end>a.navbar-item:hover,.docstring>section>a.navbar.docs-sourcelink .navbar-end>a.navbar-item:hover,.navbar.is-primary .navbar-end>a.navbar-item.is-active,.docstring>section>a.navbar.docs-sourcelink .navbar-end>a.navbar-item.is-active,.navbar.is-primary .navbar-end .navbar-link:focus,.docstring>section>a.navbar.docs-sourcelink .navbar-end .navbar-link:focus,.navbar.is-primary .navbar-end .navbar-link:hover,.docstring>section>a.navbar.docs-sourcelink .navbar-end .navbar-link:hover,.navbar.is-primary .navbar-end .navbar-link.is-active,.docstring>section>a.navbar.docs-sourcelink .navbar-end .navbar-link.is-active{background-color:#39acda;color:#fff}.navbar.is-primary .navbar-start .navbar-link::after,.docstring>section>a.navbar.docs-sourcelink .navbar-start .navbar-link::after,.navbar.is-primary .navbar-end .navbar-link::after,.docstring>section>a.navbar.docs-sourcelink .navbar-end .navbar-link::after{border-color:#fff}.navbar.is-primary .navbar-item.has-dropdown:focus .navbar-link,.docstring>section>a.navbar.docs-sourcelink .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-primary .navbar-item.has-dropdown:hover .navbar-link,.docstring>section>a.navbar.docs-sourcelink .navbar-item.has-dropdown:hover .navbar-link,.navbar.is-primary .navbar-item.has-dropdown.is-active .navbar-link,.docstring>section>a.navbar.docs-sourcelink .navbar-item.has-dropdown.is-active .navbar-link{background-color:#39acda;color:#fff}.navbar.is-primary .navbar-dropdown a.navbar-item.is-active,.docstring>section>a.navbar.docs-sourcelink .navbar-dropdown a.navbar-item.is-active{background-color:#4eb5de;color:#fff}}.navbar.is-link{background-color:#2e63b8;color:#fff}.navbar.is-link .navbar-brand>.navbar-item,.navbar.is-link .navbar-brand .navbar-link{color:#fff}.navbar.is-link .navbar-brand>a.navbar-item:focus,.navbar.is-link .navbar-brand>a.navbar-item:hover,.navbar.is-link .navbar-brand>a.navbar-item.is-active,.navbar.is-link .navbar-brand .navbar-link:focus,.navbar.is-link .navbar-brand .navbar-link:hover,.navbar.is-link .navbar-brand .navbar-link.is-active{background-color:#2958a4;color:#fff}.navbar.is-link .navbar-brand .navbar-link::after{border-color:#fff}.navbar.is-link .navbar-burger{color:#fff}@media screen and (min-width: 1056px){.navbar.is-link .navbar-start>.navbar-item,.navbar.is-link .navbar-start .navbar-link,.navbar.is-link .navbar-end>.navbar-item,.navbar.is-link .navbar-end .navbar-link{color:#fff}.navbar.is-link .navbar-start>a.navbar-item:focus,.navbar.is-link .navbar-start>a.navbar-item:hover,.navbar.is-link .navbar-start>a.navbar-item.is-active,.navbar.is-link .navbar-start .navbar-link:focus,.navbar.is-link .navbar-start .navbar-link:hover,.navbar.is-link .navbar-start .navbar-link.is-active,.navbar.is-link .navbar-end>a.navbar-item:focus,.navbar.is-link .navbar-end>a.navbar-item:hover,.navbar.is-link .navbar-end>a.navbar-item.is-active,.navbar.is-link .navbar-end .navbar-link:focus,.navbar.is-link .navbar-end .navbar-link:hover,.navbar.is-link .navbar-end .navbar-link.is-active{background-color:#2958a4;color:#fff}.navbar.is-link .navbar-start .navbar-link::after,.navbar.is-link .navbar-end .navbar-link::after{border-color:#fff}.navbar.is-link .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-link .navbar-item.has-dropdown:hover .navbar-link,.navbar.is-link .navbar-item.has-dropdown.is-active .navbar-link{background-color:#2958a4;color:#fff}.navbar.is-link .navbar-dropdown a.navbar-item.is-active{background-color:#2e63b8;color:#fff}}.navbar.is-info{background-color:#209cee;color:#fff}.navbar.is-info .navbar-brand>.navbar-item,.navbar.is-info .navbar-brand .navbar-link{color:#fff}.navbar.is-info .navbar-brand>a.navbar-item:focus,.navbar.is-info .navbar-brand>a.navbar-item:hover,.navbar.is-info .navbar-brand>a.navbar-item.is-active,.navbar.is-info .navbar-brand .navbar-link:focus,.navbar.is-info .navbar-brand .navbar-link:hover,.navbar.is-info .navbar-brand .navbar-link.is-active{background-color:#1190e3;color:#fff}.navbar.is-info .navbar-brand .navbar-link::after{border-color:#fff}.navbar.is-info .navbar-burger{color:#fff}@media screen and (min-width: 1056px){.navbar.is-info .navbar-start>.navbar-item,.navbar.is-info .navbar-start .navbar-link,.navbar.is-info .navbar-end>.navbar-item,.navbar.is-info .navbar-end .navbar-link{color:#fff}.navbar.is-info .navbar-start>a.navbar-item:focus,.navbar.is-info .navbar-start>a.navbar-item:hover,.navbar.is-info .navbar-start>a.navbar-item.is-active,.navbar.is-info .navbar-start .navbar-link:focus,.navbar.is-info .navbar-start .navbar-link:hover,.navbar.is-info .navbar-start .navbar-link.is-active,.navbar.is-info .navbar-end>a.navbar-item:focus,.navbar.is-info .navbar-end>a.navbar-item:hover,.navbar.is-info .navbar-end>a.navbar-item.is-active,.navbar.is-info .navbar-end .navbar-link:focus,.navbar.is-info .navbar-end .navbar-link:hover,.navbar.is-info .navbar-end .navbar-link.is-active{background-color:#1190e3;color:#fff}.navbar.is-info .navbar-start .navbar-link::after,.navbar.is-info .navbar-end .navbar-link::after{border-color:#fff}.navbar.is-info .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-info .navbar-item.has-dropdown:hover .navbar-link,.navbar.is-info .navbar-item.has-dropdown.is-active .navbar-link{background-color:#1190e3;color:#fff}.navbar.is-info .navbar-dropdown a.navbar-item.is-active{background-color:#209cee;color:#fff}}.navbar.is-success{background-color:#22c35b;color:#fff}.navbar.is-success .navbar-brand>.navbar-item,.navbar.is-success .navbar-brand .navbar-link{color:#fff}.navbar.is-success .navbar-brand>a.navbar-item:focus,.navbar.is-success .navbar-brand>a.navbar-item:hover,.navbar.is-success .navbar-brand>a.navbar-item.is-active,.navbar.is-success .navbar-brand .navbar-link:focus,.navbar.is-success .navbar-brand .navbar-link:hover,.navbar.is-success .navbar-brand .navbar-link.is-active{background-color:#1ead51;color:#fff}.navbar.is-success .navbar-brand .navbar-link::after{border-color:#fff}.navbar.is-success .navbar-burger{color:#fff}@media screen and (min-width: 1056px){.navbar.is-success .navbar-start>.navbar-item,.navbar.is-success .navbar-start .navbar-link,.navbar.is-success .navbar-end>.navbar-item,.navbar.is-success .navbar-end .navbar-link{color:#fff}.navbar.is-success .navbar-start>a.navbar-item:focus,.navbar.is-success .navbar-start>a.navbar-item:hover,.navbar.is-success .navbar-start>a.navbar-item.is-active,.navbar.is-success .navbar-start .navbar-link:focus,.navbar.is-success .navbar-start .navbar-link:hover,.navbar.is-success .navbar-start .navbar-link.is-active,.navbar.is-success .navbar-end>a.navbar-item:focus,.navbar.is-success .navbar-end>a.navbar-item:hover,.navbar.is-success .navbar-end>a.navbar-item.is-active,.navbar.is-success .navbar-end .navbar-link:focus,.navbar.is-success .navbar-end .navbar-link:hover,.navbar.is-success .navbar-end .navbar-link.is-active{background-color:#1ead51;color:#fff}.navbar.is-success .navbar-start .navbar-link::after,.navbar.is-success .navbar-end .navbar-link::after{border-color:#fff}.navbar.is-success .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-success .navbar-item.has-dropdown:hover .navbar-link,.navbar.is-success .navbar-item.has-dropdown.is-active .navbar-link{background-color:#1ead51;color:#fff}.navbar.is-success .navbar-dropdown a.navbar-item.is-active{background-color:#22c35b;color:#fff}}.navbar.is-warning{background-color:#ffdd57;color:rgba(0,0,0,0.7)}.navbar.is-warning .navbar-brand>.navbar-item,.navbar.is-warning .navbar-brand .navbar-link{color:rgba(0,0,0,0.7)}.navbar.is-warning .navbar-brand>a.navbar-item:focus,.navbar.is-warning .navbar-brand>a.navbar-item:hover,.navbar.is-warning .navbar-brand>a.navbar-item.is-active,.navbar.is-warning .navbar-brand .navbar-link:focus,.navbar.is-warning .navbar-brand .navbar-link:hover,.navbar.is-warning .navbar-brand .navbar-link.is-active{background-color:#ffd83e;color:rgba(0,0,0,0.7)}.navbar.is-warning .navbar-brand .navbar-link::after{border-color:rgba(0,0,0,0.7)}.navbar.is-warning .navbar-burger{color:rgba(0,0,0,0.7)}@media screen and (min-width: 1056px){.navbar.is-warning .navbar-start>.navbar-item,.navbar.is-warning .navbar-start .navbar-link,.navbar.is-warning .navbar-end>.navbar-item,.navbar.is-warning .navbar-end .navbar-link{color:rgba(0,0,0,0.7)}.navbar.is-warning .navbar-start>a.navbar-item:focus,.navbar.is-warning .navbar-start>a.navbar-item:hover,.navbar.is-warning .navbar-start>a.navbar-item.is-active,.navbar.is-warning .navbar-start .navbar-link:focus,.navbar.is-warning .navbar-start .navbar-link:hover,.navbar.is-warning .navbar-start .navbar-link.is-active,.navbar.is-warning .navbar-end>a.navbar-item:focus,.navbar.is-warning .navbar-end>a.navbar-item:hover,.navbar.is-warning .navbar-end>a.navbar-item.is-active,.navbar.is-warning .navbar-end .navbar-link:focus,.navbar.is-warning .navbar-end .navbar-link:hover,.navbar.is-warning .navbar-end .navbar-link.is-active{background-color:#ffd83e;color:rgba(0,0,0,0.7)}.navbar.is-warning .navbar-start .navbar-link::after,.navbar.is-warning .navbar-end .navbar-link::after{border-color:rgba(0,0,0,0.7)}.navbar.is-warning .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-warning .navbar-item.has-dropdown:hover .navbar-link,.navbar.is-warning .navbar-item.has-dropdown.is-active .navbar-link{background-color:#ffd83e;color:rgba(0,0,0,0.7)}.navbar.is-warning .navbar-dropdown a.navbar-item.is-active{background-color:#ffdd57;color:rgba(0,0,0,0.7)}}.navbar.is-danger{background-color:#da0b00;color:#fff}.navbar.is-danger .navbar-brand>.navbar-item,.navbar.is-danger .navbar-brand .navbar-link{color:#fff}.navbar.is-danger .navbar-brand>a.navbar-item:focus,.navbar.is-danger .navbar-brand>a.navbar-item:hover,.navbar.is-danger .navbar-brand>a.navbar-item.is-active,.navbar.is-danger .navbar-brand .navbar-link:focus,.navbar.is-danger .navbar-brand .navbar-link:hover,.navbar.is-danger .navbar-brand .navbar-link.is-active{background-color:#c10a00;color:#fff}.navbar.is-danger .navbar-brand .navbar-link::after{border-color:#fff}.navbar.is-danger .navbar-burger{color:#fff}@media screen and (min-width: 1056px){.navbar.is-danger .navbar-start>.navbar-item,.navbar.is-danger .navbar-start .navbar-link,.navbar.is-danger .navbar-end>.navbar-item,.navbar.is-danger .navbar-end .navbar-link{color:#fff}.navbar.is-danger .navbar-start>a.navbar-item:focus,.navbar.is-danger .navbar-start>a.navbar-item:hover,.navbar.is-danger .navbar-start>a.navbar-item.is-active,.navbar.is-danger .navbar-start .navbar-link:focus,.navbar.is-danger .navbar-start .navbar-link:hover,.navbar.is-danger .navbar-start .navbar-link.is-active,.navbar.is-danger .navbar-end>a.navbar-item:focus,.navbar.is-danger .navbar-end>a.navbar-item:hover,.navbar.is-danger .navbar-end>a.navbar-item.is-active,.navbar.is-danger .navbar-end .navbar-link:focus,.navbar.is-danger .navbar-end .navbar-link:hover,.navbar.is-danger .navbar-end .navbar-link.is-active{background-color:#c10a00;color:#fff}.navbar.is-danger .navbar-start .navbar-link::after,.navbar.is-danger .navbar-end .navbar-link::after{border-color:#fff}.navbar.is-danger .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-danger .navbar-item.has-dropdown:hover .navbar-link,.navbar.is-danger .navbar-item.has-dropdown.is-active .navbar-link{background-color:#c10a00;color:#fff}.navbar.is-danger .navbar-dropdown a.navbar-item.is-active{background-color:#da0b00;color:#fff}}.navbar>.container{align-items:stretch;display:flex;min-height:3.25rem;width:100%}.navbar.has-shadow{box-shadow:0 2px 0 0 #f5f5f5}.navbar.is-fixed-bottom,.navbar.is-fixed-top{left:0;position:fixed;right:0;z-index:30}.navbar.is-fixed-bottom{bottom:0}.navbar.is-fixed-bottom.has-shadow{box-shadow:0 -2px 0 0 #f5f5f5}.navbar.is-fixed-top{top:0}html.has-navbar-fixed-top,body.has-navbar-fixed-top{padding-top:3.25rem}html.has-navbar-fixed-bottom,body.has-navbar-fixed-bottom{padding-bottom:3.25rem}.navbar-brand,.navbar-tabs{align-items:stretch;display:flex;flex-shrink:0;min-height:3.25rem}.navbar-brand a.navbar-item:focus,.navbar-brand a.navbar-item:hover{background-color:transparent}.navbar-tabs{-webkit-overflow-scrolling:touch;max-width:100vw;overflow-x:auto;overflow-y:hidden}.navbar-burger{color:#222;-moz-appearance:none;-webkit-appearance:none;appearance:none;background:none;border:none;cursor:pointer;display:block;height:3.25rem;position:relative;width:3.25rem;margin-left:auto}.navbar-burger span{background-color:currentColor;display:block;height:1px;left:calc(50% - 8px);position:absolute;transform-origin:center;transition-duration:86ms;transition-property:background-color, opacity, transform;transition-timing-function:ease-out;width:16px}.navbar-burger span:nth-child(1){top:calc(50% - 6px)}.navbar-burger span:nth-child(2){top:calc(50% - 1px)}.navbar-burger span:nth-child(3){top:calc(50% + 4px)}.navbar-burger:hover{background-color:rgba(0,0,0,0.05)}.navbar-burger.is-active span:nth-child(1){transform:translateY(5px) rotate(45deg)}.navbar-burger.is-active span:nth-child(2){opacity:0}.navbar-burger.is-active span:nth-child(3){transform:translateY(-5px) rotate(-45deg)}.navbar-menu{display:none}.navbar-item,.navbar-link{color:#222;display:block;line-height:1.5;padding:0.5rem 0.75rem;position:relative}.navbar-item .icon:only-child,.navbar-link .icon:only-child{margin-left:-0.25rem;margin-right:-0.25rem}a.navbar-item,.navbar-link{cursor:pointer}a.navbar-item:focus,a.navbar-item:focus-within,a.navbar-item:hover,a.navbar-item.is-active,.navbar-link:focus,.navbar-link:focus-within,.navbar-link:hover,.navbar-link.is-active{background-color:#fafafa;color:#2e63b8}.navbar-item{flex-grow:0;flex-shrink:0}.navbar-item img{max-height:1.75rem}.navbar-item.has-dropdown{padding:0}.navbar-item.is-expanded{flex-grow:1;flex-shrink:1}.navbar-item.is-tab{border-bottom:1px solid transparent;min-height:3.25rem;padding-bottom:calc(0.5rem - 1px)}.navbar-item.is-tab:focus,.navbar-item.is-tab:hover{background-color:rgba(0,0,0,0);border-bottom-color:#2e63b8}.navbar-item.is-tab.is-active{background-color:rgba(0,0,0,0);border-bottom-color:#2e63b8;border-bottom-style:solid;border-bottom-width:3px;color:#2e63b8;padding-bottom:calc(0.5rem - 3px)}.navbar-content{flex-grow:1;flex-shrink:1}.navbar-link:not(.is-arrowless){padding-right:2.5em}.navbar-link:not(.is-arrowless)::after{border-color:#2e63b8;margin-top:-0.375em;right:1.125em}.navbar-dropdown{font-size:0.875rem;padding-bottom:0.5rem;padding-top:0.5rem}.navbar-dropdown .navbar-item{padding-left:1.5rem;padding-right:1.5rem}.navbar-divider{background-color:#f5f5f5;border:none;display:none;height:2px;margin:0.5rem 0}@media screen and (max-width: 1055px){.navbar>.container{display:block}.navbar-brand .navbar-item,.navbar-tabs .navbar-item{align-items:center;display:flex}.navbar-link::after{display:none}.navbar-menu{background-color:#fff;box-shadow:0 8px 16px rgba(10,10,10,0.1);padding:0.5rem 0}.navbar-menu.is-active{display:block}.navbar.is-fixed-bottom-touch,.navbar.is-fixed-top-touch{left:0;position:fixed;right:0;z-index:30}.navbar.is-fixed-bottom-touch{bottom:0}.navbar.is-fixed-bottom-touch.has-shadow{box-shadow:0 -2px 3px rgba(10,10,10,0.1)}.navbar.is-fixed-top-touch{top:0}.navbar.is-fixed-top .navbar-menu,.navbar.is-fixed-top-touch .navbar-menu{-webkit-overflow-scrolling:touch;max-height:calc(100vh - 3.25rem);overflow:auto}html.has-navbar-fixed-top-touch,body.has-navbar-fixed-top-touch{padding-top:3.25rem}html.has-navbar-fixed-bottom-touch,body.has-navbar-fixed-bottom-touch{padding-bottom:3.25rem}}@media screen and (min-width: 1056px){.navbar,.navbar-menu,.navbar-start,.navbar-end{align-items:stretch;display:flex}.navbar{min-height:3.25rem}.navbar.is-spaced{padding:1rem 2rem}.navbar.is-spaced .navbar-start,.navbar.is-spaced .navbar-end{align-items:center}.navbar.is-spaced a.navbar-item,.navbar.is-spaced .navbar-link{border-radius:4px}.navbar.is-transparent a.navbar-item:focus,.navbar.is-transparent a.navbar-item:hover,.navbar.is-transparent a.navbar-item.is-active,.navbar.is-transparent .navbar-link:focus,.navbar.is-transparent .navbar-link:hover,.navbar.is-transparent .navbar-link.is-active{background-color:transparent !important}.navbar.is-transparent .navbar-item.has-dropdown.is-active .navbar-link,.navbar.is-transparent .navbar-item.has-dropdown.is-hoverable:focus .navbar-link,.navbar.is-transparent .navbar-item.has-dropdown.is-hoverable:focus-within .navbar-link,.navbar.is-transparent .navbar-item.has-dropdown.is-hoverable:hover .navbar-link{background-color:transparent !important}.navbar.is-transparent .navbar-dropdown a.navbar-item:focus,.navbar.is-transparent .navbar-dropdown a.navbar-item:hover{background-color:#f5f5f5;color:#0a0a0a}.navbar.is-transparent .navbar-dropdown a.navbar-item.is-active{background-color:#f5f5f5;color:#2e63b8}.navbar-burger{display:none}.navbar-item,.navbar-link{align-items:center;display:flex}.navbar-item.has-dropdown{align-items:stretch}.navbar-item.has-dropdown-up .navbar-link::after{transform:rotate(135deg) translate(0.25em, -0.25em)}.navbar-item.has-dropdown-up .navbar-dropdown{border-bottom:2px solid #dbdbdb;border-radius:6px 6px 0 0;border-top:none;bottom:100%;box-shadow:0 -8px 8px rgba(10,10,10,0.1);top:auto}.navbar-item.is-active .navbar-dropdown,.navbar-item.is-hoverable:focus .navbar-dropdown,.navbar-item.is-hoverable:focus-within .navbar-dropdown,.navbar-item.is-hoverable:hover .navbar-dropdown{display:block}.navbar.is-spaced .navbar-item.is-active .navbar-dropdown,.navbar-item.is-active .navbar-dropdown.is-boxed,.navbar.is-spaced .navbar-item.is-hoverable:focus .navbar-dropdown,.navbar-item.is-hoverable:focus .navbar-dropdown.is-boxed,.navbar.is-spaced .navbar-item.is-hoverable:focus-within .navbar-dropdown,.navbar-item.is-hoverable:focus-within .navbar-dropdown.is-boxed,.navbar.is-spaced .navbar-item.is-hoverable:hover .navbar-dropdown,.navbar-item.is-hoverable:hover .navbar-dropdown.is-boxed{opacity:1;pointer-events:auto;transform:translateY(0)}.navbar-menu{flex-grow:1;flex-shrink:0}.navbar-start{justify-content:flex-start;margin-right:auto}.navbar-end{justify-content:flex-end;margin-left:auto}.navbar-dropdown{background-color:#fff;border-bottom-left-radius:6px;border-bottom-right-radius:6px;border-top:2px solid #dbdbdb;box-shadow:0 8px 8px rgba(10,10,10,0.1);display:none;font-size:0.875rem;left:0;min-width:100%;position:absolute;top:100%;z-index:20}.navbar-dropdown .navbar-item{padding:0.375rem 1rem;white-space:nowrap}.navbar-dropdown a.navbar-item{padding-right:3rem}.navbar-dropdown a.navbar-item:focus,.navbar-dropdown a.navbar-item:hover{background-color:#f5f5f5;color:#0a0a0a}.navbar-dropdown a.navbar-item.is-active{background-color:#f5f5f5;color:#2e63b8}.navbar.is-spaced .navbar-dropdown,.navbar-dropdown.is-boxed{border-radius:6px;border-top:none;box-shadow:0 8px 8px rgba(10,10,10,0.1), 0 0 0 1px rgba(10,10,10,0.1);display:block;opacity:0;pointer-events:none;top:calc(100% + (-4px));transform:translateY(-5px);transition-duration:86ms;transition-property:opacity, transform}.navbar-dropdown.is-right{left:auto;right:0}.navbar-divider{display:block}.navbar>.container .navbar-brand,.container>.navbar .navbar-brand{margin-left:-.75rem}.navbar>.container .navbar-menu,.container>.navbar .navbar-menu{margin-right:-.75rem}.navbar.is-fixed-bottom-desktop,.navbar.is-fixed-top-desktop{left:0;position:fixed;right:0;z-index:30}.navbar.is-fixed-bottom-desktop{bottom:0}.navbar.is-fixed-bottom-desktop.has-shadow{box-shadow:0 -2px 3px rgba(10,10,10,0.1)}.navbar.is-fixed-top-desktop{top:0}html.has-navbar-fixed-top-desktop,body.has-navbar-fixed-top-desktop{padding-top:3.25rem}html.has-navbar-fixed-bottom-desktop,body.has-navbar-fixed-bottom-desktop{padding-bottom:3.25rem}html.has-spaced-navbar-fixed-top,body.has-spaced-navbar-fixed-top{padding-top:5.25rem}html.has-spaced-navbar-fixed-bottom,body.has-spaced-navbar-fixed-bottom{padding-bottom:5.25rem}a.navbar-item.is-active,.navbar-link.is-active{color:#0a0a0a}a.navbar-item.is-active:not(:focus):not(:hover),.navbar-link.is-active:not(:focus):not(:hover){background-color:rgba(0,0,0,0)}.navbar-item.has-dropdown:focus .navbar-link,.navbar-item.has-dropdown:hover .navbar-link,.navbar-item.has-dropdown.is-active .navbar-link{background-color:#fafafa}}.hero.is-fullheight-with-navbar{min-height:calc(100vh - 3.25rem)}.pagination{font-size:1rem;margin:-.25rem}.pagination.is-small,#documenter .docs-sidebar form.docs-search>input.pagination{font-size:.75rem}.pagination.is-medium{font-size:1.25rem}.pagination.is-large{font-size:1.5rem}.pagination.is-rounded .pagination-previous,#documenter .docs-sidebar form.docs-search>input.pagination .pagination-previous,.pagination.is-rounded .pagination-next,#documenter .docs-sidebar form.docs-search>input.pagination .pagination-next{padding-left:1em;padding-right:1em;border-radius:9999px}.pagination.is-rounded .pagination-link,#documenter .docs-sidebar form.docs-search>input.pagination .pagination-link{border-radius:9999px}.pagination,.pagination-list{align-items:center;display:flex;justify-content:center;text-align:center}.pagination-previous,.pagination-next,.pagination-link,.pagination-ellipsis{font-size:1em;justify-content:center;margin:.25rem;padding-left:.5em;padding-right:.5em;text-align:center}.pagination-previous,.pagination-next,.pagination-link{border-color:#dbdbdb;color:#222;min-width:2.5em}.pagination-previous:hover,.pagination-next:hover,.pagination-link:hover{border-color:#b5b5b5;color:#363636}.pagination-previous:focus,.pagination-next:focus,.pagination-link:focus{border-color:#3c5dcd}.pagination-previous:active,.pagination-next:active,.pagination-link:active{box-shadow:inset 0 1px 2px rgba(10,10,10,0.2)}.pagination-previous[disabled],.pagination-previous.is-disabled,.pagination-next[disabled],.pagination-next.is-disabled,.pagination-link[disabled],.pagination-link.is-disabled{background-color:#dbdbdb;border-color:#dbdbdb;box-shadow:none;color:#6b6b6b;opacity:0.5}.pagination-previous,.pagination-next{padding-left:.75em;padding-right:.75em;white-space:nowrap}.pagination-link.is-current{background-color:#2e63b8;border-color:#2e63b8;color:#fff}.pagination-ellipsis{color:#b5b5b5;pointer-events:none}.pagination-list{flex-wrap:wrap}.pagination-list li{list-style:none}@media screen and (max-width: 768px){.pagination{flex-wrap:wrap}.pagination-previous,.pagination-next{flex-grow:1;flex-shrink:1}.pagination-list li{flex-grow:1;flex-shrink:1}}@media screen and (min-width: 769px),print{.pagination-list{flex-grow:1;flex-shrink:1;justify-content:flex-start;order:1}.pagination-previous,.pagination-next,.pagination-link,.pagination-ellipsis{margin-bottom:0;margin-top:0}.pagination-previous{order:2}.pagination-next{order:3}.pagination{justify-content:space-between;margin-bottom:0;margin-top:0}.pagination.is-centered .pagination-previous{order:1}.pagination.is-centered .pagination-list{justify-content:center;order:2}.pagination.is-centered .pagination-next{order:3}.pagination.is-right .pagination-previous{order:1}.pagination.is-right .pagination-next{order:2}.pagination.is-right .pagination-list{justify-content:flex-end;order:3}}.panel{border-radius:6px;box-shadow:#bbb;font-size:1rem}.panel:not(:last-child){margin-bottom:1.5rem}.panel.is-white .panel-heading{background-color:#fff;color:#0a0a0a}.panel.is-white .panel-tabs a.is-active{border-bottom-color:#fff}.panel.is-white .panel-block.is-active .panel-icon{color:#fff}.panel.is-black .panel-heading{background-color:#0a0a0a;color:#fff}.panel.is-black .panel-tabs a.is-active{border-bottom-color:#0a0a0a}.panel.is-black .panel-block.is-active .panel-icon{color:#0a0a0a}.panel.is-light .panel-heading{background-color:#f5f5f5;color:rgba(0,0,0,0.7)}.panel.is-light .panel-tabs a.is-active{border-bottom-color:#f5f5f5}.panel.is-light .panel-block.is-active .panel-icon{color:#f5f5f5}.panel.is-dark .panel-heading,.content kbd.panel .panel-heading{background-color:#363636;color:#fff}.panel.is-dark .panel-tabs a.is-active,.content kbd.panel .panel-tabs a.is-active{border-bottom-color:#363636}.panel.is-dark .panel-block.is-active .panel-icon,.content kbd.panel .panel-block.is-active .panel-icon{color:#363636}.panel.is-primary .panel-heading,.docstring>section>a.panel.docs-sourcelink .panel-heading{background-color:#4eb5de;color:#fff}.panel.is-primary .panel-tabs a.is-active,.docstring>section>a.panel.docs-sourcelink .panel-tabs a.is-active{border-bottom-color:#4eb5de}.panel.is-primary .panel-block.is-active .panel-icon,.docstring>section>a.panel.docs-sourcelink .panel-block.is-active .panel-icon{color:#4eb5de}.panel.is-link .panel-heading{background-color:#2e63b8;color:#fff}.panel.is-link .panel-tabs a.is-active{border-bottom-color:#2e63b8}.panel.is-link .panel-block.is-active .panel-icon{color:#2e63b8}.panel.is-info .panel-heading{background-color:#209cee;color:#fff}.panel.is-info .panel-tabs a.is-active{border-bottom-color:#209cee}.panel.is-info .panel-block.is-active .panel-icon{color:#209cee}.panel.is-success .panel-heading{background-color:#22c35b;color:#fff}.panel.is-success .panel-tabs a.is-active{border-bottom-color:#22c35b}.panel.is-success .panel-block.is-active .panel-icon{color:#22c35b}.panel.is-warning .panel-heading{background-color:#ffdd57;color:rgba(0,0,0,0.7)}.panel.is-warning .panel-tabs a.is-active{border-bottom-color:#ffdd57}.panel.is-warning .panel-block.is-active .panel-icon{color:#ffdd57}.panel.is-danger .panel-heading{background-color:#da0b00;color:#fff}.panel.is-danger .panel-tabs a.is-active{border-bottom-color:#da0b00}.panel.is-danger .panel-block.is-active .panel-icon{color:#da0b00}.panel-tabs:not(:last-child),.panel-block:not(:last-child){border-bottom:1px solid #ededed}.panel-heading{background-color:#ededed;border-radius:6px 6px 0 0;color:#222;font-size:1.25em;font-weight:700;line-height:1.25;padding:0.75em 1em}.panel-tabs{align-items:flex-end;display:flex;font-size:.875em;justify-content:center}.panel-tabs a{border-bottom:1px solid #dbdbdb;margin-bottom:-1px;padding:0.5em}.panel-tabs a.is-active{border-bottom-color:#4a4a4a;color:#363636}.panel-list a{color:#222}.panel-list a:hover{color:#2e63b8}.panel-block{align-items:center;color:#222;display:flex;justify-content:flex-start;padding:0.5em 0.75em}.panel-block input[type="checkbox"]{margin-right:.75em}.panel-block>.control{flex-grow:1;flex-shrink:1;width:100%}.panel-block.is-wrapped{flex-wrap:wrap}.panel-block.is-active{border-left-color:#2e63b8;color:#363636}.panel-block.is-active .panel-icon{color:#2e63b8}.panel-block:last-child{border-bottom-left-radius:6px;border-bottom-right-radius:6px}a.panel-block,label.panel-block{cursor:pointer}a.panel-block:hover,label.panel-block:hover{background-color:#f5f5f5}.panel-icon{display:inline-block;font-size:14px;height:1em;line-height:1em;text-align:center;vertical-align:top;width:1em;color:#6b6b6b;margin-right:.75em}.panel-icon .fa{font-size:inherit;line-height:inherit}.tabs{-webkit-overflow-scrolling:touch;align-items:stretch;display:flex;font-size:1rem;justify-content:space-between;overflow:hidden;overflow-x:auto;white-space:nowrap}.tabs a{align-items:center;border-bottom-color:#dbdbdb;border-bottom-style:solid;border-bottom-width:1px;color:#222;display:flex;justify-content:center;margin-bottom:-1px;padding:0.5em 1em;vertical-align:top}.tabs a:hover{border-bottom-color:#222;color:#222}.tabs li{display:block}.tabs li.is-active a{border-bottom-color:#2e63b8;color:#2e63b8}.tabs ul{align-items:center;border-bottom-color:#dbdbdb;border-bottom-style:solid;border-bottom-width:1px;display:flex;flex-grow:1;flex-shrink:0;justify-content:flex-start}.tabs ul.is-left{padding-right:0.75em}.tabs ul.is-center{flex:none;justify-content:center;padding-left:0.75em;padding-right:0.75em}.tabs ul.is-right{justify-content:flex-end;padding-left:0.75em}.tabs .icon:first-child{margin-right:.5em}.tabs .icon:last-child{margin-left:.5em}.tabs.is-centered ul{justify-content:center}.tabs.is-right ul{justify-content:flex-end}.tabs.is-boxed a{border:1px solid transparent;border-radius:4px 4px 0 0}.tabs.is-boxed a:hover{background-color:#f5f5f5;border-bottom-color:#dbdbdb}.tabs.is-boxed li.is-active a{background-color:#fff;border-color:#dbdbdb;border-bottom-color:rgba(0,0,0,0) !important}.tabs.is-fullwidth li{flex-grow:1;flex-shrink:0}.tabs.is-toggle a{border-color:#dbdbdb;border-style:solid;border-width:1px;margin-bottom:0;position:relative}.tabs.is-toggle a:hover{background-color:#f5f5f5;border-color:#b5b5b5;z-index:2}.tabs.is-toggle li+li{margin-left:-1px}.tabs.is-toggle li:first-child a{border-top-left-radius:4px;border-bottom-left-radius:4px}.tabs.is-toggle li:last-child a{border-top-right-radius:4px;border-bottom-right-radius:4px}.tabs.is-toggle li.is-active a{background-color:#2e63b8;border-color:#2e63b8;color:#fff;z-index:1}.tabs.is-toggle ul{border-bottom:none}.tabs.is-toggle.is-toggle-rounded li:first-child a{border-bottom-left-radius:9999px;border-top-left-radius:9999px;padding-left:1.25em}.tabs.is-toggle.is-toggle-rounded li:last-child a{border-bottom-right-radius:9999px;border-top-right-radius:9999px;padding-right:1.25em}.tabs.is-small,#documenter .docs-sidebar form.docs-search>input.tabs{font-size:.75rem}.tabs.is-medium{font-size:1.25rem}.tabs.is-large{font-size:1.5rem}.column{display:block;flex-basis:0;flex-grow:1;flex-shrink:1;padding:.75rem}.columns.is-mobile>.column.is-narrow{flex:none;width:unset}.columns.is-mobile>.column.is-full{flex:none;width:100%}.columns.is-mobile>.column.is-three-quarters{flex:none;width:75%}.columns.is-mobile>.column.is-two-thirds{flex:none;width:66.6666%}.columns.is-mobile>.column.is-half{flex:none;width:50%}.columns.is-mobile>.column.is-one-third{flex:none;width:33.3333%}.columns.is-mobile>.column.is-one-quarter{flex:none;width:25%}.columns.is-mobile>.column.is-one-fifth{flex:none;width:20%}.columns.is-mobile>.column.is-two-fifths{flex:none;width:40%}.columns.is-mobile>.column.is-three-fifths{flex:none;width:60%}.columns.is-mobile>.column.is-four-fifths{flex:none;width:80%}.columns.is-mobile>.column.is-offset-three-quarters{margin-left:75%}.columns.is-mobile>.column.is-offset-two-thirds{margin-left:66.6666%}.columns.is-mobile>.column.is-offset-half{margin-left:50%}.columns.is-mobile>.column.is-offset-one-third{margin-left:33.3333%}.columns.is-mobile>.column.is-offset-one-quarter{margin-left:25%}.columns.is-mobile>.column.is-offset-one-fifth{margin-left:20%}.columns.is-mobile>.column.is-offset-two-fifths{margin-left:40%}.columns.is-mobile>.column.is-offset-three-fifths{margin-left:60%}.columns.is-mobile>.column.is-offset-four-fifths{margin-left:80%}.columns.is-mobile>.column.is-0{flex:none;width:0%}.columns.is-mobile>.column.is-offset-0{margin-left:0%}.columns.is-mobile>.column.is-1{flex:none;width:8.33333337%}.columns.is-mobile>.column.is-offset-1{margin-left:8.33333337%}.columns.is-mobile>.column.is-2{flex:none;width:16.66666674%}.columns.is-mobile>.column.is-offset-2{margin-left:16.66666674%}.columns.is-mobile>.column.is-3{flex:none;width:25%}.columns.is-mobile>.column.is-offset-3{margin-left:25%}.columns.is-mobile>.column.is-4{flex:none;width:33.33333337%}.columns.is-mobile>.column.is-offset-4{margin-left:33.33333337%}.columns.is-mobile>.column.is-5{flex:none;width:41.66666674%}.columns.is-mobile>.column.is-offset-5{margin-left:41.66666674%}.columns.is-mobile>.column.is-6{flex:none;width:50%}.columns.is-mobile>.column.is-offset-6{margin-left:50%}.columns.is-mobile>.column.is-7{flex:none;width:58.33333337%}.columns.is-mobile>.column.is-offset-7{margin-left:58.33333337%}.columns.is-mobile>.column.is-8{flex:none;width:66.66666674%}.columns.is-mobile>.column.is-offset-8{margin-left:66.66666674%}.columns.is-mobile>.column.is-9{flex:none;width:75%}.columns.is-mobile>.column.is-offset-9{margin-left:75%}.columns.is-mobile>.column.is-10{flex:none;width:83.33333337%}.columns.is-mobile>.column.is-offset-10{margin-left:83.33333337%}.columns.is-mobile>.column.is-11{flex:none;width:91.66666674%}.columns.is-mobile>.column.is-offset-11{margin-left:91.66666674%}.columns.is-mobile>.column.is-12{flex:none;width:100%}.columns.is-mobile>.column.is-offset-12{margin-left:100%}@media screen and (max-width: 768px){.column.is-narrow-mobile{flex:none;width:unset}.column.is-full-mobile{flex:none;width:100%}.column.is-three-quarters-mobile{flex:none;width:75%}.column.is-two-thirds-mobile{flex:none;width:66.6666%}.column.is-half-mobile{flex:none;width:50%}.column.is-one-third-mobile{flex:none;width:33.3333%}.column.is-one-quarter-mobile{flex:none;width:25%}.column.is-one-fifth-mobile{flex:none;width:20%}.column.is-two-fifths-mobile{flex:none;width:40%}.column.is-three-fifths-mobile{flex:none;width:60%}.column.is-four-fifths-mobile{flex:none;width:80%}.column.is-offset-three-quarters-mobile{margin-left:75%}.column.is-offset-two-thirds-mobile{margin-left:66.6666%}.column.is-offset-half-mobile{margin-left:50%}.column.is-offset-one-third-mobile{margin-left:33.3333%}.column.is-offset-one-quarter-mobile{margin-left:25%}.column.is-offset-one-fifth-mobile{margin-left:20%}.column.is-offset-two-fifths-mobile{margin-left:40%}.column.is-offset-three-fifths-mobile{margin-left:60%}.column.is-offset-four-fifths-mobile{margin-left:80%}.column.is-0-mobile{flex:none;width:0%}.column.is-offset-0-mobile{margin-left:0%}.column.is-1-mobile{flex:none;width:8.33333337%}.column.is-offset-1-mobile{margin-left:8.33333337%}.column.is-2-mobile{flex:none;width:16.66666674%}.column.is-offset-2-mobile{margin-left:16.66666674%}.column.is-3-mobile{flex:none;width:25%}.column.is-offset-3-mobile{margin-left:25%}.column.is-4-mobile{flex:none;width:33.33333337%}.column.is-offset-4-mobile{margin-left:33.33333337%}.column.is-5-mobile{flex:none;width:41.66666674%}.column.is-offset-5-mobile{margin-left:41.66666674%}.column.is-6-mobile{flex:none;width:50%}.column.is-offset-6-mobile{margin-left:50%}.column.is-7-mobile{flex:none;width:58.33333337%}.column.is-offset-7-mobile{margin-left:58.33333337%}.column.is-8-mobile{flex:none;width:66.66666674%}.column.is-offset-8-mobile{margin-left:66.66666674%}.column.is-9-mobile{flex:none;width:75%}.column.is-offset-9-mobile{margin-left:75%}.column.is-10-mobile{flex:none;width:83.33333337%}.column.is-offset-10-mobile{margin-left:83.33333337%}.column.is-11-mobile{flex:none;width:91.66666674%}.column.is-offset-11-mobile{margin-left:91.66666674%}.column.is-12-mobile{flex:none;width:100%}.column.is-offset-12-mobile{margin-left:100%}}@media screen and (min-width: 769px),print{.column.is-narrow,.column.is-narrow-tablet{flex:none;width:unset}.column.is-full,.column.is-full-tablet{flex:none;width:100%}.column.is-three-quarters,.column.is-three-quarters-tablet{flex:none;width:75%}.column.is-two-thirds,.column.is-two-thirds-tablet{flex:none;width:66.6666%}.column.is-half,.column.is-half-tablet{flex:none;width:50%}.column.is-one-third,.column.is-one-third-tablet{flex:none;width:33.3333%}.column.is-one-quarter,.column.is-one-quarter-tablet{flex:none;width:25%}.column.is-one-fifth,.column.is-one-fifth-tablet{flex:none;width:20%}.column.is-two-fifths,.column.is-two-fifths-tablet{flex:none;width:40%}.column.is-three-fifths,.column.is-three-fifths-tablet{flex:none;width:60%}.column.is-four-fifths,.column.is-four-fifths-tablet{flex:none;width:80%}.column.is-offset-three-quarters,.column.is-offset-three-quarters-tablet{margin-left:75%}.column.is-offset-two-thirds,.column.is-offset-two-thirds-tablet{margin-left:66.6666%}.column.is-offset-half,.column.is-offset-half-tablet{margin-left:50%}.column.is-offset-one-third,.column.is-offset-one-third-tablet{margin-left:33.3333%}.column.is-offset-one-quarter,.column.is-offset-one-quarter-tablet{margin-left:25%}.column.is-offset-one-fifth,.column.is-offset-one-fifth-tablet{margin-left:20%}.column.is-offset-two-fifths,.column.is-offset-two-fifths-tablet{margin-left:40%}.column.is-offset-three-fifths,.column.is-offset-three-fifths-tablet{margin-left:60%}.column.is-offset-four-fifths,.column.is-offset-four-fifths-tablet{margin-left:80%}.column.is-0,.column.is-0-tablet{flex:none;width:0%}.column.is-offset-0,.column.is-offset-0-tablet{margin-left:0%}.column.is-1,.column.is-1-tablet{flex:none;width:8.33333337%}.column.is-offset-1,.column.is-offset-1-tablet{margin-left:8.33333337%}.column.is-2,.column.is-2-tablet{flex:none;width:16.66666674%}.column.is-offset-2,.column.is-offset-2-tablet{margin-left:16.66666674%}.column.is-3,.column.is-3-tablet{flex:none;width:25%}.column.is-offset-3,.column.is-offset-3-tablet{margin-left:25%}.column.is-4,.column.is-4-tablet{flex:none;width:33.33333337%}.column.is-offset-4,.column.is-offset-4-tablet{margin-left:33.33333337%}.column.is-5,.column.is-5-tablet{flex:none;width:41.66666674%}.column.is-offset-5,.column.is-offset-5-tablet{margin-left:41.66666674%}.column.is-6,.column.is-6-tablet{flex:none;width:50%}.column.is-offset-6,.column.is-offset-6-tablet{margin-left:50%}.column.is-7,.column.is-7-tablet{flex:none;width:58.33333337%}.column.is-offset-7,.column.is-offset-7-tablet{margin-left:58.33333337%}.column.is-8,.column.is-8-tablet{flex:none;width:66.66666674%}.column.is-offset-8,.column.is-offset-8-tablet{margin-left:66.66666674%}.column.is-9,.column.is-9-tablet{flex:none;width:75%}.column.is-offset-9,.column.is-offset-9-tablet{margin-left:75%}.column.is-10,.column.is-10-tablet{flex:none;width:83.33333337%}.column.is-offset-10,.column.is-offset-10-tablet{margin-left:83.33333337%}.column.is-11,.column.is-11-tablet{flex:none;width:91.66666674%}.column.is-offset-11,.column.is-offset-11-tablet{margin-left:91.66666674%}.column.is-12,.column.is-12-tablet{flex:none;width:100%}.column.is-offset-12,.column.is-offset-12-tablet{margin-left:100%}}@media screen and (max-width: 1055px){.column.is-narrow-touch{flex:none;width:unset}.column.is-full-touch{flex:none;width:100%}.column.is-three-quarters-touch{flex:none;width:75%}.column.is-two-thirds-touch{flex:none;width:66.6666%}.column.is-half-touch{flex:none;width:50%}.column.is-one-third-touch{flex:none;width:33.3333%}.column.is-one-quarter-touch{flex:none;width:25%}.column.is-one-fifth-touch{flex:none;width:20%}.column.is-two-fifths-touch{flex:none;width:40%}.column.is-three-fifths-touch{flex:none;width:60%}.column.is-four-fifths-touch{flex:none;width:80%}.column.is-offset-three-quarters-touch{margin-left:75%}.column.is-offset-two-thirds-touch{margin-left:66.6666%}.column.is-offset-half-touch{margin-left:50%}.column.is-offset-one-third-touch{margin-left:33.3333%}.column.is-offset-one-quarter-touch{margin-left:25%}.column.is-offset-one-fifth-touch{margin-left:20%}.column.is-offset-two-fifths-touch{margin-left:40%}.column.is-offset-three-fifths-touch{margin-left:60%}.column.is-offset-four-fifths-touch{margin-left:80%}.column.is-0-touch{flex:none;width:0%}.column.is-offset-0-touch{margin-left:0%}.column.is-1-touch{flex:none;width:8.33333337%}.column.is-offset-1-touch{margin-left:8.33333337%}.column.is-2-touch{flex:none;width:16.66666674%}.column.is-offset-2-touch{margin-left:16.66666674%}.column.is-3-touch{flex:none;width:25%}.column.is-offset-3-touch{margin-left:25%}.column.is-4-touch{flex:none;width:33.33333337%}.column.is-offset-4-touch{margin-left:33.33333337%}.column.is-5-touch{flex:none;width:41.66666674%}.column.is-offset-5-touch{margin-left:41.66666674%}.column.is-6-touch{flex:none;width:50%}.column.is-offset-6-touch{margin-left:50%}.column.is-7-touch{flex:none;width:58.33333337%}.column.is-offset-7-touch{margin-left:58.33333337%}.column.is-8-touch{flex:none;width:66.66666674%}.column.is-offset-8-touch{margin-left:66.66666674%}.column.is-9-touch{flex:none;width:75%}.column.is-offset-9-touch{margin-left:75%}.column.is-10-touch{flex:none;width:83.33333337%}.column.is-offset-10-touch{margin-left:83.33333337%}.column.is-11-touch{flex:none;width:91.66666674%}.column.is-offset-11-touch{margin-left:91.66666674%}.column.is-12-touch{flex:none;width:100%}.column.is-offset-12-touch{margin-left:100%}}@media screen and (min-width: 1056px){.column.is-narrow-desktop{flex:none;width:unset}.column.is-full-desktop{flex:none;width:100%}.column.is-three-quarters-desktop{flex:none;width:75%}.column.is-two-thirds-desktop{flex:none;width:66.6666%}.column.is-half-desktop{flex:none;width:50%}.column.is-one-third-desktop{flex:none;width:33.3333%}.column.is-one-quarter-desktop{flex:none;width:25%}.column.is-one-fifth-desktop{flex:none;width:20%}.column.is-two-fifths-desktop{flex:none;width:40%}.column.is-three-fifths-desktop{flex:none;width:60%}.column.is-four-fifths-desktop{flex:none;width:80%}.column.is-offset-three-quarters-desktop{margin-left:75%}.column.is-offset-two-thirds-desktop{margin-left:66.6666%}.column.is-offset-half-desktop{margin-left:50%}.column.is-offset-one-third-desktop{margin-left:33.3333%}.column.is-offset-one-quarter-desktop{margin-left:25%}.column.is-offset-one-fifth-desktop{margin-left:20%}.column.is-offset-two-fifths-desktop{margin-left:40%}.column.is-offset-three-fifths-desktop{margin-left:60%}.column.is-offset-four-fifths-desktop{margin-left:80%}.column.is-0-desktop{flex:none;width:0%}.column.is-offset-0-desktop{margin-left:0%}.column.is-1-desktop{flex:none;width:8.33333337%}.column.is-offset-1-desktop{margin-left:8.33333337%}.column.is-2-desktop{flex:none;width:16.66666674%}.column.is-offset-2-desktop{margin-left:16.66666674%}.column.is-3-desktop{flex:none;width:25%}.column.is-offset-3-desktop{margin-left:25%}.column.is-4-desktop{flex:none;width:33.33333337%}.column.is-offset-4-desktop{margin-left:33.33333337%}.column.is-5-desktop{flex:none;width:41.66666674%}.column.is-offset-5-desktop{margin-left:41.66666674%}.column.is-6-desktop{flex:none;width:50%}.column.is-offset-6-desktop{margin-left:50%}.column.is-7-desktop{flex:none;width:58.33333337%}.column.is-offset-7-desktop{margin-left:58.33333337%}.column.is-8-desktop{flex:none;width:66.66666674%}.column.is-offset-8-desktop{margin-left:66.66666674%}.column.is-9-desktop{flex:none;width:75%}.column.is-offset-9-desktop{margin-left:75%}.column.is-10-desktop{flex:none;width:83.33333337%}.column.is-offset-10-desktop{margin-left:83.33333337%}.column.is-11-desktop{flex:none;width:91.66666674%}.column.is-offset-11-desktop{margin-left:91.66666674%}.column.is-12-desktop{flex:none;width:100%}.column.is-offset-12-desktop{margin-left:100%}}@media screen and (min-width: 1216px){.column.is-narrow-widescreen{flex:none;width:unset}.column.is-full-widescreen{flex:none;width:100%}.column.is-three-quarters-widescreen{flex:none;width:75%}.column.is-two-thirds-widescreen{flex:none;width:66.6666%}.column.is-half-widescreen{flex:none;width:50%}.column.is-one-third-widescreen{flex:none;width:33.3333%}.column.is-one-quarter-widescreen{flex:none;width:25%}.column.is-one-fifth-widescreen{flex:none;width:20%}.column.is-two-fifths-widescreen{flex:none;width:40%}.column.is-three-fifths-widescreen{flex:none;width:60%}.column.is-four-fifths-widescreen{flex:none;width:80%}.column.is-offset-three-quarters-widescreen{margin-left:75%}.column.is-offset-two-thirds-widescreen{margin-left:66.6666%}.column.is-offset-half-widescreen{margin-left:50%}.column.is-offset-one-third-widescreen{margin-left:33.3333%}.column.is-offset-one-quarter-widescreen{margin-left:25%}.column.is-offset-one-fifth-widescreen{margin-left:20%}.column.is-offset-two-fifths-widescreen{margin-left:40%}.column.is-offset-three-fifths-widescreen{margin-left:60%}.column.is-offset-four-fifths-widescreen{margin-left:80%}.column.is-0-widescreen{flex:none;width:0%}.column.is-offset-0-widescreen{margin-left:0%}.column.is-1-widescreen{flex:none;width:8.33333337%}.column.is-offset-1-widescreen{margin-left:8.33333337%}.column.is-2-widescreen{flex:none;width:16.66666674%}.column.is-offset-2-widescreen{margin-left:16.66666674%}.column.is-3-widescreen{flex:none;width:25%}.column.is-offset-3-widescreen{margin-left:25%}.column.is-4-widescreen{flex:none;width:33.33333337%}.column.is-offset-4-widescreen{margin-left:33.33333337%}.column.is-5-widescreen{flex:none;width:41.66666674%}.column.is-offset-5-widescreen{margin-left:41.66666674%}.column.is-6-widescreen{flex:none;width:50%}.column.is-offset-6-widescreen{margin-left:50%}.column.is-7-widescreen{flex:none;width:58.33333337%}.column.is-offset-7-widescreen{margin-left:58.33333337%}.column.is-8-widescreen{flex:none;width:66.66666674%}.column.is-offset-8-widescreen{margin-left:66.66666674%}.column.is-9-widescreen{flex:none;width:75%}.column.is-offset-9-widescreen{margin-left:75%}.column.is-10-widescreen{flex:none;width:83.33333337%}.column.is-offset-10-widescreen{margin-left:83.33333337%}.column.is-11-widescreen{flex:none;width:91.66666674%}.column.is-offset-11-widescreen{margin-left:91.66666674%}.column.is-12-widescreen{flex:none;width:100%}.column.is-offset-12-widescreen{margin-left:100%}}@media screen and (min-width: 1408px){.column.is-narrow-fullhd{flex:none;width:unset}.column.is-full-fullhd{flex:none;width:100%}.column.is-three-quarters-fullhd{flex:none;width:75%}.column.is-two-thirds-fullhd{flex:none;width:66.6666%}.column.is-half-fullhd{flex:none;width:50%}.column.is-one-third-fullhd{flex:none;width:33.3333%}.column.is-one-quarter-fullhd{flex:none;width:25%}.column.is-one-fifth-fullhd{flex:none;width:20%}.column.is-two-fifths-fullhd{flex:none;width:40%}.column.is-three-fifths-fullhd{flex:none;width:60%}.column.is-four-fifths-fullhd{flex:none;width:80%}.column.is-offset-three-quarters-fullhd{margin-left:75%}.column.is-offset-two-thirds-fullhd{margin-left:66.6666%}.column.is-offset-half-fullhd{margin-left:50%}.column.is-offset-one-third-fullhd{margin-left:33.3333%}.column.is-offset-one-quarter-fullhd{margin-left:25%}.column.is-offset-one-fifth-fullhd{margin-left:20%}.column.is-offset-two-fifths-fullhd{margin-left:40%}.column.is-offset-three-fifths-fullhd{margin-left:60%}.column.is-offset-four-fifths-fullhd{margin-left:80%}.column.is-0-fullhd{flex:none;width:0%}.column.is-offset-0-fullhd{margin-left:0%}.column.is-1-fullhd{flex:none;width:8.33333337%}.column.is-offset-1-fullhd{margin-left:8.33333337%}.column.is-2-fullhd{flex:none;width:16.66666674%}.column.is-offset-2-fullhd{margin-left:16.66666674%}.column.is-3-fullhd{flex:none;width:25%}.column.is-offset-3-fullhd{margin-left:25%}.column.is-4-fullhd{flex:none;width:33.33333337%}.column.is-offset-4-fullhd{margin-left:33.33333337%}.column.is-5-fullhd{flex:none;width:41.66666674%}.column.is-offset-5-fullhd{margin-left:41.66666674%}.column.is-6-fullhd{flex:none;width:50%}.column.is-offset-6-fullhd{margin-left:50%}.column.is-7-fullhd{flex:none;width:58.33333337%}.column.is-offset-7-fullhd{margin-left:58.33333337%}.column.is-8-fullhd{flex:none;width:66.66666674%}.column.is-offset-8-fullhd{margin-left:66.66666674%}.column.is-9-fullhd{flex:none;width:75%}.column.is-offset-9-fullhd{margin-left:75%}.column.is-10-fullhd{flex:none;width:83.33333337%}.column.is-offset-10-fullhd{margin-left:83.33333337%}.column.is-11-fullhd{flex:none;width:91.66666674%}.column.is-offset-11-fullhd{margin-left:91.66666674%}.column.is-12-fullhd{flex:none;width:100%}.column.is-offset-12-fullhd{margin-left:100%}}.columns{margin-left:-.75rem;margin-right:-.75rem;margin-top:-.75rem}.columns:last-child{margin-bottom:-.75rem}.columns:not(:last-child){margin-bottom:calc(1.5rem - .75rem)}.columns.is-centered{justify-content:center}.columns.is-gapless{margin-left:0;margin-right:0;margin-top:0}.columns.is-gapless>.column{margin:0;padding:0 !important}.columns.is-gapless:not(:last-child){margin-bottom:1.5rem}.columns.is-gapless:last-child{margin-bottom:0}.columns.is-mobile{display:flex}.columns.is-multiline{flex-wrap:wrap}.columns.is-vcentered{align-items:center}@media screen and (min-width: 769px),print{.columns:not(.is-desktop){display:flex}}@media screen and (min-width: 1056px){.columns.is-desktop{display:flex}}.columns.is-variable{--columnGap: 0.75rem;margin-left:calc(-1 * var(--columnGap));margin-right:calc(-1 * var(--columnGap))}.columns.is-variable>.column{padding-left:var(--columnGap);padding-right:var(--columnGap)}.columns.is-variable.is-0{--columnGap: 0rem}@media screen and (max-width: 768px){.columns.is-variable.is-0-mobile{--columnGap: 0rem}}@media screen and (min-width: 769px),print{.columns.is-variable.is-0-tablet{--columnGap: 0rem}}@media screen and (min-width: 769px) and (max-width: 1055px){.columns.is-variable.is-0-tablet-only{--columnGap: 0rem}}@media screen and (max-width: 1055px){.columns.is-variable.is-0-touch{--columnGap: 0rem}}@media screen and (min-width: 1056px){.columns.is-variable.is-0-desktop{--columnGap: 0rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){.columns.is-variable.is-0-desktop-only{--columnGap: 0rem}}@media screen and (min-width: 1216px){.columns.is-variable.is-0-widescreen{--columnGap: 0rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){.columns.is-variable.is-0-widescreen-only{--columnGap: 0rem}}@media screen and (min-width: 1408px){.columns.is-variable.is-0-fullhd{--columnGap: 0rem}}.columns.is-variable.is-1{--columnGap: .25rem}@media screen and (max-width: 768px){.columns.is-variable.is-1-mobile{--columnGap: .25rem}}@media screen and (min-width: 769px),print{.columns.is-variable.is-1-tablet{--columnGap: .25rem}}@media screen and (min-width: 769px) and (max-width: 1055px){.columns.is-variable.is-1-tablet-only{--columnGap: .25rem}}@media screen and (max-width: 1055px){.columns.is-variable.is-1-touch{--columnGap: .25rem}}@media screen and (min-width: 1056px){.columns.is-variable.is-1-desktop{--columnGap: .25rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){.columns.is-variable.is-1-desktop-only{--columnGap: .25rem}}@media screen and (min-width: 1216px){.columns.is-variable.is-1-widescreen{--columnGap: .25rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){.columns.is-variable.is-1-widescreen-only{--columnGap: .25rem}}@media screen and (min-width: 1408px){.columns.is-variable.is-1-fullhd{--columnGap: .25rem}}.columns.is-variable.is-2{--columnGap: .5rem}@media screen and (max-width: 768px){.columns.is-variable.is-2-mobile{--columnGap: .5rem}}@media screen and (min-width: 769px),print{.columns.is-variable.is-2-tablet{--columnGap: .5rem}}@media screen and (min-width: 769px) and (max-width: 1055px){.columns.is-variable.is-2-tablet-only{--columnGap: .5rem}}@media screen and (max-width: 1055px){.columns.is-variable.is-2-touch{--columnGap: .5rem}}@media screen and (min-width: 1056px){.columns.is-variable.is-2-desktop{--columnGap: .5rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){.columns.is-variable.is-2-desktop-only{--columnGap: .5rem}}@media screen and (min-width: 1216px){.columns.is-variable.is-2-widescreen{--columnGap: .5rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){.columns.is-variable.is-2-widescreen-only{--columnGap: .5rem}}@media screen and (min-width: 1408px){.columns.is-variable.is-2-fullhd{--columnGap: .5rem}}.columns.is-variable.is-3{--columnGap: .75rem}@media screen and (max-width: 768px){.columns.is-variable.is-3-mobile{--columnGap: .75rem}}@media screen and (min-width: 769px),print{.columns.is-variable.is-3-tablet{--columnGap: .75rem}}@media screen and (min-width: 769px) and (max-width: 1055px){.columns.is-variable.is-3-tablet-only{--columnGap: .75rem}}@media screen and (max-width: 1055px){.columns.is-variable.is-3-touch{--columnGap: .75rem}}@media screen and (min-width: 1056px){.columns.is-variable.is-3-desktop{--columnGap: .75rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){.columns.is-variable.is-3-desktop-only{--columnGap: .75rem}}@media screen and (min-width: 1216px){.columns.is-variable.is-3-widescreen{--columnGap: .75rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){.columns.is-variable.is-3-widescreen-only{--columnGap: .75rem}}@media screen and (min-width: 1408px){.columns.is-variable.is-3-fullhd{--columnGap: .75rem}}.columns.is-variable.is-4{--columnGap: 1rem}@media screen and (max-width: 768px){.columns.is-variable.is-4-mobile{--columnGap: 1rem}}@media screen and (min-width: 769px),print{.columns.is-variable.is-4-tablet{--columnGap: 1rem}}@media screen and (min-width: 769px) and (max-width: 1055px){.columns.is-variable.is-4-tablet-only{--columnGap: 1rem}}@media screen and (max-width: 1055px){.columns.is-variable.is-4-touch{--columnGap: 1rem}}@media screen and (min-width: 1056px){.columns.is-variable.is-4-desktop{--columnGap: 1rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){.columns.is-variable.is-4-desktop-only{--columnGap: 1rem}}@media screen and (min-width: 1216px){.columns.is-variable.is-4-widescreen{--columnGap: 1rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){.columns.is-variable.is-4-widescreen-only{--columnGap: 1rem}}@media screen and (min-width: 1408px){.columns.is-variable.is-4-fullhd{--columnGap: 1rem}}.columns.is-variable.is-5{--columnGap: 1.25rem}@media screen and (max-width: 768px){.columns.is-variable.is-5-mobile{--columnGap: 1.25rem}}@media screen and (min-width: 769px),print{.columns.is-variable.is-5-tablet{--columnGap: 1.25rem}}@media screen and (min-width: 769px) and (max-width: 1055px){.columns.is-variable.is-5-tablet-only{--columnGap: 1.25rem}}@media screen and (max-width: 1055px){.columns.is-variable.is-5-touch{--columnGap: 1.25rem}}@media screen and (min-width: 1056px){.columns.is-variable.is-5-desktop{--columnGap: 1.25rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){.columns.is-variable.is-5-desktop-only{--columnGap: 1.25rem}}@media screen and (min-width: 1216px){.columns.is-variable.is-5-widescreen{--columnGap: 1.25rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){.columns.is-variable.is-5-widescreen-only{--columnGap: 1.25rem}}@media screen and (min-width: 1408px){.columns.is-variable.is-5-fullhd{--columnGap: 1.25rem}}.columns.is-variable.is-6{--columnGap: 1.5rem}@media screen and (max-width: 768px){.columns.is-variable.is-6-mobile{--columnGap: 1.5rem}}@media screen and (min-width: 769px),print{.columns.is-variable.is-6-tablet{--columnGap: 1.5rem}}@media screen and (min-width: 769px) and (max-width: 1055px){.columns.is-variable.is-6-tablet-only{--columnGap: 1.5rem}}@media screen and (max-width: 1055px){.columns.is-variable.is-6-touch{--columnGap: 1.5rem}}@media screen and (min-width: 1056px){.columns.is-variable.is-6-desktop{--columnGap: 1.5rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){.columns.is-variable.is-6-desktop-only{--columnGap: 1.5rem}}@media screen and (min-width: 1216px){.columns.is-variable.is-6-widescreen{--columnGap: 1.5rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){.columns.is-variable.is-6-widescreen-only{--columnGap: 1.5rem}}@media screen and (min-width: 1408px){.columns.is-variable.is-6-fullhd{--columnGap: 1.5rem}}.columns.is-variable.is-7{--columnGap: 1.75rem}@media screen and (max-width: 768px){.columns.is-variable.is-7-mobile{--columnGap: 1.75rem}}@media screen and (min-width: 769px),print{.columns.is-variable.is-7-tablet{--columnGap: 1.75rem}}@media screen and (min-width: 769px) and (max-width: 1055px){.columns.is-variable.is-7-tablet-only{--columnGap: 1.75rem}}@media screen and (max-width: 1055px){.columns.is-variable.is-7-touch{--columnGap: 1.75rem}}@media screen and (min-width: 1056px){.columns.is-variable.is-7-desktop{--columnGap: 1.75rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){.columns.is-variable.is-7-desktop-only{--columnGap: 1.75rem}}@media screen and (min-width: 1216px){.columns.is-variable.is-7-widescreen{--columnGap: 1.75rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){.columns.is-variable.is-7-widescreen-only{--columnGap: 1.75rem}}@media screen and (min-width: 1408px){.columns.is-variable.is-7-fullhd{--columnGap: 1.75rem}}.columns.is-variable.is-8{--columnGap: 2rem}@media screen and (max-width: 768px){.columns.is-variable.is-8-mobile{--columnGap: 2rem}}@media screen and (min-width: 769px),print{.columns.is-variable.is-8-tablet{--columnGap: 2rem}}@media screen and (min-width: 769px) and (max-width: 1055px){.columns.is-variable.is-8-tablet-only{--columnGap: 2rem}}@media screen and (max-width: 1055px){.columns.is-variable.is-8-touch{--columnGap: 2rem}}@media screen and (min-width: 1056px){.columns.is-variable.is-8-desktop{--columnGap: 2rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){.columns.is-variable.is-8-desktop-only{--columnGap: 2rem}}@media screen and (min-width: 1216px){.columns.is-variable.is-8-widescreen{--columnGap: 2rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){.columns.is-variable.is-8-widescreen-only{--columnGap: 2rem}}@media screen and (min-width: 1408px){.columns.is-variable.is-8-fullhd{--columnGap: 2rem}}.tile{align-items:stretch;display:block;flex-basis:0;flex-grow:1;flex-shrink:1;min-height:min-content}.tile.is-ancestor{margin-left:-.75rem;margin-right:-.75rem;margin-top:-.75rem}.tile.is-ancestor:last-child{margin-bottom:-.75rem}.tile.is-ancestor:not(:last-child){margin-bottom:.75rem}.tile.is-child{margin:0 !important}.tile.is-parent{padding:.75rem}.tile.is-vertical{flex-direction:column}.tile.is-vertical>.tile.is-child:not(:last-child){margin-bottom:1.5rem !important}@media screen and (min-width: 769px),print{.tile:not(.is-child){display:flex}.tile.is-1{flex:none;width:8.33333337%}.tile.is-2{flex:none;width:16.66666674%}.tile.is-3{flex:none;width:25%}.tile.is-4{flex:none;width:33.33333337%}.tile.is-5{flex:none;width:41.66666674%}.tile.is-6{flex:none;width:50%}.tile.is-7{flex:none;width:58.33333337%}.tile.is-8{flex:none;width:66.66666674%}.tile.is-9{flex:none;width:75%}.tile.is-10{flex:none;width:83.33333337%}.tile.is-11{flex:none;width:91.66666674%}.tile.is-12{flex:none;width:100%}}.hero{align-items:stretch;display:flex;flex-direction:column;justify-content:space-between}.hero .navbar{background:none}.hero .tabs ul{border-bottom:none}.hero.is-white{background-color:#fff;color:#0a0a0a}.hero.is-white a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-white strong{color:inherit}.hero.is-white .title{color:#0a0a0a}.hero.is-white .subtitle{color:rgba(10,10,10,0.9)}.hero.is-white .subtitle a:not(.button),.hero.is-white .subtitle strong{color:#0a0a0a}@media screen and (max-width: 1055px){.hero.is-white .navbar-menu{background-color:#fff}}.hero.is-white .navbar-item,.hero.is-white .navbar-link{color:rgba(10,10,10,0.7)}.hero.is-white a.navbar-item:hover,.hero.is-white a.navbar-item.is-active,.hero.is-white .navbar-link:hover,.hero.is-white .navbar-link.is-active{background-color:#f2f2f2;color:#0a0a0a}.hero.is-white .tabs a{color:#0a0a0a;opacity:0.9}.hero.is-white .tabs a:hover{opacity:1}.hero.is-white .tabs li.is-active a{color:#fff !important;opacity:1}.hero.is-white .tabs.is-boxed a,.hero.is-white .tabs.is-toggle a{color:#0a0a0a}.hero.is-white .tabs.is-boxed a:hover,.hero.is-white .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}.hero.is-white .tabs.is-boxed li.is-active a,.hero.is-white .tabs.is-boxed li.is-active a:hover,.hero.is-white .tabs.is-toggle li.is-active a,.hero.is-white .tabs.is-toggle li.is-active a:hover{background-color:#0a0a0a;border-color:#0a0a0a;color:#fff}.hero.is-white.is-bold{background-image:linear-gradient(141deg, #e8e3e4 0%, #fff 71%, #fff 100%)}@media screen and (max-width: 768px){.hero.is-white.is-bold .navbar-menu{background-image:linear-gradient(141deg, #e8e3e4 0%, #fff 71%, #fff 100%)}}.hero.is-black{background-color:#0a0a0a;color:#fff}.hero.is-black a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-black strong{color:inherit}.hero.is-black .title{color:#fff}.hero.is-black .subtitle{color:rgba(255,255,255,0.9)}.hero.is-black .subtitle a:not(.button),.hero.is-black .subtitle strong{color:#fff}@media screen and (max-width: 1055px){.hero.is-black .navbar-menu{background-color:#0a0a0a}}.hero.is-black .navbar-item,.hero.is-black .navbar-link{color:rgba(255,255,255,0.7)}.hero.is-black a.navbar-item:hover,.hero.is-black a.navbar-item.is-active,.hero.is-black .navbar-link:hover,.hero.is-black .navbar-link.is-active{background-color:#000;color:#fff}.hero.is-black .tabs a{color:#fff;opacity:0.9}.hero.is-black .tabs a:hover{opacity:1}.hero.is-black .tabs li.is-active a{color:#0a0a0a !important;opacity:1}.hero.is-black .tabs.is-boxed a,.hero.is-black .tabs.is-toggle a{color:#fff}.hero.is-black .tabs.is-boxed a:hover,.hero.is-black .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}.hero.is-black .tabs.is-boxed li.is-active a,.hero.is-black .tabs.is-boxed li.is-active a:hover,.hero.is-black .tabs.is-toggle li.is-active a,.hero.is-black .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#0a0a0a}.hero.is-black.is-bold{background-image:linear-gradient(141deg, #000 0%, #0a0a0a 71%, #181616 100%)}@media screen and (max-width: 768px){.hero.is-black.is-bold .navbar-menu{background-image:linear-gradient(141deg, #000 0%, #0a0a0a 71%, #181616 100%)}}.hero.is-light{background-color:#f5f5f5;color:rgba(0,0,0,0.7)}.hero.is-light a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-light strong{color:inherit}.hero.is-light .title{color:rgba(0,0,0,0.7)}.hero.is-light .subtitle{color:rgba(0,0,0,0.9)}.hero.is-light .subtitle a:not(.button),.hero.is-light .subtitle strong{color:rgba(0,0,0,0.7)}@media screen and (max-width: 1055px){.hero.is-light .navbar-menu{background-color:#f5f5f5}}.hero.is-light .navbar-item,.hero.is-light .navbar-link{color:rgba(0,0,0,0.7)}.hero.is-light a.navbar-item:hover,.hero.is-light a.navbar-item.is-active,.hero.is-light .navbar-link:hover,.hero.is-light .navbar-link.is-active{background-color:#e8e8e8;color:rgba(0,0,0,0.7)}.hero.is-light .tabs a{color:rgba(0,0,0,0.7);opacity:0.9}.hero.is-light .tabs a:hover{opacity:1}.hero.is-light .tabs li.is-active a{color:#f5f5f5 !important;opacity:1}.hero.is-light .tabs.is-boxed a,.hero.is-light .tabs.is-toggle a{color:rgba(0,0,0,0.7)}.hero.is-light .tabs.is-boxed a:hover,.hero.is-light .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}.hero.is-light .tabs.is-boxed li.is-active a,.hero.is-light .tabs.is-boxed li.is-active a:hover,.hero.is-light .tabs.is-toggle li.is-active a,.hero.is-light .tabs.is-toggle li.is-active a:hover{background-color:rgba(0,0,0,0.7);border-color:rgba(0,0,0,0.7);color:#f5f5f5}.hero.is-light.is-bold{background-image:linear-gradient(141deg, #dfd8d9 0%, #f5f5f5 71%, #fff 100%)}@media screen and (max-width: 768px){.hero.is-light.is-bold .navbar-menu{background-image:linear-gradient(141deg, #dfd8d9 0%, #f5f5f5 71%, #fff 100%)}}.hero.is-dark,.content kbd.hero{background-color:#363636;color:#fff}.hero.is-dark a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.content kbd.hero a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-dark strong,.content kbd.hero strong{color:inherit}.hero.is-dark .title,.content kbd.hero .title{color:#fff}.hero.is-dark .subtitle,.content kbd.hero .subtitle{color:rgba(255,255,255,0.9)}.hero.is-dark .subtitle a:not(.button),.content kbd.hero .subtitle a:not(.button),.hero.is-dark .subtitle strong,.content kbd.hero .subtitle strong{color:#fff}@media screen and (max-width: 1055px){.hero.is-dark .navbar-menu,.content kbd.hero .navbar-menu{background-color:#363636}}.hero.is-dark .navbar-item,.content kbd.hero .navbar-item,.hero.is-dark .navbar-link,.content kbd.hero .navbar-link{color:rgba(255,255,255,0.7)}.hero.is-dark a.navbar-item:hover,.content kbd.hero a.navbar-item:hover,.hero.is-dark a.navbar-item.is-active,.content kbd.hero a.navbar-item.is-active,.hero.is-dark .navbar-link:hover,.content kbd.hero .navbar-link:hover,.hero.is-dark .navbar-link.is-active,.content kbd.hero .navbar-link.is-active{background-color:#292929;color:#fff}.hero.is-dark .tabs a,.content kbd.hero .tabs a{color:#fff;opacity:0.9}.hero.is-dark .tabs a:hover,.content kbd.hero .tabs a:hover{opacity:1}.hero.is-dark .tabs li.is-active a,.content kbd.hero .tabs li.is-active a{color:#363636 !important;opacity:1}.hero.is-dark .tabs.is-boxed a,.content kbd.hero .tabs.is-boxed a,.hero.is-dark .tabs.is-toggle a,.content kbd.hero .tabs.is-toggle a{color:#fff}.hero.is-dark .tabs.is-boxed a:hover,.content kbd.hero .tabs.is-boxed a:hover,.hero.is-dark .tabs.is-toggle a:hover,.content kbd.hero .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}.hero.is-dark .tabs.is-boxed li.is-active a,.content kbd.hero .tabs.is-boxed li.is-active a,.hero.is-dark .tabs.is-boxed li.is-active a:hover,.hero.is-dark .tabs.is-toggle li.is-active a,.content kbd.hero .tabs.is-toggle li.is-active a,.hero.is-dark .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#363636}.hero.is-dark.is-bold,.content kbd.hero.is-bold{background-image:linear-gradient(141deg, #1f191a 0%, #363636 71%, #46403f 100%)}@media screen and (max-width: 768px){.hero.is-dark.is-bold .navbar-menu,.content kbd.hero.is-bold .navbar-menu{background-image:linear-gradient(141deg, #1f191a 0%, #363636 71%, #46403f 100%)}}.hero.is-primary,.docstring>section>a.hero.docs-sourcelink{background-color:#4eb5de;color:#fff}.hero.is-primary a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.docstring>section>a.hero.docs-sourcelink a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-primary strong,.docstring>section>a.hero.docs-sourcelink strong{color:inherit}.hero.is-primary .title,.docstring>section>a.hero.docs-sourcelink .title{color:#fff}.hero.is-primary .subtitle,.docstring>section>a.hero.docs-sourcelink .subtitle{color:rgba(255,255,255,0.9)}.hero.is-primary .subtitle a:not(.button),.docstring>section>a.hero.docs-sourcelink .subtitle a:not(.button),.hero.is-primary .subtitle strong,.docstring>section>a.hero.docs-sourcelink .subtitle strong{color:#fff}@media screen and (max-width: 1055px){.hero.is-primary .navbar-menu,.docstring>section>a.hero.docs-sourcelink .navbar-menu{background-color:#4eb5de}}.hero.is-primary .navbar-item,.docstring>section>a.hero.docs-sourcelink .navbar-item,.hero.is-primary .navbar-link,.docstring>section>a.hero.docs-sourcelink .navbar-link{color:rgba(255,255,255,0.7)}.hero.is-primary a.navbar-item:hover,.docstring>section>a.hero.docs-sourcelink a.navbar-item:hover,.hero.is-primary a.navbar-item.is-active,.docstring>section>a.hero.docs-sourcelink a.navbar-item.is-active,.hero.is-primary .navbar-link:hover,.docstring>section>a.hero.docs-sourcelink .navbar-link:hover,.hero.is-primary .navbar-link.is-active,.docstring>section>a.hero.docs-sourcelink .navbar-link.is-active{background-color:#39acda;color:#fff}.hero.is-primary .tabs a,.docstring>section>a.hero.docs-sourcelink .tabs a{color:#fff;opacity:0.9}.hero.is-primary .tabs a:hover,.docstring>section>a.hero.docs-sourcelink .tabs a:hover{opacity:1}.hero.is-primary .tabs li.is-active a,.docstring>section>a.hero.docs-sourcelink .tabs li.is-active a{color:#4eb5de !important;opacity:1}.hero.is-primary .tabs.is-boxed a,.docstring>section>a.hero.docs-sourcelink .tabs.is-boxed a,.hero.is-primary .tabs.is-toggle a,.docstring>section>a.hero.docs-sourcelink .tabs.is-toggle a{color:#fff}.hero.is-primary .tabs.is-boxed a:hover,.docstring>section>a.hero.docs-sourcelink .tabs.is-boxed a:hover,.hero.is-primary .tabs.is-toggle a:hover,.docstring>section>a.hero.docs-sourcelink .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}.hero.is-primary .tabs.is-boxed li.is-active a,.docstring>section>a.hero.docs-sourcelink .tabs.is-boxed li.is-active a,.hero.is-primary .tabs.is-boxed li.is-active a:hover,.hero.is-primary .tabs.is-toggle li.is-active a,.docstring>section>a.hero.docs-sourcelink .tabs.is-toggle li.is-active a,.hero.is-primary .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#4eb5de}.hero.is-primary.is-bold,.docstring>section>a.hero.is-bold.docs-sourcelink{background-image:linear-gradient(141deg, #1bc7de 0%, #4eb5de 71%, #5fa9e7 100%)}@media screen and (max-width: 768px){.hero.is-primary.is-bold .navbar-menu,.docstring>section>a.hero.is-bold.docs-sourcelink .navbar-menu{background-image:linear-gradient(141deg, #1bc7de 0%, #4eb5de 71%, #5fa9e7 100%)}}.hero.is-link{background-color:#2e63b8;color:#fff}.hero.is-link a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-link strong{color:inherit}.hero.is-link .title{color:#fff}.hero.is-link .subtitle{color:rgba(255,255,255,0.9)}.hero.is-link .subtitle a:not(.button),.hero.is-link .subtitle strong{color:#fff}@media screen and (max-width: 1055px){.hero.is-link .navbar-menu{background-color:#2e63b8}}.hero.is-link .navbar-item,.hero.is-link .navbar-link{color:rgba(255,255,255,0.7)}.hero.is-link a.navbar-item:hover,.hero.is-link a.navbar-item.is-active,.hero.is-link .navbar-link:hover,.hero.is-link .navbar-link.is-active{background-color:#2958a4;color:#fff}.hero.is-link .tabs a{color:#fff;opacity:0.9}.hero.is-link .tabs a:hover{opacity:1}.hero.is-link .tabs li.is-active a{color:#2e63b8 !important;opacity:1}.hero.is-link .tabs.is-boxed a,.hero.is-link .tabs.is-toggle a{color:#fff}.hero.is-link .tabs.is-boxed a:hover,.hero.is-link .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}.hero.is-link .tabs.is-boxed li.is-active a,.hero.is-link .tabs.is-boxed li.is-active a:hover,.hero.is-link .tabs.is-toggle li.is-active a,.hero.is-link .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#2e63b8}.hero.is-link.is-bold{background-image:linear-gradient(141deg, #1b6098 0%, #2e63b8 71%, #2d51d2 100%)}@media screen and (max-width: 768px){.hero.is-link.is-bold .navbar-menu{background-image:linear-gradient(141deg, #1b6098 0%, #2e63b8 71%, #2d51d2 100%)}}.hero.is-info{background-color:#209cee;color:#fff}.hero.is-info a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-info strong{color:inherit}.hero.is-info .title{color:#fff}.hero.is-info .subtitle{color:rgba(255,255,255,0.9)}.hero.is-info .subtitle a:not(.button),.hero.is-info .subtitle strong{color:#fff}@media screen and (max-width: 1055px){.hero.is-info .navbar-menu{background-color:#209cee}}.hero.is-info .navbar-item,.hero.is-info .navbar-link{color:rgba(255,255,255,0.7)}.hero.is-info a.navbar-item:hover,.hero.is-info a.navbar-item.is-active,.hero.is-info .navbar-link:hover,.hero.is-info .navbar-link.is-active{background-color:#1190e3;color:#fff}.hero.is-info .tabs a{color:#fff;opacity:0.9}.hero.is-info .tabs a:hover{opacity:1}.hero.is-info .tabs li.is-active a{color:#209cee !important;opacity:1}.hero.is-info .tabs.is-boxed a,.hero.is-info .tabs.is-toggle a{color:#fff}.hero.is-info .tabs.is-boxed a:hover,.hero.is-info .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}.hero.is-info .tabs.is-boxed li.is-active a,.hero.is-info .tabs.is-boxed li.is-active a:hover,.hero.is-info .tabs.is-toggle li.is-active a,.hero.is-info .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#209cee}.hero.is-info.is-bold{background-image:linear-gradient(141deg, #05a6d6 0%, #209cee 71%, #3287f5 100%)}@media screen and (max-width: 768px){.hero.is-info.is-bold .navbar-menu{background-image:linear-gradient(141deg, #05a6d6 0%, #209cee 71%, #3287f5 100%)}}.hero.is-success{background-color:#22c35b;color:#fff}.hero.is-success a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-success strong{color:inherit}.hero.is-success .title{color:#fff}.hero.is-success .subtitle{color:rgba(255,255,255,0.9)}.hero.is-success .subtitle a:not(.button),.hero.is-success .subtitle strong{color:#fff}@media screen and (max-width: 1055px){.hero.is-success .navbar-menu{background-color:#22c35b}}.hero.is-success .navbar-item,.hero.is-success .navbar-link{color:rgba(255,255,255,0.7)}.hero.is-success a.navbar-item:hover,.hero.is-success a.navbar-item.is-active,.hero.is-success .navbar-link:hover,.hero.is-success .navbar-link.is-active{background-color:#1ead51;color:#fff}.hero.is-success .tabs a{color:#fff;opacity:0.9}.hero.is-success .tabs a:hover{opacity:1}.hero.is-success .tabs li.is-active a{color:#22c35b !important;opacity:1}.hero.is-success .tabs.is-boxed a,.hero.is-success .tabs.is-toggle a{color:#fff}.hero.is-success .tabs.is-boxed a:hover,.hero.is-success .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}.hero.is-success .tabs.is-boxed li.is-active a,.hero.is-success .tabs.is-boxed li.is-active a:hover,.hero.is-success .tabs.is-toggle li.is-active a,.hero.is-success .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#22c35b}.hero.is-success.is-bold{background-image:linear-gradient(141deg, #12a02c 0%, #22c35b 71%, #1fdf83 100%)}@media screen and (max-width: 768px){.hero.is-success.is-bold .navbar-menu{background-image:linear-gradient(141deg, #12a02c 0%, #22c35b 71%, #1fdf83 100%)}}.hero.is-warning{background-color:#ffdd57;color:rgba(0,0,0,0.7)}.hero.is-warning a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-warning strong{color:inherit}.hero.is-warning .title{color:rgba(0,0,0,0.7)}.hero.is-warning .subtitle{color:rgba(0,0,0,0.9)}.hero.is-warning .subtitle a:not(.button),.hero.is-warning .subtitle strong{color:rgba(0,0,0,0.7)}@media screen and (max-width: 1055px){.hero.is-warning .navbar-menu{background-color:#ffdd57}}.hero.is-warning .navbar-item,.hero.is-warning .navbar-link{color:rgba(0,0,0,0.7)}.hero.is-warning a.navbar-item:hover,.hero.is-warning a.navbar-item.is-active,.hero.is-warning .navbar-link:hover,.hero.is-warning .navbar-link.is-active{background-color:#ffd83e;color:rgba(0,0,0,0.7)}.hero.is-warning .tabs a{color:rgba(0,0,0,0.7);opacity:0.9}.hero.is-warning .tabs a:hover{opacity:1}.hero.is-warning .tabs li.is-active a{color:#ffdd57 !important;opacity:1}.hero.is-warning .tabs.is-boxed a,.hero.is-warning .tabs.is-toggle a{color:rgba(0,0,0,0.7)}.hero.is-warning .tabs.is-boxed a:hover,.hero.is-warning .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}.hero.is-warning .tabs.is-boxed li.is-active a,.hero.is-warning .tabs.is-boxed li.is-active a:hover,.hero.is-warning .tabs.is-toggle li.is-active a,.hero.is-warning .tabs.is-toggle li.is-active a:hover{background-color:rgba(0,0,0,0.7);border-color:rgba(0,0,0,0.7);color:#ffdd57}.hero.is-warning.is-bold{background-image:linear-gradient(141deg, #ffae24 0%, #ffdd57 71%, #fffa71 100%)}@media screen and (max-width: 768px){.hero.is-warning.is-bold .navbar-menu{background-image:linear-gradient(141deg, #ffae24 0%, #ffdd57 71%, #fffa71 100%)}}.hero.is-danger{background-color:#da0b00;color:#fff}.hero.is-danger a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-danger strong{color:inherit}.hero.is-danger .title{color:#fff}.hero.is-danger .subtitle{color:rgba(255,255,255,0.9)}.hero.is-danger .subtitle a:not(.button),.hero.is-danger .subtitle strong{color:#fff}@media screen and (max-width: 1055px){.hero.is-danger .navbar-menu{background-color:#da0b00}}.hero.is-danger .navbar-item,.hero.is-danger .navbar-link{color:rgba(255,255,255,0.7)}.hero.is-danger a.navbar-item:hover,.hero.is-danger a.navbar-item.is-active,.hero.is-danger .navbar-link:hover,.hero.is-danger .navbar-link.is-active{background-color:#c10a00;color:#fff}.hero.is-danger .tabs a{color:#fff;opacity:0.9}.hero.is-danger .tabs a:hover{opacity:1}.hero.is-danger .tabs li.is-active a{color:#da0b00 !important;opacity:1}.hero.is-danger .tabs.is-boxed a,.hero.is-danger .tabs.is-toggle a{color:#fff}.hero.is-danger .tabs.is-boxed a:hover,.hero.is-danger .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}.hero.is-danger .tabs.is-boxed li.is-active a,.hero.is-danger .tabs.is-boxed li.is-active a:hover,.hero.is-danger .tabs.is-toggle li.is-active a,.hero.is-danger .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#da0b00}.hero.is-danger.is-bold{background-image:linear-gradient(141deg, #a70013 0%, #da0b00 71%, #f43500 100%)}@media screen and (max-width: 768px){.hero.is-danger.is-bold .navbar-menu{background-image:linear-gradient(141deg, #a70013 0%, #da0b00 71%, #f43500 100%)}}.hero.is-small .hero-body,#documenter .docs-sidebar form.docs-search>input.hero .hero-body{padding:1.5rem}@media screen and (min-width: 769px),print{.hero.is-medium .hero-body{padding:9rem 4.5rem}}@media screen and (min-width: 769px),print{.hero.is-large .hero-body{padding:18rem 6rem}}.hero.is-halfheight .hero-body,.hero.is-fullheight .hero-body,.hero.is-fullheight-with-navbar .hero-body{align-items:center;display:flex}.hero.is-halfheight .hero-body>.container,.hero.is-fullheight .hero-body>.container,.hero.is-fullheight-with-navbar .hero-body>.container{flex-grow:1;flex-shrink:1}.hero.is-halfheight{min-height:50vh}.hero.is-fullheight{min-height:100vh}.hero-video{overflow:hidden}.hero-video video{left:50%;min-height:100%;min-width:100%;position:absolute;top:50%;transform:translate3d(-50%, -50%, 0)}.hero-video.is-transparent{opacity:0.3}@media screen and (max-width: 768px){.hero-video{display:none}}.hero-buttons{margin-top:1.5rem}@media screen and (max-width: 768px){.hero-buttons .button{display:flex}.hero-buttons .button:not(:last-child){margin-bottom:0.75rem}}@media screen and (min-width: 769px),print{.hero-buttons{display:flex;justify-content:center}.hero-buttons .button:not(:last-child){margin-right:1.5rem}}.hero-head,.hero-foot{flex-grow:0;flex-shrink:0}.hero-body{flex-grow:1;flex-shrink:0;padding:3rem 1.5rem}@media screen and (min-width: 769px),print{.hero-body{padding:3rem 3rem}}.section{padding:3rem 1.5rem}@media screen and (min-width: 1056px){.section{padding:3rem 3rem}.section.is-medium{padding:9rem 4.5rem}.section.is-large{padding:18rem 6rem}}.footer{background-color:#fafafa;padding:3rem 1.5rem 6rem}h1 .docs-heading-anchor,h1 .docs-heading-anchor:hover,h1 .docs-heading-anchor:visited,h2 .docs-heading-anchor,h2 .docs-heading-anchor:hover,h2 .docs-heading-anchor:visited,h3 .docs-heading-anchor,h3 .docs-heading-anchor:hover,h3 .docs-heading-anchor:visited,h4 .docs-heading-anchor,h4 .docs-heading-anchor:hover,h4 .docs-heading-anchor:visited,h5 .docs-heading-anchor,h5 .docs-heading-anchor:hover,h5 .docs-heading-anchor:visited,h6 .docs-heading-anchor,h6 .docs-heading-anchor:hover,h6 .docs-heading-anchor:visited{color:#222}h1 .docs-heading-anchor-permalink,h2 .docs-heading-anchor-permalink,h3 .docs-heading-anchor-permalink,h4 .docs-heading-anchor-permalink,h5 .docs-heading-anchor-permalink,h6 .docs-heading-anchor-permalink{visibility:hidden;vertical-align:middle;margin-left:0.5em;font-size:0.7rem}h1 .docs-heading-anchor-permalink::before,h2 .docs-heading-anchor-permalink::before,h3 .docs-heading-anchor-permalink::before,h4 .docs-heading-anchor-permalink::before,h5 .docs-heading-anchor-permalink::before,h6 .docs-heading-anchor-permalink::before{font-family:"Font Awesome 6 Free";font-weight:900;content:"\f0c1"}h1:hover .docs-heading-anchor-permalink,h2:hover .docs-heading-anchor-permalink,h3:hover .docs-heading-anchor-permalink,h4:hover .docs-heading-anchor-permalink,h5:hover .docs-heading-anchor-permalink,h6:hover .docs-heading-anchor-permalink{visibility:visible}.docs-dark-only{display:none !important}pre{position:relative;overflow:hidden}pre code,pre code.hljs{padding:0 .75rem !important;overflow:auto;display:block}pre code:first-of-type,pre code.hljs:first-of-type{padding-top:0.5rem !important}pre code:last-of-type,pre code.hljs:last-of-type{padding-bottom:0.5rem !important}pre .copy-button{opacity:0.2;transition:opacity 0.2s;position:absolute;right:0em;top:0em;padding:0.5em;width:2.5em;height:2.5em;background:transparent;border:none;font-family:"Font Awesome 6 Free";color:#222;cursor:pointer;text-align:center}pre .copy-button:focus,pre .copy-button:hover{opacity:1;background:rgba(34,34,34,0.1);color:#2e63b8}pre .copy-button.success{color:#259a12;opacity:1}pre .copy-button.error{color:#cb3c33;opacity:1}pre:hover .copy-button{opacity:1}.admonition{background-color:#b5b5b5;border-style:solid;border-width:1px;border-color:#363636;border-radius:4px;font-size:1rem}.admonition strong{color:currentColor}.admonition.is-small,#documenter .docs-sidebar form.docs-search>input.admonition{font-size:.75rem}.admonition.is-medium{font-size:1.25rem}.admonition.is-large{font-size:1.5rem}.admonition.is-default{background-color:#b5b5b5;border-color:#363636}.admonition.is-default>.admonition-header{background-color:#363636;color:#fff}.admonition.is-default>.admonition-body{color:#fff}.admonition.is-info{background-color:#def0fc;border-color:#209cee}.admonition.is-info>.admonition-header{background-color:#209cee;color:#fff}.admonition.is-info>.admonition-body{color:rgba(0,0,0,0.7)}.admonition.is-success{background-color:#bdf4d1;border-color:#22c35b}.admonition.is-success>.admonition-header{background-color:#22c35b;color:#fff}.admonition.is-success>.admonition-body{color:rgba(0,0,0,0.7)}.admonition.is-warning{background-color:#fff3c5;border-color:#ffdd57}.admonition.is-warning>.admonition-header{background-color:#ffdd57;color:rgba(0,0,0,0.7)}.admonition.is-warning>.admonition-body{color:rgba(0,0,0,0.7)}.admonition.is-danger{background-color:#ffaba7;border-color:#da0b00}.admonition.is-danger>.admonition-header{background-color:#da0b00;color:#fff}.admonition.is-danger>.admonition-body{color:rgba(0,0,0,0.7)}.admonition.is-compat{background-color:#bdeff5;border-color:#1db5c9}.admonition.is-compat>.admonition-header{background-color:#1db5c9;color:#fff}.admonition.is-compat>.admonition-body{color:rgba(0,0,0,0.7)}.admonition-header{color:#fff;background-color:#363636;align-items:center;font-weight:700;justify-content:space-between;line-height:1.25;padding:0.5rem .75rem;position:relative}.admonition-header:before{font-family:"Font Awesome 6 Free";font-weight:900;margin-right:.75rem;content:"\f06a"}details.admonition.is-details>.admonition-header{list-style:none}details.admonition.is-details>.admonition-header:before{font-family:"Font Awesome 6 Free";font-weight:900;content:"\f055"}details.admonition.is-details[open]>.admonition-header:before{font-family:"Font Awesome 6 Free";font-weight:900;content:"\f056"}.admonition-body{color:#222;padding:0.5rem .75rem}.admonition-body pre{background-color:#f5f5f5}.admonition-body code{background-color:rgba(0,0,0,0.05)}.docstring{margin-bottom:1em;background-color:rgba(0,0,0,0);border:1px solid #dbdbdb;box-shadow:2px 2px 3px rgba(10,10,10,0.1);max-width:100%}.docstring>header{cursor:pointer;display:flex;flex-grow:1;align-items:stretch;padding:0.5rem .75rem;background-color:#f5f5f5;box-shadow:0 0.125em 0.25em rgba(10,10,10,0.1);box-shadow:none;border-bottom:1px solid #dbdbdb;overflow:auto}.docstring>header code{background-color:transparent}.docstring>header .docstring-article-toggle-button{min-width:1.1rem;padding:0.2rem 0.2rem 0.2rem 0}.docstring>header .docstring-binding{margin-right:0.3em}.docstring>header .docstring-category{margin-left:0.3em}.docstring>section{position:relative;padding:.75rem .75rem;border-bottom:1px solid #dbdbdb}.docstring>section:last-child{border-bottom:none}.docstring>section>a.docs-sourcelink{transition:opacity 0.3s;opacity:0;position:absolute;right:.375rem;bottom:.375rem}.docstring>section>a.docs-sourcelink:focus{opacity:1 !important}.docstring:hover>section>a.docs-sourcelink{opacity:0.2}.docstring:focus-within>section>a.docs-sourcelink{opacity:0.2}.docstring>section:hover a.docs-sourcelink{opacity:1}.documenter-example-output{background-color:#fff}.outdated-warning-overlay{position:fixed;top:0;left:0;right:0;box-shadow:0 0 10px rgba(0,0,0,0.3);z-index:999;background-color:#ffaba7;color:rgba(0,0,0,0.7);border-bottom:3px solid #da0b00;padding:10px 35px;text-align:center;font-size:15px}.outdated-warning-overlay .outdated-warning-closer{position:absolute;top:calc(50% - 10px);right:18px;cursor:pointer;width:12px}.outdated-warning-overlay a{color:#2e63b8}.outdated-warning-overlay a:hover{color:#363636}.content pre{border:1px solid #dbdbdb}.content code{font-weight:inherit}.content a code{color:#2e63b8}.content h1 code,.content h2 code,.content h3 code,.content h4 code,.content h5 code,.content h6 code{color:#222}.content table{display:block;width:initial;max-width:100%;overflow-x:auto}.content blockquote>ul:first-child,.content blockquote>ol:first-child,.content .admonition-body>ul:first-child,.content .admonition-body>ol:first-child{margin-top:0}pre,code{font-variant-ligatures:no-contextual}.breadcrumb a.is-disabled{cursor:default;pointer-events:none}.breadcrumb a.is-disabled,.breadcrumb a.is-disabled:hover{color:#222}.hljs{background:initial !important}.katex .katex-mathml{top:0;right:0}.katex-display,mjx-container,.MathJax_Display{margin:0.5em 0 !important}html{-moz-osx-font-smoothing:auto;-webkit-font-smoothing:auto}li.no-marker{list-style:none}#documenter .docs-main>article{overflow-wrap:break-word}#documenter .docs-main>article .math-container{overflow-x:auto;overflow-y:hidden}@media screen and (min-width: 1056px){#documenter .docs-main{max-width:52rem;margin-left:20rem;padding-right:1rem}}@media screen and (max-width: 1055px){#documenter .docs-main{width:100%}#documenter .docs-main>article{max-width:52rem;margin-left:auto;margin-right:auto;margin-bottom:1rem;padding:0 1rem}#documenter .docs-main>header,#documenter .docs-main>nav{max-width:100%;width:100%;margin:0}}#documenter .docs-main header.docs-navbar{background-color:#fff;border-bottom:1px solid #dbdbdb;z-index:2;min-height:4rem;margin-bottom:1rem;display:flex}#documenter .docs-main header.docs-navbar .breadcrumb{flex-grow:1;overflow-x:hidden}#documenter .docs-main header.docs-navbar .docs-sidebar-button{display:block;font-size:1.5rem;padding-bottom:0.1rem;margin-right:1rem}#documenter .docs-main header.docs-navbar .docs-right{display:flex;white-space:nowrap;gap:1rem;align-items:center}#documenter .docs-main header.docs-navbar .docs-right .docs-icon,#documenter .docs-main header.docs-navbar .docs-right .docs-label{display:inline-block}#documenter .docs-main header.docs-navbar .docs-right .docs-label{padding:0;margin-left:0.3em}@media screen and (max-width: 1055px){#documenter .docs-main header.docs-navbar .docs-right .docs-navbar-link{margin-left:0.4rem;margin-right:0.4rem}}#documenter .docs-main header.docs-navbar>*{margin:auto 0}@media screen and (max-width: 1055px){#documenter .docs-main header.docs-navbar{position:sticky;top:0;padding:0 1rem;transition-property:top, box-shadow;-webkit-transition-property:top, box-shadow;transition-duration:0.3s;-webkit-transition-duration:0.3s}#documenter .docs-main header.docs-navbar.headroom--not-top{box-shadow:.2rem 0rem .4rem #bbb;transition-duration:0.7s;-webkit-transition-duration:0.7s}#documenter .docs-main header.docs-navbar.headroom--unpinned.headroom--not-top.headroom--not-bottom{top:-4.5rem;transition-duration:0.7s;-webkit-transition-duration:0.7s}}#documenter .docs-main section.footnotes{border-top:1px solid #dbdbdb}#documenter .docs-main section.footnotes li .tag:first-child,#documenter .docs-main section.footnotes li .docstring>section>a.docs-sourcelink:first-child,#documenter .docs-main section.footnotes li .content kbd:first-child,.content #documenter .docs-main section.footnotes li kbd:first-child{margin-right:1em;margin-bottom:0.4em}#documenter .docs-main .docs-footer{display:flex;flex-wrap:wrap;margin-left:0;margin-right:0;border-top:1px solid #dbdbdb;padding-top:1rem;padding-bottom:1rem}@media screen and (max-width: 1055px){#documenter .docs-main .docs-footer{padding-left:1rem;padding-right:1rem}}#documenter .docs-main .docs-footer .docs-footer-nextpage,#documenter .docs-main .docs-footer .docs-footer-prevpage{flex-grow:1}#documenter .docs-main .docs-footer .docs-footer-nextpage{text-align:right}#documenter .docs-main .docs-footer .flexbox-break{flex-basis:100%;height:0}#documenter .docs-main .docs-footer .footer-message{font-size:0.8em;margin:0.5em auto 0 auto;text-align:center}#documenter .docs-sidebar{display:flex;flex-direction:column;color:#0a0a0a;background-color:#f5f5f5;border-right:1px solid #dbdbdb;padding:0;flex:0 0 18rem;z-index:5;font-size:1rem;position:fixed;left:-18rem;width:18rem;height:100%;transition:left 0.3s}#documenter .docs-sidebar.visible{left:0;box-shadow:.4rem 0rem .8rem #bbb}@media screen and (min-width: 1056px){#documenter .docs-sidebar.visible{box-shadow:none}}@media screen and (min-width: 1056px){#documenter .docs-sidebar{left:0;top:0}}#documenter .docs-sidebar .docs-logo{margin-top:1rem;padding:0 1rem}#documenter .docs-sidebar .docs-logo>img{max-height:6rem;margin:auto}#documenter .docs-sidebar .docs-package-name{flex-shrink:0;font-size:1.5rem;font-weight:700;text-align:center;white-space:nowrap;overflow:hidden;padding:0.5rem 0}#documenter .docs-sidebar .docs-package-name .docs-autofit{max-width:16.2rem}#documenter .docs-sidebar .docs-package-name a,#documenter .docs-sidebar .docs-package-name a:hover{color:#0a0a0a}#documenter .docs-sidebar .docs-version-selector{border-top:1px solid #dbdbdb;display:none;padding:0.5rem}#documenter .docs-sidebar .docs-version-selector.visible{display:flex}#documenter .docs-sidebar ul.docs-menu{flex-grow:1;user-select:none;border-top:1px solid #dbdbdb;padding-bottom:1.5rem}#documenter .docs-sidebar ul.docs-menu>li>.tocitem{font-weight:bold}#documenter .docs-sidebar ul.docs-menu>li li{font-size:.95rem;margin-left:1em;border-left:1px solid #dbdbdb}#documenter .docs-sidebar ul.docs-menu input.collapse-toggle{display:none}#documenter .docs-sidebar ul.docs-menu ul.collapsed{display:none}#documenter .docs-sidebar ul.docs-menu input:checked~ul.collapsed{display:block}#documenter .docs-sidebar ul.docs-menu label.tocitem{display:flex}#documenter .docs-sidebar ul.docs-menu label.tocitem .docs-label{flex-grow:2}#documenter .docs-sidebar ul.docs-menu label.tocitem .docs-chevron{display:inline-block;font-style:normal;font-variant:normal;text-rendering:auto;line-height:1;font-size:.75rem;margin-left:1rem;margin-top:auto;margin-bottom:auto}#documenter .docs-sidebar ul.docs-menu label.tocitem .docs-chevron::before{font-family:"Font Awesome 6 Free";font-weight:900;content:"\f054"}#documenter .docs-sidebar ul.docs-menu input:checked~label.tocitem .docs-chevron::before{content:"\f078"}#documenter .docs-sidebar ul.docs-menu .tocitem{display:block;padding:0.5rem 0.5rem}#documenter .docs-sidebar ul.docs-menu .tocitem,#documenter .docs-sidebar ul.docs-menu .tocitem:hover{color:#0a0a0a;background:#f5f5f5}#documenter .docs-sidebar ul.docs-menu a.tocitem:hover,#documenter .docs-sidebar ul.docs-menu label.tocitem:hover{color:#0a0a0a;background-color:#ebebeb}#documenter .docs-sidebar ul.docs-menu li.is-active{border-top:1px solid #dbdbdb;border-bottom:1px solid #dbdbdb;background-color:#fff}#documenter .docs-sidebar ul.docs-menu li.is-active .tocitem,#documenter .docs-sidebar ul.docs-menu li.is-active .tocitem:hover{background-color:#fff;color:#0a0a0a}#documenter .docs-sidebar ul.docs-menu li.is-active ul.internal .tocitem:hover{background-color:#ebebeb;color:#0a0a0a}#documenter .docs-sidebar ul.docs-menu>li.is-active:first-child{border-top:none}#documenter .docs-sidebar ul.docs-menu ul.internal{margin:0 0.5rem 0.5rem;border-top:1px solid #dbdbdb}#documenter .docs-sidebar ul.docs-menu ul.internal li{font-size:.85rem;border-left:none;margin-left:0;margin-top:0.5rem}#documenter .docs-sidebar ul.docs-menu ul.internal .tocitem{width:100%;padding:0}#documenter .docs-sidebar ul.docs-menu ul.internal .tocitem::before{content:"⚬";margin-right:0.4em}#documenter .docs-sidebar form.docs-search{margin:auto;margin-top:0.5rem;margin-bottom:0.5rem}#documenter .docs-sidebar form.docs-search>input{width:14.4rem}#documenter .docs-sidebar #documenter-search-query{color:#707070;width:14.4rem;box-shadow:inset 0 1px 2px rgba(10,10,10,0.1)}@media screen and (min-width: 1056px){#documenter .docs-sidebar ul.docs-menu{overflow-y:auto;-webkit-overflow-scroll:touch}#documenter .docs-sidebar ul.docs-menu::-webkit-scrollbar{width:.3rem;background:none}#documenter .docs-sidebar ul.docs-menu::-webkit-scrollbar-thumb{border-radius:5px 0px 0px 5px;background:#e0e0e0}#documenter .docs-sidebar ul.docs-menu::-webkit-scrollbar-thumb:hover{background:#ccc}}@media screen and (max-width: 1055px){#documenter .docs-sidebar{overflow-y:auto;-webkit-overflow-scroll:touch}#documenter .docs-sidebar::-webkit-scrollbar{width:.3rem;background:none}#documenter .docs-sidebar::-webkit-scrollbar-thumb{border-radius:5px 0px 0px 5px;background:#e0e0e0}#documenter .docs-sidebar::-webkit-scrollbar-thumb:hover{background:#ccc}}kbd.search-modal-key-hints{border-radius:0.25rem;border:1px solid rgba(0,0,0,0.6);box-shadow:0 2px 0 1px rgba(0,0,0,0.6);cursor:default;font-size:0.9rem;line-height:1.5;min-width:0.75rem;text-align:center;padding:0.1rem 0.3rem;position:relative;top:-1px}.search-min-width-50{min-width:50%}.search-min-height-100{min-height:100%}.search-modal-card-body{max-height:calc(100vh - 15rem)}.search-result-link{border-radius:0.7em;transition:all 300ms}.search-result-link:hover,.search-result-link:focus{background-color:rgba(0,128,128,0.1)}.search-result-link .property-search-result-badge,.search-result-link .search-filter{transition:all 300ms}.property-search-result-badge,.search-filter{padding:0.15em 0.5em;font-size:0.8em;font-style:italic;text-transform:none !important;line-height:1.5;color:#f5f5f5;background-color:rgba(51,65,85,0.501961);border-radius:0.6rem}.search-result-link:hover .property-search-result-badge,.search-result-link:hover .search-filter,.search-result-link:focus .property-search-result-badge,.search-result-link:focus .search-filter{color:#f1f5f9;background-color:#333}.search-filter{color:#333;background-color:#f5f5f5;transition:all 300ms}.search-filter:hover,.search-filter:focus{color:#333}.search-filter-selected{color:#f5f5f5;background-color:rgba(139,0,139,0.5)}.search-filter-selected:hover,.search-filter-selected:focus{color:#f5f5f5}.search-result-highlight{background-color:#ffdd57;color:black}.search-divider{border-bottom:1px solid #dbdbdb}.search-result-title{width:85%;color:#333}.search-result-code-title{font-size:0.875rem;font-family:"JuliaMono","SFMono-Regular","Menlo","Consolas","Liberation Mono","DejaVu Sans Mono",monospace}#search-modal .modal-card-body::-webkit-scrollbar,#search-modal .filter-tabs::-webkit-scrollbar{height:10px;width:10px;background-color:transparent}#search-modal .modal-card-body::-webkit-scrollbar-thumb,#search-modal .filter-tabs::-webkit-scrollbar-thumb{background-color:gray;border-radius:1rem}#search-modal .modal-card-body::-webkit-scrollbar-track,#search-modal .filter-tabs::-webkit-scrollbar-track{-webkit-box-shadow:inset 0 0 6px rgba(0,0,0,0.6);background-color:transparent}.w-100{width:100%}.gap-2{gap:0.5rem}.gap-4{gap:1rem}.gap-8{gap:2rem}.ansi span.sgr1{font-weight:bolder}.ansi span.sgr2{font-weight:lighter}.ansi span.sgr3{font-style:italic}.ansi span.sgr4{text-decoration:underline}.ansi span.sgr7{color:#fff;background-color:#222}.ansi span.sgr8{color:transparent}.ansi span.sgr8 span{color:transparent}.ansi span.sgr9{text-decoration:line-through}.ansi span.sgr30{color:#242424}.ansi span.sgr31{color:#a7201f}.ansi span.sgr32{color:#066f00}.ansi span.sgr33{color:#856b00}.ansi span.sgr34{color:#2149b0}.ansi span.sgr35{color:#7d4498}.ansi span.sgr36{color:#007989}.ansi span.sgr37{color:gray}.ansi span.sgr40{background-color:#242424}.ansi span.sgr41{background-color:#a7201f}.ansi span.sgr42{background-color:#066f00}.ansi span.sgr43{background-color:#856b00}.ansi span.sgr44{background-color:#2149b0}.ansi span.sgr45{background-color:#7d4498}.ansi span.sgr46{background-color:#007989}.ansi span.sgr47{background-color:gray}.ansi span.sgr90{color:#616161}.ansi span.sgr91{color:#cb3c33}.ansi span.sgr92{color:#0e8300}.ansi span.sgr93{color:#a98800}.ansi span.sgr94{color:#3c5dcd}.ansi span.sgr95{color:#9256af}.ansi span.sgr96{color:#008fa3}.ansi span.sgr97{color:#f5f5f5}.ansi span.sgr100{background-color:#616161}.ansi span.sgr101{background-color:#cb3c33}.ansi span.sgr102{background-color:#0e8300}.ansi span.sgr103{background-color:#a98800}.ansi span.sgr104{background-color:#3c5dcd}.ansi span.sgr105{background-color:#9256af}.ansi span.sgr106{background-color:#008fa3}.ansi span.sgr107{background-color:#f5f5f5}code.language-julia-repl>span.hljs-meta{color:#066f00;font-weight:bolder}/*! + Theme: Default + Description: Original highlight.js style + Author: (c) Ivan Sagalaev + Maintainer: @highlightjs/core-team + Website: https://highlightjs.org/ + License: see project LICENSE + Touched: 2021 +*/pre code.hljs{display:block;overflow-x:auto;padding:1em}code.hljs{padding:3px 5px}.hljs{background:#F3F3F3;color:#444}.hljs-comment{color:#697070}.hljs-tag,.hljs-punctuation{color:#444a}.hljs-tag .hljs-name,.hljs-tag .hljs-attr{color:#444}.hljs-keyword,.hljs-attribute,.hljs-selector-tag,.hljs-meta .hljs-keyword,.hljs-doctag,.hljs-name{font-weight:bold}.hljs-type,.hljs-string,.hljs-number,.hljs-selector-id,.hljs-selector-class,.hljs-quote,.hljs-template-tag,.hljs-deletion{color:#880000}.hljs-title,.hljs-section{color:#880000;font-weight:bold}.hljs-regexp,.hljs-symbol,.hljs-variable,.hljs-template-variable,.hljs-link,.hljs-selector-attr,.hljs-operator,.hljs-selector-pseudo{color:#ab5656}.hljs-literal{color:#695}.hljs-built_in,.hljs-bullet,.hljs-code,.hljs-addition{color:#397300}.hljs-meta{color:#1f7199}.hljs-meta .hljs-string{color:#38a}.hljs-emphasis{font-style:italic}.hljs-strong{font-weight:bold}.gap-4{gap:1rem} diff --git a/v1.7.4/assets/themeswap.js b/v1.7.4/assets/themeswap.js new file mode 100644 index 000000000..9f5eebe6a --- /dev/null +++ b/v1.7.4/assets/themeswap.js @@ -0,0 +1,84 @@ +// Small function to quickly swap out themes. Gets put into the tag.. +function set_theme_from_local_storage() { + // Initialize the theme to null, which means default + var theme = null; + // If the browser supports the localstorage and is not disabled then try to get the + // documenter theme + if (window.localStorage != null) { + // Get the user-picked theme from localStorage. May be `null`, which means the default + // theme. + theme = window.localStorage.getItem("documenter-theme"); + } + // Check if the users preference is for dark color scheme + var darkPreference = + window.matchMedia("(prefers-color-scheme: dark)").matches === true; + // Initialize a few variables for the loop: + // + // - active: will contain the index of the theme that should be active. Note that there + // is no guarantee that localStorage contains sane values. If `active` stays `null` + // we either could not find the theme or it is the default (primary) theme anyway. + // Either way, we then need to stick to the primary theme. + // + // - disabled: style sheets that should be disabled (i.e. all the theme style sheets + // that are not the currently active theme) + var active = null; + var disabled = []; + var primaryLightTheme = null; + var primaryDarkTheme = null; + for (var i = 0; i < document.styleSheets.length; i++) { + var ss = document.styleSheets[i]; + // The tag of each style sheet is expected to have a data-theme-name attribute + // which must contain the name of the theme. The names in localStorage much match this. + var themename = ss.ownerNode.getAttribute("data-theme-name"); + // attribute not set => non-theme stylesheet => ignore + if (themename === null) continue; + // To distinguish the default (primary) theme, it needs to have the data-theme-primary + // attribute set. + if (ss.ownerNode.getAttribute("data-theme-primary") !== null) { + primaryLightTheme = themename; + } + // Check if the theme is primary dark theme so that we could store its name in darkTheme + if (ss.ownerNode.getAttribute("data-theme-primary-dark") !== null) { + primaryDarkTheme = themename; + } + // If we find a matching theme (and it's not the default), we'll set active to non-null + if (themename === theme) active = i; + // Store the style sheets of inactive themes so that we could disable them + if (themename !== theme) disabled.push(ss); + } + var activeTheme = null; + if (active !== null) { + // If we did find an active theme, we'll (1) add the theme--$(theme) class to + document.getElementsByTagName("html")[0].className = "theme--" + theme; + activeTheme = theme; + } else { + // If we did _not_ find an active theme, then we need to fall back to the primary theme + // which can either be dark or light, depending on the user's OS preference. + var activeTheme = darkPreference ? primaryDarkTheme : primaryLightTheme; + // In case it somehow happens that the relevant primary theme was not found in the + // preceding loop, we abort without doing anything. + if (activeTheme === null) { + console.error("Unable to determine primary theme."); + return; + } + // When switching to the primary light theme, then we must not have a class name + // for the tag. That's only for non-primary or the primary dark theme. + if (darkPreference) { + document.getElementsByTagName("html")[0].className = + "theme--" + activeTheme; + } else { + document.getElementsByTagName("html")[0].className = ""; + } + } + for (var i = 0; i < document.styleSheets.length; i++) { + var ss = document.styleSheets[i]; + // The tag of each style sheet is expected to have a data-theme-name attribute + // which must contain the name of the theme. The names in localStorage much match this. + var themename = ss.ownerNode.getAttribute("data-theme-name"); + // attribute not set => non-theme stylesheet => ignore + if (themename === null) continue; + // we'll disable all the stylesheets, except for the active one + ss.disabled = !(themename == activeTheme); + } +} +set_theme_from_local_storage(); diff --git a/v1.7.4/assets/warner.js b/v1.7.4/assets/warner.js new file mode 100644 index 000000000..3f6f5d008 --- /dev/null +++ b/v1.7.4/assets/warner.js @@ -0,0 +1,52 @@ +function maybeAddWarning() { + // DOCUMENTER_NEWEST is defined in versions.js, DOCUMENTER_CURRENT_VERSION and DOCUMENTER_STABLE + // in siteinfo.js. + // If either of these are undefined something went horribly wrong, so we abort. + if ( + window.DOCUMENTER_NEWEST === undefined || + window.DOCUMENTER_CURRENT_VERSION === undefined || + window.DOCUMENTER_STABLE === undefined + ) { + return; + } + + // Current version is not a version number, so we can't tell if it's the newest version. Abort. + if (!/v(\d+\.)*\d+/.test(window.DOCUMENTER_CURRENT_VERSION)) { + return; + } + + // Current version is newest version, so no need to add a warning. + if (window.DOCUMENTER_NEWEST === window.DOCUMENTER_CURRENT_VERSION) { + return; + } + + // Add a noindex meta tag (unless one exists) so that search engines don't index this version of the docs. + if (document.body.querySelector('meta[name="robots"]') === null) { + const meta = document.createElement("meta"); + meta.name = "robots"; + meta.content = "noindex"; + + document.getElementsByTagName("head")[0].appendChild(meta); + } + + const div = document.createElement("div"); + div.classList.add("outdated-warning-overlay"); + const closer = document.createElement("button"); + closer.classList.add("outdated-warning-closer", "delete"); + closer.addEventListener("click", function () { + document.body.removeChild(div); + }); + const href = window.documenterBaseURL + "/../" + window.DOCUMENTER_STABLE; + div.innerHTML = + 'This documentation is not for the latest stable release, but for either the development version or an older release.
      Click here to go to the documentation for the latest stable release.'; + div.appendChild(closer); + document.body.appendChild(div); +} + +if (document.readyState === "loading") { + document.addEventListener("DOMContentLoaded", maybeAddWarning); +} else { + maybeAddWarning(); +} diff --git a/v1.7.4/contributing/index.html b/v1.7.4/contributing/index.html new file mode 100644 index 000000000..7624a03c9 --- /dev/null +++ b/v1.7.4/contributing/index.html @@ -0,0 +1,2 @@ + +Contributing · Rocket.jl

      Contribution guidelines

      We welcome all possible contributors. This page details the some of the guidelines that should be followed when contributing to this package.

      Reporting bugs

      We track bugs using GitHub issues. We encourage you to write complete, specific, reproducible bug reports. Mention the versions of Julia and Rocket.jl for which you observe unexpected behavior. Please provide a concise description of the problem and complement it with code snippets, test cases, screenshots, tracebacks or any other information that you consider relevant. This will help us to replicate the problem and narrow the search space for solutions.

      Suggesting features

      We welcome new feature proposals. However, before submitting a feature request, consider a few things:

      • Does the feature require changes in the core Rocket.jl code? If it doesn't (for example, you would like to add a operator for a particular application), consider making a separate repository for your extensions.
      • If you would like to add an implementation of a feature that changes a lot in the core Rocket.jl code, please open an issue on GitHub and describe your proposal first. This will allow us to discuss your proposal with you before you invest your time in implementing something that may be difficult to merge later on.

      Contributing code

      Installing Rocket

      We suggest that you use the dev command from the new Julia package manager to install Rocket.jl for development purposes. To work on your fork of Rocket.jl, use your fork's URL address in the dev command, for example:

      ] dev git@github.com:your_username/Rocket.jl.git

      The dev command clones Rocket.jl to ~/.julia/dev/Rocket. All local changes to Rocket code will be reflected in imported code.

      Note

      It is also might be useful to install Revise.jl package as it allows you to modify code and use the changes without restarting Julia.

      Committing code

      We use the standard GitHub Flow workflow where all contributions are added through pull requests. In order to contribute, first fork the repository, then commit your contributions to your fork, and then create a pull request on the master branch of the Rocket.jl repository.

      Before opening a pull request, please make sure that all tests pass without failing! All demos (can be found in /demo/ directory) have to run without errors as well.

      Style conventions

      We use default Julia style guide. We list here a few important points and our modifications to the Julia style guide:

      • Use 4 spaces for indentation
      • Type names use UpperCamelCase. For example: ArrayObservable, MapOperator, etc..
      • Function names are lowercase with underscores, when necessary. For example: next!, subscribe!, as_actor, etc..
      • Variable names and function arguments use snake_case
      • The name of a method that modifies its argument(s) must end in !

      Unit tests

      We use the test-driven development (TDD) methodology for Rocket.jl development. The test coverage should be as complete as possible. Please make sure that you write tests for each piece of code that you want to add.

      All unit tests are located in the /test/ directory. The /test/ directory follows the structure of the /src/ directory. Each test file should have following filename format: test_*.jl. Some tests are also present in jldoctest docs annotations directly in the source code. See Julia's documentation about doctests.

      The tests can be evaluated by running following command in the Julia REPL:

      ] test Rocket
      diff --git a/v1.7.4/getting-started/index.html b/v1.7.4/getting-started/index.html new file mode 100644 index 000000000..9014a37b8 --- /dev/null +++ b/v1.7.4/getting-started/index.html @@ -0,0 +1,22 @@ + +Getting started · Rocket.jl

      Getting started

      Rocket.jl is a Julia package for reactive programming that makes it easier to work with asynchronous data. It is inspired by the RxJS and ReactiveX communities.

      In order to combine good performance with a convenient API, Rocket.jl employs Observer patterns, Actor models and Functional programming.

      Installation

      Install Rocket.jl through the Julia package manager:

      ] add Rocket

      Concepts

      Rocket.jl has been designed with a focus on performance and modularity.

      The essential concepts in Rocket.jl are:

      • Observable: represents a collection of future messages (data or/and events).
      • Actor: is an object that knows how to react on incoming messages delivered by the Observable.
      • Subscription: represents a teardown logic that is useful for cancelling the execution of an Observable.
      • Operator: an object that deals with collection operations, such as map, filter, reduce, etc.
      • Subject: the way of multicasting a message to multiple Observers.

      First example

      Conventionally, arrays are used for processing data.

      for value in array_of_values
      +    doSomethingWithMyData(value)
      +end

      In contrast, Rocket.jl uses observables.

      subscription = subscribe!(source_of_values, lambda(
      +    on_next     = (data)  -> doSomethingWithMyData(data),
      +    on_error    = (error) -> doSomethingWithAnError(error),
      +    on_complete = ()      -> println("Completed!")
      +))

      At some point in time you may decide to stop listening for new messages.

      unsubscribe!(subscription)

      Actors

      In order to process messages from an observable you will need to define an Actor that knows how to react to incoming messages.

      struct MyActor <: Rocket.Actor{Int} end
      +
      +Rocket.on_next!(actor::MyActor, data::Int) = doSomethingWithMyData(data)
      +Rocket.on_error!(actor::MyActor, error)    = doSomethingWithAnError(error)
      +Rocket.on_complete!(actor::MyActor)        = println("Completed!")

      An actor can also have its own local state.

      struct StoreActor{D} <: Rocket.Actor{D}
      +    values :: Vector{D}
      +
      +    StoreActor{D}() where D = new(Vector{D}())
      +end
      +
      +Rocket.on_next!(actor::StoreActor{D}, data::D) where D = push!(actor.values, data)
      +Rocket.on_error!(actor::StoreActor, error)             = doSomethingWithAnError(error)
      +Rocket.on_complete!(actor::StoreActor)                 = println("Completed: $(actor.values)")

      For debugging purposes you can use a general LambdaActor actor or just pass a function object as an actor in subscribe! function..

      Operators

      What makes Rocket.jl powerful is its ability to help you process, transform and modify the messages that flow through your observables, using Operators.

      subscribe!(squared_int_values |> map(Int, (d) -> d ^ 2), lambda(
      +    on_next = (data) -> println(data)
      +))
      diff --git a/v1.7.4/index.html b/v1.7.4/index.html new file mode 100644 index 000000000..2c3f17116 --- /dev/null +++ b/v1.7.4/index.html @@ -0,0 +1,2 @@ + +Home · Rocket.jl

      Rocket.jl Documentation

      Welcome to the documentation for Rocket.jl.

      This documentation is an adaptation of the RxJS library documentation.

      Table of Contents

      Index

      diff --git a/v1.7.4/objects.inv b/v1.7.4/objects.inv new file mode 100644 index 000000000..9e2fb3ab4 Binary files /dev/null and b/v1.7.4/objects.inv differ diff --git a/v1.7.4/observables/about/index.html b/v1.7.4/observables/about/index.html new file mode 100644 index 000000000..ded09c295 --- /dev/null +++ b/v1.7.4/observables/about/index.html @@ -0,0 +1,94 @@ + +Observable · Rocket.jl

      Observables

      Observables are lazy Push collections of multiple values. They fill the missing spot in the following table:

      TypeSingleMultiple
      PullFunctionIterator
      PushPromiseObservable

      First example

      For example, the following code specifies an Observable that pushes the values 1, 2, 3 immediately (synchronously) when subscribed to, and the value 4 after one second has passed since subscription.

      using Rocket
      +
      +source = make(Int) do actor
      +    next!(actor, 1)
      +    next!(actor, 2)
      +    next!(actor, 3)
      +    setTimeout(1000) do
      +        next!(actor, 4)
      +        complete!(actor)
      +    end
      +end

      To invoke the Observable and inspect these values, we need to subscribe to it. It is important to note that observables are lazy collections which means they don't emit anything until someone subscribes to it. Every subscription spawns its own independent execution of observable. There are some exceptions to this rule, e.g. Subjects and some operators (share(), etc..) which may change this behaviour

      using Rocket
      +
      +source = make(Int) do actor
      +    next!(actor, 1)
      +    next!(actor, 2)
      +    next!(actor, 3)
      +    setTimeout(1000) do
      +        next!(actor, 4)
      +        complete!(actor)
      +    end
      +end
      +
      +println("Just before subscribe")
      +subscribe!(source, lambda(
      +    on_next     = (d) -> println(d),
      +    on_complete = ()  -> println("Completed")
      +))
      +println("Just after subscribe")
      +
      +# Logs
      +# Just before subscribe
      +# 1
      +# 2
      +# 3
      +# Just after subscribe
      +# 4
      +# Completed

      Pull vs Push

      Pull and Push are two different protocols that describe how a data Producer communicates with a data Consumer.

      In a Pull system, the Consumer determines when it receives data from the Producer. The Producer itself is unaware of when the data are delivered to the Consumer.

      Every Julia Function is a Pull system. The function is a Producer of data, and the code that calls the function is consuming data by "pulling" a return value from the call.

      TypePRODUCERCONSUMER
      PullPassive: produces data when requested.Active: decides when data is requested.
      PushActive: produces data at its own pace.Passive: reacts to received data.

      In Push systems, the Producer determines when to send data to the Consumer. The Consumer is unaware of when it will receive that data.

      Futures and promises are the most common type of Push systems today. A Promise (the Producer) delivers a resolved value to registered callbacks (the Consumers). Unlike functions, it is the Promise that determines precisely when a value is "pushed" to the callbacks.

      Rocket.jl introduces Observables, a new Push system for Julia. An Observable is a Producer of multiple values, "pushing" them to Observers (Consumers or Actors).

      • A Function is a lazily evaluated computation that synchronously returns a single value on invocation.
      • A Generator is a lazily evaluated computation that synchronously returns zero to (potentially) infinite values on iteration.
      • A Promise is a computation that may (or may not) eventually return a single value.
      • An Observable is a lazily evaluated computation that can synchronously or asynchronously return zero to (potentially) infinite values from the time it's invoked.

      Observables as generalizations of functions

      In contrast to functions, Observables can "return" multiple values over time. For example, functions can't do this:

      function foo()
      +    println("Hello!")
      +    return 0
      +    return 1 # Dead code, will never happen
      +end

      Observables, however, can do this:

      using Rocket
      +
      +foo = make(Int) do actor
      +    next!(actor, 0)
      +    next!(actor, 1)
      +    complete!(actor)
      +end
      +

      Observables can also "return" values asynchronously after some time:

      using Rocket
      +
      +foo = make(Int) do actor
      +    setTimeout(1000) do
      +        next!(actor, 0)
      +        complete!(actor)
      +    end
      +end

      Assume we have a function foo and some observable:

      • Function call foo(args...) means "give me one value synchronously" (pull strategy)
      • In contrast subscription to an observable with subscribe(observable, ...) means "notify me about any amount of values, either synchronously or asynchronously" (push strategy)

      When a new value is available in an observable we say that the observable emits or generates an update. Values that are generated by an observable are sometimes also called future values, because there is no principled way to predict when an observable will generate a new value. In some programming languages, observables are referred to as generators or streams and we will use all three terms interchangeably.

      Anatomy of an Observable

      Observables are (1) created using creation operators (it is also possible to build an Observable from scratch with custom logic); (2) subscribed to with an Actor; (3) execute to deliver next! / error! / complete! notifications to the Actor, and (4) their execution may be disposed. These four aspects are all encoded in an Observable instance, but some of these aspects are related to other types, such as Subscribable and Subscription.

      The core responsibilities of an Observable are:

      • Creating Observables
      • Subscribing to Observables
      • Executing the Observable
      • Disposing Observables

      Creating Observables

      You can create an Observable in various ways using Creation operators. You can also build an Observable from scratch. To see how you can build an Observable with custom logic, consult the API Section.

      Subscribing to Observables

      The Observable source in the example can be subscribed to.

      using Rocket
      +
      +subscribe!(source, lambda(
      +    on_next = (d) -> println(d)
      +))

      This example shows how subscribe calls are not shared among multiple Actors of the same Observable. When calling subscribe! with an Actor, the function on_subscribe! that is attached to this particular Observable is executed for that given actor. Each call to subscribe! triggers its own independent setup for that given actor.

      Note

      Subscribing to an Observable is like calling a function, providing callbacks where the data will be delivered to.

      The subscribe! function also supports multiple subscriptions at once. If the input argument to the subscribe! function is a tuple or a vector, it will first check that all of the arguments are valid source objects and actors and if its true will subscribe from each of them individually.

      
      +source1 = Subject(Int)
      +source2 = Subject(Int)
      +
      +subscriptions = subscribe!([
      +    (source1, logger()),
      +    (source2, logger()),
      +])
      +
      +# Later on
      +# unsubscribe!(subscriptions)
      +

      Executing Observables

      The execution produces multiple values over time, either synchronously or asynchronously.

      An Observable Execution can deliver three types of notifications:

      • Next: sends a value, such as an Int, String, Dict, etc.;
      • Error: sends any error as a value;
      • Complete: does not send a value.

      "Next" notifications are the most important and most common type: they represent actual data being delivered to an subscriber. "Error" and "Complete" notifications terminate the Observable Execution.

      Note

      In an Observable Execution, any number of Next notifications may be delivered. However, once a single Error or Complete notification is delivered, nothing else can be delivered afterwards.

      The following is an example of an Observable execution that delivers three Next notifications and subsequently completes:

      using Rocket
      +
      +source = make(Int) do actor
      +    next!(actor, 1)
      +    next!(actor, 2)
      +    next!(actor, 3)
      +    complete!(actor)
      +end
      +
      +# or the same with creation operator
      +
      +source = from([ 1, 2, 3 ])

      It is advised to wrap any code in subscribe by a try/catch block that delivers an Error notification upon an exception:

      using Rocket
      +
      +source = make(Int) do actor
      +    try
      +        next!(actor, 1)
      +        next!(actor, 2)
      +        next!(actor, 3)
      +        complete!(actor)
      +    catch e
      +        error!(actor, e)
      +    end
      +end
      +

      Disposing Observable Executions

      It is common for an Actor to abort execution of an Observable Execution. Once the Actor is done receiving values, it may stop the execution in order to free computation power or memory resources.

      When subscribe! is called, the Actor gets attached to the newly created Observable execution. This call also returns an object, the Subscription:

      subscription = subscribe!(source, actor)

      The Subscription represents the ongoing execution, and has a minimal API that allows you to cancel the execution. Read more about Subscription type here.

      With

      unsubscribe!(subscription)

      you can cancel the ongoing execution.

      Note

      subscribe! returns a Subscription that represents the ongoing execution. Simply call unsubscribe! on the Subscription to cancel the execution.

      diff --git a/v1.7.4/observables/types/array/index.html b/v1.7.4/observables/types/array/index.html new file mode 100644 index 000000000..d801a5c19 --- /dev/null +++ b/v1.7.4/observables/types/array/index.html @@ -0,0 +1,59 @@ + +Array · Rocket.jl

      Array Observable

      Rocket.fromFunction
      from(x; scheduler::H = AsapScheduler()) where { H <: AbstractScheduler }
      +from(a::Vector{D}; scheduler::H = AsapScheduler()) where { D, H <: AbstractScheduler }

      Creation operator for the ArrayObservable that emits either a single value if x has a Scalar trait specification or a collection of values if x has a NonScalar trait specification. Throws an ErrorException if x has UndefinedScalarness trait type. To specify scalarness for arbitrary type T some can implement an additional method for scalarness(::Type{<:MyType}) function and to specify scalarness behavior. Optionally accepts custom scheduler-like object to schedule messages delivery.

      Arguments

      • x: an object to be wrapped into array of values
      • scheduler: optional, scheduler-like object

      For an object x to be a valid input for a from operator it must implement Rocket.scalarness(::Type{ <: T }) method which should return either Rocket.Scalar or Rocket.NonScalar objects. In first case from operator will treat x as a single scalar value and will wrap it into a vector while in the second case from operator will convert x object into an array using collect function.

      For arbitrary iterable objects consider using iterable creation operator.

      Note

      from operators creates a copy of x using collect on a given object.

      Examples

      using Rocket
      +
      +source = from([ 0, 1, 2 ])
      +subscribe!(source, logger())
      +;
      +
      +# output
      +
      +[LogActor] Data: 0
      +[LogActor] Data: 1
      +[LogActor] Data: 2
      +[LogActor] Completed
      +
      using Rocket
      +
      +source = from(( 0, 1, 2 ))
      +subscribe!(source, logger())
      +;
      +
      +# output
      +
      +[LogActor] Data: 0
      +[LogActor] Data: 1
      +[LogActor] Data: 2
      +[LogActor] Completed
      +
      using Rocket
      +
      +source = from(0)
      +subscribe!(source, logger())
      +;
      +
      +# output
      +
      +[LogActor] Data: 0
      +[LogActor] Completed
      +
      using Rocket
      +
      +source = from("Hello, world!")
      +subscribe!(source, logger())
      +;
      +
      +# output
      +
      +[LogActor] Data: H
      +[LogActor] Data: e
      +[LogActor] Data: l
      +[LogActor] Data: l
      +[LogActor] Data: o
      +[LogActor] Data: ,
      +[LogActor] Data:
      +[LogActor] Data: w
      +[LogActor] Data: o
      +[LogActor] Data: r
      +[LogActor] Data: l
      +[LogActor] Data: d
      +[LogActor] Data: !
      +[LogActor] Completed
      +

      See also: ArrayObservable, subscribe!, logger, iterable

      source
      Rocket.ArrayObservableType
      ArrayObservable{D, H}(values::Vector{D}, scheduler::H) where { D, H }

      ArrayObservable wraps a regular Julia array into an observable. Uses scheduler object to schedule messages delivery.

      Constructor arguments

      • values: array of values to be wrapped
      • scheduler: Scheduler-like object

      See also: Subscribable, from

      source
      diff --git a/v1.7.4/observables/types/collected/index.html b/v1.7.4/observables/types/collected/index.html new file mode 100644 index 000000000..2953e5d01 --- /dev/null +++ b/v1.7.4/observables/types/collected/index.html @@ -0,0 +1,14 @@ + +Collected · Rocket.jl

      Collected Observable

      Rocket.collectLatestFunction
      collectLatest(sources::S, mappingFn::F = copy) where { S, F }
      +collectLatest(::Type{T}, ::Type{R}, sources::S, mappingFn::F = copy)

      Collects values from multible Observables and emits it in one single array every time each inner Observable has a new value. Reemits errors from inner observables. Completes when all inner observables completes.

      Arguments

      • sources: input sources
      • mappingFn: optional mappingFn applied to an array of emited values, copy by default, should return a Vector

      Note: collectLatest completes immediately if sources are empty.

      Optional arguments

      • ::Type{T}: optional type of emmiting values of inner observables
      • ::Type{R}: optional return type after applying mappingFn to a vector of values

      Examples

      using Rocket
      +
      +collected = collectLatest([ of(1), from([ 1, 2 ]) ])
      +
      +subscribe!(collected, logger())
      +;
      +
      +# output
      +
      +[LogActor] Data: [1, 1]
      +[LogActor] Data: [1, 2]
      +[LogActor] Completed

      See also: Subscribable, subscribe!, combineLatest

      source

      Description

      collectLatest collects the values from all Observables in its vector argument. This is done by subscribing to each Observable in order and, whenever an Observable emits, collecting a vector of the most recent values from each Observable (in order). If you pass n Observables to collectLatest, the returned Observable will always emit an ordered vector of n values.

      To ensure that the output vector has a consistent length, collectLatest waits for all input Observables to emit at least once before it starts emitting results. This means that if some Observable emits values before other Observables started emitting, all these values but the last will be lost. On the other hand, if some Observable does not emit a value but completes, the resulting Observable will complete simultaneously without emitting anything. Furthermore, if some input Observable does not emit any value and never completes, collectLatest will also never emit and never complete.

      If at least one Observable was passed to collectLatest and all passed Observables emitted, then the resulting Observable will complete when all combined streams complete. So even if some Observable completes, the result of collectLatest will still emit values when the other Observables do. In case of a completed Observable, its value will now remain to be the last emitted value. On the other hand, if any Observable errors, collectLatest will also immediately error.

      diff --git a/v1.7.4/observables/types/combined/index.html b/v1.7.4/observables/types/combined/index.html new file mode 100644 index 000000000..5f156bcd6 --- /dev/null +++ b/v1.7.4/observables/types/combined/index.html @@ -0,0 +1,26 @@ + +Combined · Rocket.jl

      Combined Observable

      Rocket.combineLatestFunction
      combineLatest(sources...; strategy = PushEach())
      +combineLatest(sources::S, strategy::G = PushEach()) where { S <: Tuple, U }

      Combines multiple Observables to create an Observable whose values are calculated from the latest values of each of its input Observables. Accept optimal update strategy object.

      Arguments

      • sources: input sources
      • strategy: optional update strategy for batching new values together

      Note: combineLatest() completes immediately if sources are empty.

      Examples

      using Rocket
      +
      +latest = combineLatest(of(1), from(2:5))
      +
      +subscribe!(latest, logger())
      +;
      +
      +# output
      +
      +[LogActor] Data: (1, 2)
      +[LogActor] Data: (1, 3)
      +[LogActor] Data: (1, 4)
      +[LogActor] Data: (1, 5)
      +[LogActor] Completed
      using Rocket
      +
      +latest = combineLatest(of(1) |> async(0), from(2:5) |> async(0), strategy = PushNew())
      +
      +subscribe!(latest, logger())
      +;
      +
      +# output
      +
      +[LogActor] Data: (1, 2)
      +[LogActor] Completed

      See also: Subscribable, subscribe!, PushEach, PushEachBut, PushNew, PushNewBut, PushStrategy

      source

      Description

      combineLatest combines the values from all Observables in its arguments. This is done by subscribing to each Observable in order and, whenever an Observable emits, collecting a tuple of the most recent values from each Observable (in order). If you pass n Observables to combineLatest, the returned Observable will always emit an ordered tuple of n values.

      To ensure that the output tuple has a consistent length, combineLatest waits for all input Observables to emit at least once before it starts emitting results. This means that if some Observable emits values before other Observables started emitting, all these values but the last will be lost. On the other hand, if some Observable does not emit a value but completes, the resulting Observable will complete simultaneously without emitting anything. Furthermore, if some input Observable does not emit any value and never completes, combineLatest will also never emit and never complete.

      If at least one Observable was passed to combineLatest and all passed Observables emitted, then the resulting Observable will complete when all combined streams complete. So even if some Observable completes, the result of combineLatest will still emit values when the other Observables do. In case of a completed Observable, its value will now remain to be the last emitted value. On the other hand, if any Observable errors, combineLatest will also immediately error.

      It is possible to change default update/complete strategy behaviour with an optional strategy object.

      diff --git a/v1.7.4/observables/types/combined_updates/index.html b/v1.7.4/observables/types/combined_updates/index.html new file mode 100644 index 000000000..0483bd173 --- /dev/null +++ b/v1.7.4/observables/types/combined_updates/index.html @@ -0,0 +1,3 @@ + +Combined Updates · Rocket.jl

      CombinedUpdates Observable

      Rocket.combineLatestUpdatesFunction
      combineLatestUpdates(sources...; strategy = PushEach())
      +combineLatestUpdates(sources::S, strategy::G = PushEach()) where { S <: Tuple, U }

      combineLatestUpdates is a more effiecient version of combineLatest(sources) + map_to(sources) operators chain.

      Arguments

      • sources: input sources
      • strategy: optional update strategy for batching new values together

      Note: combineLatestUpdates() completes immediately if sources are empty.

      See also: Subscribable, subscribe!, PushEach, PushEachBut, PushNew, PushNewBut, PushStrategy

      source
      diff --git a/v1.7.4/observables/types/completed/index.html b/v1.7.4/observables/types/completed/index.html new file mode 100644 index 000000000..dbed22dc6 --- /dev/null +++ b/v1.7.4/observables/types/completed/index.html @@ -0,0 +1,11 @@ + +Completed · Rocket.jl

      Completed Observable

      Rocket.completedFunction
      completed(::Type{T} = Any; scheduler::H = AsapScheduler()) where { T, H <: AbstractScheduler }

      Creation operator for the CompletedObservable that emits no items to the Actor and immediately sends a complete notification on subscription.

      Arguments

      • T: type of output data source, optional, Any is the default
      • scheduler: optional, scheduler-like object

      Examples

      using Rocket
      +
      +source = completed(Int)
      +subscribe!(source, logger())
      +;
      +
      +# output
      +
      +[LogActor] Completed
      +

      See also: CompletedObservable, subscribe!, logger

      source
      Rocket.CompletedObservableType
      CompletedObservable{D, H}(scheduler::H)

      Observable that emits no items to the Actor and just sends a complete notification on subscription.

      Constructor arguments

      • scheduler: Scheduler-like object

      See also: Subscribable, completed

      source
      diff --git a/v1.7.4/observables/types/concat/index.html b/v1.7.4/observables/types/concat/index.html new file mode 100644 index 000000000..80dd42e1e --- /dev/null +++ b/v1.7.4/observables/types/concat/index.html @@ -0,0 +1,25 @@ + +Concat · Rocket.jl

      Concat Observable

      Rocket.concatFunction
      concat(sources...)
      +concat(sources::S) where { S <: Tuple }

      Combines multiple Observables to create an Observable which sequentially emits all values from given Observable and then moves on to the next. All values of each passed Observable merged into a single Observable, in order, in serial fashion.

      Arguments

      • sources: input sources

      Examples

      using Rocket
      +
      +source1 = of(1)
      +source2 = of(2)
      +
      +subscribe!(concat(source1, source2), logger())
      +;
      +
      +# output
      +[LogActor] Data: 1
      +[LogActor] Data: 2
      +[LogActor] Completed
      using Rocket
      +
      +source1 = of(1) |> async()
      +source2 = of(2)
      +
      +subscribe!(concat(source1, source2), logger())
      +;
      +
      +# output
      +[LogActor] Data: 1
      +[LogActor] Data: 2
      +[LogActor] Completed

      See also: Subscribable, subscribe!

      source
      diff --git a/v1.7.4/observables/types/connectable/index.html b/v1.7.4/observables/types/connectable/index.html new file mode 100644 index 000000000..b286f4832 --- /dev/null +++ b/v1.7.4/observables/types/connectable/index.html @@ -0,0 +1,17 @@ + +Connectable · Rocket.jl

      Connectable Observable

      Rocket.connectableFunction
      connectable(subject::J, source::S) where J where S

      Creates a ConnectableObservable with a given subject object and a source observable.

      Example

      using Rocket
      +
      +c = connectable(Subject(Int; scheduler = AsapScheduler()), from(1:3))
      +
      +subscribe!(c, logger());
      +
      +connect(c);
      +;
      +
      +# output
      +
      +[LogActor] Data: 1
      +[LogActor] Data: 2
      +[LogActor] Data: 3
      +[LogActor] Completed
      +

      See also: ConnectableObservable, connect, subscribe!

      source
      Rocket.connectFunction
      connect(connectable::ConnectableObservable)

      When connect is called, the subject passed to the multicast operator is subscribed to the source and the subject’s observers receive the multicast notifications, which fits our basic mental model of stream multicasting. Returns a subscription.

      See also: connectable, ConnectableObservable

      source
      Rocket.ConnectableObservableType
      ConnectableObservable{D}(subject, source)

      A connectable observable encapsulates the multicasting infrastructure with provided subject, but does not immediately subscribe to the source. It subscribes to the source when its connect method is called.

      See also: connect, Subscribable

      source
      diff --git a/v1.7.4/observables/types/defer/index.html b/v1.7.4/observables/types/defer/index.html new file mode 100644 index 000000000..2a8758cdb --- /dev/null +++ b/v1.7.4/observables/types/defer/index.html @@ -0,0 +1,13 @@ + +Defer · Rocket.jl

      Defer Observable

      Rocket.deferFunction
      defer(::Type{D}, factoryFn::F) where { D, F <: Function }

      Creates an Observable that, on subscribe, calls an Observable factory to make an Observable for each new Observer.

      Arguments

      • T: type of output data source, created by the factoryFn
      • factoryFn: the Observable factory function to invoke for each Observer that subscribes to the output Observable

      Examples

      using Rocket
      +
      +source = defer(Int, () -> from([ 1, 2, 3 ]))
      +
      +subscribe!(source, logger())
      +;
      +
      +# output
      +[LogActor] Data: 1
      +[LogActor] Data: 2
      +[LogActor] Data: 3
      +[LogActor] Completed

      See also: Subscribable, subscribe!, logger

      source

      Description

      defer allows you to create the Observable only when the Actor subscribes, and create a fresh Observable for each Actor. It waits until an Actor subscribes to it, and then it generates an Observable, typically with an Observable factory function. It does this afresh for each subscriber, so although each subscriber may think it is subscribing to the same Observable, in fact each subscriber gets its own individual Observable.

      diff --git a/v1.7.4/observables/types/faulted/index.html b/v1.7.4/observables/types/faulted/index.html new file mode 100644 index 000000000..874c80118 --- /dev/null +++ b/v1.7.4/observables/types/faulted/index.html @@ -0,0 +1,12 @@ + +Faulted · Rocket.jl

      Faulted Observable

      Rocket.faultedFunction
      faulted(err; scheduler::H = AsapScheduler())            where { H <: AbstractScheduler }
      +faulted(::Type{T}, err; scheduler::H = AsapScheduler()) where { T, H <: AbstractScheduler }

      Creation operator for the FaultedObservable that emits no items to the Actor and immediately sends an error notification.

      Arguments

      • err: the particular Error to pass to the error notification.
      • T: type of output data source, optional, Any by default
      • scheduler: optional, scheduler-like object

      Examples

      using Rocket
      +
      +source = faulted("Error!")
      +subscribe!(source, logger())
      +;
      +
      +# output
      +
      +[LogActor] Error: Error!
      +

      See also: FaultedObservable, subscribe!

      source
      Rocket.FaultedObservableType
      FaultedObservable{D, H}(err, scheduler::H)

      Observable that emits no items to the Actor and just sends an error notification on subscription.

      Constructor arguments

      • err: error to emit on subscription
      • scheduler: scheduler-like object

      See also: faulted

      source
      diff --git a/v1.7.4/observables/types/file/index.html b/v1.7.4/observables/types/file/index.html new file mode 100644 index 000000000..e323833f6 --- /dev/null +++ b/v1.7.4/observables/types/file/index.html @@ -0,0 +1,2 @@ + +File · Rocket.jl
      diff --git a/v1.7.4/observables/types/function/index.html b/v1.7.4/observables/types/function/index.html new file mode 100644 index 000000000..5144c4e77 --- /dev/null +++ b/v1.7.4/observables/types/function/index.html @@ -0,0 +1,33 @@ + +Function · Rocket.jl

      Function Observable

      Rocket.makeFunction
      make(f::Function, type::Type{D})

      Creation operator for the FunctionObservable.

      Arguments

      • f: function to be invoked on subscription
      • type: type of data in observable

      Examples

      using Rocket
      +
      +source = make(Int) do actor
      +    next!(actor, 0)
      +    complete!(actor)
      +end
      +
      +subscription = subscribe!(source, logger());
      +unsubscribe!(subscription)
      +;
      +
      +# output
      +
      +[LogActor] Data: 0
      +[LogActor] Completed
      +
      using Rocket
      +
      +source = make(Int) do actor
      +    next!(actor, 0)
      +    setTimeout(100) do
      +        next!(actor, 1)
      +        complete!(actor)
      +    end
      +end
      +
      +subscription = subscribe!(source, logger())
      +unsubscribe!(subscription)
      +;
      +
      +# output
      +
      +[LogActor] Data: 0

      See also: FunctionObservable, subscribe!, logger

      source
      Rocket.FunctionObservableType
      FunctionObservable{D}(f::F)

      FunctionObservable wraps a callback f, which is called when the Observable is initially subscribed to. This function is given an Actor, to which new values can be nexted (with next!(actor, data)), or an error! method can be called to raise an error, or complete! can be called to notify of a successful completion.

      Arguments

      • f::F: function to be invoked on subscription

      See also: Subscribable, make

      source
      diff --git a/v1.7.4/observables/types/generate/index.html b/v1.7.4/observables/types/generate/index.html new file mode 100644 index 000000000..fc3b4d984 --- /dev/null +++ b/v1.7.4/observables/types/generate/index.html @@ -0,0 +1,11 @@ + +Generate · Rocket.jl

      Generate Observable

      Rocket.generateFunction
      generate(initial::D, condition::C, iterator::I; scheduler::H = AsapScheduler()) where { D, C, I, H <: AbstractScheduler }

      Generates an observable sequence by running a state-driven loop producing the sequence's elements, using the specified scheduler to send out observer messages.

      Arguments

      • initial: initial state
      • condition: condition to terminate generation (upon returning false)
      • iterator: iteration step function
      • scheduler: optional, scheduler-like object

      Note

      iterator object should return objects of the same type as initial.

      Examples

      using Rocket
      +
      +source = generate(1, x -> x < 3, x -> x + 1)
      +subscribe!(source, logger())
      +;
      +
      +# output
      +[LogActor] Data: 1
      +[LogActor] Data: 2
      +[LogActor] Completed

      See also: ScheduledSubscribable, subscribe!

      source
      diff --git a/v1.7.4/observables/types/interval/index.html b/v1.7.4/observables/types/interval/index.html new file mode 100644 index 000000000..739ee6ed2 --- /dev/null +++ b/v1.7.4/observables/types/interval/index.html @@ -0,0 +1,25 @@ + +Interval · Rocket.jl

      Interval Observable

      Rocket.intervalFunction
      interval(period::Union{Int, Nothing} = nothing)

      Creation operator for the TimerObservable. interval returns an Observable that emits an infinite sequence of ascending integers, with a constant interval of time of your choosing between those emissions. The first emission is not sent immediately, but only after the first period has passed.

      Arguments

      • interval: the interval size in milliseconds

      Examples

      using Rocket
      +
      +source = interval(50)
      +
      +subscription = subscribe!(source, logger())
      +sleep(0.215)
      +unsubscribe!(subscription)
      +sleep(0.215)
      +subscription = subscribe!(source, logger())
      +sleep(0.185)
      +unsubscribe!(subscription)
      +
      +close(source)
      +;
      +
      +# output
      +
      +[LogActor] Data: 0
      +[LogActor] Data: 1
      +[LogActor] Data: 2
      +[LogActor] Data: 3
      +[LogActor] Data: 8
      +[LogActor] Data: 9
      +[LogActor] Data: 10

      See also: timer, TimerObservable, Subscribable

      source
      diff --git a/v1.7.4/observables/types/iterable/index.html b/v1.7.4/observables/types/iterable/index.html new file mode 100644 index 000000000..7d37c95db --- /dev/null +++ b/v1.7.4/observables/types/iterable/index.html @@ -0,0 +1,26 @@ + +Iterable · Rocket.jl

      Iterable Observable

      Rocket.iterableFunction
      iterable(iterator; scheduler::H = AsapScheduler()) where { H <: AbstractScheduler }

      Creation operator for the IterableObservable that wraps given iterator into an observable object.

      Arguments

      • iterator: an iterator object to be wrapped an observable
      • scheduler: optional, scheduler-like object

      Note

      iterable operators does not create a copy of iterator. Any changes in the iterator object might be visible in the created observable. For side-effects free behavior consider using from creation operator which creates a copy of a given object with a collect function.

      Examples

      using Rocket
      +
      +source = iterable([ 0, 1, 2 ])
      +subscribe!(source, logger())
      +;
      +
      +# output
      +
      +[LogActor] Data: 0
      +[LogActor] Data: 1
      +[LogActor] Data: 2
      +[LogActor] Completed
      using Rocket
      +
      +source = iterable("Hello")
      +subscribe!(source, logger())
      +;
      +
      +# output
      +
      +[LogActor] Data: H
      +[LogActor] Data: e
      +[LogActor] Data: l
      +[LogActor] Data: l
      +[LogActor] Data: o
      +[LogActor] Completed

      See also: ScheduledSubscribable, subscribe!, from

      source
      diff --git a/v1.7.4/observables/types/labeled/index.html b/v1.7.4/observables/types/labeled/index.html new file mode 100644 index 000000000..eea52a72c --- /dev/null +++ b/v1.7.4/observables/types/labeled/index.html @@ -0,0 +1,13 @@ + +Labeled · Rocket.jl

      Labeled Observable

      Rocket.labeledFunction
      labeled(names::Val, stream)

      Creation operator for the LabeledObservable that wraps given stream, that produces Tuple values into a NamedTuple with given names.

      Arguments

      • names: a Val object that contains a tuple of symbols
      • stream: an observable that emits a Tuple, length of the Tuple events must be equal to the length of the names argument

      Examples

      using Rocket
      +
      +source = labeled(Val((:x, :y)), from([ (1, 2), (2, 3), (3, 4) ]))
      +subscribe!(source, logger())
      +;
      +
      +# output
      +
      +[LogActor] Data: (x = 1, y = 2)
      +[LogActor] Data: (x = 2, y = 3)
      +[LogActor] Data: (x = 3, y = 4)
      +[LogActor] Completed

      See also: ScheduledSubscribable, subscribe!, from

      source
      diff --git a/v1.7.4/observables/types/merged/index.html b/v1.7.4/observables/types/merged/index.html new file mode 100644 index 000000000..8b337fea1 --- /dev/null +++ b/v1.7.4/observables/types/merged/index.html @@ -0,0 +1,46 @@ + +Merged · Rocket.jl

      Merged Observable

      Rocket.mergedFunction
      merged(sources::T) where { T <: Tuple }

      Creation operator for the MergeObservable with a given sources collected in a tuple. merge subscribes to each given input Observable (as arguments), and simply forwards (without doing any transformation) all the values from all the input Observables to the output Observable. The output Observable only completes once all input Observables have completed. Any error delivered by an input Observable will be immediately emitted on the output Observable.

      Examples

      using Rocket
      +
      +observable = merged((from(1:4), of(2.0), from("Hello")))
      +
      +subscribe!(observable, logger())
      +;
      +
      +# output
      +[LogActor] Data: 1
      +[LogActor] Data: 2
      +[LogActor] Data: 3
      +[LogActor] Data: 4
      +[LogActor] Data: 2.0
      +[LogActor] Data: H
      +[LogActor] Data: e
      +[LogActor] Data: l
      +[LogActor] Data: l
      +[LogActor] Data: o
      +[LogActor] Completed
      using Rocket
      +
      +subject = Subject(Int, scheduler = AsyncScheduler())
      +
      +observable = merged((subject, of(2.0), from("Hello")))
      +
      +actor = sync(logger())
      +
      +subscribe!(observable, actor)
      +
      +setTimeout(200) do
      +    next!(subject, 1)
      +    complete!(subject)
      +end
      +
      +wait(actor)
      +;
      +
      +# output
      +[LogActor] Data: 2.0
      +[LogActor] Data: H
      +[LogActor] Data: e
      +[LogActor] Data: l
      +[LogActor] Data: l
      +[LogActor] Data: o
      +[LogActor] Data: 1
      +[LogActor] Completed

      See also: Subscribable

      source
      diff --git a/v1.7.4/observables/types/network/index.html b/v1.7.4/observables/types/network/index.html new file mode 100644 index 000000000..001ea29b4 --- /dev/null +++ b/v1.7.4/observables/types/network/index.html @@ -0,0 +1,6 @@ + +Network · Rocket.jl

      Network Observable

      Rocket.networkFunction
      network(::Type{D}, port::Int)             where D
      +network(::Type{D}, address::A, port::Int) where { D, A <: IPAddr }
      +
      +network(::Type{Vector{D}}, port::Int, buffer_size::Int)             where D
      +network(::Type{Vector{D}}, address::A, port::Int, buffer_size::Int) where { D, A <: IPAddr }

      Creation operator for the NetworkObservable that emits messages from the server with specified address and port arguments.

      See also: NetworkObservable, subscribe!

      source
      diff --git a/v1.7.4/observables/types/never/index.html b/v1.7.4/observables/types/never/index.html new file mode 100644 index 000000000..4be649187 --- /dev/null +++ b/v1.7.4/observables/types/never/index.html @@ -0,0 +1,9 @@ + +Never · Rocket.jl

      Never Observable

      Rocket.neverFunction
      never(T = Any)

      Creation operator for the NeverObservable that emits neither values nor errors nor the completion notification. It can be used for testing purposes or for composing with other Observables. Please note that by never emitting a complete notification, this Observable keeps the subscription from being disposed automatically. Subscriptions need to be manually disposed.

      Arguments

      • T: Type of Observable data, optional, Any is the default

      Examples

      using Rocket
      +
      +source = never()
      +subscribe!(source, logger())
      +;
      +
      +# output
      +

      See also: NeverObservable, subscribe!, logger

      source
      diff --git a/v1.7.4/observables/types/proxy/index.html b/v1.7.4/observables/types/proxy/index.html new file mode 100644 index 000000000..23e82144f --- /dev/null +++ b/v1.7.4/observables/types/proxy/index.html @@ -0,0 +1,30 @@ + +Proxy · Rocket.jl

      Proxy Observable

      ProxyObservable might help to create a custom operator. It wraps either source and/or actor with their proxied versions providing additional custom logic for on_subscribe! and/or for on_next!, on_error!, on_complete! methods.

      Rocket.proxyFunction
      proxy(::Type{L}, source, proxy) where L

      Creation operator for the ProxyObservable with a given source and proxy objects.

      Example

      using Rocket
      +
      +source = from(1:5)
      +
      +struct MyCustomProxy <: ActorProxy end
      +
      +struct MyCustomActor{A} <: Actor{Int}
      +    actor :: A
      +end
      +
      +Rocket.on_next!(actor::MyCustomActor, data::Int) = next!(actor.actor, data ^ 2)
      +Rocket.on_error!(actor::MyCustomActor, err)      = error!(actor.actor, err)
      +Rocket.on_complete!(actor::MyCustomActor)        = complete!(actor.actor)
      +
      +Rocket.actor_proxy!(::Type{Int}, proxy::MyCustomProxy, actor::A) where A = MyCustomActor{A}(actor)
      +
      +proxied = proxy(Int, source, MyCustomProxy())
      +
      +subscribe!(proxied, logger())
      +;
      +
      +# output
      +
      +[LogActor] Data: 1
      +[LogActor] Data: 4
      +[LogActor] Data: 9
      +[LogActor] Data: 16
      +[LogActor] Data: 25
      +[LogActor] Completed

      See also: ProxyObservable, ActorProxy, SourceProxy, ActorSourceProxy

      source
      Rocket.ActorProxyType
      ActorProxy

      Can be used as a super type for common proxy object. Automatically specifies ValidActorProxy trait behavior. Each ActorProxy must implement its own method for actor_proxy!(::Type, proxy, actor) function which have to return a valid actor object.

      See also: proxy, actor_proxy!

      source
      Rocket.SourceProxyType
      SourceProxy

      Can be used as a super type for common proxy object. Automatically specifies ValidSourceProxy trait behavior. Each SourceProxy must implement its own method for source_proxy!(::Type, proxy, source) function which have to return a valid subscribable object.

      See also: proxy, source_proxy!

      source
      Rocket.ActorSourceProxyType
      ActorSourceProxy

      Can be used as a super type for common proxy object. Automatically specifies ValidActorSourceProxy trait behavior. Each ActorSourceProxy must implement its own method for source_proxy!(::Type, proxy, source) function which have to return a valid subscribable object and also for actor_proxy!(::Type, proxy, actor) function which have to return a valid actor object..

      See also: proxy, actor_proxy!, source_proxy!

      source
      Rocket.actor_proxy!Function
      actor_proxy!(::Type, proxy, actor)

      This is function is used to wrap an actor with its proxied version given a particular proxy object. Must return another actor. Each valid ActorProxy and ActorSourceProxy must implement its own method for actor_proxy! function. The first argument is the same as the type of data of the connected proxy observable.

      See also: proxy, ActorProxy, ActorSourceProxy

      source
      Rocket.source_proxy!Function
      source_proxy!(::Type, proxy, source)

      This is function is used to wrap a source with its proxied version given a particular proxy object. Must return another Observable. Each valid SourceProxy and ActorSourceProxy must implement its own method for source_proxy! function. The first argument is the same as the type of data of the connected proxy observable.

      See also: proxy, SourceProxy, ActorSourceProxy

      source
      diff --git a/v1.7.4/observables/types/race/index.html b/v1.7.4/observables/types/race/index.html new file mode 100644 index 000000000..1f02b414b --- /dev/null +++ b/v1.7.4/observables/types/race/index.html @@ -0,0 +1,23 @@ + +Race · Rocket.jl

      Race Observable

      Rocket.raceFunction
      race(sources...)
      +race(sources::S) where { S <: Tuple }

      Combines multiple Observables to create an Observable that mirrors the output of the first Observable to emit an item. Essentially it subscribes to the observable that was the first to start emitting.

      Arguments

      • sources: input sources

      Examples

      using Rocket
      +
      +source1 = of(1)
      +source2 = of(2)
      +
      +subscribe!(race(source1, source2), logger())
      +;
      +
      +# output
      +[LogActor] Data: 1
      +[LogActor] Completed
      using Rocket
      +
      +source1 = of(1) |> async()
      +source2 = of(2)
      +
      +subscribe!(race(source1, source2), logger())
      +;
      +
      +# output
      +[LogActor] Data: 2
      +[LogActor] Completed

      See also: Subscribable, subscribe!

      source
      diff --git a/v1.7.4/observables/types/single/index.html b/v1.7.4/observables/types/single/index.html new file mode 100644 index 000000000..78e7efdd7 --- /dev/null +++ b/v1.7.4/observables/types/single/index.html @@ -0,0 +1,12 @@ + +Single · Rocket.jl

      Single Observable

      Rocket.ofFunction
      of(x; scheduler::H = AsapScheduler()) where { H <: AbstractScheduler }

      Creation operator for the SingleObservable that emits a single value x and then completes.

      Arguments

      • x: value to be emmited before completion

      Examples

      using Rocket
      +
      +source = of(1)
      +subscribe!(source, logger())
      +;
      +
      +# output
      +
      +[LogActor] Data: 1
      +[LogActor] Completed
      +

      See also: SingleObservable, subscribe!, logger

      source
      Rocket.SingleObservableType
      SingleObservable{D, H}(value::D, scheduler::H)

      SingleObservable wraps single value of type D into a observable.

      Constructor arguments

      • value: a single value to emit
      • scheduler: scheduler-like object

      See also: of, Subscribable

      source
      diff --git a/v1.7.4/observables/types/timer/index.html b/v1.7.4/observables/types/timer/index.html new file mode 100644 index 000000000..fbd61b57b --- /dev/null +++ b/v1.7.4/observables/types/timer/index.html @@ -0,0 +1,18 @@ + +Timer · Rocket.jl

      Timer Observable

      Rocket.timerFunction
      timer(delay::Int)
      +timer(delay::Int, period::Int)

      Creation operator for the TimerObservable. Its like interval(@ref), but you can specify when should the emissions start. timer returns an Observable that emits an infinite sequence of ascending integers, with a constant interval of time, period of your choosing between those emissions. The first emission happens after the specified delay. If period is not specified, the output Observable emits only one value, 0. Otherwise, it emits an infinite sequence. The timer closes automatically when the unsubscription happens.

      Arguments

      • delay: the initial delay time specified as an integer denoting milliseconds to wait before emitting the first value of 0.
      • period: the minimum period of time between emissions of the subsequent numbers (in milliseconds).

      Examples

      using Rocket
      +
      +source = timer(0, 50)
      +
      +sleep(0.075)
      +subscription = subscribe!(source, logger())
      +sleep(0.105)
      +unsubscribe!(subscription)
      +
      +;
      +
      +# output
      +
      +[LogActor] Data: 2
      +[LogActor] Data: 3
      +

      See also: interval, TimerObservable, subscribe!, logger

      source
      Rocket.TimerObservableType
      TimerObservable

      An Observable that starts emitting after an delay and emits ever increasing numbers after each period of time thereafter.

      Parameters

      • delay: The initial delay time specified as an integer denoting milliseconds to wait before emitting the first value of 0`.
      • period: The minimum period of time in milliseconds between emissions of the subsequent numbers.

      See also: timer, Subscribable

      source
      diff --git a/v1.7.4/observables/types/zipped/index.html b/v1.7.4/observables/types/zipped/index.html new file mode 100644 index 000000000..ff198f3af --- /dev/null +++ b/v1.7.4/observables/types/zipped/index.html @@ -0,0 +1,33 @@ + +Zipped · Rocket.jl

      Zipped Observable

      Rocket.zippedFunction
      zipped(sources...)

      Combines multiple Observables to create an Observable whose values are calculated from the values, in order, of each of its input Observables.

      Arguments

      • sources: input sources

      Examples

      using Rocket
      +
      +source = zipped(of(1), from(2:5))
      +
      +subscribe!(source, logger())
      +;
      +
      +# output
      +
      +[LogActor] Data: (1, 2)
      +[LogActor] Completed
      using Rocket
      +
      +source = zipped(from(1:3), from(1:5))
      +
      +subscribe!(source, logger())
      +;
      +
      +# output
      +
      +[LogActor] Data: (1, 1)
      +[LogActor] Data: (2, 2)
      +[LogActor] Data: (3, 3)
      +[LogActor] Completed
      using Rocket
      +
      +source = zipped(completed(), of(0.0))
      +
      +subscribe!(source, logger())
      +;
      +
      +# output
      +
      +[LogActor] Completed

      See also: Subscribable, subscribe!

      source
      diff --git a/v1.7.4/operators/about/index.html b/v1.7.4/operators/about/index.html new file mode 100644 index 000000000..9162b5159 --- /dev/null +++ b/v1.7.4/operators/about/index.html @@ -0,0 +1,58 @@ + +Operator · Rocket.jl

      Operators

      Even though the Observable is the foundation, reactive extensions are mostly useful because of their operators. Operators are the essential pieces that allow complex asynchronous code to be easily composed in a declarative manner.

      What are operators?

      There are two kinds of operators:

      Pipeable operators

      Pipeable Operators are the kind that can be piped to Observables using the syntax source |> operator(). These include the filter() and map() operators. When called, operators do not change the existing Observable instance. Instead, they return a new Observable, whose subscription logic is based on the first Observable.

      Note

      A Pipeable Operator is a function that takes an Observable as its input and returns another Observable. It is a pure operation: the previous Observable remains unmodified.

      A Pipeable Operator is essentially a pure callable object that accepts one Observable as input and returns another Observable as output. Subscribing to the output Observable will also subscribe to the input Observable.

      For example, the operator called map() is analogous to the Array method of the same name. Just like the array method map((d) -> d ^ 2, [ 1, 2, 3 ]) yields [ 1, 4, 9 ], the Observable emits 1, 4, 9:

      source = from([ 1, 2, 3 ])
      +subscribe!(source |> map(Int, (d) -> d ^ 2), lambda(
      +    on_next = (d) -> println(d)
      +))
      +
      +// Logs:
      +// 1
      +// 4
      +// 9

      Another useful operator is first():

      source = from([ 1, 2, 3 ])
      +subscribe!(source |> first(), lambda(
      +    on_next     = (d) -> println(d),
      +    on_complete = ()  -> "Completed"
      +))
      +
      +// Logs:
      +// 1
      +// Completed

      Creation operators

      Distinct from pipeable operators, creation operators are functions that can be used to create an Observable with some common predefined behavior or by joining other Observables. For example: from([ 1, 2, 3 ]) creates an observable that will sequentially emit 1, 2, and 3.

      source = from([ 1, 2, 3 ])
      +subscribe!(source, lambda(
      +    on_next     = (d) -> println("Value: $d"),
      +    on_error    = (e) -> println("Oh no, error: $e")
      +    on_complete = ()  -> println("Completed")
      +))
      +
      +// Logs:
      +// Value: 1
      +// Value: 2
      +// Value: 3
      +// Completed

      Operators piping

      Pipeable operators are special objects that can be used like ordinary functions with on_call!(operator, source). In practice however they tend to accumulate and quickly grow unreadable: on_call!(operator1, on_call!(operator2, on_call!(operator3, source))). Therefore, Rocket.jl overloads |> for operators and Observables:

      using Rocket
      +
      +source = from(1:100) |> filter((d) -> d % 2 === 0) |> map(Int, (d) -> d ^ 2) |> sum()
      +
      +subscribe!(source, logger())
      +
      +// Logs
      +// [LogActor] Data: 171700
      +// [LogActor] Completed

      It is also possible to create an operator composition with + or |>. It might be useful to create an alias for some often used operator chain

      using Rocket
      +
      +mapAndFilter = map(Int, d -> d ^ 2) + filter(d -> d % 2 == 0) 
      +
      +source = from(1:5) |> mapAndFilter
      +
      +subscribe!(source, logger())
      +
      +// Logs
      +// [LogActor] Data: 4
      +// [LogActor] Data: 16
      +// [LogActor] Completed
      +
      +mapAndFilterAndSum = mapAndFilter + sum()
      +
      +source = from(1:5) |> mapAndFilterAndSum
      +
      +subscribe!(source, logger())
      +
      +// Logs
      +// [LogActor] Data: 20
      +// [LogActor] Completed

      For stylistic reasons, on_call!(operator, source) is never used in practice - even if there is only one operator. Instead, source |> operator() is generally preferred.

      diff --git a/v1.7.4/operators/all/index.html b/v1.7.4/operators/all/index.html new file mode 100644 index 000000000..43e30310d --- /dev/null +++ b/v1.7.4/operators/all/index.html @@ -0,0 +1,2 @@ + +All · Rocket.jl
      diff --git a/v1.7.4/operators/creation/about/index.html b/v1.7.4/operators/creation/about/index.html new file mode 100644 index 000000000..9b34ac0dc --- /dev/null +++ b/v1.7.4/operators/creation/about/index.html @@ -0,0 +1,2 @@ + +Creation · Rocket.jl
      diff --git a/v1.7.4/operators/errors/about/index.html b/v1.7.4/operators/errors/about/index.html new file mode 100644 index 000000000..6ba736bbc --- /dev/null +++ b/v1.7.4/operators/errors/about/index.html @@ -0,0 +1,2 @@ + +About error handling operators · Rocket.jl
      diff --git a/v1.7.4/operators/errors/catch_error/index.html b/v1.7.4/operators/errors/catch_error/index.html new file mode 100644 index 000000000..9e0b8a9a4 --- /dev/null +++ b/v1.7.4/operators/errors/catch_error/index.html @@ -0,0 +1,14 @@ + +catch_error · Rocket.jl

      Catch Error Operator

      Rocket.catch_errorFunction
      catch_error(selectorFn::F) where F

      Creates a CatchErrorOperator, which catches errors on the observable to be handled by returning a new observable or throwing an error.

      Arguments:

      • selectorFn::F: a callable object that takes as arguments err, which is the error, and caught, which is the source observable, in case you'd like to "retry" that observable by returning it again. Whatever observable is returned by the selector will be used to continue the observable chain.

      Producing

      Stream of type <: Subscribable{L} where L refers to type of source stream

      Examples

      using Rocket
      +
      +source = from(1:5) |> safe() |> map(Int, (d) -> d == 4 ? error(4) : d) |> catch_error((err, obs) -> of(1))
      +
      +subscribe!(source, logger())
      +;
      +
      +# output
      +[LogActor] Data: 1
      +[LogActor] Data: 2
      +[LogActor] Data: 3
      +[LogActor] Data: 1
      +[LogActor] Completed

      See also: AbstractOperator, InferableOperator, rerun, logger, safe

      source

      See also

      Operators

      diff --git a/v1.7.4/operators/errors/error_if/index.html b/v1.7.4/operators/errors/error_if/index.html new file mode 100644 index 000000000..31b3b90e7 --- /dev/null +++ b/v1.7.4/operators/errors/error_if/index.html @@ -0,0 +1,16 @@ + +error_if · Rocket.jl

      Error If Operator

      Rocket.error_ifFunction
      error_if(checkFn, errorFn)

      Creates an error_if operator, which performs a check for every emission on the source Observable with checkFn. If checkFn returns true, the operator sends an error event and unsubscribes from the observable.

      Arguments

      • checkFn: check function with (data) -> Bool signature
      • errorFn: error object generating function with (data) -> Any signature, optional

      Producing

      Stream of type <: Subscribable{L} where L refers to type of source stream

      Examples

      using Rocket
      +
      +source = from([1, 2, 3]) |> error_if((data) -> data > 2, (data) -> "CustomError")
      +
      +subscription = subscribe!(source, lambda(
      +    on_next  = (d) -> println("Next: ", d),
      +    on_error = (e) -> println("Error: ", e),
      +    on_complete = () -> println("Completed")
      +))
      +;
      +
      +# output
      +Next: 1
      +Next: 2
      +Error: CustomError

      See also: error_if_not, error_if_empty, default_if_empty, lambda

      source

      See also

      Operators

      diff --git a/v1.7.4/operators/errors/error_if_not/index.html b/v1.7.4/operators/errors/error_if_not/index.html new file mode 100644 index 000000000..b3123d22a --- /dev/null +++ b/v1.7.4/operators/errors/error_if_not/index.html @@ -0,0 +1,15 @@ + +error_if_not · Rocket.jl

      Error If Not Operator

      Note: error_if_not is an alias for error_if operator with inverted checkFn.

      Rocket.error_if_notFunction
      error_if_not(checkFn, errorFn)

      Creates an error_if_not operator, which performs a check for every emission on the source Observable with checkFn. If checkFn returns false, the operator sends an error event and unsubscribes from the observable.

      Note: error_if_not is an alias for error_if operator with inverted checkFn.

      Arguments

      • checkFn: check function with (data) -> Bool signature
      • errorFn: error object generating function with (data) -> Any signature, optional

      Producing

      Stream of type <: Subscribable{L} where L refers to type of source stream

      Examples

      using Rocket
      +
      +source = from([1, 2, 3]) |> error_if_not((data) -> data < 2, (data) -> "CustomError")
      +
      +subscription = subscribe!(source, lambda(
      +    on_next  = (d) -> println("Next: ", d),
      +    on_error = (e) -> println("Error: ", e),
      +    on_complete = () -> println("Completed")
      +))
      +;
      +
      +# output
      +Next: 1
      +Error: CustomError

      See also: error_if, error_if_empty, default_if_empty, logger

      source

      See also

      Operators

      diff --git a/v1.7.4/operators/errors/rerun/index.html b/v1.7.4/operators/errors/rerun/index.html new file mode 100644 index 000000000..3a8103304 --- /dev/null +++ b/v1.7.4/operators/errors/rerun/index.html @@ -0,0 +1,14 @@ + +rerun · Rocket.jl

      Rerun Operator

      Rocket.rerunFunction
      rerun(count::Int = -1)

      Returns an Observable that mirrors the source Observable with the exception of an error. If the source Observable calls error, this method will resubscribe to the source Observable for a maximum of count resubscriptions (given as a number parameter) rather than propagating the error call.

      Arguments:

      • count::Int: Number of retry attempts before failing. Optional. Default is -1.

      Producing

      Stream of type <: Subscribable{L} where L refers to type of source stream

      Examples

      using Rocket
      +
      +source = from(1:3) |> safe() |> map(Int, (d) -> d > 1 ? error("Error") : d) |> rerun(3)
      +
      +subscribe!(source, logger())
      +;
      +
      +# output
      +[LogActor] Data: 1
      +[LogActor] Data: 1
      +[LogActor] Data: 1
      +[LogActor] Data: 1
      +[LogActor] Error: ErrorException("Error")

      See also: AbstractOperator, InferableOperator, catch_error, logger, safe

      source

      Description

      Any and all items emitted by the source Observable will be emitted by the resulting Observable, even those emitted during failed subscriptions. For example, if an Observable fails at first but emits [1, 2] then succeeds the second time and emits: [1, 2, 3, 4, 5] then the complete stream of emissions and notifications would be: [1, 2, 1, 2, 3, 4, 5, complete].

      See also

      Operators

      diff --git a/v1.7.4/operators/filtering/about/index.html b/v1.7.4/operators/filtering/about/index.html new file mode 100644 index 000000000..5da47abf7 --- /dev/null +++ b/v1.7.4/operators/filtering/about/index.html @@ -0,0 +1,2 @@ + +About filtering operators · Rocket.jl
      diff --git a/v1.7.4/operators/filtering/filter/index.html b/v1.7.4/operators/filtering/filter/index.html new file mode 100644 index 000000000..3992d44e8 --- /dev/null +++ b/v1.7.4/operators/filtering/filter/index.html @@ -0,0 +1,13 @@ + +filter · Rocket.jl

      Filter Operator

      Base.filterFunction
      filter(filterFn::F) where { F <: Function }

      Creates a filter operator, which filters items of the source Observable by emitting only those that satisfy a specified filterFn predicate.

      Producing

      Stream of type <: Subscribable{L} where L refers to type of source stream

      Arguments

      • filterFn::F: predicate function with (data::T) -> Bool signature

      Examples

      using Rocket
      +
      +source = from([ 1, 2, 3, 4, 5, 6 ])
      +subscribe!(source |> filter((d) -> d % 2 == 0), logger())
      +;
      +
      +# output
      +
      +[LogActor] Data: 2
      +[LogActor] Data: 4
      +[LogActor] Data: 6
      +[LogActor] Completed

      See also: AbstractOperator, InferableOperator, ProxyObservable, logger

      source

      Description

      Like filter(f, array), this operator takes values from the source Observable, passes them through a predicate function and only emits those values that yielded true.

      See also

      Operators

      diff --git a/v1.7.4/operators/filtering/filter_type/index.html b/v1.7.4/operators/filtering/filter_type/index.html new file mode 100644 index 000000000..1f77b8144 --- /dev/null +++ b/v1.7.4/operators/filtering/filter_type/index.html @@ -0,0 +1,13 @@ + +filter_type · Rocket.jl

      FilterType Operator

      Rocket.filter_typeFunction
      filter_type(type::Type{ T }) where { T }

      Creates a filter_type operator, which filters items of the source Observable by emitting only those that match a specified T type with a <: operator. This operator is a more efficient version of filter(v -> v <: T) |> map(T, v -> v) operators chain.

      Producing

      Stream of type <: Subscribable{ T } where T refers to type argument

      Examples

      using Rocket
      +
      +source = from(Real[ 1, 2.0, 3, 4.0, 5, 6.0 ])
      +subscribe!(source |> filter_type(Int), logger())
      +;
      +
      +# output
      +
      +[LogActor] Data: 1
      +[LogActor] Data: 3
      +[LogActor] Data: 5
      +[LogActor] Completed

      See also: AbstractOperator, InferableOperator, ProxyObservable, logger

      source

      See also

      Operators

      diff --git a/v1.7.4/operators/filtering/find/index.html b/v1.7.4/operators/filtering/find/index.html new file mode 100644 index 000000000..b19e80bb3 --- /dev/null +++ b/v1.7.4/operators/filtering/find/index.html @@ -0,0 +1,11 @@ + +find · Rocket.jl

      Find operator

      Rocket.findFunction
      find(conditionFn::F) where { F <: Function }

      Creates a find operator, which emits only the first value emitted by the source Observable that meets some condition.

      Producing

      Stream of type <: Subscribable{L} where L refers to type of source stream

      Arguments

      • conditionFn::F: condition function with (data::T) -> Bool signature

      Examples

      using Rocket
      +
      +source = from([ 1, 2, 3, 4, 5, 6, 7, 8 ])
      +subscribe!(source |> find((d) -> d % 2 == 0), logger())
      +;
      +
      +# output
      +
      +[LogActor] Data: 2
      +[LogActor] Completed

      See also: AbstractOperator, InferableOperator, ProxyObservable, logger

      source

      Description

      find searches for the first item in the source Observable that matches the specified condition embodied by the predicate, and returns the first occurrence in the source. Does not emit an error if a valid value is not found.

      See also

      Operators, take

      diff --git a/v1.7.4/operators/filtering/find_index/index.html b/v1.7.4/operators/filtering/find_index/index.html new file mode 100644 index 000000000..f1743390d --- /dev/null +++ b/v1.7.4/operators/filtering/find_index/index.html @@ -0,0 +1,11 @@ + +find_index · Rocket.jl

      Find Index operator

      Rocket.find_indexFunction
      find_index(conditionFn::F) where { F <: Function }

      Creates a find operator, which emits only the index of the first value emitted by the source Observable that meets some condition. Indices are 1-based.

      Producing

      Stream of type <: Subscribable{L} where L refers to type of source stream

      Arguments

      • conditionFn::F: condition function with (data::T) -> Bool signature

      Examples

      using Rocket
      +
      +source = from([ 0, 1, 2, 3, 4, 5, 6, 7, 8 ])
      +subscribe!(source |> find_index((d) -> d !== 0 && d % 2 == 0), logger())
      +;
      +
      +# output
      +
      +[LogActor] Data: 3
      +[LogActor] Completed

      See also: find, AbstractOperator, InferableOperator, ProxyObservable, logger

      source

      Description

      It's like find, but emits the index of the found value, not the value itself.

      See also

      Operators, take

      diff --git a/v1.7.4/operators/filtering/first/index.html b/v1.7.4/operators/filtering/first/index.html new file mode 100644 index 000000000..c6cec901b --- /dev/null +++ b/v1.7.4/operators/filtering/first/index.html @@ -0,0 +1,11 @@ + +first · Rocket.jl

      First operator

      Base.firstFunction
      first(; default = nothing)

      Creates a first operator, which returns an Observable that emits only the first value emitted by the source Observable. Sends FirstNotFoundException error message if a given source completes without emitting a single value.

      Arguments

      • default: an optional default value to provide if no values were emitted

      Producing

      Stream of type <: Subscribable{L} where L refers to type of source stream

      Examples

      using Rocket
      +
      +source       = from(1:100)
      +subscription = subscribe!(source |> first(), logger())
      +;
      +
      +# output
      +
      +[LogActor] Data: 1
      +[LogActor] Completed

      See also: take, logger

      source

      Description

      An alias for take(1) operator.

      See also

      Operators, take

      diff --git a/v1.7.4/operators/filtering/ignore/index.html b/v1.7.4/operators/filtering/ignore/index.html new file mode 100644 index 000000000..20d4a8237 --- /dev/null +++ b/v1.7.4/operators/filtering/ignore/index.html @@ -0,0 +1,14 @@ + +ignore · Rocket.jl

      Ignore operator

      Rocket.ignoreFunction
      ignore(count::Int)

      Creates a ignore operator, which returns an Observable that skips the first count items emitted by the source Observable.

      Arguments

      • count::Int: the number of times, items emitted by source Observable should be skipped.

      Producing

      Stream of type <: Subscribable{L} where L refers to type of source stream

      Examples

      using Rocket
      +
      +source = from(1:5)
      +
      +subscribe!(source |> ignore(2), logger())
      +;
      +
      +# output
      +
      +[LogActor] Data: 3
      +[LogActor] Data: 4
      +[LogActor] Data: 5
      +[LogActor] Completed

      See also: AbstractOperator, InferableOperator, ProxyObservable, logger

      source

      See also

      Operators

      diff --git a/v1.7.4/operators/filtering/last/index.html b/v1.7.4/operators/filtering/last/index.html new file mode 100644 index 000000000..6b9783942 --- /dev/null +++ b/v1.7.4/operators/filtering/last/index.html @@ -0,0 +1,30 @@ + +last · Rocket.jl

      Last Operator

      Base.lastFunction
      last(; default = nothing)

      Creates a last operator, which returns an Observable that emits only the last item emitted by the source Observable. Sends LastNotFoundException error message if a given source completes without emitting a single value.

      Arguments

      • default: an optional default value to provide if no values were emitted

      Producing

      Stream of type <: Subscribable{L} where L refers to type of source stream

      Examples

      using Rocket
      +
      +source = from([ 1, 2, 3 ])
      +subscribe!(source |> last(), logger())
      +;
      +
      +# output
      +
      +[LogActor] Data: 3
      +[LogActor] Completed
      +
      using Rocket
      +
      +source = from(Int[])
      +subscribe!(source |> last() |> catch_error((err, obs) -> of(1)), logger())
      +;
      +
      +# output
      +
      +[LogActor] Data: 1
      +[LogActor] Completed
      using Rocket
      +
      +source = from(Int[])
      +subscribe!(source |> last(default = 1), logger())
      +;
      +
      +# output
      +
      +[LogActor] Data: 1
      +[LogActor] Completed

      See also: AbstractOperator, InferableOperator, ProxyObservable, logger

      source

      Description

      last operator returns an Observable that emits only the last item emitted by the source Observable.

      See also

      Operators

      diff --git a/v1.7.4/operators/filtering/some/index.html b/v1.7.4/operators/filtering/some/index.html new file mode 100644 index 000000000..d2e436e83 --- /dev/null +++ b/v1.7.4/operators/filtering/some/index.html @@ -0,0 +1,13 @@ + +some · Rocket.jl

      Some Operator

      Rocket.someFunction
      some()

      Creates a some operator, which filters out nothing items by the source Observable by emitting only those that not equal to nothing.

      Producing

      Stream of type <: Subscribable{L} where L refers to type of source stream <: Subscribable{Union{L, Nothing}}

      Examples

      using Rocket
      +
      +source = from([ 1, nothing, 3 ])
      +subscribe!(source |> some(), logger())
      +;
      +
      +# output
      +
      +[LogActor] Data: 1
      +[LogActor] Data: 3
      +[LogActor] Completed
      +

      See also: AbstractOperator, InferableOperator, ProxyObservable, max, min, logger

      source

      Description

      This operator takes values from the source Observable and only emits those values that are not nothing.

      See also

      Operators, filter

      diff --git a/v1.7.4/operators/filtering/take/index.html b/v1.7.4/operators/filtering/take/index.html new file mode 100644 index 000000000..e991df60f --- /dev/null +++ b/v1.7.4/operators/filtering/take/index.html @@ -0,0 +1,16 @@ + +take · Rocket.jl

      Take Operator

      Rocket.takeFunction
      take(maxcount::Int)

      Creates a take operator, which returns an Observable that emits only the first maxcount values emitted by the source Observable.

      Arguments

      • maxcount::Int: the maximum number of next values to emit.

      Producing

      Stream of type <: Subscribable{L} where L refers to type of source stream

      Examples

      using Rocket
      +
      +source = from([ i for i in 1:100 ])
      +
      +subscribe!(source |> take(5), logger())
      +;
      +
      +# output
      +
      +[LogActor] Data: 1
      +[LogActor] Data: 2
      +[LogActor] Data: 3
      +[LogActor] Data: 4
      +[LogActor] Data: 5
      +[LogActor] Completed

      See also: AbstractOperator, InferableOperator, ProxyObservable, logger

      source

      Description

      take returns an Observable that emits only the first count values emitted by the source Observable. If the source emits fewer than count values, then all of its values are emitted. Afterwards, the Observable completes regardless of whether the source completed.

      See also

      Operators

      diff --git a/v1.7.4/operators/filtering/take_until/index.html b/v1.7.4/operators/filtering/take_until/index.html new file mode 100644 index 000000000..147892501 --- /dev/null +++ b/v1.7.4/operators/filtering/take_until/index.html @@ -0,0 +1,32 @@ + +take_until · Rocket.jl

      TakeUntil Operator

      Rocket.take_untilFunction
      take_until(notifier::S)

      Creates a take operator, which returns an Observable that emits the values emitted by the source Observable until a notifier Observable emits a value or a completion event.

      Arguments

      • notifier::S: The Observable whose first emitted value will cause the output Observable of take_until to stop emitting values from the source Observable.

      Producing

      Stream of type <: Subscribable{L} where L refers to type of source stream

      Examples

      using Rocket
      +
      +source = interval(100) |> take_until(timer(1000))
      +
      +subscribe!(source, logger())
      +;
      +
      +# output
      +
      +[LogActor] Data: 0
      +[LogActor] Data: 1
      +[LogActor] Data: 2
      +[LogActor] Data: 3
      +[LogActor] Data: 4
      +[LogActor] Data: 5
      +[LogActor] Data: 6
      +[LogActor] Data: 7
      +[LogActor] Data: 8
      +[LogActor] Completed
      using Rocket 
      +
      +source = interval(100)
      +
      +subscribe!(source |> take_until(source |> filter(i -> i == 3)), logger())
      +;
      +
      +# output 
      +
      +[LogActor] Data: 0
      +[LogActor] Data: 1
      +[LogActor] Data: 2
      +[LogActor] Completed

      See also: AbstractOperator, InferableOperator, ProxyObservable, logger

      source

      Description

      take_until subscribes and begins mirroring the source Observable. It also monitors a second Observable, notifier that you provide. If the notifier emits a value, the output Observable stops mirroring the source Observable and completes. If the notifier doesn't emit any value and completes then take_until also completes.

      See also

      Operators

      diff --git a/v1.7.4/operators/join/about/index.html b/v1.7.4/operators/join/about/index.html new file mode 100644 index 000000000..d36aaf327 --- /dev/null +++ b/v1.7.4/operators/join/about/index.html @@ -0,0 +1,2 @@ + +Join category · Rocket.jl

      Join category

      There are operators for different purposes, and they may be categorized as: creation, transformation, filtering, joining, multicasting, error handling, utility, etc. In the following list you will find all the operators organized in join category.

      See also

      Operators

      diff --git a/v1.7.4/operators/join/with_latest/index.html b/v1.7.4/operators/join/with_latest/index.html new file mode 100644 index 000000000..15851ccf2 --- /dev/null +++ b/v1.7.4/operators/join/with_latest/index.html @@ -0,0 +1,11 @@ + +with_latest · Rocket.jl

      WithLatest Operator

      Rocket.with_latestFunction
      with_latest(sources...)

      Creates a with_latest operator, which combines the source Observable with other Observables to create an Observable whose values are calculated from the latest values of each, only when the source emits.

      Examples

      using Rocket
      +
      +source = of(1)
      +subscribe!(source |> with_latest(from(1:5)), logger())
      +;
      +
      +# output
      +
      +[LogActor] Data: (1, 5)
      +[LogActor] Completed

      See also: AbstractOperator, InferableOperator

      source

      See also

      Operators

      diff --git a/v1.7.4/operators/mathematical/about/index.html b/v1.7.4/operators/mathematical/about/index.html new file mode 100644 index 000000000..9c2e79855 --- /dev/null +++ b/v1.7.4/operators/mathematical/about/index.html @@ -0,0 +1,2 @@ + +About mathematical operators · Rocket.jl
      diff --git a/v1.7.4/operators/mathematical/count/index.html b/v1.7.4/operators/mathematical/count/index.html new file mode 100644 index 000000000..9dd113ca1 --- /dev/null +++ b/v1.7.4/operators/mathematical/count/index.html @@ -0,0 +1,20 @@ + +count · Rocket.jl

      Count Operator

      Base.countFunction
      count()

      Creates a count operator, which counts the number of emissions on the source and emits that number when the source completes.

      Producing

      Stream of type <: Subscribable{Int}

      Examples

      using Rocket
      +
      +source = from([ i for i in 1:42 ])
      +subscribe!(source |> count(), logger())
      +;
      +
      +# output
      +
      +[LogActor] Data: 42
      +[LogActor] Completed
      +

      See also: AbstractOperator, RightTypedOperator, ProxyObservable, logger

      source

      Description

      count transforms an Observable that emits values into an Observable that emits a single value that represents the number of values emitted by the source Observable. If the source Observable terminates with an error, count will pass this error notification along without emitting a value first. If the source Observable does not terminate at all, count will neither emit a value nor terminate.

      Example

      Counts how many values source Observable have emitted before the complete event happened

      using Rocket
      +
      +source = from([ i for i in 1:42 ])
      +subscribe!(source |> count(), logger())
      +
      +# output
      +
      +[LogActor] Data: 42
      +[LogActor] Completed

      See also

      Operators

      diff --git a/v1.7.4/operators/mathematical/max/index.html b/v1.7.4/operators/mathematical/max/index.html new file mode 100644 index 000000000..6ae531eaf --- /dev/null +++ b/v1.7.4/operators/mathematical/max/index.html @@ -0,0 +1,12 @@ + +max · Rocket.jl

      Max Operator

      Base.maxFunction
      max(; from = nothing)

      Creates a max operator, which emits a single item: the item with the largest value.

      Arguments

      • from: optional initial maximum value, if nothing first item from the source will be used as initial instead

      Producing

      Stream of type <: Subscribable{Union{L, Nothing}} where L refers to type of source stream

      Examples

      using Rocket
      +
      +source = from([ i for i in 1:42 ])
      +subscribe!(source |> max(), logger())
      +;
      +
      +# output
      +
      +[LogActor] Data: 42
      +[LogActor] Completed
      +

      See also: AbstractOperator, InferableOperator, ProxyObservable, logger

      source

      Description

      The max operator operates on an Observable of similar objects. When the source Observable completes, it emits the item with the largest value.

      See also

      Operators

      diff --git a/v1.7.4/operators/mathematical/min/index.html b/v1.7.4/operators/mathematical/min/index.html new file mode 100644 index 000000000..99f1a5933 --- /dev/null +++ b/v1.7.4/operators/mathematical/min/index.html @@ -0,0 +1,12 @@ + +min · Rocket.jl

      Min Operator

      Base.minFunction
      min(; from = nothing)

      Creates a min operator, which emits a single item: the item with the smallest value.

      Arguments

      • from: optional initial minimal value, if nothing first item from the source will be used as initial instead

      Producing

      Stream of type <: Subscribable{Union{L, Nothing}} where L refers to type of source stream

      Examples

      using Rocket
      +
      +source = from([ i for i in 1:42 ])
      +subscribe!(source |> min(), logger())
      +;
      +
      +# output
      +
      +[LogActor] Data: 1
      +[LogActor] Completed
      +

      See also: AbstractOperator, InferableOperator, ProxyObservable, logger

      source

      Description

      The min operator operates on an Observable of similar objects. When source Observable completes, it emits the item with the smallest value.

      See also

      Operators

      diff --git a/v1.7.4/operators/mathematical/reduce/index.html b/v1.7.4/operators/mathematical/reduce/index.html new file mode 100644 index 000000000..d73d86ab1 --- /dev/null +++ b/v1.7.4/operators/mathematical/reduce/index.html @@ -0,0 +1,23 @@ + +reduce · Rocket.jl

      Reduce Operator

      Base.reduceFunction
      reduce(::Type{R}, reduceFn::Function, seed::R) where R
      +reduce(reduceFn::F) where { F <: Function }

      Creates a reduce operator, which applies a given accumulator reduceFn function over the source Observable, and returns the accumulated result when the source completes, given an optional seed value. If a seed value is specified, then that value will be used as the initial value for the accumulator. If no seed value is specified, the first item of the source is used as the seed.

      Arguments

      • ::Type{R}: the type of data of transformed value
      • reduceFn::Function: transformation function with (data::T, current::R) -> R signature
      • seed::R: optional seed accumulation value

      Producing

      Stream of type <: Subscribable{R}

      Examples

      using Rocket
      +
      +source = from([ i for i in 1:10 ])
      +subscribe!(source |> reduce(Vector{Int}, (d, c) -> [ c..., d ], Int[]), logger())
      +;
      +
      +# output
      +
      +[LogActor] Data: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
      +[LogActor] Completed
      +
      using Rocket
      +
      +source = from([ i for i in 1:42 ])
      +subscribe!(source |> reduce(+), logger())
      +;
      +
      +# output
      +
      +[LogActor] Data: 903
      +[LogActor] Completed
      +

      See also: AbstractOperator, RightTypedOperator, ProxyObservable, logger

      source

      Description

      reduce applies an accumulator function to each value of the source Observable (from the past) and reduces it to a single value that is emitted by the output Observable. Note that reduce will only emit one value, only when the source Observable completes. It is equivalent to applying scan followed by last.

      It returns an Observable that applies a specified accumulator function to each item emitted by the source Observable. If a seed value is specified, then that value will be used as the initial value of the accumulator. If no seed value is specified, the first item of the source is used as the seed.

      See also

      Operators, scan, last

      diff --git a/v1.7.4/operators/mathematical/sum/index.html b/v1.7.4/operators/mathematical/sum/index.html new file mode 100644 index 000000000..e4e1211fc --- /dev/null +++ b/v1.7.4/operators/mathematical/sum/index.html @@ -0,0 +1,22 @@ + +sum · Rocket.jl

      Sum Operator

      Base.sumFunction
      sum(; from = nothing)

      Creates a sum operator, which applies a sum accumulator function over the source Observable, and returns the accumulated result when the source completes, given an optional initial value.

      The sum operator is similar to reduce(T, T, +) (see reduce).

      Arguments

      • from: optional initial accumulation value, if nothing first value will be used instead

      Producing

      Stream of type <: Subscribable{L} where L refers to type of source stream

      Examples

      using Rocket
      +
      +source = from([ i for i in 1:42 ])
      +subscribe!(source |> sum(), logger())
      +;
      +
      +# output
      +
      +[LogActor] Data: 903
      +[LogActor] Completed
      +
      using Rocket
      +
      +source = from([ i for i in 1:42 ])
      +subscribe!(source |> sum(from = 97), logger())
      +;
      +
      +# output
      +
      +[LogActor] Data: 1000
      +[LogActor] Completed
      +

      See also: AbstractOperator, InferableOperator, ProxyObservable, reduce, logger

      source

      Description

      sum operates on an Observable of objects on which + is defined. When the source Observable completes, it emits the sum of all previous items. The sum operator is similar to reduce(T, T, +) (see reduce).

      See also

      Operators, reduce

      diff --git a/v1.7.4/operators/multicasting/about/index.html b/v1.7.4/operators/multicasting/about/index.html new file mode 100644 index 000000000..777ee14e2 --- /dev/null +++ b/v1.7.4/operators/multicasting/about/index.html @@ -0,0 +1,2 @@ + +About multicasting operators · Rocket.jl
      diff --git a/v1.7.4/operators/multicasting/multicast/index.html b/v1.7.4/operators/multicasting/multicast/index.html new file mode 100644 index 000000000..adfe8aff4 --- /dev/null +++ b/v1.7.4/operators/multicasting/multicast/index.html @@ -0,0 +1,33 @@ + +multicast · Rocket.jl

      Multicast Operator

      Rocket.multicastFunction
      multicast(subject::S) where S
      +multicast(factory::F) where { F <: AbstractSubjectFactory }

      The multicast()operator takes a Subject and uses it to share the source execution. It returns what’s known as aConnectableObservable`, which has a connect() method. It has one simple job - subscribes to the source with the provided subject.

      Example

      using Rocket
      +
      +subject = Subject(Int)
      +source  = from(1:5) |> multicast(subject)
      +
      +actor1 = logger("1")
      +actor2 = logger("2")
      +
      +subscription1 = subscribe!(source, actor1)
      +subscription2 = subscribe!(source, actor2)
      +
      +connect(source)
      +
      +unsubscribe!(subscription1)
      +unsubscribe!(subscription2)
      +;
      +
      +# output
      +
      +[1] Data: 1
      +[2] Data: 1
      +[1] Data: 2
      +[2] Data: 2
      +[1] Data: 3
      +[2] Data: 3
      +[1] Data: 4
      +[2] Data: 4
      +[1] Data: 5
      +[2] Data: 5
      +[1] Completed
      +[2] Completed

      See also: ConnectableObservable, Subject, share, publish

      source

      See also

      Operators

      diff --git a/v1.7.4/operators/multicasting/publish/index.html b/v1.7.4/operators/multicasting/publish/index.html new file mode 100644 index 000000000..400084c6d --- /dev/null +++ b/v1.7.4/operators/multicasting/publish/index.html @@ -0,0 +1,2 @@ + +publish · Rocket.jl

      Publish Operators

      See also

      Operators

      diff --git a/v1.7.4/operators/multicasting/share/index.html b/v1.7.4/operators/multicasting/share/index.html new file mode 100644 index 000000000..a6e5e2325 --- /dev/null +++ b/v1.7.4/operators/multicasting/share/index.html @@ -0,0 +1,2 @@ + +share · Rocket.jl

      Share Operators

      See also

      Operators

      diff --git a/v1.7.4/operators/transformation/about/index.html b/v1.7.4/operators/transformation/about/index.html new file mode 100644 index 000000000..371c231fb --- /dev/null +++ b/v1.7.4/operators/transformation/about/index.html @@ -0,0 +1,2 @@ + +About transformation operators · Rocket.jl
      diff --git a/v1.7.4/operators/transformation/accumulated/index.html b/v1.7.4/operators/transformation/accumulated/index.html new file mode 100644 index 000000000..221baa300 --- /dev/null +++ b/v1.7.4/operators/transformation/accumulated/index.html @@ -0,0 +1,23 @@ + +accumulated · Rocket.jl

      Accumulated Operator

      Rocket.accumulatedFunction
      accumulated()

      Creates an accumulated operator, which returns an Observable that emits the current item with all of the previous items emitted by the source Observable in one single ordered array.

      Producing

      Stream of type <: Subscribable{Vector{L}} where L refers to type of source stream

      Examples

      using Rocket
      +
      +source = from([ 1, 2, 3 ])
      +subscribe!(source |> accumulated(), logger())
      +;
      +
      +# output
      +
      +[LogActor] Data: [1]
      +[LogActor] Data: [1, 2]
      +[LogActor] Data: [1, 2, 3]
      +[LogActor] Completed
      +
      using Rocket
      +
      +source = of(1)
      +subscribe!(source |> accumulated(), logger())
      +;
      +
      +# output
      +
      +[LogActor] Data: [1]
      +[LogActor] Completed

      See also: AbstractOperator, InferableOperator, ProxyObservable, logger

      source

      Description

      Combines all values emitted by the source, using an accumulator function that joins a new source value with the all past values emmited into one single array. This is similar to scan with vcat accumulation function.

      See also

      Operators

      diff --git a/v1.7.4/operators/transformation/concat_map/index.html b/v1.7.4/operators/transformation/concat_map/index.html new file mode 100644 index 000000000..c08d9580e --- /dev/null +++ b/v1.7.4/operators/transformation/concat_map/index.html @@ -0,0 +1,16 @@ + +concat_map · Rocket.jl

      ConcatMap Operator

      Rocket.concat_mapFunction
      concat_map(::Type{R}, mappingFn::F = identity) where { R, F <: Function }

      Creates a concat_map operator, which returns an Observable that emits the result of applying the projection function to each item emitted by the source Observable and taking values from each projected inner Observable sequentially. Essentialy it projects each source value to an Observable which is merged in the output Observable, in a serialized fashion waiting for each one to complete before merging the next.

      Arguments

      • ::Type{R}: the type of data of output Observables after projection with mappingFn
      • mappingFn::F: projection function with (data) -> Observable{R} signature

      Producing

      Stream of type <: Subscribable{R}

      Examples

      using Rocket
      +
      +source = from([ 0, 0 ]) |> concat_map(Int, d -> from([ 1, 2, 3 ], scheduler = AsyncScheduler(0)))
      +subscribe!(source, logger())
      +;
      +
      +# output
      +
      +[LogActor] Data: 1
      +[LogActor] Data: 2
      +[LogActor] Data: 3
      +[LogActor] Data: 1
      +[LogActor] Data: 2
      +[LogActor] Data: 3
      +[LogActor] Completed

      See also: AbstractOperator, RightTypedOperator, ProxyObservable, logger

      source

      Description

      Returns an Observable that emits items based on applying a function that you supply to each item emitted by the source Observable, where that function returns an (so-called "inner") Observable. Each new inner Observable is concatenated with the previous inner Observable.

      Warning

      If source values arrive endlessly and faster than their corresponding inner Observables can complete, it will result in memory issues as inner Observables amass in an unbounded buffer waiting for their turn to be subscribed to.

      Note

      concat_map is equivalent to merge_map with concurrency parameter set to 1.

      See also

      Operators, merge_map

      diff --git a/v1.7.4/operators/transformation/concat_map_to/index.html b/v1.7.4/operators/transformation/concat_map_to/index.html new file mode 100644 index 000000000..89416d552 --- /dev/null +++ b/v1.7.4/operators/transformation/concat_map_to/index.html @@ -0,0 +1,19 @@ + +concat_map_to · Rocket.jl

      ConcatMapTo Operator

      Rocket.concat_map_toFunction
      switch_map_to(inner_observable)

      Creates a switch_map_to operator, which returns an observable of values merged together by joining the passed observable with itself, one after the other, for each value emitted from the source. Essentially it projects each source value to the same Observable which is merged multiple times in a serialized fashion on the output Observable.

      Arguments

      • inner_observable: an Observable to replace each value from the source Observable.

      Producing

      Stream of type <: Subscribable{R} where R refers to the eltype of inner_observable

      Examples

      using Rocket
      +
      +source = from([ 0, 0, 0 ])
      +subscribe!(source |> concat_map_to(from([ 1, 2, 3 ])), logger())
      +;
      +
      +# output
      +
      +[LogActor] Data: 1
      +[LogActor] Data: 2
      +[LogActor] Data: 3
      +[LogActor] Data: 1
      +[LogActor] Data: 2
      +[LogActor] Data: 3
      +[LogActor] Data: 1
      +[LogActor] Data: 2
      +[LogActor] Data: 3
      +[LogActor] Completed

      See also: concat_map, AbstractOperator, RightTypedOperator, ProxyObservable, logger

      source
      Note

      concat_map_to is equivalent to concat_map with mappingFn set to (_) -> inner_observable.

      See also

      Operators, concat_map

      diff --git a/v1.7.4/operators/transformation/enumerate/index.html b/v1.7.4/operators/transformation/enumerate/index.html new file mode 100644 index 000000000..002d815d2 --- /dev/null +++ b/v1.7.4/operators/transformation/enumerate/index.html @@ -0,0 +1,27 @@ + +enumerate · Rocket.jl

      Enumerate Operator

      Base.Iterators.enumerateFunction
      enumerate()

      Creates an enumerate operator, which converts each value emitted by the source Observable into a tuple of its order number and the value itself.

      The enumerate operator is similar to scan(Tuple{Int, Int}, (d, c) -> (d, c[2] + 1), (0, 0)) (see scan).

      Producing

      Stream of type <: Subscribable{Tuple{Int, L}} where L refers to type of source stream

      Examples

      using Rocket
      +
      +source = from([ 0 for _ in 1:3 ])
      +subscribe!(source |> enumerate(), logger())
      +;
      +
      +# output
      +
      +[LogActor] Data: (1, 0)
      +[LogActor] Data: (2, 0)
      +[LogActor] Data: (3, 0)
      +[LogActor] Completed
      +

      See also: AbstractOperator, InferableOperator, ProxyObservable, scan, map, logger

      source

      Description

      enumerate returns an Observable that converts each value emitted by the source Observable into a tuple of its order number and the value itself.

      Example

      Get a value from the source with its order number

      using Rocket
      +
      +source = from([ 0.0, 0.2, 0.4, 0.6, 0.8, 1.0 ])
      +subscribe!(source |> enumerate(), logger())
      +
      +# output
      +
      +[LogActor] Data: (0.0, 1)
      +[LogActor] Data: (0.2, 2)
      +[LogActor] Data: (0.4, 3)
      +[LogActor] Data: (0.6, 4)
      +[LogActor] Data: (0.8, 5)
      +[LogActor] Data: (1.0, 6)
      +[LogActor] Completed

      See also

      Operators, scan

      diff --git a/v1.7.4/operators/transformation/exhaust_map/index.html b/v1.7.4/operators/transformation/exhaust_map/index.html new file mode 100644 index 000000000..e2898ecbb --- /dev/null +++ b/v1.7.4/operators/transformation/exhaust_map/index.html @@ -0,0 +1,12 @@ + +exhaust_map · Rocket.jl

      ExhaustMap Operator

      Rocket.exhaust_mapFunction
      exhaust_map(::Type{R}, mappingFn::F = identity) where { R, F <: Function }

      Creates a exhaust_map operator, which returns an Observable containing projected Observables of each item of the source, ignoring projected Observables that start before their preceding Observable has completed. Essentially it projects each source value to an Observable which is merged in the output Observable only if the previous projected Observable has completed.

      Arguments

      • ::Type{R}: the type of data of output Observables after projection with mappingFn
      • mappingFn::F: projection function with (data) -> Observable{R} signature

      Producing

      Stream of type <: Subscribable{R}

      Examples

      using Rocket
      +
      +source = from([ 0, 0 ]) |> async() |> exhaust_map(Int, d -> from([ 1, 2 ]) |> async())
      +subscribe!(source, logger())
      +;
      +
      +# output
      +
      +[LogActor] Data: 1
      +[LogActor] Data: 2
      +[LogActor] Completed

      See also: AbstractOperator, RightTypedOperator, ProxyObservable, logger

      source

      See also

      Operators

      diff --git a/v1.7.4/operators/transformation/lowercase/index.html b/v1.7.4/operators/transformation/lowercase/index.html new file mode 100644 index 000000000..a39223581 --- /dev/null +++ b/v1.7.4/operators/transformation/lowercase/index.html @@ -0,0 +1,11 @@ + +lowercase · Rocket.jl

      Lowercase Operator

      Base.Unicode.lowercaseFunction
      lowercase()

      Creates an lowercase operator, which forces each value to be in lower case

      Producing

      Stream of type <: Subscribable{L} where L referes to type of data of input Observable

      Examples

      using Rocket
      +
      +source = of("Hello, world!")
      +subscribe!(source |> lowercase(), logger())
      +;
      +
      +# output
      +
      +[LogActor] Data: hello, world!
      +[LogActor] Completed

      See also: AbstractOperator, InferableOperator, ProxyObservable, logger

      source

      See also

      Operators, map, uppercase

      diff --git a/v1.7.4/operators/transformation/map/index.html b/v1.7.4/operators/transformation/map/index.html new file mode 100644 index 000000000..c385278e5 --- /dev/null +++ b/v1.7.4/operators/transformation/map/index.html @@ -0,0 +1,75 @@ + +map · Rocket.jl

      Map Operator

      Base.mapFunction
      map(::Type{R}, mappingFn::F) where { F <: Function }

      Creates a map operator, which applies a given mappingFn to each value emmited by the source Observable, and emits the resulting values as an Observable. You have to specify output R type after mappingFn projection.

      Arguments

      • ::Type{R}: the type of data of transformed value, may be or may not be the same as source type
      • mappingFn::Function: transformation function with (data::L) -> R signature, where L is type of data in input source

      Producing

      Stream of type <: Subscribable{R}

      Examples

      using Rocket
      +
      +source = from([ 1, 2, 3 ])
      +subscribe!(source |> map(Int, (d) -> d ^ 2), logger())
      +;
      +
      +# output
      +
      +[LogActor] Data: 1
      +[LogActor] Data: 4
      +[LogActor] Data: 9
      +[LogActor] Completed

      See also: AbstractOperator, RightTypedOperator, ProxyObservable, logger

      source

      Description

      The map operator, similar to map(f, array), applies a function to each value from the source. It's important to note that the function f is expected to be pure and without any side effects. The map operator is designed to create a copy of the original observable for each new subscriber. It independently executes the f function for each subscriber and doesn't share the resulting value. This might be inconvenient when f involves complex calculations or side effects.

      using Rocket
      +
      +function f(x)
      +    println("Function `f` called") # Assume heavy calculations or side-effects
      +    return x + 1
      +end
      +
      +subject = Subject(Int)
      +
      +mapped = subject |> map(Int, f)
      +
      +subscription1 = subscribe!(mapped, logger())
      +subscription2 = subscribe!(mapped, logger())
      +
      +next!(subject, 1)
      +
      +unsubscribe!(subscription1)
      +unsubscribe!(subscription2)
      Function `f` called
      +[LogActor] Data: 2
      +Function `f` called
      +[LogActor] Data: 2

      In the example, you'll observe that "Function f called" is displayed twice. This happens because each subscriber receives their individual, distinct version of the modified data. To alter this behavior, one can utilize the share() operator. This operator creates only a single copy of the modified observable and shares the computed results.

      mapped_and_shared = mapped |> share()
      +
      +subscription1 = subscribe!(mapped_and_shared, logger())
      +subscription2 = subscribe!(mapped_and_shared, logger())
      +
      +next!(subject, 1)
      +
      +unsubscribe!(subscription1)
      +unsubscribe!(subscription2)
      Function `f` called
      +[LogActor] Data: 2
      +[LogActor] Data: 2

      In this example, "Function f called" appears only once, and the computed value is shared between the two subscribers. Note, however, that this behaviour might be confusing in cases where the first subscribers completes the observable till its completion stage. For example:

      mapped_and_shared = from([ 0, 1, 2 ]) |> map(Int, f) |> share()
      +
      +subscription1 = subscribe!(mapped_and_shared, logger())
      +subscription2 = subscribe!(mapped_and_shared, logger())
      +
      +unsubscribe!(subscription1)
      +unsubscribe!(subscription2)
      Function `f` called
      +[LogActor] Data: 1
      +Function `f` called
      +[LogActor] Data: 2
      +Function `f` called
      +[LogActor] Data: 3
      +[LogActor] Completed
      +[LogActor] Completed

      In this scenario, the second subscriber doesn't receive any values because the first subscriber exhausts the single shared observable. Once the shared observable is used up, it doesn't produce any further values. This doesn't occur without the share() operator.

      mapped = from([ 0, 1, 2 ]) |> map(Int, f)
      +
      +subscription1 = subscribe!(mapped, logger())
      +subscription2 = subscribe!(mapped, logger())
      +
      +unsubscribe!(subscription1)
      +unsubscribe!(subscription2)
      Function `f` called
      +[LogActor] Data: 1
      +Function `f` called
      +[LogActor] Data: 2
      +Function `f` called
      +[LogActor] Data: 3
      +[LogActor] Completed
      +Function `f` called
      +[LogActor] Data: 1
      +Function `f` called
      +[LogActor] Data: 2
      +Function `f` called
      +[LogActor] Data: 3
      +[LogActor] Completed

      See also

      Operators

      diff --git a/v1.7.4/operators/transformation/map_to/index.html b/v1.7.4/operators/transformation/map_to/index.html new file mode 100644 index 000000000..bf826f331 --- /dev/null +++ b/v1.7.4/operators/transformation/map_to/index.html @@ -0,0 +1,13 @@ + +map_to · Rocket.jl

      MapTo Operator

      Rocket.map_toFunction
      map_to(value::T) where T

      Creates a map operator, which emits the given constant value on the output Observable every time the source Observable emits a value.

      Arguments

      • value::T: the constant value to map each source value to

      Producing

      Stream of type <: Subscribable{T}

      Examples

      using Rocket
      +
      +source = from([ 1, 2, 3 ])
      +subscribe!(source |> map_to('a'), logger())
      +;
      +
      +# output
      +
      +[LogActor] Data: a
      +[LogActor] Data: a
      +[LogActor] Data: a
      +[LogActor] Completed

      See also: map, AbstractOperator, RightTypedOperator, ProxyObservable, logger

      source

      Description

      Takes a constant value as argument, and emits that whenever the source Observable emits a value. In other words, ignores the actual source value, and simply uses the emission moment to know when to emit the given value.

      See also

      Operators

      diff --git a/v1.7.4/operators/transformation/merge_map/index.html b/v1.7.4/operators/transformation/merge_map/index.html new file mode 100644 index 000000000..bbae82d30 --- /dev/null +++ b/v1.7.4/operators/transformation/merge_map/index.html @@ -0,0 +1,16 @@ + +merge_map · Rocket.jl

      MergeMap Operator

      Rocket.merge_mapFunction
      merge_map(::Type{R}, mappingFn::F = identity; concurrent::Int = typemax(Int)) where { R, F <: Function }

      Creates a merge_map operator, which returns an Observable that emits the result of applying the projection function mappingFn to each item emitted by the source Observable and merging the results of the Observables obtained from this transformation.

      Arguments

      • ::Type{R}: the type of data of output Observables after projection with mappingFn
      • mappingFn::F: projection function with (data) -> Observable{R} signature
      • concurrent::Int: optional, default is typemax(Int), maximum number of input Observables being subscribed to concurrently

      Producing

      Stream of type <: Subscribable{R}

      Examples

      using Rocket
      +
      +source = from([ 0, 0 ]) |> merge_map(Int, d -> from([ 1, 2, 3 ], scheduler = AsyncScheduler(0)))
      +subscribe!(source, logger())
      +;
      +
      +# output
      +
      +[LogActor] Data: 1
      +[LogActor] Data: 1
      +[LogActor] Data: 2
      +[LogActor] Data: 2
      +[LogActor] Data: 3
      +[LogActor] Data: 3
      +[LogActor] Completed

      See also: AbstractOperator, RightTypedOperator, ProxyObservable, logger

      source

      See also

      Operators

      diff --git a/v1.7.4/operators/transformation/override/index.html b/v1.7.4/operators/transformation/override/index.html new file mode 100644 index 000000000..bee231c84 --- /dev/null +++ b/v1.7.4/operators/transformation/override/index.html @@ -0,0 +1,33 @@ + +override · Rocket.jl

      Override Operator

      Rocket.overrideFunction
      override(handler::OverrideHandler)

      Creates an override operator that overrides each emission from source observable with value provided in handler. If handler contains nothing source observable emits as usual. For constant override see map_to. Use Rocket.setvalue! to set new value for handler.

      Producing

      Stream of type <: Subscribable{Union{L, T}} where L refers to the type of source stream and T referes to the type of handler's value

      Examples

      using Rocket 
      +
      +subject = Subject(Int)
      +handler = OverrideHandler(Int, -1)
      +
      +source = subject |> override(handler)
      +
      +subscription = subscribe!(source, logger())
      +
      +next!(subject, 1)
      +next!(subject, 2)
      +
      +Rocket.setvalue!(handler, nothing)
      +
      +next!(subject, 3)
      +next!(subject, 4)
      +
      +Rocket.setvalue!(handler, -2)
      +
      +next!(subject, 5)
      +next!(subject, 6)
      +
      +unsubscribe!(subscription)
      +
      +# output
      +[LogActor] Data: -1
      +[LogActor] Data: -1
      +[LogActor] Data: 3
      +[LogActor] Data: 4
      +[LogActor] Data: -2
      +[LogActor] Data: -2

      See also: OverrideHandler

      source

      See also

      Operators

      diff --git a/v1.7.4/operators/transformation/pairwise/index.html b/v1.7.4/operators/transformation/pairwise/index.html new file mode 100644 index 000000000..7216fc572 --- /dev/null +++ b/v1.7.4/operators/transformation/pairwise/index.html @@ -0,0 +1,29 @@ + +pairwise · Rocket.jl

      Pairwise Operator

      Rocket.pairwiseFunction
      pairwise([ initial ])

      Creates a pairwise operator, which groups pairs of consecutive emissions together and emits them as a tuple of two values. Accepts optional initial seed value to start pairing from.

      using Rocket
      +
      +source = from(1:5) |> pairwise()
      +
      +subscribe!(source, logger())
      +;
      +
      +# output
      +
      +[LogActor] Data: (1, 2)
      +[LogActor] Data: (2, 3)
      +[LogActor] Data: (3, 4)
      +[LogActor] Data: (4, 5)
      +[LogActor] Completed
      using Rocket
      +
      +source = from(1:5) |> pairwise(0)
      +
      +subscribe!(source, logger())
      +;
      +
      +# output
      +
      +[LogActor] Data: (0, 1)
      +[LogActor] Data: (1, 2)
      +[LogActor] Data: (2, 3)
      +[LogActor] Data: (3, 4)
      +[LogActor] Data: (4, 5)
      +[LogActor] Completed

      See also: AbstractOperator, InferableOperator, logger

      source

      See also

      Operators

      diff --git a/v1.7.4/operators/transformation/scan/index.html b/v1.7.4/operators/transformation/scan/index.html new file mode 100644 index 000000000..3faac987c --- /dev/null +++ b/v1.7.4/operators/transformation/scan/index.html @@ -0,0 +1,27 @@ + +scan · Rocket.jl

      Scan Operator

      Rocket.scanFunction
      scan(::Type{R}, scanFn::F, seed::R) where { R, F <: Function }
      +scan(scanFn::F) where { F <: Function }

      Creates a scan operator, which applies a given accumulator scanFn function to each value emmited by the source Observable, and returns each intermediate result with an optional seed value. If a seed value is specified, then that value will be used as the initial value for the accumulator. If no seed value is specified, the first item of the source is used as the seed.

      Arguments

      • ::Type{R}: the type of data of transformed value, may be or may not be the same as type of input source
      • scanFn::Function: accumulator function with (data::T, current::R) -> R signature
      • seed::R: optional initial value for accumulator function

      Producing

      Stream of type <: Subscribable{R}

      Examples

      using Rocket
      +
      +source = from([ 1, 2, 3 ])
      +subscribe!(source |> scan(+), logger())
      +;
      +
      +# output
      +
      +[LogActor] Data: 1
      +[LogActor] Data: 3
      +[LogActor] Data: 6
      +[LogActor] Completed
      +
      using Rocket
      +
      +source = from([ 1, 2, 3 ])
      +subscribe!(source |> scan(Vector{Int}, (d, c) -> [ c..., d ], Int[]), logger())
      +;
      +
      +# output
      +
      +[LogActor] Data: [1]
      +[LogActor] Data: [1, 2]
      +[LogActor] Data: [1, 2, 3]
      +[LogActor] Completed
      +

      See also: AbstractOperator, RightTypedOperator, ProxyObservable, reduce, logger

      source

      Description

      Combines all values emitted by the source, using an accumulator function that joins a new source value with the past accumulation. This is similar to reduce, but emits the intermediate accumulations.

      Returns an Observable that applies a specified accumulator function to each item emitted by the source Observable. If a seed value is specified, then that value will be used as the initial value for the accumulator. If no seed value is specified, the first item of the source is used as the seed.

      See also

      Operators

      diff --git a/v1.7.4/operators/transformation/start_with/index.html b/v1.7.4/operators/transformation/start_with/index.html new file mode 100644 index 000000000..7752d0654 --- /dev/null +++ b/v1.7.4/operators/transformation/start_with/index.html @@ -0,0 +1,14 @@ + +start_with · Rocket.jl

      StartWith Operator

      Rocket.start_withFunction
      start_with(object::O) where O

      Creates a start_with operator, which forces an observable to emit given object as a first value.

      Producing

      Stream of type <: Subscribable{Union{L, O}} where L refers to type of source stream <: Subscribable{L}

      Examples

      using Rocket
      +
      +source = from(1:3) |> start_with(0)
      +subscribe!(source, logger())
      +;
      +
      +# output
      +
      +[LogActor] Data: 0
      +[LogActor] Data: 1
      +[LogActor] Data: 2
      +[LogActor] Data: 3
      +[LogActor] Completed

      See also: AbstractOperator, InferableOperator, ProxyObservable, logger

      source

      See also

      Operators

      diff --git a/v1.7.4/operators/transformation/substitute/index.html b/v1.7.4/operators/transformation/substitute/index.html new file mode 100644 index 000000000..16dd1650b --- /dev/null +++ b/v1.7.4/operators/transformation/substitute/index.html @@ -0,0 +1,31 @@ + +substitute · Rocket.jl

      Substitute Operator

      Rocket.substituteFunction
      substitute(::Type{T}, mapFn::F, handler::SubstituteHandler) where { T, F <: Function }

      This operator forces observable to substitute each emmited value with the latest computed value with the corresponding handler and release! function. After release! on handler substitute operator computes new value with mapFn but does not emit it until next emission from source observable. Always calls mapFn on first value from source observable.

      Producing

      Stream of type <: Subscribable{T}

      Examples

      using Rocket
      +
      +subject = Subject(Int)
      +
      +handler = SubstituteHandler()
      +source  = subject |> substitute(String, i -> string("i = ", i), handler)
      +
      +subscription = subscribe!(source, logger())
      +
      +next!(subject, 1)
      +next!(subject, 2)
      +next!(subject, 3)
      +
      +release!(handler)
      +
      +next!(subject, 4)
      +next!(subject, 5)
      +next!(subject, 6)
      +
      +unsubscribe!(subscription)
      +;
      +
      +# output
      +
      +[LogActor] Data: i = 1
      +[LogActor] Data: i = 1
      +[LogActor] Data: i = 1
      +[LogActor] Data: i = 3
      +[LogActor] Data: i = 3
      +[LogActor] Data: i = 3

      See also: SubstituteHandler

      source

      See also

      Operators

      diff --git a/v1.7.4/operators/transformation/switch_map/index.html b/v1.7.4/operators/transformation/switch_map/index.html new file mode 100644 index 000000000..a1549f10b --- /dev/null +++ b/v1.7.4/operators/transformation/switch_map/index.html @@ -0,0 +1,24 @@ + +switch_map · Rocket.jl

      SwitchMap Operator

      Rocket.switch_mapFunction
      switch_map(::Type{R}, mappingFn::F = identity) where { R, F <: Function }

      Creates a switch_map operator, which returns an Observable that emits items based on applying a function mappingFn that you supply to each item emitted by the source Observable, where that function returns an (so-called "inner") Observable. Each time it observes one of these inner Observables, the output Observable begins emitting the items emitted by that inner Observable. When a new inner Observable is emitted, switch_map stops emitting items from the earlier-emitted inner Observable and begins emitting items from the new one. It continues to behave like this for subsequent inner Observables.

      Arguments

      • ::Type{R}: the type of data of output Observables after projection with mappingFn
      • mappingFn::F: projection function with (data) -> Observable{R} signature

      Producing

      Stream of type <: Subscribable{R}

      Examples

      using Rocket
      +
      +source = from([ of(1), of(2), of(3) ])
      +subscribe!(source |> switch_map(Int), logger())
      +;
      +
      +# output
      +
      +[LogActor] Data: 1
      +[LogActor] Data: 2
      +[LogActor] Data: 3
      +[LogActor] Completed
      using Rocket
      +
      +source = from([ 1, 2, 3 ])
      +subscribe!(source |> switch_map(Float64, (d) -> of(convert(Float64, d ^ 2))), logger())
      +;
      +
      +# output
      +
      +[LogActor] Data: 1.0
      +[LogActor] Data: 4.0
      +[LogActor] Data: 9.0
      +[LogActor] Completed

      See also: AbstractOperator, RightTypedOperator, ProxyObservable, logger

      source

      See also

      Operators

      diff --git a/v1.7.4/operators/transformation/switch_map_to/index.html b/v1.7.4/operators/transformation/switch_map_to/index.html new file mode 100644 index 000000000..ebc48c05a --- /dev/null +++ b/v1.7.4/operators/transformation/switch_map_to/index.html @@ -0,0 +1,19 @@ + +switch_map_to · Rocket.jl

      SwitchMapTo Operator

      Rocket.switch_map_toFunction
      switch_map_to(inner_observable)

      Creates a switch_map_to operator, which projects each source value to the same Observable which is flattened multiple times with switch_map in the output Observable.

      Arguments

      • inner_observable: an Observable to replace each value from the source Observable.

      Producing

      Stream of type <: Subscribable{R} where R refers to the eltype of inner_observable

      Examples

      using Rocket
      +
      +source = from([ 0, 0, 0 ])
      +subscribe!(source |> switch_map_to(from([ 1, 2, 3 ])), logger())
      +;
      +
      +# output
      +
      +[LogActor] Data: 1
      +[LogActor] Data: 2
      +[LogActor] Data: 3
      +[LogActor] Data: 1
      +[LogActor] Data: 2
      +[LogActor] Data: 3
      +[LogActor] Data: 1
      +[LogActor] Data: 2
      +[LogActor] Data: 3
      +[LogActor] Completed

      See also: switch_map, AbstractOperator, RightTypedOperator, ProxyObservable, logger

      source
      Note

      switch_map_to is equivalent to switch_map with mappingFn set to (_) -> inner_observable.

      See also

      Operators

      diff --git a/v1.7.4/operators/transformation/to_array/index.html b/v1.7.4/operators/transformation/to_array/index.html new file mode 100644 index 000000000..5283bfc53 --- /dev/null +++ b/v1.7.4/operators/transformation/to_array/index.html @@ -0,0 +1,12 @@ + +to_array · Rocket.jl

      Uppercase Operator

      Rocket.to_arrayFunction
      to_array()

      Creates a to_array operator, which reduces all values into a single array and returns this result when the source completes.

      Producing

      Stream of type <: Subscribable{Vector{L}} where L refers to type of source stream

      Examples

      using Rocket
      +
      +source = from([ 1, 2, 3 ])
      +subscribe!(source |> to_array(), logger())
      +;
      +
      +# output
      +
      +[LogActor] Data: [1, 2, 3]
      +[LogActor] Completed
      +

      See also: AbstractOperator, InferableOperator, ProxyObservable, logger

      source

      See also

      Operators, map, lowercase

      diff --git a/v1.7.4/operators/transformation/uppercase/index.html b/v1.7.4/operators/transformation/uppercase/index.html new file mode 100644 index 000000000..2857855a4 --- /dev/null +++ b/v1.7.4/operators/transformation/uppercase/index.html @@ -0,0 +1,11 @@ + +uppercase · Rocket.jl

      Uppercase Operator

      Base.Unicode.uppercaseFunction
      uppercase()

      Creates an uppercase operator, which forces each value to be in upper case

      Producing

      Stream of type <: Subscribable{L} where L referes to type of data of input Observable

      Examples

      using Rocket
      +
      +source = of("Hello, world!")
      +subscribe!(source |> uppercase(), logger())
      +;
      +
      +# output
      +
      +[LogActor] Data: HELLO, WORLD!
      +[LogActor] Completed

      See also: AbstractOperator, InferableOperator, ProxyObservable, logger

      source

      See also

      Operators, map, lowercase

      diff --git a/v1.7.4/operators/utility/about/index.html b/v1.7.4/operators/utility/about/index.html new file mode 100644 index 000000000..3ae55774a --- /dev/null +++ b/v1.7.4/operators/utility/about/index.html @@ -0,0 +1,2 @@ + +About utility operators · Rocket.jl
      diff --git a/v1.7.4/operators/utility/async/index.html b/v1.7.4/operators/utility/async/index.html new file mode 100644 index 000000000..22d78d2ff --- /dev/null +++ b/v1.7.4/operators/utility/async/index.html @@ -0,0 +1,2 @@ + +async · Rocket.jl
      diff --git a/v1.7.4/operators/utility/default_if_empty/index.html b/v1.7.4/operators/utility/default_if_empty/index.html new file mode 100644 index 000000000..cf36154e6 --- /dev/null +++ b/v1.7.4/operators/utility/default_if_empty/index.html @@ -0,0 +1,21 @@ + +default_if_empty · Rocket.jl

      DefaultIfEmpty Operator

      Rocket.default_if_emptyFunction
      default_if_empty(value::T)
      +default_if_empty(callback::Function)

      Creates a default_if_empty operator, which emits a given value if the source Observable completes without emitting any next value, otherwise mirrors the source Observable. Optionally accepts a zero-argument callback that will be executed to generate default value. Note: Callback function's output is always converted to the eltype of the original observable.

      using Rocket
      +
      +source = completed(Int) |> default_if_empty(0)
      +
      +subscribe!(source, logger())
      +;
      +
      +# output
      +[LogActor] Data: 0
      +[LogActor] Completed
      using Rocket
      +
      +source = completed(Int) |> default_if_empty(() -> 42)
      +
      +subscribe!(source, logger())
      +;
      +
      +# output
      +[LogActor] Data: 42
      +[LogActor] Completed

      See also: AbstractOperator, InferableOperator, logger, map

      source

      Description

      default_if_empty emits the values emitted by the source Observable or a specified default value if the source Observable is empty (completes without having emitted any next value).

      See also

      Operators

      diff --git a/v1.7.4/operators/utility/delay/index.html b/v1.7.4/operators/utility/delay/index.html new file mode 100644 index 000000000..75a15e4b6 --- /dev/null +++ b/v1.7.4/operators/utility/delay/index.html @@ -0,0 +1,17 @@ + +delay · Rocket.jl

      Delay Operator

      Rocket.delayFunction
      delay(delay::Int)

      Creates a delay operator, which delays the emission of items from the source Observable by a given timeout.

      Arguments:

      • delay::Int: the delay duration in milliseconds (a number) until which the emission of the source items is delayed.

      Producing

      Stream of type <: Subscribable{L} where L refers to type of source stream

      See also: AbstractOperator, InferableOperator, ProxyObservable

      source

      Description

      Delays the emission of items from the source Observable by a given timeout

      Example

      Delay every value with 1 second to the output

      using Rocket
      +using Dates
      +
      +source = from([ 1, 2, 3 ])
      +println(Dates.format(now(), "MM:SS"))
      +subscription = subscribe!(source |> delay(2000), lambda(
      +    on_next = (d) -> println("$(Dates.format(now(), "MM:SS")): $d")
      +));
      +
      +# output
      +
      +03:41
      +03:43: 1
      +03:43: 2
      +03:43: 3
      +

      See also

      Operators

      diff --git a/v1.7.4/operators/utility/discontinue/index.html b/v1.7.4/operators/utility/discontinue/index.html new file mode 100644 index 000000000..aaaef6da6 --- /dev/null +++ b/v1.7.4/operators/utility/discontinue/index.html @@ -0,0 +1,13 @@ + +discontinue · Rocket.jl

      Discontinue Operator

      Rocket.discontinueFunction
      discontinue()

      Creates an operator, which prevents an emitting of self-depending messages and breaks a possible infinite loop. Does nothing if observable scheduled asynchronously.

      Producing

      Stream of type <: Subscribable{L} where L refers to type of source stream

      Examples

      using Rocket
      +
      +s = BehaviorSubject(0)
      +
      +subscription1 = subscribe!(s, logger())
      +subscription2 = subscribe!(s |> map(Int, d -> d + 1) |> discontinue(), s)
      +;
      +
      +# output
      +
      +[LogActor] Data: 0
      +[LogActor] Data: 1

      See also: AbstractOperator, RightTypedOperator, ProxyObservable, logger

      source

      See also

      Operators

      diff --git a/v1.7.4/operators/utility/error_if_empty/index.html b/v1.7.4/operators/utility/error_if_empty/index.html new file mode 100644 index 000000000..a2123f13d --- /dev/null +++ b/v1.7.4/operators/utility/error_if_empty/index.html @@ -0,0 +1,10 @@ + +error_if_empty · Rocket.jl

      ErrorIfEmpty Operator

      Rocket.error_if_emptyFunction
      error_if_empty(err)

      Creates a error_if_empty operator, which emits a given error if the source Observable completes without emitting any next value, otherwise mirrors the source Observable.

      using Rocket
      +
      +source = completed(Int) |> error_if_empty("Empty")
      +
      +subscribe!(source, logger())
      +;
      +
      +# output
      +[LogActor] Error: Empty

      See also: AbstractOperator, InferableOperator, logger, map

      source

      Description

      error_if_empty emits the values emitted by the source Observable or a specified error message if the source Observable is empty (completes without having emitted any next value).

      See also

      Operators

      diff --git a/v1.7.4/operators/utility/limit_subscribers/index.html b/v1.7.4/operators/utility/limit_subscribers/index.html new file mode 100644 index 000000000..d1cb921c7 --- /dev/null +++ b/v1.7.4/operators/utility/limit_subscribers/index.html @@ -0,0 +1,13 @@ + +limit_subscribers · Rocket.jl

      LimitSubscribers Operator

      Rocket.LimitSubscribersGuardType
      LimitSubscribersGuard(limit::Int = 1, exclusive = true)

      Guard structure used in limit_subscribers operator.

      Arguments

      • limit: number of concurrent subscribers
      • exclusive: boolean flag, which indicates whenever this guard can be shared with other observables in other limit_subscribers operator. If set to true, reusing this guard in a different limit_subscribers operator for other observable will result in automatic unsubscription of all present actors.

      Note

      This structure is useful in Pluto.jl notebooks in particular, allowing for automatic subscription/unsubscription of observables.

      Example

      
      +# Cell 1
      +guard = LimitSubscribersGuard()
      +
      +# Cell 2
      +subscription = subscribe!(some_stream |> limit_subscribers(guard), logger())

      See also: limit_subscribers, subscribe!

      source
      Rocket.limit_subscribersFunction
      limit_subscribers(limit::Int = 1, exclusive::Bool = true)
      +limit_subscribers(guard::LimitSubscribersGuard)

      Creates an operator that limits number of concurrent actors to the given observable. On new subscription, if limit is exceeded, oldest actor is automatically unsubscribed and receives a completion event.

      Arguments

      • limit: number of concurrent subscribers
      • exclusive: boolean flag, which indicates whenever this guard can be shared with other observables in other limit_subscribers operator. If set to true, reusing this guard in a different limit_subscribers operator for other observable will result in automatic unsubscription of all present actors.

      Note

      This structure is useful in Pluto.jl notebooks in particular, allowing for automatic subscription/unsubscription of observables.

      Example

      
      +# Cell 1
      +guard = LimitSubscribersGuard()
      +
      +# Cell 2
      +subscription = subscribe!(some_stream |> limit_subscribers(guard), logger())

      See also: LimitSubscribersGuard

      source

      See also

      Operators

      diff --git a/v1.7.4/operators/utility/noop/index.html b/v1.7.4/operators/utility/noop/index.html new file mode 100644 index 000000000..5165056b5 --- /dev/null +++ b/v1.7.4/operators/utility/noop/index.html @@ -0,0 +1,25 @@ + +noop · Rocket.jl

      Noop Operator

      Rocket.noopFunction
      noop()

      Creates a noop operator, which does nothing, but breaks operator composition type inference checking procedure for Julia's compiler. It might be useful for very long chain of operators, because Julia tries to statically infer data types at compile-time for the whole chain and can run into StackOverflow issues.

      using Rocket
      +
      +# foo() block to enforce local scope for scope variable
      +function foo()
      +    source = from(1:5)
      +
      +    for i in 1:1000
      +        source = source |> map(Int, d -> d + 1) |> noop()
      +    end
      +
      +    subscribe!(source, logger())
      +end
      +
      +foo()
      +;
      +
      +# output
      +
      +[LogActor] Data: 1001
      +[LogActor] Data: 1002
      +[LogActor] Data: 1003
      +[LogActor] Data: 1004
      +[LogActor] Data: 1005
      +[LogActor] Completed

      See also: AbstractOperator, InferableOperator, logger, map

      source

      See also

      Operators

      diff --git a/v1.7.4/operators/utility/ref_count/index.html b/v1.7.4/operators/utility/ref_count/index.html new file mode 100644 index 000000000..6e46dbd51 --- /dev/null +++ b/v1.7.4/operators/utility/ref_count/index.html @@ -0,0 +1,24 @@ + +ref_count · Rocket.jl

      Ref Count Operator

      Rocket.ref_countFunction
      ref_count()

      Make a ConnectableObservable behave like a ordinary observable and automates the way you can connect to it. Internally it counts the subscriptions to the observable and subscribes (only once) to the source if the number of subscriptions is larger than 0. If the number of subscriptions is smaller than 1, it unsubscribes from the source. This way you can make sure that everything before the published refCount has only a single subscription independently of the number of subscribers to the target observable.

      Note that using the share operator is exactly the same as using the publish operator (making the observable hot) and the ref_count() operator in a sequence.

      Example

      using Rocket
      +
      +subject = Subject(Int, scheduler = AsapScheduler())
      +source  = from(1:5) |> multicast(subject) |> ref_count()
      +
      +actor1 = logger("1")
      +actor2 = logger("2")
      +
      +subscription1 = subscribe!(source, actor1)
      +subscription2 = subscribe!(source, actor2)
      +
      +unsubscribe!(subscription1)
      +unsubscribe!(subscription2)
      +;
      +
      +# output
      +[1] Data: 1
      +[1] Data: 2
      +[1] Data: 3
      +[1] Data: 4
      +[1] Data: 5
      +[1] Completed
      +[2] Completed

      See also: AbstractOperator, publish, multicast, share

      source

      See also

      Operators

      diff --git a/v1.7.4/operators/utility/safe/index.html b/v1.7.4/operators/utility/safe/index.html new file mode 100644 index 000000000..333a0b159 --- /dev/null +++ b/v1.7.4/operators/utility/safe/index.html @@ -0,0 +1,2 @@ + +safe · Rocket.jl
      diff --git a/v1.7.4/operators/utility/skip_complete/index.html b/v1.7.4/operators/utility/skip_complete/index.html new file mode 100644 index 000000000..2bf80607d --- /dev/null +++ b/v1.7.4/operators/utility/skip_complete/index.html @@ -0,0 +1,12 @@ + +skip_complete · Rocket.jl

      SkipComplete Operator

      Rocket.skip_completeFunction
      skip_complete()

      Creates a skip_complete operator, which filters out complete event by the source Observable by emitting only next and error messages.

      Producing

      Stream of type <: Subscribable{L} where L refers to type of source stream

      Examples

      using Rocket
      +
      +source = from([ 1, 2, 3 ])
      +subscribe!(source |> skip_complete(), logger())
      +;
      +
      +# output
      +[LogActor] Data: 1
      +[LogActor] Data: 2
      +[LogActor] Data: 3
      +

      See also: AbstractOperator, InferableOperator, ProxyObservable, skip_error, skip_next, logger

      source

      See also

      Operators

      diff --git a/v1.7.4/operators/utility/skip_error/index.html b/v1.7.4/operators/utility/skip_error/index.html new file mode 100644 index 000000000..650b0f909 --- /dev/null +++ b/v1.7.4/operators/utility/skip_error/index.html @@ -0,0 +1,9 @@ + +skip_error · Rocket.jl

      SkipError Operator

      See also

      Operators

      diff --git a/v1.7.4/operators/utility/skip_next/index.html b/v1.7.4/operators/utility/skip_next/index.html new file mode 100644 index 000000000..cb9bbc792 --- /dev/null +++ b/v1.7.4/operators/utility/skip_next/index.html @@ -0,0 +1,10 @@ + +skip_next · Rocket.jl

      SkipNext Operator

      Rocket.skip_nextFunction
      skip_next()

      Creates a skip_next operator, which filters out all next messages by the source Observable by emitting only error and complete messages.

      Producing

      Stream of type <: Subscribable{L} where L refers to type of source stream

      Examples

      using Rocket
      +
      +source = from([ 1, 2, 3 ])
      +subscribe!(source |> skip_next(), logger())
      +;
      +
      +# output
      +[LogActor] Completed
      +

      See also: AbstractOperator, InferableOperator, ProxyObservable, skip_error, skip_complete, logger

      source

      See also

      Operators

      diff --git a/v1.7.4/operators/utility/tap/index.html b/v1.7.4/operators/utility/tap/index.html new file mode 100644 index 000000000..82ffe00fc --- /dev/null +++ b/v1.7.4/operators/utility/tap/index.html @@ -0,0 +1,17 @@ + +tap · Rocket.jl

      Tap Operator

      Rocket.tapFunction
      tap(tapFn::F) where { F <: Function }

      Creates a tap operator, which performs a side effect for every emission on the source Observable, but return an Observable that is identical to the source.

      Arguments

      • tapFn::Function: side-effect tap function with (data) -> Nothing signature

      Producing

      Stream of type <: Subscribable{L} where L refers to type of source stream

      Examples

      using Rocket
      +
      +source = from([ 1, 2, 3 ])
      +subscribe!(source |> tap((d) -> println("In tap: $d")), logger())
      +;
      +
      +# output
      +
      +In tap: 1
      +[LogActor] Data: 1
      +In tap: 2
      +[LogActor] Data: 2
      +In tap: 3
      +[LogActor] Data: 3
      +[LogActor] Completed
      +

      See also: tap_on_subscribe, tap_on_complete, logger

      source

      Description

      Returns an Observable that resembles the source Observable, but modifies it so that the provided Observer is called to perform a side effect for every value emitted by the source.

      This operator is useful for debugging your Observables, verifying correct values, or performing other side effects.

      Note: this operator differs from a subscribe on the Observable. If the Observable returned by tap is not subscribed, the side effects specified by the Observer will never happen. tap therefore simply spies on existing execution, it does not trigger an execution to happen like subscribe does.

      See also

      Operators

      diff --git a/v1.7.4/operators/utility/tap_on_complete/index.html b/v1.7.4/operators/utility/tap_on_complete/index.html new file mode 100644 index 000000000..ec6645628 --- /dev/null +++ b/v1.7.4/operators/utility/tap_on_complete/index.html @@ -0,0 +1,15 @@ + +tap_on_complete · Rocket.jl

      TapOnComplete Operator

      Rocket.tap_on_completeFunction
      tap_on_complete(tapFn::F) where { F <: Function }

      Creates a tap operator, which performs a side effect for only complete emission on the source Observable, but return an Observable that is identical to the source.

      Arguments

      • tapFn::Function: side-effect tap function with () -> Nothing signature

      Producing

      Stream of type <: Subscribable{L} where L refers to type of source stream

      Examples

      using Rocket
      +
      +source = from([ 1, 2, 3 ])
      +subscribe!(source |> tap_on_complete(() -> println("Complete event received")), logger())
      +;
      +
      +# output
      +
      +[LogActor] Data: 1
      +[LogActor] Data: 2
      +[LogActor] Data: 3
      +[LogActor] Completed
      +Complete event received
      +

      See also: tap_on_subscribe, tap, logger

      source

      Description

      Returns an Observable that resembles the source Observable, but modifies it so that the provided Observer is called to perform a side effect on complete event emission by the source.

      This operator is useful for debugging your Observables, verifying correctness, or performing other side effects.

      Note: this operator differs from a subscribe on the Observable. If the Observable returned by tap_on_complete is not subscribed, the side effects specified by the Observer will never happen. tap_on_complete therefore simply spies on future execution, it does not trigger an execution to happen like subscribe does.

      See also

      Operators

      diff --git a/v1.7.4/operators/utility/tap_on_subscribe/index.html b/v1.7.4/operators/utility/tap_on_subscribe/index.html new file mode 100644 index 000000000..b334b7034 --- /dev/null +++ b/v1.7.4/operators/utility/tap_on_subscribe/index.html @@ -0,0 +1,26 @@ + +tap_on_subscribe · Rocket.jl

      TapOnSubscribe Operator

      Rocket.tap_on_subscribeFunction
      tap_on_subscribe(tapFn::F, strategy::S = TapBeforeSubscription()) where { F <: Function }

      Creates a tap operator, which performs a side effect on the subscription on the source Observable, but return an Observable that is identical to the source.

      Arguments

      • tapFn::Function: side-effect tap function with () -> Nothing signature
      • strategy: (optional), specifies the order of a side-effect and an actual subscription, uses TapBeforeSubscription by default

      Producing

      Stream of type <: Subscribable{L} where L refers to type of source stream

      Examples

      using Rocket
      +
      +source = from([ 1, 2, 3 ])
      +subscribe!(source |> tap_on_subscribe(() -> println("Someone subscribed")), logger())
      +;
      +
      +# output
      +
      +Someone subscribed
      +[LogActor] Data: 1
      +[LogActor] Data: 2
      +[LogActor] Data: 3
      +[LogActor] Completed
      using Rocket
      +
      +source = from([ 1, 2, 3 ])
      +subscribe!(source |> tap_on_subscribe(() -> println("Someone subscribed"), TapAfterSubscription()), logger())
      +;
      +
      +# output
      +
      +[LogActor] Data: 1
      +[LogActor] Data: 2
      +[LogActor] Data: 3
      +[LogActor] Completed
      +Someone subscribed

      See also: TapBeforeSubscription, TapAfterSubscription, tap, tap_on_unsubscribe, tap_on_complete, logger

      source

      Description

      Returns an Observable that resembles the source Observable, but modifies it so that the provided Observer is called to perform a side effect on subscription to the source.

      This operator is useful for debugging your Observables, verifying correctness, or performing other side effects.

      Note: this operator differs from a subscribe on the Observable. If the Observable returned by tap_on_subscribe is not subscribed, the side effects specified by the Observer will never happen. tap_on_subscribe therefore simply spies on future execution, it does not trigger an execution to happen like subscribe does.

      See also

      Operators

      diff --git a/v1.7.4/operators/utility/tap_on_unsubscribe/index.html b/v1.7.4/operators/utility/tap_on_unsubscribe/index.html new file mode 100644 index 000000000..fe2832927 --- /dev/null +++ b/v1.7.4/operators/utility/tap_on_unsubscribe/index.html @@ -0,0 +1,15 @@ + +tap_on_unsubscribe · Rocket.jl

      TapOnUnsubscribe Operator

      Rocket.tap_on_unsubscribeFunction
      tap_on_unsubscribe(tapFn::F, strategy::S = TapBeforeUnsubscription()) where { F <: Function }

      Creates a tap operator, which performs a side effect on the unsubscription on the source Observable, but return an Observable that is identical to the source. Tap callback triggers only once.

      Arguments

      • tapFn::Function: side-effect tap function with () -> Nothing signature
      • strategy: (optional), specifies the order of a side-effect and an actual unsubscription, uses TapBeforeUnsubscription by default

      Producing

      Stream of type <: Subscribable{L} where L refers to type of source stream

      Examples

      using Rocket
      +
      +source = from([ 1, 2, 3 ])
      +subscription = subscribe!(source |> tap_on_unsubscribe(() -> println("Someone unsubscribed")), logger())
      +unsubscribe!(subscription)
      +;
      +
      +# output
      +
      +[LogActor] Data: 1
      +[LogActor] Data: 2
      +[LogActor] Data: 3
      +[LogActor] Completed
      +Someone unsubscribed

      See also: TapBeforeUnsubscription, TapAfterUnsubscription, tap, tap_on_subscribe, tap_on_complete, logger

      source

      Description

      Returns an Observable that resembles the source Observable, but modifies it so that the provided Observer is called to perform a side effect on unsubscription from the source.

      This operator is useful for debugging your Observables, verifying correctness, or performing other side effects.

      See also

      Operators

      diff --git a/v1.7.4/search_index.js b/v1.7.4/search_index.js new file mode 100644 index 000000000..b82711f2e --- /dev/null +++ b/v1.7.4/search_index.js @@ -0,0 +1,3 @@ +var documenterSearchIndex = {"docs": +[{"location":"operators/utility/skip_complete/#operator_skip_complete","page":"skip_complete","title":"SkipComplete Operator","text":"","category":"section"},{"location":"operators/utility/skip_complete/","page":"skip_complete","title":"skip_complete","text":"skip_complete","category":"page"},{"location":"operators/utility/skip_complete/#Rocket.skip_complete","page":"skip_complete","title":"Rocket.skip_complete","text":"skip_complete()\n\nCreates a skip_complete operator, which filters out complete event by the source Observable by emitting only next and error messages.\n\nProducing\n\nStream of type <: Subscribable{L} where L refers to type of source stream\n\nExamples\n\nusing Rocket\n\nsource = from([ 1, 2, 3 ])\nsubscribe!(source |> skip_complete(), logger())\n;\n\n# output\n[LogActor] Data: 1\n[LogActor] Data: 2\n[LogActor] Data: 3\n\n\nSee also: AbstractOperator, InferableOperator, ProxyObservable, skip_error, skip_next, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/utility/skip_complete/#See-also","page":"skip_complete","title":"See also","text":"","category":"section"},{"location":"operators/utility/skip_complete/","page":"skip_complete","title":"skip_complete","text":"Operators","category":"page"},{"location":"operators/transformation/start_with/#operator_start_with","page":"start_with","title":"StartWith Operator","text":"","category":"section"},{"location":"operators/transformation/start_with/","page":"start_with","title":"start_with","text":"start_with","category":"page"},{"location":"operators/transformation/start_with/#Rocket.start_with","page":"start_with","title":"Rocket.start_with","text":"start_with(object::O) where O\n\nCreates a start_with operator, which forces an observable to emit given object as a first value.\n\nProducing\n\nStream of type <: Subscribable{Union{L, O}} where L refers to type of source stream <: Subscribable{L}\n\nExamples\n\nusing Rocket\n\nsource = from(1:3) |> start_with(0)\nsubscribe!(source, logger())\n;\n\n# output\n\n[LogActor] Data: 0\n[LogActor] Data: 1\n[LogActor] Data: 2\n[LogActor] Data: 3\n[LogActor] Completed\n\nSee also: AbstractOperator, InferableOperator, ProxyObservable, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/transformation/start_with/#See-also","page":"start_with","title":"See also","text":"","category":"section"},{"location":"operators/transformation/start_with/","page":"start_with","title":"start_with","text":"Operators","category":"page"},{"location":"actors/types/server/#actor_server","page":"Server","title":"Server actor","text":"","category":"section"},{"location":"actors/types/server/","page":"Server","title":"Server","text":"server","category":"page"},{"location":"actors/types/server/#Rocket.server","page":"Server","title":"Rocket.server","text":"server(port::Int)\nserver(address::A, port::Int) where { A <: IPAddr }\nserver(::Type{D}, port::Int)\nserver(::Type{D}, address::A, port::Int) where { A <: IPAddr }\n\nCreation operator for the ServerActor actor.\n\nSee also: AbstractActor\n\n\n\n\n\n","category":"function"},{"location":"actors/types/server/","page":"Server","title":"Server","text":"ServerActor","category":"page"},{"location":"actors/types/server/#Rocket.ServerActor","page":"Server","title":"Rocket.ServerActor","text":"ServerActor{D, Address, Port}() where D\n\nThe ServerActor sends all next!/error!/complete! events to the local network listeners with specified Address and Port parameters via TCPSocket.\n\nSee also: Actor, server\n\n\n\n\n\n","category":"type"},{"location":"operators/transformation/exhaust_map/#operator_exhaust_map","page":"exhaust_map","title":"ExhaustMap Operator","text":"","category":"section"},{"location":"operators/transformation/exhaust_map/","page":"exhaust_map","title":"exhaust_map","text":"exhaust_map","category":"page"},{"location":"operators/transformation/exhaust_map/#Rocket.exhaust_map","page":"exhaust_map","title":"Rocket.exhaust_map","text":"exhaust_map(::Type{R}, mappingFn::F = identity) where { R, F <: Function }\n\nCreates a exhaust_map operator, which returns an Observable containing projected Observables of each item of the source, ignoring projected Observables that start before their preceding Observable has completed. Essentially it projects each source value to an Observable which is merged in the output Observable only if the previous projected Observable has completed.\n\nArguments\n\n::Type{R}: the type of data of output Observables after projection with mappingFn\nmappingFn::F: projection function with (data) -> Observable{R} signature\n\nProducing\n\nStream of type <: Subscribable{R}\n\nExamples\n\nusing Rocket\n\nsource = from([ 0, 0 ]) |> async() |> exhaust_map(Int, d -> from([ 1, 2 ]) |> async())\nsubscribe!(source, logger())\n;\n\n# output\n\n[LogActor] Data: 1\n[LogActor] Data: 2\n[LogActor] Completed\n\nSee also: AbstractOperator, RightTypedOperator, ProxyObservable, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/transformation/exhaust_map/#See-also","page":"exhaust_map","title":"See also","text":"","category":"section"},{"location":"operators/transformation/exhaust_map/","page":"exhaust_map","title":"exhaust_map","text":"Operators","category":"page"},{"location":"operators/utility/ref_count/#operator_ref_count","page":"ref_count","title":"Ref Count Operator","text":"","category":"section"},{"location":"operators/utility/ref_count/","page":"ref_count","title":"ref_count","text":"ref_count","category":"page"},{"location":"operators/utility/ref_count/#Rocket.ref_count","page":"ref_count","title":"Rocket.ref_count","text":"ref_count()\n\nMake a ConnectableObservable behave like a ordinary observable and automates the way you can connect to it. Internally it counts the subscriptions to the observable and subscribes (only once) to the source if the number of subscriptions is larger than 0. If the number of subscriptions is smaller than 1, it unsubscribes from the source. This way you can make sure that everything before the published refCount has only a single subscription independently of the number of subscribers to the target observable.\n\nNote that using the share operator is exactly the same as using the publish operator (making the observable hot) and the ref_count() operator in a sequence.\n\nExample\n\nusing Rocket\n\nsubject = Subject(Int, scheduler = AsapScheduler())\nsource = from(1:5) |> multicast(subject) |> ref_count()\n\nactor1 = logger(\"1\")\nactor2 = logger(\"2\")\n\nsubscription1 = subscribe!(source, actor1)\nsubscription2 = subscribe!(source, actor2)\n\nunsubscribe!(subscription1)\nunsubscribe!(subscription2)\n;\n\n# output\n[1] Data: 1\n[1] Data: 2\n[1] Data: 3\n[1] Data: 4\n[1] Data: 5\n[1] Completed\n[2] Completed\n\nSee also: AbstractOperator, publish, multicast, share\n\n\n\n\n\n","category":"function"},{"location":"operators/utility/ref_count/#See-also","page":"ref_count","title":"See also","text":"","category":"section"},{"location":"operators/utility/ref_count/","page":"ref_count","title":"ref_count","text":"Operators","category":"page"},{"location":"actors/types/keep/#actor_keep","page":"Keep","title":"Keep actor","text":"","category":"section"},{"location":"actors/types/keep/","page":"Keep","title":"Keep","text":"keep","category":"page"},{"location":"actors/types/keep/#Rocket.keep","page":"Keep","title":"Rocket.keep","text":"keep(::Type{T}) where T\n\nArguments\n\n::Type{T}: Type of keep data\n\nCreation operator for the KeepActor actor.\n\nExamples\n\nusing Rocket\n\nactor = keep(Int)\nactor isa KeepActor{Int}\n\n# output\ntrue\n\nSee also: KeepActor, AbstractActor\n\n\n\n\n\n","category":"function"},{"location":"actors/types/keep/","page":"Keep","title":"Keep","text":"KeepActor","category":"page"},{"location":"actors/types/keep/#Rocket.KeepActor","page":"Keep","title":"Rocket.KeepActor","text":"KeepActor{D}() where D\n\nKeep actor provides a storage actor. It saves all incoming successful next events in a values array, throws an ErrorException on error! event and does nothing on completion event.\n\nExamples\n\nusing Rocket\n\nsource = from(1:5)\nactor = keep(Int)\n\nsubscribe!(source, actor)\nshow(getvalues(actor))\n\n# output\n[1, 2, 3, 4, 5]\n\nSee also: Actor, keep\n\n\n\n\n\n","category":"type"},{"location":"observables/types/collected/#observable_collected","page":"Collected","title":"Collected Observable","text":"","category":"section"},{"location":"observables/types/collected/","page":"Collected","title":"Collected","text":"collectLatest","category":"page"},{"location":"observables/types/collected/#Rocket.collectLatest","page":"Collected","title":"Rocket.collectLatest","text":"collectLatest(sources::S, mappingFn::F = copy) where { S, F }\ncollectLatest(::Type{T}, ::Type{R}, sources::S, mappingFn::F = copy)\n\nCollects values from multible Observables and emits it in one single array every time each inner Observable has a new value. Reemits errors from inner observables. Completes when all inner observables completes.\n\nArguments\n\nsources: input sources\nmappingFn: optional mappingFn applied to an array of emited values, copy by default, should return a Vector\n\nNote: collectLatest completes immediately if sources are empty.\n\nOptional arguments\n\n::Type{T}: optional type of emmiting values of inner observables\n::Type{R}: optional return type after applying mappingFn to a vector of values\n\nExamples\n\nusing Rocket\n\ncollected = collectLatest([ of(1), from([ 1, 2 ]) ])\n\nsubscribe!(collected, logger())\n;\n\n# output\n\n[LogActor] Data: [1, 1]\n[LogActor] Data: [1, 2]\n[LogActor] Completed\n\nSee also: Subscribable, subscribe!, combineLatest\n\n\n\n\n\n","category":"function"},{"location":"observables/types/collected/#Description","page":"Collected","title":"Description","text":"","category":"section"},{"location":"observables/types/collected/","page":"Collected","title":"Collected","text":"collectLatest collects the values from all Observables in its vector argument. This is done by subscribing to each Observable in order and, whenever an Observable emits, collecting a vector of the most recent values from each Observable (in order). If you pass n Observables to collectLatest, the returned Observable will always emit an ordered vector of n values.","category":"page"},{"location":"observables/types/collected/","page":"Collected","title":"Collected","text":"To ensure that the output vector has a consistent length, collectLatest waits for all input Observables to emit at least once before it starts emitting results. This means that if some Observable emits values before other Observables started emitting, all these values but the last will be lost. On the other hand, if some Observable does not emit a value but completes, the resulting Observable will complete simultaneously without emitting anything. Furthermore, if some input Observable does not emit any value and never completes, collectLatest will also never emit and never complete.","category":"page"},{"location":"observables/types/collected/","page":"Collected","title":"Collected","text":"If at least one Observable was passed to collectLatest and all passed Observables emitted, then the resulting Observable will complete when all combined streams complete. So even if some Observable completes, the result of collectLatest will still emit values when the other Observables do. In case of a completed Observable, its value will now remain to be the last emitted value. On the other hand, if any Observable errors, collectLatest will also immediately error.","category":"page"},{"location":"observables/types/defer/#observable_defer","page":"Defer","title":"Defer Observable","text":"","category":"section"},{"location":"observables/types/defer/","page":"Defer","title":"Defer","text":"defer","category":"page"},{"location":"observables/types/defer/#Rocket.defer","page":"Defer","title":"Rocket.defer","text":"defer(::Type{D}, factoryFn::F) where { D, F <: Function }\n\nCreates an Observable that, on subscribe, calls an Observable factory to make an Observable for each new Observer.\n\nArguments\n\nT: type of output data source, created by the factoryFn\nfactoryFn: the Observable factory function to invoke for each Observer that subscribes to the output Observable\n\nExamples\n\nusing Rocket\n\nsource = defer(Int, () -> from([ 1, 2, 3 ]))\n\nsubscribe!(source, logger())\n;\n\n# output\n[LogActor] Data: 1\n[LogActor] Data: 2\n[LogActor] Data: 3\n[LogActor] Completed\n\nSee also: Subscribable, subscribe!, logger\n\n\n\n\n\n","category":"function"},{"location":"observables/types/defer/#Description","page":"Defer","title":"Description","text":"","category":"section"},{"location":"observables/types/defer/","page":"Defer","title":"Defer","text":"defer allows you to create the Observable only when the Actor subscribes, and create a fresh Observable for each Actor. It waits until an Actor subscribes to it, and then it generates an Observable, typically with an Observable factory function. It does this afresh for each subscriber, so although each subscriber may think it is subscribing to the same Observable, in fact each subscriber gets its own individual Observable.","category":"page"},{"location":"operators/filtering/last/#operator_last","page":"last","title":"Last Operator","text":"","category":"section"},{"location":"operators/filtering/last/","page":"last","title":"last","text":"last","category":"page"},{"location":"operators/filtering/last/#Base.last","page":"last","title":"Base.last","text":"last(; default = nothing)\n\nCreates a last operator, which returns an Observable that emits only the last item emitted by the source Observable. Sends LastNotFoundException error message if a given source completes without emitting a single value.\n\nArguments\n\ndefault: an optional default value to provide if no values were emitted\n\nProducing\n\nStream of type <: Subscribable{L} where L refers to type of source stream\n\nExamples\n\nusing Rocket\n\nsource = from([ 1, 2, 3 ])\nsubscribe!(source |> last(), logger())\n;\n\n# output\n\n[LogActor] Data: 3\n[LogActor] Completed\n\n\nusing Rocket\n\nsource = from(Int[])\nsubscribe!(source |> last() |> catch_error((err, obs) -> of(1)), logger())\n;\n\n# output\n\n[LogActor] Data: 1\n[LogActor] Completed\n\nusing Rocket\n\nsource = from(Int[])\nsubscribe!(source |> last(default = 1), logger())\n;\n\n# output\n\n[LogActor] Data: 1\n[LogActor] Completed\n\nSee also: AbstractOperator, InferableOperator, ProxyObservable, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/filtering/last/#Description","page":"last","title":"Description","text":"","category":"section"},{"location":"operators/filtering/last/","page":"last","title":"last","text":"last operator returns an Observable that emits only the last item emitted by the source Observable.","category":"page"},{"location":"operators/filtering/last/#See-also","page":"last","title":"See also","text":"","category":"section"},{"location":"operators/filtering/last/","page":"last","title":"last","text":"Operators","category":"page"},{"location":"operators/utility/tap_on_subscribe/#operator_tap_on_subscribe","page":"tap_on_subscribe","title":"TapOnSubscribe Operator","text":"","category":"section"},{"location":"operators/utility/tap_on_subscribe/","page":"tap_on_subscribe","title":"tap_on_subscribe","text":"TapBeforeSubscription\nTapAfterSubscription\ntap_on_subscribe","category":"page"},{"location":"operators/utility/tap_on_subscribe/#Rocket.TapBeforeSubscription","page":"tap_on_subscribe","title":"Rocket.TapBeforeSubscription","text":"TapBeforeSubscription\n\nOne of the strategies for tap_on_subscribe operator. With TapBeforeSubscription tap callback will be called before actual subscription.\n\nSee also: tap_on_subscribe, TapAfterSubscription\n\n\n\n\n\n","category":"type"},{"location":"operators/utility/tap_on_subscribe/#Rocket.TapAfterSubscription","page":"tap_on_subscribe","title":"Rocket.TapAfterSubscription","text":"TapAfterSubscription\n\nOne of the strategies for tap_on_subscribe operator. With TapBeforeSubscription tap callback will be called after actual subscription.\n\nSee also: tap_on_subscribe, TapBeforeSubscription\n\n\n\n\n\n","category":"type"},{"location":"operators/utility/tap_on_subscribe/#Rocket.tap_on_subscribe","page":"tap_on_subscribe","title":"Rocket.tap_on_subscribe","text":"tap_on_subscribe(tapFn::F, strategy::S = TapBeforeSubscription()) where { F <: Function }\n\nCreates a tap operator, which performs a side effect on the subscription on the source Observable, but return an Observable that is identical to the source.\n\nArguments\n\ntapFn::Function: side-effect tap function with () -> Nothing signature\nstrategy: (optional), specifies the order of a side-effect and an actual subscription, uses TapBeforeSubscription by default\n\nProducing\n\nStream of type <: Subscribable{L} where L refers to type of source stream\n\nExamples\n\nusing Rocket\n\nsource = from([ 1, 2, 3 ])\nsubscribe!(source |> tap_on_subscribe(() -> println(\"Someone subscribed\")), logger())\n;\n\n# output\n\nSomeone subscribed\n[LogActor] Data: 1\n[LogActor] Data: 2\n[LogActor] Data: 3\n[LogActor] Completed\n\nusing Rocket\n\nsource = from([ 1, 2, 3 ])\nsubscribe!(source |> tap_on_subscribe(() -> println(\"Someone subscribed\"), TapAfterSubscription()), logger())\n;\n\n# output\n\n[LogActor] Data: 1\n[LogActor] Data: 2\n[LogActor] Data: 3\n[LogActor] Completed\nSomeone subscribed\n\nSee also: TapBeforeSubscription, TapAfterSubscription, tap, tap_on_unsubscribe, tap_on_complete, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/utility/tap_on_subscribe/#Description","page":"tap_on_subscribe","title":"Description","text":"","category":"section"},{"location":"operators/utility/tap_on_subscribe/","page":"tap_on_subscribe","title":"tap_on_subscribe","text":"Returns an Observable that resembles the source Observable, but modifies it so that the provided Observer is called to perform a side effect on subscription to the source.","category":"page"},{"location":"operators/utility/tap_on_subscribe/","page":"tap_on_subscribe","title":"tap_on_subscribe","text":"This operator is useful for debugging your Observables, verifying correctness, or performing other side effects.","category":"page"},{"location":"operators/utility/tap_on_subscribe/","page":"tap_on_subscribe","title":"tap_on_subscribe","text":"Note: this operator differs from a subscribe on the Observable. If the Observable returned by tap_on_subscribe is not subscribed, the side effects specified by the Observer will never happen. tap_on_subscribe therefore simply spies on future execution, it does not trigger an execution to happen like subscribe does.","category":"page"},{"location":"operators/utility/tap_on_subscribe/#See-also","page":"tap_on_subscribe","title":"See also","text":"","category":"section"},{"location":"operators/utility/tap_on_subscribe/","page":"tap_on_subscribe","title":"tap_on_subscribe","text":"Operators","category":"page"},{"location":"operators/utility/safe/#operator_safe","page":"safe","title":"Safe Operator","text":"","category":"section"},{"location":"operators/utility/safe/","page":"safe","title":"safe","text":"safe","category":"page"},{"location":"operators/utility/safe/#Rocket.safe","page":"safe","title":"Rocket.safe","text":"safe()\n\nCreates a SafeOperator, which wraps on_subscribe! and each next!, error! and complete! callbacks into try-catch block.\n\nProducing\n\nStream of type <: Subscribable{L} where L refers to type of source stream\n\nSee also: AbstractOperator, InferableOperator, ProxyObservable, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/utility/safe/#See-also","page":"safe","title":"See also","text":"","category":"section"},{"location":"operators/utility/safe/","page":"safe","title":"safe","text":"Operators","category":"page"},{"location":"operators/utility/skip_next/#operator_skip_next","page":"skip_next","title":"SkipNext Operator","text":"","category":"section"},{"location":"operators/utility/skip_next/","page":"skip_next","title":"skip_next","text":"skip_next","category":"page"},{"location":"operators/utility/skip_next/#Rocket.skip_next","page":"skip_next","title":"Rocket.skip_next","text":"skip_next()\n\nCreates a skip_next operator, which filters out all next messages by the source Observable by emitting only error and complete messages.\n\nProducing\n\nStream of type <: Subscribable{L} where L refers to type of source stream\n\nExamples\n\nusing Rocket\n\nsource = from([ 1, 2, 3 ])\nsubscribe!(source |> skip_next(), logger())\n;\n\n# output\n[LogActor] Completed\n\n\nSee also: AbstractOperator, InferableOperator, ProxyObservable, skip_error, skip_complete, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/utility/skip_next/#See-also","page":"skip_next","title":"See also","text":"","category":"section"},{"location":"operators/utility/skip_next/","page":"skip_next","title":"skip_next","text":"Operators","category":"page"},{"location":"operators/transformation/switch_map/#operator_switch_map","page":"switch_map","title":"SwitchMap Operator","text":"","category":"section"},{"location":"operators/transformation/switch_map/","page":"switch_map","title":"switch_map","text":"switch_map","category":"page"},{"location":"operators/transformation/switch_map/#Rocket.switch_map","page":"switch_map","title":"Rocket.switch_map","text":"switch_map(::Type{R}, mappingFn::F = identity) where { R, F <: Function }\n\nCreates a switch_map operator, which returns an Observable that emits items based on applying a function mappingFn that you supply to each item emitted by the source Observable, where that function returns an (so-called \"inner\") Observable. Each time it observes one of these inner Observables, the output Observable begins emitting the items emitted by that inner Observable. When a new inner Observable is emitted, switch_map stops emitting items from the earlier-emitted inner Observable and begins emitting items from the new one. It continues to behave like this for subsequent inner Observables.\n\nArguments\n\n::Type{R}: the type of data of output Observables after projection with mappingFn\nmappingFn::F: projection function with (data) -> Observable{R} signature\n\nProducing\n\nStream of type <: Subscribable{R}\n\nExamples\n\nusing Rocket\n\nsource = from([ of(1), of(2), of(3) ])\nsubscribe!(source |> switch_map(Int), logger())\n;\n\n# output\n\n[LogActor] Data: 1\n[LogActor] Data: 2\n[LogActor] Data: 3\n[LogActor] Completed\n\nusing Rocket\n\nsource = from([ 1, 2, 3 ])\nsubscribe!(source |> switch_map(Float64, (d) -> of(convert(Float64, d ^ 2))), logger())\n;\n\n# output\n\n[LogActor] Data: 1.0\n[LogActor] Data: 4.0\n[LogActor] Data: 9.0\n[LogActor] Completed\n\nSee also: AbstractOperator, RightTypedOperator, ProxyObservable, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/transformation/switch_map/#See-also","page":"switch_map","title":"See also","text":"","category":"section"},{"location":"operators/transformation/switch_map/","page":"switch_map","title":"switch_map","text":"Operators","category":"page"},{"location":"api/actors/#actors_api","page":"Actors","title":"Actors API","text":"","category":"section"},{"location":"api/actors/#How-to-create-a-custom-Actor","page":"Actors","title":"How to create a custom Actor","text":"","category":"section"},{"location":"api/actors/","page":"Actors","title":"Actors","text":"At first custom actor should implement a custom method for the as_actor function. Rocket.jl also provides a number of helper actor abstract types with predefined as_actor method behavior (see Traits API section).","category":"page"},{"location":"api/actors/","page":"Actors","title":"Actors","text":"using Rocket\n\nstruct MyCustomActor end\n\nas_actor(::Type{<:MyCustomActor}) = Rocket.BaseActorTrait{Int}()\n","category":"page"},{"location":"api/actors/","page":"Actors","title":"Actors","text":"or","category":"page"},{"location":"api/actors/","page":"Actors","title":"Actors","text":"using Rocket\n\nstruct MyCustomActor <: Actor{Int} end # Automatically specifies BaseActorTrait{Int} behavior.","category":"page"},{"location":"api/actors/","page":"Actors","title":"Actors","text":"Additionally custom actor must provide a custom methods for on_next!, on_error! and/or on_complete! functions. Depending on specified actor trait behavior some methods may or may not be optional.","category":"page"},{"location":"api/actors/","page":"Actors","title":"Actors","text":"using Rocket\n\nstruct MyCustomActor <: Actor{Int} end\n\nRocket.on_next!(actor::MyCustomActor, data::Int) = # custom logic here\nRocket.on_error!(actor::MyCustomActor, err) = # custom logic here\nRocket.on_complete!(actor::MyCustomActor) = # custom logic here","category":"page"},{"location":"api/actors/","page":"Actors","title":"Actors","text":"or","category":"page"},{"location":"api/actors/","page":"Actors","title":"Actors","text":"using Rocket\n\nstruct MyCustomCompletionActor <: CompletionActor{Int} end\n\nRocket.on_complete!(actor::MyCustomCompletionActor) = # custom logic here","category":"page"},{"location":"api/actors/#actors_api_traits","page":"Actors","title":"Traits","text":"","category":"section"},{"location":"api/actors/","page":"Actors","title":"Actors","text":"as_actor\nActorTrait\nBaseActorTrait\nNextActorTrait\nErrorActorTrait\nCompletionActorTrait\nInvalidActorTrait","category":"page"},{"location":"api/actors/#Rocket.as_actor","page":"Actors","title":"Rocket.as_actor","text":"as_actor(any)\n\nThis function checks actor trait behavior specification. May be used explicitly to specify actor trait behavior for any object.\n\nSee also: ActorTrait\n\n\n\n\n\n","category":"function"},{"location":"api/actors/#Rocket.ActorTrait","page":"Actors","title":"Rocket.ActorTrait","text":"Abstract type for all possible actor traits\n\nSee also: BaseActorTrait, NextActorTrait, ErrorActorTrait, CompletionActorTrait, InvalidActorTrait\n\n\n\n\n\n","category":"type"},{"location":"api/actors/#Rocket.BaseActorTrait","page":"Actors","title":"Rocket.BaseActorTrait","text":"Base actor trait specifies actor to listen for all next!, error! and complete! events. BaseActorTrait is a subtype of ActorTrait.\n\nSee also: Actor\n\n\n\n\n\n","category":"type"},{"location":"api/actors/#Rocket.NextActorTrait","page":"Actors","title":"Rocket.NextActorTrait","text":"Next actor trait specifies actor to listen for next! events only. NextActorTrait is a subtype of ActorTrait.\n\nSee also: NextActor\n\n\n\n\n\n","category":"type"},{"location":"api/actors/#Rocket.ErrorActorTrait","page":"Actors","title":"Rocket.ErrorActorTrait","text":"Error actor trait specifies actor to listen for error! events only. ErrorActorTrait is a subtype of ActorTrait.\n\nSee also: ErrorActor\n\n\n\n\n\n","category":"type"},{"location":"api/actors/#Rocket.CompletionActorTrait","page":"Actors","title":"Rocket.CompletionActorTrait","text":"Completion actor trait specifies actor to listen for complete! events only. CompletionActorTrait is a subtype of ActorTrait.\n\nSee also: CompletionActor\n\n\n\n\n\n","category":"type"},{"location":"api/actors/#Rocket.InvalidActorTrait","page":"Actors","title":"Rocket.InvalidActorTrait","text":"Default actor trait behavior for any object. Actor with such a trait specificaion cannot be used as a valid actor in subscribe! function. Doing so will raise an error. InvalidActorTrait is a subtype of ActorTrait.\n\nSee also: ActorTrait\n\n\n\n\n\n","category":"type"},{"location":"api/actors/#Types","page":"Actors","title":"Types","text":"","category":"section"},{"location":"api/actors/","page":"Actors","title":"Actors","text":"AbstractActor\nActor\nNextActor\nErrorActor\nCompletionActor","category":"page"},{"location":"api/actors/#Rocket.AbstractActor","page":"Actors","title":"Rocket.AbstractActor","text":"Supertype type for Actor, NextActor, ErrorActor and CompletionActor types.\n\nSee also: Actor, NextActor, ErrorActor, CompletionActor\n\n\n\n\n\n","category":"type"},{"location":"api/actors/#Rocket.Actor","page":"Actors","title":"Rocket.Actor","text":"Can be used as a super type for common actor. Automatically specifies a BaseActorTrait trait behavior. Every Actor must implement its own methods for on_next!(actor, data), on_error!(actor, err) and on_complete!(actor) functions. Actor is a subtype of AbstractActor type.\n\nExamples\n\nusing Rocket\n\nstruct MyActor <: Actor{String} end\n\nRocket.as_actor(MyActor)\n\n# output\n\nBaseActorTrait{String}()\n\nSee also: AbstractActor, as_actor, BaseActorTrait, ActorTrait, on_next!, on_error!, on_complete!\n\n\n\n\n\n","category":"type"},{"location":"api/actors/#Rocket.NextActor","page":"Actors","title":"Rocket.NextActor","text":"Can be used as a super type for \"next-only\" actor. Automatically specifies a NextActorTrait trait behavior. Every NextActor must implement its own methods for on_next!(actor, data) function only. NextActor is a subtype of AbstractActor type.\n\nExamples\n\nusing Rocket\n\nstruct MyNextActor <: NextActor{String} end\n\nRocket.as_actor(MyNextActor)\n\n# output\n\nNextActorTrait{String}()\n\nSee also: AbstractActor, as_actor, NextActorTrait, ActorTrait, on_next!\n\n\n\n\n\n","category":"type"},{"location":"api/actors/#Rocket.ErrorActor","page":"Actors","title":"Rocket.ErrorActor","text":"Can be used as a super type for \"error-only\" actor. Automatically specifies a ErrorActorTrait trait behavior. Every ErrorActor must implement its own methods for on_error!(actor, err) function only. ErrorActor is a subtype of AbstractActor type.\n\nExamples\n\nusing Rocket\n\nstruct MyErrorActor <: ErrorActor{String} end\n\nRocket.as_actor(MyErrorActor)\n\n# output\n\nErrorActorTrait{String}()\n\nSee also: AbstractActor, as_actor, ErrorActorTrait, ActorTrait, on_error!\n\n\n\n\n\n","category":"type"},{"location":"api/actors/#Rocket.CompletionActor","page":"Actors","title":"Rocket.CompletionActor","text":"Can be used as a super type for \"completion-only\" actor. Automatically specifies a CompletionActorTrait trait behavior. Every CompletionActor must implement its own methods for on_complete!(actor) function only. CompletionActor is a subtype of AbstractActor type.\n\nExamples\n\nusing Rocket\n\nstruct MyCompletionActor <: CompletionActor{String} end\n\nRocket.as_actor(MyCompletionActor)\n\n# output\n\nCompletionActorTrait{String}()\n\nSee also: AbstractActor, as_actor, CompletionActorTrait, ActorTrait, on_complete!\n\n\n\n\n\n","category":"type"},{"location":"api/actors/#Events","page":"Actors","title":"Events","text":"","category":"section"},{"location":"api/actors/","page":"Actors","title":"Actors","text":"next!\nerror!\ncomplete!","category":"page"},{"location":"api/actors/#Rocket.next!","page":"Actors","title":"Rocket.next!","text":"next!(actor, data)\nnext!(actor, data, scheduler)\n\nThis function is used to deliver a \"next\" event to an actor with some data. Takes optional scheduler object to schedule execution of data delivery.\n\nSee also: AbstractActor, on_next!\n\n\n\n\n\n","category":"function"},{"location":"api/actors/#Rocket.error!","page":"Actors","title":"Rocket.error!","text":"error!(actor, err)\nerror!(actor, err, scheduler)\n\nThis function is used to deliver a \"error\" event to an actor with some err. Takes optional scheduler object to schedule execution of error delivery.\n\nSee also: AbstractActor, on_error!\n\n\n\n\n\n","category":"function"},{"location":"api/actors/#Rocket.complete!","page":"Actors","title":"Rocket.complete!","text":"complete!(actor)\ncomplete!(actor, scheduler)\n\nThis function is used to deliver a \"complete\" event to an actor. Takes optional scheduler object to schedule execution of complete event delivery.\n\nSee also: AbstractActor, on_complete!\n\n\n\n\n\n","category":"function"},{"location":"api/actors/","page":"Actors","title":"Actors","text":"on_next!\non_error!\non_complete!","category":"page"},{"location":"api/actors/#Rocket.on_next!","page":"Actors","title":"Rocket.on_next!","text":"on_next!(actor, data)\n\nBoth Actor and NextActor objects must implement its own method for on_next! function which will be called on \"next\" event.\n\nSee also: Actor, NextActor\n\n\n\n\n\n","category":"function"},{"location":"api/actors/#Rocket.on_error!","page":"Actors","title":"Rocket.on_error!","text":"on_error!(actor, err)\n\nBoth Actor and ErrorActor objects must implement its own method for on_error! function which will be called on \"error\" event.\n\nSee also: Actor, ErrorActor\n\n\n\n\n\n","category":"function"},{"location":"api/actors/#Rocket.on_complete!","page":"Actors","title":"Rocket.on_complete!","text":"on_complete!(actor)\n\nBoth Actor and CompletionActor objects must implement its own method for on_complete! function which will be called on \"complete\" event.\n\nSee also: Actor, CompletionActor\n\n\n\n\n\n","category":"function"},{"location":"api/actors/#Factory","page":"Actors","title":"Factory","text":"","category":"section"},{"location":"api/actors/","page":"Actors","title":"Actors","text":"AbstractActorFactory\ncreate_actor\nMissingCreateActorFactoryImplementationError","category":"page"},{"location":"api/actors/#Rocket.AbstractActorFactory","page":"Actors","title":"Rocket.AbstractActorFactory","text":"Abstract type for all possible actor factories\n\nSee also: Actor\n\n\n\n\n\n","category":"type"},{"location":"api/actors/#Rocket.create_actor","page":"Actors","title":"Rocket.create_actor","text":"create_actor(::Type{L}, factory::F) where { L, F <: AbstractActorFactory }\n\nActor creator function for a given factory F. Should be implemented explicitly for any AbstractActorFactory object\n\nSee also: AbstractActorFactory, MissingCreateActorFactoryImplementationError\n\n\n\n\n\n","category":"function"},{"location":"api/actors/#Rocket.MissingCreateActorFactoryImplementationError","page":"Actors","title":"Rocket.MissingCreateActorFactoryImplementationError","text":"This error will be throw if Julia cannot find specific method of 'create_actor()' function for given actor factory\n\nSee also: AbstractActorFactory, create_actor\n\n\n\n\n\n","category":"type"},{"location":"api/actors/#Errors","page":"Actors","title":"Errors","text":"","category":"section"},{"location":"api/actors/","page":"Actors","title":"Actors","text":"InvalidActorTraitUsageError\nInconsistentSourceActorDataTypesError\nMissingDataArgumentInNextCall\nMissingErrorArgumentInErrorCall\nExtraArgumentInCompleteCall\nMissingOnNextImplementationError\nMissingOnErrorImplementationError\nMissingOnCompleteImplementationError","category":"page"},{"location":"api/actors/#Rocket.InvalidActorTraitUsageError","page":"Actors","title":"Rocket.InvalidActorTraitUsageError","text":"This error will be thrown if next!, error! or complete! functions are called with invalid actor object\n\nSee also: next!, error!, complete!, InvalidActorTrait\n\n\n\n\n\n","category":"type"},{"location":"api/actors/#Rocket.InconsistentSourceActorDataTypesError","page":"Actors","title":"Rocket.InconsistentSourceActorDataTypesError","text":"This error will be thrown if next! function is called with inconsistent data type\n\nSee also: AbstractActor, Subscribable, next!\n\n\n\n\n\n","category":"type"},{"location":"api/actors/#Rocket.MissingDataArgumentInNextCall","page":"Actors","title":"Rocket.MissingDataArgumentInNextCall","text":"This error will be thrown if next! function is called without data argument\n\nSee also: next!\n\n\n\n\n\n","category":"type"},{"location":"api/actors/#Rocket.MissingErrorArgumentInErrorCall","page":"Actors","title":"Rocket.MissingErrorArgumentInErrorCall","text":"This error will be thrown if error! function is called without err argument\n\nSee also: error!\n\n\n\n\n\n","category":"type"},{"location":"api/actors/#Rocket.ExtraArgumentInCompleteCall","page":"Actors","title":"Rocket.ExtraArgumentInCompleteCall","text":"This error will be thrown if complete! function is called with extra data/err argument\n\nSee also: complete!\n\n\n\n\n\n","category":"type"},{"location":"api/actors/#Rocket.MissingOnNextImplementationError","page":"Actors","title":"Rocket.MissingOnNextImplementationError","text":"This error will be thrown if Julia cannot find specific method of 'on_next!()' function for given actor and data\n\nSee also: on_next!\n\n\n\n\n\n","category":"type"},{"location":"api/actors/#Rocket.MissingOnErrorImplementationError","page":"Actors","title":"Rocket.MissingOnErrorImplementationError","text":"This error will be thrown if Julia cannot find specific method of 'on_error!()' function for given actor\n\nSee also: on_error!\n\n\n\n\n\n","category":"type"},{"location":"api/actors/#Rocket.MissingOnCompleteImplementationError","page":"Actors","title":"Rocket.MissingOnCompleteImplementationError","text":"This error will be thrown if Julia cannot find specific method of 'on_complete!()' function for given actor and data\n\nSee also: on_next!\n\n\n\n\n\n","category":"type"},{"location":"observables/types/array/#observable_array","page":"Array","title":"Array Observable","text":"","category":"section"},{"location":"observables/types/array/","page":"Array","title":"Array","text":"from","category":"page"},{"location":"observables/types/array/#Rocket.from","page":"Array","title":"Rocket.from","text":"from(x; scheduler::H = AsapScheduler()) where { H <: AbstractScheduler }\nfrom(a::Vector{D}; scheduler::H = AsapScheduler()) where { D, H <: AbstractScheduler }\n\nCreation operator for the ArrayObservable that emits either a single value if x has a Scalar trait specification or a collection of values if x has a NonScalar trait specification. Throws an ErrorException if x has UndefinedScalarness trait type. To specify scalarness for arbitrary type T some can implement an additional method for scalarness(::Type{<:MyType}) function and to specify scalarness behavior. Optionally accepts custom scheduler-like object to schedule messages delivery.\n\nArguments\n\nx: an object to be wrapped into array of values\nscheduler: optional, scheduler-like object\n\nFor an object x to be a valid input for a from operator it must implement Rocket.scalarness(::Type{ <: T }) method which should return either Rocket.Scalar or Rocket.NonScalar objects. In first case from operator will treat x as a single scalar value and will wrap it into a vector while in the second case from operator will convert x object into an array using collect function.\n\nFor arbitrary iterable objects consider using iterable creation operator.\n\nNote\n\nfrom operators creates a copy of x using collect on a given object.\n\nExamples\n\nusing Rocket\n\nsource = from([ 0, 1, 2 ])\nsubscribe!(source, logger())\n;\n\n# output\n\n[LogActor] Data: 0\n[LogActor] Data: 1\n[LogActor] Data: 2\n[LogActor] Completed\n\n\nusing Rocket\n\nsource = from(( 0, 1, 2 ))\nsubscribe!(source, logger())\n;\n\n# output\n\n[LogActor] Data: 0\n[LogActor] Data: 1\n[LogActor] Data: 2\n[LogActor] Completed\n\n\nusing Rocket\n\nsource = from(0)\nsubscribe!(source, logger())\n;\n\n# output\n\n[LogActor] Data: 0\n[LogActor] Completed\n\n\nusing Rocket\n\nsource = from(\"Hello, world!\")\nsubscribe!(source, logger())\n;\n\n# output\n\n[LogActor] Data: H\n[LogActor] Data: e\n[LogActor] Data: l\n[LogActor] Data: l\n[LogActor] Data: o\n[LogActor] Data: ,\n[LogActor] Data:\n[LogActor] Data: w\n[LogActor] Data: o\n[LogActor] Data: r\n[LogActor] Data: l\n[LogActor] Data: d\n[LogActor] Data: !\n[LogActor] Completed\n\n\nSee also: ArrayObservable, subscribe!, logger, iterable\n\n\n\n\n\n","category":"function"},{"location":"observables/types/array/","page":"Array","title":"Array","text":"ArrayObservable","category":"page"},{"location":"observables/types/array/#Rocket.ArrayObservable","page":"Array","title":"Rocket.ArrayObservable","text":"ArrayObservable{D, H}(values::Vector{D}, scheduler::H) where { D, H }\n\nArrayObservable wraps a regular Julia array into an observable. Uses scheduler object to schedule messages delivery.\n\nConstructor arguments\n\nvalues: array of values to be wrapped\nscheduler: Scheduler-like object\n\nSee also: Subscribable, from\n\n\n\n\n\n","category":"type"},{"location":"api/teardown/#teardown_api","page":"Teardown","title":"Teardown API","text":"","category":"section"},{"location":"api/teardown/","page":"Teardown","title":"Teardown","text":"Any subscription-like object should implement a valid teardown logic.","category":"page"},{"location":"api/teardown/#Example","page":"Teardown","title":"Example","text":"","category":"section"},{"location":"api/teardown/","page":"Teardown","title":"Teardown","text":"using Rocket\n\nstruct MuCustomSubscription <: Teardown\n # some fields here\nend\n\nRocket.as_teardown(::Type{<:MuCustomSubscription}) = UnsubscribableTeardownLogic()\n\nfunction on_unsubscribe!(subscription::MyCustomSubscription)\n # dispose resources here\nend","category":"page"},{"location":"api/teardown/#Traits","page":"Teardown","title":"Traits","text":"","category":"section"},{"location":"api/teardown/","page":"Teardown","title":"Teardown","text":"TeardownLogic\nas_teardown\nUnsubscribableTeardownLogic\non_unsubscribe!\nCallableTeardownLogic\nVoidTeardownLogic\nInvalidTeardownLogic","category":"page"},{"location":"api/teardown/#Rocket.TeardownLogic","page":"Teardown","title":"Rocket.TeardownLogic","text":"Abstract type for all possible teardown logic traits.\n\nSee also: UnsubscribableTeardownLogic, CallableTeardownLogic, VoidTeardownLogic, InvalidTeardownLogic\n\n\n\n\n\n","category":"type"},{"location":"api/teardown/#Rocket.as_teardown","page":"Teardown","title":"Rocket.as_teardown","text":"as_teardown(::Type)\n\nThis function checks teardown trait behavior specification. Should be used explicitly to specify teardown logic trait behavior for any object.\n\nExamples\n\nusing Rocket\n\nstruct MySubscription <: Teardown end\n\nRocket.as_teardown(::Type{<:MySubscription}) = UnsubscribableTeardownLogic()\nRocket.on_unsubscribe!(s::MySubscription) = println(\"Unsubscribed!\")\n\nsubscription = MySubscription()\nunsubscribe!(subscription)\n;\n\n# output\n\nUnsubscribed!\n\nSee also: Teardown, TeardownLogic\n\n\n\n\n\n","category":"function"},{"location":"api/teardown/#Rocket.UnsubscribableTeardownLogic","page":"Teardown","title":"Rocket.UnsubscribableTeardownLogic","text":"Unsubscribable teardown logic trait behavior. Unsubscribable teardown object must define its own method for on_unsubscribe!() function which will be invoked when actor decides to unsubscribe! from Observable.\n\nSee also: TeardownLogic, on_unsubscribe!, unsubscribe!\n\n\n\n\n\n","category":"type"},{"location":"api/teardown/#Rocket.on_unsubscribe!","page":"Teardown","title":"Rocket.on_unsubscribe!","text":"on_unsubscribe!(teardown)\n\nEach valid teardown object with UnsubscribableTeardownLogic trait behavior must implement its own method for on_unsubscribe!() function which will be invoked when actor decides to unsubscribe! from Observable.\n\nSee also: Teardown, TeardownLogic, UnsubscribableTeardownLogic\n\n\n\n\n\n","category":"function"},{"location":"api/teardown/#Rocket.CallableTeardownLogic","page":"Teardown","title":"Rocket.CallableTeardownLogic","text":"Callable teardown logic trait behavior. Callable teardown object must be callable (insert meme with a surprised Pikachu here).\n\nSee also: TeardownLogic, on_unsubscribe!, unsubscribe!\n\n\n\n\n\n","category":"type"},{"location":"api/teardown/#Rocket.VoidTeardownLogic","page":"Teardown","title":"Rocket.VoidTeardownLogic","text":"Void teardown logic trait behavior. Void teardown object does nothing in unsubscribe! and may not define any additional methods.\n\nSee also: TeardownLogic, on_unsubscribe!, unsubscribe!\n\n\n\n\n\n","category":"type"},{"location":"api/teardown/#Rocket.InvalidTeardownLogic","page":"Teardown","title":"Rocket.InvalidTeardownLogic","text":"Default teardown logic trait behavour. Invalid teardwon object cannot be used in unsubscribe! function. Doing so will raise an error.\n\nSee also: TeardownLogic, on_unsubscribe!, unsubscribe!\n\n\n\n\n\n","category":"type"},{"location":"api/teardown/#Types","page":"Teardown","title":"Types","text":"","category":"section"},{"location":"api/teardown/","page":"Teardown","title":"Teardown","text":"Teardown\nunsubscribe!","category":"page"},{"location":"api/teardown/#Rocket.Teardown","page":"Teardown","title":"Rocket.Teardown","text":"Abstract type for any teardown object. Each teardown object must be a subtype of Teardown.\n\nSee also: TeardownLogic\n\n\n\n\n\n","category":"type"},{"location":"api/teardown/#Rocket.unsubscribe!","page":"Teardown","title":"Rocket.unsubscribe!","text":"unsubscribe!(subscription)\nunsubscribe!(subscriptions::Tuple)\nunsubscribe!(subscriptions::AbstractVector)\n\nunsubscribe! function is used to cancel Observable execution and to dispose any kind of resources used during an Observable execution. If the input argument to the unsubscribe! function is either a tuple or a vector, it will first check that all of the arguments are valid subscription objects and if its true will unsubscribe from each of them individually. \n\nSee also: Teardown, TeardownLogic, on_unsubscribe!\n\n\n\n\n\n","category":"function"},{"location":"api/teardown/#Errors","page":"Teardown","title":"Errors","text":"","category":"section"},{"location":"api/teardown/","page":"Teardown","title":"Teardown","text":"InvalidTeardownLogicTraitUsageError\nInvalidMultipleTeardownLogicTraitUsageError\nMissingOnUnsubscribeImplementationError","category":"page"},{"location":"api/teardown/#Rocket.InvalidTeardownLogicTraitUsageError","page":"Teardown","title":"Rocket.InvalidTeardownLogicTraitUsageError","text":"This error will be thrown if unsubscribe! function is called with invalid teardown object.\n\nSee also: unsubscribe!\n\n\n\n\n\n","category":"type"},{"location":"api/teardown/#Rocket.InvalidMultipleTeardownLogicTraitUsageError","page":"Teardown","title":"Rocket.InvalidMultipleTeardownLogicTraitUsageError","text":"This error will be thrown if unsubscribe! function is called with a tuple with invalid teardown object in it.\n\nSee also: unsubscribe!\n\n\n\n\n\n","category":"type"},{"location":"api/teardown/#Rocket.MissingOnUnsubscribeImplementationError","page":"Teardown","title":"Rocket.MissingOnUnsubscribeImplementationError","text":"This error will be thrown if Julia cannot find specific method of on_unsubscribe!() function for given teardown object.\n\nSee also: on_unsubscribe!\n\n\n\n\n\n","category":"type"},{"location":"operators/transformation/accumulated/#operator_accumulated","page":"accumulated","title":"Accumulated Operator","text":"","category":"section"},{"location":"operators/transformation/accumulated/","page":"accumulated","title":"accumulated","text":"accumulated","category":"page"},{"location":"operators/transformation/accumulated/#Rocket.accumulated","page":"accumulated","title":"Rocket.accumulated","text":"accumulated()\n\nCreates an accumulated operator, which returns an Observable that emits the current item with all of the previous items emitted by the source Observable in one single ordered array.\n\nProducing\n\nStream of type <: Subscribable{Vector{L}} where L refers to type of source stream\n\nExamples\n\nusing Rocket\n\nsource = from([ 1, 2, 3 ])\nsubscribe!(source |> accumulated(), logger())\n;\n\n# output\n\n[LogActor] Data: [1]\n[LogActor] Data: [1, 2]\n[LogActor] Data: [1, 2, 3]\n[LogActor] Completed\n\n\nusing Rocket\n\nsource = of(1)\nsubscribe!(source |> accumulated(), logger())\n;\n\n# output\n\n[LogActor] Data: [1]\n[LogActor] Completed\n\nSee also: AbstractOperator, InferableOperator, ProxyObservable, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/transformation/accumulated/#Description","page":"accumulated","title":"Description","text":"","category":"section"},{"location":"operators/transformation/accumulated/","page":"accumulated","title":"accumulated","text":"Combines all values emitted by the source, using an accumulator function that joins a new source value with the all past values emmited into one single array. This is similar to scan with vcat accumulation function.","category":"page"},{"location":"operators/transformation/accumulated/#See-also","page":"accumulated","title":"See also","text":"","category":"section"},{"location":"operators/transformation/accumulated/","page":"accumulated","title":"accumulated","text":"Operators","category":"page"},{"location":"operators/mathematical/max/#operator_max","page":"max","title":"Max Operator","text":"","category":"section"},{"location":"operators/mathematical/max/","page":"max","title":"max","text":"max","category":"page"},{"location":"operators/mathematical/max/#Base.max","page":"max","title":"Base.max","text":"max(; from = nothing)\n\nCreates a max operator, which emits a single item: the item with the largest value.\n\nArguments\n\nfrom: optional initial maximum value, if nothing first item from the source will be used as initial instead\n\nProducing\n\nStream of type <: Subscribable{Union{L, Nothing}} where L refers to type of source stream\n\nExamples\n\nusing Rocket\n\nsource = from([ i for i in 1:42 ])\nsubscribe!(source |> max(), logger())\n;\n\n# output\n\n[LogActor] Data: 42\n[LogActor] Completed\n\n\nSee also: AbstractOperator, InferableOperator, ProxyObservable, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/mathematical/max/#Description","page":"max","title":"Description","text":"","category":"section"},{"location":"operators/mathematical/max/","page":"max","title":"max","text":"The max operator operates on an Observable of similar objects. When the source Observable completes, it emits the item with the largest value.","category":"page"},{"location":"operators/mathematical/max/#See-also","page":"max","title":"See also","text":"","category":"section"},{"location":"operators/mathematical/max/","page":"max","title":"max","text":"Operators","category":"page"},{"location":"operators/errors/catch_error/#operator_catch_error","page":"catch_error","title":"Catch Error Operator","text":"","category":"section"},{"location":"operators/errors/catch_error/","page":"catch_error","title":"catch_error","text":"catch_error","category":"page"},{"location":"operators/errors/catch_error/#Rocket.catch_error","page":"catch_error","title":"Rocket.catch_error","text":"catch_error(selectorFn::F) where F\n\nCreates a CatchErrorOperator, which catches errors on the observable to be handled by returning a new observable or throwing an error.\n\nArguments:\n\nselectorFn::F: a callable object that takes as arguments err, which is the error, and caught, which is the source observable, in case you'd like to \"retry\" that observable by returning it again. Whatever observable is returned by the selector will be used to continue the observable chain.\n\nProducing\n\nStream of type <: Subscribable{L} where L refers to type of source stream\n\nExamples\n\nusing Rocket\n\nsource = from(1:5) |> safe() |> map(Int, (d) -> d == 4 ? error(4) : d) |> catch_error((err, obs) -> of(1))\n\nsubscribe!(source, logger())\n;\n\n# output\n[LogActor] Data: 1\n[LogActor] Data: 2\n[LogActor] Data: 3\n[LogActor] Data: 1\n[LogActor] Completed\n\nSee also: AbstractOperator, InferableOperator, rerun, logger, safe\n\n\n\n\n\n","category":"function"},{"location":"operators/errors/catch_error/#See-also","page":"catch_error","title":"See also","text":"","category":"section"},{"location":"operators/errors/catch_error/","page":"catch_error","title":"catch_error","text":"Operators","category":"page"},{"location":"operators/about/#section_operators","page":"Operator","title":"Operators","text":"","category":"section"},{"location":"operators/about/","page":"Operator","title":"Operator","text":"Even though the Observable is the foundation, reactive extensions are mostly useful because of their operators. Operators are the essential pieces that allow complex asynchronous code to be easily composed in a declarative manner.","category":"page"},{"location":"operators/about/#what_are_operators","page":"Operator","title":"What are operators?","text":"","category":"section"},{"location":"operators/about/","page":"Operator","title":"Operator","text":"There are two kinds of operators:","category":"page"},{"location":"operators/about/#Pipeable-operators","page":"Operator","title":"Pipeable operators","text":"","category":"section"},{"location":"operators/about/","page":"Operator","title":"Operator","text":"Pipeable Operators are the kind that can be piped to Observables using the syntax source |> operator(). These include the filter() and map() operators. When called, operators do not change the existing Observable instance. Instead, they return a new Observable, whose subscription logic is based on the first Observable.","category":"page"},{"location":"operators/about/","page":"Operator","title":"Operator","text":"note: Note\nA Pipeable Operator is a function that takes an Observable as its input and returns another Observable. It is a pure operation: the previous Observable remains unmodified.","category":"page"},{"location":"operators/about/","page":"Operator","title":"Operator","text":"A Pipeable Operator is essentially a pure callable object that accepts one Observable as input and returns another Observable as output. Subscribing to the output Observable will also subscribe to the input Observable.","category":"page"},{"location":"operators/about/","page":"Operator","title":"Operator","text":"For example, the operator called map() is analogous to the Array method of the same name. Just like the array method map((d) -> d ^ 2, [ 1, 2, 3 ]) yields [ 1, 4, 9 ], the Observable emits 1, 4, 9:","category":"page"},{"location":"operators/about/","page":"Operator","title":"Operator","text":"source = from([ 1, 2, 3 ])\nsubscribe!(source |> map(Int, (d) -> d ^ 2), lambda(\n on_next = (d) -> println(d)\n))\n\n// Logs:\n// 1\n// 4\n// 9","category":"page"},{"location":"operators/about/","page":"Operator","title":"Operator","text":"Another useful operator is first():","category":"page"},{"location":"operators/about/","page":"Operator","title":"Operator","text":"source = from([ 1, 2, 3 ])\nsubscribe!(source |> first(), lambda(\n on_next = (d) -> println(d),\n on_complete = () -> \"Completed\"\n))\n\n// Logs:\n// 1\n// Completed","category":"page"},{"location":"operators/about/#Creation-operators","page":"Operator","title":"Creation operators","text":"","category":"section"},{"location":"operators/about/","page":"Operator","title":"Operator","text":"Distinct from pipeable operators, creation operators are functions that can be used to create an Observable with some common predefined behavior or by joining other Observables. For example: from([ 1, 2, 3 ]) creates an observable that will sequentially emit 1, 2, and 3.","category":"page"},{"location":"operators/about/","page":"Operator","title":"Operator","text":"source = from([ 1, 2, 3 ])\nsubscribe!(source, lambda(\n on_next = (d) -> println(\"Value: $d\"),\n on_error = (e) -> println(\"Oh no, error: $e\")\n on_complete = () -> println(\"Completed\")\n))\n\n// Logs:\n// Value: 1\n// Value: 2\n// Value: 3\n// Completed","category":"page"},{"location":"operators/about/#Operators-piping","page":"Operator","title":"Operators piping","text":"","category":"section"},{"location":"operators/about/","page":"Operator","title":"Operator","text":"Pipeable operators are special objects that can be used like ordinary functions with on_call!(operator, source). In practice however they tend to accumulate and quickly grow unreadable: on_call!(operator1, on_call!(operator2, on_call!(operator3, source))). Therefore, Rocket.jl overloads |> for operators and Observables:","category":"page"},{"location":"operators/about/","page":"Operator","title":"Operator","text":"using Rocket\n\nsource = from(1:100) |> filter((d) -> d % 2 === 0) |> map(Int, (d) -> d ^ 2) |> sum()\n\nsubscribe!(source, logger())\n\n// Logs\n// [LogActor] Data: 171700\n// [LogActor] Completed","category":"page"},{"location":"operators/about/","page":"Operator","title":"Operator","text":"It is also possible to create an operator composition with + or |>. It might be useful to create an alias for some often used operator chain","category":"page"},{"location":"operators/about/","page":"Operator","title":"Operator","text":"using Rocket\n\nmapAndFilter = map(Int, d -> d ^ 2) + filter(d -> d % 2 == 0) \n\nsource = from(1:5) |> mapAndFilter\n\nsubscribe!(source, logger())\n\n// Logs\n// [LogActor] Data: 4\n// [LogActor] Data: 16\n// [LogActor] Completed\n\nmapAndFilterAndSum = mapAndFilter + sum()\n\nsource = from(1:5) |> mapAndFilterAndSum\n\nsubscribe!(source, logger())\n\n// Logs\n// [LogActor] Data: 20\n// [LogActor] Completed","category":"page"},{"location":"operators/about/","page":"Operator","title":"Operator","text":"For stylistic reasons, on_call!(operator, source) is never used in practice - even if there is only one operator. Instead, source |> operator() is generally preferred.","category":"page"},{"location":"observables/types/iterable/#observable_iterable","page":"Iterable","title":"Iterable Observable","text":"","category":"section"},{"location":"observables/types/iterable/","page":"Iterable","title":"Iterable","text":"iterable","category":"page"},{"location":"observables/types/iterable/#Rocket.iterable","page":"Iterable","title":"Rocket.iterable","text":"iterable(iterator; scheduler::H = AsapScheduler()) where { H <: AbstractScheduler }\n\nCreation operator for the IterableObservable that wraps given iterator into an observable object.\n\nArguments\n\niterator: an iterator object to be wrapped an observable\nscheduler: optional, scheduler-like object\n\nNote\n\niterable operators does not create a copy of iterator. Any changes in the iterator object might be visible in the created observable. For side-effects free behavior consider using from creation operator which creates a copy of a given object with a collect function.\n\nExamples\n\nusing Rocket\n\nsource = iterable([ 0, 1, 2 ])\nsubscribe!(source, logger())\n;\n\n# output\n\n[LogActor] Data: 0\n[LogActor] Data: 1\n[LogActor] Data: 2\n[LogActor] Completed\n\nusing Rocket\n\nsource = iterable(\"Hello\")\nsubscribe!(source, logger())\n;\n\n# output\n\n[LogActor] Data: H\n[LogActor] Data: e\n[LogActor] Data: l\n[LogActor] Data: l\n[LogActor] Data: o\n[LogActor] Completed\n\nSee also: ScheduledSubscribable, subscribe!, from\n\n\n\n\n\n","category":"function"},{"location":"observables/types/generate/#observable_generate","page":"Generate","title":"Generate Observable","text":"","category":"section"},{"location":"observables/types/generate/","page":"Generate","title":"Generate","text":"generate","category":"page"},{"location":"observables/types/generate/#Rocket.generate","page":"Generate","title":"Rocket.generate","text":"generate(initial::D, condition::C, iterator::I; scheduler::H = AsapScheduler()) where { D, C, I, H <: AbstractScheduler }\n\nGenerates an observable sequence by running a state-driven loop producing the sequence's elements, using the specified scheduler to send out observer messages.\n\nArguments\n\ninitial: initial state\ncondition: condition to terminate generation (upon returning false)\niterator: iteration step function\nscheduler: optional, scheduler-like object\n\nNote\n\niterator object should return objects of the same type as initial.\n\nExamples\n\nusing Rocket\n\nsource = generate(1, x -> x < 3, x -> x + 1)\nsubscribe!(source, logger())\n;\n\n# output\n[LogActor] Data: 1\n[LogActor] Data: 2\n[LogActor] Completed\n\nSee also: ScheduledSubscribable, subscribe!\n\n\n\n\n\n","category":"function"},{"location":"operators/filtering/ignore/#operator_ignore","page":"ignore","title":"Ignore operator","text":"","category":"section"},{"location":"operators/filtering/ignore/","page":"ignore","title":"ignore","text":"ignore","category":"page"},{"location":"operators/filtering/ignore/#Rocket.ignore","page":"ignore","title":"Rocket.ignore","text":"ignore(count::Int)\n\nCreates a ignore operator, which returns an Observable that skips the first count items emitted by the source Observable.\n\nArguments\n\ncount::Int: the number of times, items emitted by source Observable should be skipped.\n\nProducing\n\nStream of type <: Subscribable{L} where L refers to type of source stream\n\nExamples\n\nusing Rocket\n\nsource = from(1:5)\n\nsubscribe!(source |> ignore(2), logger())\n;\n\n# output\n\n[LogActor] Data: 3\n[LogActor] Data: 4\n[LogActor] Data: 5\n[LogActor] Completed\n\nSee also: AbstractOperator, InferableOperator, ProxyObservable, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/filtering/ignore/#See-also","page":"ignore","title":"See also","text":"","category":"section"},{"location":"operators/filtering/ignore/","page":"ignore","title":"ignore","text":"Operators","category":"page"},{"location":"subjects/types/replay/#subject_replay","page":"Replay","title":"ReplaySubject","text":"","category":"section"},{"location":"subjects/types/replay/","page":"Replay","title":"Replay","text":"ReplaySubject\nReplaySubjectFactory","category":"page"},{"location":"subjects/types/replay/#Rocket.ReplaySubject","page":"Replay","title":"Rocket.ReplaySubject","text":"ReplaySubject(::Type{D}, size::Int) where D\nReplaySubject(::Type{D}, size::Int, factory::F) where { D, F <: AbstractSubjectFactory }\nReplaySubject(::Type{D}, size::Int, subject::S) where { D, S }\n\nA variant of Subject that \"replays\" or emits old values to new subscribers. It buffers a set number of values and will emit those values immediately to any new subscribers in addition to emitting new values to existing subscribers.\n\nSee also: ReplaySubjectFactory, Subject, SubjectFactory\n\n\n\n\n\n","category":"function"},{"location":"subjects/types/replay/#Rocket.ReplaySubjectFactory","page":"Replay","title":"Rocket.ReplaySubjectFactory","text":"ReplaySubjectFactory(size::Int, factory::F) where { F <: AbstractSubjectFactory }\nReplaySubjectFactory(size::Int; scheduler::H = AsapScheduler()) where { H <: AbstractScheduler }\n\nA variant of SubjectFactory that creates an instance of ReplaySubject.\n\nSee also: SubjectFactory, AbstractSubjectFactory, ReplaySubject, Subject\n\n\n\n\n\n","category":"function"},{"location":"subjects/types/replay/#Description","page":"Replay","title":"Description","text":"","category":"section"},{"location":"subjects/types/replay/","page":"Replay","title":"Replay","text":"A ReplaySubject is similar to a BehaviorSubject in that it can send old values to new subscribers, but it can also record a part of the Observable execution.","category":"page"},{"location":"subjects/types/replay/","page":"Replay","title":"Replay","text":"note: Note\nA ReplaySubject records multiple values from the Observable execution and replays them to new subscribers.","category":"page"},{"location":"subjects/types/replay/#Examples","page":"Replay","title":"Examples","text":"","category":"section"},{"location":"subjects/types/replay/","page":"Replay","title":"Replay","text":"When creating a ReplaySubject, you can specify how many values to replay:","category":"page"},{"location":"subjects/types/replay/","page":"Replay","title":"Replay","text":"using Rocket\n\nsubject = ReplaySubject(Int, 3) # buffer 3 values for new subscribers\n\nsubscription1 = subscribe!(subject, logger(\"1\"))\n\nnext!(subject, 1)\nnext!(subject, 2)\nnext!(subject, 3)\nnext!(subject, 4)\n\nsubscription2 = subscribe!(subject, logger(\"2\"))\n\nnext!(subject, 5)\n\nunsubscribe!(subscription1)\nunsubscribe!(subscription2)\n\n// Logs\n// [1] Data: 1\n// [1] Data: 2\n// [1] Data: 3\n// [1] Data: 4\n// [2] Data: 2\n// [2] Data: 3\n// [2] Data: 4\n// [1] Data: 5\n// [2] Data: 5","category":"page"},{"location":"observables/about/#section_observables","page":"Observable","title":"Observables","text":"","category":"section"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"Observables are lazy Push collections of multiple values. They fill the missing spot in the following table:","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"Type Single Multiple\nPull Function Iterator\nPush Promise Observable","category":"page"},{"location":"observables/about/#First-example","page":"Observable","title":"First example","text":"","category":"section"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"For example, the following code specifies an Observable that pushes the values 1, 2, 3 immediately (synchronously) when subscribed to, and the value 4 after one second has passed since subscription.","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"using Rocket\n\nsource = make(Int) do actor\n next!(actor, 1)\n next!(actor, 2)\n next!(actor, 3)\n setTimeout(1000) do\n next!(actor, 4)\n complete!(actor)\n end\nend","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"To invoke the Observable and inspect these values, we need to subscribe to it. It is important to note that observables are lazy collections which means they don't emit anything until someone subscribes to it. Every subscription spawns its own independent execution of observable. There are some exceptions to this rule, e.g. Subjects and some operators (share(), etc..) which may change this behaviour","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"using Rocket\n\nsource = make(Int) do actor\n next!(actor, 1)\n next!(actor, 2)\n next!(actor, 3)\n setTimeout(1000) do\n next!(actor, 4)\n complete!(actor)\n end\nend\n\nprintln(\"Just before subscribe\")\nsubscribe!(source, lambda(\n on_next = (d) -> println(d),\n on_complete = () -> println(\"Completed\")\n))\nprintln(\"Just after subscribe\")\n\n# Logs\n# Just before subscribe\n# 1\n# 2\n# 3\n# Just after subscribe\n# 4\n# Completed","category":"page"},{"location":"observables/about/#Pull-vs-Push","page":"Observable","title":"Pull vs Push","text":"","category":"section"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"Pull and Push are two different protocols that describe how a data Producer communicates with a data Consumer.","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"In a Pull system, the Consumer determines when it receives data from the Producer. The Producer itself is unaware of when the data are delivered to the Consumer.","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"Every Julia Function is a Pull system. The function is a Producer of data, and the code that calls the function is consuming data by \"pulling\" a return value from the call.","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"Type PRODUCER CONSUMER\nPull Passive: produces data when requested. Active: decides when data is requested.\nPush Active: produces data at its own pace. Passive: reacts to received data.","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"In Push systems, the Producer determines when to send data to the Consumer. The Consumer is unaware of when it will receive that data.","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"Futures and promises are the most common type of Push systems today. A Promise (the Producer) delivers a resolved value to registered callbacks (the Consumers). Unlike functions, it is the Promise that determines precisely when a value is \"pushed\" to the callbacks.","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"Rocket.jl introduces Observables, a new Push system for Julia. An Observable is a Producer of multiple values, \"pushing\" them to Observers (Consumers or Actors).","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"A Function is a lazily evaluated computation that synchronously returns a single value on invocation.\nA Generator is a lazily evaluated computation that synchronously returns zero to (potentially) infinite values on iteration.\nA Promise is a computation that may (or may not) eventually return a single value.\nAn Observable is a lazily evaluated computation that can synchronously or asynchronously return zero to (potentially) infinite values from the time it's invoked.","category":"page"},{"location":"observables/about/#Observables-as-generalizations-of-functions","page":"Observable","title":"Observables as generalizations of functions","text":"","category":"section"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"In contrast to functions, Observables can \"return\" multiple values over time. For example, functions can't do this:","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"function foo()\n println(\"Hello!\")\n return 0\n return 1 # Dead code, will never happen\nend","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"Observables, however, can do this:","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"using Rocket\n\nfoo = make(Int) do actor\n next!(actor, 0)\n next!(actor, 1)\n complete!(actor)\nend\n","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"Observables can also \"return\" values asynchronously after some time:","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"using Rocket\n\nfoo = make(Int) do actor\n setTimeout(1000) do\n next!(actor, 0)\n complete!(actor)\n end\nend","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"Assume we have a function foo and some observable:","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"Function call foo(args...) means \"give me one value synchronously\" (pull strategy)\nIn contrast subscription to an observable with subscribe(observable, ...) means \"notify me about any amount of values, either synchronously or asynchronously\" (push strategy)","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"When a new value is available in an observable we say that the observable emits or generates an update. Values that are generated by an observable are sometimes also called future values, because there is no principled way to predict when an observable will generate a new value. In some programming languages, observables are referred to as generators or streams and we will use all three terms interchangeably.","category":"page"},{"location":"observables/about/#Anatomy-of-an-Observable","page":"Observable","title":"Anatomy of an Observable","text":"","category":"section"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"Observables are (1) created using creation operators (it is also possible to build an Observable from scratch with custom logic); (2) subscribed to with an Actor; (3) execute to deliver next! / error! / complete! notifications to the Actor, and (4) their execution may be disposed. These four aspects are all encoded in an Observable instance, but some of these aspects are related to other types, such as Subscribable and Subscription.","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"The core responsibilities of an Observable are:","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"Creating Observables\nSubscribing to Observables\nExecuting the Observable\nDisposing Observables","category":"page"},{"location":"observables/about/#Creating-Observables","page":"Observable","title":"Creating Observables","text":"","category":"section"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"You can create an Observable in various ways using Creation operators. You can also build an Observable from scratch. To see how you can build an Observable with custom logic, consult the API Section.","category":"page"},{"location":"observables/about/#Subscribing-to-Observables","page":"Observable","title":"Subscribing to Observables","text":"","category":"section"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"The Observable source in the example can be subscribed to.","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"using Rocket\n\nsubscribe!(source, lambda(\n on_next = (d) -> println(d)\n))","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"This example shows how subscribe calls are not shared among multiple Actors of the same Observable. When calling subscribe! with an Actor, the function on_subscribe! that is attached to this particular Observable is executed for that given actor. Each call to subscribe! triggers its own independent setup for that given actor.","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"note: Note\nSubscribing to an Observable is like calling a function, providing callbacks where the data will be delivered to.","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"The subscribe! function also supports multiple subscriptions at once. If the input argument to the subscribe! function is a tuple or a vector, it will first check that all of the arguments are valid source objects and actors and if its true will subscribe from each of them individually.","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"\nsource1 = Subject(Int)\nsource2 = Subject(Int)\n\nsubscriptions = subscribe!([\n (source1, logger()),\n (source2, logger()),\n])\n\n# Later on\n# unsubscribe!(subscriptions)\n","category":"page"},{"location":"observables/about/#Executing-Observables","page":"Observable","title":"Executing Observables","text":"","category":"section"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"The execution produces multiple values over time, either synchronously or asynchronously.","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"An Observable Execution can deliver three types of notifications:","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"Next: sends a value, such as an Int, String, Dict, etc.;\nError: sends any error as a value;\nComplete: does not send a value.","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"\"Next\" notifications are the most important and most common type: they represent actual data being delivered to an subscriber. \"Error\" and \"Complete\" notifications terminate the Observable Execution.","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"note: Note\nIn an Observable Execution, any number of Next notifications may be delivered. However, once a single Error or Complete notification is delivered, nothing else can be delivered afterwards.","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"The following is an example of an Observable execution that delivers three Next notifications and subsequently completes:","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"using Rocket\n\nsource = make(Int) do actor\n next!(actor, 1)\n next!(actor, 2)\n next!(actor, 3)\n complete!(actor)\nend\n\n# or the same with creation operator\n\nsource = from([ 1, 2, 3 ])","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"It is advised to wrap any code in subscribe by a try/catch block that delivers an Error notification upon an exception:","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"using Rocket\n\nsource = make(Int) do actor\n try\n next!(actor, 1)\n next!(actor, 2)\n next!(actor, 3)\n complete!(actor)\n catch e\n error!(actor, e)\n end\nend\n","category":"page"},{"location":"observables/about/#Disposing-Observable-Executions","page":"Observable","title":"Disposing Observable Executions","text":"","category":"section"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"It is common for an Actor to abort execution of an Observable Execution. Once the Actor is done receiving values, it may stop the execution in order to free computation power or memory resources.","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"When subscribe! is called, the Actor gets attached to the newly created Observable execution. This call also returns an object, the Subscription:","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"subscription = subscribe!(source, actor)","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"The Subscription represents the ongoing execution, and has a minimal API that allows you to cancel the execution. Read more about Subscription type here.","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"With","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"unsubscribe!(subscription)","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"you can cancel the ongoing execution.","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"note: Note\nsubscribe! returns a Subscription that represents the ongoing execution. Simply call unsubscribe! on the Subscription to cancel the execution.","category":"page"},{"location":"actors/types/circularkeep/#actor_circularkeep","page":"CircularKeep","title":"CircularKeep actor","text":"","category":"section"},{"location":"actors/types/circularkeep/","page":"CircularKeep","title":"CircularKeep","text":"circularkeep","category":"page"},{"location":"actors/types/circularkeep/#Rocket.circularkeep","page":"CircularKeep","title":"Rocket.circularkeep","text":"circularkeep(::Type{T}, capacity::Int) where T\n\nArguments\n\n::Type{T}: Type of keep data\ncapacity::Int: circular buffer capacity\n\nCreation operator for the CircularKeepActor actor.\n\nExamples\n\nusing Rocket\n\nactor = circularkeep(Int, 3)\nactor isa CircularKeepActor{Int}\n\n# output\ntrue\n\nSee also: CircularKeepActor, AbstractActor\n\n\n\n\n\n","category":"function"},{"location":"actors/types/circularkeep/","page":"CircularKeep","title":"CircularKeep","text":"CircularKeepActor","category":"page"},{"location":"actors/types/circularkeep/#Rocket.CircularKeepActor","page":"CircularKeep","title":"Rocket.CircularKeepActor","text":"CirucalKeepActor{D}() where D\n\nCircual keep actor is similar to keep actor, but uses CircularBuffer as a storage. It saves all incoming successful next events in a values circular buffer, throws an ErrorException on error! event and does nothing on completion event.\n\nExamples\n\nusing Rocket\n\nsource = from(1:5)\nactor = circularkeep(Int, 3)\n\nsubscribe!(source, actor)\nshow(getvalues(actor))\n\n# output\n[3, 4, 5]\n\nSee also: Actor, keep, circularkeep\n\n\n\n\n\n","category":"type"},{"location":"operators/utility/default_if_empty/#operator_ref_default_if_empty","page":"default_if_empty","title":"DefaultIfEmpty Operator","text":"","category":"section"},{"location":"operators/utility/default_if_empty/","page":"default_if_empty","title":"default_if_empty","text":"default_if_empty","category":"page"},{"location":"operators/utility/default_if_empty/#Rocket.default_if_empty","page":"default_if_empty","title":"Rocket.default_if_empty","text":"default_if_empty(value::T)\ndefault_if_empty(callback::Function)\n\nCreates a default_if_empty operator, which emits a given value if the source Observable completes without emitting any next value, otherwise mirrors the source Observable. Optionally accepts a zero-argument callback that will be executed to generate default value. Note: Callback function's output is always converted to the eltype of the original observable.\n\nusing Rocket\n\nsource = completed(Int) |> default_if_empty(0)\n\nsubscribe!(source, logger())\n;\n\n# output\n[LogActor] Data: 0\n[LogActor] Completed\n\nusing Rocket\n\nsource = completed(Int) |> default_if_empty(() -> 42)\n\nsubscribe!(source, logger())\n;\n\n# output\n[LogActor] Data: 42\n[LogActor] Completed\n\nSee also: AbstractOperator, InferableOperator, logger, map\n\n\n\n\n\n","category":"function"},{"location":"operators/utility/default_if_empty/#Description","page":"default_if_empty","title":"Description","text":"","category":"section"},{"location":"operators/utility/default_if_empty/","page":"default_if_empty","title":"default_if_empty","text":"default_if_empty emits the values emitted by the source Observable or a specified default value if the source Observable is empty (completes without having emitted any next value).","category":"page"},{"location":"operators/utility/default_if_empty/#See-also","page":"default_if_empty","title":"See also","text":"","category":"section"},{"location":"operators/utility/default_if_empty/","page":"default_if_empty","title":"default_if_empty","text":"Operators","category":"page"},{"location":"observables/types/never/#observable_never","page":"Never","title":"Never Observable","text":"","category":"section"},{"location":"observables/types/never/","page":"Never","title":"Never","text":"never","category":"page"},{"location":"observables/types/never/#Rocket.never","page":"Never","title":"Rocket.never","text":"never(T = Any)\n\nCreation operator for the NeverObservable that emits neither values nor errors nor the completion notification. It can be used for testing purposes or for composing with other Observables. Please note that by never emitting a complete notification, this Observable keeps the subscription from being disposed automatically. Subscriptions need to be manually disposed.\n\nArguments\n\nT: Type of Observable data, optional, Any is the default\n\nExamples\n\nusing Rocket\n\nsource = never()\nsubscribe!(source, logger())\n;\n\n# output\n\n\nSee also: NeverObservable, subscribe!, logger\n\n\n\n\n\n","category":"function"},{"location":"observables/types/never/","page":"Never","title":"Never","text":"NeverObservable","category":"page"},{"location":"observables/types/never/#Rocket.NeverObservable","page":"Never","title":"Rocket.NeverObservable","text":"NeverObservable{D}()\n\nAn Observable that emits no items to the Observer and never completes.\n\nType parameters\n\nD: Type of Observable data\n\nSee also: Subscribable, never\n\n\n\n\n\n","category":"type"},{"location":"operators/utility/about/#Utility-category","page":"About utility operators","title":"Utility category","text":"","category":"section"},{"location":"operators/utility/about/","page":"About utility operators","title":"About utility operators","text":"There are operators for different purposes, and they may be categorized as: creation, transformation, filtering, joining, multicasting, error handling, utility, etc. In the following list you will find all the operators organized in utility category.","category":"page"},{"location":"operators/utility/about/","page":"About utility operators","title":"About utility operators","text":"tap\ntap_on_subscribe\ntap_on_unsubscribe\ntap_on_complete\ndelay\nsafe\nnoop\nref_count\nasync\ndefault_if_empty\nerror_if_empty\nskip_next\nskip_error\nskip_complete\ndiscontinue\nlimit_subscribers","category":"page"},{"location":"operators/utility/about/#See-also","page":"About utility operators","title":"See also","text":"","category":"section"},{"location":"operators/utility/about/","page":"About utility operators","title":"About utility operators","text":"Operators","category":"page"},{"location":"operators/all/#operators_list","page":"All","title":"List of all available operators","text":"","category":"section"},{"location":"operators/all/","page":"All","title":"All","text":"There are operators for different purposes, and they may be categorized as: creation, transformation, filtering, joining, multicasting, error handling, utility, etc.","category":"page"},{"location":"operators/all/#Creation-operators","page":"All","title":"Creation operators","text":"","category":"section"},{"location":"operators/all/","page":"All","title":"All","text":"make\nof\nfrom\niterable\nfaulted\nnever\ncompleted\ntimer\ninterval\nproxy\nfile\ncombined\nrace\nconnectable\nmerged\nconcat\ngenerate\nnetwork\ndefer\nzipped","category":"page"},{"location":"operators/all/#Transformation-operators","page":"All","title":"Transformation operators","text":"","category":"section"},{"location":"operators/all/","page":"All","title":"All","text":"map\nmap_to\nscan\naccumulated\nenumerate\nuppercase\nlowercase\nto_array\nswitch_map\nswitch_map_to\nmerge_map\nconcat_map\nconcat_map_to\nexhaust_map\nstart_with\npairwise\nsubstitute\noverride","category":"page"},{"location":"operators/all/#Filtering-operators","page":"All","title":"Filtering operators","text":"","category":"section"},{"location":"operators/all/","page":"All","title":"All","text":"filter\nfilter_type\nsome\ntake\ntake_until\nfirst\nlast\nfind\nfind_index\nignore","category":"page"},{"location":"operators/all/#Mathematical-and-Aggregate-operators","page":"All","title":"Mathematical and Aggregate operators","text":"","category":"section"},{"location":"operators/all/","page":"All","title":"All","text":"count\nmax\nmin\nreduce\nsum","category":"page"},{"location":"operators/all/#Error-handling-operators","page":"All","title":"Error handling operators","text":"","category":"section"},{"location":"operators/all/","page":"All","title":"All","text":"catch_error\nrerun\nerror_if\nerror_if_not","category":"page"},{"location":"operators/all/#Join-operator","page":"All","title":"Join operator","text":"","category":"section"},{"location":"operators/all/","page":"All","title":"All","text":"with_latest","category":"page"},{"location":"operators/all/#Multicasting-operators","page":"All","title":"Multicasting operators","text":"","category":"section"},{"location":"operators/all/","page":"All","title":"All","text":"multicast\npublish\npublish_behavior\npublish_replay\nshare\nshare_replay","category":"page"},{"location":"operators/all/#Utility-operators","page":"All","title":"Utility operators","text":"","category":"section"},{"location":"operators/all/","page":"All","title":"All","text":"tap\ntap_on_subscribe\ntap_on_unsubscribe\ntap_on_complete\ndelay\nsafe\nnoop\nref_count\nasync\ndefault_if_empty\nerror_if_empty\nskip_next\nskip_error\nskip_complete\ndiscontinue\nlimit_subscribers","category":"page"},{"location":"observables/types/concat/#observable_concat","page":"Concat","title":"Concat Observable","text":"","category":"section"},{"location":"observables/types/concat/","page":"Concat","title":"Concat","text":"concat","category":"page"},{"location":"observables/types/concat/#Rocket.concat","page":"Concat","title":"Rocket.concat","text":"concat(sources...)\nconcat(sources::S) where { S <: Tuple }\n\nCombines multiple Observables to create an Observable which sequentially emits all values from given Observable and then moves on to the next. All values of each passed Observable merged into a single Observable, in order, in serial fashion.\n\nArguments\n\nsources: input sources\n\nExamples\n\nusing Rocket\n\nsource1 = of(1)\nsource2 = of(2)\n\nsubscribe!(concat(source1, source2), logger())\n;\n\n# output\n[LogActor] Data: 1\n[LogActor] Data: 2\n[LogActor] Completed\n\nusing Rocket\n\nsource1 = of(1) |> async()\nsource2 = of(2)\n\nsubscribe!(concat(source1, source2), logger())\n;\n\n# output\n[LogActor] Data: 1\n[LogActor] Data: 2\n[LogActor] Completed\n\nSee also: Subscribable, subscribe!\n\n\n\n\n\n","category":"function"},{"location":"observables/types/labeled/#observable_labeled","page":"Labeled","title":"Labeled Observable","text":"","category":"section"},{"location":"observables/types/labeled/","page":"Labeled","title":"Labeled","text":"labeled","category":"page"},{"location":"observables/types/labeled/#Rocket.labeled","page":"Labeled","title":"Rocket.labeled","text":"labeled(names::Val, stream)\n\nCreation operator for the LabeledObservable that wraps given stream, that produces Tuple values into a NamedTuple with given names.\n\nArguments\n\nnames: a Val object that contains a tuple of symbols\nstream: an observable that emits a Tuple, length of the Tuple events must be equal to the length of the names argument\n\nExamples\n\nusing Rocket\n\nsource = labeled(Val((:x, :y)), from([ (1, 2), (2, 3), (3, 4) ]))\nsubscribe!(source, logger())\n;\n\n# output\n\n[LogActor] Data: (x = 1, y = 2)\n[LogActor] Data: (x = 2, y = 3)\n[LogActor] Data: (x = 3, y = 4)\n[LogActor] Completed\n\nSee also: ScheduledSubscribable, subscribe!, from\n\n\n\n\n\n","category":"function"},{"location":"observables/types/labeled/","page":"Labeled","title":"Labeled","text":"LabeledObservable","category":"page"},{"location":"observables/types/labeled/#Rocket.LabeledObservable","page":"Labeled","title":"Rocket.LabeledObservable","text":"LabeledObservable{D, S}()\n\nAn Observable that emits NamesTuple items from a source Observable that emits Tuple items.\n\nSee also: Subscribable, labeled\n\n\n\n\n\n","category":"type"},{"location":"actors/types/lambda/#actor_lambda","page":"Lambda","title":"Lambda actor","text":"","category":"section"},{"location":"actors/types/lambda/","page":"Lambda","title":"Lambda","text":"lambda","category":"page"},{"location":"actors/types/lambda/#Rocket.lambda","page":"Lambda","title":"Rocket.lambda","text":"lambda(; on_next = nothing, on_error = nothing, on_complete = nothing)\nlambda(::Type{T}; on_next = nothing, on_error = nothing, on_complete = nothing) where T\n\nCreation operator for the 'LambdaActor' actor.\n\nExamples\n\nusing Rocket\n\nactor = lambda(Int; on_next = (d) -> println(d))\nactor isa LambdaActor{Int}\n\n# output\ntrue\n\nSee also: LambdaActor, AbstractActor\n\n\n\n\n\n","category":"function"},{"location":"actors/types/lambda/","page":"Lambda","title":"Lambda","text":"LambdaActor","category":"page"},{"location":"actors/types/lambda/#Rocket.LambdaActor","page":"Lambda","title":"Rocket.LambdaActor","text":"LambdaActor{D, N, E, C}(on_next::N, on_error::E, on_complete::C) where D\n\nLambda actor wraps on_next, on_error, on_complete callbacks for data, error and complete events. Should not be used explicitly, use lambda creation operator instead.\n\nConstructor arguments\n\non_next: Callback for data event. Optional. Default is nothing.\non_error: Callback for error event. Optional. Default is nothing.\non_complete: Callback for complete event. Optional. Default is nothing.\n\nSee also: Actor, lambda\n\n\n\n\n\n","category":"type"},{"location":"operators/utility/error_if_empty/#operator_ref_error_if_empty","page":"error_if_empty","title":"ErrorIfEmpty Operator","text":"","category":"section"},{"location":"operators/utility/error_if_empty/","page":"error_if_empty","title":"error_if_empty","text":"error_if_empty","category":"page"},{"location":"operators/utility/error_if_empty/#Rocket.error_if_empty","page":"error_if_empty","title":"Rocket.error_if_empty","text":"error_if_empty(err)\n\nCreates a error_if_empty operator, which emits a given error if the source Observable completes without emitting any next value, otherwise mirrors the source Observable.\n\nusing Rocket\n\nsource = completed(Int) |> error_if_empty(\"Empty\")\n\nsubscribe!(source, logger())\n;\n\n# output\n[LogActor] Error: Empty\n\nSee also: AbstractOperator, InferableOperator, logger, map\n\n\n\n\n\n","category":"function"},{"location":"operators/utility/error_if_empty/#Description","page":"error_if_empty","title":"Description","text":"","category":"section"},{"location":"operators/utility/error_if_empty/","page":"error_if_empty","title":"error_if_empty","text":"error_if_empty emits the values emitted by the source Observable or a specified error message if the source Observable is empty (completes without having emitted any next value).","category":"page"},{"location":"operators/utility/error_if_empty/#See-also","page":"error_if_empty","title":"See also","text":"","category":"section"},{"location":"operators/utility/error_if_empty/","page":"error_if_empty","title":"error_if_empty","text":"Operators","category":"page"},{"location":"subjects/types/subject/#subject","page":"Subject","title":"Subject","text":"","category":"section"},{"location":"subjects/types/subject/","page":"Subject","title":"Subject","text":"Subject\nSubjectFactory","category":"page"},{"location":"subjects/types/subject/#Rocket.Subject","page":"Subject","title":"Rocket.Subject","text":"Subject(::Type{D}; scheduler::H = AsapScheduler())\n\nA Subject is a special type of Observable that allows values to be multicasted to many Observers. Subjects are like EventEmitters. Every Subject is an Observable and an Actor. You can subscribe to a Subject, and you can call next! to feed values as well as error! and complete!.\n\nNote: By convention, every actor subscribed to a Subject observable is not allowed to throw exceptions during next!, error! and complete! calls. Doing so would lead to undefined behaviour. Use safe() operator to bypass this rule. \n\nSee also: SubjectFactory, ReplaySubject, BehaviorSubject, safe\n\n\n\n\n\n","category":"type"},{"location":"subjects/types/subject/#Rocket.SubjectFactory","page":"Subject","title":"Rocket.SubjectFactory","text":"SubjectFactory(scheduler::H) where { H <: AbstractScheduler }\n\nA base subject factory that creates an instance of Subject with specified scheduler.\n\nSee also: AbstractSubjectFactory, Subject\n\n\n\n\n\n","category":"type"},{"location":"subjects/types/subject/#Description","page":"Subject","title":"Description","text":"","category":"section"},{"location":"subjects/types/subject/","page":"Subject","title":"Subject","text":"Every Subject is an Observable. Given a Subject, you can subscribe to it, providing an Actor, which will start receiving values normally. From the perspective of the Observer, it cannot tell whether the Observable execution is coming from a plain unicast Observable or a Subject.","category":"page"},{"location":"subjects/types/subject/","page":"Subject","title":"Subject","text":"Internally to the Subject, subscribe does not invoke a new execution that delivers values. It simply registers the given Observer in a list of Observers.","category":"page"},{"location":"subjects/types/subject/","page":"Subject","title":"Subject","text":"Every Subject is an Actor. It is an object with the methods next!, error!, and complete!. To feed a new value to the Subject, just call next!(subject, theValue), and it will be multicasted to the Actors registered to listen to the Subject.","category":"page"},{"location":"subjects/types/subject/","page":"Subject","title":"Subject","text":"note: Note\nBy convention, every actor subscribed to a Subject observable is not allowed to throw exceptions during next!, error! and complete! calls. Doing so would lead to undefined behaviour. Use safe() operator to bypass this rule. ","category":"page"},{"location":"subjects/types/subject/#Examples","page":"Subject","title":"Examples","text":"","category":"section"},{"location":"subjects/types/subject/","page":"Subject","title":"Subject","text":"In the following example, the BehaviorSubject is initialized with the value 0 which the first Observer receives when it subscribes. The second Observer receives the value 2 even though it subscribed after the value 2 was sent.","category":"page"},{"location":"subjects/types/subject/","page":"Subject","title":"Subject","text":"using Rocket\n\nsubject = Subject(Int)\n\nsubscription1 = subscribe!(subject, logger(\"1\"))\n\nnext!(subject, 1)\nnext!(subject, 2)\n\nsubscription2 = subscribe!(subject, logger(\"2\"))\n\nnext!(subject, 3)\n\nunsubscribe!(subscription1)\nunsubscribe!(subscription2)\n\n// Logs\n// [1] Data: 1\n// [1] Data: 2\n// [1] Data: 3\n// [2] Data: 3","category":"page"},{"location":"utils/#Utils","page":"Utils","title":"Utils","text":"","category":"section"},{"location":"utils/","page":"Utils","title":"Utils","text":"setTimeout\nRocket.combined_type\nRocket.union_type","category":"page"},{"location":"utils/#Rocket.setTimeout","page":"Utils","title":"Rocket.setTimeout","text":"setTimeout(f::Function, timeout::Int)\n\nCreates a Task which will asynchornously invoke fucntion f after specified timeout time in milliseconds.\n\nArguments\n\nf::Function, function to be invoked asynchronously\ntimeout::Int, timeout in milliseconds\n\nExamples\n\nusing Rocket\nusing Dates\n\nprintln(\"Before: \", Dates.format(now(), \"MM:SS\"))\nsetTimeout(1000) do\n println(\"Inside: \", Dates.format(now(), \"MM:SS\"))\nend\nprintln(\"Right after: \", Dates.format(now(), \"MM:SS\"))\n;\n\n# Logs\n# Before: 20:59\n# Right after: 20:59\n# Inside: 21:00\n\n\n\n\n\n","category":"function"},{"location":"utils/#Rocket.combined_type","page":"Utils","title":"Rocket.combined_type","text":"combined_type(sources)\n\nReturns a Tuple el-type of observable el-types in sources argument in the same order\n\n\n\n\n\n","category":"function"},{"location":"utils/#Rocket.union_type","page":"Utils","title":"Rocket.union_type","text":"union_type(sources)\n\nReturns a Union el-type of observable el-types in sources argument\n\n\n\n\n\n","category":"function"},{"location":"utils/#Helpers","page":"Utils","title":"Helpers","text":"","category":"section"},{"location":"utils/","page":"Utils","title":"Utils","text":"Rocket.@MStorage\nRocket.setstorage!","category":"page"},{"location":"utils/#Rocket.@MStorage","page":"Utils","title":"Rocket.@MStorage","text":"@MStorage(n::Int)\n\nHelper function to generate tuple-like structure MStorageN, but with mutable fields and empty constructor. It is possible then to take a snapshot(::MStorage) which returns a tuple with the same types and values from storage. Some operators and observables use pregenerated MStorage to instatiate uninitialized mutable storage in case when stream is allowed to not emit any values before completion.\n\nGenerated structure layout\n\nstruct MStorageN{V1, V2, ..., VN}\n v1 :: V1\n v2 :: V2\n ...\n vn :: VN\nend\n\nSee also: setstorage!\n\n\n\n\n\n","category":"macro"},{"location":"utils/#Rocket.setstorage!","page":"Utils","title":"Rocket.setstorage!","text":"setstorage!(s, v, ::Val{I}) where I\n\nThis function can be used to set a new value v for storage s with a given value v and index I. Using parametrized Val{I} for indexing ensures for index to be resolved at compile-time and if-else branch optimization.\n\nSee also: @MStorage\n\n\n\n\n\n","category":"function"},{"location":"observables/types/completed/#observable_completed","page":"Completed","title":"Completed Observable","text":"","category":"section"},{"location":"observables/types/completed/","page":"Completed","title":"Completed","text":"completed","category":"page"},{"location":"observables/types/completed/#Rocket.completed","page":"Completed","title":"Rocket.completed","text":"completed(::Type{T} = Any; scheduler::H = AsapScheduler()) where { T, H <: AbstractScheduler }\n\nCreation operator for the CompletedObservable that emits no items to the Actor and immediately sends a complete notification on subscription.\n\nArguments\n\nT: type of output data source, optional, Any is the default\nscheduler: optional, scheduler-like object\n\nExamples\n\nusing Rocket\n\nsource = completed(Int)\nsubscribe!(source, logger())\n;\n\n# output\n\n[LogActor] Completed\n\n\nSee also: CompletedObservable, subscribe!, logger\n\n\n\n\n\n","category":"function"},{"location":"observables/types/completed/","page":"Completed","title":"Completed","text":"CompletedObservable","category":"page"},{"location":"observables/types/completed/#Rocket.CompletedObservable","page":"Completed","title":"Rocket.CompletedObservable","text":"CompletedObservable{D, H}(scheduler::H)\n\nObservable that emits no items to the Actor and just sends a complete notification on subscription.\n\nConstructor arguments\n\nscheduler: Scheduler-like object\n\nSee also: Subscribable, completed\n\n\n\n\n\n","category":"type"},{"location":"operators/utility/tap/#operator_tap","page":"tap","title":"Tap Operator","text":"","category":"section"},{"location":"operators/utility/tap/","page":"tap","title":"tap","text":"tap","category":"page"},{"location":"operators/utility/tap/#Rocket.tap","page":"tap","title":"Rocket.tap","text":"tap(tapFn::F) where { F <: Function }\n\nCreates a tap operator, which performs a side effect for every emission on the source Observable, but return an Observable that is identical to the source.\n\nArguments\n\ntapFn::Function: side-effect tap function with (data) -> Nothing signature\n\nProducing\n\nStream of type <: Subscribable{L} where L refers to type of source stream\n\nExamples\n\nusing Rocket\n\nsource = from([ 1, 2, 3 ])\nsubscribe!(source |> tap((d) -> println(\"In tap: $d\")), logger())\n;\n\n# output\n\nIn tap: 1\n[LogActor] Data: 1\nIn tap: 2\n[LogActor] Data: 2\nIn tap: 3\n[LogActor] Data: 3\n[LogActor] Completed\n\n\nSee also: tap_on_subscribe, tap_on_complete, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/utility/tap/#Description","page":"tap","title":"Description","text":"","category":"section"},{"location":"operators/utility/tap/","page":"tap","title":"tap","text":"Returns an Observable that resembles the source Observable, but modifies it so that the provided Observer is called to perform a side effect for every value emitted by the source.","category":"page"},{"location":"operators/utility/tap/","page":"tap","title":"tap","text":"This operator is useful for debugging your Observables, verifying correct values, or performing other side effects.","category":"page"},{"location":"operators/utility/tap/","page":"tap","title":"tap","text":"Note: this operator differs from a subscribe on the Observable. If the Observable returned by tap is not subscribed, the side effects specified by the Observer will never happen. tap therefore simply spies on existing execution, it does not trigger an execution to happen like subscribe does.","category":"page"},{"location":"operators/utility/tap/#See-also","page":"tap","title":"See also","text":"","category":"section"},{"location":"operators/utility/tap/","page":"tap","title":"tap","text":"Operators","category":"page"},{"location":"observables/types/network/#observable_network","page":"Network","title":"Network Observable","text":"","category":"section"},{"location":"observables/types/network/","page":"Network","title":"Network","text":"network","category":"page"},{"location":"observables/types/network/#Rocket.network","page":"Network","title":"Rocket.network","text":"network(::Type{D}, port::Int) where D\nnetwork(::Type{D}, address::A, port::Int) where { D, A <: IPAddr }\n\nnetwork(::Type{Vector{D}}, port::Int, buffer_size::Int) where D\nnetwork(::Type{Vector{D}}, address::A, port::Int, buffer_size::Int) where { D, A <: IPAddr }\n\nCreation operator for the NetworkObservable that emits messages from the server with specified address and port arguments.\n\nSee also: NetworkObservable, subscribe!\n\n\n\n\n\n","category":"function"},{"location":"observables/types/network/","page":"Network","title":"Network","text":"NetworkObservable","category":"page"},{"location":"observables/types/network/#Rocket.NetworkObservable","page":"Network","title":"Rocket.NetworkObservable","text":"NetworkObservable{D, Address, Port, S}()\n\nNetworkObservable listens for the messages of type D from remote server with specified Address and Port parameters.\n\nSee also: network, Subscribable\n\n\n\n\n\n","category":"type"},{"location":"observables/types/function/#observable_function","page":"Function","title":"Function Observable","text":"","category":"section"},{"location":"observables/types/function/","page":"Function","title":"Function","text":"make","category":"page"},{"location":"observables/types/function/#Rocket.make","page":"Function","title":"Rocket.make","text":"make(f::Function, type::Type{D})\n\nCreation operator for the FunctionObservable.\n\nArguments\n\nf: function to be invoked on subscription\ntype: type of data in observable\n\nExamples\n\nusing Rocket\n\nsource = make(Int) do actor\n next!(actor, 0)\n complete!(actor)\nend\n\nsubscription = subscribe!(source, logger());\nunsubscribe!(subscription)\n;\n\n# output\n\n[LogActor] Data: 0\n[LogActor] Completed\n\n\nusing Rocket\n\nsource = make(Int) do actor\n next!(actor, 0)\n setTimeout(100) do\n next!(actor, 1)\n complete!(actor)\n end\nend\n\nsubscription = subscribe!(source, logger())\nunsubscribe!(subscription)\n;\n\n# output\n\n[LogActor] Data: 0\n\nSee also: FunctionObservable, subscribe!, logger\n\n\n\n\n\n","category":"function"},{"location":"observables/types/function/","page":"Function","title":"Function","text":"FunctionObservable","category":"page"},{"location":"observables/types/function/#Rocket.FunctionObservable","page":"Function","title":"Rocket.FunctionObservable","text":"FunctionObservable{D}(f::F)\n\nFunctionObservable wraps a callback f, which is called when the Observable is initially subscribed to. This function is given an Actor, to which new values can be nexted (with next!(actor, data)), or an error! method can be called to raise an error, or complete! can be called to notify of a successful completion.\n\nArguments\n\nf::F: function to be invoked on subscription\n\nSee also: Subscribable, make\n\n\n\n\n\n","category":"type"},{"location":"observables/types/race/#observable_race","page":"Race","title":"Race Observable","text":"","category":"section"},{"location":"observables/types/race/","page":"Race","title":"Race","text":"race","category":"page"},{"location":"observables/types/race/#Rocket.race","page":"Race","title":"Rocket.race","text":"race(sources...)\nrace(sources::S) where { S <: Tuple }\n\nCombines multiple Observables to create an Observable that mirrors the output of the first Observable to emit an item. Essentially it subscribes to the observable that was the first to start emitting.\n\nArguments\n\nsources: input sources\n\nExamples\n\nusing Rocket\n\nsource1 = of(1)\nsource2 = of(2)\n\nsubscribe!(race(source1, source2), logger())\n;\n\n# output\n[LogActor] Data: 1\n[LogActor] Completed\n\nusing Rocket\n\nsource1 = of(1) |> async()\nsource2 = of(2)\n\nsubscribe!(race(source1, source2), logger())\n;\n\n# output\n[LogActor] Data: 2\n[LogActor] Completed\n\nSee also: Subscribable, subscribe!\n\n\n\n\n\n","category":"function"},{"location":"operators/transformation/concat_map_to/#operator_concat_map_to","page":"concat_map_to","title":"ConcatMapTo Operator","text":"","category":"section"},{"location":"operators/transformation/concat_map_to/","page":"concat_map_to","title":"concat_map_to","text":"concat_map_to","category":"page"},{"location":"operators/transformation/concat_map_to/#Rocket.concat_map_to","page":"concat_map_to","title":"Rocket.concat_map_to","text":"switch_map_to(inner_observable)\n\nCreates a switch_map_to operator, which returns an observable of values merged together by joining the passed observable with itself, one after the other, for each value emitted from the source. Essentially it projects each source value to the same Observable which is merged multiple times in a serialized fashion on the output Observable.\n\nArguments\n\ninner_observable: an Observable to replace each value from the source Observable.\n\nProducing\n\nStream of type <: Subscribable{R} where R refers to the eltype of inner_observable\n\nExamples\n\nusing Rocket\n\nsource = from([ 0, 0, 0 ])\nsubscribe!(source |> concat_map_to(from([ 1, 2, 3 ])), logger())\n;\n\n# output\n\n[LogActor] Data: 1\n[LogActor] Data: 2\n[LogActor] Data: 3\n[LogActor] Data: 1\n[LogActor] Data: 2\n[LogActor] Data: 3\n[LogActor] Data: 1\n[LogActor] Data: 2\n[LogActor] Data: 3\n[LogActor] Completed\n\nSee also: concat_map, AbstractOperator, RightTypedOperator, ProxyObservable, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/transformation/concat_map_to/","page":"concat_map_to","title":"concat_map_to","text":"note: Note\nconcat_map_to is equivalent to concat_map with mappingFn set to (_) -> inner_observable.","category":"page"},{"location":"operators/transformation/concat_map_to/#See-also","page":"concat_map_to","title":"See also","text":"","category":"section"},{"location":"operators/transformation/concat_map_to/","page":"concat_map_to","title":"concat_map_to","text":"Operators, concat_map","category":"page"},{"location":"operators/errors/error_if_not/#operator_error_if_not","page":"error_if_not","title":"Error If Not Operator","text":"","category":"section"},{"location":"operators/errors/error_if_not/","page":"error_if_not","title":"error_if_not","text":"Note: error_if_not is an alias for error_if operator with inverted checkFn.","category":"page"},{"location":"operators/errors/error_if_not/","page":"error_if_not","title":"error_if_not","text":"error_if_not","category":"page"},{"location":"operators/errors/error_if_not/#Rocket.error_if_not","page":"error_if_not","title":"Rocket.error_if_not","text":"error_if_not(checkFn, errorFn)\n\nCreates an error_if_not operator, which performs a check for every emission on the source Observable with checkFn. If checkFn returns false, the operator sends an error event and unsubscribes from the observable.\n\nNote: error_if_not is an alias for error_if operator with inverted checkFn.\n\nArguments\n\ncheckFn: check function with (data) -> Bool signature\nerrorFn: error object generating function with (data) -> Any signature, optional\n\nProducing\n\nStream of type <: Subscribable{L} where L refers to type of source stream\n\nExamples\n\nusing Rocket\n\nsource = from([1, 2, 3]) |> error_if_not((data) -> data < 2, (data) -> \"CustomError\")\n\nsubscription = subscribe!(source, lambda(\n on_next = (d) -> println(\"Next: \", d),\n on_error = (e) -> println(\"Error: \", e),\n on_complete = () -> println(\"Completed\")\n))\n;\n\n# output\nNext: 1\nError: CustomError\n\nSee also: error_if, error_if_empty, default_if_empty, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/errors/error_if_not/#See-also","page":"error_if_not","title":"See also","text":"","category":"section"},{"location":"operators/errors/error_if_not/","page":"error_if_not","title":"error_if_not","text":"Operators","category":"page"},{"location":"todo/#TODO","page":"TODO","title":"TODO","text":"","category":"section"},{"location":"todo/","page":"TODO","title":"TODO","text":"This package in under development and some features of the reactive framework not yet implemented.","category":"page"},{"location":"operators/mathematical/count/#operator_count","page":"count","title":"Count Operator","text":"","category":"section"},{"location":"operators/mathematical/count/","page":"count","title":"count","text":"count","category":"page"},{"location":"operators/mathematical/count/#Base.count","page":"count","title":"Base.count","text":"count()\n\nCreates a count operator, which counts the number of emissions on the source and emits that number when the source completes.\n\nProducing\n\nStream of type <: Subscribable{Int}\n\nExamples\n\nusing Rocket\n\nsource = from([ i for i in 1:42 ])\nsubscribe!(source |> count(), logger())\n;\n\n# output\n\n[LogActor] Data: 42\n[LogActor] Completed\n\n\nSee also: AbstractOperator, RightTypedOperator, ProxyObservable, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/mathematical/count/#Description","page":"count","title":"Description","text":"","category":"section"},{"location":"operators/mathematical/count/","page":"count","title":"count","text":"count transforms an Observable that emits values into an Observable that emits a single value that represents the number of values emitted by the source Observable. If the source Observable terminates with an error, count will pass this error notification along without emitting a value first. If the source Observable does not terminate at all, count will neither emit a value nor terminate.","category":"page"},{"location":"operators/mathematical/count/#Example","page":"count","title":"Example","text":"","category":"section"},{"location":"operators/mathematical/count/","page":"count","title":"count","text":"Counts how many values source Observable have emitted before the complete event happened","category":"page"},{"location":"operators/mathematical/count/","page":"count","title":"count","text":"using Rocket\n\nsource = from([ i for i in 1:42 ])\nsubscribe!(source |> count(), logger())\n\n# output\n\n[LogActor] Data: 42\n[LogActor] Completed","category":"page"},{"location":"operators/mathematical/count/#See-also","page":"count","title":"See also","text":"","category":"section"},{"location":"operators/mathematical/count/","page":"count","title":"count","text":"Operators","category":"page"},{"location":"operators/transformation/map_to/#operator_map_to","page":"map_to","title":"MapTo Operator","text":"","category":"section"},{"location":"operators/transformation/map_to/","page":"map_to","title":"map_to","text":"map_to","category":"page"},{"location":"operators/transformation/map_to/#Rocket.map_to","page":"map_to","title":"Rocket.map_to","text":"map_to(value::T) where T\n\nCreates a map operator, which emits the given constant value on the output Observable every time the source Observable emits a value.\n\nArguments\n\nvalue::T: the constant value to map each source value to\n\nProducing\n\nStream of type <: Subscribable{T}\n\nExamples\n\nusing Rocket\n\nsource = from([ 1, 2, 3 ])\nsubscribe!(source |> map_to('a'), logger())\n;\n\n# output\n\n[LogActor] Data: a\n[LogActor] Data: a\n[LogActor] Data: a\n[LogActor] Completed\n\nSee also: map, AbstractOperator, RightTypedOperator, ProxyObservable, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/transformation/map_to/#Description","page":"map_to","title":"Description","text":"","category":"section"},{"location":"operators/transformation/map_to/","page":"map_to","title":"map_to","text":"Takes a constant value as argument, and emits that whenever the source Observable emits a value. In other words, ignores the actual source value, and simply uses the emission moment to know when to emit the given value.","category":"page"},{"location":"operators/transformation/map_to/#See-also","page":"map_to","title":"See also","text":"","category":"section"},{"location":"operators/transformation/map_to/","page":"map_to","title":"map_to","text":"Operators","category":"page"},{"location":"observables/types/merged/#observable_merged","page":"Merged","title":"Merged Observable","text":"","category":"section"},{"location":"observables/types/merged/","page":"Merged","title":"Merged","text":"merged","category":"page"},{"location":"observables/types/merged/#Rocket.merged","page":"Merged","title":"Rocket.merged","text":"merged(sources::T) where { T <: Tuple }\n\nCreation operator for the MergeObservable with a given sources collected in a tuple. merge subscribes to each given input Observable (as arguments), and simply forwards (without doing any transformation) all the values from all the input Observables to the output Observable. The output Observable only completes once all input Observables have completed. Any error delivered by an input Observable will be immediately emitted on the output Observable.\n\nExamples\n\nusing Rocket\n\nobservable = merged((from(1:4), of(2.0), from(\"Hello\")))\n\nsubscribe!(observable, logger())\n;\n\n# output\n[LogActor] Data: 1\n[LogActor] Data: 2\n[LogActor] Data: 3\n[LogActor] Data: 4\n[LogActor] Data: 2.0\n[LogActor] Data: H\n[LogActor] Data: e\n[LogActor] Data: l\n[LogActor] Data: l\n[LogActor] Data: o\n[LogActor] Completed\n\nusing Rocket\n\nsubject = Subject(Int, scheduler = AsyncScheduler())\n\nobservable = merged((subject, of(2.0), from(\"Hello\")))\n\nactor = sync(logger())\n\nsubscribe!(observable, actor)\n\nsetTimeout(200) do\n next!(subject, 1)\n complete!(subject)\nend\n\nwait(actor)\n;\n\n# output\n[LogActor] Data: 2.0\n[LogActor] Data: H\n[LogActor] Data: e\n[LogActor] Data: l\n[LogActor] Data: l\n[LogActor] Data: o\n[LogActor] Data: 1\n[LogActor] Completed\n\nSee also: Subscribable\n\n\n\n\n\n","category":"function"},{"location":"operators/transformation/uppercase/#operator_uppercase","page":"uppercase","title":"Uppercase Operator","text":"","category":"section"},{"location":"operators/transformation/uppercase/","page":"uppercase","title":"uppercase","text":"uppercase","category":"page"},{"location":"operators/transformation/uppercase/#Base.Unicode.uppercase","page":"uppercase","title":"Base.Unicode.uppercase","text":"uppercase()\n\nCreates an uppercase operator, which forces each value to be in upper case\n\nProducing\n\nStream of type <: Subscribable{L} where L referes to type of data of input Observable\n\nExamples\n\nusing Rocket\n\nsource = of(\"Hello, world!\")\nsubscribe!(source |> uppercase(), logger())\n;\n\n# output\n\n[LogActor] Data: HELLO, WORLD!\n[LogActor] Completed\n\nSee also: AbstractOperator, InferableOperator, ProxyObservable, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/transformation/uppercase/#See-also","page":"uppercase","title":"See also","text":"","category":"section"},{"location":"operators/transformation/uppercase/","page":"uppercase","title":"uppercase","text":"Operators, map, lowercase","category":"page"},{"location":"observables/types/file/#observable_file","page":"File","title":"File Observable","text":"","category":"section"},{"location":"observables/types/file/","page":"File","title":"File","text":"file","category":"page"},{"location":"observables/types/file/#Rocket.file","page":"File","title":"Rocket.file","text":"file(path::String)\n\nCreation operator for the SyncFileObservable with a given path.\n\nSee also: SyncFileObservable\n\n\n\n\n\n","category":"function"},{"location":"observables/types/file/","page":"File","title":"File","text":"SyncFileObservable","category":"page"},{"location":"observables/types/file/#Rocket.SyncFileObservable","page":"File","title":"Rocket.SyncFileObservable","text":"SyncFileObservable(path::String)\n\nFile observable, which synchronously emits content of the file line by line as a String objects on subscription.\n\nSee also: file, Subscribable\n\n\n\n\n\n","category":"type"},{"location":"operators/mathematical/reduce/#operator_reduce","page":"reduce","title":"Reduce Operator","text":"","category":"section"},{"location":"operators/mathematical/reduce/","page":"reduce","title":"reduce","text":"reduce","category":"page"},{"location":"operators/mathematical/reduce/#Base.reduce","page":"reduce","title":"Base.reduce","text":"reduce(::Type{R}, reduceFn::Function, seed::R) where R\nreduce(reduceFn::F) where { F <: Function }\n\nCreates a reduce operator, which applies a given accumulator reduceFn function over the source Observable, and returns the accumulated result when the source completes, given an optional seed value. If a seed value is specified, then that value will be used as the initial value for the accumulator. If no seed value is specified, the first item of the source is used as the seed.\n\nArguments\n\n::Type{R}: the type of data of transformed value\nreduceFn::Function: transformation function with (data::T, current::R) -> R signature\nseed::R: optional seed accumulation value\n\nProducing\n\nStream of type <: Subscribable{R}\n\nExamples\n\nusing Rocket\n\nsource = from([ i for i in 1:10 ])\nsubscribe!(source |> reduce(Vector{Int}, (d, c) -> [ c..., d ], Int[]), logger())\n;\n\n# output\n\n[LogActor] Data: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]\n[LogActor] Completed\n\n\nusing Rocket\n\nsource = from([ i for i in 1:42 ])\nsubscribe!(source |> reduce(+), logger())\n;\n\n# output\n\n[LogActor] Data: 903\n[LogActor] Completed\n\n\nSee also: AbstractOperator, RightTypedOperator, ProxyObservable, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/mathematical/reduce/#Description","page":"reduce","title":"Description","text":"","category":"section"},{"location":"operators/mathematical/reduce/","page":"reduce","title":"reduce","text":"reduce applies an accumulator function to each value of the source Observable (from the past) and reduces it to a single value that is emitted by the output Observable. Note that reduce will only emit one value, only when the source Observable completes. It is equivalent to applying scan followed by last.","category":"page"},{"location":"operators/mathematical/reduce/","page":"reduce","title":"reduce","text":"It returns an Observable that applies a specified accumulator function to each item emitted by the source Observable. If a seed value is specified, then that value will be used as the initial value of the accumulator. If no seed value is specified, the first item of the source is used as the seed.","category":"page"},{"location":"operators/mathematical/reduce/#See-also","page":"reduce","title":"See also","text":"","category":"section"},{"location":"operators/mathematical/reduce/","page":"reduce","title":"reduce","text":"Operators, scan, last","category":"page"},{"location":"operators/filtering/some/#operator_some","page":"some","title":"Some Operator","text":"","category":"section"},{"location":"operators/filtering/some/","page":"some","title":"some","text":"some","category":"page"},{"location":"operators/filtering/some/#Rocket.some","page":"some","title":"Rocket.some","text":"some()\n\nCreates a some operator, which filters out nothing items by the source Observable by emitting only those that not equal to nothing.\n\nProducing\n\nStream of type <: Subscribable{L} where L refers to type of source stream <: Subscribable{Union{L, Nothing}}\n\nExamples\n\nusing Rocket\n\nsource = from([ 1, nothing, 3 ])\nsubscribe!(source |> some(), logger())\n;\n\n# output\n\n[LogActor] Data: 1\n[LogActor] Data: 3\n[LogActor] Completed\n\n\nSee also: AbstractOperator, InferableOperator, ProxyObservable, max, min, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/filtering/some/#Description","page":"some","title":"Description","text":"","category":"section"},{"location":"operators/filtering/some/","page":"some","title":"some","text":"This operator takes values from the source Observable and only emits those values that are not nothing.","category":"page"},{"location":"operators/filtering/some/#See-also","page":"some","title":"See also","text":"","category":"section"},{"location":"operators/filtering/some/","page":"some","title":"some","text":"Operators, filter","category":"page"},{"location":"actors/types/storage/#actor_storage","page":"Storage","title":"Storage actor","text":"","category":"section"},{"location":"actors/types/storage/","page":"Storage","title":"Storage","text":"storage","category":"page"},{"location":"actors/types/storage/#Rocket.storage","page":"Storage","title":"Rocket.storage","text":"storage(::Type{T}) where T\n\nArguments\n\n::Type{T}: Type of storage data\n\nCreation operator for the StorageActor actor.\n\nExamples\n\nusing Rocket\n\nactor = storage(Int)\nactor isa StorageActor{Int}\n\n# output\ntrue\n\nSee also: StorageActor, AbstractActor\n\n\n\n\n\n","category":"function"},{"location":"actors/types/storage/","page":"Storage","title":"Storage","text":"StorageActor","category":"page"},{"location":"actors/types/storage/#Rocket.StorageActor","page":"Storage","title":"Rocket.StorageActor","text":"StorageActor{D}() where D\n\nStorage actor provides an actor that stores a single (last) value passed to the next! callback. It saves last incoming successful next event in the value field, throws an ErrorException on error! event and does nothing on completion event. Before any events value initialised with nothing.\n\nExamples\n\nusing Rocket\n\nsource = from(1:5)\nactor = storage(Int)\n\nsubscribe!(source, actor)\nshow(getvalues(actor))\n\n# output\n5\n\nSee also: Actor, storage\n\n\n\n\n\n","category":"type"},{"location":"operators/multicasting/publish/#operator_publish","page":"publish","title":"Publish Operators","text":"","category":"section"},{"location":"operators/multicasting/publish/","page":"publish","title":"publish","text":"publish\npublish_behavior\npublish_replay\npublish_recent","category":"page"},{"location":"operators/multicasting/publish/#Rocket.publish","page":"publish","title":"Rocket.publish","text":"publish(; scheduler::H = AsapScheduler()) where { H <: AbstractScheduler }\n\npublish() is a shortcut for multicast(SubjectFactory())\n\nSee also: AbstractOperator, multicast, SubjectFactory\n\n\n\n\n\n","category":"function"},{"location":"operators/multicasting/publish/#Rocket.publish_behavior","page":"publish","title":"Rocket.publish_behavior","text":"publish_behavior(default; scheduler::H = AsapScheduler()) where { H <: AbstractScheduler }\n\npublish_behavior(default) is a shortcut for multicast(BehaviorSubjectFactory(default))\n\nSee also: AbstractOperator, multicast, BehaviorSubjectFactory\n\n\n\n\n\n","category":"function"},{"location":"operators/multicasting/publish/#Rocket.publish_replay","page":"publish","title":"Rocket.publish_replay","text":"publish_replay(size::Int; scheduler::H = AsapScheduler()) where { H <: AbstractScheduler }\n\npublish_replay(size) is a shortcut for multicast(ReplaySubjectFactory(size))\n\nSee also: AbstractOperator, multicast, ReplaySubjectFactory\n\n\n\n\n\n","category":"function"},{"location":"operators/multicasting/publish/#Rocket.publish_recent","page":"publish","title":"Rocket.publish_recent","text":"publish_recent(; scheduler::H = AsapScheduler()) where { H <: AbstractScheduler }\n\npublish_recent(size) is a shortcut for multicast(RecentSubjectFactory())\n\nSee also: AbstractOperator, multicast, RecentSubjectFactory\n\n\n\n\n\n","category":"function"},{"location":"operators/multicasting/publish/#See-also","page":"publish","title":"See also","text":"","category":"section"},{"location":"operators/multicasting/publish/","page":"publish","title":"publish","text":"Operators","category":"page"},{"location":"#Rocket.jl-Documentation","page":"Home","title":"Rocket.jl Documentation","text":"","category":"section"},{"location":"","page":"Home","title":"Home","text":"Welcome to the documentation for Rocket.jl.","category":"page"},{"location":"","page":"Home","title":"Home","text":"This documentation is an adaptation of the RxJS library documentation.","category":"page"},{"location":"#Table-of-Contents","page":"Home","title":"Table of Contents","text":"","category":"section"},{"location":"","page":"Home","title":"Home","text":"Pages = [\n \"getting-started.md\",\n \"observables/about.md\",\n \"actors/about.md\",\n \"teardown/about.md\",\n \"operators/about.md\",\n \"operators/piping.md\",\n \"operators/create-new-operator.md\",\n \"operators/high-order.md\",\n \"todo.md\",\n \"contributing.md\",\n \"utils.md\"\n]\nDepth = 2","category":"page"},{"location":"#Index","page":"Home","title":"Index","text":"","category":"section"},{"location":"","page":"Home","title":"Home","text":"","category":"page"},{"location":"actors/types/logger/#actor_logger","page":"Logger","title":"Logger actor","text":"","category":"section"},{"location":"actors/types/logger/","page":"Logger","title":"Logger","text":"logger","category":"page"},{"location":"actors/types/logger/#Rocket.logger","page":"Logger","title":"Rocket.logger","text":"logger([ io::IO ], name::String = \"LogActor\")\nlogger(::Type{T}, [ io::IO ], name::String = \"LogActor\") where T\n\nCreation operator for the LoggerActor actor.\n\nExamples\n\nusing Rocket\n\nsource = from([ 0, 1, 2 ])\nsubscribe!(source, logger())\n;\n\n# output\n\n[LogActor] Data: 0\n[LogActor] Data: 1\n[LogActor] Data: 2\n[LogActor] Completed\n\nusing Rocket\n\nsource = from([ 0, 1, 2 ])\nsubscribe!(source, logger(\"CustomName\"))\n;\n\n# output\n\n[CustomName] Data: 0\n[CustomName] Data: 1\n[CustomName] Data: 2\n[CustomName] Completed\n\nusing Rocket\n\nbuffer = IOBuffer()\n\nsource = from([ 0, 1, 2 ])\nsubscribe!(source, logger(buffer, \"CustomBuffer\"))\n;\n\nprint(String(take!(buffer)))\n# output\n\n[CustomBuffer] Data: 0\n[CustomBuffer] Data: 1\n[CustomBuffer] Data: 2\n[CustomBuffer] Completed\n\nSee also: LoggerActor, AbstractActor\n\n\n\n\n\n","category":"function"},{"location":"actors/types/logger/","page":"Logger","title":"Logger","text":"LoggerActor","category":"page"},{"location":"actors/types/logger/#Rocket.LoggerActor","page":"Logger","title":"Rocket.LoggerActor","text":"LoggerActor{D}(name::String = \"LogActor\", io::O) where { D, O }\n\nThe LoggerActor logs all next!/error!/complete! events that are sent from an Observable.\n\nConstructor arguments\n\nname: name of the logger. Optional. Default is LogActor.\nio: io stream to log in, maybe nothing to write to stdout\n\nSee also: Actor, logger\n\n\n\n\n\n","category":"type"},{"location":"operators/multicasting/about/#Multicasting-category","page":"About multicasting operators","title":"Multicasting category","text":"","category":"section"},{"location":"operators/multicasting/about/","page":"About multicasting operators","title":"About multicasting operators","text":"There are operators for different purposes, and they may be categorized as: creation, transformation, filtering, joining, multicasting, error handling, utility, etc. In the following list you will find all the operators organized in multicasting category.","category":"page"},{"location":"operators/multicasting/about/","page":"About multicasting operators","title":"About multicasting operators","text":"multicast\npublish\npublish_behavior\npublish_replay\nshare\nshare_replay","category":"page"},{"location":"operators/multicasting/about/#See-also","page":"About multicasting operators","title":"See also","text":"","category":"section"},{"location":"operators/multicasting/about/","page":"About multicasting operators","title":"About multicasting operators","text":"Operators","category":"page"},{"location":"observables/types/zipped/#observable_zipped","page":"Zipped","title":"Zipped Observable","text":"","category":"section"},{"location":"observables/types/zipped/","page":"Zipped","title":"Zipped","text":"zipped","category":"page"},{"location":"observables/types/zipped/#Rocket.zipped","page":"Zipped","title":"Rocket.zipped","text":"zipped(sources...)\n\nCombines multiple Observables to create an Observable whose values are calculated from the values, in order, of each of its input Observables.\n\nArguments\n\nsources: input sources\n\nExamples\n\nusing Rocket\n\nsource = zipped(of(1), from(2:5))\n\nsubscribe!(source, logger())\n;\n\n# output\n\n[LogActor] Data: (1, 2)\n[LogActor] Completed\n\nusing Rocket\n\nsource = zipped(from(1:3), from(1:5))\n\nsubscribe!(source, logger())\n;\n\n# output\n\n[LogActor] Data: (1, 1)\n[LogActor] Data: (2, 2)\n[LogActor] Data: (3, 3)\n[LogActor] Completed\n\nusing Rocket\n\nsource = zipped(completed(), of(0.0))\n\nsubscribe!(source, logger())\n;\n\n# output\n\n[LogActor] Completed\n\nSee also: Subscribable, subscribe!\n\n\n\n\n\n","category":"function"},{"location":"contributing/#Contribution-guidelines","page":"Contributing","title":"Contribution guidelines","text":"","category":"section"},{"location":"contributing/","page":"Contributing","title":"Contributing","text":"We welcome all possible contributors. This page details the some of the guidelines that should be followed when contributing to this package.","category":"page"},{"location":"contributing/#Reporting-bugs","page":"Contributing","title":"Reporting bugs","text":"","category":"section"},{"location":"contributing/","page":"Contributing","title":"Contributing","text":"We track bugs using GitHub issues. We encourage you to write complete, specific, reproducible bug reports. Mention the versions of Julia and Rocket.jl for which you observe unexpected behavior. Please provide a concise description of the problem and complement it with code snippets, test cases, screenshots, tracebacks or any other information that you consider relevant. This will help us to replicate the problem and narrow the search space for solutions.","category":"page"},{"location":"contributing/#Suggesting-features","page":"Contributing","title":"Suggesting features","text":"","category":"section"},{"location":"contributing/","page":"Contributing","title":"Contributing","text":"We welcome new feature proposals. However, before submitting a feature request, consider a few things:","category":"page"},{"location":"contributing/","page":"Contributing","title":"Contributing","text":"Does the feature require changes in the core Rocket.jl code? If it doesn't (for example, you would like to add a operator for a particular application), consider making a separate repository for your extensions.\nIf you would like to add an implementation of a feature that changes a lot in the core Rocket.jl code, please open an issue on GitHub and describe your proposal first. This will allow us to discuss your proposal with you before you invest your time in implementing something that may be difficult to merge later on.","category":"page"},{"location":"contributing/#Contributing-code","page":"Contributing","title":"Contributing code","text":"","category":"section"},{"location":"contributing/#Installing-Rocket","page":"Contributing","title":"Installing Rocket","text":"","category":"section"},{"location":"contributing/","page":"Contributing","title":"Contributing","text":"We suggest that you use the dev command from the new Julia package manager to install Rocket.jl for development purposes. To work on your fork of Rocket.jl, use your fork's URL address in the dev command, for example:","category":"page"},{"location":"contributing/","page":"Contributing","title":"Contributing","text":"] dev git@github.com:your_username/Rocket.jl.git","category":"page"},{"location":"contributing/","page":"Contributing","title":"Contributing","text":"The dev command clones Rocket.jl to ~/.julia/dev/Rocket. All local changes to Rocket code will be reflected in imported code.","category":"page"},{"location":"contributing/","page":"Contributing","title":"Contributing","text":"note: Note\nIt is also might be useful to install Revise.jl package as it allows you to modify code and use the changes without restarting Julia.","category":"page"},{"location":"contributing/#Committing-code","page":"Contributing","title":"Committing code","text":"","category":"section"},{"location":"contributing/","page":"Contributing","title":"Contributing","text":"We use the standard GitHub Flow workflow where all contributions are added through pull requests. In order to contribute, first fork the repository, then commit your contributions to your fork, and then create a pull request on the master branch of the Rocket.jl repository.","category":"page"},{"location":"contributing/","page":"Contributing","title":"Contributing","text":"Before opening a pull request, please make sure that all tests pass without failing! All demos (can be found in /demo/ directory) have to run without errors as well.","category":"page"},{"location":"contributing/#Style-conventions","page":"Contributing","title":"Style conventions","text":"","category":"section"},{"location":"contributing/","page":"Contributing","title":"Contributing","text":"We use default Julia style guide. We list here a few important points and our modifications to the Julia style guide:","category":"page"},{"location":"contributing/","page":"Contributing","title":"Contributing","text":"Use 4 spaces for indentation\nType names use UpperCamelCase. For example: ArrayObservable, MapOperator, etc..\nFunction names are lowercase with underscores, when necessary. For example: next!, subscribe!, as_actor, etc..\nVariable names and function arguments use snake_case\nThe name of a method that modifies its argument(s) must end in !","category":"page"},{"location":"contributing/#Unit-tests","page":"Contributing","title":"Unit tests","text":"","category":"section"},{"location":"contributing/","page":"Contributing","title":"Contributing","text":"We use the test-driven development (TDD) methodology for Rocket.jl development. The test coverage should be as complete as possible. Please make sure that you write tests for each piece of code that you want to add.","category":"page"},{"location":"contributing/","page":"Contributing","title":"Contributing","text":"All unit tests are located in the /test/ directory. The /test/ directory follows the structure of the /src/ directory. Each test file should have following filename format: test_*.jl. Some tests are also present in jldoctest docs annotations directly in the source code. See Julia's documentation about doctests.","category":"page"},{"location":"contributing/","page":"Contributing","title":"Contributing","text":"The tests can be evaluated by running following command in the Julia REPL:","category":"page"},{"location":"contributing/","page":"Contributing","title":"Contributing","text":"] test Rocket","category":"page"},{"location":"operators/transformation/override/#operator_override","page":"override","title":"Override Operator","text":"","category":"section"},{"location":"operators/transformation/override/","page":"override","title":"override","text":"override\nOverrideHandler","category":"page"},{"location":"operators/transformation/override/#Rocket.override","page":"override","title":"Rocket.override","text":"override(handler::OverrideHandler)\n\nCreates an override operator that overrides each emission from source observable with value provided in handler. If handler contains nothing source observable emits as usual. For constant override see map_to. Use Rocket.setvalue! to set new value for handler.\n\nProducing\n\nStream of type <: Subscribable{Union{L, T}} where L refers to the type of source stream and T referes to the type of handler's value\n\nExamples\n\nusing Rocket \n\nsubject = Subject(Int)\nhandler = OverrideHandler(Int, -1)\n\nsource = subject |> override(handler)\n\nsubscription = subscribe!(source, logger())\n\nnext!(subject, 1)\nnext!(subject, 2)\n\nRocket.setvalue!(handler, nothing)\n\nnext!(subject, 3)\nnext!(subject, 4)\n\nRocket.setvalue!(handler, -2)\n\nnext!(subject, 5)\nnext!(subject, 6)\n\nunsubscribe!(subscription)\n\n# output\n[LogActor] Data: -1\n[LogActor] Data: -1\n[LogActor] Data: 3\n[LogActor] Data: 4\n[LogActor] Data: -2\n[LogActor] Data: -2\n\nSee also: OverrideHandler\n\n\n\n\n\n","category":"function"},{"location":"operators/transformation/override/#Rocket.OverrideHandler","page":"override","title":"Rocket.OverrideHandler","text":"OverrideHandler(::Type{T}, value::Union{Nothing, T}) where T\nOverrideHandler(::Type{T}) where T\n\nHandler used in substitute operator.\n\nSee also: substitute\n\n\n\n\n\n","category":"type"},{"location":"operators/transformation/override/#See-also","page":"override","title":"See also","text":"","category":"section"},{"location":"operators/transformation/override/","page":"override","title":"override","text":"Operators","category":"page"},{"location":"operators/filtering/find/#operator_find","page":"find","title":"Find operator","text":"","category":"section"},{"location":"operators/filtering/find/","page":"find","title":"find","text":"find","category":"page"},{"location":"operators/filtering/find/#Rocket.find","page":"find","title":"Rocket.find","text":"find(conditionFn::F) where { F <: Function }\n\nCreates a find operator, which emits only the first value emitted by the source Observable that meets some condition.\n\nProducing\n\nStream of type <: Subscribable{L} where L refers to type of source stream\n\nArguments\n\nconditionFn::F: condition function with (data::T) -> Bool signature\n\nExamples\n\nusing Rocket\n\nsource = from([ 1, 2, 3, 4, 5, 6, 7, 8 ])\nsubscribe!(source |> find((d) -> d % 2 == 0), logger())\n;\n\n# output\n\n[LogActor] Data: 2\n[LogActor] Completed\n\nSee also: AbstractOperator, InferableOperator, ProxyObservable, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/filtering/find/#Description","page":"find","title":"Description","text":"","category":"section"},{"location":"operators/filtering/find/","page":"find","title":"find","text":"find searches for the first item in the source Observable that matches the specified condition embodied by the predicate, and returns the first occurrence in the source. Does not emit an error if a valid value is not found.","category":"page"},{"location":"operators/filtering/find/#See-also","page":"find","title":"See also","text":"","category":"section"},{"location":"operators/filtering/find/","page":"find","title":"find","text":"Operators, take","category":"page"},{"location":"operators/utility/discontinue/#operator_discontinue","page":"discontinue","title":"Discontinue Operator","text":"","category":"section"},{"location":"operators/utility/discontinue/","page":"discontinue","title":"discontinue","text":"discontinue","category":"page"},{"location":"operators/utility/discontinue/#Rocket.discontinue","page":"discontinue","title":"Rocket.discontinue","text":"discontinue()\n\nCreates an operator, which prevents an emitting of self-depending messages and breaks a possible infinite loop. Does nothing if observable scheduled asynchronously.\n\nProducing\n\nStream of type <: Subscribable{L} where L refers to type of source stream\n\nExamples\n\nusing Rocket\n\ns = BehaviorSubject(0)\n\nsubscription1 = subscribe!(s, logger())\nsubscription2 = subscribe!(s |> map(Int, d -> d + 1) |> discontinue(), s)\n;\n\n# output\n\n[LogActor] Data: 0\n[LogActor] Data: 1\n\nSee also: AbstractOperator, RightTypedOperator, ProxyObservable, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/utility/discontinue/#See-also","page":"discontinue","title":"See also","text":"","category":"section"},{"location":"operators/utility/discontinue/","page":"discontinue","title":"discontinue","text":"Operators","category":"page"},{"location":"teardown/about/#section_subscription","page":"Subscription","title":"Subscription","text":"","category":"section"},{"location":"teardown/about/","page":"Subscription","title":"Subscription","text":"A Subscription represents a disposable resource, usually the execution of an Observable. A Subscription has one important method: unsubscribe!(teardown), which takes some teardown logic object as one argument and disposes the resource held by the subscription.","category":"page"},{"location":"teardown/about/","page":"Subscription","title":"Subscription","text":"using Rocket\n\nsource = Subject(Int)\n\nnext!(source, 0) # Logs nothing as there is no subscribers\n\nsubscription = subscribe!(source, logger())\n\nnext!(source, 1) # Logs [LogActor] Data: 1 into standard output\n\nunsubscribe!(subscription)\n\nnext!(source, 2) # Logs nothing as a single one actor has unsubscribed","category":"page"},{"location":"teardown/about/","page":"Subscription","title":"Subscription","text":"note: Note\nA Subscription essentially just has its own specific method for unsubscribe!() function which releases resources or cancel Observable executions. Any Observable has to return a valid Teardown object.","category":"page"},{"location":"teardown/about/","page":"Subscription","title":"Subscription","text":"The unsubscribe! function also supports multiple unsubscriptions at once. If the input argument to the unsubscribe! function is either a tuple or a vector, it will first check that all of the arguments are valid subscription objects and if this is true it will unsubscribe from each of them individually.","category":"page"},{"location":"teardown/about/","page":"Subscription","title":"Subscription","text":"\nsource = Subject(Int)\n\nsubscription1 = subscribe!(source, logger())\nsubscription2 = subscribe!(source, logger())\n\nunsubscribe!((subscription1, subscription2))\n\n# or similarly\n# unsubscribe!([ subscription1, subscription2 ])\n","category":"page"},{"location":"teardown/about/","page":"Subscription","title":"Subscription","text":"For more information about subscription and teardown logic see the API Section","category":"page"},{"location":"operators/transformation/switch_map_to/#operator_switch_map_to","page":"switch_map_to","title":"SwitchMapTo Operator","text":"","category":"section"},{"location":"operators/transformation/switch_map_to/","page":"switch_map_to","title":"switch_map_to","text":"switch_map_to","category":"page"},{"location":"operators/transformation/switch_map_to/#Rocket.switch_map_to","page":"switch_map_to","title":"Rocket.switch_map_to","text":"switch_map_to(inner_observable)\n\nCreates a switch_map_to operator, which projects each source value to the same Observable which is flattened multiple times with switch_map in the output Observable.\n\nArguments\n\ninner_observable: an Observable to replace each value from the source Observable.\n\nProducing\n\nStream of type <: Subscribable{R} where R refers to the eltype of inner_observable\n\nExamples\n\nusing Rocket\n\nsource = from([ 0, 0, 0 ])\nsubscribe!(source |> switch_map_to(from([ 1, 2, 3 ])), logger())\n;\n\n# output\n\n[LogActor] Data: 1\n[LogActor] Data: 2\n[LogActor] Data: 3\n[LogActor] Data: 1\n[LogActor] Data: 2\n[LogActor] Data: 3\n[LogActor] Data: 1\n[LogActor] Data: 2\n[LogActor] Data: 3\n[LogActor] Completed\n\nSee also: switch_map, AbstractOperator, RightTypedOperator, ProxyObservable, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/transformation/switch_map_to/","page":"switch_map_to","title":"switch_map_to","text":"note: Note\nswitch_map_to is equivalent to switch_map with mappingFn set to (_) -> inner_observable.","category":"page"},{"location":"operators/transformation/switch_map_to/#See-also","page":"switch_map_to","title":"See also","text":"","category":"section"},{"location":"operators/transformation/switch_map_to/","page":"switch_map_to","title":"switch_map_to","text":"Operators","category":"page"},{"location":"operators/errors/rerun/#operator_rerun","page":"rerun","title":"Rerun Operator","text":"","category":"section"},{"location":"operators/errors/rerun/","page":"rerun","title":"rerun","text":"rerun","category":"page"},{"location":"operators/errors/rerun/#Rocket.rerun","page":"rerun","title":"Rocket.rerun","text":"rerun(count::Int = -1)\n\nReturns an Observable that mirrors the source Observable with the exception of an error. If the source Observable calls error, this method will resubscribe to the source Observable for a maximum of count resubscriptions (given as a number parameter) rather than propagating the error call.\n\nArguments:\n\ncount::Int: Number of retry attempts before failing. Optional. Default is -1.\n\nProducing\n\nStream of type <: Subscribable{L} where L refers to type of source stream\n\nExamples\n\nusing Rocket\n\nsource = from(1:3) |> safe() |> map(Int, (d) -> d > 1 ? error(\"Error\") : d) |> rerun(3)\n\nsubscribe!(source, logger())\n;\n\n# output\n[LogActor] Data: 1\n[LogActor] Data: 1\n[LogActor] Data: 1\n[LogActor] Data: 1\n[LogActor] Error: ErrorException(\"Error\")\n\nSee also: AbstractOperator, InferableOperator, catch_error, logger, safe\n\n\n\n\n\n","category":"function"},{"location":"operators/errors/rerun/#Description","page":"rerun","title":"Description","text":"","category":"section"},{"location":"operators/errors/rerun/","page":"rerun","title":"rerun","text":"Any and all items emitted by the source Observable will be emitted by the resulting Observable, even those emitted during failed subscriptions. For example, if an Observable fails at first but emits [1, 2] then succeeds the second time and emits: [1, 2, 3, 4, 5] then the complete stream of emissions and notifications would be: [1, 2, 1, 2, 3, 4, 5, complete].","category":"page"},{"location":"operators/errors/rerun/#See-also","page":"rerun","title":"See also","text":"","category":"section"},{"location":"operators/errors/rerun/","page":"rerun","title":"rerun","text":"Operators","category":"page"},{"location":"observables/types/timer/#observable_timer","page":"Timer","title":"Timer Observable","text":"","category":"section"},{"location":"observables/types/timer/","page":"Timer","title":"Timer","text":"timer","category":"page"},{"location":"observables/types/timer/#Rocket.timer","page":"Timer","title":"Rocket.timer","text":"timer(delay::Int)\ntimer(delay::Int, period::Int)\n\nCreation operator for the TimerObservable. Its like interval(@ref), but you can specify when should the emissions start. timer returns an Observable that emits an infinite sequence of ascending integers, with a constant interval of time, period of your choosing between those emissions. The first emission happens after the specified delay. If period is not specified, the output Observable emits only one value, 0. Otherwise, it emits an infinite sequence. The timer closes automatically when the unsubscription happens.\n\nArguments\n\ndelay: the initial delay time specified as an integer denoting milliseconds to wait before emitting the first value of 0.\nperiod: the minimum period of time between emissions of the subsequent numbers (in milliseconds).\n\nExamples\n\nusing Rocket\n\nsource = timer(0, 50)\n\nsleep(0.075)\nsubscription = subscribe!(source, logger())\nsleep(0.105)\nunsubscribe!(subscription)\n\n;\n\n# output\n\n[LogActor] Data: 2\n[LogActor] Data: 3\n\n\nSee also: interval, TimerObservable, subscribe!, logger\n\n\n\n\n\n","category":"function"},{"location":"observables/types/timer/","page":"Timer","title":"Timer","text":"TimerObservable","category":"page"},{"location":"observables/types/timer/#Rocket.TimerObservable","page":"Timer","title":"Rocket.TimerObservable","text":"TimerObservable\n\nAn Observable that starts emitting after an delay and emits ever increasing numbers after each period of time thereafter.\n\nParameters\n\ndelay: The initial delay time specified as an integer denoting milliseconds to wait before emitting the first value of 0`.\nperiod: The minimum period of time in milliseconds between emissions of the subsequent numbers.\n\nSee also: timer, Subscribable\n\n\n\n\n\n","category":"type"},{"location":"actors/about/#section_actors","page":"Actor","title":"Actors","text":"","category":"section"},{"location":"actors/about/","page":"Actor","title":"Actor","text":"An Actor is the most primitive unit of computation: it receives a message and performs a computation.","category":"page"},{"location":"actors/about/","page":"Actor","title":"Actor","text":"An actor is analogous to an object in an object-oriented languages. An object receives a message (a method call) and does something depending on which message it receives (the method we are calling). The main difference is that actors are completely isolated from each other, and they will never share memory. It’s also worth mentioning that an actor can maintain a private state that should never be changed directly by another actor.","category":"page"},{"location":"actors/about/","page":"Actor","title":"Actor","text":"For a quick introduction to Actor models, see this article.","category":"page"},{"location":"actors/about/","page":"Actor","title":"Actor","text":"The API of Rocket.jl's Actors is similar to RxJS subscribers.","category":"page"},{"location":"actors/about/#First-example","page":"Actor","title":"First example","text":"","category":"section"},{"location":"actors/about/","page":"Actor","title":"Actor","text":"The following example implements an Actor that retains each received value from an Observable.","category":"page"},{"location":"actors/about/","page":"Actor","title":"Actor","text":"using Rocket\n\nstruct CustomKeepActor <: Actor{Int}\n values::Vector{Int}\n\n CustomKeepActor() = new(Vector{Int}())\nend\n\nRocket.on_next!(actor::CustomKeepActor, data::Int) = push!(actor.values, data)\nRocket.on_error!(actor::CustomKeepActor, err) = error(err)\nRocket.on_complete!(actor::CustomKeepActor) = println(\"Completed!\")\n\nsource = from([ 1, 2, 3 ])\nkeep_actor = CustomKeepActor()\nsubscribe!(source, keep_actor)\n\n# Logs\n# Completed!\n\nprintln(keep_actor.values)\n\n# Logs\n# [1, 2, 3]","category":"page"},{"location":"actors/about/","page":"Actor","title":"Actor","text":"An actor may be not interested in the values itself, but merely the completion of an event. In this case, Rocket.jl provides a CompletionActor abstract type. See also NextActor and ErrorActor.","category":"page"},{"location":"actors/about/","page":"Actor","title":"Actor","text":"using Rocket\n\nstruct CompletionNotificationActor <: CompletionActor{Int} end\n\nRocket.on_complete!(::CompletionNotificationActor) = println(\"Completed!\")\n\nsource = from([ 1, 2, 3 ])\nsubscribe!(source, CompletionNotificationActor());\n\n# Logs\n# Completed","category":"page"},{"location":"actors/about/","page":"Actor","title":"Actor","text":"It is also possible to use Julia's multiple dispatch feature and dispatch on type of the event","category":"page"},{"location":"actors/about/","page":"Actor","title":"Actor","text":"using Rocket\n\nstruct MyCustomActor <: NextActor{Any} end\n\nRocket.on_next!(::MyCustomActor, data::Int) = println(\"Int: $data\")\nRocket.on_next!(::MyCustomActor, data::Float64) = println(\"Float64: $data\")\nRocket.on_next!(::MyCustomActor, data) = println(\"Something else: $data\")\n\nsource = from([ 1, 1.0, \"string\" ])\nsubscribe!(source, MyCustomActor());\n\n# Logs\n# Int: 1\n# Float64: 1.0\n# Something else: string\n","category":"page"},{"location":"actors/about/#Lambda-actor","page":"Actor","title":"Lambda actor","text":"","category":"section"},{"location":"actors/about/","page":"Actor","title":"Actor","text":"For debugging purposes it may be convenient to work with a LambdaActor. This provides an interface that defines callbacks for \"next\", \"error\" and \"complete\" events. But this generic actor does not allow to dispatch on the type of the event.","category":"page"},{"location":"actors/about/","page":"Actor","title":"Actor","text":"using Rocket\n\nsource = from([1, 2, 3])\n\nsubscribe!(source, lambda(\n on_next = (d) -> println(d),\n on_error = (e) -> error(e),\n on_complete = () -> println(\"Completed\")\n))\n\n# Logs\n# 1\n# 2\n# 3\n# Completed","category":"page"},{"location":"actors/about/#Function-actor","page":"Actor","title":"Function actor","text":"","category":"section"},{"location":"actors/about/","page":"Actor","title":"Actor","text":"Sometimes it is convenient to pass only on_next callback. Rocket.jl provides a FunctionActor which automatically converts any function object passed in the subscribe! function to a proper actor which listens only for data events, throws an exception on error event and ignores completion message.","category":"page"},{"location":"actors/about/","page":"Actor","title":"Actor","text":"using Rocket\n\nsource = from([1, 2, 3])\n\nsubscribe!(source, (d) -> println(d))\n\n# Logs\n# 1\n# 2\n# 3","category":"page"},{"location":"observables/types/single/#observable_single","page":"Single","title":"Single Observable","text":"","category":"section"},{"location":"observables/types/single/","page":"Single","title":"Single","text":"of","category":"page"},{"location":"observables/types/single/#Rocket.of","page":"Single","title":"Rocket.of","text":"of(x; scheduler::H = AsapScheduler()) where { H <: AbstractScheduler }\n\nCreation operator for the SingleObservable that emits a single value x and then completes.\n\nArguments\n\nx: value to be emmited before completion\n\nExamples\n\nusing Rocket\n\nsource = of(1)\nsubscribe!(source, logger())\n;\n\n# output\n\n[LogActor] Data: 1\n[LogActor] Completed\n\n\nSee also: SingleObservable, subscribe!, logger\n\n\n\n\n\n","category":"function"},{"location":"observables/types/single/","page":"Single","title":"Single","text":"SingleObservable","category":"page"},{"location":"observables/types/single/#Rocket.SingleObservable","page":"Single","title":"Rocket.SingleObservable","text":"SingleObservable{D, H}(value::D, scheduler::H)\n\nSingleObservable wraps single value of type D into a observable.\n\nConstructor arguments\n\nvalue: a single value to emit\nscheduler: scheduler-like object\n\nSee also: of, Subscribable\n\n\n\n\n\n","category":"type"},{"location":"observables/types/interval/#observable_interval","page":"Interval","title":"Interval Observable","text":"","category":"section"},{"location":"observables/types/interval/","page":"Interval","title":"Interval","text":"interval","category":"page"},{"location":"observables/types/interval/#Rocket.interval","page":"Interval","title":"Rocket.interval","text":"interval(period::Union{Int, Nothing} = nothing)\n\nCreation operator for the TimerObservable. interval returns an Observable that emits an infinite sequence of ascending integers, with a constant interval of time of your choosing between those emissions. The first emission is not sent immediately, but only after the first period has passed.\n\nArguments\n\ninterval: the interval size in milliseconds\n\nExamples\n\nusing Rocket\n\nsource = interval(50)\n\nsubscription = subscribe!(source, logger())\nsleep(0.215)\nunsubscribe!(subscription)\nsleep(0.215)\nsubscription = subscribe!(source, logger())\nsleep(0.185)\nunsubscribe!(subscription)\n\nclose(source)\n;\n\n# output\n\n[LogActor] Data: 0\n[LogActor] Data: 1\n[LogActor] Data: 2\n[LogActor] Data: 3\n[LogActor] Data: 8\n[LogActor] Data: 9\n[LogActor] Data: 10\n\nSee also: timer, TimerObservable, Subscribable\n\n\n\n\n\n","category":"function"},{"location":"operators/filtering/take_until/#operator_take_until","page":"take_until","title":"TakeUntil Operator","text":"","category":"section"},{"location":"operators/filtering/take_until/","page":"take_until","title":"take_until","text":"take_until","category":"page"},{"location":"operators/filtering/take_until/#Rocket.take_until","page":"take_until","title":"Rocket.take_until","text":"take_until(notifier::S)\n\nCreates a take operator, which returns an Observable that emits the values emitted by the source Observable until a notifier Observable emits a value or a completion event.\n\nArguments\n\nnotifier::S: The Observable whose first emitted value will cause the output Observable of take_until to stop emitting values from the source Observable.\n\nProducing\n\nStream of type <: Subscribable{L} where L refers to type of source stream\n\nExamples\n\nusing Rocket\n\nsource = interval(100) |> take_until(timer(1000))\n\nsubscribe!(source, logger())\n;\n\n# output\n\n[LogActor] Data: 0\n[LogActor] Data: 1\n[LogActor] Data: 2\n[LogActor] Data: 3\n[LogActor] Data: 4\n[LogActor] Data: 5\n[LogActor] Data: 6\n[LogActor] Data: 7\n[LogActor] Data: 8\n[LogActor] Completed\n\nusing Rocket \n\nsource = interval(100)\n\nsubscribe!(source |> take_until(source |> filter(i -> i == 3)), logger())\n;\n\n# output \n\n[LogActor] Data: 0\n[LogActor] Data: 1\n[LogActor] Data: 2\n[LogActor] Completed\n\nSee also: AbstractOperator, InferableOperator, ProxyObservable, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/filtering/take_until/#Description","page":"take_until","title":"Description","text":"","category":"section"},{"location":"operators/filtering/take_until/","page":"take_until","title":"take_until","text":"take_until subscribes and begins mirroring the source Observable. It also monitors a second Observable, notifier that you provide. If the notifier emits a value, the output Observable stops mirroring the source Observable and completes. If the notifier doesn't emit any value and completes then take_until also completes.","category":"page"},{"location":"operators/filtering/take_until/#See-also","page":"take_until","title":"See also","text":"","category":"section"},{"location":"operators/filtering/take_until/","page":"take_until","title":"take_until","text":"Operators","category":"page"},{"location":"operators/multicasting/share/#operator_share","page":"share","title":"Share Operators","text":"","category":"section"},{"location":"operators/multicasting/share/","page":"share","title":"share","text":"share\nshare_replay\nshare_recent","category":"page"},{"location":"operators/multicasting/share/#Rocket.share","page":"share","title":"Rocket.share","text":"share(; scheduler::H = AsapScheduler()) where { H <: AbstractScheduler }\n\nshare() is a shortcut for publish() + ref_count()\n\nSee also: AbstractOperator, multicast, publish, ref_count\n\n\n\n\n\n","category":"function"},{"location":"operators/multicasting/share/#Rocket.share_replay","page":"share","title":"Rocket.share_replay","text":"share_replay(size::Int; scheduler::H = AsapScheduler()) where { H <: AbstractScheduler }\n\nshare_replay(size) is a shortcut for publish_replay(size) + ref_count()\n\nSee also: AbstractOperator, multicast, publish, publish_replay, ref_count\n\n\n\n\n\n","category":"function"},{"location":"operators/multicasting/share/#Rocket.share_recent","page":"share","title":"Rocket.share_recent","text":"share_recent(; scheduler::H = AsapScheduler()) where { H <: AbstractScheduler }\n\nshare_recent() is a shortcut for publish_recent() + ref_count()\n\nSee also: AbstractOperator, multicast, publish, publish_recent, ref_count\n\n\n\n\n\n","category":"function"},{"location":"operators/multicasting/share/#See-also","page":"share","title":"See also","text":"","category":"section"},{"location":"operators/multicasting/share/","page":"share","title":"share","text":"Operators","category":"page"},{"location":"operators/transformation/concat_map/#operator_concat_map","page":"concat_map","title":"ConcatMap Operator","text":"","category":"section"},{"location":"operators/transformation/concat_map/","page":"concat_map","title":"concat_map","text":"concat_map","category":"page"},{"location":"operators/transformation/concat_map/#Rocket.concat_map","page":"concat_map","title":"Rocket.concat_map","text":"concat_map(::Type{R}, mappingFn::F = identity) where { R, F <: Function }\n\nCreates a concat_map operator, which returns an Observable that emits the result of applying the projection function to each item emitted by the source Observable and taking values from each projected inner Observable sequentially. Essentialy it projects each source value to an Observable which is merged in the output Observable, in a serialized fashion waiting for each one to complete before merging the next.\n\nArguments\n\n::Type{R}: the type of data of output Observables after projection with mappingFn\nmappingFn::F: projection function with (data) -> Observable{R} signature\n\nProducing\n\nStream of type <: Subscribable{R}\n\nExamples\n\nusing Rocket\n\nsource = from([ 0, 0 ]) |> concat_map(Int, d -> from([ 1, 2, 3 ], scheduler = AsyncScheduler(0)))\nsubscribe!(source, logger())\n;\n\n# output\n\n[LogActor] Data: 1\n[LogActor] Data: 2\n[LogActor] Data: 3\n[LogActor] Data: 1\n[LogActor] Data: 2\n[LogActor] Data: 3\n[LogActor] Completed\n\nSee also: AbstractOperator, RightTypedOperator, ProxyObservable, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/transformation/concat_map/#Description","page":"concat_map","title":"Description","text":"","category":"section"},{"location":"operators/transformation/concat_map/","page":"concat_map","title":"concat_map","text":"Returns an Observable that emits items based on applying a function that you supply to each item emitted by the source Observable, where that function returns an (so-called \"inner\") Observable. Each new inner Observable is concatenated with the previous inner Observable.","category":"page"},{"location":"operators/transformation/concat_map/","page":"concat_map","title":"concat_map","text":"warning: Warning\nIf source values arrive endlessly and faster than their corresponding inner Observables can complete, it will result in memory issues as inner Observables amass in an unbounded buffer waiting for their turn to be subscribed to.","category":"page"},{"location":"operators/transformation/concat_map/","page":"concat_map","title":"concat_map","text":"note: Note\nconcat_map is equivalent to merge_map with concurrency parameter set to 1.","category":"page"},{"location":"operators/transformation/concat_map/#See-also","page":"concat_map","title":"See also","text":"","category":"section"},{"location":"operators/transformation/concat_map/","page":"concat_map","title":"concat_map","text":"Operators, merge_map","category":"page"},{"location":"subjects/types/pending/#subject_pending","page":"Pending","title":"PendingSubject","text":"","category":"section"},{"location":"subjects/types/pending/","page":"Pending","title":"Pending","text":"PendingSubject\nPendingSubjectFactory","category":"page"},{"location":"subjects/types/pending/#Rocket.PendingSubject","page":"Pending","title":"Rocket.PendingSubject","text":"PendingSubject(::Type{D}) where D\nPendingSubject(::Type{D}, factory::F) where { D, F <: AbstractFactory }\nPendingSubject(::Type{D}, subject::S) where { D, S }\n\nA variant of Subject that emits its last value on completion. Reemits last value on further subscriptions and then completes.\n\nSee also: PendingSubjectFactory, Subject, SubjectFactory\n\n\n\n\n\n","category":"function"},{"location":"subjects/types/pending/#Rocket.PendingSubjectFactory","page":"Pending","title":"Rocket.PendingSubjectFactory","text":"PendingSubjectFactory(factory::F) where { F <: AbstractSubjectFactory }\nPendingSubjectFactory(; scheduler::H = AsapScheduler()) where { H <: AbstractScheduler }\n\nA variant of SubjectFactory that creates an instance of PendingSubject.\n\nSee also: SubjectFactory, AbstractSubjectFactory, PendingSubject, Subject\n\n\n\n\n\n","category":"function"},{"location":"subjects/types/pending/#Description","page":"Pending","title":"Description","text":"","category":"section"},{"location":"subjects/types/pending/","page":"Pending","title":"Pending","text":"A variant of Subject that only emits a value when it completes. It will emit its latest value to all its observers on completion. It will reemit its latest value to all new observers on further subscription and then complete. It is not possible to overwrite last value after completion.","category":"page"},{"location":"subjects/types/pending/#Examples","page":"Pending","title":"Examples","text":"","category":"section"},{"location":"subjects/types/pending/","page":"Pending","title":"Pending","text":"using Rocket\n\nsubject = PendingSubject(Int)\n\nsubscription1 = subscribe!(subject, logger(\"1\"))\n\nnext!(subject, 1) # Nothing is logged\nnext!(subject, 2) # Nothing is logged\n\nsubscription2 = subscribe!(subject, logger(\"2\"))\n\nnext!(subject, 3) # Nothing is logged\n\ncomplete!(subject)\n\nsubscription3 = subscribe!(subject, logger(\"3\"))\n\n[1] Data: 3\n[2] Data: 3\n[1] Completed\n[2] Completed\n[3] Data: 3\n[3] Completed","category":"page"},{"location":"operators/filtering/filter_type/#operator_filter_type","page":"filter_type","title":"FilterType Operator","text":"","category":"section"},{"location":"operators/filtering/filter_type/","page":"filter_type","title":"filter_type","text":"filter_type","category":"page"},{"location":"operators/filtering/filter_type/#Rocket.filter_type","page":"filter_type","title":"Rocket.filter_type","text":"filter_type(type::Type{ T }) where { T }\n\nCreates a filter_type operator, which filters items of the source Observable by emitting only those that match a specified T type with a <: operator. This operator is a more efficient version of filter(v -> v <: T) |> map(T, v -> v) operators chain.\n\nProducing\n\nStream of type <: Subscribable{ T } where T refers to type argument\n\nExamples\n\nusing Rocket\n\nsource = from(Real[ 1, 2.0, 3, 4.0, 5, 6.0 ])\nsubscribe!(source |> filter_type(Int), logger())\n;\n\n# output\n\n[LogActor] Data: 1\n[LogActor] Data: 3\n[LogActor] Data: 5\n[LogActor] Completed\n\nSee also: AbstractOperator, InferableOperator, ProxyObservable, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/filtering/filter_type/#See-also","page":"filter_type","title":"See also","text":"","category":"section"},{"location":"operators/filtering/filter_type/","page":"filter_type","title":"filter_type","text":"Operators","category":"page"},{"location":"operators/filtering/filter/#operator_filter","page":"filter","title":"Filter Operator","text":"","category":"section"},{"location":"operators/filtering/filter/","page":"filter","title":"filter","text":"filter","category":"page"},{"location":"operators/filtering/filter/#Base.filter","page":"filter","title":"Base.filter","text":"filter(filterFn::F) where { F <: Function }\n\nCreates a filter operator, which filters items of the source Observable by emitting only those that satisfy a specified filterFn predicate.\n\nProducing\n\nStream of type <: Subscribable{L} where L refers to type of source stream\n\nArguments\n\nfilterFn::F: predicate function with (data::T) -> Bool signature\n\nExamples\n\nusing Rocket\n\nsource = from([ 1, 2, 3, 4, 5, 6 ])\nsubscribe!(source |> filter((d) -> d % 2 == 0), logger())\n;\n\n# output\n\n[LogActor] Data: 2\n[LogActor] Data: 4\n[LogActor] Data: 6\n[LogActor] Completed\n\nSee also: AbstractOperator, InferableOperator, ProxyObservable, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/filtering/filter/#Description","page":"filter","title":"Description","text":"","category":"section"},{"location":"operators/filtering/filter/","page":"filter","title":"filter","text":"Like filter(f, array), this operator takes values from the source Observable, passes them through a predicate function and only emits those values that yielded true.","category":"page"},{"location":"operators/filtering/filter/#See-also","page":"filter","title":"See also","text":"","category":"section"},{"location":"operators/filtering/filter/","page":"filter","title":"filter","text":"Operators","category":"page"},{"location":"operators/join/with_latest/#operator_with_latest","page":"with_latest","title":"WithLatest Operator","text":"","category":"section"},{"location":"operators/join/with_latest/","page":"with_latest","title":"with_latest","text":"with_latest","category":"page"},{"location":"operators/join/with_latest/#Rocket.with_latest","page":"with_latest","title":"Rocket.with_latest","text":"with_latest(sources...)\n\nCreates a with_latest operator, which combines the source Observable with other Observables to create an Observable whose values are calculated from the latest values of each, only when the source emits.\n\nExamples\n\nusing Rocket\n\nsource = of(1)\nsubscribe!(source |> with_latest(from(1:5)), logger())\n;\n\n# output\n\n[LogActor] Data: (1, 5)\n[LogActor] Completed\n\nSee also: AbstractOperator, InferableOperator\n\n\n\n\n\n","category":"function"},{"location":"operators/join/with_latest/#See-also","page":"with_latest","title":"See also","text":"","category":"section"},{"location":"operators/join/with_latest/","page":"with_latest","title":"with_latest","text":"Operators","category":"page"},{"location":"operators/join/about/#Join-category","page":"Join category","title":"Join category","text":"","category":"section"},{"location":"operators/join/about/","page":"Join category","title":"Join category","text":"There are operators for different purposes, and they may be categorized as: creation, transformation, filtering, joining, multicasting, error handling, utility, etc. In the following list you will find all the operators organized in join category.","category":"page"},{"location":"operators/join/about/","page":"Join category","title":"Join category","text":"with_latest","category":"page"},{"location":"operators/join/about/#See-also","page":"Join category","title":"See also","text":"","category":"section"},{"location":"operators/join/about/","page":"Join category","title":"Join category","text":"Operators","category":"page"},{"location":"subjects/types/behavior/#subject_behavior","page":"Behavior","title":"BehaviorSubject","text":"","category":"section"},{"location":"subjects/types/behavior/","page":"Behavior","title":"Behavior","text":"BehaviorSubject\nBehaviorSubjectFactory","category":"page"},{"location":"subjects/types/behavior/#Rocket.BehaviorSubject","page":"Behavior","title":"Rocket.BehaviorSubject","text":"BehaviorSubject(value::D) where D\nBehaviorSubject(::Type{D}, value) where D\nBehaviorSubject(::Type{D}, value, factory::F) where { D, F <: AbstractSubjectFactory }\nBehaviorSubject(::Type{D}, value, subject::S) where { D, S }\n\nA variant of Subject that requires an initial value and emits its current value whenever it is subscribed to.\n\nSee also: BehaviorSubjectFactory, Subject, SubjectFactory\n\n\n\n\n\n","category":"function"},{"location":"subjects/types/behavior/#Rocket.BehaviorSubjectFactory","page":"Behavior","title":"Rocket.BehaviorSubjectFactory","text":"BehaviorSubjectFactory(default, factory::F) where { F <: AbstractSubjectFactory }\nBehaviorSubjectFactory(default; scheduler::H = AsapScheduler()) where { H <: AbstractScheduler }\n\nA variant of SubjectFactory that creates an instance of ReplaySubject.\n\nSee also: SubjectFactory, AbstractSubjectFactory, BehaviorSubject, Subject\n\n\n\n\n\n","category":"function"},{"location":"subjects/types/behavior/#Description","page":"Behavior","title":"Description","text":"","category":"section"},{"location":"subjects/types/behavior/","page":"Behavior","title":"Behavior","text":"One of the variants of Subjects is the BehaviorSubject, which has a notion of \"the current value\". It stores the latest value emitted to its consumers, and whenever a new Observer subscribes, it will immediately receive the \"current value\" from the BehaviorSubject.","category":"page"},{"location":"subjects/types/behavior/","page":"Behavior","title":"Behavior","text":"note: Note\nBehaviorSubjects are useful for representing \"values over time\". For instance, an event stream of birthdays is a Subject, but the stream of a person's age would be a BehaviorSubject.","category":"page"},{"location":"subjects/types/behavior/#Examples","page":"Behavior","title":"Examples","text":"","category":"section"},{"location":"subjects/types/behavior/","page":"Behavior","title":"Behavior","text":"In the following example, the BehaviorSubject is initialized with the value 0 which the first Observer receives when it subscribes. The second Observer receives the value 2 even though it subscribed after the value 2 was sent.","category":"page"},{"location":"subjects/types/behavior/","page":"Behavior","title":"Behavior","text":"using Rocket\n\nsubject = BehaviorSubject(Int, 0)\n\nsubscription1 = subscribe!(subject, logger(\"1\"))\n\nnext!(subject, 1)\nnext!(subject, 2)\n\nsubscription2 = subscribe!(subject, logger(\"2\"))\n\nnext!(subject, 3)\n\nunsubscribe!(subscription1)\nunsubscribe!(subscription2)\n\n// Logs\n// [1] Data: 0\n// [1] Data: 1\n// [1] Data: 2\n// [2] Data: 2\n// [1] Data: 3\n// [2] Data: 3","category":"page"},{"location":"api/operators/#operators_api","page":"Operators","title":"Operators API","text":"","category":"section"},{"location":"api/operators/#How-to-create-a-custom-operator","page":"Operators","title":"How to create a custom operator","text":"","category":"section"},{"location":"api/operators/","page":"Operators","title":"Operators","text":"If you need to write an operator that cannot be made from a combination of existing operators, then you can write a custom operator from scratch.","category":"page"},{"location":"api/operators/","page":"Operators","title":"Operators","text":"Each operator (e.g. MyFancyOperator) needs to either be (1) a subtype of one of abstract OperatorTrait trait types, or (2) define a","category":"page"},{"location":"api/operators/","page":"Operators","title":"Operators","text":"Rocket.as_operator(::Type{<:MyFancyOperator}) = TypedOperatorTrait{T, R}()\n# or\nRocket.as_operator(::Type{<:MyFancyOperator}) = InferableOperatorTrait()","category":"page"},{"location":"api/operators/","page":"Operators","title":"Operators","text":"trait behavior.","category":"page"},{"location":"api/operators/","page":"Operators","title":"Operators","text":"In addition, an operator must implement a specific method for on_call! function with custom logic which has to return another Observable as a result of applying MyFancyOperator to a source.","category":"page"},{"location":"api/operators/","page":"Operators","title":"Operators","text":"Rocket.on_call!(::Type{L}, ::Type{R}, operator::MyFancyOperator, source) where L = # some custom logic here\n\n# or\n# for inferable trait types you have to specify 'right' type with Rocket.operator_right which should specify a type of data of produced Observable\n\nRocket.on_call(::Type{L}, ::Type{R}, operator::MyFancyOperator, source) where L = # some custom logic here\nRocket.operator_right(::MyFancyOperator, ::Type{L}) where L = R # where R should be an actual type, Int or even L itself e.g.\n","category":"page"},{"location":"api/operators/","page":"Operators","title":"Operators","text":"note: Note\nIt is not allowed to modify the source Observable in any way; you have to return a new observable.","category":"page"},{"location":"api/operators/","page":"Operators","title":"Operators","text":"See more examples on custom operators in Traits API section","category":"page"},{"location":"api/operators/","page":"Operators","title":"Operators","text":"note: Note\nIt might be useful to return a ProxyObservable from an on_call! function. ProxyObservable is a special Observable which proxying actors with the source and/or source with actors.","category":"page"},{"location":"api/operators/#operators_api_traits","page":"Operators","title":"Traits","text":"","category":"section"},{"location":"api/operators/","page":"Operators","title":"Operators","text":"OperatorTrait\nas_operator\nTypedOperatorTrait\nLeftTypedOperatorTrait\nRightTypedOperatorTrait\nInferableOperatorTrait\nInvalidOperatorTrait","category":"page"},{"location":"api/operators/#Rocket.OperatorTrait","page":"Operators","title":"Rocket.OperatorTrait","text":"Abstract type for all possible operator traits\n\nSee also: TypedOperatorTrait, LeftTypedOperatorTrait, RightTypedOperatorTrait, InferableOperatorTrait, InvalidOperatorTrait,\n\n\n\n\n\n","category":"type"},{"location":"api/operators/#Rocket.as_operator","page":"Operators","title":"Rocket.as_operator","text":"as_operator(any)\n\nThis function checks operator trait behavior. May be used explicitly to specify operator trait behavior for any object.\n\nSee also: OperatorTrait, AbstractOperator\n\n\n\n\n\n","category":"function"},{"location":"api/operators/#Rocket.TypedOperatorTrait","page":"Operators","title":"Rocket.TypedOperatorTrait","text":"Typed operator trait specifies operator to be statically typed with input and output data types. Typed operator with input type L and output type R can only operate on input Observable with data type L and will always produce an Observable with data type R.\n\nExamples\n\nusing Rocket\n\nstruct MyTypedOperator <: TypedOperator{Int, Int} end\n\nfunction Rocket.on_call!(::Type{Int}, ::Type{Int}, op::MyTypedOperator, source)\n return proxy(Int, source, MyTypedOperatorProxy())\nend\n\nstruct MyTypedOperatorProxy <: ActorProxy end\n\nRocket.actor_proxy!(::Type{Int}, ::MyTypedOperatorProxy, actor::A) where A = MyTypedOperatorProxiedActor{A}(actor)\n\nstruct MyTypedOperatorProxiedActor{A} <: Actor{Int}\n actor :: A\nend\n\nfunction Rocket.on_next!(actor::MyTypedOperatorProxiedActor, data::Int)\n # Do something with a data and/or redirect it to actor.actor\n next!(actor.actor, data + 1)\nend\n\nRocket.on_error!(actor::MyTypedOperatorProxiedActor, err) = error!(actor.actor, err)\nRocket.on_complete!(actor::MyTypedOperatorProxiedActor) = complete!(actor.actor)\n\nsource = from([ 0, 1, 2 ])\nsubscribe!(source |> MyTypedOperator(), logger())\n;\n\n# output\n\n[LogActor] Data: 1\n[LogActor] Data: 2\n[LogActor] Data: 3\n[LogActor] Completed\n\nSee also: OperatorTrait, TypedOperator, OperatorTrait, ProxyObservable, ActorProxy, logger\n\n\n\n\n\n","category":"type"},{"location":"api/operators/#Rocket.LeftTypedOperatorTrait","page":"Operators","title":"Rocket.LeftTypedOperatorTrait","text":"Left typed operator trait specifies operator to be statically typed with input data type. To infer output data type this object should specify a special function operator_right(operator, ::Type{L}) where L which will be used to infer output data type. Left typed operator with input type L can only operate on input Observable with data type L and will always produce an Observable with data type inferred from operator_right(operator, ::Type{L}).\n\nExamples\n\nusing Rocket\n\nstruct CountIntegersOperator <: LeftTypedOperator{Int} end\n\nfunction Rocket.on_call!(::Type{Int}, ::Type{Tuple{Int, Int}}, op::CountIntegersOperator, source)\n return proxy(Tuple{Int, Int}, source, CountIntegersOperatorProxy())\nend\n\nRocket.operator_right(::CountIntegersOperator, ::Type{Int}) = Tuple{Int, Int}\n\nstruct CountIntegersOperatorProxy <: ActorProxy end\n\nRocket.actor_proxy!(::Type{Tuple{Int, Int}}, ::CountIntegersOperatorProxy, actor::A) where A = CountIntegersProxiedActor{A}(0, actor)\n\nmutable struct CountIntegersProxiedActor{A} <: Actor{Int}\n current :: Int\n actor :: A\nend\n\nfunction Rocket.on_next!(actor::CountIntegersProxiedActor, data::Int)\n current = actor.current\n actor.current += 1\n next!(actor.actor, (current, data)) # e.g.\nend\n\nRocket.on_error!(actor::CountIntegersProxiedActor, err) = error!(actor.actor, err)\nRocket.on_complete!(actor::CountIntegersProxiedActor) = complete!(actor.actor)\n\nsource = from([ 0, 0, 0 ])\nsubscribe!(source |> CountIntegersOperator(), logger())\n;\n\n# output\n\n[LogActor] Data: (0, 0)\n[LogActor] Data: (1, 0)\n[LogActor] Data: (2, 0)\n[LogActor] Completed\n\nSee also: OperatorTrait, LeftTypedOperator, operator_right, OperatorTrait, ProxyObservable, ActorProxy, enumerate, logger\n\n\n\n\n\n","category":"type"},{"location":"api/operators/#Rocket.RightTypedOperatorTrait","page":"Operators","title":"Rocket.RightTypedOperatorTrait","text":"Right typed operator trait specifies operator to be statically typed with output data type. It can operate on input Observable with any data type L but will always produce an Observable with data type R.\n\nExamples\n\nusing Rocket\n\nstruct ConvertToFloatOperator <: RightTypedOperator{Float64} end\n\nfunction Rocket.on_call!(::Type{L}, ::Type{Float64}, op::ConvertToFloatOperator, source) where L\n return proxy(Float64, source, ConvertToFloatProxy{L}())\nend\n\nstruct ConvertToFloatProxy{L} <: ActorProxy end\n\nfunction Rocket.actor_proxy!(::Type{Float64}, proxy::ConvertToFloatProxy{L}, actor::A) where { L, A }\n return ConvertToFloatProxyActor{L, A}(actor)\nend\n\nstruct ConvertToFloatProxyActor{L, A} <: Actor{L}\n actor :: A\nend\n\nfunction Rocket.on_next!(actor::ConvertToFloatProxyActor{L}, data::L) where L\n next!(actor.actor, convert(Float64, data)) # e.g.\nend\n\nRocket.on_error!(actor::ConvertToFloatProxyActor, err) = error!(actor.actor, err)\nRocket.on_complete!(actor::ConvertToFloatProxyActor) = complete!(actor.actor)\n\nsource = from([ 1, 2, 3 ])\nsubscribe!(source |> ConvertToFloatOperator(), logger())\n;\n\n# output\n\n[LogActor] Data: 1.0\n[LogActor] Data: 2.0\n[LogActor] Data: 3.0\n[LogActor] Completed\n\nSee also: OperatorTrait, RightTypedOperator, OperatorTrait, ProxyObservable, ActorProxy, logger\n\n\n\n\n\n","category":"type"},{"location":"api/operators/#Rocket.InferableOperatorTrait","page":"Operators","title":"Rocket.InferableOperatorTrait","text":"Inferable operator trait specifies operator to be statically typed neither with input data type nor with output data type. To infer output data type this object should specify a special function operator_right(operator, ::Type{L}) where L where L is input data type which will be used to infer output data type.\n\nusing Rocket\n\nstruct IdentityOperator <: InferableOperator end\n\nfunction Rocket.on_call!(::Type{L}, ::Type{L}, op::IdentityOperator, source) where L\n return proxy(L, source, IdentityProxy())\nend\n\nstruct IdentityProxy <: ActorProxy end\n\nRocket.operator_right(::IdentityOperator, ::Type{L}) where L = L\n\nRocket.actor_proxy!(::Type{L}, proxy::IdentityProxy, actor::A) where L where A = IdentityProxyActor{L, A}(actor)\n\nstruct IdentityProxyActor{L, A} <: Actor{L}\n actor :: A\nend\n\nfunction Rocket.on_next!(actor::IdentityProxyActor{L}, data::L) where L\n next!(actor.actor, data) # e.g.\nend\n\nRocket.on_error!(actor::IdentityProxyActor, err) = error!(actor.actor, err)\nRocket.on_complete!(actor::IdentityProxyActor) = complete!(actor.actor)\n\nsource = from([ 1, 2, 3 ])\nsubscribe!(source |> IdentityOperator(), logger())\n\nsource = from([ 1.0, 2.0, 3.0 ])\nsubscribe!(source |> IdentityOperator(), logger())\n;\n\n# output\n\n[LogActor] Data: 1\n[LogActor] Data: 2\n[LogActor] Data: 3\n[LogActor] Completed\n[LogActor] Data: 1.0\n[LogActor] Data: 2.0\n[LogActor] Data: 3.0\n[LogActor] Completed\n\n\nSee also: OperatorTrait, InferableOperator, operator_right, OperatorTrait, ProxyObservable, ActorProxy, logger\n\n\n\n\n\n","category":"type"},{"location":"api/operators/#Rocket.InvalidOperatorTrait","page":"Operators","title":"Rocket.InvalidOperatorTrait","text":"InvalidOperatorTrait trait specifies special 'invalid' behavior and types with such a trait specification cannot be used as an operator for an observable stream. By default any type has InvalidOperatorTrait trait specification\n\nSee also: OperatorTrait\n\n\n\n\n\n","category":"type"},{"location":"api/operators/#Types","page":"Operators","title":"Types","text":"","category":"section"},{"location":"api/operators/","page":"Operators","title":"Operators","text":"AbstractOperator\nTypedOperator\nLeftTypedOperator\nRightTypedOperator\nInferableOperator\non_call!\noperator_right\nOperatorsComposition","category":"page"},{"location":"api/operators/#Rocket.AbstractOperator","page":"Operators","title":"Rocket.AbstractOperator","text":"Supertype for all operators\n\nSee also: TypedOperator, LeftTypedOperator, RightTypedOperator, InferableOperator\n\n\n\n\n\n","category":"type"},{"location":"api/operators/#Rocket.TypedOperator","page":"Operators","title":"Rocket.TypedOperator","text":"Can be used as a supertype for any operator. Automatically specifies TypedOperatorTrait behavior.\n\nExamples\n\nusing Rocket\n\nstruct MyOperator <: TypedOperator{Float64,String} end\n\nas_operator(MyOperator) === TypedOperatorTrait{Float64,String}()\n\n# output\ntrue\n\nSee also: AbstractOperator, TypedOperatorTrait\n\n\n\n\n\n","category":"type"},{"location":"api/operators/#Rocket.LeftTypedOperator","page":"Operators","title":"Rocket.LeftTypedOperator","text":"Can be used as a supertype for any operator. Automatically specifies LeftTypedOperatorTrait behavior.\n\nExamples\n\nusing Rocket\n\nstruct MyOperator <: LeftTypedOperator{Float64} end\n\nas_operator(MyOperator) === LeftTypedOperatorTrait{Float64}()\n\n# output\ntrue\n\nSee also: AbstractOperator, LeftTypedOperatorTrait, operator_right\n\n\n\n\n\n","category":"type"},{"location":"api/operators/#Rocket.RightTypedOperator","page":"Operators","title":"Rocket.RightTypedOperator","text":"Can be used as a supertype for any operator. Automatically specifies RightTypedOperatorTrait behavior.\n\nExamples\n\nusing Rocket\n\nstruct MyOperator <: RightTypedOperator{Float64} end\n\nas_operator(MyOperator) === RightTypedOperatorTrait{Float64}()\n\n# output\ntrue\n\nSee also: AbstractOperator, RightTypedOperatorTrait\n\n\n\n\n\n","category":"type"},{"location":"api/operators/#Rocket.InferableOperator","page":"Operators","title":"Rocket.InferableOperator","text":"Can be used as a supertype for any operator. Automatically specifies InferableOperatorTrait behavior.\n\nExamples\n\nusing Rocket\n\nstruct MyOperator <: InferableOperator end\n\nas_operator(MyOperator) === InferableOperatorTrait()\n\n# output\ntrue\n\nSee also: AbstractOperator, InferableOperatorTrait, operator_right\n\n\n\n\n\n","category":"type"},{"location":"api/operators/#Rocket.on_call!","page":"Operators","title":"Rocket.on_call!","text":"on_call!(::Type, ::Type, operator, source)\n\nEach operator must implement its own method for on_call! function. This function is used to invoke operator on some Observable and to produce another Observable with new logic (operator specific).\n\nSee also: AbstractOperator\n\n\n\n\n\n","category":"function"},{"location":"api/operators/#Rocket.operator_right","page":"Operators","title":"Rocket.operator_right","text":"operator_right(operator, L)\n\nBoth LeftTypedOperator and InferableOperator must implement its own method for operator_right function. This function is used to infer type of data of output Observable given the type of data of input Observable.\n\nSee also: AbstractOperator, LeftTypedOperator, InferableOperator\n\n\n\n\n\n","category":"function"},{"location":"api/operators/#Rocket.OperatorsComposition","page":"Operators","title":"Rocket.OperatorsComposition","text":"OperatorsComposition(operators)\n\nOperatorsComposition is an object which helps to create a composition of multiple operators. To create a composition of two or more operators overloaded + or |> can be used.\n\nusing Rocket\n\ncomposition = map(Int, (d) -> d ^ 2) + filter(d -> d % 2 == 0)\n\nsource = from(1:5) |> composition\n\nsubscribe!(source, logger())\n;\n\n# output\n\n[LogActor] Data: 4\n[LogActor] Data: 16\n[LogActor] Completed\n\nusing Rocket\n\ncomposition = map(Int, (d) -> d ^ 2) |> filter(d -> d % 2 == 0)\n\nsource = from(1:5) |> composition\n\nsubscribe!(source, logger())\n;\n\n# output\n\n[LogActor] Data: 4\n[LogActor] Data: 16\n[LogActor] Completed\n\n\n\n\n\n","category":"type"},{"location":"api/operators/#Errors","page":"Operators","title":"Errors","text":"","category":"section"},{"location":"api/operators/","page":"Operators","title":"Operators","text":"InvalidOperatorTraitUsageError\nInconsistentSourceOperatorDataTypesError\nMissingOnCallImplementationError\nMissingOperatorRightImplementationError","category":"page"},{"location":"api/operators/#Rocket.InvalidOperatorTraitUsageError","page":"Operators","title":"Rocket.InvalidOperatorTraitUsageError","text":"This error will be thrown if |> pipe operator is called with invalid operator object\n\nSee also: on_call!\n\n\n\n\n\n","category":"type"},{"location":"api/operators/#Rocket.InconsistentSourceOperatorDataTypesError","page":"Operators","title":"Rocket.InconsistentSourceOperatorDataTypesError","text":"This error will be thrown if |> pipe operator is called with inconsistent data type\n\nSee also: on_call!\n\n\n\n\n\n","category":"type"},{"location":"api/operators/#Rocket.MissingOnCallImplementationError","page":"Operators","title":"Rocket.MissingOnCallImplementationError","text":"This error will be thrown if Julia cannot find specific method of on_call! function for a given operator.\n\nSee also: on_call!\n\n\n\n\n\n","category":"type"},{"location":"api/operators/#Rocket.MissingOperatorRightImplementationError","page":"Operators","title":"Rocket.MissingOperatorRightImplementationError","text":"This error will be thrown if Julia cannot find specific method of operator_right function for a given operator.\n\nSee also: operator_right\n\n\n\n\n\n","category":"type"},{"location":"observables/types/faulted/#observable_faulted","page":"Faulted","title":"Faulted Observable","text":"","category":"section"},{"location":"observables/types/faulted/","page":"Faulted","title":"Faulted","text":"faulted","category":"page"},{"location":"observables/types/faulted/#Rocket.faulted","page":"Faulted","title":"Rocket.faulted","text":"faulted(err; scheduler::H = AsapScheduler()) where { H <: AbstractScheduler }\nfaulted(::Type{T}, err; scheduler::H = AsapScheduler()) where { T, H <: AbstractScheduler }\n\nCreation operator for the FaultedObservable that emits no items to the Actor and immediately sends an error notification.\n\nArguments\n\nerr: the particular Error to pass to the error notification.\nT: type of output data source, optional, Any by default\nscheduler: optional, scheduler-like object\n\nExamples\n\nusing Rocket\n\nsource = faulted(\"Error!\")\nsubscribe!(source, logger())\n;\n\n# output\n\n[LogActor] Error: Error!\n\n\nSee also: FaultedObservable, subscribe!\n\n\n\n\n\n","category":"function"},{"location":"observables/types/faulted/","page":"Faulted","title":"Faulted","text":"FaultedObservable","category":"page"},{"location":"observables/types/faulted/#Rocket.FaultedObservable","page":"Faulted","title":"Rocket.FaultedObservable","text":"FaultedObservable{D, H}(err, scheduler::H)\n\nObservable that emits no items to the Actor and just sends an error notification on subscription.\n\nConstructor arguments\n\nerr: error to emit on subscription\nscheduler: scheduler-like object\n\nSee also: faulted\n\n\n\n\n\n","category":"type"},{"location":"operators/multicasting/multicast/#operator_multicast","page":"multicast","title":"Multicast Operator","text":"","category":"section"},{"location":"operators/multicasting/multicast/","page":"multicast","title":"multicast","text":"multicast","category":"page"},{"location":"operators/multicasting/multicast/#Rocket.multicast","page":"multicast","title":"Rocket.multicast","text":"multicast(subject::S) where S\nmulticast(factory::F) where { F <: AbstractSubjectFactory }\n\nThe multicast()operator takes a Subject and uses it to share the source execution. It returns what’s known as aConnectableObservable`, which has a connect() method. It has one simple job - subscribes to the source with the provided subject.\n\nExample\n\nusing Rocket\n\nsubject = Subject(Int)\nsource = from(1:5) |> multicast(subject)\n\nactor1 = logger(\"1\")\nactor2 = logger(\"2\")\n\nsubscription1 = subscribe!(source, actor1)\nsubscription2 = subscribe!(source, actor2)\n\nconnect(source)\n\nunsubscribe!(subscription1)\nunsubscribe!(subscription2)\n;\n\n# output\n\n[1] Data: 1\n[2] Data: 1\n[1] Data: 2\n[2] Data: 2\n[1] Data: 3\n[2] Data: 3\n[1] Data: 4\n[2] Data: 4\n[1] Data: 5\n[2] Data: 5\n[1] Completed\n[2] Completed\n\nSee also: ConnectableObservable, Subject, share, publish\n\n\n\n\n\n","category":"function"},{"location":"operators/multicasting/multicast/#See-also","page":"multicast","title":"See also","text":"","category":"section"},{"location":"operators/multicasting/multicast/","page":"multicast","title":"multicast","text":"Operators","category":"page"},{"location":"operators/transformation/map/#operator_map","page":"map","title":"Map Operator","text":"","category":"section"},{"location":"operators/transformation/map/","page":"map","title":"map","text":"map","category":"page"},{"location":"operators/transformation/map/#Base.map","page":"map","title":"Base.map","text":"map(::Type{R}, mappingFn::F) where { F <: Function }\n\nCreates a map operator, which applies a given mappingFn to each value emmited by the source Observable, and emits the resulting values as an Observable. You have to specify output R type after mappingFn projection.\n\nArguments\n\n::Type{R}: the type of data of transformed value, may be or may not be the same as source type\nmappingFn::Function: transformation function with (data::L) -> R signature, where L is type of data in input source\n\nProducing\n\nStream of type <: Subscribable{R}\n\nExamples\n\nusing Rocket\n\nsource = from([ 1, 2, 3 ])\nsubscribe!(source |> map(Int, (d) -> d ^ 2), logger())\n;\n\n# output\n\n[LogActor] Data: 1\n[LogActor] Data: 4\n[LogActor] Data: 9\n[LogActor] Completed\n\nSee also: AbstractOperator, RightTypedOperator, ProxyObservable, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/transformation/map/#Description","page":"map","title":"Description","text":"","category":"section"},{"location":"operators/transformation/map/","page":"map","title":"map","text":"The map operator, similar to map(f, array), applies a function to each value from the source. It's important to note that the function f is expected to be pure and without any side effects. The map operator is designed to create a copy of the original observable for each new subscriber. It independently executes the f function for each subscriber and doesn't share the resulting value. This might be inconvenient when f involves complex calculations or side effects.","category":"page"},{"location":"operators/transformation/map/","page":"map","title":"map","text":"using Rocket\n\nfunction f(x)\n println(\"Function `f` called\") # Assume heavy calculations or side-effects\n return x + 1\nend\n\nsubject = Subject(Int)\n\nmapped = subject |> map(Int, f)\n\nsubscription1 = subscribe!(mapped, logger())\nsubscription2 = subscribe!(mapped, logger())\n\nnext!(subject, 1)\n\nunsubscribe!(subscription1)\nunsubscribe!(subscription2)\nnothing #hide","category":"page"},{"location":"operators/transformation/map/","page":"map","title":"map","text":"In the example, you'll observe that \"Function f called\" is displayed twice. This happens because each subscriber receives their individual, distinct version of the modified data. To alter this behavior, one can utilize the share() operator. This operator creates only a single copy of the modified observable and shares the computed results.","category":"page"},{"location":"operators/transformation/map/","page":"map","title":"map","text":"mapped_and_shared = mapped |> share()\n\nsubscription1 = subscribe!(mapped_and_shared, logger())\nsubscription2 = subscribe!(mapped_and_shared, logger())\n\nnext!(subject, 1)\n\nunsubscribe!(subscription1)\nunsubscribe!(subscription2)\nnothing #hide","category":"page"},{"location":"operators/transformation/map/","page":"map","title":"map","text":"In this example, \"Function f called\" appears only once, and the computed value is shared between the two subscribers. Note, however, that this behaviour might be confusing in cases where the first subscribers completes the observable till its completion stage. For example:","category":"page"},{"location":"operators/transformation/map/","page":"map","title":"map","text":"mapped_and_shared = from([ 0, 1, 2 ]) |> map(Int, f) |> share()\n\nsubscription1 = subscribe!(mapped_and_shared, logger())\nsubscription2 = subscribe!(mapped_and_shared, logger())\n\nunsubscribe!(subscription1)\nunsubscribe!(subscription2)\nnothing #hide","category":"page"},{"location":"operators/transformation/map/","page":"map","title":"map","text":"In this scenario, the second subscriber doesn't receive any values because the first subscriber exhausts the single shared observable. Once the shared observable is used up, it doesn't produce any further values. This doesn't occur without the share() operator.","category":"page"},{"location":"operators/transformation/map/","page":"map","title":"map","text":"mapped = from([ 0, 1, 2 ]) |> map(Int, f)\n\nsubscription1 = subscribe!(mapped, logger())\nsubscription2 = subscribe!(mapped, logger())\n\nunsubscribe!(subscription1)\nunsubscribe!(subscription2)\nnothing #hide","category":"page"},{"location":"operators/transformation/map/#See-also","page":"map","title":"See also","text":"","category":"section"},{"location":"operators/transformation/map/","page":"map","title":"map","text":"Operators","category":"page"},{"location":"operators/utility/tap_on_complete/#operator_tap_on_complete","page":"tap_on_complete","title":"TapOnComplete Operator","text":"","category":"section"},{"location":"operators/utility/tap_on_complete/","page":"tap_on_complete","title":"tap_on_complete","text":"tap_on_complete","category":"page"},{"location":"operators/utility/tap_on_complete/#Rocket.tap_on_complete","page":"tap_on_complete","title":"Rocket.tap_on_complete","text":"tap_on_complete(tapFn::F) where { F <: Function }\n\nCreates a tap operator, which performs a side effect for only complete emission on the source Observable, but return an Observable that is identical to the source.\n\nArguments\n\ntapFn::Function: side-effect tap function with () -> Nothing signature\n\nProducing\n\nStream of type <: Subscribable{L} where L refers to type of source stream\n\nExamples\n\nusing Rocket\n\nsource = from([ 1, 2, 3 ])\nsubscribe!(source |> tap_on_complete(() -> println(\"Complete event received\")), logger())\n;\n\n# output\n\n[LogActor] Data: 1\n[LogActor] Data: 2\n[LogActor] Data: 3\n[LogActor] Completed\nComplete event received\n\n\nSee also: tap_on_subscribe, tap, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/utility/tap_on_complete/#Description","page":"tap_on_complete","title":"Description","text":"","category":"section"},{"location":"operators/utility/tap_on_complete/","page":"tap_on_complete","title":"tap_on_complete","text":"Returns an Observable that resembles the source Observable, but modifies it so that the provided Observer is called to perform a side effect on complete event emission by the source.","category":"page"},{"location":"operators/utility/tap_on_complete/","page":"tap_on_complete","title":"tap_on_complete","text":"This operator is useful for debugging your Observables, verifying correctness, or performing other side effects.","category":"page"},{"location":"operators/utility/tap_on_complete/","page":"tap_on_complete","title":"tap_on_complete","text":"Note: this operator differs from a subscribe on the Observable. If the Observable returned by tap_on_complete is not subscribed, the side effects specified by the Observer will never happen. tap_on_complete therefore simply spies on future execution, it does not trigger an execution to happen like subscribe does.","category":"page"},{"location":"operators/utility/tap_on_complete/#See-also","page":"tap_on_complete","title":"See also","text":"","category":"section"},{"location":"operators/utility/tap_on_complete/","page":"tap_on_complete","title":"tap_on_complete","text":"Operators","category":"page"},{"location":"observables/types/combined_updates/#observable_combined_updates","page":"Combined Updates","title":"CombinedUpdates Observable","text":"","category":"section"},{"location":"observables/types/combined_updates/","page":"Combined Updates","title":"Combined Updates","text":"combineLatestUpdates","category":"page"},{"location":"observables/types/combined_updates/#Rocket.combineLatestUpdates","page":"Combined Updates","title":"Rocket.combineLatestUpdates","text":"combineLatestUpdates(sources...; strategy = PushEach())\ncombineLatestUpdates(sources::S, strategy::G = PushEach()) where { S <: Tuple, U }\n\ncombineLatestUpdates is a more effiecient version of combineLatest(sources) + map_to(sources) operators chain.\n\nArguments\n\nsources: input sources\nstrategy: optional update strategy for batching new values together\n\nNote: combineLatestUpdates() completes immediately if sources are empty.\n\nSee also: Subscribable, subscribe!, PushEach, PushEachBut, PushNew, PushNewBut, PushStrategy\n\n\n\n\n\n","category":"function"},{"location":"observables/types/combined/#observable_combined","page":"Combined","title":"Combined Observable","text":"","category":"section"},{"location":"observables/types/combined/","page":"Combined","title":"Combined","text":"combineLatest\nPushEach\nPushEachBut\nPushNew\nPushNewBut\nPushStrategy","category":"page"},{"location":"observables/types/combined/#Rocket.combineLatest","page":"Combined","title":"Rocket.combineLatest","text":"combineLatest(sources...; strategy = PushEach())\ncombineLatest(sources::S, strategy::G = PushEach()) where { S <: Tuple, U }\n\nCombines multiple Observables to create an Observable whose values are calculated from the latest values of each of its input Observables. Accept optimal update strategy object.\n\nArguments\n\nsources: input sources\nstrategy: optional update strategy for batching new values together\n\nNote: combineLatest() completes immediately if sources are empty.\n\nExamples\n\nusing Rocket\n\nlatest = combineLatest(of(1), from(2:5))\n\nsubscribe!(latest, logger())\n;\n\n# output\n\n[LogActor] Data: (1, 2)\n[LogActor] Data: (1, 3)\n[LogActor] Data: (1, 4)\n[LogActor] Data: (1, 5)\n[LogActor] Completed\n\nusing Rocket\n\nlatest = combineLatest(of(1) |> async(0), from(2:5) |> async(0), strategy = PushNew())\n\nsubscribe!(latest, logger())\n;\n\n# output\n\n[LogActor] Data: (1, 2)\n[LogActor] Completed\n\nSee also: Subscribable, subscribe!, PushEach, PushEachBut, PushNew, PushNewBut, PushStrategy\n\n\n\n\n\n","category":"function"},{"location":"observables/types/combined/#Rocket.PushEach","page":"Combined","title":"Rocket.PushEach","text":"PushEach\n\nPushEach update strategy specifies the strategy to emit new value each time an inner observable emit a new value\n\nSee also: combineLatest, PushEachBut, PushNew, PushNewBut, PushStrategy\n\n\n\n\n\n","category":"type"},{"location":"observables/types/combined/#Rocket.PushEachBut","page":"Combined","title":"Rocket.PushEachBut","text":"PushEachBut{I}\n\nPushEachBut update strategy specifies the strategy to emit new value if and only if an inner observable with index I have a new value\n\nSee also: combineLatest, PushEach, PushNew, PushNewBut, PushStrategy\n\n\n\n\n\n","category":"type"},{"location":"observables/types/combined/#Rocket.PushNew","page":"Combined","title":"Rocket.PushNew","text":"PushNew\n\nPushNew update strategy specifies the strategy to emit new value if and only if all inner observables have a new value\n\nSee also: combineLatest, PushEach, PushEachBut, PushNewBut, PushStrategy\n\n\n\n\n\n","category":"type"},{"location":"observables/types/combined/#Rocket.PushNewBut","page":"Combined","title":"Rocket.PushNewBut","text":"PushNewBut{I}\n\nPushNewBut{I} update strategy specifies the strategy to emit new value if and only if all inner observables except with index I have a new value\n\nSee also: combineLatest, PushEach, PushEachBut, PushNew, PushStrategy\n\n\n\n\n\n","category":"type"},{"location":"observables/types/combined/#Rocket.PushStrategy","page":"Combined","title":"Rocket.PushStrategy","text":"PushStrategy(strategy::BitArray{1})\n\nPushStrategy update strategy specifies the strategy to emit new value if and only if all inner observables with index such that strategy[index] = false have a new value\n\nSee also: combineLatest, PushEach, PushEachBut, PushNew, PushNewBut, collectLatest\n\n\n\n\n\n","category":"type"},{"location":"observables/types/combined/#Description","page":"Combined","title":"Description","text":"","category":"section"},{"location":"observables/types/combined/","page":"Combined","title":"Combined","text":"combineLatest combines the values from all Observables in its arguments. This is done by subscribing to each Observable in order and, whenever an Observable emits, collecting a tuple of the most recent values from each Observable (in order). If you pass n Observables to combineLatest, the returned Observable will always emit an ordered tuple of n values.","category":"page"},{"location":"observables/types/combined/","page":"Combined","title":"Combined","text":"To ensure that the output tuple has a consistent length, combineLatest waits for all input Observables to emit at least once before it starts emitting results. This means that if some Observable emits values before other Observables started emitting, all these values but the last will be lost. On the other hand, if some Observable does not emit a value but completes, the resulting Observable will complete simultaneously without emitting anything. Furthermore, if some input Observable does not emit any value and never completes, combineLatest will also never emit and never complete.","category":"page"},{"location":"observables/types/combined/","page":"Combined","title":"Combined","text":"If at least one Observable was passed to combineLatest and all passed Observables emitted, then the resulting Observable will complete when all combined streams complete. So even if some Observable completes, the result of combineLatest will still emit values when the other Observables do. In case of a completed Observable, its value will now remain to be the last emitted value. On the other hand, if any Observable errors, combineLatest will also immediately error.","category":"page"},{"location":"observables/types/combined/","page":"Combined","title":"Combined","text":"It is possible to change default update/complete strategy behaviour with an optional strategy object.","category":"page"},{"location":"operators/filtering/about/#Filtering-category","page":"About filtering operators","title":"Filtering category","text":"","category":"section"},{"location":"operators/filtering/about/","page":"About filtering operators","title":"About filtering operators","text":"There are operators for different purposes, and they may be categorized as: creation, transformation, filtering, joining, multicasting, error handling, utility, etc. In the following list you will find all the operators organized in filtering category.","category":"page"},{"location":"operators/filtering/about/","page":"About filtering operators","title":"About filtering operators","text":"filter\nfilter_type\ntake\ntake_until\nfirst\nlast\nfind\nfind_index\nignore","category":"page"},{"location":"operators/filtering/about/#See-also","page":"About filtering operators","title":"See also","text":"","category":"section"},{"location":"operators/filtering/about/","page":"About filtering operators","title":"About filtering operators","text":"Operators","category":"page"},{"location":"observables/types/connectable/#observable_connectable","page":"Connectable","title":"Connectable Observable","text":"","category":"section"},{"location":"observables/types/connectable/","page":"Connectable","title":"Connectable","text":"connectable","category":"page"},{"location":"observables/types/connectable/#Rocket.connectable","page":"Connectable","title":"Rocket.connectable","text":"connectable(subject::J, source::S) where J where S\n\nCreates a ConnectableObservable with a given subject object and a source observable.\n\nExample\n\nusing Rocket\n\nc = connectable(Subject(Int; scheduler = AsapScheduler()), from(1:3))\n\nsubscribe!(c, logger());\n\nconnect(c);\n;\n\n# output\n\n[LogActor] Data: 1\n[LogActor] Data: 2\n[LogActor] Data: 3\n[LogActor] Completed\n\n\nSee also: ConnectableObservable, connect, subscribe!\n\n\n\n\n\n","category":"function"},{"location":"observables/types/connectable/","page":"Connectable","title":"Connectable","text":"connect","category":"page"},{"location":"observables/types/connectable/#Rocket.connect","page":"Connectable","title":"Rocket.connect","text":"connect(connectable::ConnectableObservable)\n\nWhen connect is called, the subject passed to the multicast operator is subscribed to the source and the subject’s observers receive the multicast notifications, which fits our basic mental model of stream multicasting. Returns a subscription.\n\nSee also: connectable, ConnectableObservable\n\n\n\n\n\n","category":"function"},{"location":"observables/types/connectable/","page":"Connectable","title":"Connectable","text":"ConnectableObservable","category":"page"},{"location":"observables/types/connectable/#Rocket.ConnectableObservable","page":"Connectable","title":"Rocket.ConnectableObservable","text":"ConnectableObservable{D}(subject, source)\n\nA connectable observable encapsulates the multicasting infrastructure with provided subject, but does not immediately subscribe to the source. It subscribes to the source when its connect method is called.\n\nSee also: connect, Subscribable\n\n\n\n\n\n","category":"type"},{"location":"operators/utility/tap_on_unsubscribe/#operator_tap_on_unsubscribe","page":"tap_on_unsubscribe","title":"TapOnUnsubscribe Operator","text":"","category":"section"},{"location":"operators/utility/tap_on_unsubscribe/","page":"tap_on_unsubscribe","title":"tap_on_unsubscribe","text":"TapBeforeUnsubscription\nTapAfterUnsubscription\ntap_on_unsubscribe","category":"page"},{"location":"operators/utility/tap_on_unsubscribe/#Rocket.TapBeforeUnsubscription","page":"tap_on_unsubscribe","title":"Rocket.TapBeforeUnsubscription","text":"TapBeforeUnsubscription\n\nOne of the strategies for tap_on_unsubscribe operator. With TapBeforeUnubscription tap callback will be called before actual unsubscription.\n\nSee also: tap_on_unsubscribe, TapAfterUnsubscription\n\n\n\n\n\n","category":"type"},{"location":"operators/utility/tap_on_unsubscribe/#Rocket.TapAfterUnsubscription","page":"tap_on_unsubscribe","title":"Rocket.TapAfterUnsubscription","text":"TapAfterUnsubscription\n\nOne of the strategies for tap_on_unsubscribe operator. With TapBeforeUnsubscription tap callback will be called after actual unsubscription.\n\nSee also: tap_on_unsubscribe, TapBeforeUnsubscription\n\n\n\n\n\n","category":"type"},{"location":"operators/utility/tap_on_unsubscribe/#Rocket.tap_on_unsubscribe","page":"tap_on_unsubscribe","title":"Rocket.tap_on_unsubscribe","text":"tap_on_unsubscribe(tapFn::F, strategy::S = TapBeforeUnsubscription()) where { F <: Function }\n\nCreates a tap operator, which performs a side effect on the unsubscription on the source Observable, but return an Observable that is identical to the source. Tap callback triggers only once.\n\nArguments\n\ntapFn::Function: side-effect tap function with () -> Nothing signature\nstrategy: (optional), specifies the order of a side-effect and an actual unsubscription, uses TapBeforeUnsubscription by default\n\nProducing\n\nStream of type <: Subscribable{L} where L refers to type of source stream\n\nExamples\n\nusing Rocket\n\nsource = from([ 1, 2, 3 ])\nsubscription = subscribe!(source |> tap_on_unsubscribe(() -> println(\"Someone unsubscribed\")), logger())\nunsubscribe!(subscription)\n;\n\n# output\n\n[LogActor] Data: 1\n[LogActor] Data: 2\n[LogActor] Data: 3\n[LogActor] Completed\nSomeone unsubscribed\n\nSee also: TapBeforeUnsubscription, TapAfterUnsubscription, tap, tap_on_subscribe, tap_on_complete, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/utility/tap_on_unsubscribe/#Description","page":"tap_on_unsubscribe","title":"Description","text":"","category":"section"},{"location":"operators/utility/tap_on_unsubscribe/","page":"tap_on_unsubscribe","title":"tap_on_unsubscribe","text":"Returns an Observable that resembles the source Observable, but modifies it so that the provided Observer is called to perform a side effect on unsubscription from the source.","category":"page"},{"location":"operators/utility/tap_on_unsubscribe/","page":"tap_on_unsubscribe","title":"tap_on_unsubscribe","text":"This operator is useful for debugging your Observables, verifying correctness, or performing other side effects.","category":"page"},{"location":"operators/utility/tap_on_unsubscribe/#See-also","page":"tap_on_unsubscribe","title":"See also","text":"","category":"section"},{"location":"operators/utility/tap_on_unsubscribe/","page":"tap_on_unsubscribe","title":"tap_on_unsubscribe","text":"Operators","category":"page"},{"location":"operators/errors/about/#Error-handling-category","page":"About error handling operators","title":"Error handling category","text":"","category":"section"},{"location":"operators/errors/about/","page":"About error handling operators","title":"About error handling operators","text":"There are operators for different purposes, and they may be categorized as: creation, transformation, filtering, joining, multicasting, error handling, utility, etc. In the following list you will find all the operators organized in error handling category.","category":"page"},{"location":"operators/errors/about/","page":"About error handling operators","title":"About error handling operators","text":"catch_error\nrerun\nerror_if\nerror_if_not","category":"page"},{"location":"operators/errors/about/#See-also","page":"About error handling operators","title":"See also","text":"","category":"section"},{"location":"operators/errors/about/","page":"About error handling operators","title":"About error handling operators","text":"Operators","category":"page"},{"location":"operators/utility/delay/#operator_delay","page":"delay","title":"Delay Operator","text":"","category":"section"},{"location":"operators/utility/delay/","page":"delay","title":"delay","text":"delay","category":"page"},{"location":"operators/utility/delay/#Rocket.delay","page":"delay","title":"Rocket.delay","text":"delay(delay::Int)\n\nCreates a delay operator, which delays the emission of items from the source Observable by a given timeout.\n\nArguments:\n\ndelay::Int: the delay duration in milliseconds (a number) until which the emission of the source items is delayed.\n\nProducing\n\nStream of type <: Subscribable{L} where L refers to type of source stream\n\nSee also: AbstractOperator, InferableOperator, ProxyObservable\n\n\n\n\n\n","category":"function"},{"location":"operators/utility/delay/#Description","page":"delay","title":"Description","text":"","category":"section"},{"location":"operators/utility/delay/","page":"delay","title":"delay","text":"Delays the emission of items from the source Observable by a given timeout","category":"page"},{"location":"operators/utility/delay/#Example","page":"delay","title":"Example","text":"","category":"section"},{"location":"operators/utility/delay/","page":"delay","title":"delay","text":"Delay every value with 1 second to the output","category":"page"},{"location":"operators/utility/delay/","page":"delay","title":"delay","text":"using Rocket\nusing Dates\n\nsource = from([ 1, 2, 3 ])\nprintln(Dates.format(now(), \"MM:SS\"))\nsubscription = subscribe!(source |> delay(2000), lambda(\n on_next = (d) -> println(\"$(Dates.format(now(), \"MM:SS\")): $d\")\n));\n\n# output\n\n03:41\n03:43: 1\n03:43: 2\n03:43: 3\n","category":"page"},{"location":"operators/utility/delay/#See-also","page":"delay","title":"See also","text":"","category":"section"},{"location":"operators/utility/delay/","page":"delay","title":"delay","text":"Operators","category":"page"},{"location":"operators/filtering/take/#operator_take","page":"take","title":"Take Operator","text":"","category":"section"},{"location":"operators/filtering/take/","page":"take","title":"take","text":"take","category":"page"},{"location":"operators/filtering/take/#Rocket.take","page":"take","title":"Rocket.take","text":"take(maxcount::Int)\n\nCreates a take operator, which returns an Observable that emits only the first maxcount values emitted by the source Observable.\n\nArguments\n\nmaxcount::Int: the maximum number of next values to emit.\n\nProducing\n\nStream of type <: Subscribable{L} where L refers to type of source stream\n\nExamples\n\nusing Rocket\n\nsource = from([ i for i in 1:100 ])\n\nsubscribe!(source |> take(5), logger())\n;\n\n# output\n\n[LogActor] Data: 1\n[LogActor] Data: 2\n[LogActor] Data: 3\n[LogActor] Data: 4\n[LogActor] Data: 5\n[LogActor] Completed\n\nSee also: AbstractOperator, InferableOperator, ProxyObservable, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/filtering/take/#Description","page":"take","title":"Description","text":"","category":"section"},{"location":"operators/filtering/take/","page":"take","title":"take","text":"take returns an Observable that emits only the first count values emitted by the source Observable. If the source emits fewer than count values, then all of its values are emitted. Afterwards, the Observable completes regardless of whether the source completed.","category":"page"},{"location":"operators/filtering/take/#See-also","page":"take","title":"See also","text":"","category":"section"},{"location":"operators/filtering/take/","page":"take","title":"take","text":"Operators","category":"page"},{"location":"operators/transformation/scan/#operator_scan","page":"scan","title":"Scan Operator","text":"","category":"section"},{"location":"operators/transformation/scan/","page":"scan","title":"scan","text":"scan","category":"page"},{"location":"operators/transformation/scan/#Rocket.scan","page":"scan","title":"Rocket.scan","text":"scan(::Type{R}, scanFn::F, seed::R) where { R, F <: Function }\nscan(scanFn::F) where { F <: Function }\n\nCreates a scan operator, which applies a given accumulator scanFn function to each value emmited by the source Observable, and returns each intermediate result with an optional seed value. If a seed value is specified, then that value will be used as the initial value for the accumulator. If no seed value is specified, the first item of the source is used as the seed.\n\nArguments\n\n::Type{R}: the type of data of transformed value, may be or may not be the same as type of input source\nscanFn::Function: accumulator function with (data::T, current::R) -> R signature\nseed::R: optional initial value for accumulator function\n\nProducing\n\nStream of type <: Subscribable{R}\n\nExamples\n\nusing Rocket\n\nsource = from([ 1, 2, 3 ])\nsubscribe!(source |> scan(+), logger())\n;\n\n# output\n\n[LogActor] Data: 1\n[LogActor] Data: 3\n[LogActor] Data: 6\n[LogActor] Completed\n\n\nusing Rocket\n\nsource = from([ 1, 2, 3 ])\nsubscribe!(source |> scan(Vector{Int}, (d, c) -> [ c..., d ], Int[]), logger())\n;\n\n# output\n\n[LogActor] Data: [1]\n[LogActor] Data: [1, 2]\n[LogActor] Data: [1, 2, 3]\n[LogActor] Completed\n\n\nSee also: AbstractOperator, RightTypedOperator, ProxyObservable, reduce, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/transformation/scan/#Description","page":"scan","title":"Description","text":"","category":"section"},{"location":"operators/transformation/scan/","page":"scan","title":"scan","text":"Combines all values emitted by the source, using an accumulator function that joins a new source value with the past accumulation. This is similar to reduce, but emits the intermediate accumulations.","category":"page"},{"location":"operators/transformation/scan/","page":"scan","title":"scan","text":"Returns an Observable that applies a specified accumulator function to each item emitted by the source Observable. If a seed value is specified, then that value will be used as the initial value for the accumulator. If no seed value is specified, the first item of the source is used as the seed.","category":"page"},{"location":"operators/transformation/scan/#See-also","page":"scan","title":"See also","text":"","category":"section"},{"location":"operators/transformation/scan/","page":"scan","title":"scan","text":"Operators","category":"page"},{"location":"actors/types/buffer/#actor_buffer","page":"Buffer","title":"Buffer actor","text":"","category":"section"},{"location":"actors/types/buffer/","page":"Buffer","title":"Buffer","text":"buffer","category":"page"},{"location":"actors/types/buffer/#Rocket.buffer","page":"Buffer","title":"Rocket.buffer","text":"buffer(::Type{T}, size::Int) where T\n\nArguments\n\n::Type{T}: Type of data in buffer\nsize::Int: size of buffer\n\nCreation operator for the BufferActor actor.\n\nExamples\n\nusing Rocket\n\nactor = buffer(Int, 3)\nactor isa BufferActor{Int}\n\n# output\ntrue\n\nSee also: BufferActor, AbstractActor\n\n\n\n\n\n","category":"function"},{"location":"actors/types/buffer/","page":"Buffer","title":"Buffer","text":"BufferActor","category":"page"},{"location":"actors/types/buffer/#Rocket.BufferActor","page":"Buffer","title":"Rocket.BufferActor","text":"BufferActor{D}() where D\n\nBuffer actor provides a storage actor. It copies last incoming successful next events in a values array, throws an ErrorException on error! event and does nothing on completion event. Note: Actor does not check the size of incoming data.\n\nExamples\n\nusing Rocket\n\nsource = of([ 1, 2, 3 ])\nactor = buffer(Int, 3)\n\nsubscribe!(source, actor)\nshow(getvalues(actor))\n\n# output\n[1, 2, 3]\n\nSee also: Actor, buffer\n\n\n\n\n\n","category":"type"},{"location":"operators/creation/about/#Creation-category","page":"Creation","title":"Creation category","text":"","category":"section"},{"location":"operators/creation/about/","page":"Creation","title":"Creation","text":"There are operators for different purposes, and they may be categorized as: creation, transformation, filtering, joining, multicasting, error handling, utility, etc. In the following list you will find all the operators organized in creation category.","category":"page"},{"location":"operators/creation/about/","page":"Creation","title":"Creation","text":"make\nof\nfrom\niterable\nfaulted\nnever\ncompleted\ntimer\ninterval\nproxy\nfile\ncombined\nrace\nconnectable\nmerged\nconcat\ngenerate\nnetwork\ndefer\nzipped","category":"page"},{"location":"operators/creation/about/#See-also","page":"Creation","title":"See also","text":"","category":"section"},{"location":"operators/creation/about/","page":"Creation","title":"Creation","text":"Operators","category":"page"},{"location":"subjects/types/recent/#subject_recent","page":"Recent","title":"RecentSubject","text":"","category":"section"},{"location":"subjects/types/recent/","page":"Recent","title":"Recent","text":"RecentSubject\nRecentSubjectFactory","category":"page"},{"location":"subjects/types/recent/#Rocket.RecentSubject","page":"Recent","title":"Rocket.RecentSubject","text":"RecentSubject(::Type{D}) where D\nRecentSubject(::Type{D}, factory::F) where { D, F <: AbstractSubjectFactory }\nRecentSubject(::Type{D}, subject::S) where { D, S }\n\nA variant of Subject that emits its recent value whenever it is subscribed to.\n\nSee also: RecentSubjectFactory, Subject, SubjectFactory\n\n\n\n\n\n","category":"function"},{"location":"subjects/types/recent/#Rocket.RecentSubjectFactory","page":"Recent","title":"Rocket.RecentSubjectFactory","text":"RecentSubjectFactory(factory::F) where { F <: AbstractSubjectFactory }\nRecentSubjectFactory(; scheduler::H = AsapScheduler()) where { H <: AbstractScheduler }\n\nA variant of SubjectFactory that creates an instance of RecentSubject.\n\nSee also: SubjectFactory, AbstractSubjectFactory, RecentSubject, Subject\n\n\n\n\n\n","category":"function"},{"location":"subjects/types/recent/#Description","page":"Recent","title":"Description","text":"","category":"section"},{"location":"subjects/types/recent/","page":"Recent","title":"Recent","text":"One of the variants of Subjects is the RecentSubject, which has a notion of \"the recent value\". It stores the latest value emitted to its consumers, and whenever a new Observer subscribes, it will immediately receive the \"recent value\" from the RecentSubject.","category":"page"},{"location":"subjects/types/recent/","page":"Recent","title":"Recent","text":"note: Note\nRecentSubjects is a more efficient version of ReplaySubjects with replay size equal to one.","category":"page"},{"location":"subjects/types/recent/#Examples","page":"Recent","title":"Examples","text":"","category":"section"},{"location":"subjects/types/recent/","page":"Recent","title":"Recent","text":"In the following example, after RecentSubject is initialized the first Observer receives nothing when it subscribes. The second Observer receives the value 2 even though it subscribed after the value 2 was sent.","category":"page"},{"location":"subjects/types/recent/","page":"Recent","title":"Recent","text":"using Rocket\n\nsubject = RecentSubject(Int)\n\nsubscription1 = subscribe!(subject, logger(\"1\"))\n\nnext!(subject, 1)\nnext!(subject, 2)\n\nsubscription2 = subscribe!(subject, logger(\"2\"))\n\nnext!(subject, 3)\n\nunsubscribe!(subscription1)\nunsubscribe!(subscription2)\n\n// Logs\n// [1] Data: 1\n// [1] Data: 2\n// [2] Data: 2\n// [1] Data: 3\n// [2] Data: 3","category":"page"},{"location":"operators/utility/noop/#operator_noop","page":"noop","title":"Noop Operator","text":"","category":"section"},{"location":"operators/utility/noop/","page":"noop","title":"noop","text":"noop","category":"page"},{"location":"operators/utility/noop/#Rocket.noop","page":"noop","title":"Rocket.noop","text":"noop()\n\nCreates a noop operator, which does nothing, but breaks operator composition type inference checking procedure for Julia's compiler. It might be useful for very long chain of operators, because Julia tries to statically infer data types at compile-time for the whole chain and can run into StackOverflow issues.\n\nusing Rocket\n\n# foo() block to enforce local scope for scope variable\nfunction foo()\n source = from(1:5)\n\n for i in 1:1000\n source = source |> map(Int, d -> d + 1) |> noop()\n end\n\n subscribe!(source, logger())\nend\n\nfoo()\n;\n\n# output\n\n[LogActor] Data: 1001\n[LogActor] Data: 1002\n[LogActor] Data: 1003\n[LogActor] Data: 1004\n[LogActor] Data: 1005\n[LogActor] Completed\n\nSee also: AbstractOperator, InferableOperator, logger, map\n\n\n\n\n\n","category":"function"},{"location":"operators/utility/noop/#See-also","page":"noop","title":"See also","text":"","category":"section"},{"location":"operators/utility/noop/","page":"noop","title":"noop","text":"Operators","category":"page"},{"location":"getting-started/#Getting-started","page":"Getting started","title":"Getting started","text":"","category":"section"},{"location":"getting-started/","page":"Getting started","title":"Getting started","text":"Rocket.jl is a Julia package for reactive programming that makes it easier to work with asynchronous data. It is inspired by the RxJS and ReactiveX communities.","category":"page"},{"location":"getting-started/","page":"Getting started","title":"Getting started","text":"In order to combine good performance with a convenient API, Rocket.jl employs Observer patterns, Actor models and Functional programming.","category":"page"},{"location":"getting-started/#Installation","page":"Getting started","title":"Installation","text":"","category":"section"},{"location":"getting-started/","page":"Getting started","title":"Getting started","text":"Install Rocket.jl through the Julia package manager:","category":"page"},{"location":"getting-started/","page":"Getting started","title":"Getting started","text":"] add Rocket","category":"page"},{"location":"getting-started/#Concepts","page":"Getting started","title":"Concepts","text":"","category":"section"},{"location":"getting-started/","page":"Getting started","title":"Getting started","text":"Rocket.jl has been designed with a focus on performance and modularity.","category":"page"},{"location":"getting-started/","page":"Getting started","title":"Getting started","text":"The essential concepts in Rocket.jl are:","category":"page"},{"location":"getting-started/","page":"Getting started","title":"Getting started","text":"Observable: represents a collection of future messages (data or/and events).\nActor: is an object that knows how to react on incoming messages delivered by the Observable.\nSubscription: represents a teardown logic that is useful for cancelling the execution of an Observable.\nOperator: an object that deals with collection operations, such as map, filter, reduce, etc.\nSubject: the way of multicasting a message to multiple Observers.","category":"page"},{"location":"getting-started/#First-example","page":"Getting started","title":"First example","text":"","category":"section"},{"location":"getting-started/","page":"Getting started","title":"Getting started","text":"Conventionally, arrays are used for processing data.","category":"page"},{"location":"getting-started/","page":"Getting started","title":"Getting started","text":"for value in array_of_values\n doSomethingWithMyData(value)\nend","category":"page"},{"location":"getting-started/","page":"Getting started","title":"Getting started","text":"In contrast, Rocket.jl uses observables.","category":"page"},{"location":"getting-started/","page":"Getting started","title":"Getting started","text":"subscription = subscribe!(source_of_values, lambda(\n on_next = (data) -> doSomethingWithMyData(data),\n on_error = (error) -> doSomethingWithAnError(error),\n on_complete = () -> println(\"Completed!\")\n))","category":"page"},{"location":"getting-started/","page":"Getting started","title":"Getting started","text":"At some point in time you may decide to stop listening for new messages.","category":"page"},{"location":"getting-started/","page":"Getting started","title":"Getting started","text":"unsubscribe!(subscription)","category":"page"},{"location":"getting-started/#Actors","page":"Getting started","title":"Actors","text":"","category":"section"},{"location":"getting-started/","page":"Getting started","title":"Getting started","text":"In order to process messages from an observable you will need to define an Actor that knows how to react to incoming messages.","category":"page"},{"location":"getting-started/","page":"Getting started","title":"Getting started","text":"struct MyActor <: Rocket.Actor{Int} end\n\nRocket.on_next!(actor::MyActor, data::Int) = doSomethingWithMyData(data)\nRocket.on_error!(actor::MyActor, error) = doSomethingWithAnError(error)\nRocket.on_complete!(actor::MyActor) = println(\"Completed!\")","category":"page"},{"location":"getting-started/","page":"Getting started","title":"Getting started","text":"An actor can also have its own local state.","category":"page"},{"location":"getting-started/","page":"Getting started","title":"Getting started","text":"struct StoreActor{D} <: Rocket.Actor{D}\n values :: Vector{D}\n\n StoreActor{D}() where D = new(Vector{D}())\nend\n\nRocket.on_next!(actor::StoreActor{D}, data::D) where D = push!(actor.values, data)\nRocket.on_error!(actor::StoreActor, error) = doSomethingWithAnError(error)\nRocket.on_complete!(actor::StoreActor) = println(\"Completed: $(actor.values)\")","category":"page"},{"location":"getting-started/","page":"Getting started","title":"Getting started","text":"For debugging purposes you can use a general LambdaActor actor or just pass a function object as an actor in subscribe! function..","category":"page"},{"location":"getting-started/#Operators","page":"Getting started","title":"Operators","text":"","category":"section"},{"location":"getting-started/","page":"Getting started","title":"Getting started","text":"What makes Rocket.jl powerful is its ability to help you process, transform and modify the messages that flow through your observables, using Operators.","category":"page"},{"location":"getting-started/","page":"Getting started","title":"Getting started","text":"subscribe!(squared_int_values |> map(Int, (d) -> d ^ 2), lambda(\n on_next = (data) -> println(data)\n))","category":"page"},{"location":"operators/transformation/pairwise/#operator_pairwise","page":"pairwise","title":"Pairwise Operator","text":"","category":"section"},{"location":"operators/transformation/pairwise/","page":"pairwise","title":"pairwise","text":"pairwise","category":"page"},{"location":"operators/transformation/pairwise/#Rocket.pairwise","page":"pairwise","title":"Rocket.pairwise","text":"pairwise([ initial ])\n\nCreates a pairwise operator, which groups pairs of consecutive emissions together and emits them as a tuple of two values. Accepts optional initial seed value to start pairing from.\n\nusing Rocket\n\nsource = from(1:5) |> pairwise()\n\nsubscribe!(source, logger())\n;\n\n# output\n\n[LogActor] Data: (1, 2)\n[LogActor] Data: (2, 3)\n[LogActor] Data: (3, 4)\n[LogActor] Data: (4, 5)\n[LogActor] Completed\n\nusing Rocket\n\nsource = from(1:5) |> pairwise(0)\n\nsubscribe!(source, logger())\n;\n\n# output\n\n[LogActor] Data: (0, 1)\n[LogActor] Data: (1, 2)\n[LogActor] Data: (2, 3)\n[LogActor] Data: (3, 4)\n[LogActor] Data: (4, 5)\n[LogActor] Completed\n\nSee also: AbstractOperator, InferableOperator, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/transformation/pairwise/#See-also","page":"pairwise","title":"See also","text":"","category":"section"},{"location":"operators/transformation/pairwise/","page":"pairwise","title":"pairwise","text":"Operators","category":"page"},{"location":"operators/filtering/first/#operator_first","page":"first","title":"First operator","text":"","category":"section"},{"location":"operators/filtering/first/","page":"first","title":"first","text":"first","category":"page"},{"location":"operators/filtering/first/#Base.first","page":"first","title":"Base.first","text":"first(; default = nothing)\n\nCreates a first operator, which returns an Observable that emits only the first value emitted by the source Observable. Sends FirstNotFoundException error message if a given source completes without emitting a single value.\n\nArguments\n\ndefault: an optional default value to provide if no values were emitted\n\nProducing\n\nStream of type <: Subscribable{L} where L refers to type of source stream\n\nExamples\n\nusing Rocket\n\nsource = from(1:100)\nsubscription = subscribe!(source |> first(), logger())\n;\n\n# output\n\n[LogActor] Data: 1\n[LogActor] Completed\n\nSee also: take, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/filtering/first/#Description","page":"first","title":"Description","text":"","category":"section"},{"location":"operators/filtering/first/","page":"first","title":"first","text":"An alias for take(1) operator.","category":"page"},{"location":"operators/filtering/first/#See-also","page":"first","title":"See also","text":"","category":"section"},{"location":"operators/filtering/first/","page":"first","title":"first","text":"Operators, take","category":"page"},{"location":"actors/types/function/#actor_function","page":"Function","title":"Function actor","text":"","category":"section"},{"location":"actors/types/function/","page":"Function","title":"Function","text":"FunctionActor","category":"page"},{"location":"actors/types/function/#Rocket.FunctionActor","page":"Function","title":"Rocket.FunctionActor","text":"FunctionActor{D} <: Actor{D}\n\nFunctionActor provides a simple interface to use a single function as a next! callback, error! callback throws an ErrorException and complete! callback does nothing. Should not be used explicitly because it will be created automatically when passing a Function object as an actor in subscribe! function.\n\nExamples\n\nusing Rocket\n\nsource = from(1:5)\nsubscribe!(source, (t) -> println(t))\n;\n\n# output\n1\n2\n3\n4\n5\n\nSee also: Actor, subscribe!\n\n\n\n\n\n","category":"type"},{"location":"operators/mathematical/min/#operator_min","page":"min","title":"Min Operator","text":"","category":"section"},{"location":"operators/mathematical/min/","page":"min","title":"min","text":"min","category":"page"},{"location":"operators/mathematical/min/#Base.min","page":"min","title":"Base.min","text":"min(; from = nothing)\n\nCreates a min operator, which emits a single item: the item with the smallest value.\n\nArguments\n\nfrom: optional initial minimal value, if nothing first item from the source will be used as initial instead\n\nProducing\n\nStream of type <: Subscribable{Union{L, Nothing}} where L refers to type of source stream\n\nExamples\n\nusing Rocket\n\nsource = from([ i for i in 1:42 ])\nsubscribe!(source |> min(), logger())\n;\n\n# output\n\n[LogActor] Data: 1\n[LogActor] Completed\n\n\nSee also: AbstractOperator, InferableOperator, ProxyObservable, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/mathematical/min/#Description","page":"min","title":"Description","text":"","category":"section"},{"location":"operators/mathematical/min/","page":"min","title":"min","text":"The min operator operates on an Observable of similar objects. When source Observable completes, it emits the item with the smallest value.","category":"page"},{"location":"operators/mathematical/min/#See-also","page":"min","title":"See also","text":"","category":"section"},{"location":"operators/mathematical/min/","page":"min","title":"min","text":"Operators","category":"page"},{"location":"operators/errors/error_if/#operator_error_if","page":"error_if","title":"Error If Operator","text":"","category":"section"},{"location":"operators/errors/error_if/","page":"error_if","title":"error_if","text":"error_if","category":"page"},{"location":"operators/errors/error_if/#Rocket.error_if","page":"error_if","title":"Rocket.error_if","text":"error_if(checkFn, errorFn)\n\nCreates an error_if operator, which performs a check for every emission on the source Observable with checkFn. If checkFn returns true, the operator sends an error event and unsubscribes from the observable.\n\nArguments\n\ncheckFn: check function with (data) -> Bool signature\nerrorFn: error object generating function with (data) -> Any signature, optional\n\nProducing\n\nStream of type <: Subscribable{L} where L refers to type of source stream\n\nExamples\n\nusing Rocket\n\nsource = from([1, 2, 3]) |> error_if((data) -> data > 2, (data) -> \"CustomError\")\n\nsubscription = subscribe!(source, lambda(\n on_next = (d) -> println(\"Next: \", d),\n on_error = (e) -> println(\"Error: \", e),\n on_complete = () -> println(\"Completed\")\n))\n;\n\n# output\nNext: 1\nNext: 2\nError: CustomError\n\nSee also: error_if_not, error_if_empty, default_if_empty, lambda\n\n\n\n\n\n","category":"function"},{"location":"operators/errors/error_if/#See-also","page":"error_if","title":"See also","text":"","category":"section"},{"location":"operators/errors/error_if/","page":"error_if","title":"error_if","text":"Operators","category":"page"},{"location":"subjects/about/#section_subjects","page":"Subject","title":"About subjects","text":"","category":"section"},{"location":"subjects/about/","page":"Subject","title":"Subject","text":"A Rocket.jl Subject is a special type of Observable that allows values to be multicasted to many Actors. While plain Observables are unicast (each subscribed Actor owns an independent execution of the Observable), Subjects are multicast.","category":"page"},{"location":"subjects/about/","page":"Subject","title":"Subject","text":"note: Note\nA Subject is like an Observable, but can multicast to many Actors. Subjects are like event emitters: they maintain a registry of many listeners.","category":"page"},{"location":"subjects/about/","page":"Subject","title":"Subject","text":"Every Subject is an Observable. Given a Subject, you can subscribe to it, providing an Actor, which will start receiving values normally. From the perspective of the Actor, it cannot tell whether the Observable execution is coming from a plain unicast Observable or a Subject.","category":"page"},{"location":"subjects/about/","page":"Subject","title":"Subject","text":"Internally to the Subject, subscribe! does not invoke a new execution that delivers values. Instead, it simply registers the given Actor in a list of Actors.","category":"page"},{"location":"subjects/about/","page":"Subject","title":"Subject","text":"Every Subject is an Actor itself. It is an object with the methods next!, error!, and complete!. Call next!(subject, theValue) to feed a new value to the Subject, and it will be multicasted to the Actors that listen to the Subject.","category":"page"},{"location":"subjects/about/","page":"Subject","title":"Subject","text":"In the example below, we have two Observers attached to a Subject, and we feed some values to the Subject:","category":"page"},{"location":"subjects/about/","page":"Subject","title":"Subject","text":"using Rocket\n\nsource = Subject(Int)\n\nsubscription1 = subscribe!(source, lambda(\n on_next = (d) -> println(\"Actor 1: $d\")\n))\n\nsubscription2 = subscribe!(source, lambda(\n on_next = (d) -> println(\"Actor 2: $d\")\n))\n\nnext!(source, 0)\n\n# Logs\n# Actor 1: 0\n# Actor 2: 0\n\nunsubscribe!(subscription1)\nunsubscribe!(subscription2)\n","category":"page"},{"location":"subjects/about/","page":"Subject","title":"Subject","text":"Since a Subject is an actor, this also means you may provide a Subject as the argument to the subscribe of any Observable:","category":"page"},{"location":"subjects/about/","page":"Subject","title":"Subject","text":"using Rocket\n\nsource = Subject(Int)\n\nsubscription1 = subscribe!(source, lambda(\n on_next = (d) -> println(\"Actor 1: $d\")\n))\n\nsubscription2 = subscribe!(source, lambda(\n on_next = (d) -> println(\"Actor 2: $d\")\n))\n\nother_source = from([ 1, 2, 3 ])\nsubscribe!(other_source, source);\n\n# Logs\n# Actor 1: 1\n# Actor 2: 1\n# Actor 1: 2\n# Actor 2: 2\n# Actor 1: 3\n# Actor 2: 3","category":"page"},{"location":"subjects/about/","page":"Subject","title":"Subject","text":"Here, we essentially convert a unicast Observable execution to multicast, through the Subject. This demonstrates how Subjects offer a unique way to share Observable execution with multiple Observers.","category":"page"},{"location":"subjects/about/#Schedulers","page":"Subject","title":"Schedulers","text":"","category":"section"},{"location":"subjects/about/","page":"Subject","title":"Subject","text":"A Subject (and some other observables) uses scheduler objects to schedule message delivery to their listeners.","category":"page"},{"location":"subjects/about/#Synchronous-scheduler","page":"Subject","title":"Synchronous scheduler","text":"","category":"section"},{"location":"subjects/about/","page":"Subject","title":"Subject","text":"One of the variants of schedulers is the AsapScheduler, which delivers every message synchronously. AsapScheduler is a default scheduler for all Subject objects.","category":"page"},{"location":"subjects/about/","page":"Subject","title":"Subject","text":"AsapScheduler","category":"page"},{"location":"subjects/about/#Rocket.AsapScheduler","page":"Subject","title":"Rocket.AsapScheduler","text":"AsapScheduler\n\nAsapScheduler executes scheduled actions as soon as possible and does not introduce any additional logic. AsapScheduler is a default scheduler for almost all observables.\n\n\n\n\n\n","category":"type"},{"location":"subjects/about/","page":"Subject","title":"Subject","text":"using Rocket\n\nsubject = Subject(Int, scheduler = AsapScheduler())\n\nsubscription1 = subscribe!(subject, logger(\"Actor 1\"))\n\nprintln(\"Before next\")\nnext!(subject, 1)\nnext!(subject, 2)\nprintln(\"After next\")\n\nsubscription2 = subscribe!(subject, logger(\"Actor 2\"))\n\nnext!(subject, 3)\n\n# Logs\n# Before next\n# [Actor 1] Data: 1\n# [Actor 1] Data: 2\n# After next\n# [Actor 1] Data: 3\n# [Actor 2] Data: 3","category":"page"},{"location":"subjects/about/#Asynchronous-Scheduler","page":"Subject","title":"Asynchronous Scheduler","text":"","category":"section"},{"location":"subjects/about/","page":"Subject","title":"Subject","text":"An AsyncScheduler is similar to a AsapScheduler. Both allows for Subject to scheduler their messages for multiple listeners, but a AsyncScheduler delivers all messages asynchronously (but still ordered) using a Julia's built-in Task object.","category":"page"},{"location":"subjects/about/","page":"Subject","title":"Subject","text":"AsyncScheduler","category":"page"},{"location":"subjects/about/#Rocket.AsyncScheduler","page":"Subject","title":"Rocket.AsyncScheduler","text":"AsyncScheduler\n\nAsyncScheduler executes scheduled actions asynchronously and uses Channel object to order different actions on a single asynchronous task\n\n\n\n\n\n","category":"type"},{"location":"subjects/about/","page":"Subject","title":"Subject","text":"using Rocket\n\nsubject = Subject(Int, scheduler = AsyncScheduler())\n\nsubscription1 = subscribe!(subject, logger(\"Actor 1\"))\n\nprintln(\"Before next\")\nnext!(subject, 1)\nnext!(subject, 2)\nprintln(\"After next\")\n\nsubscription2 = subscribe!(subject, logger(\"Actor 2\"))\n\nnext!(subject, 3)\n\n# Logs\n# Before next\n# After next\n# [Actor 1] Data: 1\n# [Actor 1] Data: 2\n# [Actor 1] Data: 3\n# [Actor 2] Data: 3\n","category":"page"},{"location":"operators/filtering/find_index/#operator_find_index","page":"find_index","title":"Find Index operator","text":"","category":"section"},{"location":"operators/filtering/find_index/","page":"find_index","title":"find_index","text":"find_index","category":"page"},{"location":"operators/filtering/find_index/#Rocket.find_index","page":"find_index","title":"Rocket.find_index","text":"find_index(conditionFn::F) where { F <: Function }\n\nCreates a find operator, which emits only the index of the first value emitted by the source Observable that meets some condition. Indices are 1-based.\n\nProducing\n\nStream of type <: Subscribable{L} where L refers to type of source stream\n\nArguments\n\nconditionFn::F: condition function with (data::T) -> Bool signature\n\nExamples\n\nusing Rocket\n\nsource = from([ 0, 1, 2, 3, 4, 5, 6, 7, 8 ])\nsubscribe!(source |> find_index((d) -> d !== 0 && d % 2 == 0), logger())\n;\n\n# output\n\n[LogActor] Data: 3\n[LogActor] Completed\n\nSee also: find, AbstractOperator, InferableOperator, ProxyObservable, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/filtering/find_index/#Description","page":"find_index","title":"Description","text":"","category":"section"},{"location":"operators/filtering/find_index/","page":"find_index","title":"find_index","text":"It's like find, but emits the index of the found value, not the value itself.","category":"page"},{"location":"operators/filtering/find_index/#See-also","page":"find_index","title":"See also","text":"","category":"section"},{"location":"operators/filtering/find_index/","page":"find_index","title":"find_index","text":"Operators, take","category":"page"},{"location":"api/subjects/#subjects_api","page":"Subjects","title":"Subjects API","text":"","category":"section"},{"location":"api/subjects/#Traits","page":"Subjects","title":"Traits","text":"","category":"section"},{"location":"api/subjects/","page":"Subjects","title":"Subjects","text":"SubjectTrait\nas_subject \nValidSubjectTrait\nInvalidSubjectTrait\nAbstractSubject","category":"page"},{"location":"api/subjects/#Rocket.SubjectTrait","page":"Subjects","title":"Rocket.SubjectTrait","text":"Abstract type for all possible subject traits\n\nSee also: ValidSubjectTrait, InvalidSubjectTrait, as_subject\n\n\n\n\n\n","category":"type"},{"location":"api/subjects/#Rocket.as_subject","page":"Subjects","title":"Rocket.as_subject","text":"as_subject(::Type)\n\nThis function checks subject trait behavior specification. Should be used explicitly to specify subject trait behavior for any object type.\n\nSee also: SubjectTrait\n\n\n\n\n\n","category":"function"},{"location":"api/subjects/#Rocket.ValidSubjectTrait","page":"Subjects","title":"Rocket.ValidSubjectTrait","text":"Valid subject trait behavior\n\nSee also: SubjectTrait\n\n\n\n\n\n","category":"type"},{"location":"api/subjects/#Rocket.InvalidSubjectTrait","page":"Subjects","title":"Rocket.InvalidSubjectTrait","text":"Default subject trait behavior for all types.\n\nSee also: SubjectTrait\n\n\n\n\n\n","category":"type"},{"location":"api/subjects/#Rocket.AbstractSubject","page":"Subjects","title":"Rocket.AbstractSubject","text":"Supertype for Subject types. Automatically specifies ValidSubject, SimpleSubscribableTrait and BaseActorTrait traits.\n\nSee also: Subject, ValidSubjectTrait, SimpleSubscribableTrait, BaseActorTrait\n\n\n\n\n\n","category":"type"},{"location":"api/subjects/#Factory","page":"Subjects","title":"Factory","text":"","category":"section"},{"location":"api/subjects/","page":"Subjects","title":"Subjects","text":"AbstractSubjectFactory\ncreate_subject","category":"page"},{"location":"api/subjects/#Rocket.AbstractSubjectFactory","page":"Subjects","title":"Rocket.AbstractSubjectFactory","text":"Abstract type for all possible subject factories\n\nSee also: SubjectTrait, ValidSubjectTrait, InvalidSubjectTrait\n\n\n\n\n\n","category":"type"},{"location":"api/subjects/#Rocket.create_subject","page":"Subjects","title":"Rocket.create_subject","text":"create_subject(::Type{L}, factory::F) where L where { F <: AbstractSubjectFactory }\n\nActor creator function for a given factory F. Should be implemented explicitly for any AbstractActorFactory object\n\nSee also: AbstractSubjectFactory, MissingCreateActorFactoryImplementationError\n\n\n\n\n\n","category":"function"},{"location":"api/subjects/#Errors","page":"Subjects","title":"Errors","text":"","category":"section"},{"location":"api/subjects/","page":"Subjects","title":"Subjects","text":"InvalidSubjectTraitUsageError\nInconsistentSubjectDataTypesError","category":"page"},{"location":"api/subjects/#Rocket.InvalidSubjectTraitUsageError","page":"Subjects","title":"Rocket.InvalidSubjectTraitUsageError","text":"InvalidSubject usage error\n\nSee also: as_subject\n\n\n\n\n\n","category":"type"},{"location":"api/subjects/#Rocket.InconsistentSubjectDataTypesError","page":"Subjects","title":"Rocket.InconsistentSubjectDataTypesError","text":"InconsistentSubjectDataTypesError\n\nSee also: as_subject\n\n\n\n\n\n","category":"type"},{"location":"operators/transformation/lowercase/#operator_lowercase","page":"lowercase","title":"Lowercase Operator","text":"","category":"section"},{"location":"operators/transformation/lowercase/","page":"lowercase","title":"lowercase","text":"lowercase","category":"page"},{"location":"operators/transformation/lowercase/#Base.Unicode.lowercase","page":"lowercase","title":"Base.Unicode.lowercase","text":"lowercase()\n\nCreates an lowercase operator, which forces each value to be in lower case\n\nProducing\n\nStream of type <: Subscribable{L} where L referes to type of data of input Observable\n\nExamples\n\nusing Rocket\n\nsource = of(\"Hello, world!\")\nsubscribe!(source |> lowercase(), logger())\n;\n\n# output\n\n[LogActor] Data: hello, world!\n[LogActor] Completed\n\nSee also: AbstractOperator, InferableOperator, ProxyObservable, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/transformation/lowercase/#See-also","page":"lowercase","title":"See also","text":"","category":"section"},{"location":"operators/transformation/lowercase/","page":"lowercase","title":"lowercase","text":"Operators, map, uppercase","category":"page"},{"location":"operators/transformation/merge_map/#operator_merge_map","page":"merge_map","title":"MergeMap Operator","text":"","category":"section"},{"location":"operators/transformation/merge_map/","page":"merge_map","title":"merge_map","text":"merge_map","category":"page"},{"location":"operators/transformation/merge_map/#Rocket.merge_map","page":"merge_map","title":"Rocket.merge_map","text":"merge_map(::Type{R}, mappingFn::F = identity; concurrent::Int = typemax(Int)) where { R, F <: Function }\n\nCreates a merge_map operator, which returns an Observable that emits the result of applying the projection function mappingFn to each item emitted by the source Observable and merging the results of the Observables obtained from this transformation.\n\nArguments\n\n::Type{R}: the type of data of output Observables after projection with mappingFn\nmappingFn::F: projection function with (data) -> Observable{R} signature\nconcurrent::Int: optional, default is typemax(Int), maximum number of input Observables being subscribed to concurrently\n\nProducing\n\nStream of type <: Subscribable{R}\n\nExamples\n\nusing Rocket\n\nsource = from([ 0, 0 ]) |> merge_map(Int, d -> from([ 1, 2, 3 ], scheduler = AsyncScheduler(0)))\nsubscribe!(source, logger())\n;\n\n# output\n\n[LogActor] Data: 1\n[LogActor] Data: 1\n[LogActor] Data: 2\n[LogActor] Data: 2\n[LogActor] Data: 3\n[LogActor] Data: 3\n[LogActor] Completed\n\nSee also: AbstractOperator, RightTypedOperator, ProxyObservable, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/transformation/merge_map/#See-also","page":"merge_map","title":"See also","text":"","category":"section"},{"location":"operators/transformation/merge_map/","page":"merge_map","title":"merge_map","text":"Operators","category":"page"},{"location":"teardown/types/void/#teardown_void","page":"Void","title":"Void Teardown","text":"","category":"section"},{"location":"teardown/types/void/","page":"Void","title":"Void","text":"VoidTeardown\nvoidTeardown","category":"page"},{"location":"teardown/types/void/#Rocket.VoidTeardown","page":"Void","title":"Rocket.VoidTeardown","text":"VoidTeardown()\n\nVoidTeardown object does nothing on unsubscription. It is usefull for synchronous observables and observables which cannot be cancelled after execution.\n\nSee also: Teardown, VoidTeardownLogic\n\n\n\n\n\n","category":"type"},{"location":"teardown/types/void/#Rocket.voidTeardown","page":"Void","title":"Rocket.voidTeardown","text":"voidTeardown\n\nAn instance of VoidTeardown singleton object.\n\nSee also: VoidTeardown\n\n\n\n\n\n","category":"constant"},{"location":"operators/transformation/substitute/#operator_substitute","page":"substitute","title":"Substitute Operator","text":"","category":"section"},{"location":"operators/transformation/substitute/","page":"substitute","title":"substitute","text":"substitute\nSubstituteHandler","category":"page"},{"location":"operators/transformation/substitute/#Rocket.substitute","page":"substitute","title":"Rocket.substitute","text":"substitute(::Type{T}, mapFn::F, handler::SubstituteHandler) where { T, F <: Function }\n\nThis operator forces observable to substitute each emmited value with the latest computed value with the corresponding handler and release! function. After release! on handler substitute operator computes new value with mapFn but does not emit it until next emission from source observable. Always calls mapFn on first value from source observable.\n\nProducing\n\nStream of type <: Subscribable{T} \n\nExamples\n\nusing Rocket\n\nsubject = Subject(Int)\n\nhandler = SubstituteHandler()\nsource = subject |> substitute(String, i -> string(\"i = \", i), handler)\n\nsubscription = subscribe!(source, logger())\n\nnext!(subject, 1)\nnext!(subject, 2)\nnext!(subject, 3)\n\nrelease!(handler)\n\nnext!(subject, 4)\nnext!(subject, 5)\nnext!(subject, 6)\n\nunsubscribe!(subscription)\n;\n\n# output\n\n[LogActor] Data: i = 1\n[LogActor] Data: i = 1\n[LogActor] Data: i = 1\n[LogActor] Data: i = 3\n[LogActor] Data: i = 3\n[LogActor] Data: i = 3\n\nSee also: SubstituteHandler\n\n\n\n\n\n","category":"function"},{"location":"operators/transformation/substitute/#Rocket.SubstituteHandler","page":"substitute","title":"Rocket.SubstituteHandler","text":"SubstituteHandler()\n\nhandler used to release! new values in substitute operator.\n\nSee also: substitute\n\n\n\n\n\n","category":"type"},{"location":"operators/transformation/substitute/#See-also","page":"substitute","title":"See also","text":"","category":"section"},{"location":"operators/transformation/substitute/","page":"substitute","title":"substitute","text":"Operators","category":"page"},{"location":"operators/mathematical/about/#Mathematical-and-Aggregate-category","page":"About mathematical operators","title":"Mathematical and Aggregate category","text":"","category":"section"},{"location":"operators/mathematical/about/","page":"About mathematical operators","title":"About mathematical operators","text":"There are operators for different purposes, and they may be categorized as: creation, transformation, filtering, joining, multicasting, error handling, utility, etc. In the following list you will find all the operators organized in mathematical and aggregate category.","category":"page"},{"location":"operators/mathematical/about/","page":"About mathematical operators","title":"About mathematical operators","text":"count\nmax\nmin\nreduce\nsum","category":"page"},{"location":"operators/mathematical/about/#See-also","page":"About mathematical operators","title":"See also","text":"","category":"section"},{"location":"operators/mathematical/about/","page":"About mathematical operators","title":"About mathematical operators","text":"Operators","category":"page"},{"location":"operators/utility/async/#operator_ref_async","page":"async","title":"Async Operator","text":"","category":"section"},{"location":"operators/utility/async/","page":"async","title":"async","text":"async","category":"page"},{"location":"operators/utility/async/#Rocket.async","page":"async","title":"Rocket.async","text":"async(size::Int = typemax(Int))\n\nCreates an async operator, which sends items from the source Observable asynchronously.\n\nArguments\n\nsize: Asynchronous messages buffer size, default is a typemax(Int)\n\nProducing\n\nStream of type <: Subscribable{L} where L refers to type of source stream\n\nSee also: AbstractOperator, InferableOperator, ProxyObservable\n\n\n\n\n\n","category":"function"},{"location":"operators/utility/async/#See-also","page":"async","title":"See also","text":"","category":"section"},{"location":"operators/utility/async/","page":"async","title":"async","text":"Operators","category":"page"},{"location":"operators/transformation/enumerate/#operator_enumerate","page":"enumerate","title":"Enumerate Operator","text":"","category":"section"},{"location":"operators/transformation/enumerate/","page":"enumerate","title":"enumerate","text":"enumerate","category":"page"},{"location":"operators/transformation/enumerate/#Base.Iterators.enumerate","page":"enumerate","title":"Base.Iterators.enumerate","text":"enumerate()\n\nCreates an enumerate operator, which converts each value emitted by the source Observable into a tuple of its order number and the value itself.\n\nThe enumerate operator is similar to scan(Tuple{Int, Int}, (d, c) -> (d, c[2] + 1), (0, 0)) (see scan).\n\nProducing\n\nStream of type <: Subscribable{Tuple{Int, L}} where L refers to type of source stream\n\nExamples\n\nusing Rocket\n\nsource = from([ 0 for _ in 1:3 ])\nsubscribe!(source |> enumerate(), logger())\n;\n\n# output\n\n[LogActor] Data: (1, 0)\n[LogActor] Data: (2, 0)\n[LogActor] Data: (3, 0)\n[LogActor] Completed\n\n\nSee also: AbstractOperator, InferableOperator, ProxyObservable, scan, map, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/transformation/enumerate/#Description","page":"enumerate","title":"Description","text":"","category":"section"},{"location":"operators/transformation/enumerate/","page":"enumerate","title":"enumerate","text":"enumerate returns an Observable that converts each value emitted by the source Observable into a tuple of its order number and the value itself.","category":"page"},{"location":"operators/transformation/enumerate/#Example","page":"enumerate","title":"Example","text":"","category":"section"},{"location":"operators/transformation/enumerate/","page":"enumerate","title":"enumerate","text":"Get a value from the source with its order number","category":"page"},{"location":"operators/transformation/enumerate/","page":"enumerate","title":"enumerate","text":"using Rocket\n\nsource = from([ 0.0, 0.2, 0.4, 0.6, 0.8, 1.0 ])\nsubscribe!(source |> enumerate(), logger())\n\n# output\n\n[LogActor] Data: (0.0, 1)\n[LogActor] Data: (0.2, 2)\n[LogActor] Data: (0.4, 3)\n[LogActor] Data: (0.6, 4)\n[LogActor] Data: (0.8, 5)\n[LogActor] Data: (1.0, 6)\n[LogActor] Completed","category":"page"},{"location":"operators/transformation/enumerate/#See-also","page":"enumerate","title":"See also","text":"","category":"section"},{"location":"operators/transformation/enumerate/","page":"enumerate","title":"enumerate","text":"Operators, scan","category":"page"},{"location":"actors/types/sync/#actor_sync","page":"Sync","title":"Sync actor","text":"","category":"section"},{"location":"actors/types/sync/","page":"Sync","title":"Sync","text":"sync","category":"page"},{"location":"actors/types/sync/#Rocket.sync","page":"Sync","title":"Rocket.sync","text":"sync(actor::A; withlock::Bool = true, timeout::Int = -1) where A\nsync(factory::F; withlock::Bool = true, timeout::Int = -1) where { F <: AbstractActorFactory }\n\nCreation operator for the SyncActor actor. Accepts optional named timeout argument which specifies maximum number of milliseconds to wait (throws SyncActorTimedOutException() on timeout). Also accepts optional withlock boolean flag indicating that every next!, error! and complete! event should be guarded with ReentrantLock.\n\nExamples\n\nusing Rocket\n\nactor = keep(Int)\nsynced = sync(actor)\n\nsubscribe!(from(0:5, scheduler = AsyncScheduler()), synced)\n\nyield()\n\nwait(synced)\nshow(synced.actor.values)\n\n# output\n[0, 1, 2, 3, 4, 5]\n\nCan also be used with an <: AbstractActorFactory as an argument. In this case sync function will return a special actor factory object, which will store all created actors in array and wrap them with a sync function. wait(sync_factory) method will wait for all of the created actors to be completed in the order of creation (but only once for each of them).\n\nusing Rocket\n\nvalues = Int[]\n\nfactory = lambda(on_next = (d) -> push!(values, d))\nsynced = sync(factory)\n\nsubscribe!(from(0:5, scheduler = AsyncScheduler()), synced)\n\nyield()\n\nwait(synced)\nshow(values)\n\n# output\n[0, 1, 2, 3, 4, 5]\n\nSee also: SyncActor, AbstractActor\n\n\n\n\n\n","category":"function"},{"location":"actors/types/sync/","page":"Sync","title":"Sync","text":"SyncActor","category":"page"},{"location":"actors/types/sync/#Rocket.SyncActor","page":"Sync","title":"Rocket.SyncActor","text":"SyncActor{T, A}(actor::A; withlock::Bool = true, timeout::Int = -1) where { T, A }\n\nSync actor provides a synchronized interface to wait for an actor to be notified with a complete event. By default creates a re-entrant lock for synchronizing next!, error! and complete! events.\n\nSee also: Actor, sync\n\n\n\n\n\n","category":"type"},{"location":"operators/utility/limit_subscribers/#operator_limit_subscribers","page":"limit_subscribers","title":"LimitSubscribers Operator","text":"","category":"section"},{"location":"operators/utility/limit_subscribers/","page":"limit_subscribers","title":"limit_subscribers","text":"LimitSubscribersGuard\nlimit_subscribers","category":"page"},{"location":"operators/utility/limit_subscribers/#Rocket.LimitSubscribersGuard","page":"limit_subscribers","title":"Rocket.LimitSubscribersGuard","text":"LimitSubscribersGuard(limit::Int = 1, exclusive = true)\n\nGuard structure used in limit_subscribers operator.\n\nArguments\n\nlimit: number of concurrent subscribers\nexclusive: boolean flag, which indicates whenever this guard can be shared with other observables in other limit_subscribers operator. If set to true, reusing this guard in a different limit_subscribers operator for other observable will result in automatic unsubscription of all present actors.\n\nNote\n\nThis structure is useful in Pluto.jl notebooks in particular, allowing for automatic subscription/unsubscription of observables.\n\nExample\n\n\n# Cell 1\nguard = LimitSubscribersGuard()\n\n# Cell 2\nsubscription = subscribe!(some_stream |> limit_subscribers(guard), logger())\n\nSee also: limit_subscribers, subscribe!\n\n\n\n\n\n","category":"type"},{"location":"operators/utility/limit_subscribers/#Rocket.limit_subscribers","page":"limit_subscribers","title":"Rocket.limit_subscribers","text":"limit_subscribers(limit::Int = 1, exclusive::Bool = true)\nlimit_subscribers(guard::LimitSubscribersGuard)\n\nCreates an operator that limits number of concurrent actors to the given observable. On new subscription, if limit is exceeded, oldest actor is automatically unsubscribed and receives a completion event.\n\nArguments\n\nlimit: number of concurrent subscribers\nexclusive: boolean flag, which indicates whenever this guard can be shared with other observables in other limit_subscribers operator. If set to true, reusing this guard in a different limit_subscribers operator for other observable will result in automatic unsubscription of all present actors.\n\nNote\n\nThis structure is useful in Pluto.jl notebooks in particular, allowing for automatic subscription/unsubscription of observables.\n\nExample\n\n\n# Cell 1\nguard = LimitSubscribersGuard()\n\n# Cell 2\nsubscription = subscribe!(some_stream |> limit_subscribers(guard), logger())\n\nSee also: LimitSubscribersGuard\n\n\n\n\n\n","category":"function"},{"location":"operators/utility/limit_subscribers/#See-also","page":"limit_subscribers","title":"See also","text":"","category":"section"},{"location":"operators/utility/limit_subscribers/","page":"limit_subscribers","title":"limit_subscribers","text":"Operators","category":"page"},{"location":"operators/utility/skip_error/#operator_skip_error","page":"skip_error","title":"SkipError Operator","text":"","category":"section"},{"location":"operators/utility/skip_error/","page":"skip_error","title":"skip_error","text":"skip_error","category":"page"},{"location":"operators/utility/skip_error/#Rocket.skip_error","page":"skip_error","title":"Rocket.skip_error","text":"skip_error()\n\nCreates a skip_error operator, which filters out error event by the source Observable by emitting only next and complete messages.\n\nProducing\n\nStream of type <: Subscribable{L} where L refers to type of source stream\n\nExamples\n\nusing Rocket\n\nsource = faulted(\"error\")\nsubscribe!(source |> skip_error(), logger())\n;\n\n# output\n\n\nSee also: AbstractOperator, InferableOperator, ProxyObservable, skip_error, skip_complete, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/utility/skip_error/#See-also","page":"skip_error","title":"See also","text":"","category":"section"},{"location":"operators/utility/skip_error/","page":"skip_error","title":"skip_error","text":"Operators","category":"page"},{"location":"api/observables/#observables_api","page":"Observables","title":"Observables API","text":"","category":"section"},{"location":"api/observables/","page":"Observables","title":"Observables","text":"Any observable-like should implement a valid subscribable logic.","category":"page"},{"location":"api/observables/#Traits","page":"Observables","title":"Traits","text":"","category":"section"},{"location":"api/observables/","page":"Observables","title":"Observables","text":"as_subscribable\nSubscribableTrait\nSimpleSubscribableTrait\nScheduledSubscribableTrait\nInvalidSubscribableTrait","category":"page"},{"location":"api/observables/#Rocket.as_subscribable","page":"Observables","title":"Rocket.as_subscribable","text":"as_subscribable(any)\n\nThis function checks subscribable trait behavior specification. Can be used explicitly to specify subscribable trait behavior for any object.\n\nSee also: SubscribableTrait\n\n\n\n\n\n","category":"function"},{"location":"api/observables/#Rocket.SubscribableTrait","page":"Observables","title":"Rocket.SubscribableTrait","text":"Abstract type for all possible subscribable traits\n\nSee also: SimpleSubscribableTrait, ScheduledSubscribableTrait, InvalidSubscribableTrait\n\n\n\n\n\n","category":"type"},{"location":"api/observables/#Rocket.SimpleSubscribableTrait","page":"Observables","title":"Rocket.SimpleSubscribableTrait","text":"Simple subscribable trait behavior. Simple subscribable can be used in subscribe! function and just executes on_subscribe! method for provided subscribable. SimpleSubscribableTrait is a subtype of SubscribableTrait.\n\nSee also: SubscribableTrait, Subscribable, subscribe!, on_subscribe!\n\n\n\n\n\n","category":"type"},{"location":"api/observables/#Rocket.ScheduledSubscribableTrait","page":"Observables","title":"Rocket.ScheduledSubscribableTrait","text":"Scheduled subscribable trait behavior. Scheduled subscribable can be used in subscribe! function and executes on_subscribe! method for provided subscribable with custom scheduling. ScheduledSubscribableTrait is a subtype of SubscribableTrait.\n\nSee also: SubscribableTrait, ScheduledSubscribable, subscribe!, on_subscribe!\n\n\n\n\n\n","category":"type"},{"location":"api/observables/#Rocket.InvalidSubscribableTrait","page":"Observables","title":"Rocket.InvalidSubscribableTrait","text":"Default subscribable trait behavior for all types. Invalid subscribable cannot be used in subscribe! function, doing so will throw an error. InvalidSubscribableTrait is a subtype of SubscribableTrait.\n\nSee also: SubscribableTrait, subscribe!\n\n\n\n\n\n","category":"type"},{"location":"api/observables/#Types","page":"Observables","title":"Types","text":"","category":"section"},{"location":"api/observables/","page":"Observables","title":"Observables","text":"AbstractSubscribable\nSubscribable\nScheduledSubscribable\nsubscribe!\non_subscribe!","category":"page"},{"location":"api/observables/#Rocket.AbstractSubscribable","page":"Observables","title":"Rocket.AbstractSubscribable","text":"Supertype type for Subscribable and ScheduledSubscribable types.\n\nSee also: Subscribable, ScheduledSubscribable\n\n\n\n\n\n","category":"type"},{"location":"api/observables/#Rocket.Subscribable","page":"Observables","title":"Rocket.Subscribable","text":"Super type for any simple subscribable object. Automatically specifies a SimpleSubscribableTrait trait behavior. Objects with specified SimpleSubscribableTrait subscribable trait must implement: on_subscribe!(subscribable, actor) method. Subscribable is a subtype of AbstractSubscribable type.\n\nExamples\n\nusing Rocket\n\nstruct MySubscribable <: Subscribable{String} end\n\nRocket.as_subscribable(MySubscribable)\n\n# output\n\nSimpleSubscribableTrait{String}()\n\nSee also: SubscribableTrait, SimpleSubscribableTrait\n\n\n\n\n\n","category":"type"},{"location":"api/observables/#Rocket.ScheduledSubscribable","page":"Observables","title":"Rocket.ScheduledSubscribable","text":"Super type for any scheduled subscribable object. Automatically specifies a ScheduledSubscribableTrait trait behavior. Objects with specified ScheduledSubscribableTrait subscribable trait must implement: on_subscribe!(subscribable, actor, scheduler) method. ScheduledSubscribable is a subtype of AbstractSubscribable type.\n\nExamples\n\nusing Rocket\n\nstruct MyScheduledSubscribable <: ScheduledSubscribable{String} end\n\nRocket.as_subscribable(MyScheduledSubscribable)\n\n# output\n\nScheduledSubscribableTrait{String}()\n\nSee also: SubscribableTrait, ScheduledSubscribableTrait\n\n\n\n\n\n","category":"type"},{"location":"api/observables/#Rocket.subscribe!","page":"Observables","title":"Rocket.subscribe!","text":"subscribe!(subscribable::T, actor::S) where { T, S }\nsubscribe!(subscribable::T, factory::F) where { T, F <: AbstractActorFactory }\nsubscribe!(subscriptions::Tuple)\nsubscribe!(subscriptions::AbstractVector)\n\nsubscribe! function is used to attach an actor to subscribable. It also checks types of subscribable and actors to be a valid Subscribable and Actor objects respectively. Passing not valid subscribable or/and actor object will throw an error. If the input argument to the subscribe! function is either a tuple or a vector, it will first check that all of the arguments are valid source and actor objects and if its true will subscribe for each of them individually. \n\nArguments\n\nsubscribable: valid subscribable object\nactor: valid actor object\n\nExamples\n\nusing Rocket\n\nsource = from((1, 2, 3))\nsubscribe!(source, logger())\n;\n\n# output\n\n[LogActor] Data: 1\n[LogActor] Data: 2\n[LogActor] Data: 3\n[LogActor] Completed\n\nusing Rocket\n\nsource = from((1, 2, 3))\nsubscribe!(source, 1)\n;\n\n# output\n\nERROR: Type Int64 is not a valid actor type.\n[...]\n\nusing Rocket\n\nsource = from((1, 2, 3))\nsubscribe!(1, logger())\n;\n\n# output\n\nERROR: Type Int64 is not a valid subscribable type.\n[...]\n\nSee also: on_subscribe!, as_subscribable\n\n\n\n\n\n","category":"function"},{"location":"api/observables/#Rocket.on_subscribe!","page":"Observables","title":"Rocket.on_subscribe!","text":"on_subscribe!(subscribable, actor)\non_subscribe!(subscribable, actor, scheduler)\n\nEvery valid subscribable object have to define its own method for on_subscribe! function which specifies subscription logic and has return a valid Teardown object.\n\nObjects with specified SimpleSubscribableTrait subscribable trait must implement: on_subscribe!(subscribable, actor) method. Objects with specified ScheduledSubscribableTrait subscribable trait must implement: on_subscribe!(subscribable, actor, scheduler) method.\n\nArguments\n\nsubscribable: Subscribable object\nactor: Actor object\nscheduler: Scheduler object (only for scheduled subscribables)\n\nExamples\n\nusing Rocket\n\nstruct MySubscribable <: Subscribable{Int} end\n\nfunction Rocket.on_subscribe!(subscribable::MySubscribable, actor)\n next!(actor, 0)\n complete!(actor)\n return voidTeardown\nend\n\nsubscribe!(MySubscribable(), logger())\n;\n\n# output\n\n[LogActor] Data: 0\n[LogActor] Completed\n\nusing Rocket\n\nstruct MyScheduledSubscribable <: ScheduledSubscribable{Int} end\n\nRocket.getscheduler(::MyScheduledSubscribable) = AsapScheduler()\n\nfunction Rocket.on_subscribe!(subscribable::MyScheduledSubscribable, actor, scheduler)\n next!(actor, 0, scheduler)\n complete!(actor, scheduler)\n return voidTeardown\nend\n\nsubscribe!(MyScheduledSubscribable(), logger())\n;\n\n# output\n\n[LogActor] Data: 0\n[LogActor] Completed\n\nSee also: Subscribable, ScheduledSubscribable, SimpleSubscribableTrait, ScheduledSubscribableTrait, Teardown, logger\n\n\n\n\n\n","category":"function"},{"location":"api/observables/#Errors","page":"Observables","title":"Errors","text":"","category":"section"},{"location":"api/observables/","page":"Observables","title":"Observables","text":"InvalidSubscribableTraitUsageError\nInconsistentActorWithSubscribableDataTypesError\nMissingOnSubscribeImplementationError\nMissingOnScheduledSubscribeImplementationError","category":"page"},{"location":"api/observables/#Rocket.InvalidSubscribableTraitUsageError","page":"Observables","title":"Rocket.InvalidSubscribableTraitUsageError","text":"This error will be thrown if subscribe! function is called with invalid subscribable object\n\nSee also: subscribe!\n\n\n\n\n\n","category":"type"},{"location":"api/observables/#Rocket.InconsistentActorWithSubscribableDataTypesError","page":"Observables","title":"Rocket.InconsistentActorWithSubscribableDataTypesError","text":"This error will be thrown if subscribe! function is called with inconsistent subscribable and actor objects\n\nSee also: subscribe!\n\n\n\n\n\n","category":"type"},{"location":"api/observables/#Rocket.MissingOnSubscribeImplementationError","page":"Observables","title":"Rocket.MissingOnSubscribeImplementationError","text":"This error will be thrown if Julia cannot find specific method of 'on_subscribe!()' function for given subscribable and actor\n\nSee also: on_subscribe!\n\n\n\n\n\n","category":"type"},{"location":"api/observables/#Rocket.MissingOnScheduledSubscribeImplementationError","page":"Observables","title":"Rocket.MissingOnScheduledSubscribeImplementationError","text":"This error will be thrown if Julia cannot find specific method of 'on_subscribe!()' function for given subscribable, actor and scheduler\n\nSee also: on_subscribe!\n\n\n\n\n\n","category":"type"},{"location":"operators/mathematical/sum/#operator_sum","page":"sum","title":"Sum Operator","text":"","category":"section"},{"location":"operators/mathematical/sum/","page":"sum","title":"sum","text":"sum","category":"page"},{"location":"operators/mathematical/sum/#Base.sum","page":"sum","title":"Base.sum","text":"sum(; from = nothing)\n\nCreates a sum operator, which applies a sum accumulator function over the source Observable, and returns the accumulated result when the source completes, given an optional initial value.\n\nThe sum operator is similar to reduce(T, T, +) (see reduce).\n\nArguments\n\nfrom: optional initial accumulation value, if nothing first value will be used instead\n\nProducing\n\nStream of type <: Subscribable{L} where L refers to type of source stream\n\nExamples\n\nusing Rocket\n\nsource = from([ i for i in 1:42 ])\nsubscribe!(source |> sum(), logger())\n;\n\n# output\n\n[LogActor] Data: 903\n[LogActor] Completed\n\n\nusing Rocket\n\nsource = from([ i for i in 1:42 ])\nsubscribe!(source |> sum(from = 97), logger())\n;\n\n# output\n\n[LogActor] Data: 1000\n[LogActor] Completed\n\n\nSee also: AbstractOperator, InferableOperator, ProxyObservable, reduce, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/mathematical/sum/#Description","page":"sum","title":"Description","text":"","category":"section"},{"location":"operators/mathematical/sum/","page":"sum","title":"sum","text":"sum operates on an Observable of objects on which + is defined. When the source Observable completes, it emits the sum of all previous items. The sum operator is similar to reduce(T, T, +) (see reduce).","category":"page"},{"location":"operators/mathematical/sum/#See-also","page":"sum","title":"See also","text":"","category":"section"},{"location":"operators/mathematical/sum/","page":"sum","title":"sum","text":"Operators, reduce","category":"page"},{"location":"actors/types/void/#actor_void","page":"Void","title":"Void actor","text":"","category":"section"},{"location":"actors/types/void/","page":"Void","title":"Void","text":"void","category":"page"},{"location":"actors/types/void/#Rocket.void","page":"Void","title":"Rocket.void","text":"void()\nvoid(::Type{T}) where T\n\nCreation operator for the VoidActor actor.\n\nExamples\n\nusing Rocket\n\nactor = void(Int)\nactor isa VoidActor{Int}\n\n# output\ntrue\n\n\nSee also: VoidActor, AbstractActor\n\n\n\n\n\n","category":"function"},{"location":"actors/types/void/","page":"Void","title":"Void","text":"VoidActor","category":"page"},{"location":"actors/types/void/#Rocket.VoidActor","page":"Void","title":"Rocket.VoidActor","text":"VoidActor{D}() where D\n\nVoid actor does nothing with input data, error and complete events, can be useful for debugging (e.g. to start side-effects with tap operator)\n\nExamples\n\nusing Rocket\n\nsource = from([ 0, 1, 2 ])\nactor = VoidActor{Int}()\n\nsubscribe!(source, actor)\n;\n\n# output\n\n\nSee also: Actor, void, tap\n\n\n\n\n\n","category":"type"},{"location":"observables/types/proxy/#observable_proxy","page":"Proxy","title":"Proxy Observable","text":"","category":"section"},{"location":"observables/types/proxy/","page":"Proxy","title":"Proxy","text":"ProxyObservable might help to create a custom operator. It wraps either source and/or actor with their proxied versions providing additional custom logic for on_subscribe! and/or for on_next!, on_error!, on_complete! methods.","category":"page"},{"location":"observables/types/proxy/","page":"Proxy","title":"Proxy","text":"proxy\nProxyObservable","category":"page"},{"location":"observables/types/proxy/#Rocket.proxy","page":"Proxy","title":"Rocket.proxy","text":"proxy(::Type{L}, source, proxy) where L\n\nCreation operator for the ProxyObservable with a given source and proxy objects.\n\nExample\n\nusing Rocket\n\nsource = from(1:5)\n\nstruct MyCustomProxy <: ActorProxy end\n\nstruct MyCustomActor{A} <: Actor{Int}\n actor :: A\nend\n\nRocket.on_next!(actor::MyCustomActor, data::Int) = next!(actor.actor, data ^ 2)\nRocket.on_error!(actor::MyCustomActor, err) = error!(actor.actor, err)\nRocket.on_complete!(actor::MyCustomActor) = complete!(actor.actor)\n\nRocket.actor_proxy!(::Type{Int}, proxy::MyCustomProxy, actor::A) where A = MyCustomActor{A}(actor)\n\nproxied = proxy(Int, source, MyCustomProxy())\n\nsubscribe!(proxied, logger())\n;\n\n# output\n\n[LogActor] Data: 1\n[LogActor] Data: 4\n[LogActor] Data: 9\n[LogActor] Data: 16\n[LogActor] Data: 25\n[LogActor] Completed\n\nSee also: ProxyObservable, ActorProxy, SourceProxy, ActorSourceProxy\n\n\n\n\n\n","category":"function"},{"location":"observables/types/proxy/#Rocket.ProxyObservable","page":"Proxy","title":"Rocket.ProxyObservable","text":"ProxyObservable{L, S, P}(proxied_source::S, proxy::P)\n\nAn interface for proxied Observables.\n\nSee also: proxy\n\n\n\n\n\n","category":"type"},{"location":"observables/types/proxy/","page":"Proxy","title":"Proxy","text":"ActorProxy\nSourceProxy\nActorSourceProxy","category":"page"},{"location":"observables/types/proxy/#Rocket.ActorProxy","page":"Proxy","title":"Rocket.ActorProxy","text":"ActorProxy\n\nCan be used as a super type for common proxy object. Automatically specifies ValidActorProxy trait behavior. Each ActorProxy must implement its own method for actor_proxy!(::Type, proxy, actor) function which have to return a valid actor object.\n\nSee also: proxy, actor_proxy!\n\n\n\n\n\n","category":"type"},{"location":"observables/types/proxy/#Rocket.SourceProxy","page":"Proxy","title":"Rocket.SourceProxy","text":"SourceProxy\n\nCan be used as a super type for common proxy object. Automatically specifies ValidSourceProxy trait behavior. Each SourceProxy must implement its own method for source_proxy!(::Type, proxy, source) function which have to return a valid subscribable object.\n\nSee also: proxy, source_proxy!\n\n\n\n\n\n","category":"type"},{"location":"observables/types/proxy/#Rocket.ActorSourceProxy","page":"Proxy","title":"Rocket.ActorSourceProxy","text":"ActorSourceProxy\n\nCan be used as a super type for common proxy object. Automatically specifies ValidActorSourceProxy trait behavior. Each ActorSourceProxy must implement its own method for source_proxy!(::Type, proxy, source) function which have to return a valid subscribable object and also for actor_proxy!(::Type, proxy, actor) function which have to return a valid actor object..\n\nSee also: proxy, actor_proxy!, source_proxy!\n\n\n\n\n\n","category":"type"},{"location":"observables/types/proxy/","page":"Proxy","title":"Proxy","text":"actor_proxy!\nsource_proxy!","category":"page"},{"location":"observables/types/proxy/#Rocket.actor_proxy!","page":"Proxy","title":"Rocket.actor_proxy!","text":"actor_proxy!(::Type, proxy, actor)\n\nThis is function is used to wrap an actor with its proxied version given a particular proxy object. Must return another actor. Each valid ActorProxy and ActorSourceProxy must implement its own method for actor_proxy! function. The first argument is the same as the type of data of the connected proxy observable.\n\nSee also: proxy, ActorProxy, ActorSourceProxy\n\n\n\n\n\n","category":"function"},{"location":"observables/types/proxy/#Rocket.source_proxy!","page":"Proxy","title":"Rocket.source_proxy!","text":"source_proxy!(::Type, proxy, source)\n\nThis is function is used to wrap a source with its proxied version given a particular proxy object. Must return another Observable. Each valid SourceProxy and ActorSourceProxy must implement its own method for source_proxy! function. The first argument is the same as the type of data of the connected proxy observable.\n\nSee also: proxy, SourceProxy, ActorSourceProxy\n\n\n\n\n\n","category":"function"},{"location":"operators/transformation/to_array/#operator_to_array","page":"to_array","title":"Uppercase Operator","text":"","category":"section"},{"location":"operators/transformation/to_array/","page":"to_array","title":"to_array","text":"to_array","category":"page"},{"location":"operators/transformation/to_array/#Rocket.to_array","page":"to_array","title":"Rocket.to_array","text":"to_array()\n\nCreates a to_array operator, which reduces all values into a single array and returns this result when the source completes.\n\nProducing\n\nStream of type <: Subscribable{Vector{L}} where L refers to type of source stream\n\nExamples\n\nusing Rocket\n\nsource = from([ 1, 2, 3 ])\nsubscribe!(source |> to_array(), logger())\n;\n\n# output\n\n[LogActor] Data: [1, 2, 3]\n[LogActor] Completed\n\n\nSee also: AbstractOperator, InferableOperator, ProxyObservable, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/transformation/to_array/#See-also","page":"to_array","title":"See also","text":"","category":"section"},{"location":"operators/transformation/to_array/","page":"to_array","title":"to_array","text":"Operators, map, lowercase","category":"page"},{"location":"operators/transformation/about/#Transformation-category","page":"About transformation operators","title":"Transformation category","text":"","category":"section"},{"location":"operators/transformation/about/","page":"About transformation operators","title":"About transformation operators","text":"There are operators for different purposes, and they may be categorized as: creation, transformation, filtering, joining, multicasting, error handling, utility, etc. In the following list you will find all the operators organized in transformation category.","category":"page"},{"location":"operators/transformation/about/","page":"About transformation operators","title":"About transformation operators","text":"map\nmap_to\nscan\naccumulated\nenumerate\nuppercase\nlowercase\nto_array\nswitch_map\nswitch_map_to\nmerge_map\nconcat_map\nconcat_map_to\nexhaust_map\nstart_with\npairwise\nsubstitute\noverride","category":"page"},{"location":"operators/transformation/about/#See-also","page":"About transformation operators","title":"See also","text":"","category":"section"},{"location":"operators/transformation/about/","page":"About transformation operators","title":"About transformation operators","text":"Operators","category":"page"}] +} diff --git a/v1.7.4/siteinfo.js b/v1.7.4/siteinfo.js new file mode 100644 index 000000000..69b287475 --- /dev/null +++ b/v1.7.4/siteinfo.js @@ -0,0 +1 @@ +var DOCUMENTER_CURRENT_VERSION = "v1.7.4"; diff --git a/v1.7.4/subjects/about/index.html b/v1.7.4/subjects/about/index.html new file mode 100644 index 000000000..13010177b --- /dev/null +++ b/v1.7.4/subjects/about/index.html @@ -0,0 +1,86 @@ + +Subject · Rocket.jl

      About subjects

      A Rocket.jl Subject is a special type of Observable that allows values to be multicasted to many Actors. While plain Observables are unicast (each subscribed Actor owns an independent execution of the Observable), Subjects are multicast.

      Note

      A Subject is like an Observable, but can multicast to many Actors. Subjects are like event emitters: they maintain a registry of many listeners.

      Every Subject is an Observable. Given a Subject, you can subscribe to it, providing an Actor, which will start receiving values normally. From the perspective of the Actor, it cannot tell whether the Observable execution is coming from a plain unicast Observable or a Subject.

      Internally to the Subject, subscribe! does not invoke a new execution that delivers values. Instead, it simply registers the given Actor in a list of Actors.

      Every Subject is an Actor itself. It is an object with the methods next!, error!, and complete!. Call next!(subject, theValue) to feed a new value to the Subject, and it will be multicasted to the Actors that listen to the Subject.

      In the example below, we have two Observers attached to a Subject, and we feed some values to the Subject:

      using Rocket
      +
      +source = Subject(Int)
      +
      +subscription1 = subscribe!(source, lambda(
      +    on_next = (d) -> println("Actor 1: $d")
      +))
      +
      +subscription2 = subscribe!(source, lambda(
      +    on_next = (d) -> println("Actor 2: $d")
      +))
      +
      +next!(source, 0)
      +
      +# Logs
      +# Actor 1: 0
      +# Actor 2: 0
      +
      +unsubscribe!(subscription1)
      +unsubscribe!(subscription2)
      +

      Since a Subject is an actor, this also means you may provide a Subject as the argument to the subscribe of any Observable:

      using Rocket
      +
      +source = Subject(Int)
      +
      +subscription1 = subscribe!(source, lambda(
      +    on_next = (d) -> println("Actor 1: $d")
      +))
      +
      +subscription2 = subscribe!(source, lambda(
      +    on_next = (d) -> println("Actor 2: $d")
      +))
      +
      +other_source = from([ 1, 2, 3 ])
      +subscribe!(other_source, source);
      +
      +# Logs
      +# Actor 1: 1
      +# Actor 2: 1
      +# Actor 1: 2
      +# Actor 2: 2
      +# Actor 1: 3
      +# Actor 2: 3

      Here, we essentially convert a unicast Observable execution to multicast, through the Subject. This demonstrates how Subjects offer a unique way to share Observable execution with multiple Observers.

      Schedulers

      A Subject (and some other observables) uses scheduler objects to schedule message delivery to their listeners.

      Synchronous scheduler

      One of the variants of schedulers is the AsapScheduler, which delivers every message synchronously. AsapScheduler is a default scheduler for all Subject objects.

      Rocket.AsapSchedulerType
      AsapScheduler

      AsapScheduler executes scheduled actions as soon as possible and does not introduce any additional logic. AsapScheduler is a default scheduler for almost all observables.

      source
      using Rocket
      +
      +subject = Subject(Int, scheduler = AsapScheduler())
      +
      +subscription1 = subscribe!(subject, logger("Actor 1"))
      +
      +println("Before next")
      +next!(subject, 1)
      +next!(subject, 2)
      +println("After next")
      +
      +subscription2 = subscribe!(subject, logger("Actor 2"))
      +
      +next!(subject, 3)
      +
      +# Logs
      +# Before next
      +# [Actor 1] Data: 1
      +# [Actor 1] Data: 2
      +# After next
      +# [Actor 1] Data: 3
      +# [Actor 2] Data: 3

      Asynchronous Scheduler

      An AsyncScheduler is similar to a AsapScheduler. Both allows for Subject to scheduler their messages for multiple listeners, but a AsyncScheduler delivers all messages asynchronously (but still ordered) using a Julia's built-in Task object.

      Rocket.AsyncSchedulerType
      AsyncScheduler

      AsyncScheduler executes scheduled actions asynchronously and uses Channel object to order different actions on a single asynchronous task

      source
      using Rocket
      +
      +subject = Subject(Int, scheduler = AsyncScheduler())
      +
      +subscription1 = subscribe!(subject, logger("Actor 1"))
      +
      +println("Before next")
      +next!(subject, 1)
      +next!(subject, 2)
      +println("After next")
      +
      +subscription2 = subscribe!(subject, logger("Actor 2"))
      +
      +next!(subject, 3)
      +
      +# Logs
      +# Before next
      +# After next
      +# [Actor 1] Data: 1
      +# [Actor 1] Data: 2
      +# [Actor 1] Data: 3
      +# [Actor 2] Data: 3
      +
      diff --git a/v1.7.4/subjects/types/behavior/index.html b/v1.7.4/subjects/types/behavior/index.html new file mode 100644 index 000000000..5f3470d6a --- /dev/null +++ b/v1.7.4/subjects/types/behavior/index.html @@ -0,0 +1,28 @@ + +Behavior · Rocket.jl

      BehaviorSubject

      Rocket.BehaviorSubjectFunction
      BehaviorSubject(value::D) where D
      +BehaviorSubject(::Type{D}, value) where D
      +BehaviorSubject(::Type{D}, value, factory::F) where { D, F <: AbstractSubjectFactory }
      +BehaviorSubject(::Type{D}, value, subject::S) where { D, S }

      A variant of Subject that requires an initial value and emits its current value whenever it is subscribed to.

      See also: BehaviorSubjectFactory, Subject, SubjectFactory

      source

      Description

      One of the variants of Subjects is the BehaviorSubject, which has a notion of "the current value". It stores the latest value emitted to its consumers, and whenever a new Observer subscribes, it will immediately receive the "current value" from the BehaviorSubject.

      Note

      BehaviorSubjects are useful for representing "values over time". For instance, an event stream of birthdays is a Subject, but the stream of a person's age would be a BehaviorSubject.

      Examples

      In the following example, the BehaviorSubject is initialized with the value 0 which the first Observer receives when it subscribes. The second Observer receives the value 2 even though it subscribed after the value 2 was sent.

      using Rocket
      +
      +subject = BehaviorSubject(Int, 0)
      +
      +subscription1 = subscribe!(subject, logger("1"))
      +
      +next!(subject, 1)
      +next!(subject, 2)
      +
      +subscription2 = subscribe!(subject, logger("2"))
      +
      +next!(subject, 3)
      +
      +unsubscribe!(subscription1)
      +unsubscribe!(subscription2)
      +
      +// Logs
      +// [1] Data: 0
      +// [1] Data: 1
      +// [1] Data: 2
      +// [2] Data: 2
      +// [1] Data: 3
      +// [2] Data: 3
      diff --git a/v1.7.4/subjects/types/pending/index.html b/v1.7.4/subjects/types/pending/index.html new file mode 100644 index 000000000..fe5e39e86 --- /dev/null +++ b/v1.7.4/subjects/types/pending/index.html @@ -0,0 +1,27 @@ + +Pending · Rocket.jl

      PendingSubject

      Rocket.PendingSubjectFunction
      PendingSubject(::Type{D}) where D
      +PendingSubject(::Type{D}, factory::F) where { D, F <: AbstractFactory }
      +PendingSubject(::Type{D}, subject::S) where { D, S }

      A variant of Subject that emits its last value on completion. Reemits last value on further subscriptions and then completes.

      See also: PendingSubjectFactory, Subject, SubjectFactory

      source

      Description

      A variant of Subject that only emits a value when it completes. It will emit its latest value to all its observers on completion. It will reemit its latest value to all new observers on further subscription and then complete. It is not possible to overwrite last value after completion.

      Examples

      using Rocket
      +
      +subject = PendingSubject(Int)
      +
      +subscription1 = subscribe!(subject, logger("1"))
      +
      +next!(subject, 1) # Nothing is logged
      +next!(subject, 2) # Nothing is logged
      +
      +subscription2 = subscribe!(subject, logger("2"))
      +
      +next!(subject, 3) # Nothing is logged
      +
      +complete!(subject)
      +
      +subscription3 = subscribe!(subject, logger("3"))
      +
      +[1] Data: 3
      +[2] Data: 3
      +[1] Completed
      +[2] Completed
      +[3] Data: 3
      +[3] Completed
      diff --git a/v1.7.4/subjects/types/recent/index.html b/v1.7.4/subjects/types/recent/index.html new file mode 100644 index 000000000..fe6037627 --- /dev/null +++ b/v1.7.4/subjects/types/recent/index.html @@ -0,0 +1,26 @@ + +Recent · Rocket.jl

      RecentSubject

      Rocket.RecentSubjectFunction
      RecentSubject(::Type{D}) where D
      +RecentSubject(::Type{D}, factory::F) where { D, F <: AbstractSubjectFactory }
      +RecentSubject(::Type{D}, subject::S) where { D, S }

      A variant of Subject that emits its recent value whenever it is subscribed to.

      See also: RecentSubjectFactory, Subject, SubjectFactory

      source

      Description

      One of the variants of Subjects is the RecentSubject, which has a notion of "the recent value". It stores the latest value emitted to its consumers, and whenever a new Observer subscribes, it will immediately receive the "recent value" from the RecentSubject.

      Note

      RecentSubjects is a more efficient version of ReplaySubjects with replay size equal to one.

      Examples

      In the following example, after RecentSubject is initialized the first Observer receives nothing when it subscribes. The second Observer receives the value 2 even though it subscribed after the value 2 was sent.

      using Rocket
      +
      +subject = RecentSubject(Int)
      +
      +subscription1 = subscribe!(subject, logger("1"))
      +
      +next!(subject, 1)
      +next!(subject, 2)
      +
      +subscription2 = subscribe!(subject, logger("2"))
      +
      +next!(subject, 3)
      +
      +unsubscribe!(subscription1)
      +unsubscribe!(subscription2)
      +
      +// Logs
      +// [1] Data: 1
      +// [1] Data: 2
      +// [2] Data: 2
      +// [1] Data: 3
      +// [2] Data: 3
      diff --git a/v1.7.4/subjects/types/replay/index.html b/v1.7.4/subjects/types/replay/index.html new file mode 100644 index 000000000..efc594b9e --- /dev/null +++ b/v1.7.4/subjects/types/replay/index.html @@ -0,0 +1,32 @@ + +Replay · Rocket.jl

      ReplaySubject

      Rocket.ReplaySubjectFunction
      ReplaySubject(::Type{D}, size::Int) where D
      +ReplaySubject(::Type{D}, size::Int, factory::F) where { D, F <: AbstractSubjectFactory }
      +ReplaySubject(::Type{D}, size::Int, subject::S) where { D, S }

      A variant of Subject that "replays" or emits old values to new subscribers. It buffers a set number of values and will emit those values immediately to any new subscribers in addition to emitting new values to existing subscribers.

      See also: ReplaySubjectFactory, Subject, SubjectFactory

      source

      Description

      A ReplaySubject is similar to a BehaviorSubject in that it can send old values to new subscribers, but it can also record a part of the Observable execution.

      Note

      A ReplaySubject records multiple values from the Observable execution and replays them to new subscribers.

      Examples

      When creating a ReplaySubject, you can specify how many values to replay:

      using Rocket
      +
      +subject = ReplaySubject(Int, 3) # buffer 3 values for new subscribers
      +
      +subscription1 = subscribe!(subject, logger("1"))
      +
      +next!(subject, 1)
      +next!(subject, 2)
      +next!(subject, 3)
      +next!(subject, 4)
      +
      +subscription2 = subscribe!(subject, logger("2"))
      +
      +next!(subject, 5)
      +
      +unsubscribe!(subscription1)
      +unsubscribe!(subscription2)
      +
      +// Logs
      +// [1] Data: 1
      +// [1] Data: 2
      +// [1] Data: 3
      +// [1] Data: 4
      +// [2] Data: 2
      +// [2] Data: 3
      +// [2] Data: 4
      +// [1] Data: 5
      +// [2] Data: 5
      diff --git a/v1.7.4/subjects/types/subject/index.html b/v1.7.4/subjects/types/subject/index.html new file mode 100644 index 000000000..18050bd55 --- /dev/null +++ b/v1.7.4/subjects/types/subject/index.html @@ -0,0 +1,22 @@ + +Subject · Rocket.jl

      Subject

      Rocket.SubjectType
      Subject(::Type{D}; scheduler::H = AsapScheduler())

      A Subject is a special type of Observable that allows values to be multicasted to many Observers. Subjects are like EventEmitters. Every Subject is an Observable and an Actor. You can subscribe to a Subject, and you can call next! to feed values as well as error! and complete!.

      Note: By convention, every actor subscribed to a Subject observable is not allowed to throw exceptions during next!, error! and complete! calls. Doing so would lead to undefined behaviour. Use safe() operator to bypass this rule.

      See also: SubjectFactory, ReplaySubject, BehaviorSubject, safe

      source

      Description

      Every Subject is an Observable. Given a Subject, you can subscribe to it, providing an Actor, which will start receiving values normally. From the perspective of the Observer, it cannot tell whether the Observable execution is coming from a plain unicast Observable or a Subject.

      Internally to the Subject, subscribe does not invoke a new execution that delivers values. It simply registers the given Observer in a list of Observers.

      Every Subject is an Actor. It is an object with the methods next!, error!, and complete!. To feed a new value to the Subject, just call next!(subject, theValue), and it will be multicasted to the Actors registered to listen to the Subject.

      Note

      By convention, every actor subscribed to a Subject observable is not allowed to throw exceptions during next!, error! and complete! calls. Doing so would lead to undefined behaviour. Use safe() operator to bypass this rule.

      Examples

      In the following example, the BehaviorSubject is initialized with the value 0 which the first Observer receives when it subscribes. The second Observer receives the value 2 even though it subscribed after the value 2 was sent.

      using Rocket
      +
      +subject = Subject(Int)
      +
      +subscription1 = subscribe!(subject, logger("1"))
      +
      +next!(subject, 1)
      +next!(subject, 2)
      +
      +subscription2 = subscribe!(subject, logger("2"))
      +
      +next!(subject, 3)
      +
      +unsubscribe!(subscription1)
      +unsubscribe!(subscription2)
      +
      +// Logs
      +// [1] Data: 1
      +// [1] Data: 2
      +// [1] Data: 3
      +// [2] Data: 3
      diff --git a/v1.7.4/teardown/about/index.html b/v1.7.4/teardown/about/index.html new file mode 100644 index 000000000..dd17cc846 --- /dev/null +++ b/v1.7.4/teardown/about/index.html @@ -0,0 +1,24 @@ + +Subscription · Rocket.jl

      Subscription

      A Subscription represents a disposable resource, usually the execution of an Observable. A Subscription has one important method: unsubscribe!(teardown), which takes some teardown logic object as one argument and disposes the resource held by the subscription.

      using Rocket
      +
      +source = Subject(Int)
      +
      +next!(source, 0) # Logs nothing as there is no subscribers
      +
      +subscription = subscribe!(source, logger())
      +
      +next!(source, 1) # Logs [LogActor] Data: 1 into standard output
      +
      +unsubscribe!(subscription)
      +
      +next!(source, 2) # Logs nothing as a single one actor has unsubscribed
      Note

      A Subscription essentially just has its own specific method for unsubscribe!() function which releases resources or cancel Observable executions. Any Observable has to return a valid Teardown object.

      The unsubscribe! function also supports multiple unsubscriptions at once. If the input argument to the unsubscribe! function is either a tuple or a vector, it will first check that all of the arguments are valid subscription objects and if this is true it will unsubscribe from each of them individually.

      
      +source = Subject(Int)
      +
      +subscription1 = subscribe!(source, logger())
      +subscription2 = subscribe!(source, logger())
      +
      +unsubscribe!((subscription1, subscription2))
      +
      +# or similarly
      +# unsubscribe!([ subscription1, subscription2 ])
      +

      For more information about subscription and teardown logic see the API Section

      diff --git a/v1.7.4/teardown/types/void/index.html b/v1.7.4/teardown/types/void/index.html new file mode 100644 index 000000000..fdc20b2ea --- /dev/null +++ b/v1.7.4/teardown/types/void/index.html @@ -0,0 +1,2 @@ + +Void · Rocket.jl
      diff --git a/v1.7.4/todo/index.html b/v1.7.4/todo/index.html new file mode 100644 index 000000000..4038bd8ab --- /dev/null +++ b/v1.7.4/todo/index.html @@ -0,0 +1,2 @@ + +TODO · Rocket.jl

      TODO

      This package in under development and some features of the reactive framework not yet implemented.

      diff --git a/v1.7.4/utils/index.html b/v1.7.4/utils/index.html new file mode 100644 index 000000000..f6627f231 --- /dev/null +++ b/v1.7.4/utils/index.html @@ -0,0 +1,20 @@ + +Utils · Rocket.jl

      Utils

      Rocket.setTimeoutFunction
      setTimeout(f::Function, timeout::Int)

      Creates a Task which will asynchornously invoke fucntion f after specified timeout time in milliseconds.

      Arguments

      • f::Function, function to be invoked asynchronously
      • timeout::Int, timeout in milliseconds

      Examples

      using Rocket
      +using Dates
      +
      +println("Before: ", Dates.format(now(), "MM:SS"))
      +setTimeout(1000) do
      +    println("Inside: ", Dates.format(now(), "MM:SS"))
      +end
      +println("Right after: ", Dates.format(now(), "MM:SS"))
      +;
      +
      +# Logs
      +# Before: 20:59
      +# Right after: 20:59
      +# Inside: 21:00
      source
      Rocket.combined_typeFunction
      combined_type(sources)

      Returns a Tuple el-type of observable el-types in sources argument in the same order

      source
      Rocket.union_typeFunction
      union_type(sources)

      Returns a Union el-type of observable el-types in sources argument

      source

      Helpers

      Rocket.@MStorageMacro
      @MStorage(n::Int)

      Helper function to generate tuple-like structure MStorageN, but with mutable fields and empty constructor. It is possible then to take a snapshot(::MStorage) which returns a tuple with the same types and values from storage. Some operators and observables use pregenerated MStorage to instatiate uninitialized mutable storage in case when stream is allowed to not emit any values before completion.

      Generated structure layout

      struct MStorageN{V1, V2, ..., VN}
      +    v1 :: V1
      +    v2 :: V2
      +    ...
      +    vn :: VN
      +end

      See also: setstorage!

      source
      Rocket.setstorage!Function
      setstorage!(s, v, ::Val{I}) where I

      This function can be used to set a new value v for storage s with a given value v and index I. Using parametrized Val{I} for indexing ensures for index to be resolved at compile-time and if-else branch optimization.

      See also: @MStorage

      source
      diff --git a/v1.8 b/v1.8 new file mode 120000 index 000000000..4e2cea3bb --- /dev/null +++ b/v1.8 @@ -0,0 +1 @@ +v1.8.0 \ No newline at end of file diff --git a/v1.8.0/.documenter-siteinfo.json b/v1.8.0/.documenter-siteinfo.json new file mode 100644 index 000000000..cc67822b6 --- /dev/null +++ b/v1.8.0/.documenter-siteinfo.json @@ -0,0 +1 @@ +{"documenter":{"julia_version":"1.10.2","generation_timestamp":"2024-04-10T15:08:53","documenter_version":"1.3.0"}} \ No newline at end of file diff --git a/v1.8.0/actors/about/index.html b/v1.8.0/actors/about/index.html new file mode 100644 index 000000000..91669b455 --- /dev/null +++ b/v1.8.0/actors/about/index.html @@ -0,0 +1,72 @@ + +Actor · Rocket.jl

      Actors

      An Actor is the most primitive unit of computation: it receives a message and performs a computation.

      An actor is analogous to an object in an object-oriented languages. An object receives a message (a method call) and does something depending on which message it receives (the method we are calling). The main difference is that actors are completely isolated from each other, and they will never share memory. It’s also worth mentioning that an actor can maintain a private state that should never be changed directly by another actor.

      For a quick introduction to Actor models, see this article.

      The API of Rocket.jl's Actors is similar to RxJS subscribers.

      First example

      The following example implements an Actor that retains each received value from an Observable.

      using Rocket
      +
      +struct CustomKeepActor <: Actor{Int}
      +    values::Vector{Int}
      +
      +    CustomKeepActor() = new(Vector{Int}())
      +end
      +
      +Rocket.on_next!(actor::CustomKeepActor, data::Int) = push!(actor.values, data)
      +Rocket.on_error!(actor::CustomKeepActor, err)      = error(err)
      +Rocket.on_complete!(actor::CustomKeepActor)        = println("Completed!")
      +
      +source     = from([ 1, 2, 3 ])
      +keep_actor = CustomKeepActor()
      +subscribe!(source, keep_actor)
      +
      +# Logs
      +# Completed!
      +
      +println(keep_actor.values)
      +
      +# Logs
      +# [1, 2, 3]

      An actor may be not interested in the values itself, but merely the completion of an event. In this case, Rocket.jl provides a CompletionActor abstract type. See also NextActor and ErrorActor.

      using Rocket
      +
      +struct CompletionNotificationActor <: CompletionActor{Int} end
      +
      +Rocket.on_complete!(::CompletionNotificationActor) = println("Completed!")
      +
      +source = from([ 1, 2, 3 ])
      +subscribe!(source, CompletionNotificationActor());
      +
      +# Logs
      +# Completed

      It is also possible to use Julia's multiple dispatch feature and dispatch on type of the event

      using Rocket
      +
      +struct MyCustomActor <: NextActor{Any} end
      +
      +Rocket.on_next!(::MyCustomActor, data::Int)     = println("Int: $data")
      +Rocket.on_next!(::MyCustomActor, data::Float64) = println("Float64: $data")
      +Rocket.on_next!(::MyCustomActor, data)          = println("Something else: $data")
      +
      +source = from([ 1, 1.0, "string" ])
      +subscribe!(source, MyCustomActor());
      +
      +# Logs
      +# Int: 1
      +# Float64: 1.0
      +# Something else: string
      +

      Lambda actor

      For debugging purposes it may be convenient to work with a LambdaActor. This provides an interface that defines callbacks for "next", "error" and "complete" events. But this generic actor does not allow to dispatch on the type of the event.

      using Rocket
      +
      +source = from([1, 2, 3])
      +
      +subscribe!(source, lambda(
      +    on_next     = (d) -> println(d),
      +    on_error    = (e) -> error(e),
      +    on_complete = ()  -> println("Completed")
      +))
      +
      +# Logs
      +# 1
      +# 2
      +# 3
      +# Completed

      Function actor

      Sometimes it is convenient to pass only on_next callback. Rocket.jl provides a FunctionActor which automatically converts any function object passed in the subscribe! function to a proper actor which listens only for data events, throws an exception on error event and ignores completion message.

      using Rocket
      +
      +source = from([1, 2, 3])
      +
      +subscribe!(source, (d) -> println(d))
      +
      +# Logs
      +# 1
      +# 2
      +# 3
      diff --git a/v1.8.0/actors/types/buffer/index.html b/v1.8.0/actors/types/buffer/index.html new file mode 100644 index 000000000..6452f2be4 --- /dev/null +++ b/v1.8.0/actors/types/buffer/index.html @@ -0,0 +1,17 @@ + +Buffer · Rocket.jl

      Buffer actor

      Rocket.bufferFunction
      buffer(::Type{T}, size::Int) where T

      Arguments

      • ::Type{T}: Type of data in buffer
      • size::Int: size of buffer

      Creation operator for the BufferActor actor.

      Examples

      using Rocket
      +
      +actor = buffer(Int, 3)
      +actor isa BufferActor{Int}
      +
      +# output
      +true

      See also: BufferActor, AbstractActor

      source
      Rocket.BufferActorType
      BufferActor{D}() where D

      Buffer actor provides a storage actor. It copies last incoming successful next events in a values array, throws an ErrorException on error! event and does nothing on completion event. Note: Actor does not check the size of incoming data.

      Examples

      using Rocket
      +
      +source = of([ 1, 2, 3 ])
      +actor  = buffer(Int, 3)
      +
      +subscribe!(source, actor)
      +show(getvalues(actor))
      +
      +# output
      +[1, 2, 3]

      See also: Actor, buffer

      source
      diff --git a/v1.8.0/actors/types/circularkeep/index.html b/v1.8.0/actors/types/circularkeep/index.html new file mode 100644 index 000000000..4dba60c5a --- /dev/null +++ b/v1.8.0/actors/types/circularkeep/index.html @@ -0,0 +1,17 @@ + +CircularKeep · Rocket.jl

      CircularKeep actor

      Rocket.circularkeepFunction
      circularkeep(::Type{T}, capacity::Int) where T

      Arguments

      • ::Type{T}: Type of keep data
      • capacity::Int: circular buffer capacity

      Creation operator for the CircularKeepActor actor.

      Examples

      using Rocket
      +
      +actor = circularkeep(Int, 3)
      +actor isa CircularKeepActor{Int}
      +
      +# output
      +true

      See also: CircularKeepActor, AbstractActor

      source
      Rocket.CircularKeepActorType
      CirucalKeepActor{D}() where D

      Circual keep actor is similar to keep actor, but uses CircularBuffer as a storage. It saves all incoming successful next events in a values circular buffer, throws an ErrorException on error! event and does nothing on completion event.

      Examples

      using Rocket
      +
      +source = from(1:5)
      +actor  = circularkeep(Int, 3)
      +
      +subscribe!(source, actor)
      +show(getvalues(actor))
      +
      +# output
      +[3, 4, 5]

      See also: Actor, keep, circularkeep

      source
      diff --git a/v1.8.0/actors/types/function/index.html b/v1.8.0/actors/types/function/index.html new file mode 100644 index 000000000..a9d8c60f0 --- /dev/null +++ b/v1.8.0/actors/types/function/index.html @@ -0,0 +1,13 @@ + +Function · Rocket.jl

      Function actor

      Rocket.FunctionActorType
      FunctionActor{D} <: Actor{D}

      FunctionActor provides a simple interface to use a single function as a next! callback, error! callback throws an ErrorException and complete! callback does nothing. Should not be used explicitly because it will be created automatically when passing a Function object as an actor in subscribe! function.

      Examples

      using Rocket
      +
      +source = from(1:5)
      +subscribe!(source, (t) -> println(t))
      +;
      +
      +# output
      +1
      +2
      +3
      +4
      +5

      See also: Actor, subscribe!

      source
      diff --git a/v1.8.0/actors/types/keep/index.html b/v1.8.0/actors/types/keep/index.html new file mode 100644 index 000000000..5e6c8a435 --- /dev/null +++ b/v1.8.0/actors/types/keep/index.html @@ -0,0 +1,17 @@ + +Keep · Rocket.jl

      Keep actor

      Rocket.keepFunction
      keep(::Type{T}) where T

      Arguments

      • ::Type{T}: Type of keep data

      Creation operator for the KeepActor actor.

      Examples

      using Rocket
      +
      +actor = keep(Int)
      +actor isa KeepActor{Int}
      +
      +# output
      +true

      See also: KeepActor, AbstractActor

      source
      Rocket.KeepActorType
      KeepActor{D}() where D

      Keep actor provides a storage actor. It saves all incoming successful next events in a values array, throws an ErrorException on error! event and does nothing on completion event.

      Examples

      using Rocket
      +
      +source = from(1:5)
      +actor  = keep(Int)
      +
      +subscribe!(source, actor)
      +show(getvalues(actor))
      +
      +# output
      +[1, 2, 3, 4, 5]

      See also: Actor, keep

      source
      diff --git a/v1.8.0/actors/types/lambda/index.html b/v1.8.0/actors/types/lambda/index.html new file mode 100644 index 000000000..c90f7f640 --- /dev/null +++ b/v1.8.0/actors/types/lambda/index.html @@ -0,0 +1,9 @@ + +Lambda · Rocket.jl

      Lambda actor

      Rocket.lambdaFunction
      lambda(; on_next = nothing, on_error = nothing, on_complete = nothing)
      +lambda(::Type{T}; on_next = nothing, on_error = nothing, on_complete = nothing) where T

      Creation operator for the 'LambdaActor' actor.

      Examples

      using Rocket
      +
      +actor = lambda(Int; on_next = (d) -> println(d))
      +actor isa LambdaActor{Int}
      +
      +# output
      +true

      See also: LambdaActor, AbstractActor

      source
      Rocket.LambdaActorType
      LambdaActor{D, N, E, C}(on_next::N, on_error::E, on_complete::C) where D

      Lambda actor wraps on_next, on_error, on_complete callbacks for data, error and complete events. Should not be used explicitly, use lambda creation operator instead.

      Constructor arguments

      • on_next: Callback for data event. Optional. Default is nothing.
      • on_error: Callback for error event. Optional. Default is nothing.
      • on_complete: Callback for complete event. Optional. Default is nothing.

      See also: Actor, lambda

      source
      diff --git a/v1.8.0/actors/types/logger/index.html b/v1.8.0/actors/types/logger/index.html new file mode 100644 index 000000000..1459d178d --- /dev/null +++ b/v1.8.0/actors/types/logger/index.html @@ -0,0 +1,39 @@ + +Logger · Rocket.jl

      Logger actor

      Rocket.loggerFunction
      logger([ io::IO ], name::String = "LogActor")
      +logger(::Type{T}, [ io::IO ], name::String = "LogActor") where T

      Creation operator for the LoggerActor actor.

      Examples

      using Rocket
      +
      +source = from([ 0, 1, 2 ])
      +subscribe!(source, logger())
      +;
      +
      +# output
      +
      +[LogActor] Data: 0
      +[LogActor] Data: 1
      +[LogActor] Data: 2
      +[LogActor] Completed
      using Rocket
      +
      +source = from([ 0, 1, 2 ])
      +subscribe!(source, logger("CustomName"))
      +;
      +
      +# output
      +
      +[CustomName] Data: 0
      +[CustomName] Data: 1
      +[CustomName] Data: 2
      +[CustomName] Completed
      using Rocket
      +
      +buffer = IOBuffer()
      +
      +source = from([ 0, 1, 2 ])
      +subscribe!(source, logger(buffer, "CustomBuffer"))
      +;
      +
      +print(String(take!(buffer)))
      +# output
      +
      +[CustomBuffer] Data: 0
      +[CustomBuffer] Data: 1
      +[CustomBuffer] Data: 2
      +[CustomBuffer] Completed

      See also: LoggerActor, AbstractActor

      source
      Rocket.LoggerActorType
      LoggerActor{D}(name::String = "LogActor", io::O) where { D, O }

      The LoggerActor logs all next!/error!/complete! events that are sent from an Observable.

      Constructor arguments

      • name: name of the logger. Optional. Default is LogActor.
      • io: io stream to log in, maybe nothing to write to stdout

      See also: Actor, logger

      source
      diff --git a/v1.8.0/actors/types/server/index.html b/v1.8.0/actors/types/server/index.html new file mode 100644 index 000000000..bdcfb0121 --- /dev/null +++ b/v1.8.0/actors/types/server/index.html @@ -0,0 +1,5 @@ + +Server · Rocket.jl

      Server actor

      Rocket.serverFunction
      server(port::Int)
      +server(address::A, port::Int) where { A <: IPAddr }
      +server(::Type{D}, port::Int)
      +server(::Type{D}, address::A, port::Int) where { A <: IPAddr }

      Creation operator for the ServerActor actor.

      See also: AbstractActor

      source
      Rocket.ServerActorType
      ServerActor{D, Address, Port}() where D

      The ServerActor sends all next!/error!/complete! events to the local network listeners with specified Address and Port parameters via TCPSocket.

      See also: Actor, server

      source
      diff --git a/v1.8.0/actors/types/storage/index.html b/v1.8.0/actors/types/storage/index.html new file mode 100644 index 000000000..e67092957 --- /dev/null +++ b/v1.8.0/actors/types/storage/index.html @@ -0,0 +1,17 @@ + +Storage · Rocket.jl

      Storage actor

      Rocket.storageFunction
      storage(::Type{T}) where T

      Arguments

      • ::Type{T}: Type of storage data

      Creation operator for the StorageActor actor.

      Examples

      using Rocket
      +
      +actor = storage(Int)
      +actor isa StorageActor{Int}
      +
      +# output
      +true

      See also: StorageActor, AbstractActor

      source
      Rocket.StorageActorType
      StorageActor{D}() where D

      Storage actor provides an actor that stores a single (last) value passed to the next! callback. It saves last incoming successful next event in the value field, throws an ErrorException on error! event and does nothing on completion event. Before any events value initialised with nothing.

      Examples

      using Rocket
      +
      +source = from(1:5)
      +actor  = storage(Int)
      +
      +subscribe!(source, actor)
      +show(getvalues(actor))
      +
      +# output
      +5

      See also: Actor, storage

      source
      diff --git a/v1.8.0/actors/types/sync/index.html b/v1.8.0/actors/types/sync/index.html new file mode 100644 index 000000000..24bac7d6b --- /dev/null +++ b/v1.8.0/actors/types/sync/index.html @@ -0,0 +1,31 @@ + +Sync · Rocket.jl

      Sync actor

      Rocket.syncFunction
      sync(actor::A; withlock::Bool = true, timeout::Int = -1) where A
      +sync(factory::F; withlock::Bool = true, timeout::Int = -1) where { F <: AbstractActorFactory }

      Creation operator for the SyncActor actor. Accepts optional named timeout argument which specifies maximum number of milliseconds to wait (throws SyncActorTimedOutException() on timeout). Also accepts optional withlock boolean flag indicating that every next!, error! and complete! event should be guarded with ReentrantLock.

      Examples

      using Rocket
      +
      +actor  = keep(Int)
      +synced = sync(actor)
      +
      +subscribe!(from(0:5, scheduler = AsyncScheduler()), synced)
      +
      +yield()
      +
      +wait(synced)
      +show(synced.actor.values)
      +
      +# output
      +[0, 1, 2, 3, 4, 5]

      Can also be used with an <: AbstractActorFactory as an argument. In this case sync function will return a special actor factory object, which will store all created actors in array and wrap them with a sync function. wait(sync_factory) method will wait for all of the created actors to be completed in the order of creation (but only once for each of them).

      using Rocket
      +
      +values = Int[]
      +
      +factory  = lambda(on_next = (d) -> push!(values, d))
      +synced   = sync(factory)
      +
      +subscribe!(from(0:5, scheduler = AsyncScheduler()), synced)
      +
      +yield()
      +
      +wait(synced)
      +show(values)
      +
      +# output
      +[0, 1, 2, 3, 4, 5]

      See also: SyncActor, AbstractActor

      source
      Rocket.SyncActorType
      SyncActor{T, A}(actor::A; withlock::Bool = true, timeout::Int = -1) where { T, A }

      Sync actor provides a synchronized interface to wait for an actor to be notified with a complete event. By default creates a re-entrant lock for synchronizing next!, error! and complete! events.

      See also: Actor, sync

      source
      diff --git a/v1.8.0/actors/types/void/index.html b/v1.8.0/actors/types/void/index.html new file mode 100644 index 000000000..7b3dac9ff --- /dev/null +++ b/v1.8.0/actors/types/void/index.html @@ -0,0 +1,19 @@ + +Void · Rocket.jl

      Void actor

      Rocket.voidFunction
      void()
      +void(::Type{T}) where T

      Creation operator for the VoidActor actor.

      Examples

      using Rocket
      +
      +actor = void(Int)
      +actor isa VoidActor{Int}
      +
      +# output
      +true
      +

      See also: VoidActor, AbstractActor

      source
      Rocket.VoidActorType
      VoidActor{D}() where D

      Void actor does nothing with input data, error and complete events, can be useful for debugging (e.g. to start side-effects with tap operator)

      Examples

      using Rocket
      +
      +source = from([ 0, 1, 2 ])
      +actor  = VoidActor{Int}()
      +
      +subscribe!(source, actor)
      +;
      +
      +# output
      +

      See also: Actor, void, tap

      source
      diff --git a/v1.8.0/api/actors/index.html b/v1.8.0/api/actors/index.html new file mode 100644 index 000000000..5b897e72b --- /dev/null +++ b/v1.8.0/api/actors/index.html @@ -0,0 +1,54 @@ + +Actors · Rocket.jl

      Actors API

      How to create a custom Actor

      At first custom actor should implement a custom method for the as_actor function. Rocket.jl also provides a number of helper actor abstract types with predefined as_actor method behavior (see Traits API section).

      using Rocket
      +
      +struct MyCustomActor end
      +
      +as_actor(::Type{<:MyCustomActor}) = Rocket.BaseActorTrait{Int}()
      +

      or

      using Rocket
      +
      +struct MyCustomActor <: Actor{Int} end # Automatically specifies BaseActorTrait{Int} behavior.

      Additionally custom actor must provide a custom methods for on_next!, on_error! and/or on_complete! functions. Depending on specified actor trait behavior some methods may or may not be optional.

      using Rocket
      +
      +struct MyCustomActor <: Actor{Int} end
      +
      +Rocket.on_next!(actor::MyCustomActor, data::Int)  = # custom logic here
      +Rocket.on_error!(actor::MyCustomActor, err)       = # custom logic here
      +Rocket.on_complete!(actor::MyCustomActor)         = # custom logic here

      or

      using Rocket
      +
      +struct MyCustomCompletionActor <: CompletionActor{Int} end
      +
      +Rocket.on_complete!(actor::MyCustomCompletionActor) = # custom logic here

      Traits

      Rocket.as_actorFunction
      as_actor(any)

      This function checks actor trait behavior specification. May be used explicitly to specify actor trait behavior for any object.

      See also: ActorTrait

      source
      Rocket.BaseActorTraitType

      Base actor trait specifies actor to listen for all next!, error! and complete! events. BaseActorTrait is a subtype of ActorTrait.

      See also: Actor

      source
      Rocket.InvalidActorTraitType

      Default actor trait behavior for any object. Actor with such a trait specificaion cannot be used as a valid actor in subscribe! function. Doing so will raise an error. InvalidActorTrait is a subtype of ActorTrait.

      See also: ActorTrait

      source

      Types

      Rocket.ActorType

      Can be used as a super type for common actor. Automatically specifies a BaseActorTrait trait behavior. Every Actor must implement its own methods for on_next!(actor, data), on_error!(actor, err) and on_complete!(actor) functions. Actor is a subtype of AbstractActor type.

      Examples

      using Rocket
      +
      +struct MyActor <: Actor{String} end
      +
      +Rocket.as_actor(MyActor)
      +
      +# output
      +
      +BaseActorTrait{String}()

      See also: AbstractActor, as_actor, BaseActorTrait, ActorTrait, on_next!, on_error!, on_complete!

      source
      Rocket.NextActorType

      Can be used as a super type for "next-only" actor. Automatically specifies a NextActorTrait trait behavior. Every NextActor must implement its own methods for on_next!(actor, data) function only. NextActor is a subtype of AbstractActor type.

      Examples

      using Rocket
      +
      +struct MyNextActor <: NextActor{String} end
      +
      +Rocket.as_actor(MyNextActor)
      +
      +# output
      +
      +NextActorTrait{String}()

      See also: AbstractActor, as_actor, NextActorTrait, ActorTrait, on_next!

      source
      Rocket.ErrorActorType

      Can be used as a super type for "error-only" actor. Automatically specifies a ErrorActorTrait trait behavior. Every ErrorActor must implement its own methods for on_error!(actor, err) function only. ErrorActor is a subtype of AbstractActor type.

      Examples

      using Rocket
      +
      +struct MyErrorActor <: ErrorActor{String} end
      +
      +Rocket.as_actor(MyErrorActor)
      +
      +# output
      +
      +ErrorActorTrait{String}()

      See also: AbstractActor, as_actor, ErrorActorTrait, ActorTrait, on_error!

      source
      Rocket.CompletionActorType

      Can be used as a super type for "completion-only" actor. Automatically specifies a CompletionActorTrait trait behavior. Every CompletionActor must implement its own methods for on_complete!(actor) function only. CompletionActor is a subtype of AbstractActor type.

      Examples

      using Rocket
      +
      +struct MyCompletionActor <: CompletionActor{String} end
      +
      +Rocket.as_actor(MyCompletionActor)
      +
      +# output
      +
      +CompletionActorTrait{String}()

      See also: AbstractActor, as_actor, CompletionActorTrait, ActorTrait, on_complete!

      source

      Events

      Rocket.next!Function
      next!(actor, data)
      +next!(actor, data, scheduler)

      This function is used to deliver a "next" event to an actor with some data. Takes optional scheduler object to schedule execution of data delivery.

      See also: AbstractActor, on_next!

      source
      Rocket.error!Function
      error!(actor, err)
      +error!(actor, err, scheduler)

      This function is used to deliver a "error" event to an actor with some err. Takes optional scheduler object to schedule execution of error delivery.

      See also: AbstractActor, on_error!

      source
      Rocket.complete!Function
      complete!(actor)
      +complete!(actor, scheduler)

      This function is used to deliver a "complete" event to an actor. Takes optional scheduler object to schedule execution of complete event delivery.

      See also: AbstractActor, on_complete!

      source
      Rocket.on_next!Function
      on_next!(actor, data)

      Both Actor and NextActor objects must implement its own method for on_next! function which will be called on "next" event.

      See also: Actor, NextActor

      source
      Rocket.on_error!Function
      on_error!(actor, err)

      Both Actor and ErrorActor objects must implement its own method for on_error! function which will be called on "error" event.

      See also: Actor, ErrorActor

      source
      Rocket.on_complete!Function
      on_complete!(actor)

      Both Actor and CompletionActor objects must implement its own method for on_complete! function which will be called on "complete" event.

      See also: Actor, CompletionActor

      source

      Factory

      Errors

      diff --git a/v1.8.0/api/observables/index.html b/v1.8.0/api/observables/index.html new file mode 100644 index 000000000..dc52791fd --- /dev/null +++ b/v1.8.0/api/observables/index.html @@ -0,0 +1,85 @@ + +Observables · Rocket.jl

      Observables API

      Any observable-like should implement a valid subscribable logic.

      Traits

      Rocket.as_subscribableFunction
      as_subscribable(any)

      This function checks subscribable trait behavior specification. Can be used explicitly to specify subscribable trait behavior for any object.

      See also: SubscribableTrait

      source

      Types

      Rocket.SubscribableType

      Super type for any simple subscribable object. Automatically specifies a SimpleSubscribableTrait trait behavior. Objects with specified SimpleSubscribableTrait subscribable trait must implement: on_subscribe!(subscribable, actor) method. Subscribable is a subtype of AbstractSubscribable type.

      Examples

      using Rocket
      +
      +struct MySubscribable <: Subscribable{String} end
      +
      +Rocket.as_subscribable(MySubscribable)
      +
      +# output
      +
      +SimpleSubscribableTrait{String}()

      See also: SubscribableTrait, SimpleSubscribableTrait

      source
      Rocket.ScheduledSubscribableType

      Super type for any scheduled subscribable object. Automatically specifies a ScheduledSubscribableTrait trait behavior. Objects with specified ScheduledSubscribableTrait subscribable trait must implement: on_subscribe!(subscribable, actor, scheduler) method. ScheduledSubscribable is a subtype of AbstractSubscribable type.

      Examples

      using Rocket
      +
      +struct MyScheduledSubscribable <: ScheduledSubscribable{String} end
      +
      +Rocket.as_subscribable(MyScheduledSubscribable)
      +
      +# output
      +
      +ScheduledSubscribableTrait{String}()

      See also: SubscribableTrait, ScheduledSubscribableTrait

      source
      Rocket.subscribe!Function
      subscribe!(subscribable::T, actor::S)   where { T, S }
      +subscribe!(subscribable::T, factory::F) where { T, F <: AbstractActorFactory }
      +subscribe!(subscriptions::Tuple)
      +subscribe!(subscriptions::AbstractVector)

      subscribe! function is used to attach an actor to subscribable. It also checks types of subscribable and actors to be a valid Subscribable and Actor objects respectively. Passing not valid subscribable or/and actor object will throw an error. If the input argument to the subscribe! function is either a tuple or a vector, it will first check that all of the arguments are valid source and actor objects and if its true will subscribe for each of them individually.

      Arguments

      • subscribable: valid subscribable object
      • actor: valid actor object

      Examples

      using Rocket
      +
      +source = from((1, 2, 3))
      +subscribe!(source, logger())
      +;
      +
      +# output
      +
      +[LogActor] Data: 1
      +[LogActor] Data: 2
      +[LogActor] Data: 3
      +[LogActor] Completed
      using Rocket
      +
      +source = from((1, 2, 3))
      +subscribe!(source, 1)
      +;
      +
      +# output
      +
      +ERROR: Type Int64 is not a valid actor type.
      +[...]
      using Rocket
      +
      +source = from((1, 2, 3))
      +subscribe!(1, logger())
      +;
      +
      +# output
      +
      +ERROR: Type Int64 is not a valid subscribable type.
      +[...]

      See also: on_subscribe!, as_subscribable

      source
      Rocket.on_subscribe!Function
      on_subscribe!(subscribable, actor)
      +on_subscribe!(subscribable, actor, scheduler)

      Every valid subscribable object have to define its own method for on_subscribe! function which specifies subscription logic and has return a valid Teardown object.

      Objects with specified SimpleSubscribableTrait subscribable trait must implement: on_subscribe!(subscribable, actor) method. Objects with specified ScheduledSubscribableTrait subscribable trait must implement: on_subscribe!(subscribable, actor, scheduler) method.

      Arguments

      • subscribable: Subscribable object
      • actor: Actor object
      • scheduler: Scheduler object (only for scheduled subscribables)

      Examples

      using Rocket
      +
      +struct MySubscribable <: Subscribable{Int} end
      +
      +function Rocket.on_subscribe!(subscribable::MySubscribable, actor)
      +    next!(actor, 0)
      +    complete!(actor)
      +    return voidTeardown
      +end
      +
      +subscribe!(MySubscribable(), logger())
      +;
      +
      +# output
      +
      +[LogActor] Data: 0
      +[LogActor] Completed
      using Rocket
      +
      +struct MyScheduledSubscribable <: ScheduledSubscribable{Int} end
      +
      +Rocket.getscheduler(::MyScheduledSubscribable) = AsapScheduler()
      +
      +function Rocket.on_subscribe!(subscribable::MyScheduledSubscribable, actor, scheduler)
      +    next!(actor, 0, scheduler)
      +    complete!(actor, scheduler)
      +    return voidTeardown
      +end
      +
      +subscribe!(MyScheduledSubscribable(), logger())
      +;
      +
      +# output
      +
      +[LogActor] Data: 0
      +[LogActor] Completed

      See also: Subscribable, ScheduledSubscribable, SimpleSubscribableTrait, ScheduledSubscribableTrait, Teardown, logger

      source

      Errors

      diff --git a/v1.8.0/api/operators/index.html b/v1.8.0/api/operators/index.html new file mode 100644 index 000000000..7579c2100 --- /dev/null +++ b/v1.8.0/api/operators/index.html @@ -0,0 +1,211 @@ + +Operators · Rocket.jl

      Operators API

      How to create a custom operator

      If you need to write an operator that cannot be made from a combination of existing operators, then you can write a custom operator from scratch.

      Each operator (e.g. MyFancyOperator) needs to either be (1) a subtype of one of abstract OperatorTrait trait types, or (2) define a

      Rocket.as_operator(::Type{<:MyFancyOperator}) = TypedOperatorTrait{T, R}()
      +# or
      +Rocket.as_operator(::Type{<:MyFancyOperator}) = InferableOperatorTrait()

      trait behavior.

      In addition, an operator must implement a specific method for on_call! function with custom logic which has to return another Observable as a result of applying MyFancyOperator to a source.

      Rocket.on_call!(::Type{L}, ::Type{R}, operator::MyFancyOperator, source) where L = # some custom logic here
      +
      +# or
      +# for inferable trait types you have to specify 'right' type with Rocket.operator_right which should specify a type of data of produced Observable
      +
      +Rocket.on_call(::Type{L}, ::Type{R}, operator::MyFancyOperator, source) where L = # some custom logic here
      +Rocket.operator_right(::MyFancyOperator, ::Type{L}) where L = R # where R should be an actual type, Int or even L itself e.g.
      +
      Note

      It is not allowed to modify the source Observable in any way; you have to return a new observable.

      See more examples on custom operators in Traits API section

      Note

      It might be useful to return a ProxyObservable from an on_call! function. ProxyObservable is a special Observable which proxying actors with the source and/or source with actors.

      Traits

      Rocket.TypedOperatorTraitType

      Typed operator trait specifies operator to be statically typed with input and output data types. Typed operator with input type L and output type R can only operate on input Observable with data type L and will always produce an Observable with data type R.

      Examples

      using Rocket
      +
      +struct MyTypedOperator <: TypedOperator{Int, Int} end
      +
      +function Rocket.on_call!(::Type{Int}, ::Type{Int}, op::MyTypedOperator, source)
      +    return proxy(Int, source, MyTypedOperatorProxy())
      +end
      +
      +struct MyTypedOperatorProxy <: ActorProxy end
      +
      +Rocket.actor_proxy!(::Type{Int}, ::MyTypedOperatorProxy, actor::A) where A = MyTypedOperatorProxiedActor{A}(actor)
      +
      +struct MyTypedOperatorProxiedActor{A} <: Actor{Int}
      +    actor :: A
      +end
      +
      +function Rocket.on_next!(actor::MyTypedOperatorProxiedActor, data::Int)
      +    # Do something with a data and/or redirect it to actor.actor
      +    next!(actor.actor, data + 1)
      +end
      +
      +Rocket.on_error!(actor::MyTypedOperatorProxiedActor, err) = error!(actor.actor, err)
      +Rocket.on_complete!(actor::MyTypedOperatorProxiedActor)   = complete!(actor.actor)
      +
      +source = from([ 0, 1, 2 ])
      +subscribe!(source |> MyTypedOperator(), logger())
      +;
      +
      +# output
      +
      +[LogActor] Data: 1
      +[LogActor] Data: 2
      +[LogActor] Data: 3
      +[LogActor] Completed

      See also: OperatorTrait, TypedOperator, OperatorTrait, ProxyObservable, ActorProxy, logger

      source
      Rocket.LeftTypedOperatorTraitType

      Left typed operator trait specifies operator to be statically typed with input data type. To infer output data type this object should specify a special function operator_right(operator, ::Type{L}) where L which will be used to infer output data type. Left typed operator with input type L can only operate on input Observable with data type L and will always produce an Observable with data type inferred from operator_right(operator, ::Type{L}).

      Examples

      using Rocket
      +
      +struct CountIntegersOperator <: LeftTypedOperator{Int} end
      +
      +function Rocket.on_call!(::Type{Int}, ::Type{Tuple{Int, Int}}, op::CountIntegersOperator, source)
      +    return proxy(Tuple{Int, Int}, source, CountIntegersOperatorProxy())
      +end
      +
      +Rocket.operator_right(::CountIntegersOperator, ::Type{Int}) = Tuple{Int, Int}
      +
      +struct CountIntegersOperatorProxy <: ActorProxy end
      +
      +Rocket.actor_proxy!(::Type{Tuple{Int, Int}}, ::CountIntegersOperatorProxy, actor::A) where A = CountIntegersProxiedActor{A}(0, actor)
      +
      +mutable struct CountIntegersProxiedActor{A} <: Actor{Int}
      +    current :: Int
      +    actor   :: A
      +end
      +
      +function Rocket.on_next!(actor::CountIntegersProxiedActor, data::Int)
      +    current = actor.current
      +    actor.current += 1
      +    next!(actor.actor, (current, data)) # e.g.
      +end
      +
      +Rocket.on_error!(actor::CountIntegersProxiedActor, err) = error!(actor.actor, err)
      +Rocket.on_complete!(actor::CountIntegersProxiedActor)   = complete!(actor.actor)
      +
      +source = from([ 0, 0, 0 ])
      +subscribe!(source |> CountIntegersOperator(), logger())
      +;
      +
      +# output
      +
      +[LogActor] Data: (0, 0)
      +[LogActor] Data: (1, 0)
      +[LogActor] Data: (2, 0)
      +[LogActor] Completed

      See also: OperatorTrait, LeftTypedOperator, operator_right, OperatorTrait, ProxyObservable, ActorProxy, enumerate, logger

      source
      Rocket.RightTypedOperatorTraitType

      Right typed operator trait specifies operator to be statically typed with output data type. It can operate on input Observable with any data type L but will always produce an Observable with data type R.

      Examples

      using Rocket
      +
      +struct ConvertToFloatOperator <: RightTypedOperator{Float64} end
      +
      +function Rocket.on_call!(::Type{L}, ::Type{Float64}, op::ConvertToFloatOperator, source) where L
      +    return proxy(Float64, source, ConvertToFloatProxy{L}())
      +end
      +
      +struct ConvertToFloatProxy{L} <: ActorProxy end
      +
      +function Rocket.actor_proxy!(::Type{Float64}, proxy::ConvertToFloatProxy{L}, actor::A) where { L, A }
      +    return ConvertToFloatProxyActor{L, A}(actor)
      +end
      +
      +struct ConvertToFloatProxyActor{L, A} <: Actor{L}
      +    actor :: A
      +end
      +
      +function Rocket.on_next!(actor::ConvertToFloatProxyActor{L}, data::L) where L
      +    next!(actor.actor, convert(Float64, data)) # e.g.
      +end
      +
      +Rocket.on_error!(actor::ConvertToFloatProxyActor, err) = error!(actor.actor, err)
      +Rocket.on_complete!(actor::ConvertToFloatProxyActor)   = complete!(actor.actor)
      +
      +source = from([ 1, 2, 3 ])
      +subscribe!(source |> ConvertToFloatOperator(), logger())
      +;
      +
      +# output
      +
      +[LogActor] Data: 1.0
      +[LogActor] Data: 2.0
      +[LogActor] Data: 3.0
      +[LogActor] Completed

      See also: OperatorTrait, RightTypedOperator, OperatorTrait, ProxyObservable, ActorProxy, logger

      source
      Rocket.InferableOperatorTraitType

      Inferable operator trait specifies operator to be statically typed neither with input data type nor with output data type. To infer output data type this object should specify a special function operator_right(operator, ::Type{L}) where L where L is input data type which will be used to infer output data type.

      using Rocket
      +
      +struct IdentityOperator <: InferableOperator end
      +
      +function Rocket.on_call!(::Type{L}, ::Type{L}, op::IdentityOperator, source) where L
      +    return proxy(L, source, IdentityProxy())
      +end
      +
      +struct IdentityProxy <: ActorProxy end
      +
      +Rocket.operator_right(::IdentityOperator, ::Type{L}) where L = L
      +
      +Rocket.actor_proxy!(::Type{L}, proxy::IdentityProxy, actor::A) where L where A = IdentityProxyActor{L, A}(actor)
      +
      +struct IdentityProxyActor{L, A} <: Actor{L}
      +    actor :: A
      +end
      +
      +function Rocket.on_next!(actor::IdentityProxyActor{L}, data::L) where L
      +    next!(actor.actor, data) # e.g.
      +end
      +
      +Rocket.on_error!(actor::IdentityProxyActor, err) = error!(actor.actor, err)
      +Rocket.on_complete!(actor::IdentityProxyActor)   = complete!(actor.actor)
      +
      +source = from([ 1, 2, 3 ])
      +subscribe!(source |> IdentityOperator(), logger())
      +
      +source = from([ 1.0, 2.0, 3.0 ])
      +subscribe!(source |> IdentityOperator(), logger())
      +;
      +
      +# output
      +
      +[LogActor] Data: 1
      +[LogActor] Data: 2
      +[LogActor] Data: 3
      +[LogActor] Completed
      +[LogActor] Data: 1.0
      +[LogActor] Data: 2.0
      +[LogActor] Data: 3.0
      +[LogActor] Completed
      +

      See also: OperatorTrait, InferableOperator, operator_right, OperatorTrait, ProxyObservable, ActorProxy, logger

      source
      Rocket.InvalidOperatorTraitType

      InvalidOperatorTrait trait specifies special 'invalid' behavior and types with such a trait specification cannot be used as an operator for an observable stream. By default any type has InvalidOperatorTrait trait specification

      See also: OperatorTrait

      source

      Types

      Rocket.TypedOperatorType

      Can be used as a supertype for any operator. Automatically specifies TypedOperatorTrait behavior.

      Examples

      using Rocket
      +
      +struct MyOperator <: TypedOperator{Float64,String} end
      +
      +as_operator(MyOperator) === TypedOperatorTrait{Float64,String}()
      +
      +# output
      +true

      See also: AbstractOperator, TypedOperatorTrait

      source
      Rocket.RightTypedOperatorType

      Can be used as a supertype for any operator. Automatically specifies RightTypedOperatorTrait behavior.

      Examples

      using Rocket
      +
      +struct MyOperator <: RightTypedOperator{Float64} end
      +
      +as_operator(MyOperator) === RightTypedOperatorTrait{Float64}()
      +
      +# output
      +true

      See also: AbstractOperator, RightTypedOperatorTrait

      source
      Rocket.on_call!Function
      on_call!(::Type, ::Type, operator, source)

      Each operator must implement its own method for on_call! function. This function is used to invoke operator on some Observable and to produce another Observable with new logic (operator specific).

      See also: AbstractOperator

      source
      Rocket.OperatorsCompositionType
      OperatorsComposition(operators)

      OperatorsComposition is an object which helps to create a composition of multiple operators. To create a composition of two or more operators overloaded + or |> can be used.

      using Rocket
      +
      +composition = map(Int, (d) -> d ^ 2) + filter(d -> d % 2 == 0)
      +
      +source = from(1:5) |> composition
      +
      +subscribe!(source, logger())
      +;
      +
      +# output
      +
      +[LogActor] Data: 4
      +[LogActor] Data: 16
      +[LogActor] Completed
      using Rocket
      +
      +composition = map(Int, (d) -> d ^ 2) |> filter(d -> d % 2 == 0)
      +
      +source = from(1:5) |> composition
      +
      +subscribe!(source, logger())
      +;
      +
      +# output
      +
      +[LogActor] Data: 4
      +[LogActor] Data: 16
      +[LogActor] Completed
      source

      Errors

      diff --git a/v1.8.0/api/subjects/index.html b/v1.8.0/api/subjects/index.html new file mode 100644 index 000000000..5d392346d --- /dev/null +++ b/v1.8.0/api/subjects/index.html @@ -0,0 +1,2 @@ + +Subjects · Rocket.jl

      Subjects API

      Traits

      Rocket.as_subjectFunction
      as_subject(::Type)

      This function checks subject trait behavior specification. Should be used explicitly to specify subject trait behavior for any object type.

      See also: SubjectTrait

      source

      Factory

      Errors

      diff --git a/v1.8.0/api/teardown/index.html b/v1.8.0/api/teardown/index.html new file mode 100644 index 000000000..605072528 --- /dev/null +++ b/v1.8.0/api/teardown/index.html @@ -0,0 +1,27 @@ + +Teardown · Rocket.jl

      Teardown API

      Any subscription-like object should implement a valid teardown logic.

      Example

      using Rocket
      +
      +struct MuCustomSubscription <: Teardown
      +    # some fields here
      +end
      +
      +Rocket.as_teardown(::Type{<:MuCustomSubscription}) = UnsubscribableTeardownLogic()
      +
      +function on_unsubscribe!(subscription::MyCustomSubscription)
      +    # dispose resources here
      +end

      Traits

      Rocket.as_teardownFunction
      as_teardown(::Type)

      This function checks teardown trait behavior specification. Should be used explicitly to specify teardown logic trait behavior for any object.

      Examples

      using Rocket
      +
      +struct MySubscription <: Teardown end
      +
      +Rocket.as_teardown(::Type{<:MySubscription}) = UnsubscribableTeardownLogic()
      +Rocket.on_unsubscribe!(s::MySubscription)    = println("Unsubscribed!")
      +
      +subscription = MySubscription()
      +unsubscribe!(subscription)
      +;
      +
      +# output
      +
      +Unsubscribed!

      See also: Teardown, TeardownLogic

      source

      Types

      Rocket.unsubscribe!Function
      unsubscribe!(subscription)
      +unsubscribe!(subscriptions::Tuple)
      +unsubscribe!(subscriptions::AbstractVector)

      unsubscribe! function is used to cancel Observable execution and to dispose any kind of resources used during an Observable execution. If the input argument to the unsubscribe! function is either a tuple or a vector, it will first check that all of the arguments are valid subscription objects and if its true will unsubscribe from each of them individually.

      See also: Teardown, TeardownLogic, on_unsubscribe!

      source

      Errors

      diff --git a/v1.8.0/assets/documenter.js b/v1.8.0/assets/documenter.js new file mode 100644 index 000000000..c6562b558 --- /dev/null +++ b/v1.8.0/assets/documenter.js @@ -0,0 +1,1050 @@ +// Generated by Documenter.jl +requirejs.config({ + paths: { + 'highlight-julia': 'https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.8.0/languages/julia.min', + 'headroom': 'https://cdnjs.cloudflare.com/ajax/libs/headroom/0.12.0/headroom.min', + 'jqueryui': 'https://cdnjs.cloudflare.com/ajax/libs/jqueryui/1.13.2/jquery-ui.min', + 'katex-auto-render': 'https://cdnjs.cloudflare.com/ajax/libs/KaTeX/0.16.8/contrib/auto-render.min', + 'jquery': 'https://cdnjs.cloudflare.com/ajax/libs/jquery/3.7.0/jquery.min', + 'headroom-jquery': 'https://cdnjs.cloudflare.com/ajax/libs/headroom/0.12.0/jQuery.headroom.min', + 'katex': 'https://cdnjs.cloudflare.com/ajax/libs/KaTeX/0.16.8/katex.min', + 'highlight': 'https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.8.0/highlight.min', + 'highlight-julia-repl': 'https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.8.0/languages/julia-repl.min', + }, + shim: { + "highlight-julia": { + "deps": [ + "highlight" + ] + }, + "katex-auto-render": { + "deps": [ + "katex" + ] + }, + "headroom-jquery": { + "deps": [ + "jquery", + "headroom" + ] + }, + "highlight-julia-repl": { + "deps": [ + "highlight" + ] + } +} +}); +//////////////////////////////////////////////////////////////////////////////// +require(['jquery', 'katex', 'katex-auto-render'], function($, katex, renderMathInElement) { +$(document).ready(function() { + renderMathInElement( + document.body, + { + "delimiters": [ + { + "left": "$", + "right": "$", + "display": false + }, + { + "left": "$$", + "right": "$$", + "display": true + }, + { + "left": "\\[", + "right": "\\]", + "display": true + } + ] +} + + ); +}) + +}) +//////////////////////////////////////////////////////////////////////////////// +require(['jquery', 'highlight', 'highlight-julia', 'highlight-julia-repl'], function($) { +$(document).ready(function() { + hljs.highlightAll(); +}) + +}) +//////////////////////////////////////////////////////////////////////////////// +require(['jquery'], function($) { + +let timer = 0; +var isExpanded = true; + +$(document).on("click", ".docstring header", function () { + let articleToggleTitle = "Expand docstring"; + + debounce(() => { + if ($(this).siblings("section").is(":visible")) { + $(this) + .find(".docstring-article-toggle-button") + .removeClass("fa-chevron-down") + .addClass("fa-chevron-right"); + } else { + $(this) + .find(".docstring-article-toggle-button") + .removeClass("fa-chevron-right") + .addClass("fa-chevron-down"); + + articleToggleTitle = "Collapse docstring"; + } + + $(this) + .find(".docstring-article-toggle-button") + .prop("title", articleToggleTitle); + $(this).siblings("section").slideToggle(); + }); +}); + +$(document).on("click", ".docs-article-toggle-button", function (event) { + let articleToggleTitle = "Expand docstring"; + let navArticleToggleTitle = "Expand all docstrings"; + let animationSpeed = event.noToggleAnimation ? 0 : 400; + + debounce(() => { + if (isExpanded) { + $(this).removeClass("fa-chevron-up").addClass("fa-chevron-down"); + $(".docstring-article-toggle-button") + .removeClass("fa-chevron-down") + .addClass("fa-chevron-right"); + + isExpanded = false; + + $(".docstring section").slideUp(animationSpeed); + } else { + $(this).removeClass("fa-chevron-down").addClass("fa-chevron-up"); + $(".docstring-article-toggle-button") + .removeClass("fa-chevron-right") + .addClass("fa-chevron-down"); + + isExpanded = true; + articleToggleTitle = "Collapse docstring"; + navArticleToggleTitle = "Collapse all docstrings"; + + $(".docstring section").slideDown(animationSpeed); + } + + $(this).prop("title", navArticleToggleTitle); + $(".docstring-article-toggle-button").prop("title", articleToggleTitle); + }); +}); + +function debounce(callback, timeout = 300) { + if (Date.now() - timer > timeout) { + callback(); + } + + clearTimeout(timer); + + timer = Date.now(); +} + +}) +//////////////////////////////////////////////////////////////////////////////// +require([], function() { +function addCopyButtonCallbacks() { + for (const el of document.getElementsByTagName("pre")) { + const button = document.createElement("button"); + button.classList.add("copy-button", "fa-solid", "fa-copy"); + button.setAttribute("aria-label", "Copy this code block"); + button.setAttribute("title", "Copy"); + + el.appendChild(button); + + const success = function () { + button.classList.add("success", "fa-check"); + button.classList.remove("fa-copy"); + }; + + const failure = function () { + button.classList.add("error", "fa-xmark"); + button.classList.remove("fa-copy"); + }; + + button.addEventListener("click", function () { + copyToClipboard(el.innerText).then(success, failure); + + setTimeout(function () { + button.classList.add("fa-copy"); + button.classList.remove("success", "fa-check", "fa-xmark"); + }, 5000); + }); + } +} + +function copyToClipboard(text) { + // clipboard API is only available in secure contexts + if (window.navigator && window.navigator.clipboard) { + return window.navigator.clipboard.writeText(text); + } else { + return new Promise(function (resolve, reject) { + try { + const el = document.createElement("textarea"); + el.textContent = text; + el.style.position = "fixed"; + el.style.opacity = 0; + document.body.appendChild(el); + el.select(); + document.execCommand("copy"); + + resolve(); + } catch (err) { + reject(err); + } finally { + document.body.removeChild(el); + } + }); + } +} + +if (document.readyState === "loading") { + document.addEventListener("DOMContentLoaded", addCopyButtonCallbacks); +} else { + addCopyButtonCallbacks(); +} + +}) +//////////////////////////////////////////////////////////////////////////////// +require(['jquery', 'headroom', 'headroom-jquery'], function($, Headroom) { + +// Manages the top navigation bar (hides it when the user starts scrolling down on the +// mobile). +window.Headroom = Headroom; // work around buggy module loading? +$(document).ready(function () { + $("#documenter .docs-navbar").headroom({ + tolerance: { up: 10, down: 10 }, + }); +}); + +}) +//////////////////////////////////////////////////////////////////////////////// +require(['jquery'], function($) { + +$(document).ready(function () { + let meta = $("div[data-docstringscollapsed]").data(); + + if (meta?.docstringscollapsed) { + $("#documenter-article-toggle-button").trigger({ + type: "click", + noToggleAnimation: true, + }); + } +}); + +}) +//////////////////////////////////////////////////////////////////////////////// +require(['jquery'], function($) { + +/* +To get an in-depth about the thought process you can refer: https://hetarth02.hashnode.dev/series/gsoc + +PSEUDOCODE: + +Searching happens automatically as the user types or adjusts the selected filters. +To preserve responsiveness, as much as possible of the slow parts of the search are done +in a web worker. Searching and result generation are done in the worker, and filtering and +DOM updates are done in the main thread. The filters are in the main thread as they should +be very quick to apply. This lets filters be changed without re-searching with minisearch +(which is possible even if filtering is on the worker thread) and also lets filters be +changed _while_ the worker is searching and without message passing (neither of which are +possible if filtering is on the worker thread) + +SEARCH WORKER: + +Import minisearch + +Build index + +On message from main thread + run search + find the first 200 unique results from each category, and compute their divs for display + note that this is necessary and sufficient information for the main thread to find the + first 200 unique results from any given filter set + post results to main thread + +MAIN: + +Launch worker + +Declare nonconstant globals (worker_is_running, last_search_text, unfiltered_results) + +On text update + if worker is not running, launch_search() + +launch_search + set worker_is_running to true, set last_search_text to the search text + post the search query to worker + +on message from worker + if last_search_text is not the same as the text in the search field, + the latest search result is not reflective of the latest search query, so update again + launch_search() + otherwise + set worker_is_running to false + + regardless, display the new search results to the user + save the unfiltered_results as a global + update_search() + +on filter click + adjust the filter selection + update_search() + +update_search + apply search filters by looping through the unfiltered_results and finding the first 200 + unique results that match the filters + + Update the DOM +*/ + +/////// SEARCH WORKER /////// + +function worker_function(documenterSearchIndex, documenterBaseURL, filters) { + importScripts( + "https://cdn.jsdelivr.net/npm/minisearch@6.1.0/dist/umd/index.min.js" + ); + + let data = documenterSearchIndex.map((x, key) => { + x["id"] = key; // minisearch requires a unique for each object + return x; + }); + + // list below is the lunr 2.1.3 list minus the intersect with names(Base) + // (all, any, get, in, is, only, which) and (do, else, for, let, where, while, with) + // ideally we'd just filter the original list but it's not available as a variable + const stopWords = new Set([ + "a", + "able", + "about", + "across", + "after", + "almost", + "also", + "am", + "among", + "an", + "and", + "are", + "as", + "at", + "be", + "because", + "been", + "but", + "by", + "can", + "cannot", + "could", + "dear", + "did", + "does", + "either", + "ever", + "every", + "from", + "got", + "had", + "has", + "have", + "he", + "her", + "hers", + "him", + "his", + "how", + "however", + "i", + "if", + "into", + "it", + "its", + "just", + "least", + "like", + "likely", + "may", + "me", + "might", + "most", + "must", + "my", + "neither", + "no", + "nor", + "not", + "of", + "off", + "often", + "on", + "or", + "other", + "our", + "own", + "rather", + "said", + "say", + "says", + "she", + "should", + "since", + "so", + "some", + "than", + "that", + "the", + "their", + "them", + "then", + "there", + "these", + "they", + "this", + "tis", + "to", + "too", + "twas", + "us", + "wants", + "was", + "we", + "were", + "what", + "when", + "who", + "whom", + "why", + "will", + "would", + "yet", + "you", + "your", + ]); + + let index = new MiniSearch({ + fields: ["title", "text"], // fields to index for full-text search + storeFields: ["location", "title", "text", "category", "page"], // fields to return with results + processTerm: (term) => { + let word = stopWords.has(term) ? null : term; + if (word) { + // custom trimmer that doesn't strip @ and !, which are used in julia macro and function names + word = word + .replace(/^[^a-zA-Z0-9@!]+/, "") + .replace(/[^a-zA-Z0-9@!]+$/, ""); + + word = word.toLowerCase(); + } + + return word ?? null; + }, + // add . as a separator, because otherwise "title": "Documenter.Anchors.add!", would not + // find anything if searching for "add!", only for the entire qualification + tokenize: (string) => string.split(/[\s\-\.]+/), + // options which will be applied during the search + searchOptions: { + prefix: true, + boost: { title: 100 }, + fuzzy: 2, + }, + }); + + index.addAll(data); + + /** + * Used to map characters to HTML entities. + * Refer: https://github.com/lodash/lodash/blob/main/src/escape.ts + */ + const htmlEscapes = { + "&": "&", + "<": "<", + ">": ">", + '"': """, + "'": "'", + }; + + /** + * Used to match HTML entities and HTML characters. + * Refer: https://github.com/lodash/lodash/blob/main/src/escape.ts + */ + const reUnescapedHtml = /[&<>"']/g; + const reHasUnescapedHtml = RegExp(reUnescapedHtml.source); + + /** + * Escape function from lodash + * Refer: https://github.com/lodash/lodash/blob/main/src/escape.ts + */ + function escape(string) { + return string && reHasUnescapedHtml.test(string) + ? string.replace(reUnescapedHtml, (chr) => htmlEscapes[chr]) + : string || ""; + } + + /** + * Make the result component given a minisearch result data object and the value + * of the search input as queryString. To view the result object structure, refer: + * https://lucaong.github.io/minisearch/modules/_minisearch_.html#searchresult + * + * @param {object} result + * @param {string} querystring + * @returns string + */ + function make_search_result(result, querystring) { + let search_divider = `
      `; + let display_link = + result.location.slice(Math.max(0), Math.min(50, result.location.length)) + + (result.location.length > 30 ? "..." : ""); // To cut-off the link because it messes with the overflow of the whole div + + if (result.page !== "") { + display_link += ` (${result.page})`; + } + + let textindex = new RegExp(`${querystring}`, "i").exec(result.text); + let text = + textindex !== null + ? result.text.slice( + Math.max(textindex.index - 100, 0), + Math.min( + textindex.index + querystring.length + 100, + result.text.length + ) + ) + : ""; // cut-off text before and after from the match + + text = text.length ? escape(text) : ""; + + let display_result = text.length + ? "..." + + text.replace( + new RegExp(`${escape(querystring)}`, "i"), // For first occurrence + '$&' + ) + + "..." + : ""; // highlights the match + + let in_code = false; + if (!["page", "section"].includes(result.category.toLowerCase())) { + in_code = true; + } + + // We encode the full url to escape some special characters which can lead to broken links + let result_div = ` + +
      +
      ${escape(result.title)}
      +
      ${result.category}
      +
      +

      + ${display_result} +

      +
      + ${display_link} +
      +
      + ${search_divider} + `; + + return result_div; + } + + self.onmessage = function (e) { + let query = e.data; + let results = index.search(query, { + filter: (result) => { + // Only return relevant results + return result.score >= 1; + }, + }); + + // Pre-filter to deduplicate and limit to 200 per category to the extent + // possible without knowing what the filters are. + let filtered_results = []; + let counts = {}; + for (let filter of filters) { + counts[filter] = 0; + } + let present = {}; + + for (let result of results) { + cat = result.category; + cnt = counts[cat]; + if (cnt < 200) { + id = cat + "---" + result.location; + if (present[id]) { + continue; + } + present[id] = true; + filtered_results.push({ + location: result.location, + category: cat, + div: make_search_result(result, query), + }); + } + } + + postMessage(filtered_results); + }; +} + +// `worker = Threads.@spawn worker_function(documenterSearchIndex)`, but in JavaScript! +const filters = [ + ...new Set(documenterSearchIndex["docs"].map((x) => x.category)), +]; +const worker_str = + "(" + + worker_function.toString() + + ")(" + + JSON.stringify(documenterSearchIndex["docs"]) + + "," + + JSON.stringify(documenterBaseURL) + + "," + + JSON.stringify(filters) + + ")"; +const worker_blob = new Blob([worker_str], { type: "text/javascript" }); +const worker = new Worker(URL.createObjectURL(worker_blob)); + +/////// SEARCH MAIN /////// + +// Whether the worker is currently handling a search. This is a boolean +// as the worker only ever handles 1 or 0 searches at a time. +var worker_is_running = false; + +// The last search text that was sent to the worker. This is used to determine +// if the worker should be launched again when it reports back results. +var last_search_text = ""; + +// The results of the last search. This, in combination with the state of the filters +// in the DOM, is used compute the results to display on calls to update_search. +var unfiltered_results = []; + +// Which filter is currently selected +var selected_filter = ""; + +$(document).on("input", ".documenter-search-input", function (event) { + if (!worker_is_running) { + launch_search(); + } +}); + +function launch_search() { + worker_is_running = true; + last_search_text = $(".documenter-search-input").val(); + worker.postMessage(last_search_text); +} + +worker.onmessage = function (e) { + if (last_search_text !== $(".documenter-search-input").val()) { + launch_search(); + } else { + worker_is_running = false; + } + + unfiltered_results = e.data; + update_search(); +}; + +$(document).on("click", ".search-filter", function () { + if ($(this).hasClass("search-filter-selected")) { + selected_filter = ""; + } else { + selected_filter = $(this).text().toLowerCase(); + } + + // This updates search results and toggles classes for UI: + update_search(); +}); + +/** + * Make/Update the search component + */ +function update_search() { + let querystring = $(".documenter-search-input").val(); + + if (querystring.trim()) { + if (selected_filter == "") { + results = unfiltered_results; + } else { + results = unfiltered_results.filter((result) => { + return selected_filter == result.category.toLowerCase(); + }); + } + + let search_result_container = ``; + let modal_filters = make_modal_body_filters(); + let search_divider = `
      `; + + if (results.length) { + let links = []; + let count = 0; + let search_results = ""; + + for (var i = 0, n = results.length; i < n && count < 200; ++i) { + let result = results[i]; + if (result.location && !links.includes(result.location)) { + search_results += result.div; + count++; + links.push(result.location); + } + } + + if (count == 1) { + count_str = "1 result"; + } else if (count == 200) { + count_str = "200+ results"; + } else { + count_str = count + " results"; + } + let result_count = `
      ${count_str}
      `; + + search_result_container = ` +
      + ${modal_filters} + ${search_divider} + ${result_count} +
      + ${search_results} +
      +
      + `; + } else { + search_result_container = ` +
      + ${modal_filters} + ${search_divider} +
      0 result(s)
      +
      +
      No result found!
      + `; + } + + if ($(".search-modal-card-body").hasClass("is-justify-content-center")) { + $(".search-modal-card-body").removeClass("is-justify-content-center"); + } + + $(".search-modal-card-body").html(search_result_container); + } else { + if (!$(".search-modal-card-body").hasClass("is-justify-content-center")) { + $(".search-modal-card-body").addClass("is-justify-content-center"); + } + + $(".search-modal-card-body").html(` +
      Type something to get started!
      + `); + } +} + +/** + * Make the modal filter html + * + * @returns string + */ +function make_modal_body_filters() { + let str = filters + .map((val) => { + if (selected_filter == val.toLowerCase()) { + return `${val}`; + } else { + return `${val}`; + } + }) + .join(""); + + return ` +
      + Filters: + ${str} +
      `; +} + +}) +//////////////////////////////////////////////////////////////////////////////// +require(['jquery'], function($) { + +// Modal settings dialog +$(document).ready(function () { + var settings = $("#documenter-settings"); + $("#documenter-settings-button").click(function () { + settings.toggleClass("is-active"); + }); + // Close the dialog if X is clicked + $("#documenter-settings button.delete").click(function () { + settings.removeClass("is-active"); + }); + // Close dialog if ESC is pressed + $(document).keyup(function (e) { + if (e.keyCode == 27) settings.removeClass("is-active"); + }); +}); + +}) +//////////////////////////////////////////////////////////////////////////////// +require(['jquery'], function($) { + +$(document).ready(function () { + let search_modal_header = ` + + `; + + let initial_search_body = ` +
      Type something to get started!
      + `; + + let search_modal_footer = ` +
      + + Ctrl + + / to search + + esc to close +
      + `; + + $(document.body).append( + ` + + ` + ); + + document.querySelector(".docs-search-query").addEventListener("click", () => { + openModal(); + }); + + document + .querySelector(".close-search-modal") + .addEventListener("click", () => { + closeModal(); + }); + + $(document).on("click", ".search-result-link", function () { + closeModal(); + }); + + document.addEventListener("keydown", (event) => { + if ((event.ctrlKey || event.metaKey) && event.key === "/") { + openModal(); + } else if (event.key === "Escape") { + closeModal(); + } + + return false; + }); + + // Functions to open and close a modal + function openModal() { + let searchModal = document.querySelector("#search-modal"); + + searchModal.classList.add("is-active"); + document.querySelector(".documenter-search-input").focus(); + } + + function closeModal() { + let searchModal = document.querySelector("#search-modal"); + let initial_search_body = ` +
      Type something to get started!
      + `; + + searchModal.classList.remove("is-active"); + document.querySelector(".documenter-search-input").blur(); + + if (!$(".search-modal-card-body").hasClass("is-justify-content-center")) { + $(".search-modal-card-body").addClass("is-justify-content-center"); + } + + $(".documenter-search-input").val(""); + $(".search-modal-card-body").html(initial_search_body); + } + + document + .querySelector("#search-modal .modal-background") + .addEventListener("click", () => { + closeModal(); + }); +}); + +}) +//////////////////////////////////////////////////////////////////////////////// +require(['jquery'], function($) { + +// Manages the showing and hiding of the sidebar. +$(document).ready(function () { + var sidebar = $("#documenter > .docs-sidebar"); + var sidebar_button = $("#documenter-sidebar-button"); + sidebar_button.click(function (ev) { + ev.preventDefault(); + sidebar.toggleClass("visible"); + if (sidebar.hasClass("visible")) { + // Makes sure that the current menu item is visible in the sidebar. + $("#documenter .docs-menu a.is-active").focus(); + } + }); + $("#documenter > .docs-main").bind("click", function (ev) { + if ($(ev.target).is(sidebar_button)) { + return; + } + if (sidebar.hasClass("visible")) { + sidebar.removeClass("visible"); + } + }); +}); + +// Resizes the package name / sitename in the sidebar if it is too wide. +// Inspired by: https://github.com/davatron5000/FitText.js +$(document).ready(function () { + e = $("#documenter .docs-autofit"); + function resize() { + var L = parseInt(e.css("max-width"), 10); + var L0 = e.width(); + if (L0 > L) { + var h0 = parseInt(e.css("font-size"), 10); + e.css("font-size", (L * h0) / L0); + // TODO: make sure it survives resizes? + } + } + // call once and then register events + resize(); + $(window).resize(resize); + $(window).on("orientationchange", resize); +}); + +// Scroll the navigation bar to the currently selected menu item +$(document).ready(function () { + var sidebar = $("#documenter .docs-menu").get(0); + var active = $("#documenter .docs-menu .is-active").get(0); + if (typeof active !== "undefined") { + sidebar.scrollTop = active.offsetTop - sidebar.offsetTop - 15; + } +}); + +}) +//////////////////////////////////////////////////////////////////////////////// +require(['jquery'], function($) { + +// Theme picker setup +$(document).ready(function () { + // onchange callback + $("#documenter-themepicker").change(function themepick_callback(ev) { + var themename = $("#documenter-themepicker option:selected").attr("value"); + if (themename === "auto") { + // set_theme(window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light'); + window.localStorage.removeItem("documenter-theme"); + } else { + // set_theme(themename); + window.localStorage.setItem("documenter-theme", themename); + } + // We re-use the global function from themeswap.js to actually do the swapping. + set_theme_from_local_storage(); + }); + + // Make sure that the themepicker displays the correct theme when the theme is retrieved + // from localStorage + if (typeof window.localStorage !== "undefined") { + var theme = window.localStorage.getItem("documenter-theme"); + if (theme !== null) { + $("#documenter-themepicker option").each(function (i, e) { + e.selected = e.value === theme; + }); + } + } +}); + +}) +//////////////////////////////////////////////////////////////////////////////// +require(['jquery'], function($) { + +// update the version selector with info from the siteinfo.js and ../versions.js files +$(document).ready(function () { + // If the version selector is disabled with DOCUMENTER_VERSION_SELECTOR_DISABLED in the + // siteinfo.js file, we just return immediately and not display the version selector. + if ( + typeof DOCUMENTER_VERSION_SELECTOR_DISABLED === "boolean" && + DOCUMENTER_VERSION_SELECTOR_DISABLED + ) { + return; + } + + var version_selector = $("#documenter .docs-version-selector"); + var version_selector_select = $("#documenter .docs-version-selector select"); + + version_selector_select.change(function (x) { + target_href = version_selector_select + .children("option:selected") + .get(0).value; + window.location.href = target_href; + }); + + // add the current version to the selector based on siteinfo.js, but only if the selector is empty + if ( + typeof DOCUMENTER_CURRENT_VERSION !== "undefined" && + $("#version-selector > option").length == 0 + ) { + var option = $( + "" + ); + version_selector_select.append(option); + } + + if (typeof DOC_VERSIONS !== "undefined") { + var existing_versions = version_selector_select.children("option"); + var existing_versions_texts = existing_versions.map(function (i, x) { + return x.text; + }); + DOC_VERSIONS.forEach(function (each) { + var version_url = documenterBaseURL + "/../" + each + "/"; + var existing_id = $.inArray(each, existing_versions_texts); + // if not already in the version selector, add it as a new option, + // otherwise update the old option with the URL and enable it + if (existing_id == -1) { + var option = $( + "" + ); + version_selector_select.append(option); + } else { + var option = existing_versions[existing_id]; + option.value = version_url; + option.disabled = false; + } + }); + } + + // only show the version selector if the selector has been populated + if (version_selector_select.children("option").length > 0) { + version_selector.toggleClass("visible"); + } +}); + +}) diff --git a/v1.8.0/assets/themes/documenter-dark.css b/v1.8.0/assets/themes/documenter-dark.css new file mode 100644 index 000000000..53889fb99 --- /dev/null +++ b/v1.8.0/assets/themes/documenter-dark.css @@ -0,0 +1,7 @@ +html.theme--documenter-dark .pagination-previous,html.theme--documenter-dark .pagination-next,html.theme--documenter-dark .pagination-link,html.theme--documenter-dark .pagination-ellipsis,html.theme--documenter-dark .file-cta,html.theme--documenter-dark .file-name,html.theme--documenter-dark .select select,html.theme--documenter-dark .textarea,html.theme--documenter-dark .input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input,html.theme--documenter-dark .button{-moz-appearance:none;-webkit-appearance:none;align-items:center;border:1px solid transparent;border-radius:.4em;box-shadow:none;display:inline-flex;font-size:1rem;height:2.5em;justify-content:flex-start;line-height:1.5;padding-bottom:calc(0.5em - 1px);padding-left:calc(0.75em - 1px);padding-right:calc(0.75em - 1px);padding-top:calc(0.5em - 1px);position:relative;vertical-align:top}html.theme--documenter-dark .pagination-previous:focus,html.theme--documenter-dark .pagination-next:focus,html.theme--documenter-dark .pagination-link:focus,html.theme--documenter-dark .pagination-ellipsis:focus,html.theme--documenter-dark .file-cta:focus,html.theme--documenter-dark .file-name:focus,html.theme--documenter-dark .select select:focus,html.theme--documenter-dark .textarea:focus,html.theme--documenter-dark .input:focus,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input:focus,html.theme--documenter-dark .button:focus,html.theme--documenter-dark .is-focused.pagination-previous,html.theme--documenter-dark .is-focused.pagination-next,html.theme--documenter-dark .is-focused.pagination-link,html.theme--documenter-dark .is-focused.pagination-ellipsis,html.theme--documenter-dark .is-focused.file-cta,html.theme--documenter-dark .is-focused.file-name,html.theme--documenter-dark .select select.is-focused,html.theme--documenter-dark .is-focused.textarea,html.theme--documenter-dark .is-focused.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-focused,html.theme--documenter-dark .is-focused.button,html.theme--documenter-dark .pagination-previous:active,html.theme--documenter-dark .pagination-next:active,html.theme--documenter-dark .pagination-link:active,html.theme--documenter-dark .pagination-ellipsis:active,html.theme--documenter-dark .file-cta:active,html.theme--documenter-dark .file-name:active,html.theme--documenter-dark .select select:active,html.theme--documenter-dark .textarea:active,html.theme--documenter-dark .input:active,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input:active,html.theme--documenter-dark .button:active,html.theme--documenter-dark .is-active.pagination-previous,html.theme--documenter-dark .is-active.pagination-next,html.theme--documenter-dark .is-active.pagination-link,html.theme--documenter-dark .is-active.pagination-ellipsis,html.theme--documenter-dark .is-active.file-cta,html.theme--documenter-dark .is-active.file-name,html.theme--documenter-dark .select select.is-active,html.theme--documenter-dark .is-active.textarea,html.theme--documenter-dark .is-active.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-active,html.theme--documenter-dark .is-active.button{outline:none}html.theme--documenter-dark .pagination-previous[disabled],html.theme--documenter-dark .pagination-next[disabled],html.theme--documenter-dark .pagination-link[disabled],html.theme--documenter-dark .pagination-ellipsis[disabled],html.theme--documenter-dark .file-cta[disabled],html.theme--documenter-dark .file-name[disabled],html.theme--documenter-dark .select select[disabled],html.theme--documenter-dark .textarea[disabled],html.theme--documenter-dark .input[disabled],html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input[disabled],html.theme--documenter-dark .button[disabled],fieldset[disabled] html.theme--documenter-dark .pagination-previous,html.theme--documenter-dark fieldset[disabled] .pagination-previous,fieldset[disabled] html.theme--documenter-dark .pagination-next,html.theme--documenter-dark fieldset[disabled] .pagination-next,fieldset[disabled] html.theme--documenter-dark .pagination-link,html.theme--documenter-dark fieldset[disabled] .pagination-link,fieldset[disabled] html.theme--documenter-dark .pagination-ellipsis,html.theme--documenter-dark fieldset[disabled] .pagination-ellipsis,fieldset[disabled] html.theme--documenter-dark .file-cta,html.theme--documenter-dark fieldset[disabled] .file-cta,fieldset[disabled] html.theme--documenter-dark .file-name,html.theme--documenter-dark fieldset[disabled] .file-name,fieldset[disabled] html.theme--documenter-dark .select select,fieldset[disabled] html.theme--documenter-dark .textarea,fieldset[disabled] html.theme--documenter-dark .input,fieldset[disabled] html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input,html.theme--documenter-dark fieldset[disabled] .select select,html.theme--documenter-dark .select fieldset[disabled] select,html.theme--documenter-dark fieldset[disabled] .textarea,html.theme--documenter-dark fieldset[disabled] .input,html.theme--documenter-dark fieldset[disabled] #documenter .docs-sidebar form.docs-search>input,html.theme--documenter-dark #documenter .docs-sidebar fieldset[disabled] form.docs-search>input,fieldset[disabled] html.theme--documenter-dark .button,html.theme--documenter-dark fieldset[disabled] .button{cursor:not-allowed}html.theme--documenter-dark .tabs,html.theme--documenter-dark .pagination-previous,html.theme--documenter-dark .pagination-next,html.theme--documenter-dark .pagination-link,html.theme--documenter-dark .pagination-ellipsis,html.theme--documenter-dark .breadcrumb,html.theme--documenter-dark .file,html.theme--documenter-dark .button,.is-unselectable{-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}html.theme--documenter-dark .navbar-link:not(.is-arrowless)::after,html.theme--documenter-dark .select:not(.is-multiple):not(.is-loading)::after{border:3px solid rgba(0,0,0,0);border-radius:2px;border-right:0;border-top:0;content:" ";display:block;height:0.625em;margin-top:-0.4375em;pointer-events:none;position:absolute;top:50%;transform:rotate(-45deg);transform-origin:center;width:0.625em}html.theme--documenter-dark .admonition:not(:last-child),html.theme--documenter-dark .tabs:not(:last-child),html.theme--documenter-dark .pagination:not(:last-child),html.theme--documenter-dark .message:not(:last-child),html.theme--documenter-dark .level:not(:last-child),html.theme--documenter-dark .breadcrumb:not(:last-child),html.theme--documenter-dark .block:not(:last-child),html.theme--documenter-dark .title:not(:last-child),html.theme--documenter-dark .subtitle:not(:last-child),html.theme--documenter-dark .table-container:not(:last-child),html.theme--documenter-dark .table:not(:last-child),html.theme--documenter-dark .progress:not(:last-child),html.theme--documenter-dark .notification:not(:last-child),html.theme--documenter-dark .content:not(:last-child),html.theme--documenter-dark .box:not(:last-child){margin-bottom:1.5rem}html.theme--documenter-dark .modal-close,html.theme--documenter-dark .delete{-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-moz-appearance:none;-webkit-appearance:none;background-color:rgba(10,10,10,0.2);border:none;border-radius:9999px;cursor:pointer;pointer-events:auto;display:inline-block;flex-grow:0;flex-shrink:0;font-size:0;height:20px;max-height:20px;max-width:20px;min-height:20px;min-width:20px;outline:none;position:relative;vertical-align:top;width:20px}html.theme--documenter-dark .modal-close::before,html.theme--documenter-dark .delete::before,html.theme--documenter-dark .modal-close::after,html.theme--documenter-dark .delete::after{background-color:#fff;content:"";display:block;left:50%;position:absolute;top:50%;transform:translateX(-50%) translateY(-50%) rotate(45deg);transform-origin:center center}html.theme--documenter-dark .modal-close::before,html.theme--documenter-dark .delete::before{height:2px;width:50%}html.theme--documenter-dark .modal-close::after,html.theme--documenter-dark .delete::after{height:50%;width:2px}html.theme--documenter-dark .modal-close:hover,html.theme--documenter-dark .delete:hover,html.theme--documenter-dark .modal-close:focus,html.theme--documenter-dark .delete:focus{background-color:rgba(10,10,10,0.3)}html.theme--documenter-dark .modal-close:active,html.theme--documenter-dark .delete:active{background-color:rgba(10,10,10,0.4)}html.theme--documenter-dark .is-small.modal-close,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.modal-close,html.theme--documenter-dark .is-small.delete,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.delete{height:16px;max-height:16px;max-width:16px;min-height:16px;min-width:16px;width:16px}html.theme--documenter-dark .is-medium.modal-close,html.theme--documenter-dark .is-medium.delete{height:24px;max-height:24px;max-width:24px;min-height:24px;min-width:24px;width:24px}html.theme--documenter-dark .is-large.modal-close,html.theme--documenter-dark .is-large.delete{height:32px;max-height:32px;max-width:32px;min-height:32px;min-width:32px;width:32px}html.theme--documenter-dark .control.is-loading::after,html.theme--documenter-dark .select.is-loading::after,html.theme--documenter-dark .loader,html.theme--documenter-dark .button.is-loading::after{animation:spinAround 500ms infinite linear;border:2px solid #dbdee0;border-radius:9999px;border-right-color:transparent;border-top-color:transparent;content:"";display:block;height:1em;position:relative;width:1em}html.theme--documenter-dark .hero-video,html.theme--documenter-dark .modal-background,html.theme--documenter-dark .modal,html.theme--documenter-dark .image.is-square img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-square img,html.theme--documenter-dark .image.is-square .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-square .has-ratio,html.theme--documenter-dark .image.is-1by1 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-1by1 img,html.theme--documenter-dark .image.is-1by1 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-1by1 .has-ratio,html.theme--documenter-dark .image.is-5by4 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-5by4 img,html.theme--documenter-dark .image.is-5by4 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-5by4 .has-ratio,html.theme--documenter-dark .image.is-4by3 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-4by3 img,html.theme--documenter-dark .image.is-4by3 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-4by3 .has-ratio,html.theme--documenter-dark .image.is-3by2 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by2 img,html.theme--documenter-dark .image.is-3by2 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by2 .has-ratio,html.theme--documenter-dark .image.is-5by3 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-5by3 img,html.theme--documenter-dark .image.is-5by3 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-5by3 .has-ratio,html.theme--documenter-dark .image.is-16by9 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-16by9 img,html.theme--documenter-dark .image.is-16by9 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-16by9 .has-ratio,html.theme--documenter-dark .image.is-2by1 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-2by1 img,html.theme--documenter-dark .image.is-2by1 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-2by1 .has-ratio,html.theme--documenter-dark .image.is-3by1 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by1 img,html.theme--documenter-dark .image.is-3by1 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by1 .has-ratio,html.theme--documenter-dark .image.is-4by5 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-4by5 img,html.theme--documenter-dark .image.is-4by5 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-4by5 .has-ratio,html.theme--documenter-dark .image.is-3by4 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by4 img,html.theme--documenter-dark .image.is-3by4 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by4 .has-ratio,html.theme--documenter-dark .image.is-2by3 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-2by3 img,html.theme--documenter-dark .image.is-2by3 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-2by3 .has-ratio,html.theme--documenter-dark .image.is-3by5 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by5 img,html.theme--documenter-dark .image.is-3by5 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by5 .has-ratio,html.theme--documenter-dark .image.is-9by16 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-9by16 img,html.theme--documenter-dark .image.is-9by16 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-9by16 .has-ratio,html.theme--documenter-dark .image.is-1by2 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-1by2 img,html.theme--documenter-dark .image.is-1by2 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-1by2 .has-ratio,html.theme--documenter-dark .image.is-1by3 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-1by3 img,html.theme--documenter-dark .image.is-1by3 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-1by3 .has-ratio,.is-overlay{bottom:0;left:0;position:absolute;right:0;top:0}html.theme--documenter-dark .navbar-burger{-moz-appearance:none;-webkit-appearance:none;appearance:none;background:none;border:none;color:currentColor;font-family:inherit;font-size:1em;margin:0;padding:0}/*! minireset.css v0.0.6 | MIT License | github.com/jgthms/minireset.css */html,body,p,ol,ul,li,dl,dt,dd,blockquote,figure,fieldset,legend,textarea,pre,iframe,hr,h1,h2,h3,h4,h5,h6{margin:0;padding:0}h1,h2,h3,h4,h5,h6{font-size:100%;font-weight:normal}ul{list-style:none}button,input,select,textarea{margin:0}html{box-sizing:border-box}*,*::before,*::after{box-sizing:inherit}img,video{height:auto;max-width:100%}iframe{border:0}table{border-collapse:collapse;border-spacing:0}td,th{padding:0}td:not([align]),th:not([align]){text-align:inherit}.has-text-white{color:#fff !important}a.has-text-white:hover,a.has-text-white:focus{color:#e6e6e6 !important}.has-background-white{background-color:#fff !important}.has-text-black{color:#0a0a0a !important}a.has-text-black:hover,a.has-text-black:focus{color:#000 !important}.has-background-black{background-color:#0a0a0a !important}.has-text-light{color:#ecf0f1 !important}a.has-text-light:hover,a.has-text-light:focus{color:#cfd9db !important}.has-background-light{background-color:#ecf0f1 !important}.has-text-dark{color:#282f2f !important}a.has-text-dark:hover,a.has-text-dark:focus{color:#111414 !important}.has-background-dark{background-color:#282f2f !important}.has-text-primary{color:#375a7f !important}a.has-text-primary:hover,a.has-text-primary:focus{color:#28415b !important}.has-background-primary{background-color:#375a7f !important}.has-text-primary-light{color:#f1f5f9 !important}a.has-text-primary-light:hover,a.has-text-primary-light:focus{color:#cddbe9 !important}.has-background-primary-light{background-color:#f1f5f9 !important}.has-text-primary-dark{color:#4d7eb2 !important}a.has-text-primary-dark:hover,a.has-text-primary-dark:focus{color:#7198c1 !important}.has-background-primary-dark{background-color:#4d7eb2 !important}.has-text-link{color:#1abc9c !important}a.has-text-link:hover,a.has-text-link:focus{color:#148f77 !important}.has-background-link{background-color:#1abc9c !important}.has-text-link-light{color:#edfdf9 !important}a.has-text-link-light:hover,a.has-text-link-light:focus{color:#c0f6ec !important}.has-background-link-light{background-color:#edfdf9 !important}.has-text-link-dark{color:#15987e !important}a.has-text-link-dark:hover,a.has-text-link-dark:focus{color:#1bc5a4 !important}.has-background-link-dark{background-color:#15987e !important}.has-text-info{color:#024c7d !important}a.has-text-info:hover,a.has-text-info:focus{color:#012d4b !important}.has-background-info{background-color:#024c7d !important}.has-text-info-light{color:#ebf7ff !important}a.has-text-info-light:hover,a.has-text-info-light:focus{color:#b9e2fe !important}.has-background-info-light{background-color:#ebf7ff !important}.has-text-info-dark{color:#0e9dfb !important}a.has-text-info-dark:hover,a.has-text-info-dark:focus{color:#40b1fc !important}.has-background-info-dark{background-color:#0e9dfb !important}.has-text-success{color:#008438 !important}a.has-text-success:hover,a.has-text-success:focus{color:#005122 !important}.has-background-success{background-color:#008438 !important}.has-text-success-light{color:#ebfff3 !important}a.has-text-success-light:hover,a.has-text-success-light:focus{color:#b8ffd6 !important}.has-background-success-light{background-color:#ebfff3 !important}.has-text-success-dark{color:#00eb64 !important}a.has-text-success-dark:hover,a.has-text-success-dark:focus{color:#1fff7e !important}.has-background-success-dark{background-color:#00eb64 !important}.has-text-warning{color:#ad8100 !important}a.has-text-warning:hover,a.has-text-warning:focus{color:#7a5b00 !important}.has-background-warning{background-color:#ad8100 !important}.has-text-warning-light{color:#fffaeb !important}a.has-text-warning-light:hover,a.has-text-warning-light:focus{color:#ffedb8 !important}.has-background-warning-light{background-color:#fffaeb !important}.has-text-warning-dark{color:#d19c00 !important}a.has-text-warning-dark:hover,a.has-text-warning-dark:focus{color:#ffbf05 !important}.has-background-warning-dark{background-color:#d19c00 !important}.has-text-danger{color:#9e1b0d !important}a.has-text-danger:hover,a.has-text-danger:focus{color:#6f1309 !important}.has-background-danger{background-color:#9e1b0d !important}.has-text-danger-light{color:#fdeeec !important}a.has-text-danger-light:hover,a.has-text-danger-light:focus{color:#fac3bd !important}.has-background-danger-light{background-color:#fdeeec !important}.has-text-danger-dark{color:#ec311d !important}a.has-text-danger-dark:hover,a.has-text-danger-dark:focus{color:#f05c4c !important}.has-background-danger-dark{background-color:#ec311d !important}.has-text-black-bis{color:#121212 !important}.has-background-black-bis{background-color:#121212 !important}.has-text-black-ter{color:#242424 !important}.has-background-black-ter{background-color:#242424 !important}.has-text-grey-darker{color:#282f2f !important}.has-background-grey-darker{background-color:#282f2f !important}.has-text-grey-dark{color:#343c3d !important}.has-background-grey-dark{background-color:#343c3d !important}.has-text-grey{color:#5e6d6f !important}.has-background-grey{background-color:#5e6d6f !important}.has-text-grey-light{color:#8c9b9d !important}.has-background-grey-light{background-color:#8c9b9d !important}.has-text-grey-lighter{color:#dbdee0 !important}.has-background-grey-lighter{background-color:#dbdee0 !important}.has-text-white-ter{color:#ecf0f1 !important}.has-background-white-ter{background-color:#ecf0f1 !important}.has-text-white-bis{color:#fafafa !important}.has-background-white-bis{background-color:#fafafa !important}.is-flex-direction-row{flex-direction:row !important}.is-flex-direction-row-reverse{flex-direction:row-reverse !important}.is-flex-direction-column{flex-direction:column !important}.is-flex-direction-column-reverse{flex-direction:column-reverse !important}.is-flex-wrap-nowrap{flex-wrap:nowrap !important}.is-flex-wrap-wrap{flex-wrap:wrap !important}.is-flex-wrap-wrap-reverse{flex-wrap:wrap-reverse !important}.is-justify-content-flex-start{justify-content:flex-start !important}.is-justify-content-flex-end{justify-content:flex-end !important}.is-justify-content-center{justify-content:center !important}.is-justify-content-space-between{justify-content:space-between !important}.is-justify-content-space-around{justify-content:space-around !important}.is-justify-content-space-evenly{justify-content:space-evenly !important}.is-justify-content-start{justify-content:start !important}.is-justify-content-end{justify-content:end !important}.is-justify-content-left{justify-content:left !important}.is-justify-content-right{justify-content:right !important}.is-align-content-flex-start{align-content:flex-start !important}.is-align-content-flex-end{align-content:flex-end !important}.is-align-content-center{align-content:center !important}.is-align-content-space-between{align-content:space-between !important}.is-align-content-space-around{align-content:space-around !important}.is-align-content-space-evenly{align-content:space-evenly !important}.is-align-content-stretch{align-content:stretch !important}.is-align-content-start{align-content:start !important}.is-align-content-end{align-content:end !important}.is-align-content-baseline{align-content:baseline !important}.is-align-items-stretch{align-items:stretch !important}.is-align-items-flex-start{align-items:flex-start !important}.is-align-items-flex-end{align-items:flex-end !important}.is-align-items-center{align-items:center !important}.is-align-items-baseline{align-items:baseline !important}.is-align-items-start{align-items:start !important}.is-align-items-end{align-items:end !important}.is-align-items-self-start{align-items:self-start !important}.is-align-items-self-end{align-items:self-end !important}.is-align-self-auto{align-self:auto !important}.is-align-self-flex-start{align-self:flex-start !important}.is-align-self-flex-end{align-self:flex-end !important}.is-align-self-center{align-self:center !important}.is-align-self-baseline{align-self:baseline !important}.is-align-self-stretch{align-self:stretch !important}.is-flex-grow-0{flex-grow:0 !important}.is-flex-grow-1{flex-grow:1 !important}.is-flex-grow-2{flex-grow:2 !important}.is-flex-grow-3{flex-grow:3 !important}.is-flex-grow-4{flex-grow:4 !important}.is-flex-grow-5{flex-grow:5 !important}.is-flex-shrink-0{flex-shrink:0 !important}.is-flex-shrink-1{flex-shrink:1 !important}.is-flex-shrink-2{flex-shrink:2 !important}.is-flex-shrink-3{flex-shrink:3 !important}.is-flex-shrink-4{flex-shrink:4 !important}.is-flex-shrink-5{flex-shrink:5 !important}.is-clearfix::after{clear:both;content:" ";display:table}.is-pulled-left{float:left !important}.is-pulled-right{float:right !important}.is-radiusless{border-radius:0 !important}.is-shadowless{box-shadow:none !important}.is-clickable{cursor:pointer !important;pointer-events:all !important}.is-clipped{overflow:hidden !important}.is-relative{position:relative !important}.is-marginless{margin:0 !important}.is-paddingless{padding:0 !important}.m-0{margin:0 !important}.mt-0{margin-top:0 !important}.mr-0{margin-right:0 !important}.mb-0{margin-bottom:0 !important}.ml-0{margin-left:0 !important}.mx-0{margin-left:0 !important;margin-right:0 !important}.my-0{margin-top:0 !important;margin-bottom:0 !important}.m-1{margin:.25rem !important}.mt-1{margin-top:.25rem !important}.mr-1{margin-right:.25rem !important}.mb-1{margin-bottom:.25rem !important}.ml-1{margin-left:.25rem !important}.mx-1{margin-left:.25rem !important;margin-right:.25rem !important}.my-1{margin-top:.25rem !important;margin-bottom:.25rem !important}.m-2{margin:.5rem !important}.mt-2{margin-top:.5rem !important}.mr-2{margin-right:.5rem !important}.mb-2{margin-bottom:.5rem !important}.ml-2{margin-left:.5rem !important}.mx-2{margin-left:.5rem !important;margin-right:.5rem !important}.my-2{margin-top:.5rem !important;margin-bottom:.5rem !important}.m-3{margin:.75rem !important}.mt-3{margin-top:.75rem !important}.mr-3{margin-right:.75rem !important}.mb-3{margin-bottom:.75rem !important}.ml-3{margin-left:.75rem !important}.mx-3{margin-left:.75rem !important;margin-right:.75rem !important}.my-3{margin-top:.75rem !important;margin-bottom:.75rem !important}.m-4{margin:1rem !important}.mt-4{margin-top:1rem !important}.mr-4{margin-right:1rem !important}.mb-4{margin-bottom:1rem !important}.ml-4{margin-left:1rem !important}.mx-4{margin-left:1rem !important;margin-right:1rem !important}.my-4{margin-top:1rem !important;margin-bottom:1rem !important}.m-5{margin:1.5rem !important}.mt-5{margin-top:1.5rem !important}.mr-5{margin-right:1.5rem !important}.mb-5{margin-bottom:1.5rem !important}.ml-5{margin-left:1.5rem !important}.mx-5{margin-left:1.5rem !important;margin-right:1.5rem !important}.my-5{margin-top:1.5rem !important;margin-bottom:1.5rem !important}.m-6{margin:3rem !important}.mt-6{margin-top:3rem !important}.mr-6{margin-right:3rem !important}.mb-6{margin-bottom:3rem !important}.ml-6{margin-left:3rem !important}.mx-6{margin-left:3rem !important;margin-right:3rem !important}.my-6{margin-top:3rem !important;margin-bottom:3rem !important}.m-auto{margin:auto !important}.mt-auto{margin-top:auto !important}.mr-auto{margin-right:auto !important}.mb-auto{margin-bottom:auto !important}.ml-auto{margin-left:auto !important}.mx-auto{margin-left:auto !important;margin-right:auto !important}.my-auto{margin-top:auto !important;margin-bottom:auto !important}.p-0{padding:0 !important}.pt-0{padding-top:0 !important}.pr-0{padding-right:0 !important}.pb-0{padding-bottom:0 !important}.pl-0{padding-left:0 !important}.px-0{padding-left:0 !important;padding-right:0 !important}.py-0{padding-top:0 !important;padding-bottom:0 !important}.p-1{padding:.25rem !important}.pt-1{padding-top:.25rem !important}.pr-1{padding-right:.25rem !important}.pb-1{padding-bottom:.25rem !important}.pl-1{padding-left:.25rem !important}.px-1{padding-left:.25rem !important;padding-right:.25rem !important}.py-1{padding-top:.25rem !important;padding-bottom:.25rem !important}.p-2{padding:.5rem !important}.pt-2{padding-top:.5rem !important}.pr-2{padding-right:.5rem !important}.pb-2{padding-bottom:.5rem !important}.pl-2{padding-left:.5rem !important}.px-2{padding-left:.5rem !important;padding-right:.5rem !important}.py-2{padding-top:.5rem !important;padding-bottom:.5rem !important}.p-3{padding:.75rem !important}.pt-3{padding-top:.75rem !important}.pr-3{padding-right:.75rem !important}.pb-3{padding-bottom:.75rem !important}.pl-3{padding-left:.75rem !important}.px-3{padding-left:.75rem !important;padding-right:.75rem !important}.py-3{padding-top:.75rem !important;padding-bottom:.75rem !important}.p-4{padding:1rem !important}.pt-4{padding-top:1rem !important}.pr-4{padding-right:1rem !important}.pb-4{padding-bottom:1rem !important}.pl-4{padding-left:1rem !important}.px-4{padding-left:1rem !important;padding-right:1rem !important}.py-4{padding-top:1rem !important;padding-bottom:1rem !important}.p-5{padding:1.5rem !important}.pt-5{padding-top:1.5rem !important}.pr-5{padding-right:1.5rem !important}.pb-5{padding-bottom:1.5rem !important}.pl-5{padding-left:1.5rem !important}.px-5{padding-left:1.5rem !important;padding-right:1.5rem !important}.py-5{padding-top:1.5rem !important;padding-bottom:1.5rem !important}.p-6{padding:3rem !important}.pt-6{padding-top:3rem !important}.pr-6{padding-right:3rem !important}.pb-6{padding-bottom:3rem !important}.pl-6{padding-left:3rem !important}.px-6{padding-left:3rem !important;padding-right:3rem !important}.py-6{padding-top:3rem !important;padding-bottom:3rem !important}.p-auto{padding:auto !important}.pt-auto{padding-top:auto !important}.pr-auto{padding-right:auto !important}.pb-auto{padding-bottom:auto !important}.pl-auto{padding-left:auto !important}.px-auto{padding-left:auto !important;padding-right:auto !important}.py-auto{padding-top:auto !important;padding-bottom:auto !important}.is-size-1{font-size:3rem !important}.is-size-2{font-size:2.5rem !important}.is-size-3{font-size:2rem !important}.is-size-4{font-size:1.5rem !important}.is-size-5{font-size:1.25rem !important}.is-size-6{font-size:1rem !important}.is-size-7,html.theme--documenter-dark .docstring>section>a.docs-sourcelink{font-size:.75rem !important}@media screen and (max-width: 768px){.is-size-1-mobile{font-size:3rem !important}.is-size-2-mobile{font-size:2.5rem !important}.is-size-3-mobile{font-size:2rem !important}.is-size-4-mobile{font-size:1.5rem !important}.is-size-5-mobile{font-size:1.25rem !important}.is-size-6-mobile{font-size:1rem !important}.is-size-7-mobile{font-size:.75rem !important}}@media screen and (min-width: 769px),print{.is-size-1-tablet{font-size:3rem !important}.is-size-2-tablet{font-size:2.5rem !important}.is-size-3-tablet{font-size:2rem !important}.is-size-4-tablet{font-size:1.5rem !important}.is-size-5-tablet{font-size:1.25rem !important}.is-size-6-tablet{font-size:1rem !important}.is-size-7-tablet{font-size:.75rem !important}}@media screen and (max-width: 1055px){.is-size-1-touch{font-size:3rem !important}.is-size-2-touch{font-size:2.5rem !important}.is-size-3-touch{font-size:2rem !important}.is-size-4-touch{font-size:1.5rem !important}.is-size-5-touch{font-size:1.25rem !important}.is-size-6-touch{font-size:1rem !important}.is-size-7-touch{font-size:.75rem !important}}@media screen and (min-width: 1056px){.is-size-1-desktop{font-size:3rem !important}.is-size-2-desktop{font-size:2.5rem !important}.is-size-3-desktop{font-size:2rem !important}.is-size-4-desktop{font-size:1.5rem !important}.is-size-5-desktop{font-size:1.25rem !important}.is-size-6-desktop{font-size:1rem !important}.is-size-7-desktop{font-size:.75rem !important}}@media screen and (min-width: 1216px){.is-size-1-widescreen{font-size:3rem !important}.is-size-2-widescreen{font-size:2.5rem !important}.is-size-3-widescreen{font-size:2rem !important}.is-size-4-widescreen{font-size:1.5rem !important}.is-size-5-widescreen{font-size:1.25rem !important}.is-size-6-widescreen{font-size:1rem !important}.is-size-7-widescreen{font-size:.75rem !important}}@media screen and (min-width: 1408px){.is-size-1-fullhd{font-size:3rem !important}.is-size-2-fullhd{font-size:2.5rem !important}.is-size-3-fullhd{font-size:2rem !important}.is-size-4-fullhd{font-size:1.5rem !important}.is-size-5-fullhd{font-size:1.25rem !important}.is-size-6-fullhd{font-size:1rem !important}.is-size-7-fullhd{font-size:.75rem !important}}.has-text-centered{text-align:center !important}.has-text-justified{text-align:justify !important}.has-text-left{text-align:left !important}.has-text-right{text-align:right !important}@media screen and (max-width: 768px){.has-text-centered-mobile{text-align:center !important}}@media screen and (min-width: 769px),print{.has-text-centered-tablet{text-align:center !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.has-text-centered-tablet-only{text-align:center !important}}@media screen and (max-width: 1055px){.has-text-centered-touch{text-align:center !important}}@media screen and (min-width: 1056px){.has-text-centered-desktop{text-align:center !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.has-text-centered-desktop-only{text-align:center !important}}@media screen and (min-width: 1216px){.has-text-centered-widescreen{text-align:center !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.has-text-centered-widescreen-only{text-align:center !important}}@media screen and (min-width: 1408px){.has-text-centered-fullhd{text-align:center !important}}@media screen and (max-width: 768px){.has-text-justified-mobile{text-align:justify !important}}@media screen and (min-width: 769px),print{.has-text-justified-tablet{text-align:justify !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.has-text-justified-tablet-only{text-align:justify !important}}@media screen and (max-width: 1055px){.has-text-justified-touch{text-align:justify !important}}@media screen and (min-width: 1056px){.has-text-justified-desktop{text-align:justify !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.has-text-justified-desktop-only{text-align:justify !important}}@media screen and (min-width: 1216px){.has-text-justified-widescreen{text-align:justify !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.has-text-justified-widescreen-only{text-align:justify !important}}@media screen and (min-width: 1408px){.has-text-justified-fullhd{text-align:justify !important}}@media screen and (max-width: 768px){.has-text-left-mobile{text-align:left !important}}@media screen and (min-width: 769px),print{.has-text-left-tablet{text-align:left !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.has-text-left-tablet-only{text-align:left !important}}@media screen and (max-width: 1055px){.has-text-left-touch{text-align:left !important}}@media screen and (min-width: 1056px){.has-text-left-desktop{text-align:left !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.has-text-left-desktop-only{text-align:left !important}}@media screen and (min-width: 1216px){.has-text-left-widescreen{text-align:left !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.has-text-left-widescreen-only{text-align:left !important}}@media screen and (min-width: 1408px){.has-text-left-fullhd{text-align:left !important}}@media screen and (max-width: 768px){.has-text-right-mobile{text-align:right !important}}@media screen and (min-width: 769px),print{.has-text-right-tablet{text-align:right !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.has-text-right-tablet-only{text-align:right !important}}@media screen and (max-width: 1055px){.has-text-right-touch{text-align:right !important}}@media screen and (min-width: 1056px){.has-text-right-desktop{text-align:right !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.has-text-right-desktop-only{text-align:right !important}}@media screen and (min-width: 1216px){.has-text-right-widescreen{text-align:right !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.has-text-right-widescreen-only{text-align:right !important}}@media screen and (min-width: 1408px){.has-text-right-fullhd{text-align:right !important}}.is-capitalized{text-transform:capitalize !important}.is-lowercase{text-transform:lowercase !important}.is-uppercase{text-transform:uppercase !important}.is-italic{font-style:italic !important}.is-underlined{text-decoration:underline !important}.has-text-weight-light{font-weight:300 !important}.has-text-weight-normal{font-weight:400 !important}.has-text-weight-medium{font-weight:500 !important}.has-text-weight-semibold{font-weight:600 !important}.has-text-weight-bold{font-weight:700 !important}.is-family-primary{font-family:"Lato Medium",-apple-system,BlinkMacSystemFont,"Segoe UI","Helvetica Neue","Helvetica","Arial",sans-serif !important}.is-family-secondary{font-family:"Lato Medium",-apple-system,BlinkMacSystemFont,"Segoe UI","Helvetica Neue","Helvetica","Arial",sans-serif !important}.is-family-sans-serif{font-family:"Lato Medium",-apple-system,BlinkMacSystemFont,"Segoe UI","Helvetica Neue","Helvetica","Arial",sans-serif !important}.is-family-monospace{font-family:"JuliaMono","SFMono-Regular","Menlo","Consolas","Liberation Mono","DejaVu Sans Mono",monospace !important}.is-family-code{font-family:"JuliaMono","SFMono-Regular","Menlo","Consolas","Liberation Mono","DejaVu Sans Mono",monospace !important}.is-block{display:block !important}@media screen and (max-width: 768px){.is-block-mobile{display:block !important}}@media screen and (min-width: 769px),print{.is-block-tablet{display:block !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.is-block-tablet-only{display:block !important}}@media screen and (max-width: 1055px){.is-block-touch{display:block !important}}@media screen and (min-width: 1056px){.is-block-desktop{display:block !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.is-block-desktop-only{display:block !important}}@media screen and (min-width: 1216px){.is-block-widescreen{display:block !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.is-block-widescreen-only{display:block !important}}@media screen and (min-width: 1408px){.is-block-fullhd{display:block !important}}.is-flex{display:flex !important}@media screen and (max-width: 768px){.is-flex-mobile{display:flex !important}}@media screen and (min-width: 769px),print{.is-flex-tablet{display:flex !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.is-flex-tablet-only{display:flex !important}}@media screen and (max-width: 1055px){.is-flex-touch{display:flex !important}}@media screen and (min-width: 1056px){.is-flex-desktop{display:flex !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.is-flex-desktop-only{display:flex !important}}@media screen and (min-width: 1216px){.is-flex-widescreen{display:flex !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.is-flex-widescreen-only{display:flex !important}}@media screen and (min-width: 1408px){.is-flex-fullhd{display:flex !important}}.is-inline{display:inline !important}@media screen and (max-width: 768px){.is-inline-mobile{display:inline !important}}@media screen and (min-width: 769px),print{.is-inline-tablet{display:inline !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.is-inline-tablet-only{display:inline !important}}@media screen and (max-width: 1055px){.is-inline-touch{display:inline !important}}@media screen and (min-width: 1056px){.is-inline-desktop{display:inline !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.is-inline-desktop-only{display:inline !important}}@media screen and (min-width: 1216px){.is-inline-widescreen{display:inline !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.is-inline-widescreen-only{display:inline !important}}@media screen and (min-width: 1408px){.is-inline-fullhd{display:inline !important}}.is-inline-block{display:inline-block !important}@media screen and (max-width: 768px){.is-inline-block-mobile{display:inline-block !important}}@media screen and (min-width: 769px),print{.is-inline-block-tablet{display:inline-block !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.is-inline-block-tablet-only{display:inline-block !important}}@media screen and (max-width: 1055px){.is-inline-block-touch{display:inline-block !important}}@media screen and (min-width: 1056px){.is-inline-block-desktop{display:inline-block !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.is-inline-block-desktop-only{display:inline-block !important}}@media screen and (min-width: 1216px){.is-inline-block-widescreen{display:inline-block !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.is-inline-block-widescreen-only{display:inline-block !important}}@media screen and (min-width: 1408px){.is-inline-block-fullhd{display:inline-block !important}}.is-inline-flex{display:inline-flex !important}@media screen and (max-width: 768px){.is-inline-flex-mobile{display:inline-flex !important}}@media screen and (min-width: 769px),print{.is-inline-flex-tablet{display:inline-flex !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.is-inline-flex-tablet-only{display:inline-flex !important}}@media screen and (max-width: 1055px){.is-inline-flex-touch{display:inline-flex !important}}@media screen and (min-width: 1056px){.is-inline-flex-desktop{display:inline-flex !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.is-inline-flex-desktop-only{display:inline-flex !important}}@media screen and (min-width: 1216px){.is-inline-flex-widescreen{display:inline-flex !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.is-inline-flex-widescreen-only{display:inline-flex !important}}@media screen and (min-width: 1408px){.is-inline-flex-fullhd{display:inline-flex !important}}.is-hidden{display:none !important}.is-sr-only{border:none !important;clip:rect(0, 0, 0, 0) !important;height:0.01em !important;overflow:hidden !important;padding:0 !important;position:absolute !important;white-space:nowrap !important;width:0.01em !important}@media screen and (max-width: 768px){.is-hidden-mobile{display:none !important}}@media screen and (min-width: 769px),print{.is-hidden-tablet{display:none !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.is-hidden-tablet-only{display:none !important}}@media screen and (max-width: 1055px){.is-hidden-touch{display:none !important}}@media screen and (min-width: 1056px){.is-hidden-desktop{display:none !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.is-hidden-desktop-only{display:none !important}}@media screen and (min-width: 1216px){.is-hidden-widescreen{display:none !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.is-hidden-widescreen-only{display:none !important}}@media screen and (min-width: 1408px){.is-hidden-fullhd{display:none !important}}.is-invisible{visibility:hidden !important}@media screen and (max-width: 768px){.is-invisible-mobile{visibility:hidden !important}}@media screen and (min-width: 769px),print{.is-invisible-tablet{visibility:hidden !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.is-invisible-tablet-only{visibility:hidden !important}}@media screen and (max-width: 1055px){.is-invisible-touch{visibility:hidden !important}}@media screen and (min-width: 1056px){.is-invisible-desktop{visibility:hidden !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.is-invisible-desktop-only{visibility:hidden !important}}@media screen and (min-width: 1216px){.is-invisible-widescreen{visibility:hidden !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.is-invisible-widescreen-only{visibility:hidden !important}}@media screen and (min-width: 1408px){.is-invisible-fullhd{visibility:hidden !important}}html.theme--documenter-dark{/*! + Theme: a11y-dark + Author: @ericwbailey + Maintainer: @ericwbailey + + Based on the Tomorrow Night Eighties theme: https://github.com/isagalaev/highlight.js/blob/master/src/styles/tomorrow-night-eighties.css +*/}html.theme--documenter-dark html{background-color:#1f2424;font-size:16px;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;min-width:300px;overflow-x:auto;overflow-y:scroll;text-rendering:optimizeLegibility;text-size-adjust:100%}html.theme--documenter-dark article,html.theme--documenter-dark aside,html.theme--documenter-dark figure,html.theme--documenter-dark footer,html.theme--documenter-dark header,html.theme--documenter-dark hgroup,html.theme--documenter-dark section{display:block}html.theme--documenter-dark body,html.theme--documenter-dark button,html.theme--documenter-dark input,html.theme--documenter-dark optgroup,html.theme--documenter-dark select,html.theme--documenter-dark textarea{font-family:"Lato Medium",-apple-system,BlinkMacSystemFont,"Segoe UI","Helvetica Neue","Helvetica","Arial",sans-serif}html.theme--documenter-dark code,html.theme--documenter-dark pre{-moz-osx-font-smoothing:auto;-webkit-font-smoothing:auto;font-family:"JuliaMono","SFMono-Regular","Menlo","Consolas","Liberation Mono","DejaVu Sans Mono",monospace}html.theme--documenter-dark body{color:#fff;font-size:1em;font-weight:400;line-height:1.5}html.theme--documenter-dark a{color:#1abc9c;cursor:pointer;text-decoration:none}html.theme--documenter-dark a strong{color:currentColor}html.theme--documenter-dark a:hover{color:#1dd2af}html.theme--documenter-dark code{background-color:rgba(255,255,255,0.05);color:#ececec;font-size:.875em;font-weight:normal;padding:.1em}html.theme--documenter-dark hr{background-color:#282f2f;border:none;display:block;height:2px;margin:1.5rem 0}html.theme--documenter-dark img{height:auto;max-width:100%}html.theme--documenter-dark input[type="checkbox"],html.theme--documenter-dark input[type="radio"]{vertical-align:baseline}html.theme--documenter-dark small{font-size:.875em}html.theme--documenter-dark span{font-style:inherit;font-weight:inherit}html.theme--documenter-dark strong{color:#f2f2f2;font-weight:700}html.theme--documenter-dark fieldset{border:none}html.theme--documenter-dark pre{-webkit-overflow-scrolling:touch;background-color:#282f2f;color:#fff;font-size:.875em;overflow-x:auto;padding:1.25rem 1.5rem;white-space:pre;word-wrap:normal}html.theme--documenter-dark pre code{background-color:transparent;color:currentColor;font-size:1em;padding:0}html.theme--documenter-dark table td,html.theme--documenter-dark table th{vertical-align:top}html.theme--documenter-dark table td:not([align]),html.theme--documenter-dark table th:not([align]){text-align:inherit}html.theme--documenter-dark table th{color:#f2f2f2}html.theme--documenter-dark .box{background-color:#343c3d;border-radius:8px;box-shadow:none;color:#fff;display:block;padding:1.25rem}html.theme--documenter-dark a.box:hover,html.theme--documenter-dark a.box:focus{box-shadow:0 0.5em 1em -0.125em rgba(10,10,10,0.1),0 0 0 1px #1abc9c}html.theme--documenter-dark a.box:active{box-shadow:inset 0 1px 2px rgba(10,10,10,0.2),0 0 0 1px #1abc9c}html.theme--documenter-dark .button{background-color:#282f2f;border-color:#4c5759;border-width:1px;color:#375a7f;cursor:pointer;justify-content:center;padding-bottom:calc(0.5em - 1px);padding-left:1em;padding-right:1em;padding-top:calc(0.5em - 1px);text-align:center;white-space:nowrap}html.theme--documenter-dark .button strong{color:inherit}html.theme--documenter-dark .button .icon,html.theme--documenter-dark .button .icon.is-small,html.theme--documenter-dark .button #documenter .docs-sidebar form.docs-search>input.icon,html.theme--documenter-dark #documenter .docs-sidebar .button form.docs-search>input.icon,html.theme--documenter-dark .button .icon.is-medium,html.theme--documenter-dark .button .icon.is-large{height:1.5em;width:1.5em}html.theme--documenter-dark .button .icon:first-child:not(:last-child){margin-left:calc(-0.5em - 1px);margin-right:.25em}html.theme--documenter-dark .button .icon:last-child:not(:first-child){margin-left:.25em;margin-right:calc(-0.5em - 1px)}html.theme--documenter-dark .button .icon:first-child:last-child{margin-left:calc(-0.5em - 1px);margin-right:calc(-0.5em - 1px)}html.theme--documenter-dark .button:hover,html.theme--documenter-dark .button.is-hovered{border-color:#8c9b9d;color:#f2f2f2}html.theme--documenter-dark .button:focus,html.theme--documenter-dark .button.is-focused{border-color:#8c9b9d;color:#17a689}html.theme--documenter-dark .button:focus:not(:active),html.theme--documenter-dark .button.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(26,188,156,0.25)}html.theme--documenter-dark .button:active,html.theme--documenter-dark .button.is-active{border-color:#343c3d;color:#f2f2f2}html.theme--documenter-dark .button.is-text{background-color:transparent;border-color:transparent;color:#fff;text-decoration:underline}html.theme--documenter-dark .button.is-text:hover,html.theme--documenter-dark .button.is-text.is-hovered,html.theme--documenter-dark .button.is-text:focus,html.theme--documenter-dark .button.is-text.is-focused{background-color:#282f2f;color:#f2f2f2}html.theme--documenter-dark .button.is-text:active,html.theme--documenter-dark .button.is-text.is-active{background-color:#1d2122;color:#f2f2f2}html.theme--documenter-dark .button.is-text[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-text{background-color:transparent;border-color:transparent;box-shadow:none}html.theme--documenter-dark .button.is-ghost{background:none;border-color:rgba(0,0,0,0);color:#1abc9c;text-decoration:none}html.theme--documenter-dark .button.is-ghost:hover,html.theme--documenter-dark .button.is-ghost.is-hovered{color:#1abc9c;text-decoration:underline}html.theme--documenter-dark .button.is-white{background-color:#fff;border-color:transparent;color:#0a0a0a}html.theme--documenter-dark .button.is-white:hover,html.theme--documenter-dark .button.is-white.is-hovered{background-color:#f9f9f9;border-color:transparent;color:#0a0a0a}html.theme--documenter-dark .button.is-white:focus,html.theme--documenter-dark .button.is-white.is-focused{border-color:transparent;color:#0a0a0a}html.theme--documenter-dark .button.is-white:focus:not(:active),html.theme--documenter-dark .button.is-white.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(255,255,255,0.25)}html.theme--documenter-dark .button.is-white:active,html.theme--documenter-dark .button.is-white.is-active{background-color:#f2f2f2;border-color:transparent;color:#0a0a0a}html.theme--documenter-dark .button.is-white[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-white{background-color:#fff;border-color:#fff;box-shadow:none}html.theme--documenter-dark .button.is-white.is-inverted{background-color:#0a0a0a;color:#fff}html.theme--documenter-dark .button.is-white.is-inverted:hover,html.theme--documenter-dark .button.is-white.is-inverted.is-hovered{background-color:#000}html.theme--documenter-dark .button.is-white.is-inverted[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-white.is-inverted{background-color:#0a0a0a;border-color:transparent;box-shadow:none;color:#fff}html.theme--documenter-dark .button.is-white.is-loading::after{border-color:transparent transparent #0a0a0a #0a0a0a !important}html.theme--documenter-dark .button.is-white.is-outlined{background-color:transparent;border-color:#fff;color:#fff}html.theme--documenter-dark .button.is-white.is-outlined:hover,html.theme--documenter-dark .button.is-white.is-outlined.is-hovered,html.theme--documenter-dark .button.is-white.is-outlined:focus,html.theme--documenter-dark .button.is-white.is-outlined.is-focused{background-color:#fff;border-color:#fff;color:#0a0a0a}html.theme--documenter-dark .button.is-white.is-outlined.is-loading::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-white.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-white.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-white.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-white.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #0a0a0a #0a0a0a !important}html.theme--documenter-dark .button.is-white.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-white.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}html.theme--documenter-dark .button.is-white.is-inverted.is-outlined{background-color:transparent;border-color:#0a0a0a;color:#0a0a0a}html.theme--documenter-dark .button.is-white.is-inverted.is-outlined:hover,html.theme--documenter-dark .button.is-white.is-inverted.is-outlined.is-hovered,html.theme--documenter-dark .button.is-white.is-inverted.is-outlined:focus,html.theme--documenter-dark .button.is-white.is-inverted.is-outlined.is-focused{background-color:#0a0a0a;color:#fff}html.theme--documenter-dark .button.is-white.is-inverted.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-white.is-inverted.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-white.is-inverted.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-white.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-white.is-inverted.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-white.is-inverted.is-outlined{background-color:transparent;border-color:#0a0a0a;box-shadow:none;color:#0a0a0a}html.theme--documenter-dark .button.is-black{background-color:#0a0a0a;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-black:hover,html.theme--documenter-dark .button.is-black.is-hovered{background-color:#040404;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-black:focus,html.theme--documenter-dark .button.is-black.is-focused{border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-black:focus:not(:active),html.theme--documenter-dark .button.is-black.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(10,10,10,0.25)}html.theme--documenter-dark .button.is-black:active,html.theme--documenter-dark .button.is-black.is-active{background-color:#000;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-black[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-black{background-color:#0a0a0a;border-color:#0a0a0a;box-shadow:none}html.theme--documenter-dark .button.is-black.is-inverted{background-color:#fff;color:#0a0a0a}html.theme--documenter-dark .button.is-black.is-inverted:hover,html.theme--documenter-dark .button.is-black.is-inverted.is-hovered{background-color:#f2f2f2}html.theme--documenter-dark .button.is-black.is-inverted[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-black.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#0a0a0a}html.theme--documenter-dark .button.is-black.is-loading::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-black.is-outlined{background-color:transparent;border-color:#0a0a0a;color:#0a0a0a}html.theme--documenter-dark .button.is-black.is-outlined:hover,html.theme--documenter-dark .button.is-black.is-outlined.is-hovered,html.theme--documenter-dark .button.is-black.is-outlined:focus,html.theme--documenter-dark .button.is-black.is-outlined.is-focused{background-color:#0a0a0a;border-color:#0a0a0a;color:#fff}html.theme--documenter-dark .button.is-black.is-outlined.is-loading::after{border-color:transparent transparent #0a0a0a #0a0a0a !important}html.theme--documenter-dark .button.is-black.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-black.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-black.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-black.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-black.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-black.is-outlined{background-color:transparent;border-color:#0a0a0a;box-shadow:none;color:#0a0a0a}html.theme--documenter-dark .button.is-black.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}html.theme--documenter-dark .button.is-black.is-inverted.is-outlined:hover,html.theme--documenter-dark .button.is-black.is-inverted.is-outlined.is-hovered,html.theme--documenter-dark .button.is-black.is-inverted.is-outlined:focus,html.theme--documenter-dark .button.is-black.is-inverted.is-outlined.is-focused{background-color:#fff;color:#0a0a0a}html.theme--documenter-dark .button.is-black.is-inverted.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-black.is-inverted.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-black.is-inverted.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-black.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #0a0a0a #0a0a0a !important}html.theme--documenter-dark .button.is-black.is-inverted.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-black.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}html.theme--documenter-dark .button.is-light{background-color:#ecf0f1;border-color:transparent;color:rgba(0,0,0,0.7)}html.theme--documenter-dark .button.is-light:hover,html.theme--documenter-dark .button.is-light.is-hovered{background-color:#e5eaec;border-color:transparent;color:rgba(0,0,0,0.7)}html.theme--documenter-dark .button.is-light:focus,html.theme--documenter-dark .button.is-light.is-focused{border-color:transparent;color:rgba(0,0,0,0.7)}html.theme--documenter-dark .button.is-light:focus:not(:active),html.theme--documenter-dark .button.is-light.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(236,240,241,0.25)}html.theme--documenter-dark .button.is-light:active,html.theme--documenter-dark .button.is-light.is-active{background-color:#dde4e6;border-color:transparent;color:rgba(0,0,0,0.7)}html.theme--documenter-dark .button.is-light[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-light{background-color:#ecf0f1;border-color:#ecf0f1;box-shadow:none}html.theme--documenter-dark .button.is-light.is-inverted{background-color:rgba(0,0,0,0.7);color:#ecf0f1}html.theme--documenter-dark .button.is-light.is-inverted:hover,html.theme--documenter-dark .button.is-light.is-inverted.is-hovered{background-color:rgba(0,0,0,0.7)}html.theme--documenter-dark .button.is-light.is-inverted[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-light.is-inverted{background-color:rgba(0,0,0,0.7);border-color:transparent;box-shadow:none;color:#ecf0f1}html.theme--documenter-dark .button.is-light.is-loading::after{border-color:transparent transparent rgba(0,0,0,0.7) rgba(0,0,0,0.7) !important}html.theme--documenter-dark .button.is-light.is-outlined{background-color:transparent;border-color:#ecf0f1;color:#ecf0f1}html.theme--documenter-dark .button.is-light.is-outlined:hover,html.theme--documenter-dark .button.is-light.is-outlined.is-hovered,html.theme--documenter-dark .button.is-light.is-outlined:focus,html.theme--documenter-dark .button.is-light.is-outlined.is-focused{background-color:#ecf0f1;border-color:#ecf0f1;color:rgba(0,0,0,0.7)}html.theme--documenter-dark .button.is-light.is-outlined.is-loading::after{border-color:transparent transparent #ecf0f1 #ecf0f1 !important}html.theme--documenter-dark .button.is-light.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-light.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-light.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-light.is-outlined.is-loading.is-focused::after{border-color:transparent transparent rgba(0,0,0,0.7) rgba(0,0,0,0.7) !important}html.theme--documenter-dark .button.is-light.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-light.is-outlined{background-color:transparent;border-color:#ecf0f1;box-shadow:none;color:#ecf0f1}html.theme--documenter-dark .button.is-light.is-inverted.is-outlined{background-color:transparent;border-color:rgba(0,0,0,0.7);color:rgba(0,0,0,0.7)}html.theme--documenter-dark .button.is-light.is-inverted.is-outlined:hover,html.theme--documenter-dark .button.is-light.is-inverted.is-outlined.is-hovered,html.theme--documenter-dark .button.is-light.is-inverted.is-outlined:focus,html.theme--documenter-dark .button.is-light.is-inverted.is-outlined.is-focused{background-color:rgba(0,0,0,0.7);color:#ecf0f1}html.theme--documenter-dark .button.is-light.is-inverted.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-light.is-inverted.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-light.is-inverted.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-light.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #ecf0f1 #ecf0f1 !important}html.theme--documenter-dark .button.is-light.is-inverted.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-light.is-inverted.is-outlined{background-color:transparent;border-color:rgba(0,0,0,0.7);box-shadow:none;color:rgba(0,0,0,0.7)}html.theme--documenter-dark .button.is-dark,html.theme--documenter-dark .content kbd.button{background-color:#282f2f;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-dark:hover,html.theme--documenter-dark .content kbd.button:hover,html.theme--documenter-dark .button.is-dark.is-hovered,html.theme--documenter-dark .content kbd.button.is-hovered{background-color:#232829;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-dark:focus,html.theme--documenter-dark .content kbd.button:focus,html.theme--documenter-dark .button.is-dark.is-focused,html.theme--documenter-dark .content kbd.button.is-focused{border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-dark:focus:not(:active),html.theme--documenter-dark .content kbd.button:focus:not(:active),html.theme--documenter-dark .button.is-dark.is-focused:not(:active),html.theme--documenter-dark .content kbd.button.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(40,47,47,0.25)}html.theme--documenter-dark .button.is-dark:active,html.theme--documenter-dark .content kbd.button:active,html.theme--documenter-dark .button.is-dark.is-active,html.theme--documenter-dark .content kbd.button.is-active{background-color:#1d2122;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-dark[disabled],html.theme--documenter-dark .content kbd.button[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-dark,fieldset[disabled] html.theme--documenter-dark .content kbd.button{background-color:#282f2f;border-color:#282f2f;box-shadow:none}html.theme--documenter-dark .button.is-dark.is-inverted,html.theme--documenter-dark .content kbd.button.is-inverted{background-color:#fff;color:#282f2f}html.theme--documenter-dark .button.is-dark.is-inverted:hover,html.theme--documenter-dark .content kbd.button.is-inverted:hover,html.theme--documenter-dark .button.is-dark.is-inverted.is-hovered,html.theme--documenter-dark .content kbd.button.is-inverted.is-hovered{background-color:#f2f2f2}html.theme--documenter-dark .button.is-dark.is-inverted[disabled],html.theme--documenter-dark .content kbd.button.is-inverted[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-dark.is-inverted,fieldset[disabled] html.theme--documenter-dark .content kbd.button.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#282f2f}html.theme--documenter-dark .button.is-dark.is-loading::after,html.theme--documenter-dark .content kbd.button.is-loading::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-dark.is-outlined,html.theme--documenter-dark .content kbd.button.is-outlined{background-color:transparent;border-color:#282f2f;color:#282f2f}html.theme--documenter-dark .button.is-dark.is-outlined:hover,html.theme--documenter-dark .content kbd.button.is-outlined:hover,html.theme--documenter-dark .button.is-dark.is-outlined.is-hovered,html.theme--documenter-dark .content kbd.button.is-outlined.is-hovered,html.theme--documenter-dark .button.is-dark.is-outlined:focus,html.theme--documenter-dark .content kbd.button.is-outlined:focus,html.theme--documenter-dark .button.is-dark.is-outlined.is-focused,html.theme--documenter-dark .content kbd.button.is-outlined.is-focused{background-color:#282f2f;border-color:#282f2f;color:#fff}html.theme--documenter-dark .button.is-dark.is-outlined.is-loading::after,html.theme--documenter-dark .content kbd.button.is-outlined.is-loading::after{border-color:transparent transparent #282f2f #282f2f !important}html.theme--documenter-dark .button.is-dark.is-outlined.is-loading:hover::after,html.theme--documenter-dark .content kbd.button.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-dark.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .content kbd.button.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-dark.is-outlined.is-loading:focus::after,html.theme--documenter-dark .content kbd.button.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-dark.is-outlined.is-loading.is-focused::after,html.theme--documenter-dark .content kbd.button.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-dark.is-outlined[disabled],html.theme--documenter-dark .content kbd.button.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-dark.is-outlined,fieldset[disabled] html.theme--documenter-dark .content kbd.button.is-outlined{background-color:transparent;border-color:#282f2f;box-shadow:none;color:#282f2f}html.theme--documenter-dark .button.is-dark.is-inverted.is-outlined,html.theme--documenter-dark .content kbd.button.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}html.theme--documenter-dark .button.is-dark.is-inverted.is-outlined:hover,html.theme--documenter-dark .content kbd.button.is-inverted.is-outlined:hover,html.theme--documenter-dark .button.is-dark.is-inverted.is-outlined.is-hovered,html.theme--documenter-dark .content kbd.button.is-inverted.is-outlined.is-hovered,html.theme--documenter-dark .button.is-dark.is-inverted.is-outlined:focus,html.theme--documenter-dark .content kbd.button.is-inverted.is-outlined:focus,html.theme--documenter-dark .button.is-dark.is-inverted.is-outlined.is-focused,html.theme--documenter-dark .content kbd.button.is-inverted.is-outlined.is-focused{background-color:#fff;color:#282f2f}html.theme--documenter-dark .button.is-dark.is-inverted.is-outlined.is-loading:hover::after,html.theme--documenter-dark .content kbd.button.is-inverted.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-dark.is-inverted.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .content kbd.button.is-inverted.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-dark.is-inverted.is-outlined.is-loading:focus::after,html.theme--documenter-dark .content kbd.button.is-inverted.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-dark.is-inverted.is-outlined.is-loading.is-focused::after,html.theme--documenter-dark .content kbd.button.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #282f2f #282f2f !important}html.theme--documenter-dark .button.is-dark.is-inverted.is-outlined[disabled],html.theme--documenter-dark .content kbd.button.is-inverted.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-dark.is-inverted.is-outlined,fieldset[disabled] html.theme--documenter-dark .content kbd.button.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}html.theme--documenter-dark .button.is-primary,html.theme--documenter-dark .docstring>section>a.button.docs-sourcelink{background-color:#375a7f;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-primary:hover,html.theme--documenter-dark .docstring>section>a.button.docs-sourcelink:hover,html.theme--documenter-dark .button.is-primary.is-hovered,html.theme--documenter-dark .docstring>section>a.button.is-hovered.docs-sourcelink{background-color:#335476;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-primary:focus,html.theme--documenter-dark .docstring>section>a.button.docs-sourcelink:focus,html.theme--documenter-dark .button.is-primary.is-focused,html.theme--documenter-dark .docstring>section>a.button.is-focused.docs-sourcelink{border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-primary:focus:not(:active),html.theme--documenter-dark .docstring>section>a.button.docs-sourcelink:focus:not(:active),html.theme--documenter-dark .button.is-primary.is-focused:not(:active),html.theme--documenter-dark .docstring>section>a.button.is-focused.docs-sourcelink:not(:active){box-shadow:0 0 0 0.125em rgba(55,90,127,0.25)}html.theme--documenter-dark .button.is-primary:active,html.theme--documenter-dark .docstring>section>a.button.docs-sourcelink:active,html.theme--documenter-dark .button.is-primary.is-active,html.theme--documenter-dark .docstring>section>a.button.is-active.docs-sourcelink{background-color:#2f4d6d;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-primary[disabled],html.theme--documenter-dark .docstring>section>a.button.docs-sourcelink[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-primary,fieldset[disabled] html.theme--documenter-dark .docstring>section>a.button.docs-sourcelink{background-color:#375a7f;border-color:#375a7f;box-shadow:none}html.theme--documenter-dark .button.is-primary.is-inverted,html.theme--documenter-dark .docstring>section>a.button.is-inverted.docs-sourcelink{background-color:#fff;color:#375a7f}html.theme--documenter-dark .button.is-primary.is-inverted:hover,html.theme--documenter-dark .docstring>section>a.button.is-inverted.docs-sourcelink:hover,html.theme--documenter-dark .button.is-primary.is-inverted.is-hovered,html.theme--documenter-dark .docstring>section>a.button.is-inverted.is-hovered.docs-sourcelink{background-color:#f2f2f2}html.theme--documenter-dark .button.is-primary.is-inverted[disabled],html.theme--documenter-dark .docstring>section>a.button.is-inverted.docs-sourcelink[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-primary.is-inverted,fieldset[disabled] html.theme--documenter-dark .docstring>section>a.button.is-inverted.docs-sourcelink{background-color:#fff;border-color:transparent;box-shadow:none;color:#375a7f}html.theme--documenter-dark .button.is-primary.is-loading::after,html.theme--documenter-dark .docstring>section>a.button.is-loading.docs-sourcelink::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-primary.is-outlined,html.theme--documenter-dark .docstring>section>a.button.is-outlined.docs-sourcelink{background-color:transparent;border-color:#375a7f;color:#375a7f}html.theme--documenter-dark .button.is-primary.is-outlined:hover,html.theme--documenter-dark .docstring>section>a.button.is-outlined.docs-sourcelink:hover,html.theme--documenter-dark .button.is-primary.is-outlined.is-hovered,html.theme--documenter-dark .docstring>section>a.button.is-outlined.is-hovered.docs-sourcelink,html.theme--documenter-dark .button.is-primary.is-outlined:focus,html.theme--documenter-dark .docstring>section>a.button.is-outlined.docs-sourcelink:focus,html.theme--documenter-dark .button.is-primary.is-outlined.is-focused,html.theme--documenter-dark .docstring>section>a.button.is-outlined.is-focused.docs-sourcelink{background-color:#375a7f;border-color:#375a7f;color:#fff}html.theme--documenter-dark .button.is-primary.is-outlined.is-loading::after,html.theme--documenter-dark .docstring>section>a.button.is-outlined.is-loading.docs-sourcelink::after{border-color:transparent transparent #375a7f #375a7f !important}html.theme--documenter-dark .button.is-primary.is-outlined.is-loading:hover::after,html.theme--documenter-dark .docstring>section>a.button.is-outlined.is-loading.docs-sourcelink:hover::after,html.theme--documenter-dark .button.is-primary.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .docstring>section>a.button.is-outlined.is-loading.is-hovered.docs-sourcelink::after,html.theme--documenter-dark .button.is-primary.is-outlined.is-loading:focus::after,html.theme--documenter-dark .docstring>section>a.button.is-outlined.is-loading.docs-sourcelink:focus::after,html.theme--documenter-dark .button.is-primary.is-outlined.is-loading.is-focused::after,html.theme--documenter-dark .docstring>section>a.button.is-outlined.is-loading.is-focused.docs-sourcelink::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-primary.is-outlined[disabled],html.theme--documenter-dark .docstring>section>a.button.is-outlined.docs-sourcelink[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-primary.is-outlined,fieldset[disabled] html.theme--documenter-dark .docstring>section>a.button.is-outlined.docs-sourcelink{background-color:transparent;border-color:#375a7f;box-shadow:none;color:#375a7f}html.theme--documenter-dark .button.is-primary.is-inverted.is-outlined,html.theme--documenter-dark .docstring>section>a.button.is-inverted.is-outlined.docs-sourcelink{background-color:transparent;border-color:#fff;color:#fff}html.theme--documenter-dark .button.is-primary.is-inverted.is-outlined:hover,html.theme--documenter-dark .docstring>section>a.button.is-inverted.is-outlined.docs-sourcelink:hover,html.theme--documenter-dark .button.is-primary.is-inverted.is-outlined.is-hovered,html.theme--documenter-dark .docstring>section>a.button.is-inverted.is-outlined.is-hovered.docs-sourcelink,html.theme--documenter-dark .button.is-primary.is-inverted.is-outlined:focus,html.theme--documenter-dark .docstring>section>a.button.is-inverted.is-outlined.docs-sourcelink:focus,html.theme--documenter-dark .button.is-primary.is-inverted.is-outlined.is-focused,html.theme--documenter-dark .docstring>section>a.button.is-inverted.is-outlined.is-focused.docs-sourcelink{background-color:#fff;color:#375a7f}html.theme--documenter-dark .button.is-primary.is-inverted.is-outlined.is-loading:hover::after,html.theme--documenter-dark .docstring>section>a.button.is-inverted.is-outlined.is-loading.docs-sourcelink:hover::after,html.theme--documenter-dark .button.is-primary.is-inverted.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .docstring>section>a.button.is-inverted.is-outlined.is-loading.is-hovered.docs-sourcelink::after,html.theme--documenter-dark .button.is-primary.is-inverted.is-outlined.is-loading:focus::after,html.theme--documenter-dark .docstring>section>a.button.is-inverted.is-outlined.is-loading.docs-sourcelink:focus::after,html.theme--documenter-dark .button.is-primary.is-inverted.is-outlined.is-loading.is-focused::after,html.theme--documenter-dark .docstring>section>a.button.is-inverted.is-outlined.is-loading.is-focused.docs-sourcelink::after{border-color:transparent transparent #375a7f #375a7f !important}html.theme--documenter-dark .button.is-primary.is-inverted.is-outlined[disabled],html.theme--documenter-dark .docstring>section>a.button.is-inverted.is-outlined.docs-sourcelink[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-primary.is-inverted.is-outlined,fieldset[disabled] html.theme--documenter-dark .docstring>section>a.button.is-inverted.is-outlined.docs-sourcelink{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}html.theme--documenter-dark .button.is-primary.is-light,html.theme--documenter-dark .docstring>section>a.button.is-light.docs-sourcelink{background-color:#f1f5f9;color:#4d7eb2}html.theme--documenter-dark .button.is-primary.is-light:hover,html.theme--documenter-dark .docstring>section>a.button.is-light.docs-sourcelink:hover,html.theme--documenter-dark .button.is-primary.is-light.is-hovered,html.theme--documenter-dark .docstring>section>a.button.is-light.is-hovered.docs-sourcelink{background-color:#e8eef5;border-color:transparent;color:#4d7eb2}html.theme--documenter-dark .button.is-primary.is-light:active,html.theme--documenter-dark .docstring>section>a.button.is-light.docs-sourcelink:active,html.theme--documenter-dark .button.is-primary.is-light.is-active,html.theme--documenter-dark .docstring>section>a.button.is-light.is-active.docs-sourcelink{background-color:#dfe8f1;border-color:transparent;color:#4d7eb2}html.theme--documenter-dark .button.is-link{background-color:#1abc9c;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-link:hover,html.theme--documenter-dark .button.is-link.is-hovered{background-color:#18b193;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-link:focus,html.theme--documenter-dark .button.is-link.is-focused{border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-link:focus:not(:active),html.theme--documenter-dark .button.is-link.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(26,188,156,0.25)}html.theme--documenter-dark .button.is-link:active,html.theme--documenter-dark .button.is-link.is-active{background-color:#17a689;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-link[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-link{background-color:#1abc9c;border-color:#1abc9c;box-shadow:none}html.theme--documenter-dark .button.is-link.is-inverted{background-color:#fff;color:#1abc9c}html.theme--documenter-dark .button.is-link.is-inverted:hover,html.theme--documenter-dark .button.is-link.is-inverted.is-hovered{background-color:#f2f2f2}html.theme--documenter-dark .button.is-link.is-inverted[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-link.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#1abc9c}html.theme--documenter-dark .button.is-link.is-loading::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-link.is-outlined{background-color:transparent;border-color:#1abc9c;color:#1abc9c}html.theme--documenter-dark .button.is-link.is-outlined:hover,html.theme--documenter-dark .button.is-link.is-outlined.is-hovered,html.theme--documenter-dark .button.is-link.is-outlined:focus,html.theme--documenter-dark .button.is-link.is-outlined.is-focused{background-color:#1abc9c;border-color:#1abc9c;color:#fff}html.theme--documenter-dark .button.is-link.is-outlined.is-loading::after{border-color:transparent transparent #1abc9c #1abc9c !important}html.theme--documenter-dark .button.is-link.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-link.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-link.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-link.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-link.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-link.is-outlined{background-color:transparent;border-color:#1abc9c;box-shadow:none;color:#1abc9c}html.theme--documenter-dark .button.is-link.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}html.theme--documenter-dark .button.is-link.is-inverted.is-outlined:hover,html.theme--documenter-dark .button.is-link.is-inverted.is-outlined.is-hovered,html.theme--documenter-dark .button.is-link.is-inverted.is-outlined:focus,html.theme--documenter-dark .button.is-link.is-inverted.is-outlined.is-focused{background-color:#fff;color:#1abc9c}html.theme--documenter-dark .button.is-link.is-inverted.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-link.is-inverted.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-link.is-inverted.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-link.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #1abc9c #1abc9c !important}html.theme--documenter-dark .button.is-link.is-inverted.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-link.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}html.theme--documenter-dark .button.is-link.is-light{background-color:#edfdf9;color:#15987e}html.theme--documenter-dark .button.is-link.is-light:hover,html.theme--documenter-dark .button.is-link.is-light.is-hovered{background-color:#e2fbf6;border-color:transparent;color:#15987e}html.theme--documenter-dark .button.is-link.is-light:active,html.theme--documenter-dark .button.is-link.is-light.is-active{background-color:#d7f9f3;border-color:transparent;color:#15987e}html.theme--documenter-dark .button.is-info{background-color:#024c7d;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-info:hover,html.theme--documenter-dark .button.is-info.is-hovered{background-color:#024470;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-info:focus,html.theme--documenter-dark .button.is-info.is-focused{border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-info:focus:not(:active),html.theme--documenter-dark .button.is-info.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(2,76,125,0.25)}html.theme--documenter-dark .button.is-info:active,html.theme--documenter-dark .button.is-info.is-active{background-color:#023d64;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-info[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-info{background-color:#024c7d;border-color:#024c7d;box-shadow:none}html.theme--documenter-dark .button.is-info.is-inverted{background-color:#fff;color:#024c7d}html.theme--documenter-dark .button.is-info.is-inverted:hover,html.theme--documenter-dark .button.is-info.is-inverted.is-hovered{background-color:#f2f2f2}html.theme--documenter-dark .button.is-info.is-inverted[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-info.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#024c7d}html.theme--documenter-dark .button.is-info.is-loading::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-info.is-outlined{background-color:transparent;border-color:#024c7d;color:#024c7d}html.theme--documenter-dark .button.is-info.is-outlined:hover,html.theme--documenter-dark .button.is-info.is-outlined.is-hovered,html.theme--documenter-dark .button.is-info.is-outlined:focus,html.theme--documenter-dark .button.is-info.is-outlined.is-focused{background-color:#024c7d;border-color:#024c7d;color:#fff}html.theme--documenter-dark .button.is-info.is-outlined.is-loading::after{border-color:transparent transparent #024c7d #024c7d !important}html.theme--documenter-dark .button.is-info.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-info.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-info.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-info.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-info.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-info.is-outlined{background-color:transparent;border-color:#024c7d;box-shadow:none;color:#024c7d}html.theme--documenter-dark .button.is-info.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}html.theme--documenter-dark .button.is-info.is-inverted.is-outlined:hover,html.theme--documenter-dark .button.is-info.is-inverted.is-outlined.is-hovered,html.theme--documenter-dark .button.is-info.is-inverted.is-outlined:focus,html.theme--documenter-dark .button.is-info.is-inverted.is-outlined.is-focused{background-color:#fff;color:#024c7d}html.theme--documenter-dark .button.is-info.is-inverted.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-info.is-inverted.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-info.is-inverted.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-info.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #024c7d #024c7d !important}html.theme--documenter-dark .button.is-info.is-inverted.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-info.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}html.theme--documenter-dark .button.is-info.is-light{background-color:#ebf7ff;color:#0e9dfb}html.theme--documenter-dark .button.is-info.is-light:hover,html.theme--documenter-dark .button.is-info.is-light.is-hovered{background-color:#def2fe;border-color:transparent;color:#0e9dfb}html.theme--documenter-dark .button.is-info.is-light:active,html.theme--documenter-dark .button.is-info.is-light.is-active{background-color:#d2edfe;border-color:transparent;color:#0e9dfb}html.theme--documenter-dark .button.is-success{background-color:#008438;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-success:hover,html.theme--documenter-dark .button.is-success.is-hovered{background-color:#073;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-success:focus,html.theme--documenter-dark .button.is-success.is-focused{border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-success:focus:not(:active),html.theme--documenter-dark .button.is-success.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(0,132,56,0.25)}html.theme--documenter-dark .button.is-success:active,html.theme--documenter-dark .button.is-success.is-active{background-color:#006b2d;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-success[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-success{background-color:#008438;border-color:#008438;box-shadow:none}html.theme--documenter-dark .button.is-success.is-inverted{background-color:#fff;color:#008438}html.theme--documenter-dark .button.is-success.is-inverted:hover,html.theme--documenter-dark .button.is-success.is-inverted.is-hovered{background-color:#f2f2f2}html.theme--documenter-dark .button.is-success.is-inverted[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-success.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#008438}html.theme--documenter-dark .button.is-success.is-loading::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-success.is-outlined{background-color:transparent;border-color:#008438;color:#008438}html.theme--documenter-dark .button.is-success.is-outlined:hover,html.theme--documenter-dark .button.is-success.is-outlined.is-hovered,html.theme--documenter-dark .button.is-success.is-outlined:focus,html.theme--documenter-dark .button.is-success.is-outlined.is-focused{background-color:#008438;border-color:#008438;color:#fff}html.theme--documenter-dark .button.is-success.is-outlined.is-loading::after{border-color:transparent transparent #008438 #008438 !important}html.theme--documenter-dark .button.is-success.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-success.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-success.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-success.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-success.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-success.is-outlined{background-color:transparent;border-color:#008438;box-shadow:none;color:#008438}html.theme--documenter-dark .button.is-success.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}html.theme--documenter-dark .button.is-success.is-inverted.is-outlined:hover,html.theme--documenter-dark .button.is-success.is-inverted.is-outlined.is-hovered,html.theme--documenter-dark .button.is-success.is-inverted.is-outlined:focus,html.theme--documenter-dark .button.is-success.is-inverted.is-outlined.is-focused{background-color:#fff;color:#008438}html.theme--documenter-dark .button.is-success.is-inverted.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-success.is-inverted.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-success.is-inverted.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-success.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #008438 #008438 !important}html.theme--documenter-dark .button.is-success.is-inverted.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-success.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}html.theme--documenter-dark .button.is-success.is-light{background-color:#ebfff3;color:#00eb64}html.theme--documenter-dark .button.is-success.is-light:hover,html.theme--documenter-dark .button.is-success.is-light.is-hovered{background-color:#deffec;border-color:transparent;color:#00eb64}html.theme--documenter-dark .button.is-success.is-light:active,html.theme--documenter-dark .button.is-success.is-light.is-active{background-color:#d1ffe5;border-color:transparent;color:#00eb64}html.theme--documenter-dark .button.is-warning{background-color:#ad8100;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-warning:hover,html.theme--documenter-dark .button.is-warning.is-hovered{background-color:#a07700;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-warning:focus,html.theme--documenter-dark .button.is-warning.is-focused{border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-warning:focus:not(:active),html.theme--documenter-dark .button.is-warning.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(173,129,0,0.25)}html.theme--documenter-dark .button.is-warning:active,html.theme--documenter-dark .button.is-warning.is-active{background-color:#946e00;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-warning[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-warning{background-color:#ad8100;border-color:#ad8100;box-shadow:none}html.theme--documenter-dark .button.is-warning.is-inverted{background-color:#fff;color:#ad8100}html.theme--documenter-dark .button.is-warning.is-inverted:hover,html.theme--documenter-dark .button.is-warning.is-inverted.is-hovered{background-color:#f2f2f2}html.theme--documenter-dark .button.is-warning.is-inverted[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-warning.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#ad8100}html.theme--documenter-dark .button.is-warning.is-loading::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-warning.is-outlined{background-color:transparent;border-color:#ad8100;color:#ad8100}html.theme--documenter-dark .button.is-warning.is-outlined:hover,html.theme--documenter-dark .button.is-warning.is-outlined.is-hovered,html.theme--documenter-dark .button.is-warning.is-outlined:focus,html.theme--documenter-dark .button.is-warning.is-outlined.is-focused{background-color:#ad8100;border-color:#ad8100;color:#fff}html.theme--documenter-dark .button.is-warning.is-outlined.is-loading::after{border-color:transparent transparent #ad8100 #ad8100 !important}html.theme--documenter-dark .button.is-warning.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-warning.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-warning.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-warning.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-warning.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-warning.is-outlined{background-color:transparent;border-color:#ad8100;box-shadow:none;color:#ad8100}html.theme--documenter-dark .button.is-warning.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}html.theme--documenter-dark .button.is-warning.is-inverted.is-outlined:hover,html.theme--documenter-dark .button.is-warning.is-inverted.is-outlined.is-hovered,html.theme--documenter-dark .button.is-warning.is-inverted.is-outlined:focus,html.theme--documenter-dark .button.is-warning.is-inverted.is-outlined.is-focused{background-color:#fff;color:#ad8100}html.theme--documenter-dark .button.is-warning.is-inverted.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-warning.is-inverted.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-warning.is-inverted.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-warning.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #ad8100 #ad8100 !important}html.theme--documenter-dark .button.is-warning.is-inverted.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-warning.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}html.theme--documenter-dark .button.is-warning.is-light{background-color:#fffaeb;color:#d19c00}html.theme--documenter-dark .button.is-warning.is-light:hover,html.theme--documenter-dark .button.is-warning.is-light.is-hovered{background-color:#fff7de;border-color:transparent;color:#d19c00}html.theme--documenter-dark .button.is-warning.is-light:active,html.theme--documenter-dark .button.is-warning.is-light.is-active{background-color:#fff3d1;border-color:transparent;color:#d19c00}html.theme--documenter-dark .button.is-danger{background-color:#9e1b0d;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-danger:hover,html.theme--documenter-dark .button.is-danger.is-hovered{background-color:#92190c;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-danger:focus,html.theme--documenter-dark .button.is-danger.is-focused{border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-danger:focus:not(:active),html.theme--documenter-dark .button.is-danger.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(158,27,13,0.25)}html.theme--documenter-dark .button.is-danger:active,html.theme--documenter-dark .button.is-danger.is-active{background-color:#86170b;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-danger[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-danger{background-color:#9e1b0d;border-color:#9e1b0d;box-shadow:none}html.theme--documenter-dark .button.is-danger.is-inverted{background-color:#fff;color:#9e1b0d}html.theme--documenter-dark .button.is-danger.is-inverted:hover,html.theme--documenter-dark .button.is-danger.is-inverted.is-hovered{background-color:#f2f2f2}html.theme--documenter-dark .button.is-danger.is-inverted[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-danger.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#9e1b0d}html.theme--documenter-dark .button.is-danger.is-loading::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-danger.is-outlined{background-color:transparent;border-color:#9e1b0d;color:#9e1b0d}html.theme--documenter-dark .button.is-danger.is-outlined:hover,html.theme--documenter-dark .button.is-danger.is-outlined.is-hovered,html.theme--documenter-dark .button.is-danger.is-outlined:focus,html.theme--documenter-dark .button.is-danger.is-outlined.is-focused{background-color:#9e1b0d;border-color:#9e1b0d;color:#fff}html.theme--documenter-dark .button.is-danger.is-outlined.is-loading::after{border-color:transparent transparent #9e1b0d #9e1b0d !important}html.theme--documenter-dark .button.is-danger.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-danger.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-danger.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-danger.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-danger.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-danger.is-outlined{background-color:transparent;border-color:#9e1b0d;box-shadow:none;color:#9e1b0d}html.theme--documenter-dark .button.is-danger.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}html.theme--documenter-dark .button.is-danger.is-inverted.is-outlined:hover,html.theme--documenter-dark .button.is-danger.is-inverted.is-outlined.is-hovered,html.theme--documenter-dark .button.is-danger.is-inverted.is-outlined:focus,html.theme--documenter-dark .button.is-danger.is-inverted.is-outlined.is-focused{background-color:#fff;color:#9e1b0d}html.theme--documenter-dark .button.is-danger.is-inverted.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-danger.is-inverted.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-danger.is-inverted.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-danger.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #9e1b0d #9e1b0d !important}html.theme--documenter-dark .button.is-danger.is-inverted.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-danger.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}html.theme--documenter-dark .button.is-danger.is-light{background-color:#fdeeec;color:#ec311d}html.theme--documenter-dark .button.is-danger.is-light:hover,html.theme--documenter-dark .button.is-danger.is-light.is-hovered{background-color:#fce3e0;border-color:transparent;color:#ec311d}html.theme--documenter-dark .button.is-danger.is-light:active,html.theme--documenter-dark .button.is-danger.is-light.is-active{background-color:#fcd8d5;border-color:transparent;color:#ec311d}html.theme--documenter-dark .button.is-small,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.button{font-size:.75rem}html.theme--documenter-dark .button.is-small:not(.is-rounded),html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.button:not(.is-rounded){border-radius:3px}html.theme--documenter-dark .button.is-normal{font-size:1rem}html.theme--documenter-dark .button.is-medium{font-size:1.25rem}html.theme--documenter-dark .button.is-large{font-size:1.5rem}html.theme--documenter-dark .button[disabled],fieldset[disabled] html.theme--documenter-dark .button{background-color:#8c9b9d;border-color:#5e6d6f;box-shadow:none;opacity:.5}html.theme--documenter-dark .button.is-fullwidth{display:flex;width:100%}html.theme--documenter-dark .button.is-loading{color:transparent !important;pointer-events:none}html.theme--documenter-dark .button.is-loading::after{position:absolute;left:calc(50% - (1em * 0.5));top:calc(50% - (1em * 0.5));position:absolute !important}html.theme--documenter-dark .button.is-static{background-color:#282f2f;border-color:#5e6d6f;color:#dbdee0;box-shadow:none;pointer-events:none}html.theme--documenter-dark .button.is-rounded,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.button{border-radius:9999px;padding-left:calc(1em + 0.25em);padding-right:calc(1em + 0.25em)}html.theme--documenter-dark .buttons{align-items:center;display:flex;flex-wrap:wrap;justify-content:flex-start}html.theme--documenter-dark .buttons .button{margin-bottom:0.5rem}html.theme--documenter-dark .buttons .button:not(:last-child):not(.is-fullwidth){margin-right:.5rem}html.theme--documenter-dark .buttons:last-child{margin-bottom:-0.5rem}html.theme--documenter-dark .buttons:not(:last-child){margin-bottom:1rem}html.theme--documenter-dark .buttons.are-small .button:not(.is-normal):not(.is-medium):not(.is-large){font-size:.75rem}html.theme--documenter-dark .buttons.are-small .button:not(.is-normal):not(.is-medium):not(.is-large):not(.is-rounded){border-radius:3px}html.theme--documenter-dark .buttons.are-medium .button:not(.is-small):not(.is-normal):not(.is-large){font-size:1.25rem}html.theme--documenter-dark .buttons.are-large .button:not(.is-small):not(.is-normal):not(.is-medium){font-size:1.5rem}html.theme--documenter-dark .buttons.has-addons .button:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}html.theme--documenter-dark .buttons.has-addons .button:not(:last-child){border-bottom-right-radius:0;border-top-right-radius:0;margin-right:-1px}html.theme--documenter-dark .buttons.has-addons .button:last-child{margin-right:0}html.theme--documenter-dark .buttons.has-addons .button:hover,html.theme--documenter-dark .buttons.has-addons .button.is-hovered{z-index:2}html.theme--documenter-dark .buttons.has-addons .button:focus,html.theme--documenter-dark .buttons.has-addons .button.is-focused,html.theme--documenter-dark .buttons.has-addons .button:active,html.theme--documenter-dark .buttons.has-addons .button.is-active,html.theme--documenter-dark .buttons.has-addons .button.is-selected{z-index:3}html.theme--documenter-dark .buttons.has-addons .button:focus:hover,html.theme--documenter-dark .buttons.has-addons .button.is-focused:hover,html.theme--documenter-dark .buttons.has-addons .button:active:hover,html.theme--documenter-dark .buttons.has-addons .button.is-active:hover,html.theme--documenter-dark .buttons.has-addons .button.is-selected:hover{z-index:4}html.theme--documenter-dark .buttons.has-addons .button.is-expanded{flex-grow:1;flex-shrink:1}html.theme--documenter-dark .buttons.is-centered{justify-content:center}html.theme--documenter-dark .buttons.is-centered:not(.has-addons) .button:not(.is-fullwidth){margin-left:0.25rem;margin-right:0.25rem}html.theme--documenter-dark .buttons.is-right{justify-content:flex-end}html.theme--documenter-dark .buttons.is-right:not(.has-addons) .button:not(.is-fullwidth){margin-left:0.25rem;margin-right:0.25rem}@media screen and (max-width: 768px){html.theme--documenter-dark .button.is-responsive.is-small,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-responsive{font-size:.5625rem}html.theme--documenter-dark .button.is-responsive,html.theme--documenter-dark .button.is-responsive.is-normal{font-size:.65625rem}html.theme--documenter-dark .button.is-responsive.is-medium{font-size:.75rem}html.theme--documenter-dark .button.is-responsive.is-large{font-size:1rem}}@media screen and (min-width: 769px) and (max-width: 1055px){html.theme--documenter-dark .button.is-responsive.is-small,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-responsive{font-size:.65625rem}html.theme--documenter-dark .button.is-responsive,html.theme--documenter-dark .button.is-responsive.is-normal{font-size:.75rem}html.theme--documenter-dark .button.is-responsive.is-medium{font-size:1rem}html.theme--documenter-dark .button.is-responsive.is-large{font-size:1.25rem}}html.theme--documenter-dark .container{flex-grow:1;margin:0 auto;position:relative;width:auto}html.theme--documenter-dark .container.is-fluid{max-width:none !important;padding-left:32px;padding-right:32px;width:100%}@media screen and (min-width: 1056px){html.theme--documenter-dark .container{max-width:992px}}@media screen and (max-width: 1215px){html.theme--documenter-dark .container.is-widescreen:not(.is-max-desktop){max-width:1152px}}@media screen and (max-width: 1407px){html.theme--documenter-dark .container.is-fullhd:not(.is-max-desktop):not(.is-max-widescreen){max-width:1344px}}@media screen and (min-width: 1216px){html.theme--documenter-dark .container:not(.is-max-desktop){max-width:1152px}}@media screen and (min-width: 1408px){html.theme--documenter-dark .container:not(.is-max-desktop):not(.is-max-widescreen){max-width:1344px}}html.theme--documenter-dark .content li+li{margin-top:0.25em}html.theme--documenter-dark .content p:not(:last-child),html.theme--documenter-dark .content dl:not(:last-child),html.theme--documenter-dark .content ol:not(:last-child),html.theme--documenter-dark .content ul:not(:last-child),html.theme--documenter-dark .content blockquote:not(:last-child),html.theme--documenter-dark .content pre:not(:last-child),html.theme--documenter-dark .content table:not(:last-child){margin-bottom:1em}html.theme--documenter-dark .content h1,html.theme--documenter-dark .content h2,html.theme--documenter-dark .content h3,html.theme--documenter-dark .content h4,html.theme--documenter-dark .content h5,html.theme--documenter-dark .content h6{color:#f2f2f2;font-weight:600;line-height:1.125}html.theme--documenter-dark .content h1{font-size:2em;margin-bottom:0.5em}html.theme--documenter-dark .content h1:not(:first-child){margin-top:1em}html.theme--documenter-dark .content h2{font-size:1.75em;margin-bottom:0.5714em}html.theme--documenter-dark .content h2:not(:first-child){margin-top:1.1428em}html.theme--documenter-dark .content h3{font-size:1.5em;margin-bottom:0.6666em}html.theme--documenter-dark .content h3:not(:first-child){margin-top:1.3333em}html.theme--documenter-dark .content h4{font-size:1.25em;margin-bottom:0.8em}html.theme--documenter-dark .content h5{font-size:1.125em;margin-bottom:0.8888em}html.theme--documenter-dark .content h6{font-size:1em;margin-bottom:1em}html.theme--documenter-dark .content blockquote{background-color:#282f2f;border-left:5px solid #5e6d6f;padding:1.25em 1.5em}html.theme--documenter-dark .content ol{list-style-position:outside;margin-left:2em;margin-top:1em}html.theme--documenter-dark .content ol:not([type]){list-style-type:decimal}html.theme--documenter-dark .content ol.is-lower-alpha:not([type]){list-style-type:lower-alpha}html.theme--documenter-dark .content ol.is-lower-roman:not([type]){list-style-type:lower-roman}html.theme--documenter-dark .content ol.is-upper-alpha:not([type]){list-style-type:upper-alpha}html.theme--documenter-dark .content ol.is-upper-roman:not([type]){list-style-type:upper-roman}html.theme--documenter-dark .content ul{list-style:disc outside;margin-left:2em;margin-top:1em}html.theme--documenter-dark .content ul ul{list-style-type:circle;margin-top:0.5em}html.theme--documenter-dark .content ul ul ul{list-style-type:square}html.theme--documenter-dark .content dd{margin-left:2em}html.theme--documenter-dark .content figure{margin-left:2em;margin-right:2em;text-align:center}html.theme--documenter-dark .content figure:not(:first-child){margin-top:2em}html.theme--documenter-dark .content figure:not(:last-child){margin-bottom:2em}html.theme--documenter-dark .content figure img{display:inline-block}html.theme--documenter-dark .content figure figcaption{font-style:italic}html.theme--documenter-dark .content pre{-webkit-overflow-scrolling:touch;overflow-x:auto;padding:0;white-space:pre;word-wrap:normal}html.theme--documenter-dark .content sup,html.theme--documenter-dark .content sub{font-size:75%}html.theme--documenter-dark .content table{width:100%}html.theme--documenter-dark .content table td,html.theme--documenter-dark .content table th{border:1px solid #5e6d6f;border-width:0 0 1px;padding:0.5em 0.75em;vertical-align:top}html.theme--documenter-dark .content table th{color:#f2f2f2}html.theme--documenter-dark .content table th:not([align]){text-align:inherit}html.theme--documenter-dark .content table thead td,html.theme--documenter-dark .content table thead th{border-width:0 0 2px;color:#f2f2f2}html.theme--documenter-dark .content table tfoot td,html.theme--documenter-dark .content table tfoot th{border-width:2px 0 0;color:#f2f2f2}html.theme--documenter-dark .content table tbody tr:last-child td,html.theme--documenter-dark .content table tbody tr:last-child th{border-bottom-width:0}html.theme--documenter-dark .content .tabs li+li{margin-top:0}html.theme--documenter-dark .content.is-small,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.content{font-size:.75rem}html.theme--documenter-dark .content.is-normal{font-size:1rem}html.theme--documenter-dark .content.is-medium{font-size:1.25rem}html.theme--documenter-dark .content.is-large{font-size:1.5rem}html.theme--documenter-dark .icon{align-items:center;display:inline-flex;justify-content:center;height:1.5rem;width:1.5rem}html.theme--documenter-dark .icon.is-small,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.icon{height:1rem;width:1rem}html.theme--documenter-dark .icon.is-medium{height:2rem;width:2rem}html.theme--documenter-dark .icon.is-large{height:3rem;width:3rem}html.theme--documenter-dark .icon-text{align-items:flex-start;color:inherit;display:inline-flex;flex-wrap:wrap;line-height:1.5rem;vertical-align:top}html.theme--documenter-dark .icon-text .icon{flex-grow:0;flex-shrink:0}html.theme--documenter-dark .icon-text .icon:not(:last-child){margin-right:.25em}html.theme--documenter-dark .icon-text .icon:not(:first-child){margin-left:.25em}html.theme--documenter-dark div.icon-text{display:flex}html.theme--documenter-dark .image,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img{display:block;position:relative}html.theme--documenter-dark .image img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img img{display:block;height:auto;width:100%}html.theme--documenter-dark .image img.is-rounded,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img img.is-rounded{border-radius:9999px}html.theme--documenter-dark .image.is-fullwidth,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-fullwidth{width:100%}html.theme--documenter-dark .image.is-square img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-square img,html.theme--documenter-dark .image.is-square .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-square .has-ratio,html.theme--documenter-dark .image.is-1by1 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-1by1 img,html.theme--documenter-dark .image.is-1by1 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-1by1 .has-ratio,html.theme--documenter-dark .image.is-5by4 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-5by4 img,html.theme--documenter-dark .image.is-5by4 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-5by4 .has-ratio,html.theme--documenter-dark .image.is-4by3 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-4by3 img,html.theme--documenter-dark .image.is-4by3 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-4by3 .has-ratio,html.theme--documenter-dark .image.is-3by2 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by2 img,html.theme--documenter-dark .image.is-3by2 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by2 .has-ratio,html.theme--documenter-dark .image.is-5by3 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-5by3 img,html.theme--documenter-dark .image.is-5by3 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-5by3 .has-ratio,html.theme--documenter-dark .image.is-16by9 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-16by9 img,html.theme--documenter-dark .image.is-16by9 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-16by9 .has-ratio,html.theme--documenter-dark .image.is-2by1 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-2by1 img,html.theme--documenter-dark .image.is-2by1 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-2by1 .has-ratio,html.theme--documenter-dark .image.is-3by1 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by1 img,html.theme--documenter-dark .image.is-3by1 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by1 .has-ratio,html.theme--documenter-dark .image.is-4by5 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-4by5 img,html.theme--documenter-dark .image.is-4by5 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-4by5 .has-ratio,html.theme--documenter-dark .image.is-3by4 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by4 img,html.theme--documenter-dark .image.is-3by4 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by4 .has-ratio,html.theme--documenter-dark .image.is-2by3 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-2by3 img,html.theme--documenter-dark .image.is-2by3 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-2by3 .has-ratio,html.theme--documenter-dark .image.is-3by5 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by5 img,html.theme--documenter-dark .image.is-3by5 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by5 .has-ratio,html.theme--documenter-dark .image.is-9by16 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-9by16 img,html.theme--documenter-dark .image.is-9by16 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-9by16 .has-ratio,html.theme--documenter-dark .image.is-1by2 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-1by2 img,html.theme--documenter-dark .image.is-1by2 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-1by2 .has-ratio,html.theme--documenter-dark .image.is-1by3 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-1by3 img,html.theme--documenter-dark .image.is-1by3 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-1by3 .has-ratio{height:100%;width:100%}html.theme--documenter-dark .image.is-square,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-square,html.theme--documenter-dark .image.is-1by1,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-1by1{padding-top:100%}html.theme--documenter-dark .image.is-5by4,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-5by4{padding-top:80%}html.theme--documenter-dark .image.is-4by3,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-4by3{padding-top:75%}html.theme--documenter-dark .image.is-3by2,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by2{padding-top:66.6666%}html.theme--documenter-dark .image.is-5by3,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-5by3{padding-top:60%}html.theme--documenter-dark .image.is-16by9,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-16by9{padding-top:56.25%}html.theme--documenter-dark .image.is-2by1,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-2by1{padding-top:50%}html.theme--documenter-dark .image.is-3by1,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by1{padding-top:33.3333%}html.theme--documenter-dark .image.is-4by5,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-4by5{padding-top:125%}html.theme--documenter-dark .image.is-3by4,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by4{padding-top:133.3333%}html.theme--documenter-dark .image.is-2by3,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-2by3{padding-top:150%}html.theme--documenter-dark .image.is-3by5,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by5{padding-top:166.6666%}html.theme--documenter-dark .image.is-9by16,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-9by16{padding-top:177.7777%}html.theme--documenter-dark .image.is-1by2,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-1by2{padding-top:200%}html.theme--documenter-dark .image.is-1by3,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-1by3{padding-top:300%}html.theme--documenter-dark .image.is-16x16,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-16x16{height:16px;width:16px}html.theme--documenter-dark .image.is-24x24,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-24x24{height:24px;width:24px}html.theme--documenter-dark .image.is-32x32,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-32x32{height:32px;width:32px}html.theme--documenter-dark .image.is-48x48,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-48x48{height:48px;width:48px}html.theme--documenter-dark .image.is-64x64,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-64x64{height:64px;width:64px}html.theme--documenter-dark .image.is-96x96,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-96x96{height:96px;width:96px}html.theme--documenter-dark .image.is-128x128,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-128x128{height:128px;width:128px}html.theme--documenter-dark .notification{background-color:#282f2f;border-radius:.4em;position:relative;padding:1.25rem 2.5rem 1.25rem 1.5rem}html.theme--documenter-dark .notification a:not(.button):not(.dropdown-item){color:currentColor;text-decoration:underline}html.theme--documenter-dark .notification strong{color:currentColor}html.theme--documenter-dark .notification code,html.theme--documenter-dark .notification pre{background:#fff}html.theme--documenter-dark .notification pre code{background:transparent}html.theme--documenter-dark .notification>.delete{right:.5rem;position:absolute;top:0.5rem}html.theme--documenter-dark .notification .title,html.theme--documenter-dark .notification .subtitle,html.theme--documenter-dark .notification .content{color:currentColor}html.theme--documenter-dark .notification.is-white{background-color:#fff;color:#0a0a0a}html.theme--documenter-dark .notification.is-black{background-color:#0a0a0a;color:#fff}html.theme--documenter-dark .notification.is-light{background-color:#ecf0f1;color:rgba(0,0,0,0.7)}html.theme--documenter-dark .notification.is-dark,html.theme--documenter-dark .content kbd.notification{background-color:#282f2f;color:#fff}html.theme--documenter-dark .notification.is-primary,html.theme--documenter-dark .docstring>section>a.notification.docs-sourcelink{background-color:#375a7f;color:#fff}html.theme--documenter-dark .notification.is-primary.is-light,html.theme--documenter-dark .docstring>section>a.notification.is-light.docs-sourcelink{background-color:#f1f5f9;color:#4d7eb2}html.theme--documenter-dark .notification.is-link{background-color:#1abc9c;color:#fff}html.theme--documenter-dark .notification.is-link.is-light{background-color:#edfdf9;color:#15987e}html.theme--documenter-dark .notification.is-info{background-color:#024c7d;color:#fff}html.theme--documenter-dark .notification.is-info.is-light{background-color:#ebf7ff;color:#0e9dfb}html.theme--documenter-dark .notification.is-success{background-color:#008438;color:#fff}html.theme--documenter-dark .notification.is-success.is-light{background-color:#ebfff3;color:#00eb64}html.theme--documenter-dark .notification.is-warning{background-color:#ad8100;color:#fff}html.theme--documenter-dark .notification.is-warning.is-light{background-color:#fffaeb;color:#d19c00}html.theme--documenter-dark .notification.is-danger{background-color:#9e1b0d;color:#fff}html.theme--documenter-dark .notification.is-danger.is-light{background-color:#fdeeec;color:#ec311d}html.theme--documenter-dark .progress{-moz-appearance:none;-webkit-appearance:none;border:none;border-radius:9999px;display:block;height:1rem;overflow:hidden;padding:0;width:100%}html.theme--documenter-dark .progress::-webkit-progress-bar{background-color:#343c3d}html.theme--documenter-dark .progress::-webkit-progress-value{background-color:#dbdee0}html.theme--documenter-dark .progress::-moz-progress-bar{background-color:#dbdee0}html.theme--documenter-dark .progress::-ms-fill{background-color:#dbdee0;border:none}html.theme--documenter-dark .progress.is-white::-webkit-progress-value{background-color:#fff}html.theme--documenter-dark .progress.is-white::-moz-progress-bar{background-color:#fff}html.theme--documenter-dark .progress.is-white::-ms-fill{background-color:#fff}html.theme--documenter-dark .progress.is-white:indeterminate{background-image:linear-gradient(to right, #fff 30%, #343c3d 30%)}html.theme--documenter-dark .progress.is-black::-webkit-progress-value{background-color:#0a0a0a}html.theme--documenter-dark .progress.is-black::-moz-progress-bar{background-color:#0a0a0a}html.theme--documenter-dark .progress.is-black::-ms-fill{background-color:#0a0a0a}html.theme--documenter-dark .progress.is-black:indeterminate{background-image:linear-gradient(to right, #0a0a0a 30%, #343c3d 30%)}html.theme--documenter-dark .progress.is-light::-webkit-progress-value{background-color:#ecf0f1}html.theme--documenter-dark .progress.is-light::-moz-progress-bar{background-color:#ecf0f1}html.theme--documenter-dark .progress.is-light::-ms-fill{background-color:#ecf0f1}html.theme--documenter-dark .progress.is-light:indeterminate{background-image:linear-gradient(to right, #ecf0f1 30%, #343c3d 30%)}html.theme--documenter-dark .progress.is-dark::-webkit-progress-value,html.theme--documenter-dark .content kbd.progress::-webkit-progress-value{background-color:#282f2f}html.theme--documenter-dark .progress.is-dark::-moz-progress-bar,html.theme--documenter-dark .content kbd.progress::-moz-progress-bar{background-color:#282f2f}html.theme--documenter-dark .progress.is-dark::-ms-fill,html.theme--documenter-dark .content kbd.progress::-ms-fill{background-color:#282f2f}html.theme--documenter-dark .progress.is-dark:indeterminate,html.theme--documenter-dark .content kbd.progress:indeterminate{background-image:linear-gradient(to right, #282f2f 30%, #343c3d 30%)}html.theme--documenter-dark .progress.is-primary::-webkit-progress-value,html.theme--documenter-dark .docstring>section>a.progress.docs-sourcelink::-webkit-progress-value{background-color:#375a7f}html.theme--documenter-dark .progress.is-primary::-moz-progress-bar,html.theme--documenter-dark .docstring>section>a.progress.docs-sourcelink::-moz-progress-bar{background-color:#375a7f}html.theme--documenter-dark .progress.is-primary::-ms-fill,html.theme--documenter-dark .docstring>section>a.progress.docs-sourcelink::-ms-fill{background-color:#375a7f}html.theme--documenter-dark .progress.is-primary:indeterminate,html.theme--documenter-dark .docstring>section>a.progress.docs-sourcelink:indeterminate{background-image:linear-gradient(to right, #375a7f 30%, #343c3d 30%)}html.theme--documenter-dark .progress.is-link::-webkit-progress-value{background-color:#1abc9c}html.theme--documenter-dark .progress.is-link::-moz-progress-bar{background-color:#1abc9c}html.theme--documenter-dark .progress.is-link::-ms-fill{background-color:#1abc9c}html.theme--documenter-dark .progress.is-link:indeterminate{background-image:linear-gradient(to right, #1abc9c 30%, #343c3d 30%)}html.theme--documenter-dark .progress.is-info::-webkit-progress-value{background-color:#024c7d}html.theme--documenter-dark .progress.is-info::-moz-progress-bar{background-color:#024c7d}html.theme--documenter-dark .progress.is-info::-ms-fill{background-color:#024c7d}html.theme--documenter-dark .progress.is-info:indeterminate{background-image:linear-gradient(to right, #024c7d 30%, #343c3d 30%)}html.theme--documenter-dark .progress.is-success::-webkit-progress-value{background-color:#008438}html.theme--documenter-dark .progress.is-success::-moz-progress-bar{background-color:#008438}html.theme--documenter-dark .progress.is-success::-ms-fill{background-color:#008438}html.theme--documenter-dark .progress.is-success:indeterminate{background-image:linear-gradient(to right, #008438 30%, #343c3d 30%)}html.theme--documenter-dark .progress.is-warning::-webkit-progress-value{background-color:#ad8100}html.theme--documenter-dark .progress.is-warning::-moz-progress-bar{background-color:#ad8100}html.theme--documenter-dark .progress.is-warning::-ms-fill{background-color:#ad8100}html.theme--documenter-dark .progress.is-warning:indeterminate{background-image:linear-gradient(to right, #ad8100 30%, #343c3d 30%)}html.theme--documenter-dark .progress.is-danger::-webkit-progress-value{background-color:#9e1b0d}html.theme--documenter-dark .progress.is-danger::-moz-progress-bar{background-color:#9e1b0d}html.theme--documenter-dark .progress.is-danger::-ms-fill{background-color:#9e1b0d}html.theme--documenter-dark .progress.is-danger:indeterminate{background-image:linear-gradient(to right, #9e1b0d 30%, #343c3d 30%)}html.theme--documenter-dark .progress:indeterminate{animation-duration:1.5s;animation-iteration-count:infinite;animation-name:moveIndeterminate;animation-timing-function:linear;background-color:#343c3d;background-image:linear-gradient(to right, #fff 30%, #343c3d 30%);background-position:top left;background-repeat:no-repeat;background-size:150% 150%}html.theme--documenter-dark .progress:indeterminate::-webkit-progress-bar{background-color:transparent}html.theme--documenter-dark .progress:indeterminate::-moz-progress-bar{background-color:transparent}html.theme--documenter-dark .progress:indeterminate::-ms-fill{animation-name:none}html.theme--documenter-dark .progress.is-small,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.progress{height:.75rem}html.theme--documenter-dark .progress.is-medium{height:1.25rem}html.theme--documenter-dark .progress.is-large{height:1.5rem}@keyframes moveIndeterminate{from{background-position:200% 0}to{background-position:-200% 0}}html.theme--documenter-dark .table{background-color:#343c3d;color:#fff}html.theme--documenter-dark .table td,html.theme--documenter-dark .table th{border:1px solid #5e6d6f;border-width:0 0 1px;padding:0.5em 0.75em;vertical-align:top}html.theme--documenter-dark .table td.is-white,html.theme--documenter-dark .table th.is-white{background-color:#fff;border-color:#fff;color:#0a0a0a}html.theme--documenter-dark .table td.is-black,html.theme--documenter-dark .table th.is-black{background-color:#0a0a0a;border-color:#0a0a0a;color:#fff}html.theme--documenter-dark .table td.is-light,html.theme--documenter-dark .table th.is-light{background-color:#ecf0f1;border-color:#ecf0f1;color:rgba(0,0,0,0.7)}html.theme--documenter-dark .table td.is-dark,html.theme--documenter-dark .table th.is-dark{background-color:#282f2f;border-color:#282f2f;color:#fff}html.theme--documenter-dark .table td.is-primary,html.theme--documenter-dark .table th.is-primary{background-color:#375a7f;border-color:#375a7f;color:#fff}html.theme--documenter-dark .table td.is-link,html.theme--documenter-dark .table th.is-link{background-color:#1abc9c;border-color:#1abc9c;color:#fff}html.theme--documenter-dark .table td.is-info,html.theme--documenter-dark .table th.is-info{background-color:#024c7d;border-color:#024c7d;color:#fff}html.theme--documenter-dark .table td.is-success,html.theme--documenter-dark .table th.is-success{background-color:#008438;border-color:#008438;color:#fff}html.theme--documenter-dark .table td.is-warning,html.theme--documenter-dark .table th.is-warning{background-color:#ad8100;border-color:#ad8100;color:#fff}html.theme--documenter-dark .table td.is-danger,html.theme--documenter-dark .table th.is-danger{background-color:#9e1b0d;border-color:#9e1b0d;color:#fff}html.theme--documenter-dark .table td.is-narrow,html.theme--documenter-dark .table th.is-narrow{white-space:nowrap;width:1%}html.theme--documenter-dark .table td.is-selected,html.theme--documenter-dark .table th.is-selected{background-color:#375a7f;color:#fff}html.theme--documenter-dark .table td.is-selected a,html.theme--documenter-dark .table td.is-selected strong,html.theme--documenter-dark .table th.is-selected a,html.theme--documenter-dark .table th.is-selected strong{color:currentColor}html.theme--documenter-dark .table td.is-vcentered,html.theme--documenter-dark .table th.is-vcentered{vertical-align:middle}html.theme--documenter-dark .table th{color:#f2f2f2}html.theme--documenter-dark .table th:not([align]){text-align:left}html.theme--documenter-dark .table tr.is-selected{background-color:#375a7f;color:#fff}html.theme--documenter-dark .table tr.is-selected a,html.theme--documenter-dark .table tr.is-selected strong{color:currentColor}html.theme--documenter-dark .table tr.is-selected td,html.theme--documenter-dark .table tr.is-selected th{border-color:#fff;color:currentColor}html.theme--documenter-dark .table thead{background-color:rgba(0,0,0,0)}html.theme--documenter-dark .table thead td,html.theme--documenter-dark .table thead th{border-width:0 0 2px;color:#f2f2f2}html.theme--documenter-dark .table tfoot{background-color:rgba(0,0,0,0)}html.theme--documenter-dark .table tfoot td,html.theme--documenter-dark .table tfoot th{border-width:2px 0 0;color:#f2f2f2}html.theme--documenter-dark .table tbody{background-color:rgba(0,0,0,0)}html.theme--documenter-dark .table tbody tr:last-child td,html.theme--documenter-dark .table tbody tr:last-child th{border-bottom-width:0}html.theme--documenter-dark .table.is-bordered td,html.theme--documenter-dark .table.is-bordered th{border-width:1px}html.theme--documenter-dark .table.is-bordered tr:last-child td,html.theme--documenter-dark .table.is-bordered tr:last-child th{border-bottom-width:1px}html.theme--documenter-dark .table.is-fullwidth{width:100%}html.theme--documenter-dark .table.is-hoverable tbody tr:not(.is-selected):hover{background-color:#282f2f}html.theme--documenter-dark .table.is-hoverable.is-striped tbody tr:not(.is-selected):hover{background-color:#282f2f}html.theme--documenter-dark .table.is-hoverable.is-striped tbody tr:not(.is-selected):hover:nth-child(even){background-color:#2d3435}html.theme--documenter-dark .table.is-narrow td,html.theme--documenter-dark .table.is-narrow th{padding:0.25em 0.5em}html.theme--documenter-dark .table.is-striped tbody tr:not(.is-selected):nth-child(even){background-color:#282f2f}html.theme--documenter-dark .table-container{-webkit-overflow-scrolling:touch;overflow:auto;overflow-y:hidden;max-width:100%}html.theme--documenter-dark .tags{align-items:center;display:flex;flex-wrap:wrap;justify-content:flex-start}html.theme--documenter-dark .tags .tag,html.theme--documenter-dark .tags .content kbd,html.theme--documenter-dark .content .tags kbd,html.theme--documenter-dark .tags .docstring>section>a.docs-sourcelink{margin-bottom:0.5rem}html.theme--documenter-dark .tags .tag:not(:last-child),html.theme--documenter-dark .tags .content kbd:not(:last-child),html.theme--documenter-dark .content .tags kbd:not(:last-child),html.theme--documenter-dark .tags .docstring>section>a.docs-sourcelink:not(:last-child){margin-right:.5rem}html.theme--documenter-dark .tags:last-child{margin-bottom:-0.5rem}html.theme--documenter-dark .tags:not(:last-child){margin-bottom:1rem}html.theme--documenter-dark .tags.are-medium .tag:not(.is-normal):not(.is-large),html.theme--documenter-dark .tags.are-medium .content kbd:not(.is-normal):not(.is-large),html.theme--documenter-dark .content .tags.are-medium kbd:not(.is-normal):not(.is-large),html.theme--documenter-dark .tags.are-medium .docstring>section>a.docs-sourcelink:not(.is-normal):not(.is-large){font-size:1rem}html.theme--documenter-dark .tags.are-large .tag:not(.is-normal):not(.is-medium),html.theme--documenter-dark .tags.are-large .content kbd:not(.is-normal):not(.is-medium),html.theme--documenter-dark .content .tags.are-large kbd:not(.is-normal):not(.is-medium),html.theme--documenter-dark .tags.are-large .docstring>section>a.docs-sourcelink:not(.is-normal):not(.is-medium){font-size:1.25rem}html.theme--documenter-dark .tags.is-centered{justify-content:center}html.theme--documenter-dark .tags.is-centered .tag,html.theme--documenter-dark .tags.is-centered .content kbd,html.theme--documenter-dark .content .tags.is-centered kbd,html.theme--documenter-dark .tags.is-centered .docstring>section>a.docs-sourcelink{margin-right:0.25rem;margin-left:0.25rem}html.theme--documenter-dark .tags.is-right{justify-content:flex-end}html.theme--documenter-dark .tags.is-right .tag:not(:first-child),html.theme--documenter-dark .tags.is-right .content kbd:not(:first-child),html.theme--documenter-dark .content .tags.is-right kbd:not(:first-child),html.theme--documenter-dark .tags.is-right .docstring>section>a.docs-sourcelink:not(:first-child){margin-left:0.5rem}html.theme--documenter-dark .tags.is-right .tag:not(:last-child),html.theme--documenter-dark .tags.is-right .content kbd:not(:last-child),html.theme--documenter-dark .content .tags.is-right kbd:not(:last-child),html.theme--documenter-dark .tags.is-right .docstring>section>a.docs-sourcelink:not(:last-child){margin-right:0}html.theme--documenter-dark .tags.has-addons .tag,html.theme--documenter-dark .tags.has-addons .content kbd,html.theme--documenter-dark .content .tags.has-addons kbd,html.theme--documenter-dark .tags.has-addons .docstring>section>a.docs-sourcelink{margin-right:0}html.theme--documenter-dark .tags.has-addons .tag:not(:first-child),html.theme--documenter-dark .tags.has-addons .content kbd:not(:first-child),html.theme--documenter-dark .content .tags.has-addons kbd:not(:first-child),html.theme--documenter-dark .tags.has-addons .docstring>section>a.docs-sourcelink:not(:first-child){margin-left:0;border-top-left-radius:0;border-bottom-left-radius:0}html.theme--documenter-dark .tags.has-addons .tag:not(:last-child),html.theme--documenter-dark .tags.has-addons .content kbd:not(:last-child),html.theme--documenter-dark .content .tags.has-addons kbd:not(:last-child),html.theme--documenter-dark .tags.has-addons .docstring>section>a.docs-sourcelink:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}html.theme--documenter-dark .tag:not(body),html.theme--documenter-dark .content kbd:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink:not(body){align-items:center;background-color:#282f2f;border-radius:.4em;color:#fff;display:inline-flex;font-size:.75rem;height:2em;justify-content:center;line-height:1.5;padding-left:0.75em;padding-right:0.75em;white-space:nowrap}html.theme--documenter-dark .tag:not(body) .delete,html.theme--documenter-dark .content kbd:not(body) .delete,html.theme--documenter-dark .docstring>section>a.docs-sourcelink:not(body) .delete{margin-left:.25rem;margin-right:-.375rem}html.theme--documenter-dark .tag.is-white:not(body),html.theme--documenter-dark .content kbd.is-white:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-white:not(body){background-color:#fff;color:#0a0a0a}html.theme--documenter-dark .tag.is-black:not(body),html.theme--documenter-dark .content kbd.is-black:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-black:not(body){background-color:#0a0a0a;color:#fff}html.theme--documenter-dark .tag.is-light:not(body),html.theme--documenter-dark .content kbd.is-light:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-light:not(body){background-color:#ecf0f1;color:rgba(0,0,0,0.7)}html.theme--documenter-dark .tag.is-dark:not(body),html.theme--documenter-dark .content kbd:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-dark:not(body),html.theme--documenter-dark .content .docstring>section>kbd:not(body){background-color:#282f2f;color:#fff}html.theme--documenter-dark .tag.is-primary:not(body),html.theme--documenter-dark .content kbd.is-primary:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink:not(body){background-color:#375a7f;color:#fff}html.theme--documenter-dark .tag.is-primary.is-light:not(body),html.theme--documenter-dark .content kbd.is-primary.is-light:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-light:not(body){background-color:#f1f5f9;color:#4d7eb2}html.theme--documenter-dark .tag.is-link:not(body),html.theme--documenter-dark .content kbd.is-link:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-link:not(body){background-color:#1abc9c;color:#fff}html.theme--documenter-dark .tag.is-link.is-light:not(body),html.theme--documenter-dark .content kbd.is-link.is-light:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-link.is-light:not(body){background-color:#edfdf9;color:#15987e}html.theme--documenter-dark .tag.is-info:not(body),html.theme--documenter-dark .content kbd.is-info:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-info:not(body){background-color:#024c7d;color:#fff}html.theme--documenter-dark .tag.is-info.is-light:not(body),html.theme--documenter-dark .content kbd.is-info.is-light:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-info.is-light:not(body){background-color:#ebf7ff;color:#0e9dfb}html.theme--documenter-dark .tag.is-success:not(body),html.theme--documenter-dark .content kbd.is-success:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-success:not(body){background-color:#008438;color:#fff}html.theme--documenter-dark .tag.is-success.is-light:not(body),html.theme--documenter-dark .content kbd.is-success.is-light:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-success.is-light:not(body){background-color:#ebfff3;color:#00eb64}html.theme--documenter-dark .tag.is-warning:not(body),html.theme--documenter-dark .content kbd.is-warning:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-warning:not(body){background-color:#ad8100;color:#fff}html.theme--documenter-dark .tag.is-warning.is-light:not(body),html.theme--documenter-dark .content kbd.is-warning.is-light:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-warning.is-light:not(body){background-color:#fffaeb;color:#d19c00}html.theme--documenter-dark .tag.is-danger:not(body),html.theme--documenter-dark .content kbd.is-danger:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-danger:not(body){background-color:#9e1b0d;color:#fff}html.theme--documenter-dark .tag.is-danger.is-light:not(body),html.theme--documenter-dark .content kbd.is-danger.is-light:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-danger.is-light:not(body){background-color:#fdeeec;color:#ec311d}html.theme--documenter-dark .tag.is-normal:not(body),html.theme--documenter-dark .content kbd.is-normal:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-normal:not(body){font-size:.75rem}html.theme--documenter-dark .tag.is-medium:not(body),html.theme--documenter-dark .content kbd.is-medium:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-medium:not(body){font-size:1rem}html.theme--documenter-dark .tag.is-large:not(body),html.theme--documenter-dark .content kbd.is-large:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-large:not(body){font-size:1.25rem}html.theme--documenter-dark .tag:not(body) .icon:first-child:not(:last-child),html.theme--documenter-dark .content kbd:not(body) .icon:first-child:not(:last-child),html.theme--documenter-dark .docstring>section>a.docs-sourcelink:not(body) .icon:first-child:not(:last-child){margin-left:-.375em;margin-right:.1875em}html.theme--documenter-dark .tag:not(body) .icon:last-child:not(:first-child),html.theme--documenter-dark .content kbd:not(body) .icon:last-child:not(:first-child),html.theme--documenter-dark .docstring>section>a.docs-sourcelink:not(body) .icon:last-child:not(:first-child){margin-left:.1875em;margin-right:-.375em}html.theme--documenter-dark .tag:not(body) .icon:first-child:last-child,html.theme--documenter-dark .content kbd:not(body) .icon:first-child:last-child,html.theme--documenter-dark .docstring>section>a.docs-sourcelink:not(body) .icon:first-child:last-child{margin-left:-.375em;margin-right:-.375em}html.theme--documenter-dark .tag.is-delete:not(body),html.theme--documenter-dark .content kbd.is-delete:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-delete:not(body){margin-left:1px;padding:0;position:relative;width:2em}html.theme--documenter-dark .tag.is-delete:not(body)::before,html.theme--documenter-dark .content kbd.is-delete:not(body)::before,html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-delete:not(body)::before,html.theme--documenter-dark .tag.is-delete:not(body)::after,html.theme--documenter-dark .content kbd.is-delete:not(body)::after,html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-delete:not(body)::after{background-color:currentColor;content:"";display:block;left:50%;position:absolute;top:50%;transform:translateX(-50%) translateY(-50%) rotate(45deg);transform-origin:center center}html.theme--documenter-dark .tag.is-delete:not(body)::before,html.theme--documenter-dark .content kbd.is-delete:not(body)::before,html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-delete:not(body)::before{height:1px;width:50%}html.theme--documenter-dark .tag.is-delete:not(body)::after,html.theme--documenter-dark .content kbd.is-delete:not(body)::after,html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-delete:not(body)::after{height:50%;width:1px}html.theme--documenter-dark .tag.is-delete:not(body):hover,html.theme--documenter-dark .content kbd.is-delete:not(body):hover,html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-delete:not(body):hover,html.theme--documenter-dark .tag.is-delete:not(body):focus,html.theme--documenter-dark .content kbd.is-delete:not(body):focus,html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-delete:not(body):focus{background-color:#1d2122}html.theme--documenter-dark .tag.is-delete:not(body):active,html.theme--documenter-dark .content kbd.is-delete:not(body):active,html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-delete:not(body):active{background-color:#111414}html.theme--documenter-dark .tag.is-rounded:not(body),html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input:not(body),html.theme--documenter-dark .content kbd.is-rounded:not(body),html.theme--documenter-dark #documenter .docs-sidebar .content form.docs-search>input:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-rounded:not(body){border-radius:9999px}html.theme--documenter-dark a.tag:hover,html.theme--documenter-dark .docstring>section>a.docs-sourcelink:hover{text-decoration:underline}html.theme--documenter-dark .title,html.theme--documenter-dark .subtitle{word-break:break-word}html.theme--documenter-dark .title em,html.theme--documenter-dark .title span,html.theme--documenter-dark .subtitle em,html.theme--documenter-dark .subtitle span{font-weight:inherit}html.theme--documenter-dark .title sub,html.theme--documenter-dark .subtitle sub{font-size:.75em}html.theme--documenter-dark .title sup,html.theme--documenter-dark .subtitle sup{font-size:.75em}html.theme--documenter-dark .title .tag,html.theme--documenter-dark .title .content kbd,html.theme--documenter-dark .content .title kbd,html.theme--documenter-dark .title .docstring>section>a.docs-sourcelink,html.theme--documenter-dark .subtitle .tag,html.theme--documenter-dark .subtitle .content kbd,html.theme--documenter-dark .content .subtitle kbd,html.theme--documenter-dark .subtitle .docstring>section>a.docs-sourcelink{vertical-align:middle}html.theme--documenter-dark .title{color:#fff;font-size:2rem;font-weight:500;line-height:1.125}html.theme--documenter-dark .title strong{color:inherit;font-weight:inherit}html.theme--documenter-dark .title:not(.is-spaced)+.subtitle{margin-top:-1.25rem}html.theme--documenter-dark .title.is-1{font-size:3rem}html.theme--documenter-dark .title.is-2{font-size:2.5rem}html.theme--documenter-dark .title.is-3{font-size:2rem}html.theme--documenter-dark .title.is-4{font-size:1.5rem}html.theme--documenter-dark .title.is-5{font-size:1.25rem}html.theme--documenter-dark .title.is-6{font-size:1rem}html.theme--documenter-dark .title.is-7{font-size:.75rem}html.theme--documenter-dark .subtitle{color:#8c9b9d;font-size:1.25rem;font-weight:400;line-height:1.25}html.theme--documenter-dark .subtitle strong{color:#8c9b9d;font-weight:600}html.theme--documenter-dark .subtitle:not(.is-spaced)+.title{margin-top:-1.25rem}html.theme--documenter-dark .subtitle.is-1{font-size:3rem}html.theme--documenter-dark .subtitle.is-2{font-size:2.5rem}html.theme--documenter-dark .subtitle.is-3{font-size:2rem}html.theme--documenter-dark .subtitle.is-4{font-size:1.5rem}html.theme--documenter-dark .subtitle.is-5{font-size:1.25rem}html.theme--documenter-dark .subtitle.is-6{font-size:1rem}html.theme--documenter-dark .subtitle.is-7{font-size:.75rem}html.theme--documenter-dark .heading{display:block;font-size:11px;letter-spacing:1px;margin-bottom:5px;text-transform:uppercase}html.theme--documenter-dark .number{align-items:center;background-color:#282f2f;border-radius:9999px;display:inline-flex;font-size:1.25rem;height:2em;justify-content:center;margin-right:1.5rem;min-width:2.5em;padding:0.25rem 0.5rem;text-align:center;vertical-align:top}html.theme--documenter-dark .select select,html.theme--documenter-dark .textarea,html.theme--documenter-dark .input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input{background-color:#1f2424;border-color:#5e6d6f;border-radius:.4em;color:#dbdee0}html.theme--documenter-dark .select select::-moz-placeholder,html.theme--documenter-dark .textarea::-moz-placeholder,html.theme--documenter-dark .input::-moz-placeholder,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input::-moz-placeholder{color:#868c98}html.theme--documenter-dark .select select::-webkit-input-placeholder,html.theme--documenter-dark .textarea::-webkit-input-placeholder,html.theme--documenter-dark .input::-webkit-input-placeholder,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input::-webkit-input-placeholder{color:#868c98}html.theme--documenter-dark .select select:-moz-placeholder,html.theme--documenter-dark .textarea:-moz-placeholder,html.theme--documenter-dark .input:-moz-placeholder,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input:-moz-placeholder{color:#868c98}html.theme--documenter-dark .select select:-ms-input-placeholder,html.theme--documenter-dark .textarea:-ms-input-placeholder,html.theme--documenter-dark .input:-ms-input-placeholder,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input:-ms-input-placeholder{color:#868c98}html.theme--documenter-dark .select select:hover,html.theme--documenter-dark .textarea:hover,html.theme--documenter-dark .input:hover,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input:hover,html.theme--documenter-dark .select select.is-hovered,html.theme--documenter-dark .is-hovered.textarea,html.theme--documenter-dark .is-hovered.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-hovered{border-color:#8c9b9d}html.theme--documenter-dark .select select:focus,html.theme--documenter-dark .textarea:focus,html.theme--documenter-dark .input:focus,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input:focus,html.theme--documenter-dark .select select.is-focused,html.theme--documenter-dark .is-focused.textarea,html.theme--documenter-dark .is-focused.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-focused,html.theme--documenter-dark .select select:active,html.theme--documenter-dark .textarea:active,html.theme--documenter-dark .input:active,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input:active,html.theme--documenter-dark .select select.is-active,html.theme--documenter-dark .is-active.textarea,html.theme--documenter-dark .is-active.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-active{border-color:#1abc9c;box-shadow:0 0 0 0.125em rgba(26,188,156,0.25)}html.theme--documenter-dark .select select[disabled],html.theme--documenter-dark .textarea[disabled],html.theme--documenter-dark .input[disabled],html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input[disabled],fieldset[disabled] html.theme--documenter-dark .select select,fieldset[disabled] html.theme--documenter-dark .textarea,fieldset[disabled] html.theme--documenter-dark .input,fieldset[disabled] html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input{background-color:#8c9b9d;border-color:#282f2f;box-shadow:none;color:#fff}html.theme--documenter-dark .select select[disabled]::-moz-placeholder,html.theme--documenter-dark .textarea[disabled]::-moz-placeholder,html.theme--documenter-dark .input[disabled]::-moz-placeholder,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input[disabled]::-moz-placeholder,fieldset[disabled] html.theme--documenter-dark .select select::-moz-placeholder,fieldset[disabled] html.theme--documenter-dark .textarea::-moz-placeholder,fieldset[disabled] html.theme--documenter-dark .input::-moz-placeholder,fieldset[disabled] html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input::-moz-placeholder{color:rgba(255,255,255,0.3)}html.theme--documenter-dark .select select[disabled]::-webkit-input-placeholder,html.theme--documenter-dark .textarea[disabled]::-webkit-input-placeholder,html.theme--documenter-dark .input[disabled]::-webkit-input-placeholder,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input[disabled]::-webkit-input-placeholder,fieldset[disabled] html.theme--documenter-dark .select select::-webkit-input-placeholder,fieldset[disabled] html.theme--documenter-dark .textarea::-webkit-input-placeholder,fieldset[disabled] html.theme--documenter-dark .input::-webkit-input-placeholder,fieldset[disabled] html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input::-webkit-input-placeholder{color:rgba(255,255,255,0.3)}html.theme--documenter-dark .select select[disabled]:-moz-placeholder,html.theme--documenter-dark .textarea[disabled]:-moz-placeholder,html.theme--documenter-dark .input[disabled]:-moz-placeholder,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input[disabled]:-moz-placeholder,fieldset[disabled] html.theme--documenter-dark .select select:-moz-placeholder,fieldset[disabled] html.theme--documenter-dark .textarea:-moz-placeholder,fieldset[disabled] html.theme--documenter-dark .input:-moz-placeholder,fieldset[disabled] html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input:-moz-placeholder{color:rgba(255,255,255,0.3)}html.theme--documenter-dark .select select[disabled]:-ms-input-placeholder,html.theme--documenter-dark .textarea[disabled]:-ms-input-placeholder,html.theme--documenter-dark .input[disabled]:-ms-input-placeholder,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input[disabled]:-ms-input-placeholder,fieldset[disabled] html.theme--documenter-dark .select select:-ms-input-placeholder,fieldset[disabled] html.theme--documenter-dark .textarea:-ms-input-placeholder,fieldset[disabled] html.theme--documenter-dark .input:-ms-input-placeholder,fieldset[disabled] html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input:-ms-input-placeholder{color:rgba(255,255,255,0.3)}html.theme--documenter-dark .textarea,html.theme--documenter-dark .input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input{box-shadow:inset 0 0.0625em 0.125em rgba(10,10,10,0.05);max-width:100%;width:100%}html.theme--documenter-dark .textarea[readonly],html.theme--documenter-dark .input[readonly],html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input[readonly]{box-shadow:none}html.theme--documenter-dark .is-white.textarea,html.theme--documenter-dark .is-white.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-white{border-color:#fff}html.theme--documenter-dark .is-white.textarea:focus,html.theme--documenter-dark .is-white.input:focus,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-white:focus,html.theme--documenter-dark .is-white.is-focused.textarea,html.theme--documenter-dark .is-white.is-focused.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-focused,html.theme--documenter-dark .is-white.textarea:active,html.theme--documenter-dark .is-white.input:active,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-white:active,html.theme--documenter-dark .is-white.is-active.textarea,html.theme--documenter-dark .is-white.is-active.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(255,255,255,0.25)}html.theme--documenter-dark .is-black.textarea,html.theme--documenter-dark .is-black.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-black{border-color:#0a0a0a}html.theme--documenter-dark .is-black.textarea:focus,html.theme--documenter-dark .is-black.input:focus,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-black:focus,html.theme--documenter-dark .is-black.is-focused.textarea,html.theme--documenter-dark .is-black.is-focused.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-focused,html.theme--documenter-dark .is-black.textarea:active,html.theme--documenter-dark .is-black.input:active,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-black:active,html.theme--documenter-dark .is-black.is-active.textarea,html.theme--documenter-dark .is-black.is-active.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(10,10,10,0.25)}html.theme--documenter-dark .is-light.textarea,html.theme--documenter-dark .is-light.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-light{border-color:#ecf0f1}html.theme--documenter-dark .is-light.textarea:focus,html.theme--documenter-dark .is-light.input:focus,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-light:focus,html.theme--documenter-dark .is-light.is-focused.textarea,html.theme--documenter-dark .is-light.is-focused.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-focused,html.theme--documenter-dark .is-light.textarea:active,html.theme--documenter-dark .is-light.input:active,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-light:active,html.theme--documenter-dark .is-light.is-active.textarea,html.theme--documenter-dark .is-light.is-active.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(236,240,241,0.25)}html.theme--documenter-dark .is-dark.textarea,html.theme--documenter-dark .content kbd.textarea,html.theme--documenter-dark .is-dark.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-dark,html.theme--documenter-dark .content kbd.input{border-color:#282f2f}html.theme--documenter-dark .is-dark.textarea:focus,html.theme--documenter-dark .content kbd.textarea:focus,html.theme--documenter-dark .is-dark.input:focus,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-dark:focus,html.theme--documenter-dark .content kbd.input:focus,html.theme--documenter-dark .is-dark.is-focused.textarea,html.theme--documenter-dark .content kbd.is-focused.textarea,html.theme--documenter-dark .is-dark.is-focused.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-focused,html.theme--documenter-dark .content kbd.is-focused.input,html.theme--documenter-dark #documenter .docs-sidebar .content form.docs-search>input.is-focused,html.theme--documenter-dark .is-dark.textarea:active,html.theme--documenter-dark .content kbd.textarea:active,html.theme--documenter-dark .is-dark.input:active,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-dark:active,html.theme--documenter-dark .content kbd.input:active,html.theme--documenter-dark .is-dark.is-active.textarea,html.theme--documenter-dark .content kbd.is-active.textarea,html.theme--documenter-dark .is-dark.is-active.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-active,html.theme--documenter-dark .content kbd.is-active.input,html.theme--documenter-dark #documenter .docs-sidebar .content form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(40,47,47,0.25)}html.theme--documenter-dark .is-primary.textarea,html.theme--documenter-dark .docstring>section>a.textarea.docs-sourcelink,html.theme--documenter-dark .is-primary.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-primary,html.theme--documenter-dark .docstring>section>a.input.docs-sourcelink{border-color:#375a7f}html.theme--documenter-dark .is-primary.textarea:focus,html.theme--documenter-dark .docstring>section>a.textarea.docs-sourcelink:focus,html.theme--documenter-dark .is-primary.input:focus,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-primary:focus,html.theme--documenter-dark .docstring>section>a.input.docs-sourcelink:focus,html.theme--documenter-dark .is-primary.is-focused.textarea,html.theme--documenter-dark .docstring>section>a.is-focused.textarea.docs-sourcelink,html.theme--documenter-dark .is-primary.is-focused.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-focused,html.theme--documenter-dark .docstring>section>a.is-focused.input.docs-sourcelink,html.theme--documenter-dark .is-primary.textarea:active,html.theme--documenter-dark .docstring>section>a.textarea.docs-sourcelink:active,html.theme--documenter-dark .is-primary.input:active,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-primary:active,html.theme--documenter-dark .docstring>section>a.input.docs-sourcelink:active,html.theme--documenter-dark .is-primary.is-active.textarea,html.theme--documenter-dark .docstring>section>a.is-active.textarea.docs-sourcelink,html.theme--documenter-dark .is-primary.is-active.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-active,html.theme--documenter-dark .docstring>section>a.is-active.input.docs-sourcelink{box-shadow:0 0 0 0.125em rgba(55,90,127,0.25)}html.theme--documenter-dark .is-link.textarea,html.theme--documenter-dark .is-link.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-link{border-color:#1abc9c}html.theme--documenter-dark .is-link.textarea:focus,html.theme--documenter-dark .is-link.input:focus,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-link:focus,html.theme--documenter-dark .is-link.is-focused.textarea,html.theme--documenter-dark .is-link.is-focused.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-focused,html.theme--documenter-dark .is-link.textarea:active,html.theme--documenter-dark .is-link.input:active,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-link:active,html.theme--documenter-dark .is-link.is-active.textarea,html.theme--documenter-dark .is-link.is-active.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(26,188,156,0.25)}html.theme--documenter-dark .is-info.textarea,html.theme--documenter-dark .is-info.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-info{border-color:#024c7d}html.theme--documenter-dark .is-info.textarea:focus,html.theme--documenter-dark .is-info.input:focus,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-info:focus,html.theme--documenter-dark .is-info.is-focused.textarea,html.theme--documenter-dark .is-info.is-focused.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-focused,html.theme--documenter-dark .is-info.textarea:active,html.theme--documenter-dark .is-info.input:active,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-info:active,html.theme--documenter-dark .is-info.is-active.textarea,html.theme--documenter-dark .is-info.is-active.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(2,76,125,0.25)}html.theme--documenter-dark .is-success.textarea,html.theme--documenter-dark .is-success.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-success{border-color:#008438}html.theme--documenter-dark .is-success.textarea:focus,html.theme--documenter-dark .is-success.input:focus,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-success:focus,html.theme--documenter-dark .is-success.is-focused.textarea,html.theme--documenter-dark .is-success.is-focused.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-focused,html.theme--documenter-dark .is-success.textarea:active,html.theme--documenter-dark .is-success.input:active,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-success:active,html.theme--documenter-dark .is-success.is-active.textarea,html.theme--documenter-dark .is-success.is-active.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(0,132,56,0.25)}html.theme--documenter-dark .is-warning.textarea,html.theme--documenter-dark .is-warning.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-warning{border-color:#ad8100}html.theme--documenter-dark .is-warning.textarea:focus,html.theme--documenter-dark .is-warning.input:focus,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-warning:focus,html.theme--documenter-dark .is-warning.is-focused.textarea,html.theme--documenter-dark .is-warning.is-focused.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-focused,html.theme--documenter-dark .is-warning.textarea:active,html.theme--documenter-dark .is-warning.input:active,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-warning:active,html.theme--documenter-dark .is-warning.is-active.textarea,html.theme--documenter-dark .is-warning.is-active.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(173,129,0,0.25)}html.theme--documenter-dark .is-danger.textarea,html.theme--documenter-dark .is-danger.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-danger{border-color:#9e1b0d}html.theme--documenter-dark .is-danger.textarea:focus,html.theme--documenter-dark .is-danger.input:focus,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-danger:focus,html.theme--documenter-dark .is-danger.is-focused.textarea,html.theme--documenter-dark .is-danger.is-focused.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-focused,html.theme--documenter-dark .is-danger.textarea:active,html.theme--documenter-dark .is-danger.input:active,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-danger:active,html.theme--documenter-dark .is-danger.is-active.textarea,html.theme--documenter-dark .is-danger.is-active.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(158,27,13,0.25)}html.theme--documenter-dark .is-small.textarea,html.theme--documenter-dark .is-small.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input{border-radius:3px;font-size:.75rem}html.theme--documenter-dark .is-medium.textarea,html.theme--documenter-dark .is-medium.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-medium{font-size:1.25rem}html.theme--documenter-dark .is-large.textarea,html.theme--documenter-dark .is-large.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-large{font-size:1.5rem}html.theme--documenter-dark .is-fullwidth.textarea,html.theme--documenter-dark .is-fullwidth.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-fullwidth{display:block;width:100%}html.theme--documenter-dark .is-inline.textarea,html.theme--documenter-dark .is-inline.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-inline{display:inline;width:auto}html.theme--documenter-dark .input.is-rounded,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input{border-radius:9999px;padding-left:calc(calc(0.75em - 1px) + 0.375em);padding-right:calc(calc(0.75em - 1px) + 0.375em)}html.theme--documenter-dark .input.is-static,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-static{background-color:transparent;border-color:transparent;box-shadow:none;padding-left:0;padding-right:0}html.theme--documenter-dark .textarea{display:block;max-width:100%;min-width:100%;padding:calc(0.75em - 1px);resize:vertical}html.theme--documenter-dark .textarea:not([rows]){max-height:40em;min-height:8em}html.theme--documenter-dark .textarea[rows]{height:initial}html.theme--documenter-dark .textarea.has-fixed-size{resize:none}html.theme--documenter-dark .radio,html.theme--documenter-dark .checkbox{cursor:pointer;display:inline-block;line-height:1.25;position:relative}html.theme--documenter-dark .radio input,html.theme--documenter-dark .checkbox input{cursor:pointer}html.theme--documenter-dark .radio:hover,html.theme--documenter-dark .checkbox:hover{color:#8c9b9d}html.theme--documenter-dark .radio[disabled],html.theme--documenter-dark .checkbox[disabled],fieldset[disabled] html.theme--documenter-dark .radio,fieldset[disabled] html.theme--documenter-dark .checkbox,html.theme--documenter-dark .radio input[disabled],html.theme--documenter-dark .checkbox input[disabled]{color:#fff;cursor:not-allowed}html.theme--documenter-dark .radio+.radio{margin-left:.5em}html.theme--documenter-dark .select{display:inline-block;max-width:100%;position:relative;vertical-align:top}html.theme--documenter-dark .select:not(.is-multiple){height:2.5em}html.theme--documenter-dark .select:not(.is-multiple):not(.is-loading)::after{border-color:#1abc9c;right:1.125em;z-index:4}html.theme--documenter-dark .select.is-rounded select,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.select select{border-radius:9999px;padding-left:1em}html.theme--documenter-dark .select select{cursor:pointer;display:block;font-size:1em;max-width:100%;outline:none}html.theme--documenter-dark .select select::-ms-expand{display:none}html.theme--documenter-dark .select select[disabled]:hover,fieldset[disabled] html.theme--documenter-dark .select select:hover{border-color:#282f2f}html.theme--documenter-dark .select select:not([multiple]){padding-right:2.5em}html.theme--documenter-dark .select select[multiple]{height:auto;padding:0}html.theme--documenter-dark .select select[multiple] option{padding:0.5em 1em}html.theme--documenter-dark .select:not(.is-multiple):not(.is-loading):hover::after{border-color:#8c9b9d}html.theme--documenter-dark .select.is-white:not(:hover)::after{border-color:#fff}html.theme--documenter-dark .select.is-white select{border-color:#fff}html.theme--documenter-dark .select.is-white select:hover,html.theme--documenter-dark .select.is-white select.is-hovered{border-color:#f2f2f2}html.theme--documenter-dark .select.is-white select:focus,html.theme--documenter-dark .select.is-white select.is-focused,html.theme--documenter-dark .select.is-white select:active,html.theme--documenter-dark .select.is-white select.is-active{box-shadow:0 0 0 0.125em rgba(255,255,255,0.25)}html.theme--documenter-dark .select.is-black:not(:hover)::after{border-color:#0a0a0a}html.theme--documenter-dark .select.is-black select{border-color:#0a0a0a}html.theme--documenter-dark .select.is-black select:hover,html.theme--documenter-dark .select.is-black select.is-hovered{border-color:#000}html.theme--documenter-dark .select.is-black select:focus,html.theme--documenter-dark .select.is-black select.is-focused,html.theme--documenter-dark .select.is-black select:active,html.theme--documenter-dark .select.is-black select.is-active{box-shadow:0 0 0 0.125em rgba(10,10,10,0.25)}html.theme--documenter-dark .select.is-light:not(:hover)::after{border-color:#ecf0f1}html.theme--documenter-dark .select.is-light select{border-color:#ecf0f1}html.theme--documenter-dark .select.is-light select:hover,html.theme--documenter-dark .select.is-light select.is-hovered{border-color:#dde4e6}html.theme--documenter-dark .select.is-light select:focus,html.theme--documenter-dark .select.is-light select.is-focused,html.theme--documenter-dark .select.is-light select:active,html.theme--documenter-dark .select.is-light select.is-active{box-shadow:0 0 0 0.125em rgba(236,240,241,0.25)}html.theme--documenter-dark .select.is-dark:not(:hover)::after,html.theme--documenter-dark .content kbd.select:not(:hover)::after{border-color:#282f2f}html.theme--documenter-dark .select.is-dark select,html.theme--documenter-dark .content kbd.select select{border-color:#282f2f}html.theme--documenter-dark .select.is-dark select:hover,html.theme--documenter-dark .content kbd.select select:hover,html.theme--documenter-dark .select.is-dark select.is-hovered,html.theme--documenter-dark .content kbd.select select.is-hovered{border-color:#1d2122}html.theme--documenter-dark .select.is-dark select:focus,html.theme--documenter-dark .content kbd.select select:focus,html.theme--documenter-dark .select.is-dark select.is-focused,html.theme--documenter-dark .content kbd.select select.is-focused,html.theme--documenter-dark .select.is-dark select:active,html.theme--documenter-dark .content kbd.select select:active,html.theme--documenter-dark .select.is-dark select.is-active,html.theme--documenter-dark .content kbd.select select.is-active{box-shadow:0 0 0 0.125em rgba(40,47,47,0.25)}html.theme--documenter-dark .select.is-primary:not(:hover)::after,html.theme--documenter-dark .docstring>section>a.select.docs-sourcelink:not(:hover)::after{border-color:#375a7f}html.theme--documenter-dark .select.is-primary select,html.theme--documenter-dark .docstring>section>a.select.docs-sourcelink select{border-color:#375a7f}html.theme--documenter-dark .select.is-primary select:hover,html.theme--documenter-dark .docstring>section>a.select.docs-sourcelink select:hover,html.theme--documenter-dark .select.is-primary select.is-hovered,html.theme--documenter-dark .docstring>section>a.select.docs-sourcelink select.is-hovered{border-color:#2f4d6d}html.theme--documenter-dark .select.is-primary select:focus,html.theme--documenter-dark .docstring>section>a.select.docs-sourcelink select:focus,html.theme--documenter-dark .select.is-primary select.is-focused,html.theme--documenter-dark .docstring>section>a.select.docs-sourcelink select.is-focused,html.theme--documenter-dark .select.is-primary select:active,html.theme--documenter-dark .docstring>section>a.select.docs-sourcelink select:active,html.theme--documenter-dark .select.is-primary select.is-active,html.theme--documenter-dark .docstring>section>a.select.docs-sourcelink select.is-active{box-shadow:0 0 0 0.125em rgba(55,90,127,0.25)}html.theme--documenter-dark .select.is-link:not(:hover)::after{border-color:#1abc9c}html.theme--documenter-dark .select.is-link select{border-color:#1abc9c}html.theme--documenter-dark .select.is-link select:hover,html.theme--documenter-dark .select.is-link select.is-hovered{border-color:#17a689}html.theme--documenter-dark .select.is-link select:focus,html.theme--documenter-dark .select.is-link select.is-focused,html.theme--documenter-dark .select.is-link select:active,html.theme--documenter-dark .select.is-link select.is-active{box-shadow:0 0 0 0.125em rgba(26,188,156,0.25)}html.theme--documenter-dark .select.is-info:not(:hover)::after{border-color:#024c7d}html.theme--documenter-dark .select.is-info select{border-color:#024c7d}html.theme--documenter-dark .select.is-info select:hover,html.theme--documenter-dark .select.is-info select.is-hovered{border-color:#023d64}html.theme--documenter-dark .select.is-info select:focus,html.theme--documenter-dark .select.is-info select.is-focused,html.theme--documenter-dark .select.is-info select:active,html.theme--documenter-dark .select.is-info select.is-active{box-shadow:0 0 0 0.125em rgba(2,76,125,0.25)}html.theme--documenter-dark .select.is-success:not(:hover)::after{border-color:#008438}html.theme--documenter-dark .select.is-success select{border-color:#008438}html.theme--documenter-dark .select.is-success select:hover,html.theme--documenter-dark .select.is-success select.is-hovered{border-color:#006b2d}html.theme--documenter-dark .select.is-success select:focus,html.theme--documenter-dark .select.is-success select.is-focused,html.theme--documenter-dark .select.is-success select:active,html.theme--documenter-dark .select.is-success select.is-active{box-shadow:0 0 0 0.125em rgba(0,132,56,0.25)}html.theme--documenter-dark .select.is-warning:not(:hover)::after{border-color:#ad8100}html.theme--documenter-dark .select.is-warning select{border-color:#ad8100}html.theme--documenter-dark .select.is-warning select:hover,html.theme--documenter-dark .select.is-warning select.is-hovered{border-color:#946e00}html.theme--documenter-dark .select.is-warning select:focus,html.theme--documenter-dark .select.is-warning select.is-focused,html.theme--documenter-dark .select.is-warning select:active,html.theme--documenter-dark .select.is-warning select.is-active{box-shadow:0 0 0 0.125em rgba(173,129,0,0.25)}html.theme--documenter-dark .select.is-danger:not(:hover)::after{border-color:#9e1b0d}html.theme--documenter-dark .select.is-danger select{border-color:#9e1b0d}html.theme--documenter-dark .select.is-danger select:hover,html.theme--documenter-dark .select.is-danger select.is-hovered{border-color:#86170b}html.theme--documenter-dark .select.is-danger select:focus,html.theme--documenter-dark .select.is-danger select.is-focused,html.theme--documenter-dark .select.is-danger select:active,html.theme--documenter-dark .select.is-danger select.is-active{box-shadow:0 0 0 0.125em rgba(158,27,13,0.25)}html.theme--documenter-dark .select.is-small,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.select{border-radius:3px;font-size:.75rem}html.theme--documenter-dark .select.is-medium{font-size:1.25rem}html.theme--documenter-dark .select.is-large{font-size:1.5rem}html.theme--documenter-dark .select.is-disabled::after{border-color:#fff !important;opacity:0.5}html.theme--documenter-dark .select.is-fullwidth{width:100%}html.theme--documenter-dark .select.is-fullwidth select{width:100%}html.theme--documenter-dark .select.is-loading::after{margin-top:0;position:absolute;right:.625em;top:0.625em;transform:none}html.theme--documenter-dark .select.is-loading.is-small:after,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-loading:after{font-size:.75rem}html.theme--documenter-dark .select.is-loading.is-medium:after{font-size:1.25rem}html.theme--documenter-dark .select.is-loading.is-large:after{font-size:1.5rem}html.theme--documenter-dark .file{align-items:stretch;display:flex;justify-content:flex-start;position:relative}html.theme--documenter-dark .file.is-white .file-cta{background-color:#fff;border-color:transparent;color:#0a0a0a}html.theme--documenter-dark .file.is-white:hover .file-cta,html.theme--documenter-dark .file.is-white.is-hovered .file-cta{background-color:#f9f9f9;border-color:transparent;color:#0a0a0a}html.theme--documenter-dark .file.is-white:focus .file-cta,html.theme--documenter-dark .file.is-white.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(255,255,255,0.25);color:#0a0a0a}html.theme--documenter-dark .file.is-white:active .file-cta,html.theme--documenter-dark .file.is-white.is-active .file-cta{background-color:#f2f2f2;border-color:transparent;color:#0a0a0a}html.theme--documenter-dark .file.is-black .file-cta{background-color:#0a0a0a;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-black:hover .file-cta,html.theme--documenter-dark .file.is-black.is-hovered .file-cta{background-color:#040404;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-black:focus .file-cta,html.theme--documenter-dark .file.is-black.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(10,10,10,0.25);color:#fff}html.theme--documenter-dark .file.is-black:active .file-cta,html.theme--documenter-dark .file.is-black.is-active .file-cta{background-color:#000;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-light .file-cta{background-color:#ecf0f1;border-color:transparent;color:rgba(0,0,0,0.7)}html.theme--documenter-dark .file.is-light:hover .file-cta,html.theme--documenter-dark .file.is-light.is-hovered .file-cta{background-color:#e5eaec;border-color:transparent;color:rgba(0,0,0,0.7)}html.theme--documenter-dark .file.is-light:focus .file-cta,html.theme--documenter-dark .file.is-light.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(236,240,241,0.25);color:rgba(0,0,0,0.7)}html.theme--documenter-dark .file.is-light:active .file-cta,html.theme--documenter-dark .file.is-light.is-active .file-cta{background-color:#dde4e6;border-color:transparent;color:rgba(0,0,0,0.7)}html.theme--documenter-dark .file.is-dark .file-cta,html.theme--documenter-dark .content kbd.file .file-cta{background-color:#282f2f;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-dark:hover .file-cta,html.theme--documenter-dark .content kbd.file:hover .file-cta,html.theme--documenter-dark .file.is-dark.is-hovered .file-cta,html.theme--documenter-dark .content kbd.file.is-hovered .file-cta{background-color:#232829;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-dark:focus .file-cta,html.theme--documenter-dark .content kbd.file:focus .file-cta,html.theme--documenter-dark .file.is-dark.is-focused .file-cta,html.theme--documenter-dark .content kbd.file.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(40,47,47,0.25);color:#fff}html.theme--documenter-dark .file.is-dark:active .file-cta,html.theme--documenter-dark .content kbd.file:active .file-cta,html.theme--documenter-dark .file.is-dark.is-active .file-cta,html.theme--documenter-dark .content kbd.file.is-active .file-cta{background-color:#1d2122;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-primary .file-cta,html.theme--documenter-dark .docstring>section>a.file.docs-sourcelink .file-cta{background-color:#375a7f;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-primary:hover .file-cta,html.theme--documenter-dark .docstring>section>a.file.docs-sourcelink:hover .file-cta,html.theme--documenter-dark .file.is-primary.is-hovered .file-cta,html.theme--documenter-dark .docstring>section>a.file.is-hovered.docs-sourcelink .file-cta{background-color:#335476;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-primary:focus .file-cta,html.theme--documenter-dark .docstring>section>a.file.docs-sourcelink:focus .file-cta,html.theme--documenter-dark .file.is-primary.is-focused .file-cta,html.theme--documenter-dark .docstring>section>a.file.is-focused.docs-sourcelink .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(55,90,127,0.25);color:#fff}html.theme--documenter-dark .file.is-primary:active .file-cta,html.theme--documenter-dark .docstring>section>a.file.docs-sourcelink:active .file-cta,html.theme--documenter-dark .file.is-primary.is-active .file-cta,html.theme--documenter-dark .docstring>section>a.file.is-active.docs-sourcelink .file-cta{background-color:#2f4d6d;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-link .file-cta{background-color:#1abc9c;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-link:hover .file-cta,html.theme--documenter-dark .file.is-link.is-hovered .file-cta{background-color:#18b193;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-link:focus .file-cta,html.theme--documenter-dark .file.is-link.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(26,188,156,0.25);color:#fff}html.theme--documenter-dark .file.is-link:active .file-cta,html.theme--documenter-dark .file.is-link.is-active .file-cta{background-color:#17a689;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-info .file-cta{background-color:#024c7d;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-info:hover .file-cta,html.theme--documenter-dark .file.is-info.is-hovered .file-cta{background-color:#024470;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-info:focus .file-cta,html.theme--documenter-dark .file.is-info.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(2,76,125,0.25);color:#fff}html.theme--documenter-dark .file.is-info:active .file-cta,html.theme--documenter-dark .file.is-info.is-active .file-cta{background-color:#023d64;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-success .file-cta{background-color:#008438;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-success:hover .file-cta,html.theme--documenter-dark .file.is-success.is-hovered .file-cta{background-color:#073;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-success:focus .file-cta,html.theme--documenter-dark .file.is-success.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(0,132,56,0.25);color:#fff}html.theme--documenter-dark .file.is-success:active .file-cta,html.theme--documenter-dark .file.is-success.is-active .file-cta{background-color:#006b2d;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-warning .file-cta{background-color:#ad8100;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-warning:hover .file-cta,html.theme--documenter-dark .file.is-warning.is-hovered .file-cta{background-color:#a07700;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-warning:focus .file-cta,html.theme--documenter-dark .file.is-warning.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(173,129,0,0.25);color:#fff}html.theme--documenter-dark .file.is-warning:active .file-cta,html.theme--documenter-dark .file.is-warning.is-active .file-cta{background-color:#946e00;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-danger .file-cta{background-color:#9e1b0d;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-danger:hover .file-cta,html.theme--documenter-dark .file.is-danger.is-hovered .file-cta{background-color:#92190c;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-danger:focus .file-cta,html.theme--documenter-dark .file.is-danger.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(158,27,13,0.25);color:#fff}html.theme--documenter-dark .file.is-danger:active .file-cta,html.theme--documenter-dark .file.is-danger.is-active .file-cta{background-color:#86170b;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-small,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.file{font-size:.75rem}html.theme--documenter-dark .file.is-normal{font-size:1rem}html.theme--documenter-dark .file.is-medium{font-size:1.25rem}html.theme--documenter-dark .file.is-medium .file-icon .fa{font-size:21px}html.theme--documenter-dark .file.is-large{font-size:1.5rem}html.theme--documenter-dark .file.is-large .file-icon .fa{font-size:28px}html.theme--documenter-dark .file.has-name .file-cta{border-bottom-right-radius:0;border-top-right-radius:0}html.theme--documenter-dark .file.has-name .file-name{border-bottom-left-radius:0;border-top-left-radius:0}html.theme--documenter-dark .file.has-name.is-empty .file-cta{border-radius:.4em}html.theme--documenter-dark .file.has-name.is-empty .file-name{display:none}html.theme--documenter-dark .file.is-boxed .file-label{flex-direction:column}html.theme--documenter-dark .file.is-boxed .file-cta{flex-direction:column;height:auto;padding:1em 3em}html.theme--documenter-dark .file.is-boxed .file-name{border-width:0 1px 1px}html.theme--documenter-dark .file.is-boxed .file-icon{height:1.5em;width:1.5em}html.theme--documenter-dark .file.is-boxed .file-icon .fa{font-size:21px}html.theme--documenter-dark .file.is-boxed.is-small .file-icon .fa,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-boxed .file-icon .fa{font-size:14px}html.theme--documenter-dark .file.is-boxed.is-medium .file-icon .fa{font-size:28px}html.theme--documenter-dark .file.is-boxed.is-large .file-icon .fa{font-size:35px}html.theme--documenter-dark .file.is-boxed.has-name .file-cta{border-radius:.4em .4em 0 0}html.theme--documenter-dark .file.is-boxed.has-name .file-name{border-radius:0 0 .4em .4em;border-width:0 1px 1px}html.theme--documenter-dark .file.is-centered{justify-content:center}html.theme--documenter-dark .file.is-fullwidth .file-label{width:100%}html.theme--documenter-dark .file.is-fullwidth .file-name{flex-grow:1;max-width:none}html.theme--documenter-dark .file.is-right{justify-content:flex-end}html.theme--documenter-dark .file.is-right .file-cta{border-radius:0 .4em .4em 0}html.theme--documenter-dark .file.is-right .file-name{border-radius:.4em 0 0 .4em;border-width:1px 0 1px 1px;order:-1}html.theme--documenter-dark .file-label{align-items:stretch;display:flex;cursor:pointer;justify-content:flex-start;overflow:hidden;position:relative}html.theme--documenter-dark .file-label:hover .file-cta{background-color:#232829;color:#f2f2f2}html.theme--documenter-dark .file-label:hover .file-name{border-color:#596668}html.theme--documenter-dark .file-label:active .file-cta{background-color:#1d2122;color:#f2f2f2}html.theme--documenter-dark .file-label:active .file-name{border-color:#535f61}html.theme--documenter-dark .file-input{height:100%;left:0;opacity:0;outline:none;position:absolute;top:0;width:100%}html.theme--documenter-dark .file-cta,html.theme--documenter-dark .file-name{border-color:#5e6d6f;border-radius:.4em;font-size:1em;padding-left:1em;padding-right:1em;white-space:nowrap}html.theme--documenter-dark .file-cta{background-color:#282f2f;color:#fff}html.theme--documenter-dark .file-name{border-color:#5e6d6f;border-style:solid;border-width:1px 1px 1px 0;display:block;max-width:16em;overflow:hidden;text-align:inherit;text-overflow:ellipsis}html.theme--documenter-dark .file-icon{align-items:center;display:flex;height:1em;justify-content:center;margin-right:.5em;width:1em}html.theme--documenter-dark .file-icon .fa{font-size:14px}html.theme--documenter-dark .label{color:#f2f2f2;display:block;font-size:1rem;font-weight:700}html.theme--documenter-dark .label:not(:last-child){margin-bottom:0.5em}html.theme--documenter-dark .label.is-small,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.label{font-size:.75rem}html.theme--documenter-dark .label.is-medium{font-size:1.25rem}html.theme--documenter-dark .label.is-large{font-size:1.5rem}html.theme--documenter-dark .help{display:block;font-size:.75rem;margin-top:0.25rem}html.theme--documenter-dark .help.is-white{color:#fff}html.theme--documenter-dark .help.is-black{color:#0a0a0a}html.theme--documenter-dark .help.is-light{color:#ecf0f1}html.theme--documenter-dark .help.is-dark,html.theme--documenter-dark .content kbd.help{color:#282f2f}html.theme--documenter-dark .help.is-primary,html.theme--documenter-dark .docstring>section>a.help.docs-sourcelink{color:#375a7f}html.theme--documenter-dark .help.is-link{color:#1abc9c}html.theme--documenter-dark .help.is-info{color:#024c7d}html.theme--documenter-dark .help.is-success{color:#008438}html.theme--documenter-dark .help.is-warning{color:#ad8100}html.theme--documenter-dark .help.is-danger{color:#9e1b0d}html.theme--documenter-dark .field:not(:last-child){margin-bottom:0.75rem}html.theme--documenter-dark .field.has-addons{display:flex;justify-content:flex-start}html.theme--documenter-dark .field.has-addons .control:not(:last-child){margin-right:-1px}html.theme--documenter-dark .field.has-addons .control:not(:first-child):not(:last-child) .button,html.theme--documenter-dark .field.has-addons .control:not(:first-child):not(:last-child) .input,html.theme--documenter-dark .field.has-addons .control:not(:first-child):not(:last-child) #documenter .docs-sidebar form.docs-search>input,html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control:not(:first-child):not(:last-child) form.docs-search>input,html.theme--documenter-dark .field.has-addons .control:not(:first-child):not(:last-child) .select select{border-radius:0}html.theme--documenter-dark .field.has-addons .control:first-child:not(:only-child) .button,html.theme--documenter-dark .field.has-addons .control:first-child:not(:only-child) .input,html.theme--documenter-dark .field.has-addons .control:first-child:not(:only-child) #documenter .docs-sidebar form.docs-search>input,html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control:first-child:not(:only-child) form.docs-search>input,html.theme--documenter-dark .field.has-addons .control:first-child:not(:only-child) .select select{border-bottom-right-radius:0;border-top-right-radius:0}html.theme--documenter-dark .field.has-addons .control:last-child:not(:only-child) .button,html.theme--documenter-dark .field.has-addons .control:last-child:not(:only-child) .input,html.theme--documenter-dark .field.has-addons .control:last-child:not(:only-child) #documenter .docs-sidebar form.docs-search>input,html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control:last-child:not(:only-child) form.docs-search>input,html.theme--documenter-dark .field.has-addons .control:last-child:not(:only-child) .select select{border-bottom-left-radius:0;border-top-left-radius:0}html.theme--documenter-dark .field.has-addons .control .button:not([disabled]):hover,html.theme--documenter-dark .field.has-addons .control .button.is-hovered:not([disabled]),html.theme--documenter-dark .field.has-addons .control .input:not([disabled]):hover,html.theme--documenter-dark .field.has-addons .control #documenter .docs-sidebar form.docs-search>input:not([disabled]):hover,html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control form.docs-search>input:not([disabled]):hover,html.theme--documenter-dark .field.has-addons .control .input.is-hovered:not([disabled]),html.theme--documenter-dark .field.has-addons .control #documenter .docs-sidebar form.docs-search>input.is-hovered:not([disabled]),html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control form.docs-search>input.is-hovered:not([disabled]),html.theme--documenter-dark .field.has-addons .control .select select:not([disabled]):hover,html.theme--documenter-dark .field.has-addons .control .select select.is-hovered:not([disabled]){z-index:2}html.theme--documenter-dark .field.has-addons .control .button:not([disabled]):focus,html.theme--documenter-dark .field.has-addons .control .button.is-focused:not([disabled]),html.theme--documenter-dark .field.has-addons .control .button:not([disabled]):active,html.theme--documenter-dark .field.has-addons .control .button.is-active:not([disabled]),html.theme--documenter-dark .field.has-addons .control .input:not([disabled]):focus,html.theme--documenter-dark .field.has-addons .control #documenter .docs-sidebar form.docs-search>input:not([disabled]):focus,html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control form.docs-search>input:not([disabled]):focus,html.theme--documenter-dark .field.has-addons .control .input.is-focused:not([disabled]),html.theme--documenter-dark .field.has-addons .control #documenter .docs-sidebar form.docs-search>input.is-focused:not([disabled]),html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control form.docs-search>input.is-focused:not([disabled]),html.theme--documenter-dark .field.has-addons .control .input:not([disabled]):active,html.theme--documenter-dark .field.has-addons .control #documenter .docs-sidebar form.docs-search>input:not([disabled]):active,html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control form.docs-search>input:not([disabled]):active,html.theme--documenter-dark .field.has-addons .control .input.is-active:not([disabled]),html.theme--documenter-dark .field.has-addons .control #documenter .docs-sidebar form.docs-search>input.is-active:not([disabled]),html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control form.docs-search>input.is-active:not([disabled]),html.theme--documenter-dark .field.has-addons .control .select select:not([disabled]):focus,html.theme--documenter-dark .field.has-addons .control .select select.is-focused:not([disabled]),html.theme--documenter-dark .field.has-addons .control .select select:not([disabled]):active,html.theme--documenter-dark .field.has-addons .control .select select.is-active:not([disabled]){z-index:3}html.theme--documenter-dark .field.has-addons .control .button:not([disabled]):focus:hover,html.theme--documenter-dark .field.has-addons .control .button.is-focused:not([disabled]):hover,html.theme--documenter-dark .field.has-addons .control .button:not([disabled]):active:hover,html.theme--documenter-dark .field.has-addons .control .button.is-active:not([disabled]):hover,html.theme--documenter-dark .field.has-addons .control .input:not([disabled]):focus:hover,html.theme--documenter-dark .field.has-addons .control #documenter .docs-sidebar form.docs-search>input:not([disabled]):focus:hover,html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control form.docs-search>input:not([disabled]):focus:hover,html.theme--documenter-dark .field.has-addons .control .input.is-focused:not([disabled]):hover,html.theme--documenter-dark .field.has-addons .control #documenter .docs-sidebar form.docs-search>input.is-focused:not([disabled]):hover,html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control form.docs-search>input.is-focused:not([disabled]):hover,html.theme--documenter-dark .field.has-addons .control .input:not([disabled]):active:hover,html.theme--documenter-dark .field.has-addons .control #documenter .docs-sidebar form.docs-search>input:not([disabled]):active:hover,html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control form.docs-search>input:not([disabled]):active:hover,html.theme--documenter-dark .field.has-addons .control .input.is-active:not([disabled]):hover,html.theme--documenter-dark .field.has-addons .control #documenter .docs-sidebar form.docs-search>input.is-active:not([disabled]):hover,html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control form.docs-search>input.is-active:not([disabled]):hover,html.theme--documenter-dark .field.has-addons .control .select select:not([disabled]):focus:hover,html.theme--documenter-dark .field.has-addons .control .select select.is-focused:not([disabled]):hover,html.theme--documenter-dark .field.has-addons .control .select select:not([disabled]):active:hover,html.theme--documenter-dark .field.has-addons .control .select select.is-active:not([disabled]):hover{z-index:4}html.theme--documenter-dark .field.has-addons .control.is-expanded{flex-grow:1;flex-shrink:1}html.theme--documenter-dark .field.has-addons.has-addons-centered{justify-content:center}html.theme--documenter-dark .field.has-addons.has-addons-right{justify-content:flex-end}html.theme--documenter-dark .field.has-addons.has-addons-fullwidth .control{flex-grow:1;flex-shrink:0}html.theme--documenter-dark .field.is-grouped{display:flex;justify-content:flex-start}html.theme--documenter-dark .field.is-grouped>.control{flex-shrink:0}html.theme--documenter-dark .field.is-grouped>.control:not(:last-child){margin-bottom:0;margin-right:.75rem}html.theme--documenter-dark .field.is-grouped>.control.is-expanded{flex-grow:1;flex-shrink:1}html.theme--documenter-dark .field.is-grouped.is-grouped-centered{justify-content:center}html.theme--documenter-dark .field.is-grouped.is-grouped-right{justify-content:flex-end}html.theme--documenter-dark .field.is-grouped.is-grouped-multiline{flex-wrap:wrap}html.theme--documenter-dark .field.is-grouped.is-grouped-multiline>.control:last-child,html.theme--documenter-dark .field.is-grouped.is-grouped-multiline>.control:not(:last-child){margin-bottom:0.75rem}html.theme--documenter-dark .field.is-grouped.is-grouped-multiline:last-child{margin-bottom:-0.75rem}html.theme--documenter-dark .field.is-grouped.is-grouped-multiline:not(:last-child){margin-bottom:0}@media screen and (min-width: 769px),print{html.theme--documenter-dark .field.is-horizontal{display:flex}}html.theme--documenter-dark .field-label .label{font-size:inherit}@media screen and (max-width: 768px){html.theme--documenter-dark .field-label{margin-bottom:0.5rem}}@media screen and (min-width: 769px),print{html.theme--documenter-dark .field-label{flex-basis:0;flex-grow:1;flex-shrink:0;margin-right:1.5rem;text-align:right}html.theme--documenter-dark .field-label.is-small,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.field-label{font-size:.75rem;padding-top:0.375em}html.theme--documenter-dark .field-label.is-normal{padding-top:0.375em}html.theme--documenter-dark .field-label.is-medium{font-size:1.25rem;padding-top:0.375em}html.theme--documenter-dark .field-label.is-large{font-size:1.5rem;padding-top:0.375em}}html.theme--documenter-dark .field-body .field .field{margin-bottom:0}@media screen and (min-width: 769px),print{html.theme--documenter-dark .field-body{display:flex;flex-basis:0;flex-grow:5;flex-shrink:1}html.theme--documenter-dark .field-body .field{margin-bottom:0}html.theme--documenter-dark .field-body>.field{flex-shrink:1}html.theme--documenter-dark .field-body>.field:not(.is-narrow){flex-grow:1}html.theme--documenter-dark .field-body>.field:not(:last-child){margin-right:.75rem}}html.theme--documenter-dark .control{box-sizing:border-box;clear:both;font-size:1rem;position:relative;text-align:inherit}html.theme--documenter-dark .control.has-icons-left .input:focus~.icon,html.theme--documenter-dark .control.has-icons-left #documenter .docs-sidebar form.docs-search>input:focus~.icon,html.theme--documenter-dark #documenter .docs-sidebar .control.has-icons-left form.docs-search>input:focus~.icon,html.theme--documenter-dark .control.has-icons-left .select:focus~.icon,html.theme--documenter-dark .control.has-icons-right .input:focus~.icon,html.theme--documenter-dark .control.has-icons-right #documenter .docs-sidebar form.docs-search>input:focus~.icon,html.theme--documenter-dark #documenter .docs-sidebar .control.has-icons-right form.docs-search>input:focus~.icon,html.theme--documenter-dark .control.has-icons-right .select:focus~.icon{color:#282f2f}html.theme--documenter-dark .control.has-icons-left .input.is-small~.icon,html.theme--documenter-dark .control.has-icons-left #documenter .docs-sidebar form.docs-search>input~.icon,html.theme--documenter-dark #documenter .docs-sidebar .control.has-icons-left form.docs-search>input~.icon,html.theme--documenter-dark .control.has-icons-left .select.is-small~.icon,html.theme--documenter-dark .control.has-icons-right .input.is-small~.icon,html.theme--documenter-dark .control.has-icons-right #documenter .docs-sidebar form.docs-search>input~.icon,html.theme--documenter-dark #documenter .docs-sidebar .control.has-icons-right form.docs-search>input~.icon,html.theme--documenter-dark .control.has-icons-right .select.is-small~.icon{font-size:.75rem}html.theme--documenter-dark .control.has-icons-left .input.is-medium~.icon,html.theme--documenter-dark .control.has-icons-left #documenter .docs-sidebar form.docs-search>input.is-medium~.icon,html.theme--documenter-dark #documenter .docs-sidebar .control.has-icons-left form.docs-search>input.is-medium~.icon,html.theme--documenter-dark .control.has-icons-left .select.is-medium~.icon,html.theme--documenter-dark .control.has-icons-right .input.is-medium~.icon,html.theme--documenter-dark .control.has-icons-right #documenter .docs-sidebar form.docs-search>input.is-medium~.icon,html.theme--documenter-dark #documenter .docs-sidebar .control.has-icons-right form.docs-search>input.is-medium~.icon,html.theme--documenter-dark .control.has-icons-right .select.is-medium~.icon{font-size:1.25rem}html.theme--documenter-dark .control.has-icons-left .input.is-large~.icon,html.theme--documenter-dark .control.has-icons-left #documenter .docs-sidebar form.docs-search>input.is-large~.icon,html.theme--documenter-dark #documenter .docs-sidebar .control.has-icons-left form.docs-search>input.is-large~.icon,html.theme--documenter-dark .control.has-icons-left .select.is-large~.icon,html.theme--documenter-dark .control.has-icons-right .input.is-large~.icon,html.theme--documenter-dark .control.has-icons-right #documenter .docs-sidebar form.docs-search>input.is-large~.icon,html.theme--documenter-dark #documenter .docs-sidebar .control.has-icons-right form.docs-search>input.is-large~.icon,html.theme--documenter-dark .control.has-icons-right .select.is-large~.icon{font-size:1.5rem}html.theme--documenter-dark .control.has-icons-left .icon,html.theme--documenter-dark .control.has-icons-right .icon{color:#5e6d6f;height:2.5em;pointer-events:none;position:absolute;top:0;width:2.5em;z-index:4}html.theme--documenter-dark .control.has-icons-left .input,html.theme--documenter-dark .control.has-icons-left #documenter .docs-sidebar form.docs-search>input,html.theme--documenter-dark #documenter .docs-sidebar .control.has-icons-left form.docs-search>input,html.theme--documenter-dark .control.has-icons-left .select select{padding-left:2.5em}html.theme--documenter-dark .control.has-icons-left .icon.is-left{left:0}html.theme--documenter-dark .control.has-icons-right .input,html.theme--documenter-dark .control.has-icons-right #documenter .docs-sidebar form.docs-search>input,html.theme--documenter-dark #documenter .docs-sidebar .control.has-icons-right form.docs-search>input,html.theme--documenter-dark .control.has-icons-right .select select{padding-right:2.5em}html.theme--documenter-dark .control.has-icons-right .icon.is-right{right:0}html.theme--documenter-dark .control.is-loading::after{position:absolute !important;right:.625em;top:0.625em;z-index:4}html.theme--documenter-dark .control.is-loading.is-small:after,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-loading:after{font-size:.75rem}html.theme--documenter-dark .control.is-loading.is-medium:after{font-size:1.25rem}html.theme--documenter-dark .control.is-loading.is-large:after{font-size:1.5rem}html.theme--documenter-dark .breadcrumb{font-size:1rem;white-space:nowrap}html.theme--documenter-dark .breadcrumb a{align-items:center;color:#1abc9c;display:flex;justify-content:center;padding:0 .75em}html.theme--documenter-dark .breadcrumb a:hover{color:#1dd2af}html.theme--documenter-dark .breadcrumb li{align-items:center;display:flex}html.theme--documenter-dark .breadcrumb li:first-child a{padding-left:0}html.theme--documenter-dark .breadcrumb li.is-active a{color:#f2f2f2;cursor:default;pointer-events:none}html.theme--documenter-dark .breadcrumb li+li::before{color:#8c9b9d;content:"\0002f"}html.theme--documenter-dark .breadcrumb ul,html.theme--documenter-dark .breadcrumb ol{align-items:flex-start;display:flex;flex-wrap:wrap;justify-content:flex-start}html.theme--documenter-dark .breadcrumb .icon:first-child{margin-right:.5em}html.theme--documenter-dark .breadcrumb .icon:last-child{margin-left:.5em}html.theme--documenter-dark .breadcrumb.is-centered ol,html.theme--documenter-dark .breadcrumb.is-centered ul{justify-content:center}html.theme--documenter-dark .breadcrumb.is-right ol,html.theme--documenter-dark .breadcrumb.is-right ul{justify-content:flex-end}html.theme--documenter-dark .breadcrumb.is-small,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.breadcrumb{font-size:.75rem}html.theme--documenter-dark .breadcrumb.is-medium{font-size:1.25rem}html.theme--documenter-dark .breadcrumb.is-large{font-size:1.5rem}html.theme--documenter-dark .breadcrumb.has-arrow-separator li+li::before{content:"\02192"}html.theme--documenter-dark .breadcrumb.has-bullet-separator li+li::before{content:"\02022"}html.theme--documenter-dark .breadcrumb.has-dot-separator li+li::before{content:"\000b7"}html.theme--documenter-dark .breadcrumb.has-succeeds-separator li+li::before{content:"\0227B"}html.theme--documenter-dark .card{background-color:#fff;border-radius:.25rem;box-shadow:#171717;color:#fff;max-width:100%;position:relative}html.theme--documenter-dark .card-footer:first-child,html.theme--documenter-dark .card-content:first-child,html.theme--documenter-dark .card-header:first-child{border-top-left-radius:.25rem;border-top-right-radius:.25rem}html.theme--documenter-dark .card-footer:last-child,html.theme--documenter-dark .card-content:last-child,html.theme--documenter-dark .card-header:last-child{border-bottom-left-radius:.25rem;border-bottom-right-radius:.25rem}html.theme--documenter-dark .card-header{background-color:rgba(0,0,0,0);align-items:stretch;box-shadow:0 0.125em 0.25em rgba(10,10,10,0.1);display:flex}html.theme--documenter-dark .card-header-title{align-items:center;color:#f2f2f2;display:flex;flex-grow:1;font-weight:700;padding:0.75rem 1rem}html.theme--documenter-dark .card-header-title.is-centered{justify-content:center}html.theme--documenter-dark .card-header-icon{-moz-appearance:none;-webkit-appearance:none;appearance:none;background:none;border:none;color:currentColor;font-family:inherit;font-size:1em;margin:0;padding:0;align-items:center;cursor:pointer;display:flex;justify-content:center;padding:0.75rem 1rem}html.theme--documenter-dark .card-image{display:block;position:relative}html.theme--documenter-dark .card-image:first-child img{border-top-left-radius:.25rem;border-top-right-radius:.25rem}html.theme--documenter-dark .card-image:last-child img{border-bottom-left-radius:.25rem;border-bottom-right-radius:.25rem}html.theme--documenter-dark .card-content{background-color:rgba(0,0,0,0);padding:1.5rem}html.theme--documenter-dark .card-footer{background-color:rgba(0,0,0,0);border-top:1px solid #ededed;align-items:stretch;display:flex}html.theme--documenter-dark .card-footer-item{align-items:center;display:flex;flex-basis:0;flex-grow:1;flex-shrink:0;justify-content:center;padding:.75rem}html.theme--documenter-dark .card-footer-item:not(:last-child){border-right:1px solid #ededed}html.theme--documenter-dark .card .media:not(:last-child){margin-bottom:1.5rem}html.theme--documenter-dark .dropdown{display:inline-flex;position:relative;vertical-align:top}html.theme--documenter-dark .dropdown.is-active .dropdown-menu,html.theme--documenter-dark .dropdown.is-hoverable:hover .dropdown-menu{display:block}html.theme--documenter-dark .dropdown.is-right .dropdown-menu{left:auto;right:0}html.theme--documenter-dark .dropdown.is-up .dropdown-menu{bottom:100%;padding-bottom:4px;padding-top:initial;top:auto}html.theme--documenter-dark .dropdown-menu{display:none;left:0;min-width:12rem;padding-top:4px;position:absolute;top:100%;z-index:20}html.theme--documenter-dark .dropdown-content{background-color:#282f2f;border-radius:.4em;box-shadow:#171717;padding-bottom:.5rem;padding-top:.5rem}html.theme--documenter-dark .dropdown-item{color:#fff;display:block;font-size:0.875rem;line-height:1.5;padding:0.375rem 1rem;position:relative}html.theme--documenter-dark a.dropdown-item,html.theme--documenter-dark button.dropdown-item{padding-right:3rem;text-align:inherit;white-space:nowrap;width:100%}html.theme--documenter-dark a.dropdown-item:hover,html.theme--documenter-dark button.dropdown-item:hover{background-color:#282f2f;color:#0a0a0a}html.theme--documenter-dark a.dropdown-item.is-active,html.theme--documenter-dark button.dropdown-item.is-active{background-color:#1abc9c;color:#fff}html.theme--documenter-dark .dropdown-divider{background-color:#ededed;border:none;display:block;height:1px;margin:0.5rem 0}html.theme--documenter-dark .level{align-items:center;justify-content:space-between}html.theme--documenter-dark .level code{border-radius:.4em}html.theme--documenter-dark .level img{display:inline-block;vertical-align:top}html.theme--documenter-dark .level.is-mobile{display:flex}html.theme--documenter-dark .level.is-mobile .level-left,html.theme--documenter-dark .level.is-mobile .level-right{display:flex}html.theme--documenter-dark .level.is-mobile .level-left+.level-right{margin-top:0}html.theme--documenter-dark .level.is-mobile .level-item:not(:last-child){margin-bottom:0;margin-right:.75rem}html.theme--documenter-dark .level.is-mobile .level-item:not(.is-narrow){flex-grow:1}@media screen and (min-width: 769px),print{html.theme--documenter-dark .level{display:flex}html.theme--documenter-dark .level>.level-item:not(.is-narrow){flex-grow:1}}html.theme--documenter-dark .level-item{align-items:center;display:flex;flex-basis:auto;flex-grow:0;flex-shrink:0;justify-content:center}html.theme--documenter-dark .level-item .title,html.theme--documenter-dark .level-item .subtitle{margin-bottom:0}@media screen and (max-width: 768px){html.theme--documenter-dark .level-item:not(:last-child){margin-bottom:.75rem}}html.theme--documenter-dark .level-left,html.theme--documenter-dark .level-right{flex-basis:auto;flex-grow:0;flex-shrink:0}html.theme--documenter-dark .level-left .level-item.is-flexible,html.theme--documenter-dark .level-right .level-item.is-flexible{flex-grow:1}@media screen and (min-width: 769px),print{html.theme--documenter-dark .level-left .level-item:not(:last-child),html.theme--documenter-dark .level-right .level-item:not(:last-child){margin-right:.75rem}}html.theme--documenter-dark .level-left{align-items:center;justify-content:flex-start}@media screen and (max-width: 768px){html.theme--documenter-dark .level-left+.level-right{margin-top:1.5rem}}@media screen and (min-width: 769px),print{html.theme--documenter-dark .level-left{display:flex}}html.theme--documenter-dark .level-right{align-items:center;justify-content:flex-end}@media screen and (min-width: 769px),print{html.theme--documenter-dark .level-right{display:flex}}html.theme--documenter-dark .media{align-items:flex-start;display:flex;text-align:inherit}html.theme--documenter-dark .media .content:not(:last-child){margin-bottom:.75rem}html.theme--documenter-dark .media .media{border-top:1px solid rgba(94,109,111,0.5);display:flex;padding-top:.75rem}html.theme--documenter-dark .media .media .content:not(:last-child),html.theme--documenter-dark .media .media .control:not(:last-child){margin-bottom:.5rem}html.theme--documenter-dark .media .media .media{padding-top:.5rem}html.theme--documenter-dark .media .media .media+.media{margin-top:.5rem}html.theme--documenter-dark .media+.media{border-top:1px solid rgba(94,109,111,0.5);margin-top:1rem;padding-top:1rem}html.theme--documenter-dark .media.is-large+.media{margin-top:1.5rem;padding-top:1.5rem}html.theme--documenter-dark .media-left,html.theme--documenter-dark .media-right{flex-basis:auto;flex-grow:0;flex-shrink:0}html.theme--documenter-dark .media-left{margin-right:1rem}html.theme--documenter-dark .media-right{margin-left:1rem}html.theme--documenter-dark .media-content{flex-basis:auto;flex-grow:1;flex-shrink:1;text-align:inherit}@media screen and (max-width: 768px){html.theme--documenter-dark .media-content{overflow-x:auto}}html.theme--documenter-dark .menu{font-size:1rem}html.theme--documenter-dark .menu.is-small,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.menu{font-size:.75rem}html.theme--documenter-dark .menu.is-medium{font-size:1.25rem}html.theme--documenter-dark .menu.is-large{font-size:1.5rem}html.theme--documenter-dark .menu-list{line-height:1.25}html.theme--documenter-dark .menu-list a{border-radius:3px;color:#fff;display:block;padding:0.5em 0.75em}html.theme--documenter-dark .menu-list a:hover{background-color:#282f2f;color:#f2f2f2}html.theme--documenter-dark .menu-list a.is-active{background-color:#1abc9c;color:#fff}html.theme--documenter-dark .menu-list li ul{border-left:1px solid #5e6d6f;margin:.75em;padding-left:.75em}html.theme--documenter-dark .menu-label{color:#fff;font-size:.75em;letter-spacing:.1em;text-transform:uppercase}html.theme--documenter-dark .menu-label:not(:first-child){margin-top:1em}html.theme--documenter-dark .menu-label:not(:last-child){margin-bottom:1em}html.theme--documenter-dark .message{background-color:#282f2f;border-radius:.4em;font-size:1rem}html.theme--documenter-dark .message strong{color:currentColor}html.theme--documenter-dark .message a:not(.button):not(.tag):not(.dropdown-item){color:currentColor;text-decoration:underline}html.theme--documenter-dark .message.is-small,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.message{font-size:.75rem}html.theme--documenter-dark .message.is-medium{font-size:1.25rem}html.theme--documenter-dark .message.is-large{font-size:1.5rem}html.theme--documenter-dark .message.is-white{background-color:#fff}html.theme--documenter-dark .message.is-white .message-header{background-color:#fff;color:#0a0a0a}html.theme--documenter-dark .message.is-white .message-body{border-color:#fff}html.theme--documenter-dark .message.is-black{background-color:#fafafa}html.theme--documenter-dark .message.is-black .message-header{background-color:#0a0a0a;color:#fff}html.theme--documenter-dark .message.is-black .message-body{border-color:#0a0a0a}html.theme--documenter-dark .message.is-light{background-color:#f9fafb}html.theme--documenter-dark .message.is-light .message-header{background-color:#ecf0f1;color:rgba(0,0,0,0.7)}html.theme--documenter-dark .message.is-light .message-body{border-color:#ecf0f1}html.theme--documenter-dark .message.is-dark,html.theme--documenter-dark .content kbd.message{background-color:#f9fafa}html.theme--documenter-dark .message.is-dark .message-header,html.theme--documenter-dark .content kbd.message .message-header{background-color:#282f2f;color:#fff}html.theme--documenter-dark .message.is-dark .message-body,html.theme--documenter-dark .content kbd.message .message-body{border-color:#282f2f}html.theme--documenter-dark .message.is-primary,html.theme--documenter-dark .docstring>section>a.message.docs-sourcelink{background-color:#f1f5f9}html.theme--documenter-dark .message.is-primary .message-header,html.theme--documenter-dark .docstring>section>a.message.docs-sourcelink .message-header{background-color:#375a7f;color:#fff}html.theme--documenter-dark .message.is-primary .message-body,html.theme--documenter-dark .docstring>section>a.message.docs-sourcelink .message-body{border-color:#375a7f;color:#4d7eb2}html.theme--documenter-dark .message.is-link{background-color:#edfdf9}html.theme--documenter-dark .message.is-link .message-header{background-color:#1abc9c;color:#fff}html.theme--documenter-dark .message.is-link .message-body{border-color:#1abc9c;color:#15987e}html.theme--documenter-dark .message.is-info{background-color:#ebf7ff}html.theme--documenter-dark .message.is-info .message-header{background-color:#024c7d;color:#fff}html.theme--documenter-dark .message.is-info .message-body{border-color:#024c7d;color:#0e9dfb}html.theme--documenter-dark .message.is-success{background-color:#ebfff3}html.theme--documenter-dark .message.is-success .message-header{background-color:#008438;color:#fff}html.theme--documenter-dark .message.is-success .message-body{border-color:#008438;color:#00eb64}html.theme--documenter-dark .message.is-warning{background-color:#fffaeb}html.theme--documenter-dark .message.is-warning .message-header{background-color:#ad8100;color:#fff}html.theme--documenter-dark .message.is-warning .message-body{border-color:#ad8100;color:#d19c00}html.theme--documenter-dark .message.is-danger{background-color:#fdeeec}html.theme--documenter-dark .message.is-danger .message-header{background-color:#9e1b0d;color:#fff}html.theme--documenter-dark .message.is-danger .message-body{border-color:#9e1b0d;color:#ec311d}html.theme--documenter-dark .message-header{align-items:center;background-color:#fff;border-radius:.4em .4em 0 0;color:rgba(0,0,0,0.7);display:flex;font-weight:700;justify-content:space-between;line-height:1.25;padding:0.75em 1em;position:relative}html.theme--documenter-dark .message-header .delete{flex-grow:0;flex-shrink:0;margin-left:.75em}html.theme--documenter-dark .message-header+.message-body{border-width:0;border-top-left-radius:0;border-top-right-radius:0}html.theme--documenter-dark .message-body{border-color:#5e6d6f;border-radius:.4em;border-style:solid;border-width:0 0 0 4px;color:#fff;padding:1.25em 1.5em}html.theme--documenter-dark .message-body code,html.theme--documenter-dark .message-body pre{background-color:#fff}html.theme--documenter-dark .message-body pre code{background-color:rgba(0,0,0,0)}html.theme--documenter-dark .modal{align-items:center;display:none;flex-direction:column;justify-content:center;overflow:hidden;position:fixed;z-index:40}html.theme--documenter-dark .modal.is-active{display:flex}html.theme--documenter-dark .modal-background{background-color:rgba(10,10,10,0.86)}html.theme--documenter-dark .modal-content,html.theme--documenter-dark .modal-card{margin:0 20px;max-height:calc(100vh - 160px);overflow:auto;position:relative;width:100%}@media screen and (min-width: 769px){html.theme--documenter-dark .modal-content,html.theme--documenter-dark .modal-card{margin:0 auto;max-height:calc(100vh - 40px);width:640px}}html.theme--documenter-dark .modal-close{background:none;height:40px;position:fixed;right:20px;top:20px;width:40px}html.theme--documenter-dark .modal-card{display:flex;flex-direction:column;max-height:calc(100vh - 40px);overflow:hidden;-ms-overflow-y:visible}html.theme--documenter-dark .modal-card-head,html.theme--documenter-dark .modal-card-foot{align-items:center;background-color:#282f2f;display:flex;flex-shrink:0;justify-content:flex-start;padding:20px;position:relative}html.theme--documenter-dark .modal-card-head{border-bottom:1px solid #5e6d6f;border-top-left-radius:8px;border-top-right-radius:8px}html.theme--documenter-dark .modal-card-title{color:#f2f2f2;flex-grow:1;flex-shrink:0;font-size:1.5rem;line-height:1}html.theme--documenter-dark .modal-card-foot{border-bottom-left-radius:8px;border-bottom-right-radius:8px;border-top:1px solid #5e6d6f}html.theme--documenter-dark .modal-card-foot .button:not(:last-child){margin-right:.5em}html.theme--documenter-dark .modal-card-body{-webkit-overflow-scrolling:touch;background-color:#fff;flex-grow:1;flex-shrink:1;overflow:auto;padding:20px}html.theme--documenter-dark .navbar{background-color:#375a7f;min-height:4rem;position:relative;z-index:30}html.theme--documenter-dark .navbar.is-white{background-color:#fff;color:#0a0a0a}html.theme--documenter-dark .navbar.is-white .navbar-brand>.navbar-item,html.theme--documenter-dark .navbar.is-white .navbar-brand .navbar-link{color:#0a0a0a}html.theme--documenter-dark .navbar.is-white .navbar-brand>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-white .navbar-brand>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-white .navbar-brand>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-white .navbar-brand .navbar-link:focus,html.theme--documenter-dark .navbar.is-white .navbar-brand .navbar-link:hover,html.theme--documenter-dark .navbar.is-white .navbar-brand .navbar-link.is-active{background-color:#f2f2f2;color:#0a0a0a}html.theme--documenter-dark .navbar.is-white .navbar-brand .navbar-link::after{border-color:#0a0a0a}html.theme--documenter-dark .navbar.is-white .navbar-burger{color:#0a0a0a}@media screen and (min-width: 1056px){html.theme--documenter-dark .navbar.is-white .navbar-start>.navbar-item,html.theme--documenter-dark .navbar.is-white .navbar-start .navbar-link,html.theme--documenter-dark .navbar.is-white .navbar-end>.navbar-item,html.theme--documenter-dark .navbar.is-white .navbar-end .navbar-link{color:#0a0a0a}html.theme--documenter-dark .navbar.is-white .navbar-start>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-white .navbar-start>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-white .navbar-start>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-white .navbar-start .navbar-link:focus,html.theme--documenter-dark .navbar.is-white .navbar-start .navbar-link:hover,html.theme--documenter-dark .navbar.is-white .navbar-start .navbar-link.is-active,html.theme--documenter-dark .navbar.is-white .navbar-end>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-white .navbar-end>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-white .navbar-end>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-white .navbar-end .navbar-link:focus,html.theme--documenter-dark .navbar.is-white .navbar-end .navbar-link:hover,html.theme--documenter-dark .navbar.is-white .navbar-end .navbar-link.is-active{background-color:#f2f2f2;color:#0a0a0a}html.theme--documenter-dark .navbar.is-white .navbar-start .navbar-link::after,html.theme--documenter-dark .navbar.is-white .navbar-end .navbar-link::after{border-color:#0a0a0a}html.theme--documenter-dark .navbar.is-white .navbar-item.has-dropdown:focus .navbar-link,html.theme--documenter-dark .navbar.is-white .navbar-item.has-dropdown:hover .navbar-link,html.theme--documenter-dark .navbar.is-white .navbar-item.has-dropdown.is-active .navbar-link{background-color:#f2f2f2;color:#0a0a0a}html.theme--documenter-dark .navbar.is-white .navbar-dropdown a.navbar-item.is-active{background-color:#fff;color:#0a0a0a}}html.theme--documenter-dark .navbar.is-black{background-color:#0a0a0a;color:#fff}html.theme--documenter-dark .navbar.is-black .navbar-brand>.navbar-item,html.theme--documenter-dark .navbar.is-black .navbar-brand .navbar-link{color:#fff}html.theme--documenter-dark .navbar.is-black .navbar-brand>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-black .navbar-brand>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-black .navbar-brand>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-black .navbar-brand .navbar-link:focus,html.theme--documenter-dark .navbar.is-black .navbar-brand .navbar-link:hover,html.theme--documenter-dark .navbar.is-black .navbar-brand .navbar-link.is-active{background-color:#000;color:#fff}html.theme--documenter-dark .navbar.is-black .navbar-brand .navbar-link::after{border-color:#fff}html.theme--documenter-dark .navbar.is-black .navbar-burger{color:#fff}@media screen and (min-width: 1056px){html.theme--documenter-dark .navbar.is-black .navbar-start>.navbar-item,html.theme--documenter-dark .navbar.is-black .navbar-start .navbar-link,html.theme--documenter-dark .navbar.is-black .navbar-end>.navbar-item,html.theme--documenter-dark .navbar.is-black .navbar-end .navbar-link{color:#fff}html.theme--documenter-dark .navbar.is-black .navbar-start>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-black .navbar-start>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-black .navbar-start>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-black .navbar-start .navbar-link:focus,html.theme--documenter-dark .navbar.is-black .navbar-start .navbar-link:hover,html.theme--documenter-dark .navbar.is-black .navbar-start .navbar-link.is-active,html.theme--documenter-dark .navbar.is-black .navbar-end>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-black .navbar-end>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-black .navbar-end>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-black .navbar-end .navbar-link:focus,html.theme--documenter-dark .navbar.is-black .navbar-end .navbar-link:hover,html.theme--documenter-dark .navbar.is-black .navbar-end .navbar-link.is-active{background-color:#000;color:#fff}html.theme--documenter-dark .navbar.is-black .navbar-start .navbar-link::after,html.theme--documenter-dark .navbar.is-black .navbar-end .navbar-link::after{border-color:#fff}html.theme--documenter-dark .navbar.is-black .navbar-item.has-dropdown:focus .navbar-link,html.theme--documenter-dark .navbar.is-black .navbar-item.has-dropdown:hover .navbar-link,html.theme--documenter-dark .navbar.is-black .navbar-item.has-dropdown.is-active .navbar-link{background-color:#000;color:#fff}html.theme--documenter-dark .navbar.is-black .navbar-dropdown a.navbar-item.is-active{background-color:#0a0a0a;color:#fff}}html.theme--documenter-dark .navbar.is-light{background-color:#ecf0f1;color:rgba(0,0,0,0.7)}html.theme--documenter-dark .navbar.is-light .navbar-brand>.navbar-item,html.theme--documenter-dark .navbar.is-light .navbar-brand .navbar-link{color:rgba(0,0,0,0.7)}html.theme--documenter-dark .navbar.is-light .navbar-brand>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-light .navbar-brand>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-light .navbar-brand>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-light .navbar-brand .navbar-link:focus,html.theme--documenter-dark .navbar.is-light .navbar-brand .navbar-link:hover,html.theme--documenter-dark .navbar.is-light .navbar-brand .navbar-link.is-active{background-color:#dde4e6;color:rgba(0,0,0,0.7)}html.theme--documenter-dark .navbar.is-light .navbar-brand .navbar-link::after{border-color:rgba(0,0,0,0.7)}html.theme--documenter-dark .navbar.is-light .navbar-burger{color:rgba(0,0,0,0.7)}@media screen and (min-width: 1056px){html.theme--documenter-dark .navbar.is-light .navbar-start>.navbar-item,html.theme--documenter-dark .navbar.is-light .navbar-start .navbar-link,html.theme--documenter-dark .navbar.is-light .navbar-end>.navbar-item,html.theme--documenter-dark .navbar.is-light .navbar-end .navbar-link{color:rgba(0,0,0,0.7)}html.theme--documenter-dark .navbar.is-light .navbar-start>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-light .navbar-start>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-light .navbar-start>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-light .navbar-start .navbar-link:focus,html.theme--documenter-dark .navbar.is-light .navbar-start .navbar-link:hover,html.theme--documenter-dark .navbar.is-light .navbar-start .navbar-link.is-active,html.theme--documenter-dark .navbar.is-light .navbar-end>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-light .navbar-end>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-light .navbar-end>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-light .navbar-end .navbar-link:focus,html.theme--documenter-dark .navbar.is-light .navbar-end .navbar-link:hover,html.theme--documenter-dark .navbar.is-light .navbar-end .navbar-link.is-active{background-color:#dde4e6;color:rgba(0,0,0,0.7)}html.theme--documenter-dark .navbar.is-light .navbar-start .navbar-link::after,html.theme--documenter-dark .navbar.is-light .navbar-end .navbar-link::after{border-color:rgba(0,0,0,0.7)}html.theme--documenter-dark .navbar.is-light .navbar-item.has-dropdown:focus .navbar-link,html.theme--documenter-dark .navbar.is-light .navbar-item.has-dropdown:hover .navbar-link,html.theme--documenter-dark .navbar.is-light .navbar-item.has-dropdown.is-active .navbar-link{background-color:#dde4e6;color:rgba(0,0,0,0.7)}html.theme--documenter-dark .navbar.is-light .navbar-dropdown a.navbar-item.is-active{background-color:#ecf0f1;color:rgba(0,0,0,0.7)}}html.theme--documenter-dark .navbar.is-dark,html.theme--documenter-dark .content kbd.navbar{background-color:#282f2f;color:#fff}html.theme--documenter-dark .navbar.is-dark .navbar-brand>.navbar-item,html.theme--documenter-dark .content kbd.navbar .navbar-brand>.navbar-item,html.theme--documenter-dark .navbar.is-dark .navbar-brand .navbar-link,html.theme--documenter-dark .content kbd.navbar .navbar-brand .navbar-link{color:#fff}html.theme--documenter-dark .navbar.is-dark .navbar-brand>a.navbar-item:focus,html.theme--documenter-dark .content kbd.navbar .navbar-brand>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-dark .navbar-brand>a.navbar-item:hover,html.theme--documenter-dark .content kbd.navbar .navbar-brand>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-dark .navbar-brand>a.navbar-item.is-active,html.theme--documenter-dark .content kbd.navbar .navbar-brand>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-dark .navbar-brand .navbar-link:focus,html.theme--documenter-dark .content kbd.navbar .navbar-brand .navbar-link:focus,html.theme--documenter-dark .navbar.is-dark .navbar-brand .navbar-link:hover,html.theme--documenter-dark .content kbd.navbar .navbar-brand .navbar-link:hover,html.theme--documenter-dark .navbar.is-dark .navbar-brand .navbar-link.is-active,html.theme--documenter-dark .content kbd.navbar .navbar-brand .navbar-link.is-active{background-color:#1d2122;color:#fff}html.theme--documenter-dark .navbar.is-dark .navbar-brand .navbar-link::after,html.theme--documenter-dark .content kbd.navbar .navbar-brand .navbar-link::after{border-color:#fff}html.theme--documenter-dark .navbar.is-dark .navbar-burger,html.theme--documenter-dark .content kbd.navbar .navbar-burger{color:#fff}@media screen and (min-width: 1056px){html.theme--documenter-dark .navbar.is-dark .navbar-start>.navbar-item,html.theme--documenter-dark .content kbd.navbar .navbar-start>.navbar-item,html.theme--documenter-dark .navbar.is-dark .navbar-start .navbar-link,html.theme--documenter-dark .content kbd.navbar .navbar-start .navbar-link,html.theme--documenter-dark .navbar.is-dark .navbar-end>.navbar-item,html.theme--documenter-dark .content kbd.navbar .navbar-end>.navbar-item,html.theme--documenter-dark .navbar.is-dark .navbar-end .navbar-link,html.theme--documenter-dark .content kbd.navbar .navbar-end .navbar-link{color:#fff}html.theme--documenter-dark .navbar.is-dark .navbar-start>a.navbar-item:focus,html.theme--documenter-dark .content kbd.navbar .navbar-start>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-dark .navbar-start>a.navbar-item:hover,html.theme--documenter-dark .content kbd.navbar .navbar-start>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-dark .navbar-start>a.navbar-item.is-active,html.theme--documenter-dark .content kbd.navbar .navbar-start>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-dark .navbar-start .navbar-link:focus,html.theme--documenter-dark .content kbd.navbar .navbar-start .navbar-link:focus,html.theme--documenter-dark .navbar.is-dark .navbar-start .navbar-link:hover,html.theme--documenter-dark .content kbd.navbar .navbar-start .navbar-link:hover,html.theme--documenter-dark .navbar.is-dark .navbar-start .navbar-link.is-active,html.theme--documenter-dark .content kbd.navbar .navbar-start .navbar-link.is-active,html.theme--documenter-dark .navbar.is-dark .navbar-end>a.navbar-item:focus,html.theme--documenter-dark .content kbd.navbar .navbar-end>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-dark .navbar-end>a.navbar-item:hover,html.theme--documenter-dark .content kbd.navbar .navbar-end>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-dark .navbar-end>a.navbar-item.is-active,html.theme--documenter-dark .content kbd.navbar .navbar-end>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-dark .navbar-end .navbar-link:focus,html.theme--documenter-dark .content kbd.navbar .navbar-end .navbar-link:focus,html.theme--documenter-dark .navbar.is-dark .navbar-end .navbar-link:hover,html.theme--documenter-dark .content kbd.navbar .navbar-end .navbar-link:hover,html.theme--documenter-dark .navbar.is-dark .navbar-end .navbar-link.is-active,html.theme--documenter-dark .content kbd.navbar .navbar-end .navbar-link.is-active{background-color:#1d2122;color:#fff}html.theme--documenter-dark .navbar.is-dark .navbar-start .navbar-link::after,html.theme--documenter-dark .content kbd.navbar .navbar-start .navbar-link::after,html.theme--documenter-dark .navbar.is-dark .navbar-end .navbar-link::after,html.theme--documenter-dark .content kbd.navbar .navbar-end .navbar-link::after{border-color:#fff}html.theme--documenter-dark .navbar.is-dark .navbar-item.has-dropdown:focus .navbar-link,html.theme--documenter-dark .content kbd.navbar .navbar-item.has-dropdown:focus .navbar-link,html.theme--documenter-dark .navbar.is-dark .navbar-item.has-dropdown:hover .navbar-link,html.theme--documenter-dark .content kbd.navbar .navbar-item.has-dropdown:hover .navbar-link,html.theme--documenter-dark .navbar.is-dark .navbar-item.has-dropdown.is-active .navbar-link,html.theme--documenter-dark .content kbd.navbar .navbar-item.has-dropdown.is-active .navbar-link{background-color:#1d2122;color:#fff}html.theme--documenter-dark .navbar.is-dark .navbar-dropdown a.navbar-item.is-active,html.theme--documenter-dark .content kbd.navbar .navbar-dropdown a.navbar-item.is-active{background-color:#282f2f;color:#fff}}html.theme--documenter-dark .navbar.is-primary,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink{background-color:#375a7f;color:#fff}html.theme--documenter-dark .navbar.is-primary .navbar-brand>.navbar-item,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-brand>.navbar-item,html.theme--documenter-dark .navbar.is-primary .navbar-brand .navbar-link,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-brand .navbar-link{color:#fff}html.theme--documenter-dark .navbar.is-primary .navbar-brand>a.navbar-item:focus,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-brand>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-primary .navbar-brand>a.navbar-item:hover,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-brand>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-primary .navbar-brand>a.navbar-item.is-active,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-brand>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-primary .navbar-brand .navbar-link:focus,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-brand .navbar-link:focus,html.theme--documenter-dark .navbar.is-primary .navbar-brand .navbar-link:hover,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-brand .navbar-link:hover,html.theme--documenter-dark .navbar.is-primary .navbar-brand .navbar-link.is-active,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-brand .navbar-link.is-active{background-color:#2f4d6d;color:#fff}html.theme--documenter-dark .navbar.is-primary .navbar-brand .navbar-link::after,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-brand .navbar-link::after{border-color:#fff}html.theme--documenter-dark .navbar.is-primary .navbar-burger,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-burger{color:#fff}@media screen and (min-width: 1056px){html.theme--documenter-dark .navbar.is-primary .navbar-start>.navbar-item,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-start>.navbar-item,html.theme--documenter-dark .navbar.is-primary .navbar-start .navbar-link,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-start .navbar-link,html.theme--documenter-dark .navbar.is-primary .navbar-end>.navbar-item,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-end>.navbar-item,html.theme--documenter-dark .navbar.is-primary .navbar-end .navbar-link,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-end .navbar-link{color:#fff}html.theme--documenter-dark .navbar.is-primary .navbar-start>a.navbar-item:focus,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-start>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-primary .navbar-start>a.navbar-item:hover,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-start>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-primary .navbar-start>a.navbar-item.is-active,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-start>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-primary .navbar-start .navbar-link:focus,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-start .navbar-link:focus,html.theme--documenter-dark .navbar.is-primary .navbar-start .navbar-link:hover,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-start .navbar-link:hover,html.theme--documenter-dark .navbar.is-primary .navbar-start .navbar-link.is-active,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-start .navbar-link.is-active,html.theme--documenter-dark .navbar.is-primary .navbar-end>a.navbar-item:focus,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-end>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-primary .navbar-end>a.navbar-item:hover,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-end>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-primary .navbar-end>a.navbar-item.is-active,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-end>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-primary .navbar-end .navbar-link:focus,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-end .navbar-link:focus,html.theme--documenter-dark .navbar.is-primary .navbar-end .navbar-link:hover,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-end .navbar-link:hover,html.theme--documenter-dark .navbar.is-primary .navbar-end .navbar-link.is-active,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-end .navbar-link.is-active{background-color:#2f4d6d;color:#fff}html.theme--documenter-dark .navbar.is-primary .navbar-start .navbar-link::after,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-start .navbar-link::after,html.theme--documenter-dark .navbar.is-primary .navbar-end .navbar-link::after,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-end .navbar-link::after{border-color:#fff}html.theme--documenter-dark .navbar.is-primary .navbar-item.has-dropdown:focus .navbar-link,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-item.has-dropdown:focus .navbar-link,html.theme--documenter-dark .navbar.is-primary .navbar-item.has-dropdown:hover .navbar-link,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-item.has-dropdown:hover .navbar-link,html.theme--documenter-dark .navbar.is-primary .navbar-item.has-dropdown.is-active .navbar-link,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-item.has-dropdown.is-active .navbar-link{background-color:#2f4d6d;color:#fff}html.theme--documenter-dark .navbar.is-primary .navbar-dropdown a.navbar-item.is-active,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-dropdown a.navbar-item.is-active{background-color:#375a7f;color:#fff}}html.theme--documenter-dark .navbar.is-link{background-color:#1abc9c;color:#fff}html.theme--documenter-dark .navbar.is-link .navbar-brand>.navbar-item,html.theme--documenter-dark .navbar.is-link .navbar-brand .navbar-link{color:#fff}html.theme--documenter-dark .navbar.is-link .navbar-brand>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-link .navbar-brand>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-link .navbar-brand>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-link .navbar-brand .navbar-link:focus,html.theme--documenter-dark .navbar.is-link .navbar-brand .navbar-link:hover,html.theme--documenter-dark .navbar.is-link .navbar-brand .navbar-link.is-active{background-color:#17a689;color:#fff}html.theme--documenter-dark .navbar.is-link .navbar-brand .navbar-link::after{border-color:#fff}html.theme--documenter-dark .navbar.is-link .navbar-burger{color:#fff}@media screen and (min-width: 1056px){html.theme--documenter-dark .navbar.is-link .navbar-start>.navbar-item,html.theme--documenter-dark .navbar.is-link .navbar-start .navbar-link,html.theme--documenter-dark .navbar.is-link .navbar-end>.navbar-item,html.theme--documenter-dark .navbar.is-link .navbar-end .navbar-link{color:#fff}html.theme--documenter-dark .navbar.is-link .navbar-start>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-link .navbar-start>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-link .navbar-start>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-link .navbar-start .navbar-link:focus,html.theme--documenter-dark .navbar.is-link .navbar-start .navbar-link:hover,html.theme--documenter-dark .navbar.is-link .navbar-start .navbar-link.is-active,html.theme--documenter-dark .navbar.is-link .navbar-end>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-link .navbar-end>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-link .navbar-end>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-link .navbar-end .navbar-link:focus,html.theme--documenter-dark .navbar.is-link .navbar-end .navbar-link:hover,html.theme--documenter-dark .navbar.is-link .navbar-end .navbar-link.is-active{background-color:#17a689;color:#fff}html.theme--documenter-dark .navbar.is-link .navbar-start .navbar-link::after,html.theme--documenter-dark .navbar.is-link .navbar-end .navbar-link::after{border-color:#fff}html.theme--documenter-dark .navbar.is-link .navbar-item.has-dropdown:focus .navbar-link,html.theme--documenter-dark .navbar.is-link .navbar-item.has-dropdown:hover .navbar-link,html.theme--documenter-dark .navbar.is-link .navbar-item.has-dropdown.is-active .navbar-link{background-color:#17a689;color:#fff}html.theme--documenter-dark .navbar.is-link .navbar-dropdown a.navbar-item.is-active{background-color:#1abc9c;color:#fff}}html.theme--documenter-dark .navbar.is-info{background-color:#024c7d;color:#fff}html.theme--documenter-dark .navbar.is-info .navbar-brand>.navbar-item,html.theme--documenter-dark .navbar.is-info .navbar-brand .navbar-link{color:#fff}html.theme--documenter-dark .navbar.is-info .navbar-brand>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-info .navbar-brand>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-info .navbar-brand>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-info .navbar-brand .navbar-link:focus,html.theme--documenter-dark .navbar.is-info .navbar-brand .navbar-link:hover,html.theme--documenter-dark .navbar.is-info .navbar-brand .navbar-link.is-active{background-color:#023d64;color:#fff}html.theme--documenter-dark .navbar.is-info .navbar-brand .navbar-link::after{border-color:#fff}html.theme--documenter-dark .navbar.is-info .navbar-burger{color:#fff}@media screen and (min-width: 1056px){html.theme--documenter-dark .navbar.is-info .navbar-start>.navbar-item,html.theme--documenter-dark .navbar.is-info .navbar-start .navbar-link,html.theme--documenter-dark .navbar.is-info .navbar-end>.navbar-item,html.theme--documenter-dark .navbar.is-info .navbar-end .navbar-link{color:#fff}html.theme--documenter-dark .navbar.is-info .navbar-start>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-info .navbar-start>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-info .navbar-start>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-info .navbar-start .navbar-link:focus,html.theme--documenter-dark .navbar.is-info .navbar-start .navbar-link:hover,html.theme--documenter-dark .navbar.is-info .navbar-start .navbar-link.is-active,html.theme--documenter-dark .navbar.is-info .navbar-end>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-info .navbar-end>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-info .navbar-end>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-info .navbar-end .navbar-link:focus,html.theme--documenter-dark .navbar.is-info .navbar-end .navbar-link:hover,html.theme--documenter-dark .navbar.is-info .navbar-end .navbar-link.is-active{background-color:#023d64;color:#fff}html.theme--documenter-dark .navbar.is-info .navbar-start .navbar-link::after,html.theme--documenter-dark .navbar.is-info .navbar-end .navbar-link::after{border-color:#fff}html.theme--documenter-dark .navbar.is-info .navbar-item.has-dropdown:focus .navbar-link,html.theme--documenter-dark .navbar.is-info .navbar-item.has-dropdown:hover .navbar-link,html.theme--documenter-dark .navbar.is-info .navbar-item.has-dropdown.is-active .navbar-link{background-color:#023d64;color:#fff}html.theme--documenter-dark .navbar.is-info .navbar-dropdown a.navbar-item.is-active{background-color:#024c7d;color:#fff}}html.theme--documenter-dark .navbar.is-success{background-color:#008438;color:#fff}html.theme--documenter-dark .navbar.is-success .navbar-brand>.navbar-item,html.theme--documenter-dark .navbar.is-success .navbar-brand .navbar-link{color:#fff}html.theme--documenter-dark .navbar.is-success .navbar-brand>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-success .navbar-brand>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-success .navbar-brand>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-success .navbar-brand .navbar-link:focus,html.theme--documenter-dark .navbar.is-success .navbar-brand .navbar-link:hover,html.theme--documenter-dark .navbar.is-success .navbar-brand .navbar-link.is-active{background-color:#006b2d;color:#fff}html.theme--documenter-dark .navbar.is-success .navbar-brand .navbar-link::after{border-color:#fff}html.theme--documenter-dark .navbar.is-success .navbar-burger{color:#fff}@media screen and (min-width: 1056px){html.theme--documenter-dark .navbar.is-success .navbar-start>.navbar-item,html.theme--documenter-dark .navbar.is-success .navbar-start .navbar-link,html.theme--documenter-dark .navbar.is-success .navbar-end>.navbar-item,html.theme--documenter-dark .navbar.is-success .navbar-end .navbar-link{color:#fff}html.theme--documenter-dark .navbar.is-success .navbar-start>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-success .navbar-start>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-success .navbar-start>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-success .navbar-start .navbar-link:focus,html.theme--documenter-dark .navbar.is-success .navbar-start .navbar-link:hover,html.theme--documenter-dark .navbar.is-success .navbar-start .navbar-link.is-active,html.theme--documenter-dark .navbar.is-success .navbar-end>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-success .navbar-end>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-success .navbar-end>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-success .navbar-end .navbar-link:focus,html.theme--documenter-dark .navbar.is-success .navbar-end .navbar-link:hover,html.theme--documenter-dark .navbar.is-success .navbar-end .navbar-link.is-active{background-color:#006b2d;color:#fff}html.theme--documenter-dark .navbar.is-success .navbar-start .navbar-link::after,html.theme--documenter-dark .navbar.is-success .navbar-end .navbar-link::after{border-color:#fff}html.theme--documenter-dark .navbar.is-success .navbar-item.has-dropdown:focus .navbar-link,html.theme--documenter-dark .navbar.is-success .navbar-item.has-dropdown:hover .navbar-link,html.theme--documenter-dark .navbar.is-success .navbar-item.has-dropdown.is-active .navbar-link{background-color:#006b2d;color:#fff}html.theme--documenter-dark .navbar.is-success .navbar-dropdown a.navbar-item.is-active{background-color:#008438;color:#fff}}html.theme--documenter-dark .navbar.is-warning{background-color:#ad8100;color:#fff}html.theme--documenter-dark .navbar.is-warning .navbar-brand>.navbar-item,html.theme--documenter-dark .navbar.is-warning .navbar-brand .navbar-link{color:#fff}html.theme--documenter-dark .navbar.is-warning .navbar-brand>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-warning .navbar-brand>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-warning .navbar-brand>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-warning .navbar-brand .navbar-link:focus,html.theme--documenter-dark .navbar.is-warning .navbar-brand .navbar-link:hover,html.theme--documenter-dark .navbar.is-warning .navbar-brand .navbar-link.is-active{background-color:#946e00;color:#fff}html.theme--documenter-dark .navbar.is-warning .navbar-brand .navbar-link::after{border-color:#fff}html.theme--documenter-dark .navbar.is-warning .navbar-burger{color:#fff}@media screen and (min-width: 1056px){html.theme--documenter-dark .navbar.is-warning .navbar-start>.navbar-item,html.theme--documenter-dark .navbar.is-warning .navbar-start .navbar-link,html.theme--documenter-dark .navbar.is-warning .navbar-end>.navbar-item,html.theme--documenter-dark .navbar.is-warning .navbar-end .navbar-link{color:#fff}html.theme--documenter-dark .navbar.is-warning .navbar-start>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-warning .navbar-start>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-warning .navbar-start>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-warning .navbar-start .navbar-link:focus,html.theme--documenter-dark .navbar.is-warning .navbar-start .navbar-link:hover,html.theme--documenter-dark .navbar.is-warning .navbar-start .navbar-link.is-active,html.theme--documenter-dark .navbar.is-warning .navbar-end>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-warning .navbar-end>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-warning .navbar-end>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-warning .navbar-end .navbar-link:focus,html.theme--documenter-dark .navbar.is-warning .navbar-end .navbar-link:hover,html.theme--documenter-dark .navbar.is-warning .navbar-end .navbar-link.is-active{background-color:#946e00;color:#fff}html.theme--documenter-dark .navbar.is-warning .navbar-start .navbar-link::after,html.theme--documenter-dark .navbar.is-warning .navbar-end .navbar-link::after{border-color:#fff}html.theme--documenter-dark .navbar.is-warning .navbar-item.has-dropdown:focus .navbar-link,html.theme--documenter-dark .navbar.is-warning .navbar-item.has-dropdown:hover .navbar-link,html.theme--documenter-dark .navbar.is-warning .navbar-item.has-dropdown.is-active .navbar-link{background-color:#946e00;color:#fff}html.theme--documenter-dark .navbar.is-warning .navbar-dropdown a.navbar-item.is-active{background-color:#ad8100;color:#fff}}html.theme--documenter-dark .navbar.is-danger{background-color:#9e1b0d;color:#fff}html.theme--documenter-dark .navbar.is-danger .navbar-brand>.navbar-item,html.theme--documenter-dark .navbar.is-danger .navbar-brand .navbar-link{color:#fff}html.theme--documenter-dark .navbar.is-danger .navbar-brand>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-danger .navbar-brand>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-danger .navbar-brand>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-danger .navbar-brand .navbar-link:focus,html.theme--documenter-dark .navbar.is-danger .navbar-brand .navbar-link:hover,html.theme--documenter-dark .navbar.is-danger .navbar-brand .navbar-link.is-active{background-color:#86170b;color:#fff}html.theme--documenter-dark .navbar.is-danger .navbar-brand .navbar-link::after{border-color:#fff}html.theme--documenter-dark .navbar.is-danger .navbar-burger{color:#fff}@media screen and (min-width: 1056px){html.theme--documenter-dark .navbar.is-danger .navbar-start>.navbar-item,html.theme--documenter-dark .navbar.is-danger .navbar-start .navbar-link,html.theme--documenter-dark .navbar.is-danger .navbar-end>.navbar-item,html.theme--documenter-dark .navbar.is-danger .navbar-end .navbar-link{color:#fff}html.theme--documenter-dark .navbar.is-danger .navbar-start>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-danger .navbar-start>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-danger .navbar-start>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-danger .navbar-start .navbar-link:focus,html.theme--documenter-dark .navbar.is-danger .navbar-start .navbar-link:hover,html.theme--documenter-dark .navbar.is-danger .navbar-start .navbar-link.is-active,html.theme--documenter-dark .navbar.is-danger .navbar-end>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-danger .navbar-end>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-danger .navbar-end>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-danger .navbar-end .navbar-link:focus,html.theme--documenter-dark .navbar.is-danger .navbar-end .navbar-link:hover,html.theme--documenter-dark .navbar.is-danger .navbar-end .navbar-link.is-active{background-color:#86170b;color:#fff}html.theme--documenter-dark .navbar.is-danger .navbar-start .navbar-link::after,html.theme--documenter-dark .navbar.is-danger .navbar-end .navbar-link::after{border-color:#fff}html.theme--documenter-dark .navbar.is-danger .navbar-item.has-dropdown:focus .navbar-link,html.theme--documenter-dark .navbar.is-danger .navbar-item.has-dropdown:hover .navbar-link,html.theme--documenter-dark .navbar.is-danger .navbar-item.has-dropdown.is-active .navbar-link{background-color:#86170b;color:#fff}html.theme--documenter-dark .navbar.is-danger .navbar-dropdown a.navbar-item.is-active{background-color:#9e1b0d;color:#fff}}html.theme--documenter-dark .navbar>.container{align-items:stretch;display:flex;min-height:4rem;width:100%}html.theme--documenter-dark .navbar.has-shadow{box-shadow:0 2px 0 0 #282f2f}html.theme--documenter-dark .navbar.is-fixed-bottom,html.theme--documenter-dark .navbar.is-fixed-top{left:0;position:fixed;right:0;z-index:30}html.theme--documenter-dark .navbar.is-fixed-bottom{bottom:0}html.theme--documenter-dark .navbar.is-fixed-bottom.has-shadow{box-shadow:0 -2px 0 0 #282f2f}html.theme--documenter-dark .navbar.is-fixed-top{top:0}html.theme--documenter-dark html.has-navbar-fixed-top,html.theme--documenter-dark body.has-navbar-fixed-top{padding-top:4rem}html.theme--documenter-dark html.has-navbar-fixed-bottom,html.theme--documenter-dark body.has-navbar-fixed-bottom{padding-bottom:4rem}html.theme--documenter-dark .navbar-brand,html.theme--documenter-dark .navbar-tabs{align-items:stretch;display:flex;flex-shrink:0;min-height:4rem}html.theme--documenter-dark .navbar-brand a.navbar-item:focus,html.theme--documenter-dark .navbar-brand a.navbar-item:hover{background-color:transparent}html.theme--documenter-dark .navbar-tabs{-webkit-overflow-scrolling:touch;max-width:100vw;overflow-x:auto;overflow-y:hidden}html.theme--documenter-dark .navbar-burger{color:#fff;-moz-appearance:none;-webkit-appearance:none;appearance:none;background:none;border:none;cursor:pointer;display:block;height:4rem;position:relative;width:4rem;margin-left:auto}html.theme--documenter-dark .navbar-burger span{background-color:currentColor;display:block;height:1px;left:calc(50% - 8px);position:absolute;transform-origin:center;transition-duration:86ms;transition-property:background-color, opacity, transform;transition-timing-function:ease-out;width:16px}html.theme--documenter-dark .navbar-burger span:nth-child(1){top:calc(50% - 6px)}html.theme--documenter-dark .navbar-burger span:nth-child(2){top:calc(50% - 1px)}html.theme--documenter-dark .navbar-burger span:nth-child(3){top:calc(50% + 4px)}html.theme--documenter-dark .navbar-burger:hover{background-color:rgba(0,0,0,0.05)}html.theme--documenter-dark .navbar-burger.is-active span:nth-child(1){transform:translateY(5px) rotate(45deg)}html.theme--documenter-dark .navbar-burger.is-active span:nth-child(2){opacity:0}html.theme--documenter-dark .navbar-burger.is-active span:nth-child(3){transform:translateY(-5px) rotate(-45deg)}html.theme--documenter-dark .navbar-menu{display:none}html.theme--documenter-dark .navbar-item,html.theme--documenter-dark .navbar-link{color:#fff;display:block;line-height:1.5;padding:0.5rem 0.75rem;position:relative}html.theme--documenter-dark .navbar-item .icon:only-child,html.theme--documenter-dark .navbar-link .icon:only-child{margin-left:-0.25rem;margin-right:-0.25rem}html.theme--documenter-dark a.navbar-item,html.theme--documenter-dark .navbar-link{cursor:pointer}html.theme--documenter-dark a.navbar-item:focus,html.theme--documenter-dark a.navbar-item:focus-within,html.theme--documenter-dark a.navbar-item:hover,html.theme--documenter-dark a.navbar-item.is-active,html.theme--documenter-dark .navbar-link:focus,html.theme--documenter-dark .navbar-link:focus-within,html.theme--documenter-dark .navbar-link:hover,html.theme--documenter-dark .navbar-link.is-active{background-color:rgba(0,0,0,0);color:#1abc9c}html.theme--documenter-dark .navbar-item{flex-grow:0;flex-shrink:0}html.theme--documenter-dark .navbar-item img{max-height:1.75rem}html.theme--documenter-dark .navbar-item.has-dropdown{padding:0}html.theme--documenter-dark .navbar-item.is-expanded{flex-grow:1;flex-shrink:1}html.theme--documenter-dark .navbar-item.is-tab{border-bottom:1px solid transparent;min-height:4rem;padding-bottom:calc(0.5rem - 1px)}html.theme--documenter-dark .navbar-item.is-tab:focus,html.theme--documenter-dark .navbar-item.is-tab:hover{background-color:rgba(0,0,0,0);border-bottom-color:#1abc9c}html.theme--documenter-dark .navbar-item.is-tab.is-active{background-color:rgba(0,0,0,0);border-bottom-color:#1abc9c;border-bottom-style:solid;border-bottom-width:3px;color:#1abc9c;padding-bottom:calc(0.5rem - 3px)}html.theme--documenter-dark .navbar-content{flex-grow:1;flex-shrink:1}html.theme--documenter-dark .navbar-link:not(.is-arrowless){padding-right:2.5em}html.theme--documenter-dark .navbar-link:not(.is-arrowless)::after{border-color:#fff;margin-top:-0.375em;right:1.125em}html.theme--documenter-dark .navbar-dropdown{font-size:0.875rem;padding-bottom:0.5rem;padding-top:0.5rem}html.theme--documenter-dark .navbar-dropdown .navbar-item{padding-left:1.5rem;padding-right:1.5rem}html.theme--documenter-dark .navbar-divider{background-color:rgba(0,0,0,0.2);border:none;display:none;height:2px;margin:0.5rem 0}@media screen and (max-width: 1055px){html.theme--documenter-dark .navbar>.container{display:block}html.theme--documenter-dark .navbar-brand .navbar-item,html.theme--documenter-dark .navbar-tabs .navbar-item{align-items:center;display:flex}html.theme--documenter-dark .navbar-link::after{display:none}html.theme--documenter-dark .navbar-menu{background-color:#375a7f;box-shadow:0 8px 16px rgba(10,10,10,0.1);padding:0.5rem 0}html.theme--documenter-dark .navbar-menu.is-active{display:block}html.theme--documenter-dark .navbar.is-fixed-bottom-touch,html.theme--documenter-dark .navbar.is-fixed-top-touch{left:0;position:fixed;right:0;z-index:30}html.theme--documenter-dark .navbar.is-fixed-bottom-touch{bottom:0}html.theme--documenter-dark .navbar.is-fixed-bottom-touch.has-shadow{box-shadow:0 -2px 3px rgba(10,10,10,0.1)}html.theme--documenter-dark .navbar.is-fixed-top-touch{top:0}html.theme--documenter-dark .navbar.is-fixed-top .navbar-menu,html.theme--documenter-dark .navbar.is-fixed-top-touch .navbar-menu{-webkit-overflow-scrolling:touch;max-height:calc(100vh - 4rem);overflow:auto}html.theme--documenter-dark html.has-navbar-fixed-top-touch,html.theme--documenter-dark body.has-navbar-fixed-top-touch{padding-top:4rem}html.theme--documenter-dark html.has-navbar-fixed-bottom-touch,html.theme--documenter-dark body.has-navbar-fixed-bottom-touch{padding-bottom:4rem}}@media screen and (min-width: 1056px){html.theme--documenter-dark .navbar,html.theme--documenter-dark .navbar-menu,html.theme--documenter-dark .navbar-start,html.theme--documenter-dark .navbar-end{align-items:stretch;display:flex}html.theme--documenter-dark .navbar{min-height:4rem}html.theme--documenter-dark .navbar.is-spaced{padding:1rem 2rem}html.theme--documenter-dark .navbar.is-spaced .navbar-start,html.theme--documenter-dark .navbar.is-spaced .navbar-end{align-items:center}html.theme--documenter-dark .navbar.is-spaced a.navbar-item,html.theme--documenter-dark .navbar.is-spaced .navbar-link{border-radius:.4em}html.theme--documenter-dark .navbar.is-transparent a.navbar-item:focus,html.theme--documenter-dark .navbar.is-transparent a.navbar-item:hover,html.theme--documenter-dark .navbar.is-transparent a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-transparent .navbar-link:focus,html.theme--documenter-dark .navbar.is-transparent .navbar-link:hover,html.theme--documenter-dark .navbar.is-transparent .navbar-link.is-active{background-color:transparent !important}html.theme--documenter-dark .navbar.is-transparent .navbar-item.has-dropdown.is-active .navbar-link,html.theme--documenter-dark .navbar.is-transparent .navbar-item.has-dropdown.is-hoverable:focus .navbar-link,html.theme--documenter-dark .navbar.is-transparent .navbar-item.has-dropdown.is-hoverable:focus-within .navbar-link,html.theme--documenter-dark .navbar.is-transparent .navbar-item.has-dropdown.is-hoverable:hover .navbar-link{background-color:transparent !important}html.theme--documenter-dark .navbar.is-transparent .navbar-dropdown a.navbar-item:focus,html.theme--documenter-dark .navbar.is-transparent .navbar-dropdown a.navbar-item:hover{background-color:rgba(0,0,0,0);color:#dbdee0}html.theme--documenter-dark .navbar.is-transparent .navbar-dropdown a.navbar-item.is-active{background-color:rgba(0,0,0,0);color:#1abc9c}html.theme--documenter-dark .navbar-burger{display:none}html.theme--documenter-dark .navbar-item,html.theme--documenter-dark .navbar-link{align-items:center;display:flex}html.theme--documenter-dark .navbar-item.has-dropdown{align-items:stretch}html.theme--documenter-dark .navbar-item.has-dropdown-up .navbar-link::after{transform:rotate(135deg) translate(0.25em, -0.25em)}html.theme--documenter-dark .navbar-item.has-dropdown-up .navbar-dropdown{border-bottom:1px solid rgba(0,0,0,0.2);border-radius:8px 8px 0 0;border-top:none;bottom:100%;box-shadow:0 -8px 8px rgba(10,10,10,0.1);top:auto}html.theme--documenter-dark .navbar-item.is-active .navbar-dropdown,html.theme--documenter-dark .navbar-item.is-hoverable:focus .navbar-dropdown,html.theme--documenter-dark .navbar-item.is-hoverable:focus-within .navbar-dropdown,html.theme--documenter-dark .navbar-item.is-hoverable:hover .navbar-dropdown{display:block}.navbar.is-spaced html.theme--documenter-dark .navbar-item.is-active .navbar-dropdown,html.theme--documenter-dark .navbar-item.is-active .navbar-dropdown.is-boxed,.navbar.is-spaced html.theme--documenter-dark .navbar-item.is-hoverable:focus .navbar-dropdown,html.theme--documenter-dark .navbar-item.is-hoverable:focus .navbar-dropdown.is-boxed,.navbar.is-spaced html.theme--documenter-dark .navbar-item.is-hoverable:focus-within .navbar-dropdown,html.theme--documenter-dark .navbar-item.is-hoverable:focus-within .navbar-dropdown.is-boxed,.navbar.is-spaced html.theme--documenter-dark .navbar-item.is-hoverable:hover .navbar-dropdown,html.theme--documenter-dark .navbar-item.is-hoverable:hover .navbar-dropdown.is-boxed{opacity:1;pointer-events:auto;transform:translateY(0)}html.theme--documenter-dark .navbar-menu{flex-grow:1;flex-shrink:0}html.theme--documenter-dark .navbar-start{justify-content:flex-start;margin-right:auto}html.theme--documenter-dark .navbar-end{justify-content:flex-end;margin-left:auto}html.theme--documenter-dark .navbar-dropdown{background-color:#375a7f;border-bottom-left-radius:8px;border-bottom-right-radius:8px;border-top:1px solid rgba(0,0,0,0.2);box-shadow:0 8px 8px rgba(10,10,10,0.1);display:none;font-size:0.875rem;left:0;min-width:100%;position:absolute;top:100%;z-index:20}html.theme--documenter-dark .navbar-dropdown .navbar-item{padding:0.375rem 1rem;white-space:nowrap}html.theme--documenter-dark .navbar-dropdown a.navbar-item{padding-right:3rem}html.theme--documenter-dark .navbar-dropdown a.navbar-item:focus,html.theme--documenter-dark .navbar-dropdown a.navbar-item:hover{background-color:rgba(0,0,0,0);color:#dbdee0}html.theme--documenter-dark .navbar-dropdown a.navbar-item.is-active{background-color:rgba(0,0,0,0);color:#1abc9c}.navbar.is-spaced html.theme--documenter-dark .navbar-dropdown,html.theme--documenter-dark .navbar-dropdown.is-boxed{border-radius:8px;border-top:none;box-shadow:0 8px 8px rgba(10,10,10,0.1), 0 0 0 1px rgba(10,10,10,0.1);display:block;opacity:0;pointer-events:none;top:calc(100% + (-4px));transform:translateY(-5px);transition-duration:86ms;transition-property:opacity, transform}html.theme--documenter-dark .navbar-dropdown.is-right{left:auto;right:0}html.theme--documenter-dark .navbar-divider{display:block}html.theme--documenter-dark .navbar>.container .navbar-brand,html.theme--documenter-dark .container>.navbar .navbar-brand{margin-left:-.75rem}html.theme--documenter-dark .navbar>.container .navbar-menu,html.theme--documenter-dark .container>.navbar .navbar-menu{margin-right:-.75rem}html.theme--documenter-dark .navbar.is-fixed-bottom-desktop,html.theme--documenter-dark .navbar.is-fixed-top-desktop{left:0;position:fixed;right:0;z-index:30}html.theme--documenter-dark .navbar.is-fixed-bottom-desktop{bottom:0}html.theme--documenter-dark .navbar.is-fixed-bottom-desktop.has-shadow{box-shadow:0 -2px 3px rgba(10,10,10,0.1)}html.theme--documenter-dark .navbar.is-fixed-top-desktop{top:0}html.theme--documenter-dark html.has-navbar-fixed-top-desktop,html.theme--documenter-dark body.has-navbar-fixed-top-desktop{padding-top:4rem}html.theme--documenter-dark html.has-navbar-fixed-bottom-desktop,html.theme--documenter-dark body.has-navbar-fixed-bottom-desktop{padding-bottom:4rem}html.theme--documenter-dark html.has-spaced-navbar-fixed-top,html.theme--documenter-dark body.has-spaced-navbar-fixed-top{padding-top:6rem}html.theme--documenter-dark html.has-spaced-navbar-fixed-bottom,html.theme--documenter-dark body.has-spaced-navbar-fixed-bottom{padding-bottom:6rem}html.theme--documenter-dark a.navbar-item.is-active,html.theme--documenter-dark .navbar-link.is-active{color:#1abc9c}html.theme--documenter-dark a.navbar-item.is-active:not(:focus):not(:hover),html.theme--documenter-dark .navbar-link.is-active:not(:focus):not(:hover){background-color:rgba(0,0,0,0)}html.theme--documenter-dark .navbar-item.has-dropdown:focus .navbar-link,html.theme--documenter-dark .navbar-item.has-dropdown:hover .navbar-link,html.theme--documenter-dark .navbar-item.has-dropdown.is-active .navbar-link{background-color:rgba(0,0,0,0)}}html.theme--documenter-dark .hero.is-fullheight-with-navbar{min-height:calc(100vh - 4rem)}html.theme--documenter-dark .pagination{font-size:1rem;margin:-.25rem}html.theme--documenter-dark .pagination.is-small,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.pagination{font-size:.75rem}html.theme--documenter-dark .pagination.is-medium{font-size:1.25rem}html.theme--documenter-dark .pagination.is-large{font-size:1.5rem}html.theme--documenter-dark .pagination.is-rounded .pagination-previous,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.pagination .pagination-previous,html.theme--documenter-dark .pagination.is-rounded .pagination-next,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.pagination .pagination-next{padding-left:1em;padding-right:1em;border-radius:9999px}html.theme--documenter-dark .pagination.is-rounded .pagination-link,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.pagination .pagination-link{border-radius:9999px}html.theme--documenter-dark .pagination,html.theme--documenter-dark .pagination-list{align-items:center;display:flex;justify-content:center;text-align:center}html.theme--documenter-dark .pagination-previous,html.theme--documenter-dark .pagination-next,html.theme--documenter-dark .pagination-link,html.theme--documenter-dark .pagination-ellipsis{font-size:1em;justify-content:center;margin:.25rem;padding-left:.5em;padding-right:.5em;text-align:center}html.theme--documenter-dark .pagination-previous,html.theme--documenter-dark .pagination-next,html.theme--documenter-dark .pagination-link{border-color:#5e6d6f;color:#1abc9c;min-width:2.5em}html.theme--documenter-dark .pagination-previous:hover,html.theme--documenter-dark .pagination-next:hover,html.theme--documenter-dark .pagination-link:hover{border-color:#8c9b9d;color:#1dd2af}html.theme--documenter-dark .pagination-previous:focus,html.theme--documenter-dark .pagination-next:focus,html.theme--documenter-dark .pagination-link:focus{border-color:#8c9b9d}html.theme--documenter-dark .pagination-previous:active,html.theme--documenter-dark .pagination-next:active,html.theme--documenter-dark .pagination-link:active{box-shadow:inset 0 1px 2px rgba(10,10,10,0.2)}html.theme--documenter-dark .pagination-previous[disabled],html.theme--documenter-dark .pagination-previous.is-disabled,html.theme--documenter-dark .pagination-next[disabled],html.theme--documenter-dark .pagination-next.is-disabled,html.theme--documenter-dark .pagination-link[disabled],html.theme--documenter-dark .pagination-link.is-disabled{background-color:#5e6d6f;border-color:#5e6d6f;box-shadow:none;color:#fff;opacity:0.5}html.theme--documenter-dark .pagination-previous,html.theme--documenter-dark .pagination-next{padding-left:.75em;padding-right:.75em;white-space:nowrap}html.theme--documenter-dark .pagination-link.is-current{background-color:#1abc9c;border-color:#1abc9c;color:#fff}html.theme--documenter-dark .pagination-ellipsis{color:#8c9b9d;pointer-events:none}html.theme--documenter-dark .pagination-list{flex-wrap:wrap}html.theme--documenter-dark .pagination-list li{list-style:none}@media screen and (max-width: 768px){html.theme--documenter-dark .pagination{flex-wrap:wrap}html.theme--documenter-dark .pagination-previous,html.theme--documenter-dark .pagination-next{flex-grow:1;flex-shrink:1}html.theme--documenter-dark .pagination-list li{flex-grow:1;flex-shrink:1}}@media screen and (min-width: 769px),print{html.theme--documenter-dark .pagination-list{flex-grow:1;flex-shrink:1;justify-content:flex-start;order:1}html.theme--documenter-dark .pagination-previous,html.theme--documenter-dark .pagination-next,html.theme--documenter-dark .pagination-link,html.theme--documenter-dark .pagination-ellipsis{margin-bottom:0;margin-top:0}html.theme--documenter-dark .pagination-previous{order:2}html.theme--documenter-dark .pagination-next{order:3}html.theme--documenter-dark .pagination{justify-content:space-between;margin-bottom:0;margin-top:0}html.theme--documenter-dark .pagination.is-centered .pagination-previous{order:1}html.theme--documenter-dark .pagination.is-centered .pagination-list{justify-content:center;order:2}html.theme--documenter-dark .pagination.is-centered .pagination-next{order:3}html.theme--documenter-dark .pagination.is-right .pagination-previous{order:1}html.theme--documenter-dark .pagination.is-right .pagination-next{order:2}html.theme--documenter-dark .pagination.is-right .pagination-list{justify-content:flex-end;order:3}}html.theme--documenter-dark .panel{border-radius:8px;box-shadow:#171717;font-size:1rem}html.theme--documenter-dark .panel:not(:last-child){margin-bottom:1.5rem}html.theme--documenter-dark .panel.is-white .panel-heading{background-color:#fff;color:#0a0a0a}html.theme--documenter-dark .panel.is-white .panel-tabs a.is-active{border-bottom-color:#fff}html.theme--documenter-dark .panel.is-white .panel-block.is-active .panel-icon{color:#fff}html.theme--documenter-dark .panel.is-black .panel-heading{background-color:#0a0a0a;color:#fff}html.theme--documenter-dark .panel.is-black .panel-tabs a.is-active{border-bottom-color:#0a0a0a}html.theme--documenter-dark .panel.is-black .panel-block.is-active .panel-icon{color:#0a0a0a}html.theme--documenter-dark .panel.is-light .panel-heading{background-color:#ecf0f1;color:rgba(0,0,0,0.7)}html.theme--documenter-dark .panel.is-light .panel-tabs a.is-active{border-bottom-color:#ecf0f1}html.theme--documenter-dark .panel.is-light .panel-block.is-active .panel-icon{color:#ecf0f1}html.theme--documenter-dark .panel.is-dark .panel-heading,html.theme--documenter-dark .content kbd.panel .panel-heading{background-color:#282f2f;color:#fff}html.theme--documenter-dark .panel.is-dark .panel-tabs a.is-active,html.theme--documenter-dark .content kbd.panel .panel-tabs a.is-active{border-bottom-color:#282f2f}html.theme--documenter-dark .panel.is-dark .panel-block.is-active .panel-icon,html.theme--documenter-dark .content kbd.panel .panel-block.is-active .panel-icon{color:#282f2f}html.theme--documenter-dark .panel.is-primary .panel-heading,html.theme--documenter-dark .docstring>section>a.panel.docs-sourcelink .panel-heading{background-color:#375a7f;color:#fff}html.theme--documenter-dark .panel.is-primary .panel-tabs a.is-active,html.theme--documenter-dark .docstring>section>a.panel.docs-sourcelink .panel-tabs a.is-active{border-bottom-color:#375a7f}html.theme--documenter-dark .panel.is-primary .panel-block.is-active .panel-icon,html.theme--documenter-dark .docstring>section>a.panel.docs-sourcelink .panel-block.is-active .panel-icon{color:#375a7f}html.theme--documenter-dark .panel.is-link .panel-heading{background-color:#1abc9c;color:#fff}html.theme--documenter-dark .panel.is-link .panel-tabs a.is-active{border-bottom-color:#1abc9c}html.theme--documenter-dark .panel.is-link .panel-block.is-active .panel-icon{color:#1abc9c}html.theme--documenter-dark .panel.is-info .panel-heading{background-color:#024c7d;color:#fff}html.theme--documenter-dark .panel.is-info .panel-tabs a.is-active{border-bottom-color:#024c7d}html.theme--documenter-dark .panel.is-info .panel-block.is-active .panel-icon{color:#024c7d}html.theme--documenter-dark .panel.is-success .panel-heading{background-color:#008438;color:#fff}html.theme--documenter-dark .panel.is-success .panel-tabs a.is-active{border-bottom-color:#008438}html.theme--documenter-dark .panel.is-success .panel-block.is-active .panel-icon{color:#008438}html.theme--documenter-dark .panel.is-warning .panel-heading{background-color:#ad8100;color:#fff}html.theme--documenter-dark .panel.is-warning .panel-tabs a.is-active{border-bottom-color:#ad8100}html.theme--documenter-dark .panel.is-warning .panel-block.is-active .panel-icon{color:#ad8100}html.theme--documenter-dark .panel.is-danger .panel-heading{background-color:#9e1b0d;color:#fff}html.theme--documenter-dark .panel.is-danger .panel-tabs a.is-active{border-bottom-color:#9e1b0d}html.theme--documenter-dark .panel.is-danger .panel-block.is-active .panel-icon{color:#9e1b0d}html.theme--documenter-dark .panel-tabs:not(:last-child),html.theme--documenter-dark .panel-block:not(:last-child){border-bottom:1px solid #ededed}html.theme--documenter-dark .panel-heading{background-color:#343c3d;border-radius:8px 8px 0 0;color:#f2f2f2;font-size:1.25em;font-weight:700;line-height:1.25;padding:0.75em 1em}html.theme--documenter-dark .panel-tabs{align-items:flex-end;display:flex;font-size:.875em;justify-content:center}html.theme--documenter-dark .panel-tabs a{border-bottom:1px solid #5e6d6f;margin-bottom:-1px;padding:0.5em}html.theme--documenter-dark .panel-tabs a.is-active{border-bottom-color:#343c3d;color:#17a689}html.theme--documenter-dark .panel-list a{color:#fff}html.theme--documenter-dark .panel-list a:hover{color:#1abc9c}html.theme--documenter-dark .panel-block{align-items:center;color:#f2f2f2;display:flex;justify-content:flex-start;padding:0.5em 0.75em}html.theme--documenter-dark .panel-block input[type="checkbox"]{margin-right:.75em}html.theme--documenter-dark .panel-block>.control{flex-grow:1;flex-shrink:1;width:100%}html.theme--documenter-dark .panel-block.is-wrapped{flex-wrap:wrap}html.theme--documenter-dark .panel-block.is-active{border-left-color:#1abc9c;color:#17a689}html.theme--documenter-dark .panel-block.is-active .panel-icon{color:#1abc9c}html.theme--documenter-dark .panel-block:last-child{border-bottom-left-radius:8px;border-bottom-right-radius:8px}html.theme--documenter-dark a.panel-block,html.theme--documenter-dark label.panel-block{cursor:pointer}html.theme--documenter-dark a.panel-block:hover,html.theme--documenter-dark label.panel-block:hover{background-color:#282f2f}html.theme--documenter-dark .panel-icon{display:inline-block;font-size:14px;height:1em;line-height:1em;text-align:center;vertical-align:top;width:1em;color:#fff;margin-right:.75em}html.theme--documenter-dark .panel-icon .fa{font-size:inherit;line-height:inherit}html.theme--documenter-dark .tabs{-webkit-overflow-scrolling:touch;align-items:stretch;display:flex;font-size:1rem;justify-content:space-between;overflow:hidden;overflow-x:auto;white-space:nowrap}html.theme--documenter-dark .tabs a{align-items:center;border-bottom-color:#5e6d6f;border-bottom-style:solid;border-bottom-width:1px;color:#fff;display:flex;justify-content:center;margin-bottom:-1px;padding:0.5em 1em;vertical-align:top}html.theme--documenter-dark .tabs a:hover{border-bottom-color:#f2f2f2;color:#f2f2f2}html.theme--documenter-dark .tabs li{display:block}html.theme--documenter-dark .tabs li.is-active a{border-bottom-color:#1abc9c;color:#1abc9c}html.theme--documenter-dark .tabs ul{align-items:center;border-bottom-color:#5e6d6f;border-bottom-style:solid;border-bottom-width:1px;display:flex;flex-grow:1;flex-shrink:0;justify-content:flex-start}html.theme--documenter-dark .tabs ul.is-left{padding-right:0.75em}html.theme--documenter-dark .tabs ul.is-center{flex:none;justify-content:center;padding-left:0.75em;padding-right:0.75em}html.theme--documenter-dark .tabs ul.is-right{justify-content:flex-end;padding-left:0.75em}html.theme--documenter-dark .tabs .icon:first-child{margin-right:.5em}html.theme--documenter-dark .tabs .icon:last-child{margin-left:.5em}html.theme--documenter-dark .tabs.is-centered ul{justify-content:center}html.theme--documenter-dark .tabs.is-right ul{justify-content:flex-end}html.theme--documenter-dark .tabs.is-boxed a{border:1px solid transparent;border-radius:.4em .4em 0 0}html.theme--documenter-dark .tabs.is-boxed a:hover{background-color:#282f2f;border-bottom-color:#5e6d6f}html.theme--documenter-dark .tabs.is-boxed li.is-active a{background-color:#fff;border-color:#5e6d6f;border-bottom-color:rgba(0,0,0,0) !important}html.theme--documenter-dark .tabs.is-fullwidth li{flex-grow:1;flex-shrink:0}html.theme--documenter-dark .tabs.is-toggle a{border-color:#5e6d6f;border-style:solid;border-width:1px;margin-bottom:0;position:relative}html.theme--documenter-dark .tabs.is-toggle a:hover{background-color:#282f2f;border-color:#8c9b9d;z-index:2}html.theme--documenter-dark .tabs.is-toggle li+li{margin-left:-1px}html.theme--documenter-dark .tabs.is-toggle li:first-child a{border-top-left-radius:.4em;border-bottom-left-radius:.4em}html.theme--documenter-dark .tabs.is-toggle li:last-child a{border-top-right-radius:.4em;border-bottom-right-radius:.4em}html.theme--documenter-dark .tabs.is-toggle li.is-active a{background-color:#1abc9c;border-color:#1abc9c;color:#fff;z-index:1}html.theme--documenter-dark .tabs.is-toggle ul{border-bottom:none}html.theme--documenter-dark .tabs.is-toggle.is-toggle-rounded li:first-child a{border-bottom-left-radius:9999px;border-top-left-radius:9999px;padding-left:1.25em}html.theme--documenter-dark .tabs.is-toggle.is-toggle-rounded li:last-child a{border-bottom-right-radius:9999px;border-top-right-radius:9999px;padding-right:1.25em}html.theme--documenter-dark .tabs.is-small,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.tabs{font-size:.75rem}html.theme--documenter-dark .tabs.is-medium{font-size:1.25rem}html.theme--documenter-dark .tabs.is-large{font-size:1.5rem}html.theme--documenter-dark .column{display:block;flex-basis:0;flex-grow:1;flex-shrink:1;padding:.75rem}.columns.is-mobile>html.theme--documenter-dark .column.is-narrow{flex:none;width:unset}.columns.is-mobile>html.theme--documenter-dark .column.is-full{flex:none;width:100%}.columns.is-mobile>html.theme--documenter-dark .column.is-three-quarters{flex:none;width:75%}.columns.is-mobile>html.theme--documenter-dark .column.is-two-thirds{flex:none;width:66.6666%}.columns.is-mobile>html.theme--documenter-dark .column.is-half{flex:none;width:50%}.columns.is-mobile>html.theme--documenter-dark .column.is-one-third{flex:none;width:33.3333%}.columns.is-mobile>html.theme--documenter-dark .column.is-one-quarter{flex:none;width:25%}.columns.is-mobile>html.theme--documenter-dark .column.is-one-fifth{flex:none;width:20%}.columns.is-mobile>html.theme--documenter-dark .column.is-two-fifths{flex:none;width:40%}.columns.is-mobile>html.theme--documenter-dark .column.is-three-fifths{flex:none;width:60%}.columns.is-mobile>html.theme--documenter-dark .column.is-four-fifths{flex:none;width:80%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-three-quarters{margin-left:75%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-two-thirds{margin-left:66.6666%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-half{margin-left:50%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-one-third{margin-left:33.3333%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-one-quarter{margin-left:25%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-one-fifth{margin-left:20%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-two-fifths{margin-left:40%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-three-fifths{margin-left:60%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-four-fifths{margin-left:80%}.columns.is-mobile>html.theme--documenter-dark .column.is-0{flex:none;width:0%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-0{margin-left:0%}.columns.is-mobile>html.theme--documenter-dark .column.is-1{flex:none;width:8.33333337%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-1{margin-left:8.33333337%}.columns.is-mobile>html.theme--documenter-dark .column.is-2{flex:none;width:16.66666674%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-2{margin-left:16.66666674%}.columns.is-mobile>html.theme--documenter-dark .column.is-3{flex:none;width:25%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-3{margin-left:25%}.columns.is-mobile>html.theme--documenter-dark .column.is-4{flex:none;width:33.33333337%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-4{margin-left:33.33333337%}.columns.is-mobile>html.theme--documenter-dark .column.is-5{flex:none;width:41.66666674%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-5{margin-left:41.66666674%}.columns.is-mobile>html.theme--documenter-dark .column.is-6{flex:none;width:50%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-6{margin-left:50%}.columns.is-mobile>html.theme--documenter-dark .column.is-7{flex:none;width:58.33333337%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-7{margin-left:58.33333337%}.columns.is-mobile>html.theme--documenter-dark .column.is-8{flex:none;width:66.66666674%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-8{margin-left:66.66666674%}.columns.is-mobile>html.theme--documenter-dark .column.is-9{flex:none;width:75%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-9{margin-left:75%}.columns.is-mobile>html.theme--documenter-dark .column.is-10{flex:none;width:83.33333337%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-10{margin-left:83.33333337%}.columns.is-mobile>html.theme--documenter-dark .column.is-11{flex:none;width:91.66666674%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-11{margin-left:91.66666674%}.columns.is-mobile>html.theme--documenter-dark .column.is-12{flex:none;width:100%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-12{margin-left:100%}@media screen and (max-width: 768px){html.theme--documenter-dark .column.is-narrow-mobile{flex:none;width:unset}html.theme--documenter-dark .column.is-full-mobile{flex:none;width:100%}html.theme--documenter-dark .column.is-three-quarters-mobile{flex:none;width:75%}html.theme--documenter-dark .column.is-two-thirds-mobile{flex:none;width:66.6666%}html.theme--documenter-dark .column.is-half-mobile{flex:none;width:50%}html.theme--documenter-dark .column.is-one-third-mobile{flex:none;width:33.3333%}html.theme--documenter-dark .column.is-one-quarter-mobile{flex:none;width:25%}html.theme--documenter-dark .column.is-one-fifth-mobile{flex:none;width:20%}html.theme--documenter-dark .column.is-two-fifths-mobile{flex:none;width:40%}html.theme--documenter-dark .column.is-three-fifths-mobile{flex:none;width:60%}html.theme--documenter-dark .column.is-four-fifths-mobile{flex:none;width:80%}html.theme--documenter-dark .column.is-offset-three-quarters-mobile{margin-left:75%}html.theme--documenter-dark .column.is-offset-two-thirds-mobile{margin-left:66.6666%}html.theme--documenter-dark .column.is-offset-half-mobile{margin-left:50%}html.theme--documenter-dark .column.is-offset-one-third-mobile{margin-left:33.3333%}html.theme--documenter-dark .column.is-offset-one-quarter-mobile{margin-left:25%}html.theme--documenter-dark .column.is-offset-one-fifth-mobile{margin-left:20%}html.theme--documenter-dark .column.is-offset-two-fifths-mobile{margin-left:40%}html.theme--documenter-dark .column.is-offset-three-fifths-mobile{margin-left:60%}html.theme--documenter-dark .column.is-offset-four-fifths-mobile{margin-left:80%}html.theme--documenter-dark .column.is-0-mobile{flex:none;width:0%}html.theme--documenter-dark .column.is-offset-0-mobile{margin-left:0%}html.theme--documenter-dark .column.is-1-mobile{flex:none;width:8.33333337%}html.theme--documenter-dark .column.is-offset-1-mobile{margin-left:8.33333337%}html.theme--documenter-dark .column.is-2-mobile{flex:none;width:16.66666674%}html.theme--documenter-dark .column.is-offset-2-mobile{margin-left:16.66666674%}html.theme--documenter-dark .column.is-3-mobile{flex:none;width:25%}html.theme--documenter-dark .column.is-offset-3-mobile{margin-left:25%}html.theme--documenter-dark .column.is-4-mobile{flex:none;width:33.33333337%}html.theme--documenter-dark .column.is-offset-4-mobile{margin-left:33.33333337%}html.theme--documenter-dark .column.is-5-mobile{flex:none;width:41.66666674%}html.theme--documenter-dark .column.is-offset-5-mobile{margin-left:41.66666674%}html.theme--documenter-dark .column.is-6-mobile{flex:none;width:50%}html.theme--documenter-dark .column.is-offset-6-mobile{margin-left:50%}html.theme--documenter-dark .column.is-7-mobile{flex:none;width:58.33333337%}html.theme--documenter-dark .column.is-offset-7-mobile{margin-left:58.33333337%}html.theme--documenter-dark .column.is-8-mobile{flex:none;width:66.66666674%}html.theme--documenter-dark .column.is-offset-8-mobile{margin-left:66.66666674%}html.theme--documenter-dark .column.is-9-mobile{flex:none;width:75%}html.theme--documenter-dark .column.is-offset-9-mobile{margin-left:75%}html.theme--documenter-dark .column.is-10-mobile{flex:none;width:83.33333337%}html.theme--documenter-dark .column.is-offset-10-mobile{margin-left:83.33333337%}html.theme--documenter-dark .column.is-11-mobile{flex:none;width:91.66666674%}html.theme--documenter-dark .column.is-offset-11-mobile{margin-left:91.66666674%}html.theme--documenter-dark .column.is-12-mobile{flex:none;width:100%}html.theme--documenter-dark .column.is-offset-12-mobile{margin-left:100%}}@media screen and (min-width: 769px),print{html.theme--documenter-dark .column.is-narrow,html.theme--documenter-dark .column.is-narrow-tablet{flex:none;width:unset}html.theme--documenter-dark .column.is-full,html.theme--documenter-dark .column.is-full-tablet{flex:none;width:100%}html.theme--documenter-dark .column.is-three-quarters,html.theme--documenter-dark .column.is-three-quarters-tablet{flex:none;width:75%}html.theme--documenter-dark .column.is-two-thirds,html.theme--documenter-dark .column.is-two-thirds-tablet{flex:none;width:66.6666%}html.theme--documenter-dark .column.is-half,html.theme--documenter-dark .column.is-half-tablet{flex:none;width:50%}html.theme--documenter-dark .column.is-one-third,html.theme--documenter-dark .column.is-one-third-tablet{flex:none;width:33.3333%}html.theme--documenter-dark .column.is-one-quarter,html.theme--documenter-dark .column.is-one-quarter-tablet{flex:none;width:25%}html.theme--documenter-dark .column.is-one-fifth,html.theme--documenter-dark .column.is-one-fifth-tablet{flex:none;width:20%}html.theme--documenter-dark .column.is-two-fifths,html.theme--documenter-dark .column.is-two-fifths-tablet{flex:none;width:40%}html.theme--documenter-dark .column.is-three-fifths,html.theme--documenter-dark .column.is-three-fifths-tablet{flex:none;width:60%}html.theme--documenter-dark .column.is-four-fifths,html.theme--documenter-dark .column.is-four-fifths-tablet{flex:none;width:80%}html.theme--documenter-dark .column.is-offset-three-quarters,html.theme--documenter-dark .column.is-offset-three-quarters-tablet{margin-left:75%}html.theme--documenter-dark .column.is-offset-two-thirds,html.theme--documenter-dark .column.is-offset-two-thirds-tablet{margin-left:66.6666%}html.theme--documenter-dark .column.is-offset-half,html.theme--documenter-dark .column.is-offset-half-tablet{margin-left:50%}html.theme--documenter-dark .column.is-offset-one-third,html.theme--documenter-dark .column.is-offset-one-third-tablet{margin-left:33.3333%}html.theme--documenter-dark .column.is-offset-one-quarter,html.theme--documenter-dark .column.is-offset-one-quarter-tablet{margin-left:25%}html.theme--documenter-dark .column.is-offset-one-fifth,html.theme--documenter-dark .column.is-offset-one-fifth-tablet{margin-left:20%}html.theme--documenter-dark .column.is-offset-two-fifths,html.theme--documenter-dark .column.is-offset-two-fifths-tablet{margin-left:40%}html.theme--documenter-dark .column.is-offset-three-fifths,html.theme--documenter-dark .column.is-offset-three-fifths-tablet{margin-left:60%}html.theme--documenter-dark .column.is-offset-four-fifths,html.theme--documenter-dark .column.is-offset-four-fifths-tablet{margin-left:80%}html.theme--documenter-dark .column.is-0,html.theme--documenter-dark .column.is-0-tablet{flex:none;width:0%}html.theme--documenter-dark .column.is-offset-0,html.theme--documenter-dark .column.is-offset-0-tablet{margin-left:0%}html.theme--documenter-dark .column.is-1,html.theme--documenter-dark .column.is-1-tablet{flex:none;width:8.33333337%}html.theme--documenter-dark .column.is-offset-1,html.theme--documenter-dark .column.is-offset-1-tablet{margin-left:8.33333337%}html.theme--documenter-dark .column.is-2,html.theme--documenter-dark .column.is-2-tablet{flex:none;width:16.66666674%}html.theme--documenter-dark .column.is-offset-2,html.theme--documenter-dark .column.is-offset-2-tablet{margin-left:16.66666674%}html.theme--documenter-dark .column.is-3,html.theme--documenter-dark .column.is-3-tablet{flex:none;width:25%}html.theme--documenter-dark .column.is-offset-3,html.theme--documenter-dark .column.is-offset-3-tablet{margin-left:25%}html.theme--documenter-dark .column.is-4,html.theme--documenter-dark .column.is-4-tablet{flex:none;width:33.33333337%}html.theme--documenter-dark .column.is-offset-4,html.theme--documenter-dark .column.is-offset-4-tablet{margin-left:33.33333337%}html.theme--documenter-dark .column.is-5,html.theme--documenter-dark .column.is-5-tablet{flex:none;width:41.66666674%}html.theme--documenter-dark .column.is-offset-5,html.theme--documenter-dark .column.is-offset-5-tablet{margin-left:41.66666674%}html.theme--documenter-dark .column.is-6,html.theme--documenter-dark .column.is-6-tablet{flex:none;width:50%}html.theme--documenter-dark .column.is-offset-6,html.theme--documenter-dark .column.is-offset-6-tablet{margin-left:50%}html.theme--documenter-dark .column.is-7,html.theme--documenter-dark .column.is-7-tablet{flex:none;width:58.33333337%}html.theme--documenter-dark .column.is-offset-7,html.theme--documenter-dark .column.is-offset-7-tablet{margin-left:58.33333337%}html.theme--documenter-dark .column.is-8,html.theme--documenter-dark .column.is-8-tablet{flex:none;width:66.66666674%}html.theme--documenter-dark .column.is-offset-8,html.theme--documenter-dark .column.is-offset-8-tablet{margin-left:66.66666674%}html.theme--documenter-dark .column.is-9,html.theme--documenter-dark .column.is-9-tablet{flex:none;width:75%}html.theme--documenter-dark .column.is-offset-9,html.theme--documenter-dark .column.is-offset-9-tablet{margin-left:75%}html.theme--documenter-dark .column.is-10,html.theme--documenter-dark .column.is-10-tablet{flex:none;width:83.33333337%}html.theme--documenter-dark .column.is-offset-10,html.theme--documenter-dark .column.is-offset-10-tablet{margin-left:83.33333337%}html.theme--documenter-dark .column.is-11,html.theme--documenter-dark .column.is-11-tablet{flex:none;width:91.66666674%}html.theme--documenter-dark .column.is-offset-11,html.theme--documenter-dark .column.is-offset-11-tablet{margin-left:91.66666674%}html.theme--documenter-dark .column.is-12,html.theme--documenter-dark .column.is-12-tablet{flex:none;width:100%}html.theme--documenter-dark .column.is-offset-12,html.theme--documenter-dark .column.is-offset-12-tablet{margin-left:100%}}@media screen and (max-width: 1055px){html.theme--documenter-dark .column.is-narrow-touch{flex:none;width:unset}html.theme--documenter-dark .column.is-full-touch{flex:none;width:100%}html.theme--documenter-dark .column.is-three-quarters-touch{flex:none;width:75%}html.theme--documenter-dark .column.is-two-thirds-touch{flex:none;width:66.6666%}html.theme--documenter-dark .column.is-half-touch{flex:none;width:50%}html.theme--documenter-dark .column.is-one-third-touch{flex:none;width:33.3333%}html.theme--documenter-dark .column.is-one-quarter-touch{flex:none;width:25%}html.theme--documenter-dark .column.is-one-fifth-touch{flex:none;width:20%}html.theme--documenter-dark .column.is-two-fifths-touch{flex:none;width:40%}html.theme--documenter-dark .column.is-three-fifths-touch{flex:none;width:60%}html.theme--documenter-dark .column.is-four-fifths-touch{flex:none;width:80%}html.theme--documenter-dark .column.is-offset-three-quarters-touch{margin-left:75%}html.theme--documenter-dark .column.is-offset-two-thirds-touch{margin-left:66.6666%}html.theme--documenter-dark .column.is-offset-half-touch{margin-left:50%}html.theme--documenter-dark .column.is-offset-one-third-touch{margin-left:33.3333%}html.theme--documenter-dark .column.is-offset-one-quarter-touch{margin-left:25%}html.theme--documenter-dark .column.is-offset-one-fifth-touch{margin-left:20%}html.theme--documenter-dark .column.is-offset-two-fifths-touch{margin-left:40%}html.theme--documenter-dark .column.is-offset-three-fifths-touch{margin-left:60%}html.theme--documenter-dark .column.is-offset-four-fifths-touch{margin-left:80%}html.theme--documenter-dark .column.is-0-touch{flex:none;width:0%}html.theme--documenter-dark .column.is-offset-0-touch{margin-left:0%}html.theme--documenter-dark .column.is-1-touch{flex:none;width:8.33333337%}html.theme--documenter-dark .column.is-offset-1-touch{margin-left:8.33333337%}html.theme--documenter-dark .column.is-2-touch{flex:none;width:16.66666674%}html.theme--documenter-dark .column.is-offset-2-touch{margin-left:16.66666674%}html.theme--documenter-dark .column.is-3-touch{flex:none;width:25%}html.theme--documenter-dark .column.is-offset-3-touch{margin-left:25%}html.theme--documenter-dark .column.is-4-touch{flex:none;width:33.33333337%}html.theme--documenter-dark .column.is-offset-4-touch{margin-left:33.33333337%}html.theme--documenter-dark .column.is-5-touch{flex:none;width:41.66666674%}html.theme--documenter-dark .column.is-offset-5-touch{margin-left:41.66666674%}html.theme--documenter-dark .column.is-6-touch{flex:none;width:50%}html.theme--documenter-dark .column.is-offset-6-touch{margin-left:50%}html.theme--documenter-dark .column.is-7-touch{flex:none;width:58.33333337%}html.theme--documenter-dark .column.is-offset-7-touch{margin-left:58.33333337%}html.theme--documenter-dark .column.is-8-touch{flex:none;width:66.66666674%}html.theme--documenter-dark .column.is-offset-8-touch{margin-left:66.66666674%}html.theme--documenter-dark .column.is-9-touch{flex:none;width:75%}html.theme--documenter-dark .column.is-offset-9-touch{margin-left:75%}html.theme--documenter-dark .column.is-10-touch{flex:none;width:83.33333337%}html.theme--documenter-dark .column.is-offset-10-touch{margin-left:83.33333337%}html.theme--documenter-dark .column.is-11-touch{flex:none;width:91.66666674%}html.theme--documenter-dark .column.is-offset-11-touch{margin-left:91.66666674%}html.theme--documenter-dark .column.is-12-touch{flex:none;width:100%}html.theme--documenter-dark .column.is-offset-12-touch{margin-left:100%}}@media screen and (min-width: 1056px){html.theme--documenter-dark .column.is-narrow-desktop{flex:none;width:unset}html.theme--documenter-dark .column.is-full-desktop{flex:none;width:100%}html.theme--documenter-dark .column.is-three-quarters-desktop{flex:none;width:75%}html.theme--documenter-dark .column.is-two-thirds-desktop{flex:none;width:66.6666%}html.theme--documenter-dark .column.is-half-desktop{flex:none;width:50%}html.theme--documenter-dark .column.is-one-third-desktop{flex:none;width:33.3333%}html.theme--documenter-dark .column.is-one-quarter-desktop{flex:none;width:25%}html.theme--documenter-dark .column.is-one-fifth-desktop{flex:none;width:20%}html.theme--documenter-dark .column.is-two-fifths-desktop{flex:none;width:40%}html.theme--documenter-dark .column.is-three-fifths-desktop{flex:none;width:60%}html.theme--documenter-dark .column.is-four-fifths-desktop{flex:none;width:80%}html.theme--documenter-dark .column.is-offset-three-quarters-desktop{margin-left:75%}html.theme--documenter-dark .column.is-offset-two-thirds-desktop{margin-left:66.6666%}html.theme--documenter-dark .column.is-offset-half-desktop{margin-left:50%}html.theme--documenter-dark .column.is-offset-one-third-desktop{margin-left:33.3333%}html.theme--documenter-dark .column.is-offset-one-quarter-desktop{margin-left:25%}html.theme--documenter-dark .column.is-offset-one-fifth-desktop{margin-left:20%}html.theme--documenter-dark .column.is-offset-two-fifths-desktop{margin-left:40%}html.theme--documenter-dark .column.is-offset-three-fifths-desktop{margin-left:60%}html.theme--documenter-dark .column.is-offset-four-fifths-desktop{margin-left:80%}html.theme--documenter-dark .column.is-0-desktop{flex:none;width:0%}html.theme--documenter-dark .column.is-offset-0-desktop{margin-left:0%}html.theme--documenter-dark .column.is-1-desktop{flex:none;width:8.33333337%}html.theme--documenter-dark .column.is-offset-1-desktop{margin-left:8.33333337%}html.theme--documenter-dark .column.is-2-desktop{flex:none;width:16.66666674%}html.theme--documenter-dark .column.is-offset-2-desktop{margin-left:16.66666674%}html.theme--documenter-dark .column.is-3-desktop{flex:none;width:25%}html.theme--documenter-dark .column.is-offset-3-desktop{margin-left:25%}html.theme--documenter-dark .column.is-4-desktop{flex:none;width:33.33333337%}html.theme--documenter-dark .column.is-offset-4-desktop{margin-left:33.33333337%}html.theme--documenter-dark .column.is-5-desktop{flex:none;width:41.66666674%}html.theme--documenter-dark .column.is-offset-5-desktop{margin-left:41.66666674%}html.theme--documenter-dark .column.is-6-desktop{flex:none;width:50%}html.theme--documenter-dark .column.is-offset-6-desktop{margin-left:50%}html.theme--documenter-dark .column.is-7-desktop{flex:none;width:58.33333337%}html.theme--documenter-dark .column.is-offset-7-desktop{margin-left:58.33333337%}html.theme--documenter-dark .column.is-8-desktop{flex:none;width:66.66666674%}html.theme--documenter-dark .column.is-offset-8-desktop{margin-left:66.66666674%}html.theme--documenter-dark .column.is-9-desktop{flex:none;width:75%}html.theme--documenter-dark .column.is-offset-9-desktop{margin-left:75%}html.theme--documenter-dark .column.is-10-desktop{flex:none;width:83.33333337%}html.theme--documenter-dark .column.is-offset-10-desktop{margin-left:83.33333337%}html.theme--documenter-dark .column.is-11-desktop{flex:none;width:91.66666674%}html.theme--documenter-dark .column.is-offset-11-desktop{margin-left:91.66666674%}html.theme--documenter-dark .column.is-12-desktop{flex:none;width:100%}html.theme--documenter-dark .column.is-offset-12-desktop{margin-left:100%}}@media screen and (min-width: 1216px){html.theme--documenter-dark .column.is-narrow-widescreen{flex:none;width:unset}html.theme--documenter-dark .column.is-full-widescreen{flex:none;width:100%}html.theme--documenter-dark .column.is-three-quarters-widescreen{flex:none;width:75%}html.theme--documenter-dark .column.is-two-thirds-widescreen{flex:none;width:66.6666%}html.theme--documenter-dark .column.is-half-widescreen{flex:none;width:50%}html.theme--documenter-dark .column.is-one-third-widescreen{flex:none;width:33.3333%}html.theme--documenter-dark .column.is-one-quarter-widescreen{flex:none;width:25%}html.theme--documenter-dark .column.is-one-fifth-widescreen{flex:none;width:20%}html.theme--documenter-dark .column.is-two-fifths-widescreen{flex:none;width:40%}html.theme--documenter-dark .column.is-three-fifths-widescreen{flex:none;width:60%}html.theme--documenter-dark .column.is-four-fifths-widescreen{flex:none;width:80%}html.theme--documenter-dark .column.is-offset-three-quarters-widescreen{margin-left:75%}html.theme--documenter-dark .column.is-offset-two-thirds-widescreen{margin-left:66.6666%}html.theme--documenter-dark .column.is-offset-half-widescreen{margin-left:50%}html.theme--documenter-dark .column.is-offset-one-third-widescreen{margin-left:33.3333%}html.theme--documenter-dark .column.is-offset-one-quarter-widescreen{margin-left:25%}html.theme--documenter-dark .column.is-offset-one-fifth-widescreen{margin-left:20%}html.theme--documenter-dark .column.is-offset-two-fifths-widescreen{margin-left:40%}html.theme--documenter-dark .column.is-offset-three-fifths-widescreen{margin-left:60%}html.theme--documenter-dark .column.is-offset-four-fifths-widescreen{margin-left:80%}html.theme--documenter-dark .column.is-0-widescreen{flex:none;width:0%}html.theme--documenter-dark .column.is-offset-0-widescreen{margin-left:0%}html.theme--documenter-dark .column.is-1-widescreen{flex:none;width:8.33333337%}html.theme--documenter-dark .column.is-offset-1-widescreen{margin-left:8.33333337%}html.theme--documenter-dark .column.is-2-widescreen{flex:none;width:16.66666674%}html.theme--documenter-dark .column.is-offset-2-widescreen{margin-left:16.66666674%}html.theme--documenter-dark .column.is-3-widescreen{flex:none;width:25%}html.theme--documenter-dark .column.is-offset-3-widescreen{margin-left:25%}html.theme--documenter-dark .column.is-4-widescreen{flex:none;width:33.33333337%}html.theme--documenter-dark .column.is-offset-4-widescreen{margin-left:33.33333337%}html.theme--documenter-dark .column.is-5-widescreen{flex:none;width:41.66666674%}html.theme--documenter-dark .column.is-offset-5-widescreen{margin-left:41.66666674%}html.theme--documenter-dark .column.is-6-widescreen{flex:none;width:50%}html.theme--documenter-dark .column.is-offset-6-widescreen{margin-left:50%}html.theme--documenter-dark .column.is-7-widescreen{flex:none;width:58.33333337%}html.theme--documenter-dark .column.is-offset-7-widescreen{margin-left:58.33333337%}html.theme--documenter-dark .column.is-8-widescreen{flex:none;width:66.66666674%}html.theme--documenter-dark .column.is-offset-8-widescreen{margin-left:66.66666674%}html.theme--documenter-dark .column.is-9-widescreen{flex:none;width:75%}html.theme--documenter-dark .column.is-offset-9-widescreen{margin-left:75%}html.theme--documenter-dark .column.is-10-widescreen{flex:none;width:83.33333337%}html.theme--documenter-dark .column.is-offset-10-widescreen{margin-left:83.33333337%}html.theme--documenter-dark .column.is-11-widescreen{flex:none;width:91.66666674%}html.theme--documenter-dark .column.is-offset-11-widescreen{margin-left:91.66666674%}html.theme--documenter-dark .column.is-12-widescreen{flex:none;width:100%}html.theme--documenter-dark .column.is-offset-12-widescreen{margin-left:100%}}@media screen and (min-width: 1408px){html.theme--documenter-dark .column.is-narrow-fullhd{flex:none;width:unset}html.theme--documenter-dark .column.is-full-fullhd{flex:none;width:100%}html.theme--documenter-dark .column.is-three-quarters-fullhd{flex:none;width:75%}html.theme--documenter-dark .column.is-two-thirds-fullhd{flex:none;width:66.6666%}html.theme--documenter-dark .column.is-half-fullhd{flex:none;width:50%}html.theme--documenter-dark .column.is-one-third-fullhd{flex:none;width:33.3333%}html.theme--documenter-dark .column.is-one-quarter-fullhd{flex:none;width:25%}html.theme--documenter-dark .column.is-one-fifth-fullhd{flex:none;width:20%}html.theme--documenter-dark .column.is-two-fifths-fullhd{flex:none;width:40%}html.theme--documenter-dark .column.is-three-fifths-fullhd{flex:none;width:60%}html.theme--documenter-dark .column.is-four-fifths-fullhd{flex:none;width:80%}html.theme--documenter-dark .column.is-offset-three-quarters-fullhd{margin-left:75%}html.theme--documenter-dark .column.is-offset-two-thirds-fullhd{margin-left:66.6666%}html.theme--documenter-dark .column.is-offset-half-fullhd{margin-left:50%}html.theme--documenter-dark .column.is-offset-one-third-fullhd{margin-left:33.3333%}html.theme--documenter-dark .column.is-offset-one-quarter-fullhd{margin-left:25%}html.theme--documenter-dark .column.is-offset-one-fifth-fullhd{margin-left:20%}html.theme--documenter-dark .column.is-offset-two-fifths-fullhd{margin-left:40%}html.theme--documenter-dark .column.is-offset-three-fifths-fullhd{margin-left:60%}html.theme--documenter-dark .column.is-offset-four-fifths-fullhd{margin-left:80%}html.theme--documenter-dark .column.is-0-fullhd{flex:none;width:0%}html.theme--documenter-dark .column.is-offset-0-fullhd{margin-left:0%}html.theme--documenter-dark .column.is-1-fullhd{flex:none;width:8.33333337%}html.theme--documenter-dark .column.is-offset-1-fullhd{margin-left:8.33333337%}html.theme--documenter-dark .column.is-2-fullhd{flex:none;width:16.66666674%}html.theme--documenter-dark .column.is-offset-2-fullhd{margin-left:16.66666674%}html.theme--documenter-dark .column.is-3-fullhd{flex:none;width:25%}html.theme--documenter-dark .column.is-offset-3-fullhd{margin-left:25%}html.theme--documenter-dark .column.is-4-fullhd{flex:none;width:33.33333337%}html.theme--documenter-dark .column.is-offset-4-fullhd{margin-left:33.33333337%}html.theme--documenter-dark .column.is-5-fullhd{flex:none;width:41.66666674%}html.theme--documenter-dark .column.is-offset-5-fullhd{margin-left:41.66666674%}html.theme--documenter-dark .column.is-6-fullhd{flex:none;width:50%}html.theme--documenter-dark .column.is-offset-6-fullhd{margin-left:50%}html.theme--documenter-dark .column.is-7-fullhd{flex:none;width:58.33333337%}html.theme--documenter-dark .column.is-offset-7-fullhd{margin-left:58.33333337%}html.theme--documenter-dark .column.is-8-fullhd{flex:none;width:66.66666674%}html.theme--documenter-dark .column.is-offset-8-fullhd{margin-left:66.66666674%}html.theme--documenter-dark .column.is-9-fullhd{flex:none;width:75%}html.theme--documenter-dark .column.is-offset-9-fullhd{margin-left:75%}html.theme--documenter-dark .column.is-10-fullhd{flex:none;width:83.33333337%}html.theme--documenter-dark .column.is-offset-10-fullhd{margin-left:83.33333337%}html.theme--documenter-dark .column.is-11-fullhd{flex:none;width:91.66666674%}html.theme--documenter-dark .column.is-offset-11-fullhd{margin-left:91.66666674%}html.theme--documenter-dark .column.is-12-fullhd{flex:none;width:100%}html.theme--documenter-dark .column.is-offset-12-fullhd{margin-left:100%}}html.theme--documenter-dark .columns{margin-left:-.75rem;margin-right:-.75rem;margin-top:-.75rem}html.theme--documenter-dark .columns:last-child{margin-bottom:-.75rem}html.theme--documenter-dark .columns:not(:last-child){margin-bottom:calc(1.5rem - .75rem)}html.theme--documenter-dark .columns.is-centered{justify-content:center}html.theme--documenter-dark .columns.is-gapless{margin-left:0;margin-right:0;margin-top:0}html.theme--documenter-dark .columns.is-gapless>.column{margin:0;padding:0 !important}html.theme--documenter-dark .columns.is-gapless:not(:last-child){margin-bottom:1.5rem}html.theme--documenter-dark .columns.is-gapless:last-child{margin-bottom:0}html.theme--documenter-dark .columns.is-mobile{display:flex}html.theme--documenter-dark .columns.is-multiline{flex-wrap:wrap}html.theme--documenter-dark .columns.is-vcentered{align-items:center}@media screen and (min-width: 769px),print{html.theme--documenter-dark .columns:not(.is-desktop){display:flex}}@media screen and (min-width: 1056px){html.theme--documenter-dark .columns.is-desktop{display:flex}}html.theme--documenter-dark .columns.is-variable{--columnGap: 0.75rem;margin-left:calc(-1 * var(--columnGap));margin-right:calc(-1 * var(--columnGap))}html.theme--documenter-dark .columns.is-variable>.column{padding-left:var(--columnGap);padding-right:var(--columnGap)}html.theme--documenter-dark .columns.is-variable.is-0{--columnGap: 0rem}@media screen and (max-width: 768px){html.theme--documenter-dark .columns.is-variable.is-0-mobile{--columnGap: 0rem}}@media screen and (min-width: 769px),print{html.theme--documenter-dark .columns.is-variable.is-0-tablet{--columnGap: 0rem}}@media screen and (min-width: 769px) and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-0-tablet-only{--columnGap: 0rem}}@media screen and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-0-touch{--columnGap: 0rem}}@media screen and (min-width: 1056px){html.theme--documenter-dark .columns.is-variable.is-0-desktop{--columnGap: 0rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){html.theme--documenter-dark .columns.is-variable.is-0-desktop-only{--columnGap: 0rem}}@media screen and (min-width: 1216px){html.theme--documenter-dark .columns.is-variable.is-0-widescreen{--columnGap: 0rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){html.theme--documenter-dark .columns.is-variable.is-0-widescreen-only{--columnGap: 0rem}}@media screen and (min-width: 1408px){html.theme--documenter-dark .columns.is-variable.is-0-fullhd{--columnGap: 0rem}}html.theme--documenter-dark .columns.is-variable.is-1{--columnGap: .25rem}@media screen and (max-width: 768px){html.theme--documenter-dark .columns.is-variable.is-1-mobile{--columnGap: .25rem}}@media screen and (min-width: 769px),print{html.theme--documenter-dark .columns.is-variable.is-1-tablet{--columnGap: .25rem}}@media screen and (min-width: 769px) and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-1-tablet-only{--columnGap: .25rem}}@media screen and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-1-touch{--columnGap: .25rem}}@media screen and (min-width: 1056px){html.theme--documenter-dark .columns.is-variable.is-1-desktop{--columnGap: .25rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){html.theme--documenter-dark .columns.is-variable.is-1-desktop-only{--columnGap: .25rem}}@media screen and (min-width: 1216px){html.theme--documenter-dark .columns.is-variable.is-1-widescreen{--columnGap: .25rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){html.theme--documenter-dark .columns.is-variable.is-1-widescreen-only{--columnGap: .25rem}}@media screen and (min-width: 1408px){html.theme--documenter-dark .columns.is-variable.is-1-fullhd{--columnGap: .25rem}}html.theme--documenter-dark .columns.is-variable.is-2{--columnGap: .5rem}@media screen and (max-width: 768px){html.theme--documenter-dark .columns.is-variable.is-2-mobile{--columnGap: .5rem}}@media screen and (min-width: 769px),print{html.theme--documenter-dark .columns.is-variable.is-2-tablet{--columnGap: .5rem}}@media screen and (min-width: 769px) and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-2-tablet-only{--columnGap: .5rem}}@media screen and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-2-touch{--columnGap: .5rem}}@media screen and (min-width: 1056px){html.theme--documenter-dark .columns.is-variable.is-2-desktop{--columnGap: .5rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){html.theme--documenter-dark .columns.is-variable.is-2-desktop-only{--columnGap: .5rem}}@media screen and (min-width: 1216px){html.theme--documenter-dark .columns.is-variable.is-2-widescreen{--columnGap: .5rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){html.theme--documenter-dark .columns.is-variable.is-2-widescreen-only{--columnGap: .5rem}}@media screen and (min-width: 1408px){html.theme--documenter-dark .columns.is-variable.is-2-fullhd{--columnGap: .5rem}}html.theme--documenter-dark .columns.is-variable.is-3{--columnGap: .75rem}@media screen and (max-width: 768px){html.theme--documenter-dark .columns.is-variable.is-3-mobile{--columnGap: .75rem}}@media screen and (min-width: 769px),print{html.theme--documenter-dark .columns.is-variable.is-3-tablet{--columnGap: .75rem}}@media screen and (min-width: 769px) and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-3-tablet-only{--columnGap: .75rem}}@media screen and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-3-touch{--columnGap: .75rem}}@media screen and (min-width: 1056px){html.theme--documenter-dark .columns.is-variable.is-3-desktop{--columnGap: .75rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){html.theme--documenter-dark .columns.is-variable.is-3-desktop-only{--columnGap: .75rem}}@media screen and (min-width: 1216px){html.theme--documenter-dark .columns.is-variable.is-3-widescreen{--columnGap: .75rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){html.theme--documenter-dark .columns.is-variable.is-3-widescreen-only{--columnGap: .75rem}}@media screen and (min-width: 1408px){html.theme--documenter-dark .columns.is-variable.is-3-fullhd{--columnGap: .75rem}}html.theme--documenter-dark .columns.is-variable.is-4{--columnGap: 1rem}@media screen and (max-width: 768px){html.theme--documenter-dark .columns.is-variable.is-4-mobile{--columnGap: 1rem}}@media screen and (min-width: 769px),print{html.theme--documenter-dark .columns.is-variable.is-4-tablet{--columnGap: 1rem}}@media screen and (min-width: 769px) and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-4-tablet-only{--columnGap: 1rem}}@media screen and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-4-touch{--columnGap: 1rem}}@media screen and (min-width: 1056px){html.theme--documenter-dark .columns.is-variable.is-4-desktop{--columnGap: 1rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){html.theme--documenter-dark .columns.is-variable.is-4-desktop-only{--columnGap: 1rem}}@media screen and (min-width: 1216px){html.theme--documenter-dark .columns.is-variable.is-4-widescreen{--columnGap: 1rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){html.theme--documenter-dark .columns.is-variable.is-4-widescreen-only{--columnGap: 1rem}}@media screen and (min-width: 1408px){html.theme--documenter-dark .columns.is-variable.is-4-fullhd{--columnGap: 1rem}}html.theme--documenter-dark .columns.is-variable.is-5{--columnGap: 1.25rem}@media screen and (max-width: 768px){html.theme--documenter-dark .columns.is-variable.is-5-mobile{--columnGap: 1.25rem}}@media screen and (min-width: 769px),print{html.theme--documenter-dark .columns.is-variable.is-5-tablet{--columnGap: 1.25rem}}@media screen and (min-width: 769px) and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-5-tablet-only{--columnGap: 1.25rem}}@media screen and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-5-touch{--columnGap: 1.25rem}}@media screen and (min-width: 1056px){html.theme--documenter-dark .columns.is-variable.is-5-desktop{--columnGap: 1.25rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){html.theme--documenter-dark .columns.is-variable.is-5-desktop-only{--columnGap: 1.25rem}}@media screen and (min-width: 1216px){html.theme--documenter-dark .columns.is-variable.is-5-widescreen{--columnGap: 1.25rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){html.theme--documenter-dark .columns.is-variable.is-5-widescreen-only{--columnGap: 1.25rem}}@media screen and (min-width: 1408px){html.theme--documenter-dark .columns.is-variable.is-5-fullhd{--columnGap: 1.25rem}}html.theme--documenter-dark .columns.is-variable.is-6{--columnGap: 1.5rem}@media screen and (max-width: 768px){html.theme--documenter-dark .columns.is-variable.is-6-mobile{--columnGap: 1.5rem}}@media screen and (min-width: 769px),print{html.theme--documenter-dark .columns.is-variable.is-6-tablet{--columnGap: 1.5rem}}@media screen and (min-width: 769px) and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-6-tablet-only{--columnGap: 1.5rem}}@media screen and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-6-touch{--columnGap: 1.5rem}}@media screen and (min-width: 1056px){html.theme--documenter-dark .columns.is-variable.is-6-desktop{--columnGap: 1.5rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){html.theme--documenter-dark .columns.is-variable.is-6-desktop-only{--columnGap: 1.5rem}}@media screen and (min-width: 1216px){html.theme--documenter-dark .columns.is-variable.is-6-widescreen{--columnGap: 1.5rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){html.theme--documenter-dark .columns.is-variable.is-6-widescreen-only{--columnGap: 1.5rem}}@media screen and (min-width: 1408px){html.theme--documenter-dark .columns.is-variable.is-6-fullhd{--columnGap: 1.5rem}}html.theme--documenter-dark .columns.is-variable.is-7{--columnGap: 1.75rem}@media screen and (max-width: 768px){html.theme--documenter-dark .columns.is-variable.is-7-mobile{--columnGap: 1.75rem}}@media screen and (min-width: 769px),print{html.theme--documenter-dark .columns.is-variable.is-7-tablet{--columnGap: 1.75rem}}@media screen and (min-width: 769px) and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-7-tablet-only{--columnGap: 1.75rem}}@media screen and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-7-touch{--columnGap: 1.75rem}}@media screen and (min-width: 1056px){html.theme--documenter-dark .columns.is-variable.is-7-desktop{--columnGap: 1.75rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){html.theme--documenter-dark .columns.is-variable.is-7-desktop-only{--columnGap: 1.75rem}}@media screen and (min-width: 1216px){html.theme--documenter-dark .columns.is-variable.is-7-widescreen{--columnGap: 1.75rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){html.theme--documenter-dark .columns.is-variable.is-7-widescreen-only{--columnGap: 1.75rem}}@media screen and (min-width: 1408px){html.theme--documenter-dark .columns.is-variable.is-7-fullhd{--columnGap: 1.75rem}}html.theme--documenter-dark .columns.is-variable.is-8{--columnGap: 2rem}@media screen and (max-width: 768px){html.theme--documenter-dark .columns.is-variable.is-8-mobile{--columnGap: 2rem}}@media screen and (min-width: 769px),print{html.theme--documenter-dark .columns.is-variable.is-8-tablet{--columnGap: 2rem}}@media screen and (min-width: 769px) and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-8-tablet-only{--columnGap: 2rem}}@media screen and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-8-touch{--columnGap: 2rem}}@media screen and (min-width: 1056px){html.theme--documenter-dark .columns.is-variable.is-8-desktop{--columnGap: 2rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){html.theme--documenter-dark .columns.is-variable.is-8-desktop-only{--columnGap: 2rem}}@media screen and (min-width: 1216px){html.theme--documenter-dark .columns.is-variable.is-8-widescreen{--columnGap: 2rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){html.theme--documenter-dark .columns.is-variable.is-8-widescreen-only{--columnGap: 2rem}}@media screen and (min-width: 1408px){html.theme--documenter-dark .columns.is-variable.is-8-fullhd{--columnGap: 2rem}}html.theme--documenter-dark .tile{align-items:stretch;display:block;flex-basis:0;flex-grow:1;flex-shrink:1;min-height:min-content}html.theme--documenter-dark .tile.is-ancestor{margin-left:-.75rem;margin-right:-.75rem;margin-top:-.75rem}html.theme--documenter-dark .tile.is-ancestor:last-child{margin-bottom:-.75rem}html.theme--documenter-dark .tile.is-ancestor:not(:last-child){margin-bottom:.75rem}html.theme--documenter-dark .tile.is-child{margin:0 !important}html.theme--documenter-dark .tile.is-parent{padding:.75rem}html.theme--documenter-dark .tile.is-vertical{flex-direction:column}html.theme--documenter-dark .tile.is-vertical>.tile.is-child:not(:last-child){margin-bottom:1.5rem !important}@media screen and (min-width: 769px),print{html.theme--documenter-dark .tile:not(.is-child){display:flex}html.theme--documenter-dark .tile.is-1{flex:none;width:8.33333337%}html.theme--documenter-dark .tile.is-2{flex:none;width:16.66666674%}html.theme--documenter-dark .tile.is-3{flex:none;width:25%}html.theme--documenter-dark .tile.is-4{flex:none;width:33.33333337%}html.theme--documenter-dark .tile.is-5{flex:none;width:41.66666674%}html.theme--documenter-dark .tile.is-6{flex:none;width:50%}html.theme--documenter-dark .tile.is-7{flex:none;width:58.33333337%}html.theme--documenter-dark .tile.is-8{flex:none;width:66.66666674%}html.theme--documenter-dark .tile.is-9{flex:none;width:75%}html.theme--documenter-dark .tile.is-10{flex:none;width:83.33333337%}html.theme--documenter-dark .tile.is-11{flex:none;width:91.66666674%}html.theme--documenter-dark .tile.is-12{flex:none;width:100%}}html.theme--documenter-dark .hero{align-items:stretch;display:flex;flex-direction:column;justify-content:space-between}html.theme--documenter-dark .hero .navbar{background:none}html.theme--documenter-dark .hero .tabs ul{border-bottom:none}html.theme--documenter-dark .hero.is-white{background-color:#fff;color:#0a0a0a}html.theme--documenter-dark .hero.is-white a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),html.theme--documenter-dark .hero.is-white strong{color:inherit}html.theme--documenter-dark .hero.is-white .title{color:#0a0a0a}html.theme--documenter-dark .hero.is-white .subtitle{color:rgba(10,10,10,0.9)}html.theme--documenter-dark .hero.is-white .subtitle a:not(.button),html.theme--documenter-dark .hero.is-white .subtitle strong{color:#0a0a0a}@media screen and (max-width: 1055px){html.theme--documenter-dark .hero.is-white .navbar-menu{background-color:#fff}}html.theme--documenter-dark .hero.is-white .navbar-item,html.theme--documenter-dark .hero.is-white .navbar-link{color:rgba(10,10,10,0.7)}html.theme--documenter-dark .hero.is-white a.navbar-item:hover,html.theme--documenter-dark .hero.is-white a.navbar-item.is-active,html.theme--documenter-dark .hero.is-white .navbar-link:hover,html.theme--documenter-dark .hero.is-white .navbar-link.is-active{background-color:#f2f2f2;color:#0a0a0a}html.theme--documenter-dark .hero.is-white .tabs a{color:#0a0a0a;opacity:0.9}html.theme--documenter-dark .hero.is-white .tabs a:hover{opacity:1}html.theme--documenter-dark .hero.is-white .tabs li.is-active a{color:#fff !important;opacity:1}html.theme--documenter-dark .hero.is-white .tabs.is-boxed a,html.theme--documenter-dark .hero.is-white .tabs.is-toggle a{color:#0a0a0a}html.theme--documenter-dark .hero.is-white .tabs.is-boxed a:hover,html.theme--documenter-dark .hero.is-white .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}html.theme--documenter-dark .hero.is-white .tabs.is-boxed li.is-active a,html.theme--documenter-dark .hero.is-white .tabs.is-boxed li.is-active a:hover,html.theme--documenter-dark .hero.is-white .tabs.is-toggle li.is-active a,html.theme--documenter-dark .hero.is-white .tabs.is-toggle li.is-active a:hover{background-color:#0a0a0a;border-color:#0a0a0a;color:#fff}html.theme--documenter-dark .hero.is-white.is-bold{background-image:linear-gradient(141deg, #e8e3e4 0%, #fff 71%, #fff 100%)}@media screen and (max-width: 768px){html.theme--documenter-dark .hero.is-white.is-bold .navbar-menu{background-image:linear-gradient(141deg, #e8e3e4 0%, #fff 71%, #fff 100%)}}html.theme--documenter-dark .hero.is-black{background-color:#0a0a0a;color:#fff}html.theme--documenter-dark .hero.is-black a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),html.theme--documenter-dark .hero.is-black strong{color:inherit}html.theme--documenter-dark .hero.is-black .title{color:#fff}html.theme--documenter-dark .hero.is-black .subtitle{color:rgba(255,255,255,0.9)}html.theme--documenter-dark .hero.is-black .subtitle a:not(.button),html.theme--documenter-dark .hero.is-black .subtitle strong{color:#fff}@media screen and (max-width: 1055px){html.theme--documenter-dark .hero.is-black .navbar-menu{background-color:#0a0a0a}}html.theme--documenter-dark .hero.is-black .navbar-item,html.theme--documenter-dark .hero.is-black .navbar-link{color:rgba(255,255,255,0.7)}html.theme--documenter-dark .hero.is-black a.navbar-item:hover,html.theme--documenter-dark .hero.is-black a.navbar-item.is-active,html.theme--documenter-dark .hero.is-black .navbar-link:hover,html.theme--documenter-dark .hero.is-black .navbar-link.is-active{background-color:#000;color:#fff}html.theme--documenter-dark .hero.is-black .tabs a{color:#fff;opacity:0.9}html.theme--documenter-dark .hero.is-black .tabs a:hover{opacity:1}html.theme--documenter-dark .hero.is-black .tabs li.is-active a{color:#0a0a0a !important;opacity:1}html.theme--documenter-dark .hero.is-black .tabs.is-boxed a,html.theme--documenter-dark .hero.is-black .tabs.is-toggle a{color:#fff}html.theme--documenter-dark .hero.is-black .tabs.is-boxed a:hover,html.theme--documenter-dark .hero.is-black .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}html.theme--documenter-dark .hero.is-black .tabs.is-boxed li.is-active a,html.theme--documenter-dark .hero.is-black .tabs.is-boxed li.is-active a:hover,html.theme--documenter-dark .hero.is-black .tabs.is-toggle li.is-active a,html.theme--documenter-dark .hero.is-black .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#0a0a0a}html.theme--documenter-dark .hero.is-black.is-bold{background-image:linear-gradient(141deg, #000 0%, #0a0a0a 71%, #181616 100%)}@media screen and (max-width: 768px){html.theme--documenter-dark .hero.is-black.is-bold .navbar-menu{background-image:linear-gradient(141deg, #000 0%, #0a0a0a 71%, #181616 100%)}}html.theme--documenter-dark .hero.is-light{background-color:#ecf0f1;color:rgba(0,0,0,0.7)}html.theme--documenter-dark .hero.is-light a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),html.theme--documenter-dark .hero.is-light strong{color:inherit}html.theme--documenter-dark .hero.is-light .title{color:rgba(0,0,0,0.7)}html.theme--documenter-dark .hero.is-light .subtitle{color:rgba(0,0,0,0.9)}html.theme--documenter-dark .hero.is-light .subtitle a:not(.button),html.theme--documenter-dark .hero.is-light .subtitle strong{color:rgba(0,0,0,0.7)}@media screen and (max-width: 1055px){html.theme--documenter-dark .hero.is-light .navbar-menu{background-color:#ecf0f1}}html.theme--documenter-dark .hero.is-light .navbar-item,html.theme--documenter-dark .hero.is-light .navbar-link{color:rgba(0,0,0,0.7)}html.theme--documenter-dark .hero.is-light a.navbar-item:hover,html.theme--documenter-dark .hero.is-light a.navbar-item.is-active,html.theme--documenter-dark .hero.is-light .navbar-link:hover,html.theme--documenter-dark .hero.is-light .navbar-link.is-active{background-color:#dde4e6;color:rgba(0,0,0,0.7)}html.theme--documenter-dark .hero.is-light .tabs a{color:rgba(0,0,0,0.7);opacity:0.9}html.theme--documenter-dark .hero.is-light .tabs a:hover{opacity:1}html.theme--documenter-dark .hero.is-light .tabs li.is-active a{color:#ecf0f1 !important;opacity:1}html.theme--documenter-dark .hero.is-light .tabs.is-boxed a,html.theme--documenter-dark .hero.is-light .tabs.is-toggle a{color:rgba(0,0,0,0.7)}html.theme--documenter-dark .hero.is-light .tabs.is-boxed a:hover,html.theme--documenter-dark .hero.is-light .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}html.theme--documenter-dark .hero.is-light .tabs.is-boxed li.is-active a,html.theme--documenter-dark .hero.is-light .tabs.is-boxed li.is-active a:hover,html.theme--documenter-dark .hero.is-light .tabs.is-toggle li.is-active a,html.theme--documenter-dark .hero.is-light .tabs.is-toggle li.is-active a:hover{background-color:rgba(0,0,0,0.7);border-color:rgba(0,0,0,0.7);color:#ecf0f1}html.theme--documenter-dark .hero.is-light.is-bold{background-image:linear-gradient(141deg, #cadfe0 0%, #ecf0f1 71%, #fafbfc 100%)}@media screen and (max-width: 768px){html.theme--documenter-dark .hero.is-light.is-bold .navbar-menu{background-image:linear-gradient(141deg, #cadfe0 0%, #ecf0f1 71%, #fafbfc 100%)}}html.theme--documenter-dark .hero.is-dark,html.theme--documenter-dark .content kbd.hero{background-color:#282f2f;color:#fff}html.theme--documenter-dark .hero.is-dark a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),html.theme--documenter-dark .content kbd.hero a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),html.theme--documenter-dark .hero.is-dark strong,html.theme--documenter-dark .content kbd.hero strong{color:inherit}html.theme--documenter-dark .hero.is-dark .title,html.theme--documenter-dark .content kbd.hero .title{color:#fff}html.theme--documenter-dark .hero.is-dark .subtitle,html.theme--documenter-dark .content kbd.hero .subtitle{color:rgba(255,255,255,0.9)}html.theme--documenter-dark .hero.is-dark .subtitle a:not(.button),html.theme--documenter-dark .content kbd.hero .subtitle a:not(.button),html.theme--documenter-dark .hero.is-dark .subtitle strong,html.theme--documenter-dark .content kbd.hero .subtitle strong{color:#fff}@media screen and (max-width: 1055px){html.theme--documenter-dark .hero.is-dark .navbar-menu,html.theme--documenter-dark .content kbd.hero .navbar-menu{background-color:#282f2f}}html.theme--documenter-dark .hero.is-dark .navbar-item,html.theme--documenter-dark .content kbd.hero .navbar-item,html.theme--documenter-dark .hero.is-dark .navbar-link,html.theme--documenter-dark .content kbd.hero .navbar-link{color:rgba(255,255,255,0.7)}html.theme--documenter-dark .hero.is-dark a.navbar-item:hover,html.theme--documenter-dark .content kbd.hero a.navbar-item:hover,html.theme--documenter-dark .hero.is-dark a.navbar-item.is-active,html.theme--documenter-dark .content kbd.hero a.navbar-item.is-active,html.theme--documenter-dark .hero.is-dark .navbar-link:hover,html.theme--documenter-dark .content kbd.hero .navbar-link:hover,html.theme--documenter-dark .hero.is-dark .navbar-link.is-active,html.theme--documenter-dark .content kbd.hero .navbar-link.is-active{background-color:#1d2122;color:#fff}html.theme--documenter-dark .hero.is-dark .tabs a,html.theme--documenter-dark .content kbd.hero .tabs a{color:#fff;opacity:0.9}html.theme--documenter-dark .hero.is-dark .tabs a:hover,html.theme--documenter-dark .content kbd.hero .tabs a:hover{opacity:1}html.theme--documenter-dark .hero.is-dark .tabs li.is-active a,html.theme--documenter-dark .content kbd.hero .tabs li.is-active a{color:#282f2f !important;opacity:1}html.theme--documenter-dark .hero.is-dark .tabs.is-boxed a,html.theme--documenter-dark .content kbd.hero .tabs.is-boxed a,html.theme--documenter-dark .hero.is-dark .tabs.is-toggle a,html.theme--documenter-dark .content kbd.hero .tabs.is-toggle a{color:#fff}html.theme--documenter-dark .hero.is-dark .tabs.is-boxed a:hover,html.theme--documenter-dark .content kbd.hero .tabs.is-boxed a:hover,html.theme--documenter-dark .hero.is-dark .tabs.is-toggle a:hover,html.theme--documenter-dark .content kbd.hero .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}html.theme--documenter-dark .hero.is-dark .tabs.is-boxed li.is-active a,html.theme--documenter-dark .content kbd.hero .tabs.is-boxed li.is-active a,html.theme--documenter-dark .hero.is-dark .tabs.is-boxed li.is-active a:hover,html.theme--documenter-dark .hero.is-dark .tabs.is-toggle li.is-active a,html.theme--documenter-dark .content kbd.hero .tabs.is-toggle li.is-active a,html.theme--documenter-dark .hero.is-dark .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#282f2f}html.theme--documenter-dark .hero.is-dark.is-bold,html.theme--documenter-dark .content kbd.hero.is-bold{background-image:linear-gradient(141deg, #0f1615 0%, #282f2f 71%, #313c40 100%)}@media screen and (max-width: 768px){html.theme--documenter-dark .hero.is-dark.is-bold .navbar-menu,html.theme--documenter-dark .content kbd.hero.is-bold .navbar-menu{background-image:linear-gradient(141deg, #0f1615 0%, #282f2f 71%, #313c40 100%)}}html.theme--documenter-dark .hero.is-primary,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink{background-color:#375a7f;color:#fff}html.theme--documenter-dark .hero.is-primary a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),html.theme--documenter-dark .hero.is-primary strong,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink strong{color:inherit}html.theme--documenter-dark .hero.is-primary .title,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .title{color:#fff}html.theme--documenter-dark .hero.is-primary .subtitle,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .subtitle{color:rgba(255,255,255,0.9)}html.theme--documenter-dark .hero.is-primary .subtitle a:not(.button),html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .subtitle a:not(.button),html.theme--documenter-dark .hero.is-primary .subtitle strong,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .subtitle strong{color:#fff}@media screen and (max-width: 1055px){html.theme--documenter-dark .hero.is-primary .navbar-menu,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .navbar-menu{background-color:#375a7f}}html.theme--documenter-dark .hero.is-primary .navbar-item,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .navbar-item,html.theme--documenter-dark .hero.is-primary .navbar-link,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .navbar-link{color:rgba(255,255,255,0.7)}html.theme--documenter-dark .hero.is-primary a.navbar-item:hover,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink a.navbar-item:hover,html.theme--documenter-dark .hero.is-primary a.navbar-item.is-active,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink a.navbar-item.is-active,html.theme--documenter-dark .hero.is-primary .navbar-link:hover,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .navbar-link:hover,html.theme--documenter-dark .hero.is-primary .navbar-link.is-active,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .navbar-link.is-active{background-color:#2f4d6d;color:#fff}html.theme--documenter-dark .hero.is-primary .tabs a,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .tabs a{color:#fff;opacity:0.9}html.theme--documenter-dark .hero.is-primary .tabs a:hover,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .tabs a:hover{opacity:1}html.theme--documenter-dark .hero.is-primary .tabs li.is-active a,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .tabs li.is-active a{color:#375a7f !important;opacity:1}html.theme--documenter-dark .hero.is-primary .tabs.is-boxed a,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .tabs.is-boxed a,html.theme--documenter-dark .hero.is-primary .tabs.is-toggle a,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .tabs.is-toggle a{color:#fff}html.theme--documenter-dark .hero.is-primary .tabs.is-boxed a:hover,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .tabs.is-boxed a:hover,html.theme--documenter-dark .hero.is-primary .tabs.is-toggle a:hover,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}html.theme--documenter-dark .hero.is-primary .tabs.is-boxed li.is-active a,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .tabs.is-boxed li.is-active a,html.theme--documenter-dark .hero.is-primary .tabs.is-boxed li.is-active a:hover,html.theme--documenter-dark .hero.is-primary .tabs.is-toggle li.is-active a,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .tabs.is-toggle li.is-active a,html.theme--documenter-dark .hero.is-primary .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#375a7f}html.theme--documenter-dark .hero.is-primary.is-bold,html.theme--documenter-dark .docstring>section>a.hero.is-bold.docs-sourcelink{background-image:linear-gradient(141deg, #214b62 0%, #375a7f 71%, #3a5796 100%)}@media screen and (max-width: 768px){html.theme--documenter-dark .hero.is-primary.is-bold .navbar-menu,html.theme--documenter-dark .docstring>section>a.hero.is-bold.docs-sourcelink .navbar-menu{background-image:linear-gradient(141deg, #214b62 0%, #375a7f 71%, #3a5796 100%)}}html.theme--documenter-dark .hero.is-link{background-color:#1abc9c;color:#fff}html.theme--documenter-dark .hero.is-link a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),html.theme--documenter-dark .hero.is-link strong{color:inherit}html.theme--documenter-dark .hero.is-link .title{color:#fff}html.theme--documenter-dark .hero.is-link .subtitle{color:rgba(255,255,255,0.9)}html.theme--documenter-dark .hero.is-link .subtitle a:not(.button),html.theme--documenter-dark .hero.is-link .subtitle strong{color:#fff}@media screen and (max-width: 1055px){html.theme--documenter-dark .hero.is-link .navbar-menu{background-color:#1abc9c}}html.theme--documenter-dark .hero.is-link .navbar-item,html.theme--documenter-dark .hero.is-link .navbar-link{color:rgba(255,255,255,0.7)}html.theme--documenter-dark .hero.is-link a.navbar-item:hover,html.theme--documenter-dark .hero.is-link a.navbar-item.is-active,html.theme--documenter-dark .hero.is-link .navbar-link:hover,html.theme--documenter-dark .hero.is-link .navbar-link.is-active{background-color:#17a689;color:#fff}html.theme--documenter-dark .hero.is-link .tabs a{color:#fff;opacity:0.9}html.theme--documenter-dark .hero.is-link .tabs a:hover{opacity:1}html.theme--documenter-dark .hero.is-link .tabs li.is-active a{color:#1abc9c !important;opacity:1}html.theme--documenter-dark .hero.is-link .tabs.is-boxed a,html.theme--documenter-dark .hero.is-link .tabs.is-toggle a{color:#fff}html.theme--documenter-dark .hero.is-link .tabs.is-boxed a:hover,html.theme--documenter-dark .hero.is-link .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}html.theme--documenter-dark .hero.is-link .tabs.is-boxed li.is-active a,html.theme--documenter-dark .hero.is-link .tabs.is-boxed li.is-active a:hover,html.theme--documenter-dark .hero.is-link .tabs.is-toggle li.is-active a,html.theme--documenter-dark .hero.is-link .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#1abc9c}html.theme--documenter-dark .hero.is-link.is-bold{background-image:linear-gradient(141deg, #0c9764 0%, #1abc9c 71%, #17d8d2 100%)}@media screen and (max-width: 768px){html.theme--documenter-dark .hero.is-link.is-bold .navbar-menu{background-image:linear-gradient(141deg, #0c9764 0%, #1abc9c 71%, #17d8d2 100%)}}html.theme--documenter-dark .hero.is-info{background-color:#024c7d;color:#fff}html.theme--documenter-dark .hero.is-info a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),html.theme--documenter-dark .hero.is-info strong{color:inherit}html.theme--documenter-dark .hero.is-info .title{color:#fff}html.theme--documenter-dark .hero.is-info .subtitle{color:rgba(255,255,255,0.9)}html.theme--documenter-dark .hero.is-info .subtitle a:not(.button),html.theme--documenter-dark .hero.is-info .subtitle strong{color:#fff}@media screen and (max-width: 1055px){html.theme--documenter-dark .hero.is-info .navbar-menu{background-color:#024c7d}}html.theme--documenter-dark .hero.is-info .navbar-item,html.theme--documenter-dark .hero.is-info .navbar-link{color:rgba(255,255,255,0.7)}html.theme--documenter-dark .hero.is-info a.navbar-item:hover,html.theme--documenter-dark .hero.is-info a.navbar-item.is-active,html.theme--documenter-dark .hero.is-info .navbar-link:hover,html.theme--documenter-dark .hero.is-info .navbar-link.is-active{background-color:#023d64;color:#fff}html.theme--documenter-dark .hero.is-info .tabs a{color:#fff;opacity:0.9}html.theme--documenter-dark .hero.is-info .tabs a:hover{opacity:1}html.theme--documenter-dark .hero.is-info .tabs li.is-active a{color:#024c7d !important;opacity:1}html.theme--documenter-dark .hero.is-info .tabs.is-boxed a,html.theme--documenter-dark .hero.is-info .tabs.is-toggle a{color:#fff}html.theme--documenter-dark .hero.is-info .tabs.is-boxed a:hover,html.theme--documenter-dark .hero.is-info .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}html.theme--documenter-dark .hero.is-info .tabs.is-boxed li.is-active a,html.theme--documenter-dark .hero.is-info .tabs.is-boxed li.is-active a:hover,html.theme--documenter-dark .hero.is-info .tabs.is-toggle li.is-active a,html.theme--documenter-dark .hero.is-info .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#024c7d}html.theme--documenter-dark .hero.is-info.is-bold{background-image:linear-gradient(141deg, #003a4c 0%, #024c7d 71%, #004299 100%)}@media screen and (max-width: 768px){html.theme--documenter-dark .hero.is-info.is-bold .navbar-menu{background-image:linear-gradient(141deg, #003a4c 0%, #024c7d 71%, #004299 100%)}}html.theme--documenter-dark .hero.is-success{background-color:#008438;color:#fff}html.theme--documenter-dark .hero.is-success a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),html.theme--documenter-dark .hero.is-success strong{color:inherit}html.theme--documenter-dark .hero.is-success .title{color:#fff}html.theme--documenter-dark .hero.is-success .subtitle{color:rgba(255,255,255,0.9)}html.theme--documenter-dark .hero.is-success .subtitle a:not(.button),html.theme--documenter-dark .hero.is-success .subtitle strong{color:#fff}@media screen and (max-width: 1055px){html.theme--documenter-dark .hero.is-success .navbar-menu{background-color:#008438}}html.theme--documenter-dark .hero.is-success .navbar-item,html.theme--documenter-dark .hero.is-success .navbar-link{color:rgba(255,255,255,0.7)}html.theme--documenter-dark .hero.is-success a.navbar-item:hover,html.theme--documenter-dark .hero.is-success a.navbar-item.is-active,html.theme--documenter-dark .hero.is-success .navbar-link:hover,html.theme--documenter-dark .hero.is-success .navbar-link.is-active{background-color:#006b2d;color:#fff}html.theme--documenter-dark .hero.is-success .tabs a{color:#fff;opacity:0.9}html.theme--documenter-dark .hero.is-success .tabs a:hover{opacity:1}html.theme--documenter-dark .hero.is-success .tabs li.is-active a{color:#008438 !important;opacity:1}html.theme--documenter-dark .hero.is-success .tabs.is-boxed a,html.theme--documenter-dark .hero.is-success .tabs.is-toggle a{color:#fff}html.theme--documenter-dark .hero.is-success .tabs.is-boxed a:hover,html.theme--documenter-dark .hero.is-success .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}html.theme--documenter-dark .hero.is-success .tabs.is-boxed li.is-active a,html.theme--documenter-dark .hero.is-success .tabs.is-boxed li.is-active a:hover,html.theme--documenter-dark .hero.is-success .tabs.is-toggle li.is-active a,html.theme--documenter-dark .hero.is-success .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#008438}html.theme--documenter-dark .hero.is-success.is-bold{background-image:linear-gradient(141deg, #005115 0%, #008438 71%, #009e5d 100%)}@media screen and (max-width: 768px){html.theme--documenter-dark .hero.is-success.is-bold .navbar-menu{background-image:linear-gradient(141deg, #005115 0%, #008438 71%, #009e5d 100%)}}html.theme--documenter-dark .hero.is-warning{background-color:#ad8100;color:#fff}html.theme--documenter-dark .hero.is-warning a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),html.theme--documenter-dark .hero.is-warning strong{color:inherit}html.theme--documenter-dark .hero.is-warning .title{color:#fff}html.theme--documenter-dark .hero.is-warning .subtitle{color:rgba(255,255,255,0.9)}html.theme--documenter-dark .hero.is-warning .subtitle a:not(.button),html.theme--documenter-dark .hero.is-warning .subtitle strong{color:#fff}@media screen and (max-width: 1055px){html.theme--documenter-dark .hero.is-warning .navbar-menu{background-color:#ad8100}}html.theme--documenter-dark .hero.is-warning .navbar-item,html.theme--documenter-dark .hero.is-warning .navbar-link{color:rgba(255,255,255,0.7)}html.theme--documenter-dark .hero.is-warning a.navbar-item:hover,html.theme--documenter-dark .hero.is-warning a.navbar-item.is-active,html.theme--documenter-dark .hero.is-warning .navbar-link:hover,html.theme--documenter-dark .hero.is-warning .navbar-link.is-active{background-color:#946e00;color:#fff}html.theme--documenter-dark .hero.is-warning .tabs a{color:#fff;opacity:0.9}html.theme--documenter-dark .hero.is-warning .tabs a:hover{opacity:1}html.theme--documenter-dark .hero.is-warning .tabs li.is-active a{color:#ad8100 !important;opacity:1}html.theme--documenter-dark .hero.is-warning .tabs.is-boxed a,html.theme--documenter-dark .hero.is-warning .tabs.is-toggle a{color:#fff}html.theme--documenter-dark .hero.is-warning .tabs.is-boxed a:hover,html.theme--documenter-dark .hero.is-warning .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}html.theme--documenter-dark .hero.is-warning .tabs.is-boxed li.is-active a,html.theme--documenter-dark .hero.is-warning .tabs.is-boxed li.is-active a:hover,html.theme--documenter-dark .hero.is-warning .tabs.is-toggle li.is-active a,html.theme--documenter-dark .hero.is-warning .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#ad8100}html.theme--documenter-dark .hero.is-warning.is-bold{background-image:linear-gradient(141deg, #7a4700 0%, #ad8100 71%, #c7b500 100%)}@media screen and (max-width: 768px){html.theme--documenter-dark .hero.is-warning.is-bold .navbar-menu{background-image:linear-gradient(141deg, #7a4700 0%, #ad8100 71%, #c7b500 100%)}}html.theme--documenter-dark .hero.is-danger{background-color:#9e1b0d;color:#fff}html.theme--documenter-dark .hero.is-danger a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),html.theme--documenter-dark .hero.is-danger strong{color:inherit}html.theme--documenter-dark .hero.is-danger .title{color:#fff}html.theme--documenter-dark .hero.is-danger .subtitle{color:rgba(255,255,255,0.9)}html.theme--documenter-dark .hero.is-danger .subtitle a:not(.button),html.theme--documenter-dark .hero.is-danger .subtitle strong{color:#fff}@media screen and (max-width: 1055px){html.theme--documenter-dark .hero.is-danger .navbar-menu{background-color:#9e1b0d}}html.theme--documenter-dark .hero.is-danger .navbar-item,html.theme--documenter-dark .hero.is-danger .navbar-link{color:rgba(255,255,255,0.7)}html.theme--documenter-dark .hero.is-danger a.navbar-item:hover,html.theme--documenter-dark .hero.is-danger a.navbar-item.is-active,html.theme--documenter-dark .hero.is-danger .navbar-link:hover,html.theme--documenter-dark .hero.is-danger .navbar-link.is-active{background-color:#86170b;color:#fff}html.theme--documenter-dark .hero.is-danger .tabs a{color:#fff;opacity:0.9}html.theme--documenter-dark .hero.is-danger .tabs a:hover{opacity:1}html.theme--documenter-dark .hero.is-danger .tabs li.is-active a{color:#9e1b0d !important;opacity:1}html.theme--documenter-dark .hero.is-danger .tabs.is-boxed a,html.theme--documenter-dark .hero.is-danger .tabs.is-toggle a{color:#fff}html.theme--documenter-dark .hero.is-danger .tabs.is-boxed a:hover,html.theme--documenter-dark .hero.is-danger .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}html.theme--documenter-dark .hero.is-danger .tabs.is-boxed li.is-active a,html.theme--documenter-dark .hero.is-danger .tabs.is-boxed li.is-active a:hover,html.theme--documenter-dark .hero.is-danger .tabs.is-toggle li.is-active a,html.theme--documenter-dark .hero.is-danger .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#9e1b0d}html.theme--documenter-dark .hero.is-danger.is-bold{background-image:linear-gradient(141deg, #75030b 0%, #9e1b0d 71%, #ba380a 100%)}@media screen and (max-width: 768px){html.theme--documenter-dark .hero.is-danger.is-bold .navbar-menu{background-image:linear-gradient(141deg, #75030b 0%, #9e1b0d 71%, #ba380a 100%)}}html.theme--documenter-dark .hero.is-small .hero-body,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.hero .hero-body{padding:1.5rem}@media screen and (min-width: 769px),print{html.theme--documenter-dark .hero.is-medium .hero-body{padding:9rem 4.5rem}}@media screen and (min-width: 769px),print{html.theme--documenter-dark .hero.is-large .hero-body{padding:18rem 6rem}}html.theme--documenter-dark .hero.is-halfheight .hero-body,html.theme--documenter-dark .hero.is-fullheight .hero-body,html.theme--documenter-dark .hero.is-fullheight-with-navbar .hero-body{align-items:center;display:flex}html.theme--documenter-dark .hero.is-halfheight .hero-body>.container,html.theme--documenter-dark .hero.is-fullheight .hero-body>.container,html.theme--documenter-dark .hero.is-fullheight-with-navbar .hero-body>.container{flex-grow:1;flex-shrink:1}html.theme--documenter-dark .hero.is-halfheight{min-height:50vh}html.theme--documenter-dark .hero.is-fullheight{min-height:100vh}html.theme--documenter-dark .hero-video{overflow:hidden}html.theme--documenter-dark .hero-video video{left:50%;min-height:100%;min-width:100%;position:absolute;top:50%;transform:translate3d(-50%, -50%, 0)}html.theme--documenter-dark .hero-video.is-transparent{opacity:0.3}@media screen and (max-width: 768px){html.theme--documenter-dark .hero-video{display:none}}html.theme--documenter-dark .hero-buttons{margin-top:1.5rem}@media screen and (max-width: 768px){html.theme--documenter-dark .hero-buttons .button{display:flex}html.theme--documenter-dark .hero-buttons .button:not(:last-child){margin-bottom:0.75rem}}@media screen and (min-width: 769px),print{html.theme--documenter-dark .hero-buttons{display:flex;justify-content:center}html.theme--documenter-dark .hero-buttons .button:not(:last-child){margin-right:1.5rem}}html.theme--documenter-dark .hero-head,html.theme--documenter-dark .hero-foot{flex-grow:0;flex-shrink:0}html.theme--documenter-dark .hero-body{flex-grow:1;flex-shrink:0;padding:3rem 1.5rem}@media screen and (min-width: 769px),print{html.theme--documenter-dark .hero-body{padding:3rem 3rem}}html.theme--documenter-dark .section{padding:3rem 1.5rem}@media screen and (min-width: 1056px){html.theme--documenter-dark .section{padding:3rem 3rem}html.theme--documenter-dark .section.is-medium{padding:9rem 4.5rem}html.theme--documenter-dark .section.is-large{padding:18rem 6rem}}html.theme--documenter-dark .footer{background-color:#282f2f;padding:3rem 1.5rem 6rem}html.theme--documenter-dark hr{height:1px}html.theme--documenter-dark h6{text-transform:uppercase;letter-spacing:0.5px}html.theme--documenter-dark .hero{background-color:#343c3d}html.theme--documenter-dark a{transition:all 200ms ease}html.theme--documenter-dark .button{transition:all 200ms ease;border-width:1px;color:#fff}html.theme--documenter-dark .button.is-active,html.theme--documenter-dark .button.is-focused,html.theme--documenter-dark .button:active,html.theme--documenter-dark .button:focus{box-shadow:0 0 0 2px rgba(140,155,157,0.5)}html.theme--documenter-dark .button.is-white.is-hovered,html.theme--documenter-dark .button.is-white:hover{background-color:#fff}html.theme--documenter-dark .button.is-white.is-active,html.theme--documenter-dark .button.is-white.is-focused,html.theme--documenter-dark .button.is-white:active,html.theme--documenter-dark .button.is-white:focus{border-color:#fff;box-shadow:0 0 0 2px rgba(255,255,255,0.5)}html.theme--documenter-dark .button.is-black.is-hovered,html.theme--documenter-dark .button.is-black:hover{background-color:#1d1d1d}html.theme--documenter-dark .button.is-black.is-active,html.theme--documenter-dark .button.is-black.is-focused,html.theme--documenter-dark .button.is-black:active,html.theme--documenter-dark .button.is-black:focus{border-color:#0a0a0a;box-shadow:0 0 0 2px rgba(10,10,10,0.5)}html.theme--documenter-dark .button.is-light.is-hovered,html.theme--documenter-dark .button.is-light:hover{background-color:#fff}html.theme--documenter-dark .button.is-light.is-active,html.theme--documenter-dark .button.is-light.is-focused,html.theme--documenter-dark .button.is-light:active,html.theme--documenter-dark .button.is-light:focus{border-color:#ecf0f1;box-shadow:0 0 0 2px rgba(236,240,241,0.5)}html.theme--documenter-dark .button.is-dark.is-hovered,html.theme--documenter-dark .content kbd.button.is-hovered,html.theme--documenter-dark .button.is-dark:hover,html.theme--documenter-dark .content kbd.button:hover{background-color:#3a4344}html.theme--documenter-dark .button.is-dark.is-active,html.theme--documenter-dark .content kbd.button.is-active,html.theme--documenter-dark .button.is-dark.is-focused,html.theme--documenter-dark .content kbd.button.is-focused,html.theme--documenter-dark .button.is-dark:active,html.theme--documenter-dark .content kbd.button:active,html.theme--documenter-dark .button.is-dark:focus,html.theme--documenter-dark .content kbd.button:focus{border-color:#282f2f;box-shadow:0 0 0 2px rgba(40,47,47,0.5)}html.theme--documenter-dark .button.is-primary.is-hovered,html.theme--documenter-dark .docstring>section>a.button.is-hovered.docs-sourcelink,html.theme--documenter-dark .button.is-primary:hover,html.theme--documenter-dark .docstring>section>a.button.docs-sourcelink:hover{background-color:#436d9a}html.theme--documenter-dark .button.is-primary.is-active,html.theme--documenter-dark .docstring>section>a.button.is-active.docs-sourcelink,html.theme--documenter-dark .button.is-primary.is-focused,html.theme--documenter-dark .docstring>section>a.button.is-focused.docs-sourcelink,html.theme--documenter-dark .button.is-primary:active,html.theme--documenter-dark .docstring>section>a.button.docs-sourcelink:active,html.theme--documenter-dark .button.is-primary:focus,html.theme--documenter-dark .docstring>section>a.button.docs-sourcelink:focus{border-color:#375a7f;box-shadow:0 0 0 2px rgba(55,90,127,0.5)}html.theme--documenter-dark .button.is-link.is-hovered,html.theme--documenter-dark .button.is-link:hover{background-color:#1fdeb8}html.theme--documenter-dark .button.is-link.is-active,html.theme--documenter-dark .button.is-link.is-focused,html.theme--documenter-dark .button.is-link:active,html.theme--documenter-dark .button.is-link:focus{border-color:#1abc9c;box-shadow:0 0 0 2px rgba(26,188,156,0.5)}html.theme--documenter-dark .button.is-info.is-hovered,html.theme--documenter-dark .button.is-info:hover{background-color:#0363a3}html.theme--documenter-dark .button.is-info.is-active,html.theme--documenter-dark .button.is-info.is-focused,html.theme--documenter-dark .button.is-info:active,html.theme--documenter-dark .button.is-info:focus{border-color:#024c7d;box-shadow:0 0 0 2px rgba(2,76,125,0.5)}html.theme--documenter-dark .button.is-success.is-hovered,html.theme--documenter-dark .button.is-success:hover{background-color:#00aa48}html.theme--documenter-dark .button.is-success.is-active,html.theme--documenter-dark .button.is-success.is-focused,html.theme--documenter-dark .button.is-success:active,html.theme--documenter-dark .button.is-success:focus{border-color:#008438;box-shadow:0 0 0 2px rgba(0,132,56,0.5)}html.theme--documenter-dark .button.is-warning.is-hovered,html.theme--documenter-dark .button.is-warning:hover{background-color:#d39e00}html.theme--documenter-dark .button.is-warning.is-active,html.theme--documenter-dark .button.is-warning.is-focused,html.theme--documenter-dark .button.is-warning:active,html.theme--documenter-dark .button.is-warning:focus{border-color:#ad8100;box-shadow:0 0 0 2px rgba(173,129,0,0.5)}html.theme--documenter-dark .button.is-danger.is-hovered,html.theme--documenter-dark .button.is-danger:hover{background-color:#c12110}html.theme--documenter-dark .button.is-danger.is-active,html.theme--documenter-dark .button.is-danger.is-focused,html.theme--documenter-dark .button.is-danger:active,html.theme--documenter-dark .button.is-danger:focus{border-color:#9e1b0d;box-shadow:0 0 0 2px rgba(158,27,13,0.5)}html.theme--documenter-dark .label{color:#dbdee0}html.theme--documenter-dark .button,html.theme--documenter-dark .control.has-icons-left .icon,html.theme--documenter-dark .control.has-icons-right .icon,html.theme--documenter-dark .input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input,html.theme--documenter-dark .pagination-ellipsis,html.theme--documenter-dark .pagination-link,html.theme--documenter-dark .pagination-next,html.theme--documenter-dark .pagination-previous,html.theme--documenter-dark .select,html.theme--documenter-dark .select select,html.theme--documenter-dark .textarea{height:2.5em}html.theme--documenter-dark .input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input,html.theme--documenter-dark .textarea{transition:all 200ms ease;box-shadow:none;border-width:1px;padding-left:1em;padding-right:1em}html.theme--documenter-dark .select:after,html.theme--documenter-dark .select select{border-width:1px}html.theme--documenter-dark .control.has-addons .button,html.theme--documenter-dark .control.has-addons .input,html.theme--documenter-dark .control.has-addons #documenter .docs-sidebar form.docs-search>input,html.theme--documenter-dark #documenter .docs-sidebar .control.has-addons form.docs-search>input,html.theme--documenter-dark .control.has-addons .select{margin-right:-1px}html.theme--documenter-dark .notification{background-color:#343c3d}html.theme--documenter-dark .card{box-shadow:none;border:1px solid #343c3d;background-color:#282f2f;border-radius:.4em}html.theme--documenter-dark .card .card-image img{border-radius:.4em .4em 0 0}html.theme--documenter-dark .card .card-header{box-shadow:none;background-color:rgba(18,18,18,0.2);border-radius:.4em .4em 0 0}html.theme--documenter-dark .card .card-footer{background-color:rgba(18,18,18,0.2)}html.theme--documenter-dark .card .card-footer,html.theme--documenter-dark .card .card-footer-item{border-width:1px;border-color:#343c3d}html.theme--documenter-dark .notification.is-white a:not(.button){color:#0a0a0a;text-decoration:underline}html.theme--documenter-dark .notification.is-black a:not(.button){color:#fff;text-decoration:underline}html.theme--documenter-dark .notification.is-light a:not(.button){color:rgba(0,0,0,0.7);text-decoration:underline}html.theme--documenter-dark .notification.is-dark a:not(.button),html.theme--documenter-dark .content kbd.notification a:not(.button){color:#fff;text-decoration:underline}html.theme--documenter-dark .notification.is-primary a:not(.button),html.theme--documenter-dark .docstring>section>a.notification.docs-sourcelink a:not(.button){color:#fff;text-decoration:underline}html.theme--documenter-dark .notification.is-link a:not(.button){color:#fff;text-decoration:underline}html.theme--documenter-dark .notification.is-info a:not(.button){color:#fff;text-decoration:underline}html.theme--documenter-dark .notification.is-success a:not(.button){color:#fff;text-decoration:underline}html.theme--documenter-dark .notification.is-warning a:not(.button){color:#fff;text-decoration:underline}html.theme--documenter-dark .notification.is-danger a:not(.button){color:#fff;text-decoration:underline}html.theme--documenter-dark .tag,html.theme--documenter-dark .content kbd,html.theme--documenter-dark .docstring>section>a.docs-sourcelink{border-radius:.4em}html.theme--documenter-dark .menu-list a{transition:all 300ms ease}html.theme--documenter-dark .modal-card-body{background-color:#282f2f}html.theme--documenter-dark .modal-card-foot,html.theme--documenter-dark .modal-card-head{border-color:#343c3d}html.theme--documenter-dark .message-header{font-weight:700;background-color:#343c3d;color:#fff}html.theme--documenter-dark .message-body{border-width:1px;border-color:#343c3d}html.theme--documenter-dark .navbar{border-radius:.4em}html.theme--documenter-dark .navbar.is-transparent{background:none}html.theme--documenter-dark .navbar.is-primary .navbar-dropdown a.navbar-item.is-active,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-dropdown a.navbar-item.is-active{background-color:#1abc9c}@media screen and (max-width: 1055px){html.theme--documenter-dark .navbar .navbar-menu{background-color:#375a7f;border-radius:0 0 .4em .4em}}html.theme--documenter-dark .hero .navbar,html.theme--documenter-dark body>.navbar{border-radius:0}html.theme--documenter-dark .pagination-link,html.theme--documenter-dark .pagination-next,html.theme--documenter-dark .pagination-previous{border-width:1px}html.theme--documenter-dark .panel-block,html.theme--documenter-dark .panel-heading,html.theme--documenter-dark .panel-tabs{border-width:1px}html.theme--documenter-dark .panel-block:first-child,html.theme--documenter-dark .panel-heading:first-child,html.theme--documenter-dark .panel-tabs:first-child{border-top-width:1px}html.theme--documenter-dark .panel-heading{font-weight:700}html.theme--documenter-dark .panel-tabs a{border-width:1px;margin-bottom:-1px}html.theme--documenter-dark .panel-tabs a.is-active{border-bottom-color:#17a689}html.theme--documenter-dark .panel-block:hover{color:#1dd2af}html.theme--documenter-dark .panel-block:hover .panel-icon{color:#1dd2af}html.theme--documenter-dark .panel-block.is-active .panel-icon{color:#17a689}html.theme--documenter-dark .tabs a{border-bottom-width:1px;margin-bottom:-1px}html.theme--documenter-dark .tabs ul{border-bottom-width:1px}html.theme--documenter-dark .tabs.is-boxed a{border-width:1px}html.theme--documenter-dark .tabs.is-boxed li.is-active a{background-color:#1f2424}html.theme--documenter-dark .tabs.is-toggle li a{border-width:1px;margin-bottom:0}html.theme--documenter-dark .tabs.is-toggle li+li{margin-left:-1px}html.theme--documenter-dark .hero.is-white .navbar .navbar-dropdown .navbar-item:hover{background-color:rgba(0,0,0,0)}html.theme--documenter-dark .hero.is-black .navbar .navbar-dropdown .navbar-item:hover{background-color:rgba(0,0,0,0)}html.theme--documenter-dark .hero.is-light .navbar .navbar-dropdown .navbar-item:hover{background-color:rgba(0,0,0,0)}html.theme--documenter-dark .hero.is-dark .navbar .navbar-dropdown .navbar-item:hover,html.theme--documenter-dark .content kbd.hero .navbar .navbar-dropdown .navbar-item:hover{background-color:rgba(0,0,0,0)}html.theme--documenter-dark .hero.is-primary .navbar .navbar-dropdown .navbar-item:hover,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .navbar .navbar-dropdown .navbar-item:hover{background-color:rgba(0,0,0,0)}html.theme--documenter-dark .hero.is-link .navbar .navbar-dropdown .navbar-item:hover{background-color:rgba(0,0,0,0)}html.theme--documenter-dark .hero.is-info .navbar .navbar-dropdown .navbar-item:hover{background-color:rgba(0,0,0,0)}html.theme--documenter-dark .hero.is-success .navbar .navbar-dropdown .navbar-item:hover{background-color:rgba(0,0,0,0)}html.theme--documenter-dark .hero.is-warning .navbar .navbar-dropdown .navbar-item:hover{background-color:rgba(0,0,0,0)}html.theme--documenter-dark .hero.is-danger .navbar .navbar-dropdown .navbar-item:hover{background-color:rgba(0,0,0,0)}html.theme--documenter-dark h1 .docs-heading-anchor,html.theme--documenter-dark h1 .docs-heading-anchor:hover,html.theme--documenter-dark h1 .docs-heading-anchor:visited,html.theme--documenter-dark h2 .docs-heading-anchor,html.theme--documenter-dark h2 .docs-heading-anchor:hover,html.theme--documenter-dark h2 .docs-heading-anchor:visited,html.theme--documenter-dark h3 .docs-heading-anchor,html.theme--documenter-dark h3 .docs-heading-anchor:hover,html.theme--documenter-dark h3 .docs-heading-anchor:visited,html.theme--documenter-dark h4 .docs-heading-anchor,html.theme--documenter-dark h4 .docs-heading-anchor:hover,html.theme--documenter-dark h4 .docs-heading-anchor:visited,html.theme--documenter-dark h5 .docs-heading-anchor,html.theme--documenter-dark h5 .docs-heading-anchor:hover,html.theme--documenter-dark h5 .docs-heading-anchor:visited,html.theme--documenter-dark h6 .docs-heading-anchor,html.theme--documenter-dark h6 .docs-heading-anchor:hover,html.theme--documenter-dark h6 .docs-heading-anchor:visited{color:#f2f2f2}html.theme--documenter-dark h1 .docs-heading-anchor-permalink,html.theme--documenter-dark h2 .docs-heading-anchor-permalink,html.theme--documenter-dark h3 .docs-heading-anchor-permalink,html.theme--documenter-dark h4 .docs-heading-anchor-permalink,html.theme--documenter-dark h5 .docs-heading-anchor-permalink,html.theme--documenter-dark h6 .docs-heading-anchor-permalink{visibility:hidden;vertical-align:middle;margin-left:0.5em;font-size:0.7rem}html.theme--documenter-dark h1 .docs-heading-anchor-permalink::before,html.theme--documenter-dark h2 .docs-heading-anchor-permalink::before,html.theme--documenter-dark h3 .docs-heading-anchor-permalink::before,html.theme--documenter-dark h4 .docs-heading-anchor-permalink::before,html.theme--documenter-dark h5 .docs-heading-anchor-permalink::before,html.theme--documenter-dark h6 .docs-heading-anchor-permalink::before{font-family:"Font Awesome 6 Free";font-weight:900;content:"\f0c1"}html.theme--documenter-dark h1:hover .docs-heading-anchor-permalink,html.theme--documenter-dark h2:hover .docs-heading-anchor-permalink,html.theme--documenter-dark h3:hover .docs-heading-anchor-permalink,html.theme--documenter-dark h4:hover .docs-heading-anchor-permalink,html.theme--documenter-dark h5:hover .docs-heading-anchor-permalink,html.theme--documenter-dark h6:hover .docs-heading-anchor-permalink{visibility:visible}html.theme--documenter-dark .docs-light-only{display:none !important}html.theme--documenter-dark pre{position:relative;overflow:hidden}html.theme--documenter-dark pre code,html.theme--documenter-dark pre code.hljs{padding:0 .75rem !important;overflow:auto;display:block}html.theme--documenter-dark pre code:first-of-type,html.theme--documenter-dark pre code.hljs:first-of-type{padding-top:0.5rem !important}html.theme--documenter-dark pre code:last-of-type,html.theme--documenter-dark pre code.hljs:last-of-type{padding-bottom:0.5rem !important}html.theme--documenter-dark pre .copy-button{opacity:0.2;transition:opacity 0.2s;position:absolute;right:0em;top:0em;padding:0.5em;width:2.5em;height:2.5em;background:transparent;border:none;font-family:"Font Awesome 6 Free";color:#fff;cursor:pointer;text-align:center}html.theme--documenter-dark pre .copy-button:focus,html.theme--documenter-dark pre .copy-button:hover{opacity:1;background:rgba(255,255,255,0.1);color:#1abc9c}html.theme--documenter-dark pre .copy-button.success{color:#259a12;opacity:1}html.theme--documenter-dark pre .copy-button.error{color:#cb3c33;opacity:1}html.theme--documenter-dark pre:hover .copy-button{opacity:1}html.theme--documenter-dark .admonition{background-color:#282f2f;border-style:solid;border-width:1px;border-color:#5e6d6f;border-radius:.4em;font-size:1rem}html.theme--documenter-dark .admonition strong{color:currentColor}html.theme--documenter-dark .admonition.is-small,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.admonition{font-size:.75rem}html.theme--documenter-dark .admonition.is-medium{font-size:1.25rem}html.theme--documenter-dark .admonition.is-large{font-size:1.5rem}html.theme--documenter-dark .admonition.is-default{background-color:#282f2f;border-color:#5e6d6f}html.theme--documenter-dark .admonition.is-default>.admonition-header{background-color:#5e6d6f;color:#fff}html.theme--documenter-dark .admonition.is-default>.admonition-body{color:#fff}html.theme--documenter-dark .admonition.is-info{background-color:#282f2f;border-color:#024c7d}html.theme--documenter-dark .admonition.is-info>.admonition-header{background-color:#024c7d;color:#fff}html.theme--documenter-dark .admonition.is-info>.admonition-body{color:#fff}html.theme--documenter-dark .admonition.is-success{background-color:#282f2f;border-color:#008438}html.theme--documenter-dark .admonition.is-success>.admonition-header{background-color:#008438;color:#fff}html.theme--documenter-dark .admonition.is-success>.admonition-body{color:#fff}html.theme--documenter-dark .admonition.is-warning{background-color:#282f2f;border-color:#ad8100}html.theme--documenter-dark .admonition.is-warning>.admonition-header{background-color:#ad8100;color:#fff}html.theme--documenter-dark .admonition.is-warning>.admonition-body{color:#fff}html.theme--documenter-dark .admonition.is-danger{background-color:#282f2f;border-color:#9e1b0d}html.theme--documenter-dark .admonition.is-danger>.admonition-header{background-color:#9e1b0d;color:#fff}html.theme--documenter-dark .admonition.is-danger>.admonition-body{color:#fff}html.theme--documenter-dark .admonition.is-compat{background-color:#282f2f;border-color:#137886}html.theme--documenter-dark .admonition.is-compat>.admonition-header{background-color:#137886;color:#fff}html.theme--documenter-dark .admonition.is-compat>.admonition-body{color:#fff}html.theme--documenter-dark .admonition-header{color:#fff;background-color:#5e6d6f;align-items:center;font-weight:700;justify-content:space-between;line-height:1.25;padding:0.5rem .75rem;position:relative}html.theme--documenter-dark .admonition-header:before{font-family:"Font Awesome 6 Free";font-weight:900;margin-right:.75rem;content:"\f06a"}html.theme--documenter-dark details.admonition.is-details>.admonition-header{list-style:none}html.theme--documenter-dark details.admonition.is-details>.admonition-header:before{font-family:"Font Awesome 6 Free";font-weight:900;content:"\f055"}html.theme--documenter-dark details.admonition.is-details[open]>.admonition-header:before{font-family:"Font Awesome 6 Free";font-weight:900;content:"\f056"}html.theme--documenter-dark .admonition-body{color:#fff;padding:0.5rem .75rem}html.theme--documenter-dark .admonition-body pre{background-color:#282f2f}html.theme--documenter-dark .admonition-body code{background-color:rgba(255,255,255,0.05)}html.theme--documenter-dark .docstring{margin-bottom:1em;background-color:rgba(0,0,0,0);border:1px solid #5e6d6f;box-shadow:none;max-width:100%}html.theme--documenter-dark .docstring>header{cursor:pointer;display:flex;flex-grow:1;align-items:stretch;padding:0.5rem .75rem;background-color:#282f2f;box-shadow:0 0.125em 0.25em rgba(10,10,10,0.1);box-shadow:none;border-bottom:1px solid #5e6d6f;overflow:auto}html.theme--documenter-dark .docstring>header code{background-color:transparent}html.theme--documenter-dark .docstring>header .docstring-article-toggle-button{min-width:1.1rem;padding:0.2rem 0.2rem 0.2rem 0}html.theme--documenter-dark .docstring>header .docstring-binding{margin-right:0.3em}html.theme--documenter-dark .docstring>header .docstring-category{margin-left:0.3em}html.theme--documenter-dark .docstring>section{position:relative;padding:.75rem .75rem;border-bottom:1px solid #5e6d6f}html.theme--documenter-dark .docstring>section:last-child{border-bottom:none}html.theme--documenter-dark .docstring>section>a.docs-sourcelink{transition:opacity 0.3s;opacity:0;position:absolute;right:.375rem;bottom:.375rem}html.theme--documenter-dark .docstring>section>a.docs-sourcelink:focus{opacity:1 !important}html.theme--documenter-dark .docstring:hover>section>a.docs-sourcelink{opacity:0.2}html.theme--documenter-dark .docstring:focus-within>section>a.docs-sourcelink{opacity:0.2}html.theme--documenter-dark .docstring>section:hover a.docs-sourcelink{opacity:1}html.theme--documenter-dark .documenter-example-output{background-color:#1f2424}html.theme--documenter-dark .outdated-warning-overlay{position:fixed;top:0;left:0;right:0;box-shadow:0 0 10px rgba(0,0,0,0.3);z-index:999;background-color:#282f2f;color:#fff;border-bottom:3px solid #9e1b0d;padding:10px 35px;text-align:center;font-size:15px}html.theme--documenter-dark .outdated-warning-overlay .outdated-warning-closer{position:absolute;top:calc(50% - 10px);right:18px;cursor:pointer;width:12px}html.theme--documenter-dark .outdated-warning-overlay a{color:#1abc9c}html.theme--documenter-dark .outdated-warning-overlay a:hover{color:#1dd2af}html.theme--documenter-dark .content pre{border:1px solid #5e6d6f}html.theme--documenter-dark .content code{font-weight:inherit}html.theme--documenter-dark .content a code{color:#1abc9c}html.theme--documenter-dark .content h1 code,html.theme--documenter-dark .content h2 code,html.theme--documenter-dark .content h3 code,html.theme--documenter-dark .content h4 code,html.theme--documenter-dark .content h5 code,html.theme--documenter-dark .content h6 code{color:#f2f2f2}html.theme--documenter-dark .content table{display:block;width:initial;max-width:100%;overflow-x:auto}html.theme--documenter-dark .content blockquote>ul:first-child,html.theme--documenter-dark .content blockquote>ol:first-child,html.theme--documenter-dark .content .admonition-body>ul:first-child,html.theme--documenter-dark .content .admonition-body>ol:first-child{margin-top:0}html.theme--documenter-dark pre,html.theme--documenter-dark code{font-variant-ligatures:no-contextual}html.theme--documenter-dark .breadcrumb a.is-disabled{cursor:default;pointer-events:none}html.theme--documenter-dark .breadcrumb a.is-disabled,html.theme--documenter-dark .breadcrumb a.is-disabled:hover{color:#f2f2f2}html.theme--documenter-dark .hljs{background:initial !important}html.theme--documenter-dark .katex .katex-mathml{top:0;right:0}html.theme--documenter-dark .katex-display,html.theme--documenter-dark mjx-container,html.theme--documenter-dark .MathJax_Display{margin:0.5em 0 !important}html.theme--documenter-dark html{-moz-osx-font-smoothing:auto;-webkit-font-smoothing:auto}html.theme--documenter-dark li.no-marker{list-style:none}html.theme--documenter-dark #documenter .docs-main>article{overflow-wrap:break-word}html.theme--documenter-dark #documenter .docs-main>article .math-container{overflow-x:auto;overflow-y:hidden}@media screen and (min-width: 1056px){html.theme--documenter-dark #documenter .docs-main{max-width:52rem;margin-left:20rem;padding-right:1rem}}@media screen and (max-width: 1055px){html.theme--documenter-dark #documenter .docs-main{width:100%}html.theme--documenter-dark #documenter .docs-main>article{max-width:52rem;margin-left:auto;margin-right:auto;margin-bottom:1rem;padding:0 1rem}html.theme--documenter-dark #documenter .docs-main>header,html.theme--documenter-dark #documenter .docs-main>nav{max-width:100%;width:100%;margin:0}}html.theme--documenter-dark #documenter .docs-main header.docs-navbar{background-color:#1f2424;border-bottom:1px solid #5e6d6f;z-index:2;min-height:4rem;margin-bottom:1rem;display:flex}html.theme--documenter-dark #documenter .docs-main header.docs-navbar .breadcrumb{flex-grow:1;overflow-x:hidden}html.theme--documenter-dark #documenter .docs-main header.docs-navbar .docs-sidebar-button{display:block;font-size:1.5rem;padding-bottom:0.1rem;margin-right:1rem}html.theme--documenter-dark #documenter .docs-main header.docs-navbar .docs-right{display:flex;white-space:nowrap;gap:1rem;align-items:center}html.theme--documenter-dark #documenter .docs-main header.docs-navbar .docs-right .docs-icon,html.theme--documenter-dark #documenter .docs-main header.docs-navbar .docs-right .docs-label{display:inline-block}html.theme--documenter-dark #documenter .docs-main header.docs-navbar .docs-right .docs-label{padding:0;margin-left:0.3em}@media screen and (max-width: 1055px){html.theme--documenter-dark #documenter .docs-main header.docs-navbar .docs-right .docs-navbar-link{margin-left:0.4rem;margin-right:0.4rem}}html.theme--documenter-dark #documenter .docs-main header.docs-navbar>*{margin:auto 0}@media screen and (max-width: 1055px){html.theme--documenter-dark #documenter .docs-main header.docs-navbar{position:sticky;top:0;padding:0 1rem;transition-property:top, box-shadow;-webkit-transition-property:top, box-shadow;transition-duration:0.3s;-webkit-transition-duration:0.3s}html.theme--documenter-dark #documenter .docs-main header.docs-navbar.headroom--not-top{box-shadow:.2rem 0rem .4rem #171717;transition-duration:0.7s;-webkit-transition-duration:0.7s}html.theme--documenter-dark #documenter .docs-main header.docs-navbar.headroom--unpinned.headroom--not-top.headroom--not-bottom{top:-4.5rem;transition-duration:0.7s;-webkit-transition-duration:0.7s}}html.theme--documenter-dark #documenter .docs-main section.footnotes{border-top:1px solid #5e6d6f}html.theme--documenter-dark #documenter .docs-main section.footnotes li .tag:first-child,html.theme--documenter-dark #documenter .docs-main section.footnotes li .docstring>section>a.docs-sourcelink:first-child,html.theme--documenter-dark #documenter .docs-main section.footnotes li .content kbd:first-child,html.theme--documenter-dark .content #documenter .docs-main section.footnotes li kbd:first-child{margin-right:1em;margin-bottom:0.4em}html.theme--documenter-dark #documenter .docs-main .docs-footer{display:flex;flex-wrap:wrap;margin-left:0;margin-right:0;border-top:1px solid #5e6d6f;padding-top:1rem;padding-bottom:1rem}@media screen and (max-width: 1055px){html.theme--documenter-dark #documenter .docs-main .docs-footer{padding-left:1rem;padding-right:1rem}}html.theme--documenter-dark #documenter .docs-main .docs-footer .docs-footer-nextpage,html.theme--documenter-dark #documenter .docs-main .docs-footer .docs-footer-prevpage{flex-grow:1}html.theme--documenter-dark #documenter .docs-main .docs-footer .docs-footer-nextpage{text-align:right}html.theme--documenter-dark #documenter .docs-main .docs-footer .flexbox-break{flex-basis:100%;height:0}html.theme--documenter-dark #documenter .docs-main .docs-footer .footer-message{font-size:0.8em;margin:0.5em auto 0 auto;text-align:center}html.theme--documenter-dark #documenter .docs-sidebar{display:flex;flex-direction:column;color:#fff;background-color:#282f2f;border-right:1px solid #5e6d6f;padding:0;flex:0 0 18rem;z-index:5;font-size:1rem;position:fixed;left:-18rem;width:18rem;height:100%;transition:left 0.3s}html.theme--documenter-dark #documenter .docs-sidebar.visible{left:0;box-shadow:.4rem 0rem .8rem #171717}@media screen and (min-width: 1056px){html.theme--documenter-dark #documenter .docs-sidebar.visible{box-shadow:none}}@media screen and (min-width: 1056px){html.theme--documenter-dark #documenter .docs-sidebar{left:0;top:0}}html.theme--documenter-dark #documenter .docs-sidebar .docs-logo{margin-top:1rem;padding:0 1rem}html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img{max-height:6rem;margin:auto}html.theme--documenter-dark #documenter .docs-sidebar .docs-package-name{flex-shrink:0;font-size:1.5rem;font-weight:700;text-align:center;white-space:nowrap;overflow:hidden;padding:0.5rem 0}html.theme--documenter-dark #documenter .docs-sidebar .docs-package-name .docs-autofit{max-width:16.2rem}html.theme--documenter-dark #documenter .docs-sidebar .docs-package-name a,html.theme--documenter-dark #documenter .docs-sidebar .docs-package-name a:hover{color:#fff}html.theme--documenter-dark #documenter .docs-sidebar .docs-version-selector{border-top:1px solid #5e6d6f;display:none;padding:0.5rem}html.theme--documenter-dark #documenter .docs-sidebar .docs-version-selector.visible{display:flex}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu{flex-grow:1;user-select:none;border-top:1px solid #5e6d6f;padding-bottom:1.5rem}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu>li>.tocitem{font-weight:bold}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu>li li{font-size:.95rem;margin-left:1em;border-left:1px solid #5e6d6f}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu input.collapse-toggle{display:none}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu ul.collapsed{display:none}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu input:checked~ul.collapsed{display:block}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu label.tocitem{display:flex}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu label.tocitem .docs-label{flex-grow:2}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu label.tocitem .docs-chevron{display:inline-block;font-style:normal;font-variant:normal;text-rendering:auto;line-height:1;font-size:.75rem;margin-left:1rem;margin-top:auto;margin-bottom:auto}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu label.tocitem .docs-chevron::before{font-family:"Font Awesome 6 Free";font-weight:900;content:"\f054"}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu input:checked~label.tocitem .docs-chevron::before{content:"\f078"}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu .tocitem{display:block;padding:0.5rem 0.5rem}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu .tocitem,html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu .tocitem:hover{color:#fff;background:#282f2f}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu a.tocitem:hover,html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu label.tocitem:hover{color:#fff;background-color:#32393a}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu li.is-active{border-top:1px solid #5e6d6f;border-bottom:1px solid #5e6d6f;background-color:#1f2424}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu li.is-active .tocitem,html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu li.is-active .tocitem:hover{background-color:#1f2424;color:#fff}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu li.is-active ul.internal .tocitem:hover{background-color:#32393a;color:#fff}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu>li.is-active:first-child{border-top:none}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu ul.internal{margin:0 0.5rem 0.5rem;border-top:1px solid #5e6d6f}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu ul.internal li{font-size:.85rem;border-left:none;margin-left:0;margin-top:0.5rem}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu ul.internal .tocitem{width:100%;padding:0}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu ul.internal .tocitem::before{content:"⚬";margin-right:0.4em}html.theme--documenter-dark #documenter .docs-sidebar form.docs-search{margin:auto;margin-top:0.5rem;margin-bottom:0.5rem}html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input{width:14.4rem}html.theme--documenter-dark #documenter .docs-sidebar #documenter-search-query{color:#868c98;width:14.4rem;box-shadow:inset 0 1px 2px rgba(10,10,10,0.1)}@media screen and (min-width: 1056px){html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu{overflow-y:auto;-webkit-overflow-scroll:touch}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu::-webkit-scrollbar{width:.3rem;background:none}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu::-webkit-scrollbar-thumb{border-radius:5px 0px 0px 5px;background:#3b4445}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu::-webkit-scrollbar-thumb:hover{background:#4e5a5c}}@media screen and (max-width: 1055px){html.theme--documenter-dark #documenter .docs-sidebar{overflow-y:auto;-webkit-overflow-scroll:touch}html.theme--documenter-dark #documenter .docs-sidebar::-webkit-scrollbar{width:.3rem;background:none}html.theme--documenter-dark #documenter .docs-sidebar::-webkit-scrollbar-thumb{border-radius:5px 0px 0px 5px;background:#3b4445}html.theme--documenter-dark #documenter .docs-sidebar::-webkit-scrollbar-thumb:hover{background:#4e5a5c}}html.theme--documenter-dark kbd.search-modal-key-hints{border-radius:0.25rem;border:1px solid rgba(245,245,245,0.6);box-shadow:0 2px 0 1px rgba(245,245,245,0.6);cursor:default;font-size:0.9rem;line-height:1.5;min-width:0.75rem;text-align:center;padding:0.1rem 0.3rem;position:relative;top:-1px}html.theme--documenter-dark .search-min-width-50{min-width:50%}html.theme--documenter-dark .search-min-height-100{min-height:100%}html.theme--documenter-dark .search-modal-card-body{max-height:calc(100vh - 15rem)}html.theme--documenter-dark .search-result-link{border-radius:0.7em;transition:all 300ms}html.theme--documenter-dark .search-result-link:hover,html.theme--documenter-dark .search-result-link:focus{background-color:rgba(0,128,128,0.1)}html.theme--documenter-dark .search-result-link .property-search-result-badge,html.theme--documenter-dark .search-result-link .search-filter{transition:all 300ms}html.theme--documenter-dark .property-search-result-badge,html.theme--documenter-dark .search-filter{padding:0.15em 0.5em;font-size:0.8em;font-style:italic;text-transform:none !important;line-height:1.5;color:#f5f5f5;background-color:rgba(51,65,85,0.501961);border-radius:0.6rem}html.theme--documenter-dark .search-result-link:hover .property-search-result-badge,html.theme--documenter-dark .search-result-link:hover .search-filter,html.theme--documenter-dark .search-result-link:focus .property-search-result-badge,html.theme--documenter-dark .search-result-link:focus .search-filter{color:#333;background-color:#f1f5f9}html.theme--documenter-dark .search-filter{color:#333;background-color:#f5f5f5;transition:all 300ms}html.theme--documenter-dark .search-filter:hover,html.theme--documenter-dark .search-filter:focus{color:#333}html.theme--documenter-dark .search-filter-selected{color:#f5f5f5;background-color:rgba(139,0,139,0.5)}html.theme--documenter-dark .search-filter-selected:hover,html.theme--documenter-dark .search-filter-selected:focus{color:#f5f5f5}html.theme--documenter-dark .search-result-highlight{background-color:#ffdd57;color:black}html.theme--documenter-dark .search-divider{border-bottom:1px solid #5e6d6f}html.theme--documenter-dark .search-result-title{width:85%;color:#f5f5f5}html.theme--documenter-dark .search-result-code-title{font-size:0.875rem;font-family:"JuliaMono","SFMono-Regular","Menlo","Consolas","Liberation Mono","DejaVu Sans Mono",monospace}html.theme--documenter-dark #search-modal .modal-card-body::-webkit-scrollbar,html.theme--documenter-dark #search-modal .filter-tabs::-webkit-scrollbar{height:10px;width:10px;background-color:transparent}html.theme--documenter-dark #search-modal .modal-card-body::-webkit-scrollbar-thumb,html.theme--documenter-dark #search-modal .filter-tabs::-webkit-scrollbar-thumb{background-color:gray;border-radius:1rem}html.theme--documenter-dark #search-modal .modal-card-body::-webkit-scrollbar-track,html.theme--documenter-dark #search-modal .filter-tabs::-webkit-scrollbar-track{-webkit-box-shadow:inset 0 0 6px rgba(0,0,0,0.6);background-color:transparent}html.theme--documenter-dark .w-100{width:100%}html.theme--documenter-dark .gap-2{gap:0.5rem}html.theme--documenter-dark .gap-4{gap:1rem}html.theme--documenter-dark .gap-8{gap:2rem}html.theme--documenter-dark{background-color:#1f2424;font-size:16px;min-width:300px;overflow-x:auto;overflow-y:scroll;text-rendering:optimizeLegibility;text-size-adjust:100%}html.theme--documenter-dark .ansi span.sgr1{font-weight:bolder}html.theme--documenter-dark .ansi span.sgr2{font-weight:lighter}html.theme--documenter-dark .ansi span.sgr3{font-style:italic}html.theme--documenter-dark .ansi span.sgr4{text-decoration:underline}html.theme--documenter-dark .ansi span.sgr7{color:#1f2424;background-color:#fff}html.theme--documenter-dark .ansi span.sgr8{color:transparent}html.theme--documenter-dark .ansi span.sgr8 span{color:transparent}html.theme--documenter-dark .ansi span.sgr9{text-decoration:line-through}html.theme--documenter-dark .ansi span.sgr30{color:#242424}html.theme--documenter-dark .ansi span.sgr31{color:#f6705f}html.theme--documenter-dark .ansi span.sgr32{color:#4fb43a}html.theme--documenter-dark .ansi span.sgr33{color:#f4c72f}html.theme--documenter-dark .ansi span.sgr34{color:#7587f0}html.theme--documenter-dark .ansi span.sgr35{color:#bc89d3}html.theme--documenter-dark .ansi span.sgr36{color:#49b6ca}html.theme--documenter-dark .ansi span.sgr37{color:#b3bdbe}html.theme--documenter-dark .ansi span.sgr40{background-color:#242424}html.theme--documenter-dark .ansi span.sgr41{background-color:#f6705f}html.theme--documenter-dark .ansi span.sgr42{background-color:#4fb43a}html.theme--documenter-dark .ansi span.sgr43{background-color:#f4c72f}html.theme--documenter-dark .ansi span.sgr44{background-color:#7587f0}html.theme--documenter-dark .ansi span.sgr45{background-color:#bc89d3}html.theme--documenter-dark .ansi span.sgr46{background-color:#49b6ca}html.theme--documenter-dark .ansi span.sgr47{background-color:#b3bdbe}html.theme--documenter-dark .ansi span.sgr90{color:#92a0a2}html.theme--documenter-dark .ansi span.sgr91{color:#ff8674}html.theme--documenter-dark .ansi span.sgr92{color:#79d462}html.theme--documenter-dark .ansi span.sgr93{color:#ffe76b}html.theme--documenter-dark .ansi span.sgr94{color:#8a98ff}html.theme--documenter-dark .ansi span.sgr95{color:#d2a4e6}html.theme--documenter-dark .ansi span.sgr96{color:#6bc8db}html.theme--documenter-dark .ansi span.sgr97{color:#ecf0f1}html.theme--documenter-dark .ansi span.sgr100{background-color:#92a0a2}html.theme--documenter-dark .ansi span.sgr101{background-color:#ff8674}html.theme--documenter-dark .ansi span.sgr102{background-color:#79d462}html.theme--documenter-dark .ansi span.sgr103{background-color:#ffe76b}html.theme--documenter-dark .ansi span.sgr104{background-color:#8a98ff}html.theme--documenter-dark .ansi span.sgr105{background-color:#d2a4e6}html.theme--documenter-dark .ansi span.sgr106{background-color:#6bc8db}html.theme--documenter-dark .ansi span.sgr107{background-color:#ecf0f1}html.theme--documenter-dark code.language-julia-repl>span.hljs-meta{color:#4fb43a;font-weight:bolder}html.theme--documenter-dark .hljs{background:#2b2b2b;color:#f8f8f2}html.theme--documenter-dark .hljs-comment,html.theme--documenter-dark .hljs-quote{color:#d4d0ab}html.theme--documenter-dark .hljs-variable,html.theme--documenter-dark .hljs-template-variable,html.theme--documenter-dark .hljs-tag,html.theme--documenter-dark .hljs-name,html.theme--documenter-dark .hljs-selector-id,html.theme--documenter-dark .hljs-selector-class,html.theme--documenter-dark .hljs-regexp,html.theme--documenter-dark .hljs-deletion{color:#ffa07a}html.theme--documenter-dark .hljs-number,html.theme--documenter-dark .hljs-built_in,html.theme--documenter-dark .hljs-literal,html.theme--documenter-dark .hljs-type,html.theme--documenter-dark .hljs-params,html.theme--documenter-dark .hljs-meta,html.theme--documenter-dark .hljs-link{color:#f5ab35}html.theme--documenter-dark .hljs-attribute{color:#ffd700}html.theme--documenter-dark .hljs-string,html.theme--documenter-dark .hljs-symbol,html.theme--documenter-dark .hljs-bullet,html.theme--documenter-dark .hljs-addition{color:#abe338}html.theme--documenter-dark .hljs-title,html.theme--documenter-dark .hljs-section{color:#00e0e0}html.theme--documenter-dark .hljs-keyword,html.theme--documenter-dark .hljs-selector-tag{color:#dcc6e0}html.theme--documenter-dark .hljs-emphasis{font-style:italic}html.theme--documenter-dark .hljs-strong{font-weight:bold}@media screen and (-ms-high-contrast: active){html.theme--documenter-dark .hljs-addition,html.theme--documenter-dark .hljs-attribute,html.theme--documenter-dark .hljs-built_in,html.theme--documenter-dark .hljs-bullet,html.theme--documenter-dark .hljs-comment,html.theme--documenter-dark .hljs-link,html.theme--documenter-dark .hljs-literal,html.theme--documenter-dark .hljs-meta,html.theme--documenter-dark .hljs-number,html.theme--documenter-dark .hljs-params,html.theme--documenter-dark .hljs-string,html.theme--documenter-dark .hljs-symbol,html.theme--documenter-dark .hljs-type,html.theme--documenter-dark .hljs-quote{color:highlight}html.theme--documenter-dark .hljs-keyword,html.theme--documenter-dark .hljs-selector-tag{font-weight:bold}}html.theme--documenter-dark .hljs-subst{color:#f8f8f2}html.theme--documenter-dark .search-result-link{border-radius:0.7em;transition:all 300ms}html.theme--documenter-dark .search-result-link:hover,html.theme--documenter-dark .search-result-link:focus{background-color:rgba(0,128,128,0.1)}html.theme--documenter-dark .search-result-link .property-search-result-badge,html.theme--documenter-dark .search-result-link .search-filter{transition:all 300ms}html.theme--documenter-dark .search-result-link:hover .property-search-result-badge,html.theme--documenter-dark .search-result-link:hover .search-filter,html.theme--documenter-dark .search-result-link:focus .property-search-result-badge,html.theme--documenter-dark .search-result-link:focus .search-filter{color:#333 !important;background-color:#f1f5f9 !important}html.theme--documenter-dark .search-result-title{color:whitesmoke}html.theme--documenter-dark .search-result-highlight{background-color:greenyellow;color:black}html.theme--documenter-dark .search-divider{border-bottom:1px solid #5e6d6f50}html.theme--documenter-dark .w-100{width:100%}html.theme--documenter-dark .gap-2{gap:0.5rem}html.theme--documenter-dark .gap-4{gap:1rem} diff --git a/v1.8.0/assets/themes/documenter-light.css b/v1.8.0/assets/themes/documenter-light.css new file mode 100644 index 000000000..2f168c77b --- /dev/null +++ b/v1.8.0/assets/themes/documenter-light.css @@ -0,0 +1,9 @@ +.pagination-previous,.pagination-next,.pagination-link,.pagination-ellipsis,.file-cta,.file-name,.select select,.textarea,.input,#documenter .docs-sidebar form.docs-search>input,.button{-moz-appearance:none;-webkit-appearance:none;align-items:center;border:1px solid transparent;border-radius:4px;box-shadow:none;display:inline-flex;font-size:1rem;height:2.5em;justify-content:flex-start;line-height:1.5;padding-bottom:calc(0.5em - 1px);padding-left:calc(0.75em - 1px);padding-right:calc(0.75em - 1px);padding-top:calc(0.5em - 1px);position:relative;vertical-align:top}.pagination-previous:focus,.pagination-next:focus,.pagination-link:focus,.pagination-ellipsis:focus,.file-cta:focus,.file-name:focus,.select select:focus,.textarea:focus,.input:focus,#documenter .docs-sidebar form.docs-search>input:focus,.button:focus,.is-focused.pagination-previous,.is-focused.pagination-next,.is-focused.pagination-link,.is-focused.pagination-ellipsis,.is-focused.file-cta,.is-focused.file-name,.select select.is-focused,.is-focused.textarea,.is-focused.input,#documenter .docs-sidebar form.docs-search>input.is-focused,.is-focused.button,.pagination-previous:active,.pagination-next:active,.pagination-link:active,.pagination-ellipsis:active,.file-cta:active,.file-name:active,.select select:active,.textarea:active,.input:active,#documenter .docs-sidebar form.docs-search>input:active,.button:active,.is-active.pagination-previous,.is-active.pagination-next,.is-active.pagination-link,.is-active.pagination-ellipsis,.is-active.file-cta,.is-active.file-name,.select select.is-active,.is-active.textarea,.is-active.input,#documenter .docs-sidebar form.docs-search>input.is-active,.is-active.button{outline:none}.pagination-previous[disabled],.pagination-next[disabled],.pagination-link[disabled],.pagination-ellipsis[disabled],.file-cta[disabled],.file-name[disabled],.select select[disabled],.textarea[disabled],.input[disabled],#documenter .docs-sidebar form.docs-search>input[disabled],.button[disabled],fieldset[disabled] .pagination-previous,fieldset[disabled] .pagination-next,fieldset[disabled] .pagination-link,fieldset[disabled] .pagination-ellipsis,fieldset[disabled] .file-cta,fieldset[disabled] .file-name,fieldset[disabled] .select select,.select fieldset[disabled] select,fieldset[disabled] .textarea,fieldset[disabled] .input,fieldset[disabled] #documenter .docs-sidebar form.docs-search>input,#documenter .docs-sidebar fieldset[disabled] form.docs-search>input,fieldset[disabled] .button{cursor:not-allowed}.tabs,.pagination-previous,.pagination-next,.pagination-link,.pagination-ellipsis,.breadcrumb,.file,.button,.is-unselectable{-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.navbar-link:not(.is-arrowless)::after,.select:not(.is-multiple):not(.is-loading)::after{border:3px solid rgba(0,0,0,0);border-radius:2px;border-right:0;border-top:0;content:" ";display:block;height:0.625em;margin-top:-0.4375em;pointer-events:none;position:absolute;top:50%;transform:rotate(-45deg);transform-origin:center;width:0.625em}.admonition:not(:last-child),.tabs:not(:last-child),.pagination:not(:last-child),.message:not(:last-child),.level:not(:last-child),.breadcrumb:not(:last-child),.block:not(:last-child),.title:not(:last-child),.subtitle:not(:last-child),.table-container:not(:last-child),.table:not(:last-child),.progress:not(:last-child),.notification:not(:last-child),.content:not(:last-child),.box:not(:last-child){margin-bottom:1.5rem}.modal-close,.delete{-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-moz-appearance:none;-webkit-appearance:none;background-color:rgba(10,10,10,0.2);border:none;border-radius:9999px;cursor:pointer;pointer-events:auto;display:inline-block;flex-grow:0;flex-shrink:0;font-size:0;height:20px;max-height:20px;max-width:20px;min-height:20px;min-width:20px;outline:none;position:relative;vertical-align:top;width:20px}.modal-close::before,.delete::before,.modal-close::after,.delete::after{background-color:#fff;content:"";display:block;left:50%;position:absolute;top:50%;transform:translateX(-50%) translateY(-50%) rotate(45deg);transform-origin:center center}.modal-close::before,.delete::before{height:2px;width:50%}.modal-close::after,.delete::after{height:50%;width:2px}.modal-close:hover,.delete:hover,.modal-close:focus,.delete:focus{background-color:rgba(10,10,10,0.3)}.modal-close:active,.delete:active{background-color:rgba(10,10,10,0.4)}.is-small.modal-close,#documenter .docs-sidebar form.docs-search>input.modal-close,.is-small.delete,#documenter .docs-sidebar form.docs-search>input.delete{height:16px;max-height:16px;max-width:16px;min-height:16px;min-width:16px;width:16px}.is-medium.modal-close,.is-medium.delete{height:24px;max-height:24px;max-width:24px;min-height:24px;min-width:24px;width:24px}.is-large.modal-close,.is-large.delete{height:32px;max-height:32px;max-width:32px;min-height:32px;min-width:32px;width:32px}.control.is-loading::after,.select.is-loading::after,.loader,.button.is-loading::after{animation:spinAround 500ms infinite linear;border:2px solid #dbdbdb;border-radius:9999px;border-right-color:transparent;border-top-color:transparent;content:"";display:block;height:1em;position:relative;width:1em}.hero-video,.modal-background,.modal,.image.is-square img,#documenter .docs-sidebar .docs-logo>img.is-square img,.image.is-square .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-square .has-ratio,.image.is-1by1 img,#documenter .docs-sidebar .docs-logo>img.is-1by1 img,.image.is-1by1 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-1by1 .has-ratio,.image.is-5by4 img,#documenter .docs-sidebar .docs-logo>img.is-5by4 img,.image.is-5by4 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-5by4 .has-ratio,.image.is-4by3 img,#documenter .docs-sidebar .docs-logo>img.is-4by3 img,.image.is-4by3 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-4by3 .has-ratio,.image.is-3by2 img,#documenter .docs-sidebar .docs-logo>img.is-3by2 img,.image.is-3by2 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-3by2 .has-ratio,.image.is-5by3 img,#documenter .docs-sidebar .docs-logo>img.is-5by3 img,.image.is-5by3 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-5by3 .has-ratio,.image.is-16by9 img,#documenter .docs-sidebar .docs-logo>img.is-16by9 img,.image.is-16by9 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-16by9 .has-ratio,.image.is-2by1 img,#documenter .docs-sidebar .docs-logo>img.is-2by1 img,.image.is-2by1 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-2by1 .has-ratio,.image.is-3by1 img,#documenter .docs-sidebar .docs-logo>img.is-3by1 img,.image.is-3by1 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-3by1 .has-ratio,.image.is-4by5 img,#documenter .docs-sidebar .docs-logo>img.is-4by5 img,.image.is-4by5 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-4by5 .has-ratio,.image.is-3by4 img,#documenter .docs-sidebar .docs-logo>img.is-3by4 img,.image.is-3by4 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-3by4 .has-ratio,.image.is-2by3 img,#documenter .docs-sidebar .docs-logo>img.is-2by3 img,.image.is-2by3 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-2by3 .has-ratio,.image.is-3by5 img,#documenter .docs-sidebar .docs-logo>img.is-3by5 img,.image.is-3by5 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-3by5 .has-ratio,.image.is-9by16 img,#documenter .docs-sidebar .docs-logo>img.is-9by16 img,.image.is-9by16 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-9by16 .has-ratio,.image.is-1by2 img,#documenter .docs-sidebar .docs-logo>img.is-1by2 img,.image.is-1by2 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-1by2 .has-ratio,.image.is-1by3 img,#documenter .docs-sidebar .docs-logo>img.is-1by3 img,.image.is-1by3 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-1by3 .has-ratio,.is-overlay{bottom:0;left:0;position:absolute;right:0;top:0}.navbar-burger{-moz-appearance:none;-webkit-appearance:none;appearance:none;background:none;border:none;color:currentColor;font-family:inherit;font-size:1em;margin:0;padding:0}.has-text-white{color:#fff !important}a.has-text-white:hover,a.has-text-white:focus{color:#e6e6e6 !important}.has-background-white{background-color:#fff !important}.has-text-black{color:#0a0a0a !important}a.has-text-black:hover,a.has-text-black:focus{color:#000 !important}.has-background-black{background-color:#0a0a0a !important}.has-text-light{color:#f5f5f5 !important}a.has-text-light:hover,a.has-text-light:focus{color:#dbdbdb !important}.has-background-light{background-color:#f5f5f5 !important}.has-text-dark{color:#363636 !important}a.has-text-dark:hover,a.has-text-dark:focus{color:#1c1c1c !important}.has-background-dark{background-color:#363636 !important}.has-text-primary{color:#4eb5de !important}a.has-text-primary:hover,a.has-text-primary:focus{color:#27a1d2 !important}.has-background-primary{background-color:#4eb5de !important}.has-text-primary-light{color:#eef8fc !important}a.has-text-primary-light:hover,a.has-text-primary-light:focus{color:#c3e6f4 !important}.has-background-primary-light{background-color:#eef8fc !important}.has-text-primary-dark{color:#1a6d8e !important}a.has-text-primary-dark:hover,a.has-text-primary-dark:focus{color:#228eb9 !important}.has-background-primary-dark{background-color:#1a6d8e !important}.has-text-link{color:#2e63b8 !important}a.has-text-link:hover,a.has-text-link:focus{color:#244d8f !important}.has-background-link{background-color:#2e63b8 !important}.has-text-link-light{color:#eff3fb !important}a.has-text-link-light:hover,a.has-text-link-light:focus{color:#c6d6f1 !important}.has-background-link-light{background-color:#eff3fb !important}.has-text-link-dark{color:#3169c4 !important}a.has-text-link-dark:hover,a.has-text-link-dark:focus{color:#5485d4 !important}.has-background-link-dark{background-color:#3169c4 !important}.has-text-info{color:#209cee !important}a.has-text-info:hover,a.has-text-info:focus{color:#1081cb !important}.has-background-info{background-color:#209cee !important}.has-text-info-light{color:#ecf7fe !important}a.has-text-info-light:hover,a.has-text-info-light:focus{color:#bde2fa !important}.has-background-info-light{background-color:#ecf7fe !important}.has-text-info-dark{color:#0e72b4 !important}a.has-text-info-dark:hover,a.has-text-info-dark:focus{color:#1190e3 !important}.has-background-info-dark{background-color:#0e72b4 !important}.has-text-success{color:#22c35b !important}a.has-text-success:hover,a.has-text-success:focus{color:#1a9847 !important}.has-background-success{background-color:#22c35b !important}.has-text-success-light{color:#eefcf3 !important}a.has-text-success-light:hover,a.has-text-success-light:focus{color:#c2f4d4 !important}.has-background-success-light{background-color:#eefcf3 !important}.has-text-success-dark{color:#198f43 !important}a.has-text-success-dark:hover,a.has-text-success-dark:focus{color:#21bb57 !important}.has-background-success-dark{background-color:#198f43 !important}.has-text-warning{color:#ffdd57 !important}a.has-text-warning:hover,a.has-text-warning:focus{color:#ffd324 !important}.has-background-warning{background-color:#ffdd57 !important}.has-text-warning-light{color:#fffbeb !important}a.has-text-warning-light:hover,a.has-text-warning-light:focus{color:#fff1b8 !important}.has-background-warning-light{background-color:#fffbeb !important}.has-text-warning-dark{color:#947600 !important}a.has-text-warning-dark:hover,a.has-text-warning-dark:focus{color:#c79f00 !important}.has-background-warning-dark{background-color:#947600 !important}.has-text-danger{color:#da0b00 !important}a.has-text-danger:hover,a.has-text-danger:focus{color:#a70800 !important}.has-background-danger{background-color:#da0b00 !important}.has-text-danger-light{color:#ffeceb !important}a.has-text-danger-light:hover,a.has-text-danger-light:focus{color:#ffbbb8 !important}.has-background-danger-light{background-color:#ffeceb !important}.has-text-danger-dark{color:#f50c00 !important}a.has-text-danger-dark:hover,a.has-text-danger-dark:focus{color:#ff3429 !important}.has-background-danger-dark{background-color:#f50c00 !important}.has-text-black-bis{color:#121212 !important}.has-background-black-bis{background-color:#121212 !important}.has-text-black-ter{color:#242424 !important}.has-background-black-ter{background-color:#242424 !important}.has-text-grey-darker{color:#363636 !important}.has-background-grey-darker{background-color:#363636 !important}.has-text-grey-dark{color:#4a4a4a !important}.has-background-grey-dark{background-color:#4a4a4a !important}.has-text-grey{color:#6b6b6b !important}.has-background-grey{background-color:#6b6b6b !important}.has-text-grey-light{color:#b5b5b5 !important}.has-background-grey-light{background-color:#b5b5b5 !important}.has-text-grey-lighter{color:#dbdbdb !important}.has-background-grey-lighter{background-color:#dbdbdb !important}.has-text-white-ter{color:#f5f5f5 !important}.has-background-white-ter{background-color:#f5f5f5 !important}.has-text-white-bis{color:#fafafa !important}.has-background-white-bis{background-color:#fafafa !important}.is-flex-direction-row{flex-direction:row !important}.is-flex-direction-row-reverse{flex-direction:row-reverse !important}.is-flex-direction-column{flex-direction:column !important}.is-flex-direction-column-reverse{flex-direction:column-reverse !important}.is-flex-wrap-nowrap{flex-wrap:nowrap !important}.is-flex-wrap-wrap{flex-wrap:wrap !important}.is-flex-wrap-wrap-reverse{flex-wrap:wrap-reverse !important}.is-justify-content-flex-start{justify-content:flex-start !important}.is-justify-content-flex-end{justify-content:flex-end !important}.is-justify-content-center{justify-content:center !important}.is-justify-content-space-between{justify-content:space-between !important}.is-justify-content-space-around{justify-content:space-around !important}.is-justify-content-space-evenly{justify-content:space-evenly !important}.is-justify-content-start{justify-content:start !important}.is-justify-content-end{justify-content:end !important}.is-justify-content-left{justify-content:left !important}.is-justify-content-right{justify-content:right !important}.is-align-content-flex-start{align-content:flex-start !important}.is-align-content-flex-end{align-content:flex-end !important}.is-align-content-center{align-content:center !important}.is-align-content-space-between{align-content:space-between !important}.is-align-content-space-around{align-content:space-around !important}.is-align-content-space-evenly{align-content:space-evenly !important}.is-align-content-stretch{align-content:stretch !important}.is-align-content-start{align-content:start !important}.is-align-content-end{align-content:end !important}.is-align-content-baseline{align-content:baseline !important}.is-align-items-stretch{align-items:stretch !important}.is-align-items-flex-start{align-items:flex-start !important}.is-align-items-flex-end{align-items:flex-end !important}.is-align-items-center{align-items:center !important}.is-align-items-baseline{align-items:baseline !important}.is-align-items-start{align-items:start !important}.is-align-items-end{align-items:end !important}.is-align-items-self-start{align-items:self-start !important}.is-align-items-self-end{align-items:self-end !important}.is-align-self-auto{align-self:auto !important}.is-align-self-flex-start{align-self:flex-start !important}.is-align-self-flex-end{align-self:flex-end !important}.is-align-self-center{align-self:center !important}.is-align-self-baseline{align-self:baseline !important}.is-align-self-stretch{align-self:stretch !important}.is-flex-grow-0{flex-grow:0 !important}.is-flex-grow-1{flex-grow:1 !important}.is-flex-grow-2{flex-grow:2 !important}.is-flex-grow-3{flex-grow:3 !important}.is-flex-grow-4{flex-grow:4 !important}.is-flex-grow-5{flex-grow:5 !important}.is-flex-shrink-0{flex-shrink:0 !important}.is-flex-shrink-1{flex-shrink:1 !important}.is-flex-shrink-2{flex-shrink:2 !important}.is-flex-shrink-3{flex-shrink:3 !important}.is-flex-shrink-4{flex-shrink:4 !important}.is-flex-shrink-5{flex-shrink:5 !important}.is-clearfix::after{clear:both;content:" ";display:table}.is-pulled-left{float:left !important}.is-pulled-right{float:right !important}.is-radiusless{border-radius:0 !important}.is-shadowless{box-shadow:none !important}.is-clickable{cursor:pointer !important;pointer-events:all !important}.is-clipped{overflow:hidden !important}.is-relative{position:relative !important}.is-marginless{margin:0 !important}.is-paddingless{padding:0 !important}.m-0{margin:0 !important}.mt-0{margin-top:0 !important}.mr-0{margin-right:0 !important}.mb-0{margin-bottom:0 !important}.ml-0{margin-left:0 !important}.mx-0{margin-left:0 !important;margin-right:0 !important}.my-0{margin-top:0 !important;margin-bottom:0 !important}.m-1{margin:.25rem !important}.mt-1{margin-top:.25rem !important}.mr-1{margin-right:.25rem !important}.mb-1{margin-bottom:.25rem !important}.ml-1{margin-left:.25rem !important}.mx-1{margin-left:.25rem !important;margin-right:.25rem !important}.my-1{margin-top:.25rem !important;margin-bottom:.25rem !important}.m-2{margin:.5rem !important}.mt-2{margin-top:.5rem !important}.mr-2{margin-right:.5rem !important}.mb-2{margin-bottom:.5rem !important}.ml-2{margin-left:.5rem !important}.mx-2{margin-left:.5rem !important;margin-right:.5rem !important}.my-2{margin-top:.5rem !important;margin-bottom:.5rem !important}.m-3{margin:.75rem !important}.mt-3{margin-top:.75rem !important}.mr-3{margin-right:.75rem !important}.mb-3{margin-bottom:.75rem !important}.ml-3{margin-left:.75rem !important}.mx-3{margin-left:.75rem !important;margin-right:.75rem !important}.my-3{margin-top:.75rem !important;margin-bottom:.75rem !important}.m-4{margin:1rem !important}.mt-4{margin-top:1rem !important}.mr-4{margin-right:1rem !important}.mb-4{margin-bottom:1rem !important}.ml-4{margin-left:1rem !important}.mx-4{margin-left:1rem !important;margin-right:1rem !important}.my-4{margin-top:1rem !important;margin-bottom:1rem !important}.m-5{margin:1.5rem !important}.mt-5{margin-top:1.5rem !important}.mr-5{margin-right:1.5rem !important}.mb-5{margin-bottom:1.5rem !important}.ml-5{margin-left:1.5rem !important}.mx-5{margin-left:1.5rem !important;margin-right:1.5rem !important}.my-5{margin-top:1.5rem !important;margin-bottom:1.5rem !important}.m-6{margin:3rem !important}.mt-6{margin-top:3rem !important}.mr-6{margin-right:3rem !important}.mb-6{margin-bottom:3rem !important}.ml-6{margin-left:3rem !important}.mx-6{margin-left:3rem !important;margin-right:3rem !important}.my-6{margin-top:3rem !important;margin-bottom:3rem !important}.m-auto{margin:auto !important}.mt-auto{margin-top:auto !important}.mr-auto{margin-right:auto !important}.mb-auto{margin-bottom:auto !important}.ml-auto{margin-left:auto !important}.mx-auto{margin-left:auto !important;margin-right:auto !important}.my-auto{margin-top:auto !important;margin-bottom:auto !important}.p-0{padding:0 !important}.pt-0{padding-top:0 !important}.pr-0{padding-right:0 !important}.pb-0{padding-bottom:0 !important}.pl-0{padding-left:0 !important}.px-0{padding-left:0 !important;padding-right:0 !important}.py-0{padding-top:0 !important;padding-bottom:0 !important}.p-1{padding:.25rem !important}.pt-1{padding-top:.25rem !important}.pr-1{padding-right:.25rem !important}.pb-1{padding-bottom:.25rem !important}.pl-1{padding-left:.25rem !important}.px-1{padding-left:.25rem !important;padding-right:.25rem !important}.py-1{padding-top:.25rem !important;padding-bottom:.25rem !important}.p-2{padding:.5rem !important}.pt-2{padding-top:.5rem !important}.pr-2{padding-right:.5rem !important}.pb-2{padding-bottom:.5rem !important}.pl-2{padding-left:.5rem !important}.px-2{padding-left:.5rem !important;padding-right:.5rem !important}.py-2{padding-top:.5rem !important;padding-bottom:.5rem !important}.p-3{padding:.75rem !important}.pt-3{padding-top:.75rem !important}.pr-3{padding-right:.75rem !important}.pb-3{padding-bottom:.75rem !important}.pl-3{padding-left:.75rem !important}.px-3{padding-left:.75rem !important;padding-right:.75rem !important}.py-3{padding-top:.75rem !important;padding-bottom:.75rem !important}.p-4{padding:1rem !important}.pt-4{padding-top:1rem !important}.pr-4{padding-right:1rem !important}.pb-4{padding-bottom:1rem !important}.pl-4{padding-left:1rem !important}.px-4{padding-left:1rem !important;padding-right:1rem !important}.py-4{padding-top:1rem !important;padding-bottom:1rem !important}.p-5{padding:1.5rem !important}.pt-5{padding-top:1.5rem !important}.pr-5{padding-right:1.5rem !important}.pb-5{padding-bottom:1.5rem !important}.pl-5{padding-left:1.5rem !important}.px-5{padding-left:1.5rem !important;padding-right:1.5rem !important}.py-5{padding-top:1.5rem !important;padding-bottom:1.5rem !important}.p-6{padding:3rem !important}.pt-6{padding-top:3rem !important}.pr-6{padding-right:3rem !important}.pb-6{padding-bottom:3rem !important}.pl-6{padding-left:3rem !important}.px-6{padding-left:3rem !important;padding-right:3rem !important}.py-6{padding-top:3rem !important;padding-bottom:3rem !important}.p-auto{padding:auto !important}.pt-auto{padding-top:auto !important}.pr-auto{padding-right:auto !important}.pb-auto{padding-bottom:auto !important}.pl-auto{padding-left:auto !important}.px-auto{padding-left:auto !important;padding-right:auto !important}.py-auto{padding-top:auto !important;padding-bottom:auto !important}.is-size-1{font-size:3rem !important}.is-size-2{font-size:2.5rem !important}.is-size-3{font-size:2rem !important}.is-size-4{font-size:1.5rem !important}.is-size-5{font-size:1.25rem !important}.is-size-6{font-size:1rem !important}.is-size-7,.docstring>section>a.docs-sourcelink{font-size:.75rem !important}@media screen and (max-width: 768px){.is-size-1-mobile{font-size:3rem !important}.is-size-2-mobile{font-size:2.5rem !important}.is-size-3-mobile{font-size:2rem !important}.is-size-4-mobile{font-size:1.5rem !important}.is-size-5-mobile{font-size:1.25rem !important}.is-size-6-mobile{font-size:1rem !important}.is-size-7-mobile{font-size:.75rem !important}}@media screen and (min-width: 769px),print{.is-size-1-tablet{font-size:3rem !important}.is-size-2-tablet{font-size:2.5rem !important}.is-size-3-tablet{font-size:2rem !important}.is-size-4-tablet{font-size:1.5rem !important}.is-size-5-tablet{font-size:1.25rem !important}.is-size-6-tablet{font-size:1rem !important}.is-size-7-tablet{font-size:.75rem !important}}@media screen and (max-width: 1055px){.is-size-1-touch{font-size:3rem !important}.is-size-2-touch{font-size:2.5rem !important}.is-size-3-touch{font-size:2rem !important}.is-size-4-touch{font-size:1.5rem !important}.is-size-5-touch{font-size:1.25rem !important}.is-size-6-touch{font-size:1rem !important}.is-size-7-touch{font-size:.75rem !important}}@media screen and (min-width: 1056px){.is-size-1-desktop{font-size:3rem !important}.is-size-2-desktop{font-size:2.5rem !important}.is-size-3-desktop{font-size:2rem !important}.is-size-4-desktop{font-size:1.5rem !important}.is-size-5-desktop{font-size:1.25rem !important}.is-size-6-desktop{font-size:1rem !important}.is-size-7-desktop{font-size:.75rem !important}}@media screen and (min-width: 1216px){.is-size-1-widescreen{font-size:3rem !important}.is-size-2-widescreen{font-size:2.5rem !important}.is-size-3-widescreen{font-size:2rem !important}.is-size-4-widescreen{font-size:1.5rem !important}.is-size-5-widescreen{font-size:1.25rem !important}.is-size-6-widescreen{font-size:1rem !important}.is-size-7-widescreen{font-size:.75rem !important}}@media screen and (min-width: 1408px){.is-size-1-fullhd{font-size:3rem !important}.is-size-2-fullhd{font-size:2.5rem !important}.is-size-3-fullhd{font-size:2rem !important}.is-size-4-fullhd{font-size:1.5rem !important}.is-size-5-fullhd{font-size:1.25rem !important}.is-size-6-fullhd{font-size:1rem !important}.is-size-7-fullhd{font-size:.75rem !important}}.has-text-centered{text-align:center !important}.has-text-justified{text-align:justify !important}.has-text-left{text-align:left !important}.has-text-right{text-align:right !important}@media screen and (max-width: 768px){.has-text-centered-mobile{text-align:center !important}}@media screen and (min-width: 769px),print{.has-text-centered-tablet{text-align:center !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.has-text-centered-tablet-only{text-align:center !important}}@media screen and (max-width: 1055px){.has-text-centered-touch{text-align:center !important}}@media screen and (min-width: 1056px){.has-text-centered-desktop{text-align:center !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.has-text-centered-desktop-only{text-align:center !important}}@media screen and (min-width: 1216px){.has-text-centered-widescreen{text-align:center !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.has-text-centered-widescreen-only{text-align:center !important}}@media screen and (min-width: 1408px){.has-text-centered-fullhd{text-align:center !important}}@media screen and (max-width: 768px){.has-text-justified-mobile{text-align:justify !important}}@media screen and (min-width: 769px),print{.has-text-justified-tablet{text-align:justify !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.has-text-justified-tablet-only{text-align:justify !important}}@media screen and (max-width: 1055px){.has-text-justified-touch{text-align:justify !important}}@media screen and (min-width: 1056px){.has-text-justified-desktop{text-align:justify !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.has-text-justified-desktop-only{text-align:justify !important}}@media screen and (min-width: 1216px){.has-text-justified-widescreen{text-align:justify !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.has-text-justified-widescreen-only{text-align:justify !important}}@media screen and (min-width: 1408px){.has-text-justified-fullhd{text-align:justify !important}}@media screen and (max-width: 768px){.has-text-left-mobile{text-align:left !important}}@media screen and (min-width: 769px),print{.has-text-left-tablet{text-align:left !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.has-text-left-tablet-only{text-align:left !important}}@media screen and (max-width: 1055px){.has-text-left-touch{text-align:left !important}}@media screen and (min-width: 1056px){.has-text-left-desktop{text-align:left !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.has-text-left-desktop-only{text-align:left !important}}@media screen and (min-width: 1216px){.has-text-left-widescreen{text-align:left !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.has-text-left-widescreen-only{text-align:left !important}}@media screen and (min-width: 1408px){.has-text-left-fullhd{text-align:left !important}}@media screen and (max-width: 768px){.has-text-right-mobile{text-align:right !important}}@media screen and (min-width: 769px),print{.has-text-right-tablet{text-align:right !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.has-text-right-tablet-only{text-align:right !important}}@media screen and (max-width: 1055px){.has-text-right-touch{text-align:right !important}}@media screen and (min-width: 1056px){.has-text-right-desktop{text-align:right !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.has-text-right-desktop-only{text-align:right !important}}@media screen and (min-width: 1216px){.has-text-right-widescreen{text-align:right !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.has-text-right-widescreen-only{text-align:right !important}}@media screen and (min-width: 1408px){.has-text-right-fullhd{text-align:right !important}}.is-capitalized{text-transform:capitalize !important}.is-lowercase{text-transform:lowercase !important}.is-uppercase{text-transform:uppercase !important}.is-italic{font-style:italic !important}.is-underlined{text-decoration:underline !important}.has-text-weight-light{font-weight:300 !important}.has-text-weight-normal{font-weight:400 !important}.has-text-weight-medium{font-weight:500 !important}.has-text-weight-semibold{font-weight:600 !important}.has-text-weight-bold{font-weight:700 !important}.is-family-primary{font-family:"Lato Medium",-apple-system,BlinkMacSystemFont,"Segoe UI","Helvetica Neue","Helvetica","Arial",sans-serif !important}.is-family-secondary{font-family:"Lato Medium",-apple-system,BlinkMacSystemFont,"Segoe UI","Helvetica Neue","Helvetica","Arial",sans-serif !important}.is-family-sans-serif{font-family:"Lato Medium",-apple-system,BlinkMacSystemFont,"Segoe UI","Helvetica Neue","Helvetica","Arial",sans-serif !important}.is-family-monospace{font-family:"JuliaMono","SFMono-Regular","Menlo","Consolas","Liberation Mono","DejaVu Sans Mono",monospace !important}.is-family-code{font-family:"JuliaMono","SFMono-Regular","Menlo","Consolas","Liberation Mono","DejaVu Sans Mono",monospace !important}.is-block{display:block !important}@media screen and (max-width: 768px){.is-block-mobile{display:block !important}}@media screen and (min-width: 769px),print{.is-block-tablet{display:block !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.is-block-tablet-only{display:block !important}}@media screen and (max-width: 1055px){.is-block-touch{display:block !important}}@media screen and (min-width: 1056px){.is-block-desktop{display:block !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.is-block-desktop-only{display:block !important}}@media screen and (min-width: 1216px){.is-block-widescreen{display:block !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.is-block-widescreen-only{display:block !important}}@media screen and (min-width: 1408px){.is-block-fullhd{display:block !important}}.is-flex{display:flex !important}@media screen and (max-width: 768px){.is-flex-mobile{display:flex !important}}@media screen and (min-width: 769px),print{.is-flex-tablet{display:flex !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.is-flex-tablet-only{display:flex !important}}@media screen and (max-width: 1055px){.is-flex-touch{display:flex !important}}@media screen and (min-width: 1056px){.is-flex-desktop{display:flex !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.is-flex-desktop-only{display:flex !important}}@media screen and (min-width: 1216px){.is-flex-widescreen{display:flex !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.is-flex-widescreen-only{display:flex !important}}@media screen and (min-width: 1408px){.is-flex-fullhd{display:flex !important}}.is-inline{display:inline !important}@media screen and (max-width: 768px){.is-inline-mobile{display:inline !important}}@media screen and (min-width: 769px),print{.is-inline-tablet{display:inline !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.is-inline-tablet-only{display:inline !important}}@media screen and (max-width: 1055px){.is-inline-touch{display:inline !important}}@media screen and (min-width: 1056px){.is-inline-desktop{display:inline !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.is-inline-desktop-only{display:inline !important}}@media screen and (min-width: 1216px){.is-inline-widescreen{display:inline !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.is-inline-widescreen-only{display:inline !important}}@media screen and (min-width: 1408px){.is-inline-fullhd{display:inline !important}}.is-inline-block{display:inline-block !important}@media screen and (max-width: 768px){.is-inline-block-mobile{display:inline-block !important}}@media screen and (min-width: 769px),print{.is-inline-block-tablet{display:inline-block !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.is-inline-block-tablet-only{display:inline-block !important}}@media screen and (max-width: 1055px){.is-inline-block-touch{display:inline-block !important}}@media screen and (min-width: 1056px){.is-inline-block-desktop{display:inline-block !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.is-inline-block-desktop-only{display:inline-block !important}}@media screen and (min-width: 1216px){.is-inline-block-widescreen{display:inline-block !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.is-inline-block-widescreen-only{display:inline-block !important}}@media screen and (min-width: 1408px){.is-inline-block-fullhd{display:inline-block !important}}.is-inline-flex{display:inline-flex !important}@media screen and (max-width: 768px){.is-inline-flex-mobile{display:inline-flex !important}}@media screen and (min-width: 769px),print{.is-inline-flex-tablet{display:inline-flex !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.is-inline-flex-tablet-only{display:inline-flex !important}}@media screen and (max-width: 1055px){.is-inline-flex-touch{display:inline-flex !important}}@media screen and (min-width: 1056px){.is-inline-flex-desktop{display:inline-flex !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.is-inline-flex-desktop-only{display:inline-flex !important}}@media screen and (min-width: 1216px){.is-inline-flex-widescreen{display:inline-flex !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.is-inline-flex-widescreen-only{display:inline-flex !important}}@media screen and (min-width: 1408px){.is-inline-flex-fullhd{display:inline-flex !important}}.is-hidden{display:none !important}.is-sr-only{border:none !important;clip:rect(0, 0, 0, 0) !important;height:0.01em !important;overflow:hidden !important;padding:0 !important;position:absolute !important;white-space:nowrap !important;width:0.01em !important}@media screen and (max-width: 768px){.is-hidden-mobile{display:none !important}}@media screen and (min-width: 769px),print{.is-hidden-tablet{display:none !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.is-hidden-tablet-only{display:none !important}}@media screen and (max-width: 1055px){.is-hidden-touch{display:none !important}}@media screen and (min-width: 1056px){.is-hidden-desktop{display:none !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.is-hidden-desktop-only{display:none !important}}@media screen and (min-width: 1216px){.is-hidden-widescreen{display:none !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.is-hidden-widescreen-only{display:none !important}}@media screen and (min-width: 1408px){.is-hidden-fullhd{display:none !important}}.is-invisible{visibility:hidden !important}@media screen and (max-width: 768px){.is-invisible-mobile{visibility:hidden !important}}@media screen and (min-width: 769px),print{.is-invisible-tablet{visibility:hidden !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.is-invisible-tablet-only{visibility:hidden !important}}@media screen and (max-width: 1055px){.is-invisible-touch{visibility:hidden !important}}@media screen and (min-width: 1056px){.is-invisible-desktop{visibility:hidden !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.is-invisible-desktop-only{visibility:hidden !important}}@media screen and (min-width: 1216px){.is-invisible-widescreen{visibility:hidden !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.is-invisible-widescreen-only{visibility:hidden !important}}@media screen and (min-width: 1408px){.is-invisible-fullhd{visibility:hidden !important}}/*! minireset.css v0.0.6 | MIT License | github.com/jgthms/minireset.css */html,body,p,ol,ul,li,dl,dt,dd,blockquote,figure,fieldset,legend,textarea,pre,iframe,hr,h1,h2,h3,h4,h5,h6{margin:0;padding:0}h1,h2,h3,h4,h5,h6{font-size:100%;font-weight:normal}ul{list-style:none}button,input,select,textarea{margin:0}html{box-sizing:border-box}*,*::before,*::after{box-sizing:inherit}img,video{height:auto;max-width:100%}iframe{border:0}table{border-collapse:collapse;border-spacing:0}td,th{padding:0}td:not([align]),th:not([align]){text-align:inherit}html{background-color:#fff;font-size:16px;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;min-width:300px;overflow-x:auto;overflow-y:scroll;text-rendering:optimizeLegibility;text-size-adjust:100%}article,aside,figure,footer,header,hgroup,section{display:block}body,button,input,optgroup,select,textarea{font-family:"Lato Medium",-apple-system,BlinkMacSystemFont,"Segoe UI","Helvetica Neue","Helvetica","Arial",sans-serif}code,pre{-moz-osx-font-smoothing:auto;-webkit-font-smoothing:auto;font-family:"JuliaMono","SFMono-Regular","Menlo","Consolas","Liberation Mono","DejaVu Sans Mono",monospace}body{color:#222;font-size:1em;font-weight:400;line-height:1.5}a{color:#2e63b8;cursor:pointer;text-decoration:none}a strong{color:currentColor}a:hover{color:#363636}code{background-color:rgba(0,0,0,0.05);color:#000;font-size:.875em;font-weight:normal;padding:.1em}hr{background-color:#f5f5f5;border:none;display:block;height:2px;margin:1.5rem 0}img{height:auto;max-width:100%}input[type="checkbox"],input[type="radio"]{vertical-align:baseline}small{font-size:.875em}span{font-style:inherit;font-weight:inherit}strong{color:#222;font-weight:700}fieldset{border:none}pre{-webkit-overflow-scrolling:touch;background-color:#f5f5f5;color:#222;font-size:.875em;overflow-x:auto;padding:1.25rem 1.5rem;white-space:pre;word-wrap:normal}pre code{background-color:transparent;color:currentColor;font-size:1em;padding:0}table td,table th{vertical-align:top}table td:not([align]),table th:not([align]){text-align:inherit}table th{color:#222}@keyframes spinAround{from{transform:rotate(0deg)}to{transform:rotate(359deg)}}.box{background-color:#fff;border-radius:6px;box-shadow:#bbb;color:#222;display:block;padding:1.25rem}a.box:hover,a.box:focus{box-shadow:0 0.5em 1em -0.125em rgba(10,10,10,0.1),0 0 0 1px #2e63b8}a.box:active{box-shadow:inset 0 1px 2px rgba(10,10,10,0.2),0 0 0 1px #2e63b8}.button{background-color:#fff;border-color:#dbdbdb;border-width:1px;color:#222;cursor:pointer;justify-content:center;padding-bottom:calc(0.5em - 1px);padding-left:1em;padding-right:1em;padding-top:calc(0.5em - 1px);text-align:center;white-space:nowrap}.button strong{color:inherit}.button .icon,.button .icon.is-small,.button #documenter .docs-sidebar form.docs-search>input.icon,#documenter .docs-sidebar .button form.docs-search>input.icon,.button .icon.is-medium,.button .icon.is-large{height:1.5em;width:1.5em}.button .icon:first-child:not(:last-child){margin-left:calc(-0.5em - 1px);margin-right:.25em}.button .icon:last-child:not(:first-child){margin-left:.25em;margin-right:calc(-0.5em - 1px)}.button .icon:first-child:last-child{margin-left:calc(-0.5em - 1px);margin-right:calc(-0.5em - 1px)}.button:hover,.button.is-hovered{border-color:#b5b5b5;color:#363636}.button:focus,.button.is-focused{border-color:#3c5dcd;color:#363636}.button:focus:not(:active),.button.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(46,99,184,0.25)}.button:active,.button.is-active{border-color:#4a4a4a;color:#363636}.button.is-text{background-color:transparent;border-color:transparent;color:#222;text-decoration:underline}.button.is-text:hover,.button.is-text.is-hovered,.button.is-text:focus,.button.is-text.is-focused{background-color:#f5f5f5;color:#222}.button.is-text:active,.button.is-text.is-active{background-color:#e8e8e8;color:#222}.button.is-text[disabled],fieldset[disabled] .button.is-text{background-color:transparent;border-color:transparent;box-shadow:none}.button.is-ghost{background:none;border-color:rgba(0,0,0,0);color:#2e63b8;text-decoration:none}.button.is-ghost:hover,.button.is-ghost.is-hovered{color:#2e63b8;text-decoration:underline}.button.is-white{background-color:#fff;border-color:transparent;color:#0a0a0a}.button.is-white:hover,.button.is-white.is-hovered{background-color:#f9f9f9;border-color:transparent;color:#0a0a0a}.button.is-white:focus,.button.is-white.is-focused{border-color:transparent;color:#0a0a0a}.button.is-white:focus:not(:active),.button.is-white.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(255,255,255,0.25)}.button.is-white:active,.button.is-white.is-active{background-color:#f2f2f2;border-color:transparent;color:#0a0a0a}.button.is-white[disabled],fieldset[disabled] .button.is-white{background-color:#fff;border-color:#fff;box-shadow:none}.button.is-white.is-inverted{background-color:#0a0a0a;color:#fff}.button.is-white.is-inverted:hover,.button.is-white.is-inverted.is-hovered{background-color:#000}.button.is-white.is-inverted[disabled],fieldset[disabled] .button.is-white.is-inverted{background-color:#0a0a0a;border-color:transparent;box-shadow:none;color:#fff}.button.is-white.is-loading::after{border-color:transparent transparent #0a0a0a #0a0a0a !important}.button.is-white.is-outlined{background-color:transparent;border-color:#fff;color:#fff}.button.is-white.is-outlined:hover,.button.is-white.is-outlined.is-hovered,.button.is-white.is-outlined:focus,.button.is-white.is-outlined.is-focused{background-color:#fff;border-color:#fff;color:#0a0a0a}.button.is-white.is-outlined.is-loading::after{border-color:transparent transparent #fff #fff !important}.button.is-white.is-outlined.is-loading:hover::after,.button.is-white.is-outlined.is-loading.is-hovered::after,.button.is-white.is-outlined.is-loading:focus::after,.button.is-white.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #0a0a0a #0a0a0a !important}.button.is-white.is-outlined[disabled],fieldset[disabled] .button.is-white.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}.button.is-white.is-inverted.is-outlined{background-color:transparent;border-color:#0a0a0a;color:#0a0a0a}.button.is-white.is-inverted.is-outlined:hover,.button.is-white.is-inverted.is-outlined.is-hovered,.button.is-white.is-inverted.is-outlined:focus,.button.is-white.is-inverted.is-outlined.is-focused{background-color:#0a0a0a;color:#fff}.button.is-white.is-inverted.is-outlined.is-loading:hover::after,.button.is-white.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-white.is-inverted.is-outlined.is-loading:focus::after,.button.is-white.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #fff #fff !important}.button.is-white.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-white.is-inverted.is-outlined{background-color:transparent;border-color:#0a0a0a;box-shadow:none;color:#0a0a0a}.button.is-black{background-color:#0a0a0a;border-color:transparent;color:#fff}.button.is-black:hover,.button.is-black.is-hovered{background-color:#040404;border-color:transparent;color:#fff}.button.is-black:focus,.button.is-black.is-focused{border-color:transparent;color:#fff}.button.is-black:focus:not(:active),.button.is-black.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(10,10,10,0.25)}.button.is-black:active,.button.is-black.is-active{background-color:#000;border-color:transparent;color:#fff}.button.is-black[disabled],fieldset[disabled] .button.is-black{background-color:#0a0a0a;border-color:#0a0a0a;box-shadow:none}.button.is-black.is-inverted{background-color:#fff;color:#0a0a0a}.button.is-black.is-inverted:hover,.button.is-black.is-inverted.is-hovered{background-color:#f2f2f2}.button.is-black.is-inverted[disabled],fieldset[disabled] .button.is-black.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#0a0a0a}.button.is-black.is-loading::after{border-color:transparent transparent #fff #fff !important}.button.is-black.is-outlined{background-color:transparent;border-color:#0a0a0a;color:#0a0a0a}.button.is-black.is-outlined:hover,.button.is-black.is-outlined.is-hovered,.button.is-black.is-outlined:focus,.button.is-black.is-outlined.is-focused{background-color:#0a0a0a;border-color:#0a0a0a;color:#fff}.button.is-black.is-outlined.is-loading::after{border-color:transparent transparent #0a0a0a #0a0a0a !important}.button.is-black.is-outlined.is-loading:hover::after,.button.is-black.is-outlined.is-loading.is-hovered::after,.button.is-black.is-outlined.is-loading:focus::after,.button.is-black.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #fff #fff !important}.button.is-black.is-outlined[disabled],fieldset[disabled] .button.is-black.is-outlined{background-color:transparent;border-color:#0a0a0a;box-shadow:none;color:#0a0a0a}.button.is-black.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}.button.is-black.is-inverted.is-outlined:hover,.button.is-black.is-inverted.is-outlined.is-hovered,.button.is-black.is-inverted.is-outlined:focus,.button.is-black.is-inverted.is-outlined.is-focused{background-color:#fff;color:#0a0a0a}.button.is-black.is-inverted.is-outlined.is-loading:hover::after,.button.is-black.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-black.is-inverted.is-outlined.is-loading:focus::after,.button.is-black.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #0a0a0a #0a0a0a !important}.button.is-black.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-black.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}.button.is-light{background-color:#f5f5f5;border-color:transparent;color:rgba(0,0,0,0.7)}.button.is-light:hover,.button.is-light.is-hovered{background-color:#eee;border-color:transparent;color:rgba(0,0,0,0.7)}.button.is-light:focus,.button.is-light.is-focused{border-color:transparent;color:rgba(0,0,0,0.7)}.button.is-light:focus:not(:active),.button.is-light.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(245,245,245,0.25)}.button.is-light:active,.button.is-light.is-active{background-color:#e8e8e8;border-color:transparent;color:rgba(0,0,0,0.7)}.button.is-light[disabled],fieldset[disabled] .button.is-light{background-color:#f5f5f5;border-color:#f5f5f5;box-shadow:none}.button.is-light.is-inverted{background-color:rgba(0,0,0,0.7);color:#f5f5f5}.button.is-light.is-inverted:hover,.button.is-light.is-inverted.is-hovered{background-color:rgba(0,0,0,0.7)}.button.is-light.is-inverted[disabled],fieldset[disabled] .button.is-light.is-inverted{background-color:rgba(0,0,0,0.7);border-color:transparent;box-shadow:none;color:#f5f5f5}.button.is-light.is-loading::after{border-color:transparent transparent rgba(0,0,0,0.7) rgba(0,0,0,0.7) !important}.button.is-light.is-outlined{background-color:transparent;border-color:#f5f5f5;color:#f5f5f5}.button.is-light.is-outlined:hover,.button.is-light.is-outlined.is-hovered,.button.is-light.is-outlined:focus,.button.is-light.is-outlined.is-focused{background-color:#f5f5f5;border-color:#f5f5f5;color:rgba(0,0,0,0.7)}.button.is-light.is-outlined.is-loading::after{border-color:transparent transparent #f5f5f5 #f5f5f5 !important}.button.is-light.is-outlined.is-loading:hover::after,.button.is-light.is-outlined.is-loading.is-hovered::after,.button.is-light.is-outlined.is-loading:focus::after,.button.is-light.is-outlined.is-loading.is-focused::after{border-color:transparent transparent rgba(0,0,0,0.7) rgba(0,0,0,0.7) !important}.button.is-light.is-outlined[disabled],fieldset[disabled] .button.is-light.is-outlined{background-color:transparent;border-color:#f5f5f5;box-shadow:none;color:#f5f5f5}.button.is-light.is-inverted.is-outlined{background-color:transparent;border-color:rgba(0,0,0,0.7);color:rgba(0,0,0,0.7)}.button.is-light.is-inverted.is-outlined:hover,.button.is-light.is-inverted.is-outlined.is-hovered,.button.is-light.is-inverted.is-outlined:focus,.button.is-light.is-inverted.is-outlined.is-focused{background-color:rgba(0,0,0,0.7);color:#f5f5f5}.button.is-light.is-inverted.is-outlined.is-loading:hover::after,.button.is-light.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-light.is-inverted.is-outlined.is-loading:focus::after,.button.is-light.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #f5f5f5 #f5f5f5 !important}.button.is-light.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-light.is-inverted.is-outlined{background-color:transparent;border-color:rgba(0,0,0,0.7);box-shadow:none;color:rgba(0,0,0,0.7)}.button.is-dark,.content kbd.button{background-color:#363636;border-color:transparent;color:#fff}.button.is-dark:hover,.content kbd.button:hover,.button.is-dark.is-hovered,.content kbd.button.is-hovered{background-color:#2f2f2f;border-color:transparent;color:#fff}.button.is-dark:focus,.content kbd.button:focus,.button.is-dark.is-focused,.content kbd.button.is-focused{border-color:transparent;color:#fff}.button.is-dark:focus:not(:active),.content kbd.button:focus:not(:active),.button.is-dark.is-focused:not(:active),.content kbd.button.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(54,54,54,0.25)}.button.is-dark:active,.content kbd.button:active,.button.is-dark.is-active,.content kbd.button.is-active{background-color:#292929;border-color:transparent;color:#fff}.button.is-dark[disabled],.content kbd.button[disabled],fieldset[disabled] .button.is-dark,fieldset[disabled] .content kbd.button,.content fieldset[disabled] kbd.button{background-color:#363636;border-color:#363636;box-shadow:none}.button.is-dark.is-inverted,.content kbd.button.is-inverted{background-color:#fff;color:#363636}.button.is-dark.is-inverted:hover,.content kbd.button.is-inverted:hover,.button.is-dark.is-inverted.is-hovered,.content kbd.button.is-inverted.is-hovered{background-color:#f2f2f2}.button.is-dark.is-inverted[disabled],.content kbd.button.is-inverted[disabled],fieldset[disabled] .button.is-dark.is-inverted,fieldset[disabled] .content kbd.button.is-inverted,.content fieldset[disabled] kbd.button.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#363636}.button.is-dark.is-loading::after,.content kbd.button.is-loading::after{border-color:transparent transparent #fff #fff !important}.button.is-dark.is-outlined,.content kbd.button.is-outlined{background-color:transparent;border-color:#363636;color:#363636}.button.is-dark.is-outlined:hover,.content kbd.button.is-outlined:hover,.button.is-dark.is-outlined.is-hovered,.content kbd.button.is-outlined.is-hovered,.button.is-dark.is-outlined:focus,.content kbd.button.is-outlined:focus,.button.is-dark.is-outlined.is-focused,.content kbd.button.is-outlined.is-focused{background-color:#363636;border-color:#363636;color:#fff}.button.is-dark.is-outlined.is-loading::after,.content kbd.button.is-outlined.is-loading::after{border-color:transparent transparent #363636 #363636 !important}.button.is-dark.is-outlined.is-loading:hover::after,.content kbd.button.is-outlined.is-loading:hover::after,.button.is-dark.is-outlined.is-loading.is-hovered::after,.content kbd.button.is-outlined.is-loading.is-hovered::after,.button.is-dark.is-outlined.is-loading:focus::after,.content kbd.button.is-outlined.is-loading:focus::after,.button.is-dark.is-outlined.is-loading.is-focused::after,.content kbd.button.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #fff #fff !important}.button.is-dark.is-outlined[disabled],.content kbd.button.is-outlined[disabled],fieldset[disabled] .button.is-dark.is-outlined,fieldset[disabled] .content kbd.button.is-outlined,.content fieldset[disabled] kbd.button.is-outlined{background-color:transparent;border-color:#363636;box-shadow:none;color:#363636}.button.is-dark.is-inverted.is-outlined,.content kbd.button.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}.button.is-dark.is-inverted.is-outlined:hover,.content kbd.button.is-inverted.is-outlined:hover,.button.is-dark.is-inverted.is-outlined.is-hovered,.content kbd.button.is-inverted.is-outlined.is-hovered,.button.is-dark.is-inverted.is-outlined:focus,.content kbd.button.is-inverted.is-outlined:focus,.button.is-dark.is-inverted.is-outlined.is-focused,.content kbd.button.is-inverted.is-outlined.is-focused{background-color:#fff;color:#363636}.button.is-dark.is-inverted.is-outlined.is-loading:hover::after,.content kbd.button.is-inverted.is-outlined.is-loading:hover::after,.button.is-dark.is-inverted.is-outlined.is-loading.is-hovered::after,.content kbd.button.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-dark.is-inverted.is-outlined.is-loading:focus::after,.content kbd.button.is-inverted.is-outlined.is-loading:focus::after,.button.is-dark.is-inverted.is-outlined.is-loading.is-focused::after,.content kbd.button.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #363636 #363636 !important}.button.is-dark.is-inverted.is-outlined[disabled],.content kbd.button.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-dark.is-inverted.is-outlined,fieldset[disabled] .content kbd.button.is-inverted.is-outlined,.content fieldset[disabled] kbd.button.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}.button.is-primary,.docstring>section>a.button.docs-sourcelink{background-color:#4eb5de;border-color:transparent;color:#fff}.button.is-primary:hover,.docstring>section>a.button.docs-sourcelink:hover,.button.is-primary.is-hovered,.docstring>section>a.button.is-hovered.docs-sourcelink{background-color:#43b1dc;border-color:transparent;color:#fff}.button.is-primary:focus,.docstring>section>a.button.docs-sourcelink:focus,.button.is-primary.is-focused,.docstring>section>a.button.is-focused.docs-sourcelink{border-color:transparent;color:#fff}.button.is-primary:focus:not(:active),.docstring>section>a.button.docs-sourcelink:focus:not(:active),.button.is-primary.is-focused:not(:active),.docstring>section>a.button.is-focused.docs-sourcelink:not(:active){box-shadow:0 0 0 0.125em rgba(78,181,222,0.25)}.button.is-primary:active,.docstring>section>a.button.docs-sourcelink:active,.button.is-primary.is-active,.docstring>section>a.button.is-active.docs-sourcelink{background-color:#39acda;border-color:transparent;color:#fff}.button.is-primary[disabled],.docstring>section>a.button.docs-sourcelink[disabled],fieldset[disabled] .button.is-primary,fieldset[disabled] .docstring>section>a.button.docs-sourcelink{background-color:#4eb5de;border-color:#4eb5de;box-shadow:none}.button.is-primary.is-inverted,.docstring>section>a.button.is-inverted.docs-sourcelink{background-color:#fff;color:#4eb5de}.button.is-primary.is-inverted:hover,.docstring>section>a.button.is-inverted.docs-sourcelink:hover,.button.is-primary.is-inverted.is-hovered,.docstring>section>a.button.is-inverted.is-hovered.docs-sourcelink{background-color:#f2f2f2}.button.is-primary.is-inverted[disabled],.docstring>section>a.button.is-inverted.docs-sourcelink[disabled],fieldset[disabled] .button.is-primary.is-inverted,fieldset[disabled] .docstring>section>a.button.is-inverted.docs-sourcelink{background-color:#fff;border-color:transparent;box-shadow:none;color:#4eb5de}.button.is-primary.is-loading::after,.docstring>section>a.button.is-loading.docs-sourcelink::after{border-color:transparent transparent #fff #fff !important}.button.is-primary.is-outlined,.docstring>section>a.button.is-outlined.docs-sourcelink{background-color:transparent;border-color:#4eb5de;color:#4eb5de}.button.is-primary.is-outlined:hover,.docstring>section>a.button.is-outlined.docs-sourcelink:hover,.button.is-primary.is-outlined.is-hovered,.docstring>section>a.button.is-outlined.is-hovered.docs-sourcelink,.button.is-primary.is-outlined:focus,.docstring>section>a.button.is-outlined.docs-sourcelink:focus,.button.is-primary.is-outlined.is-focused,.docstring>section>a.button.is-outlined.is-focused.docs-sourcelink{background-color:#4eb5de;border-color:#4eb5de;color:#fff}.button.is-primary.is-outlined.is-loading::after,.docstring>section>a.button.is-outlined.is-loading.docs-sourcelink::after{border-color:transparent transparent #4eb5de #4eb5de !important}.button.is-primary.is-outlined.is-loading:hover::after,.docstring>section>a.button.is-outlined.is-loading.docs-sourcelink:hover::after,.button.is-primary.is-outlined.is-loading.is-hovered::after,.docstring>section>a.button.is-outlined.is-loading.is-hovered.docs-sourcelink::after,.button.is-primary.is-outlined.is-loading:focus::after,.docstring>section>a.button.is-outlined.is-loading.docs-sourcelink:focus::after,.button.is-primary.is-outlined.is-loading.is-focused::after,.docstring>section>a.button.is-outlined.is-loading.is-focused.docs-sourcelink::after{border-color:transparent transparent #fff #fff !important}.button.is-primary.is-outlined[disabled],.docstring>section>a.button.is-outlined.docs-sourcelink[disabled],fieldset[disabled] .button.is-primary.is-outlined,fieldset[disabled] .docstring>section>a.button.is-outlined.docs-sourcelink{background-color:transparent;border-color:#4eb5de;box-shadow:none;color:#4eb5de}.button.is-primary.is-inverted.is-outlined,.docstring>section>a.button.is-inverted.is-outlined.docs-sourcelink{background-color:transparent;border-color:#fff;color:#fff}.button.is-primary.is-inverted.is-outlined:hover,.docstring>section>a.button.is-inverted.is-outlined.docs-sourcelink:hover,.button.is-primary.is-inverted.is-outlined.is-hovered,.docstring>section>a.button.is-inverted.is-outlined.is-hovered.docs-sourcelink,.button.is-primary.is-inverted.is-outlined:focus,.docstring>section>a.button.is-inverted.is-outlined.docs-sourcelink:focus,.button.is-primary.is-inverted.is-outlined.is-focused,.docstring>section>a.button.is-inverted.is-outlined.is-focused.docs-sourcelink{background-color:#fff;color:#4eb5de}.button.is-primary.is-inverted.is-outlined.is-loading:hover::after,.docstring>section>a.button.is-inverted.is-outlined.is-loading.docs-sourcelink:hover::after,.button.is-primary.is-inverted.is-outlined.is-loading.is-hovered::after,.docstring>section>a.button.is-inverted.is-outlined.is-loading.is-hovered.docs-sourcelink::after,.button.is-primary.is-inverted.is-outlined.is-loading:focus::after,.docstring>section>a.button.is-inverted.is-outlined.is-loading.docs-sourcelink:focus::after,.button.is-primary.is-inverted.is-outlined.is-loading.is-focused::after,.docstring>section>a.button.is-inverted.is-outlined.is-loading.is-focused.docs-sourcelink::after{border-color:transparent transparent #4eb5de #4eb5de !important}.button.is-primary.is-inverted.is-outlined[disabled],.docstring>section>a.button.is-inverted.is-outlined.docs-sourcelink[disabled],fieldset[disabled] .button.is-primary.is-inverted.is-outlined,fieldset[disabled] .docstring>section>a.button.is-inverted.is-outlined.docs-sourcelink{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}.button.is-primary.is-light,.docstring>section>a.button.is-light.docs-sourcelink{background-color:#eef8fc;color:#1a6d8e}.button.is-primary.is-light:hover,.docstring>section>a.button.is-light.docs-sourcelink:hover,.button.is-primary.is-light.is-hovered,.docstring>section>a.button.is-light.is-hovered.docs-sourcelink{background-color:#e3f3fa;border-color:transparent;color:#1a6d8e}.button.is-primary.is-light:active,.docstring>section>a.button.is-light.docs-sourcelink:active,.button.is-primary.is-light.is-active,.docstring>section>a.button.is-light.is-active.docs-sourcelink{background-color:#d8eff8;border-color:transparent;color:#1a6d8e}.button.is-link{background-color:#2e63b8;border-color:transparent;color:#fff}.button.is-link:hover,.button.is-link.is-hovered{background-color:#2b5eae;border-color:transparent;color:#fff}.button.is-link:focus,.button.is-link.is-focused{border-color:transparent;color:#fff}.button.is-link:focus:not(:active),.button.is-link.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(46,99,184,0.25)}.button.is-link:active,.button.is-link.is-active{background-color:#2958a4;border-color:transparent;color:#fff}.button.is-link[disabled],fieldset[disabled] .button.is-link{background-color:#2e63b8;border-color:#2e63b8;box-shadow:none}.button.is-link.is-inverted{background-color:#fff;color:#2e63b8}.button.is-link.is-inverted:hover,.button.is-link.is-inverted.is-hovered{background-color:#f2f2f2}.button.is-link.is-inverted[disabled],fieldset[disabled] .button.is-link.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#2e63b8}.button.is-link.is-loading::after{border-color:transparent transparent #fff #fff !important}.button.is-link.is-outlined{background-color:transparent;border-color:#2e63b8;color:#2e63b8}.button.is-link.is-outlined:hover,.button.is-link.is-outlined.is-hovered,.button.is-link.is-outlined:focus,.button.is-link.is-outlined.is-focused{background-color:#2e63b8;border-color:#2e63b8;color:#fff}.button.is-link.is-outlined.is-loading::after{border-color:transparent transparent #2e63b8 #2e63b8 !important}.button.is-link.is-outlined.is-loading:hover::after,.button.is-link.is-outlined.is-loading.is-hovered::after,.button.is-link.is-outlined.is-loading:focus::after,.button.is-link.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #fff #fff !important}.button.is-link.is-outlined[disabled],fieldset[disabled] .button.is-link.is-outlined{background-color:transparent;border-color:#2e63b8;box-shadow:none;color:#2e63b8}.button.is-link.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}.button.is-link.is-inverted.is-outlined:hover,.button.is-link.is-inverted.is-outlined.is-hovered,.button.is-link.is-inverted.is-outlined:focus,.button.is-link.is-inverted.is-outlined.is-focused{background-color:#fff;color:#2e63b8}.button.is-link.is-inverted.is-outlined.is-loading:hover::after,.button.is-link.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-link.is-inverted.is-outlined.is-loading:focus::after,.button.is-link.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #2e63b8 #2e63b8 !important}.button.is-link.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-link.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}.button.is-link.is-light{background-color:#eff3fb;color:#3169c4}.button.is-link.is-light:hover,.button.is-link.is-light.is-hovered{background-color:#e4ecf8;border-color:transparent;color:#3169c4}.button.is-link.is-light:active,.button.is-link.is-light.is-active{background-color:#dae5f6;border-color:transparent;color:#3169c4}.button.is-info{background-color:#209cee;border-color:transparent;color:#fff}.button.is-info:hover,.button.is-info.is-hovered{background-color:#1497ed;border-color:transparent;color:#fff}.button.is-info:focus,.button.is-info.is-focused{border-color:transparent;color:#fff}.button.is-info:focus:not(:active),.button.is-info.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(32,156,238,0.25)}.button.is-info:active,.button.is-info.is-active{background-color:#1190e3;border-color:transparent;color:#fff}.button.is-info[disabled],fieldset[disabled] .button.is-info{background-color:#209cee;border-color:#209cee;box-shadow:none}.button.is-info.is-inverted{background-color:#fff;color:#209cee}.button.is-info.is-inverted:hover,.button.is-info.is-inverted.is-hovered{background-color:#f2f2f2}.button.is-info.is-inverted[disabled],fieldset[disabled] .button.is-info.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#209cee}.button.is-info.is-loading::after{border-color:transparent transparent #fff #fff !important}.button.is-info.is-outlined{background-color:transparent;border-color:#209cee;color:#209cee}.button.is-info.is-outlined:hover,.button.is-info.is-outlined.is-hovered,.button.is-info.is-outlined:focus,.button.is-info.is-outlined.is-focused{background-color:#209cee;border-color:#209cee;color:#fff}.button.is-info.is-outlined.is-loading::after{border-color:transparent transparent #209cee #209cee !important}.button.is-info.is-outlined.is-loading:hover::after,.button.is-info.is-outlined.is-loading.is-hovered::after,.button.is-info.is-outlined.is-loading:focus::after,.button.is-info.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #fff #fff !important}.button.is-info.is-outlined[disabled],fieldset[disabled] .button.is-info.is-outlined{background-color:transparent;border-color:#209cee;box-shadow:none;color:#209cee}.button.is-info.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}.button.is-info.is-inverted.is-outlined:hover,.button.is-info.is-inverted.is-outlined.is-hovered,.button.is-info.is-inverted.is-outlined:focus,.button.is-info.is-inverted.is-outlined.is-focused{background-color:#fff;color:#209cee}.button.is-info.is-inverted.is-outlined.is-loading:hover::after,.button.is-info.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-info.is-inverted.is-outlined.is-loading:focus::after,.button.is-info.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #209cee #209cee !important}.button.is-info.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-info.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}.button.is-info.is-light{background-color:#ecf7fe;color:#0e72b4}.button.is-info.is-light:hover,.button.is-info.is-light.is-hovered{background-color:#e0f1fd;border-color:transparent;color:#0e72b4}.button.is-info.is-light:active,.button.is-info.is-light.is-active{background-color:#d4ecfc;border-color:transparent;color:#0e72b4}.button.is-success{background-color:#22c35b;border-color:transparent;color:#fff}.button.is-success:hover,.button.is-success.is-hovered{background-color:#20b856;border-color:transparent;color:#fff}.button.is-success:focus,.button.is-success.is-focused{border-color:transparent;color:#fff}.button.is-success:focus:not(:active),.button.is-success.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(34,195,91,0.25)}.button.is-success:active,.button.is-success.is-active{background-color:#1ead51;border-color:transparent;color:#fff}.button.is-success[disabled],fieldset[disabled] .button.is-success{background-color:#22c35b;border-color:#22c35b;box-shadow:none}.button.is-success.is-inverted{background-color:#fff;color:#22c35b}.button.is-success.is-inverted:hover,.button.is-success.is-inverted.is-hovered{background-color:#f2f2f2}.button.is-success.is-inverted[disabled],fieldset[disabled] .button.is-success.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#22c35b}.button.is-success.is-loading::after{border-color:transparent transparent #fff #fff !important}.button.is-success.is-outlined{background-color:transparent;border-color:#22c35b;color:#22c35b}.button.is-success.is-outlined:hover,.button.is-success.is-outlined.is-hovered,.button.is-success.is-outlined:focus,.button.is-success.is-outlined.is-focused{background-color:#22c35b;border-color:#22c35b;color:#fff}.button.is-success.is-outlined.is-loading::after{border-color:transparent transparent #22c35b #22c35b !important}.button.is-success.is-outlined.is-loading:hover::after,.button.is-success.is-outlined.is-loading.is-hovered::after,.button.is-success.is-outlined.is-loading:focus::after,.button.is-success.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #fff #fff !important}.button.is-success.is-outlined[disabled],fieldset[disabled] .button.is-success.is-outlined{background-color:transparent;border-color:#22c35b;box-shadow:none;color:#22c35b}.button.is-success.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}.button.is-success.is-inverted.is-outlined:hover,.button.is-success.is-inverted.is-outlined.is-hovered,.button.is-success.is-inverted.is-outlined:focus,.button.is-success.is-inverted.is-outlined.is-focused{background-color:#fff;color:#22c35b}.button.is-success.is-inverted.is-outlined.is-loading:hover::after,.button.is-success.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-success.is-inverted.is-outlined.is-loading:focus::after,.button.is-success.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #22c35b #22c35b !important}.button.is-success.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-success.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}.button.is-success.is-light{background-color:#eefcf3;color:#198f43}.button.is-success.is-light:hover,.button.is-success.is-light.is-hovered{background-color:#e3faeb;border-color:transparent;color:#198f43}.button.is-success.is-light:active,.button.is-success.is-light.is-active{background-color:#d8f8e3;border-color:transparent;color:#198f43}.button.is-warning{background-color:#ffdd57;border-color:transparent;color:rgba(0,0,0,0.7)}.button.is-warning:hover,.button.is-warning.is-hovered{background-color:#ffda4a;border-color:transparent;color:rgba(0,0,0,0.7)}.button.is-warning:focus,.button.is-warning.is-focused{border-color:transparent;color:rgba(0,0,0,0.7)}.button.is-warning:focus:not(:active),.button.is-warning.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(255,221,87,0.25)}.button.is-warning:active,.button.is-warning.is-active{background-color:#ffd83e;border-color:transparent;color:rgba(0,0,0,0.7)}.button.is-warning[disabled],fieldset[disabled] .button.is-warning{background-color:#ffdd57;border-color:#ffdd57;box-shadow:none}.button.is-warning.is-inverted{background-color:rgba(0,0,0,0.7);color:#ffdd57}.button.is-warning.is-inverted:hover,.button.is-warning.is-inverted.is-hovered{background-color:rgba(0,0,0,0.7)}.button.is-warning.is-inverted[disabled],fieldset[disabled] .button.is-warning.is-inverted{background-color:rgba(0,0,0,0.7);border-color:transparent;box-shadow:none;color:#ffdd57}.button.is-warning.is-loading::after{border-color:transparent transparent rgba(0,0,0,0.7) rgba(0,0,0,0.7) !important}.button.is-warning.is-outlined{background-color:transparent;border-color:#ffdd57;color:#ffdd57}.button.is-warning.is-outlined:hover,.button.is-warning.is-outlined.is-hovered,.button.is-warning.is-outlined:focus,.button.is-warning.is-outlined.is-focused{background-color:#ffdd57;border-color:#ffdd57;color:rgba(0,0,0,0.7)}.button.is-warning.is-outlined.is-loading::after{border-color:transparent transparent #ffdd57 #ffdd57 !important}.button.is-warning.is-outlined.is-loading:hover::after,.button.is-warning.is-outlined.is-loading.is-hovered::after,.button.is-warning.is-outlined.is-loading:focus::after,.button.is-warning.is-outlined.is-loading.is-focused::after{border-color:transparent transparent rgba(0,0,0,0.7) rgba(0,0,0,0.7) !important}.button.is-warning.is-outlined[disabled],fieldset[disabled] .button.is-warning.is-outlined{background-color:transparent;border-color:#ffdd57;box-shadow:none;color:#ffdd57}.button.is-warning.is-inverted.is-outlined{background-color:transparent;border-color:rgba(0,0,0,0.7);color:rgba(0,0,0,0.7)}.button.is-warning.is-inverted.is-outlined:hover,.button.is-warning.is-inverted.is-outlined.is-hovered,.button.is-warning.is-inverted.is-outlined:focus,.button.is-warning.is-inverted.is-outlined.is-focused{background-color:rgba(0,0,0,0.7);color:#ffdd57}.button.is-warning.is-inverted.is-outlined.is-loading:hover::after,.button.is-warning.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-warning.is-inverted.is-outlined.is-loading:focus::after,.button.is-warning.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #ffdd57 #ffdd57 !important}.button.is-warning.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-warning.is-inverted.is-outlined{background-color:transparent;border-color:rgba(0,0,0,0.7);box-shadow:none;color:rgba(0,0,0,0.7)}.button.is-warning.is-light{background-color:#fffbeb;color:#947600}.button.is-warning.is-light:hover,.button.is-warning.is-light.is-hovered{background-color:#fff8de;border-color:transparent;color:#947600}.button.is-warning.is-light:active,.button.is-warning.is-light.is-active{background-color:#fff6d1;border-color:transparent;color:#947600}.button.is-danger{background-color:#da0b00;border-color:transparent;color:#fff}.button.is-danger:hover,.button.is-danger.is-hovered{background-color:#cd0a00;border-color:transparent;color:#fff}.button.is-danger:focus,.button.is-danger.is-focused{border-color:transparent;color:#fff}.button.is-danger:focus:not(:active),.button.is-danger.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(218,11,0,0.25)}.button.is-danger:active,.button.is-danger.is-active{background-color:#c10a00;border-color:transparent;color:#fff}.button.is-danger[disabled],fieldset[disabled] .button.is-danger{background-color:#da0b00;border-color:#da0b00;box-shadow:none}.button.is-danger.is-inverted{background-color:#fff;color:#da0b00}.button.is-danger.is-inverted:hover,.button.is-danger.is-inverted.is-hovered{background-color:#f2f2f2}.button.is-danger.is-inverted[disabled],fieldset[disabled] .button.is-danger.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#da0b00}.button.is-danger.is-loading::after{border-color:transparent transparent #fff #fff !important}.button.is-danger.is-outlined{background-color:transparent;border-color:#da0b00;color:#da0b00}.button.is-danger.is-outlined:hover,.button.is-danger.is-outlined.is-hovered,.button.is-danger.is-outlined:focus,.button.is-danger.is-outlined.is-focused{background-color:#da0b00;border-color:#da0b00;color:#fff}.button.is-danger.is-outlined.is-loading::after{border-color:transparent transparent #da0b00 #da0b00 !important}.button.is-danger.is-outlined.is-loading:hover::after,.button.is-danger.is-outlined.is-loading.is-hovered::after,.button.is-danger.is-outlined.is-loading:focus::after,.button.is-danger.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #fff #fff !important}.button.is-danger.is-outlined[disabled],fieldset[disabled] .button.is-danger.is-outlined{background-color:transparent;border-color:#da0b00;box-shadow:none;color:#da0b00}.button.is-danger.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}.button.is-danger.is-inverted.is-outlined:hover,.button.is-danger.is-inverted.is-outlined.is-hovered,.button.is-danger.is-inverted.is-outlined:focus,.button.is-danger.is-inverted.is-outlined.is-focused{background-color:#fff;color:#da0b00}.button.is-danger.is-inverted.is-outlined.is-loading:hover::after,.button.is-danger.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-danger.is-inverted.is-outlined.is-loading:focus::after,.button.is-danger.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #da0b00 #da0b00 !important}.button.is-danger.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-danger.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}.button.is-danger.is-light{background-color:#ffeceb;color:#f50c00}.button.is-danger.is-light:hover,.button.is-danger.is-light.is-hovered{background-color:#ffe0de;border-color:transparent;color:#f50c00}.button.is-danger.is-light:active,.button.is-danger.is-light.is-active{background-color:#ffd3d1;border-color:transparent;color:#f50c00}.button.is-small,#documenter .docs-sidebar form.docs-search>input.button{font-size:.75rem}.button.is-small:not(.is-rounded),#documenter .docs-sidebar form.docs-search>input.button:not(.is-rounded){border-radius:2px}.button.is-normal{font-size:1rem}.button.is-medium{font-size:1.25rem}.button.is-large{font-size:1.5rem}.button[disabled],fieldset[disabled] .button{background-color:#fff;border-color:#dbdbdb;box-shadow:none;opacity:.5}.button.is-fullwidth{display:flex;width:100%}.button.is-loading{color:transparent !important;pointer-events:none}.button.is-loading::after{position:absolute;left:calc(50% - (1em * 0.5));top:calc(50% - (1em * 0.5));position:absolute !important}.button.is-static{background-color:#f5f5f5;border-color:#dbdbdb;color:#6b6b6b;box-shadow:none;pointer-events:none}.button.is-rounded,#documenter .docs-sidebar form.docs-search>input.button{border-radius:9999px;padding-left:calc(1em + 0.25em);padding-right:calc(1em + 0.25em)}.buttons{align-items:center;display:flex;flex-wrap:wrap;justify-content:flex-start}.buttons .button{margin-bottom:0.5rem}.buttons .button:not(:last-child):not(.is-fullwidth){margin-right:.5rem}.buttons:last-child{margin-bottom:-0.5rem}.buttons:not(:last-child){margin-bottom:1rem}.buttons.are-small .button:not(.is-normal):not(.is-medium):not(.is-large){font-size:.75rem}.buttons.are-small .button:not(.is-normal):not(.is-medium):not(.is-large):not(.is-rounded){border-radius:2px}.buttons.are-medium .button:not(.is-small):not(.is-normal):not(.is-large){font-size:1.25rem}.buttons.are-large .button:not(.is-small):not(.is-normal):not(.is-medium){font-size:1.5rem}.buttons.has-addons .button:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}.buttons.has-addons .button:not(:last-child){border-bottom-right-radius:0;border-top-right-radius:0;margin-right:-1px}.buttons.has-addons .button:last-child{margin-right:0}.buttons.has-addons .button:hover,.buttons.has-addons .button.is-hovered{z-index:2}.buttons.has-addons .button:focus,.buttons.has-addons .button.is-focused,.buttons.has-addons .button:active,.buttons.has-addons .button.is-active,.buttons.has-addons .button.is-selected{z-index:3}.buttons.has-addons .button:focus:hover,.buttons.has-addons .button.is-focused:hover,.buttons.has-addons .button:active:hover,.buttons.has-addons .button.is-active:hover,.buttons.has-addons .button.is-selected:hover{z-index:4}.buttons.has-addons .button.is-expanded{flex-grow:1;flex-shrink:1}.buttons.is-centered{justify-content:center}.buttons.is-centered:not(.has-addons) .button:not(.is-fullwidth){margin-left:0.25rem;margin-right:0.25rem}.buttons.is-right{justify-content:flex-end}.buttons.is-right:not(.has-addons) .button:not(.is-fullwidth){margin-left:0.25rem;margin-right:0.25rem}@media screen and (max-width: 768px){.button.is-responsive.is-small,#documenter .docs-sidebar form.docs-search>input.is-responsive{font-size:.5625rem}.button.is-responsive,.button.is-responsive.is-normal{font-size:.65625rem}.button.is-responsive.is-medium{font-size:.75rem}.button.is-responsive.is-large{font-size:1rem}}@media screen and (min-width: 769px) and (max-width: 1055px){.button.is-responsive.is-small,#documenter .docs-sidebar form.docs-search>input.is-responsive{font-size:.65625rem}.button.is-responsive,.button.is-responsive.is-normal{font-size:.75rem}.button.is-responsive.is-medium{font-size:1rem}.button.is-responsive.is-large{font-size:1.25rem}}.container{flex-grow:1;margin:0 auto;position:relative;width:auto}.container.is-fluid{max-width:none !important;padding-left:32px;padding-right:32px;width:100%}@media screen and (min-width: 1056px){.container{max-width:992px}}@media screen and (max-width: 1215px){.container.is-widescreen:not(.is-max-desktop){max-width:1152px}}@media screen and (max-width: 1407px){.container.is-fullhd:not(.is-max-desktop):not(.is-max-widescreen){max-width:1344px}}@media screen and (min-width: 1216px){.container:not(.is-max-desktop){max-width:1152px}}@media screen and (min-width: 1408px){.container:not(.is-max-desktop):not(.is-max-widescreen){max-width:1344px}}.content li+li{margin-top:0.25em}.content p:not(:last-child),.content dl:not(:last-child),.content ol:not(:last-child),.content ul:not(:last-child),.content blockquote:not(:last-child),.content pre:not(:last-child),.content table:not(:last-child){margin-bottom:1em}.content h1,.content h2,.content h3,.content h4,.content h5,.content h6{color:#222;font-weight:600;line-height:1.125}.content h1{font-size:2em;margin-bottom:0.5em}.content h1:not(:first-child){margin-top:1em}.content h2{font-size:1.75em;margin-bottom:0.5714em}.content h2:not(:first-child){margin-top:1.1428em}.content h3{font-size:1.5em;margin-bottom:0.6666em}.content h3:not(:first-child){margin-top:1.3333em}.content h4{font-size:1.25em;margin-bottom:0.8em}.content h5{font-size:1.125em;margin-bottom:0.8888em}.content h6{font-size:1em;margin-bottom:1em}.content blockquote{background-color:#f5f5f5;border-left:5px solid #dbdbdb;padding:1.25em 1.5em}.content ol{list-style-position:outside;margin-left:2em;margin-top:1em}.content ol:not([type]){list-style-type:decimal}.content ol.is-lower-alpha:not([type]){list-style-type:lower-alpha}.content ol.is-lower-roman:not([type]){list-style-type:lower-roman}.content ol.is-upper-alpha:not([type]){list-style-type:upper-alpha}.content ol.is-upper-roman:not([type]){list-style-type:upper-roman}.content ul{list-style:disc outside;margin-left:2em;margin-top:1em}.content ul ul{list-style-type:circle;margin-top:0.5em}.content ul ul ul{list-style-type:square}.content dd{margin-left:2em}.content figure{margin-left:2em;margin-right:2em;text-align:center}.content figure:not(:first-child){margin-top:2em}.content figure:not(:last-child){margin-bottom:2em}.content figure img{display:inline-block}.content figure figcaption{font-style:italic}.content pre{-webkit-overflow-scrolling:touch;overflow-x:auto;padding:0;white-space:pre;word-wrap:normal}.content sup,.content sub{font-size:75%}.content table{width:100%}.content table td,.content table th{border:1px solid #dbdbdb;border-width:0 0 1px;padding:0.5em 0.75em;vertical-align:top}.content table th{color:#222}.content table th:not([align]){text-align:inherit}.content table thead td,.content table thead th{border-width:0 0 2px;color:#222}.content table tfoot td,.content table tfoot th{border-width:2px 0 0;color:#222}.content table tbody tr:last-child td,.content table tbody tr:last-child th{border-bottom-width:0}.content .tabs li+li{margin-top:0}.content.is-small,#documenter .docs-sidebar form.docs-search>input.content{font-size:.75rem}.content.is-normal{font-size:1rem}.content.is-medium{font-size:1.25rem}.content.is-large{font-size:1.5rem}.icon{align-items:center;display:inline-flex;justify-content:center;height:1.5rem;width:1.5rem}.icon.is-small,#documenter .docs-sidebar form.docs-search>input.icon{height:1rem;width:1rem}.icon.is-medium{height:2rem;width:2rem}.icon.is-large{height:3rem;width:3rem}.icon-text{align-items:flex-start;color:inherit;display:inline-flex;flex-wrap:wrap;line-height:1.5rem;vertical-align:top}.icon-text .icon{flex-grow:0;flex-shrink:0}.icon-text .icon:not(:last-child){margin-right:.25em}.icon-text .icon:not(:first-child){margin-left:.25em}div.icon-text{display:flex}.image,#documenter .docs-sidebar .docs-logo>img{display:block;position:relative}.image img,#documenter .docs-sidebar .docs-logo>img img{display:block;height:auto;width:100%}.image img.is-rounded,#documenter .docs-sidebar .docs-logo>img img.is-rounded{border-radius:9999px}.image.is-fullwidth,#documenter .docs-sidebar .docs-logo>img.is-fullwidth{width:100%}.image.is-square img,#documenter .docs-sidebar .docs-logo>img.is-square img,.image.is-square .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-square .has-ratio,.image.is-1by1 img,#documenter .docs-sidebar .docs-logo>img.is-1by1 img,.image.is-1by1 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-1by1 .has-ratio,.image.is-5by4 img,#documenter .docs-sidebar .docs-logo>img.is-5by4 img,.image.is-5by4 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-5by4 .has-ratio,.image.is-4by3 img,#documenter .docs-sidebar .docs-logo>img.is-4by3 img,.image.is-4by3 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-4by3 .has-ratio,.image.is-3by2 img,#documenter .docs-sidebar .docs-logo>img.is-3by2 img,.image.is-3by2 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-3by2 .has-ratio,.image.is-5by3 img,#documenter .docs-sidebar .docs-logo>img.is-5by3 img,.image.is-5by3 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-5by3 .has-ratio,.image.is-16by9 img,#documenter .docs-sidebar .docs-logo>img.is-16by9 img,.image.is-16by9 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-16by9 .has-ratio,.image.is-2by1 img,#documenter .docs-sidebar .docs-logo>img.is-2by1 img,.image.is-2by1 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-2by1 .has-ratio,.image.is-3by1 img,#documenter .docs-sidebar .docs-logo>img.is-3by1 img,.image.is-3by1 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-3by1 .has-ratio,.image.is-4by5 img,#documenter .docs-sidebar .docs-logo>img.is-4by5 img,.image.is-4by5 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-4by5 .has-ratio,.image.is-3by4 img,#documenter .docs-sidebar .docs-logo>img.is-3by4 img,.image.is-3by4 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-3by4 .has-ratio,.image.is-2by3 img,#documenter .docs-sidebar .docs-logo>img.is-2by3 img,.image.is-2by3 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-2by3 .has-ratio,.image.is-3by5 img,#documenter .docs-sidebar .docs-logo>img.is-3by5 img,.image.is-3by5 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-3by5 .has-ratio,.image.is-9by16 img,#documenter .docs-sidebar .docs-logo>img.is-9by16 img,.image.is-9by16 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-9by16 .has-ratio,.image.is-1by2 img,#documenter .docs-sidebar .docs-logo>img.is-1by2 img,.image.is-1by2 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-1by2 .has-ratio,.image.is-1by3 img,#documenter .docs-sidebar .docs-logo>img.is-1by3 img,.image.is-1by3 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-1by3 .has-ratio{height:100%;width:100%}.image.is-square,#documenter .docs-sidebar .docs-logo>img.is-square,.image.is-1by1,#documenter .docs-sidebar .docs-logo>img.is-1by1{padding-top:100%}.image.is-5by4,#documenter .docs-sidebar .docs-logo>img.is-5by4{padding-top:80%}.image.is-4by3,#documenter .docs-sidebar .docs-logo>img.is-4by3{padding-top:75%}.image.is-3by2,#documenter .docs-sidebar .docs-logo>img.is-3by2{padding-top:66.6666%}.image.is-5by3,#documenter .docs-sidebar .docs-logo>img.is-5by3{padding-top:60%}.image.is-16by9,#documenter .docs-sidebar .docs-logo>img.is-16by9{padding-top:56.25%}.image.is-2by1,#documenter .docs-sidebar .docs-logo>img.is-2by1{padding-top:50%}.image.is-3by1,#documenter .docs-sidebar .docs-logo>img.is-3by1{padding-top:33.3333%}.image.is-4by5,#documenter .docs-sidebar .docs-logo>img.is-4by5{padding-top:125%}.image.is-3by4,#documenter .docs-sidebar .docs-logo>img.is-3by4{padding-top:133.3333%}.image.is-2by3,#documenter .docs-sidebar .docs-logo>img.is-2by3{padding-top:150%}.image.is-3by5,#documenter .docs-sidebar .docs-logo>img.is-3by5{padding-top:166.6666%}.image.is-9by16,#documenter .docs-sidebar .docs-logo>img.is-9by16{padding-top:177.7777%}.image.is-1by2,#documenter .docs-sidebar .docs-logo>img.is-1by2{padding-top:200%}.image.is-1by3,#documenter .docs-sidebar .docs-logo>img.is-1by3{padding-top:300%}.image.is-16x16,#documenter .docs-sidebar .docs-logo>img.is-16x16{height:16px;width:16px}.image.is-24x24,#documenter .docs-sidebar .docs-logo>img.is-24x24{height:24px;width:24px}.image.is-32x32,#documenter .docs-sidebar .docs-logo>img.is-32x32{height:32px;width:32px}.image.is-48x48,#documenter .docs-sidebar .docs-logo>img.is-48x48{height:48px;width:48px}.image.is-64x64,#documenter .docs-sidebar .docs-logo>img.is-64x64{height:64px;width:64px}.image.is-96x96,#documenter .docs-sidebar .docs-logo>img.is-96x96{height:96px;width:96px}.image.is-128x128,#documenter .docs-sidebar .docs-logo>img.is-128x128{height:128px;width:128px}.notification{background-color:#f5f5f5;border-radius:4px;position:relative;padding:1.25rem 2.5rem 1.25rem 1.5rem}.notification a:not(.button):not(.dropdown-item){color:currentColor;text-decoration:underline}.notification strong{color:currentColor}.notification code,.notification pre{background:#fff}.notification pre code{background:transparent}.notification>.delete{right:.5rem;position:absolute;top:0.5rem}.notification .title,.notification .subtitle,.notification .content{color:currentColor}.notification.is-white{background-color:#fff;color:#0a0a0a}.notification.is-black{background-color:#0a0a0a;color:#fff}.notification.is-light{background-color:#f5f5f5;color:rgba(0,0,0,0.7)}.notification.is-dark,.content kbd.notification{background-color:#363636;color:#fff}.notification.is-primary,.docstring>section>a.notification.docs-sourcelink{background-color:#4eb5de;color:#fff}.notification.is-primary.is-light,.docstring>section>a.notification.is-light.docs-sourcelink{background-color:#eef8fc;color:#1a6d8e}.notification.is-link{background-color:#2e63b8;color:#fff}.notification.is-link.is-light{background-color:#eff3fb;color:#3169c4}.notification.is-info{background-color:#209cee;color:#fff}.notification.is-info.is-light{background-color:#ecf7fe;color:#0e72b4}.notification.is-success{background-color:#22c35b;color:#fff}.notification.is-success.is-light{background-color:#eefcf3;color:#198f43}.notification.is-warning{background-color:#ffdd57;color:rgba(0,0,0,0.7)}.notification.is-warning.is-light{background-color:#fffbeb;color:#947600}.notification.is-danger{background-color:#da0b00;color:#fff}.notification.is-danger.is-light{background-color:#ffeceb;color:#f50c00}.progress{-moz-appearance:none;-webkit-appearance:none;border:none;border-radius:9999px;display:block;height:1rem;overflow:hidden;padding:0;width:100%}.progress::-webkit-progress-bar{background-color:#ededed}.progress::-webkit-progress-value{background-color:#222}.progress::-moz-progress-bar{background-color:#222}.progress::-ms-fill{background-color:#222;border:none}.progress.is-white::-webkit-progress-value{background-color:#fff}.progress.is-white::-moz-progress-bar{background-color:#fff}.progress.is-white::-ms-fill{background-color:#fff}.progress.is-white:indeterminate{background-image:linear-gradient(to right, #fff 30%, #ededed 30%)}.progress.is-black::-webkit-progress-value{background-color:#0a0a0a}.progress.is-black::-moz-progress-bar{background-color:#0a0a0a}.progress.is-black::-ms-fill{background-color:#0a0a0a}.progress.is-black:indeterminate{background-image:linear-gradient(to right, #0a0a0a 30%, #ededed 30%)}.progress.is-light::-webkit-progress-value{background-color:#f5f5f5}.progress.is-light::-moz-progress-bar{background-color:#f5f5f5}.progress.is-light::-ms-fill{background-color:#f5f5f5}.progress.is-light:indeterminate{background-image:linear-gradient(to right, #f5f5f5 30%, #ededed 30%)}.progress.is-dark::-webkit-progress-value,.content kbd.progress::-webkit-progress-value{background-color:#363636}.progress.is-dark::-moz-progress-bar,.content kbd.progress::-moz-progress-bar{background-color:#363636}.progress.is-dark::-ms-fill,.content kbd.progress::-ms-fill{background-color:#363636}.progress.is-dark:indeterminate,.content kbd.progress:indeterminate{background-image:linear-gradient(to right, #363636 30%, #ededed 30%)}.progress.is-primary::-webkit-progress-value,.docstring>section>a.progress.docs-sourcelink::-webkit-progress-value{background-color:#4eb5de}.progress.is-primary::-moz-progress-bar,.docstring>section>a.progress.docs-sourcelink::-moz-progress-bar{background-color:#4eb5de}.progress.is-primary::-ms-fill,.docstring>section>a.progress.docs-sourcelink::-ms-fill{background-color:#4eb5de}.progress.is-primary:indeterminate,.docstring>section>a.progress.docs-sourcelink:indeterminate{background-image:linear-gradient(to right, #4eb5de 30%, #ededed 30%)}.progress.is-link::-webkit-progress-value{background-color:#2e63b8}.progress.is-link::-moz-progress-bar{background-color:#2e63b8}.progress.is-link::-ms-fill{background-color:#2e63b8}.progress.is-link:indeterminate{background-image:linear-gradient(to right, #2e63b8 30%, #ededed 30%)}.progress.is-info::-webkit-progress-value{background-color:#209cee}.progress.is-info::-moz-progress-bar{background-color:#209cee}.progress.is-info::-ms-fill{background-color:#209cee}.progress.is-info:indeterminate{background-image:linear-gradient(to right, #209cee 30%, #ededed 30%)}.progress.is-success::-webkit-progress-value{background-color:#22c35b}.progress.is-success::-moz-progress-bar{background-color:#22c35b}.progress.is-success::-ms-fill{background-color:#22c35b}.progress.is-success:indeterminate{background-image:linear-gradient(to right, #22c35b 30%, #ededed 30%)}.progress.is-warning::-webkit-progress-value{background-color:#ffdd57}.progress.is-warning::-moz-progress-bar{background-color:#ffdd57}.progress.is-warning::-ms-fill{background-color:#ffdd57}.progress.is-warning:indeterminate{background-image:linear-gradient(to right, #ffdd57 30%, #ededed 30%)}.progress.is-danger::-webkit-progress-value{background-color:#da0b00}.progress.is-danger::-moz-progress-bar{background-color:#da0b00}.progress.is-danger::-ms-fill{background-color:#da0b00}.progress.is-danger:indeterminate{background-image:linear-gradient(to right, #da0b00 30%, #ededed 30%)}.progress:indeterminate{animation-duration:1.5s;animation-iteration-count:infinite;animation-name:moveIndeterminate;animation-timing-function:linear;background-color:#ededed;background-image:linear-gradient(to right, #222 30%, #ededed 30%);background-position:top left;background-repeat:no-repeat;background-size:150% 150%}.progress:indeterminate::-webkit-progress-bar{background-color:transparent}.progress:indeterminate::-moz-progress-bar{background-color:transparent}.progress:indeterminate::-ms-fill{animation-name:none}.progress.is-small,#documenter .docs-sidebar form.docs-search>input.progress{height:.75rem}.progress.is-medium{height:1.25rem}.progress.is-large{height:1.5rem}@keyframes moveIndeterminate{from{background-position:200% 0}to{background-position:-200% 0}}.table{background-color:#fff;color:#222}.table td,.table th{border:1px solid #dbdbdb;border-width:0 0 1px;padding:0.5em 0.75em;vertical-align:top}.table td.is-white,.table th.is-white{background-color:#fff;border-color:#fff;color:#0a0a0a}.table td.is-black,.table th.is-black{background-color:#0a0a0a;border-color:#0a0a0a;color:#fff}.table td.is-light,.table th.is-light{background-color:#f5f5f5;border-color:#f5f5f5;color:rgba(0,0,0,0.7)}.table td.is-dark,.table th.is-dark{background-color:#363636;border-color:#363636;color:#fff}.table td.is-primary,.table th.is-primary{background-color:#4eb5de;border-color:#4eb5de;color:#fff}.table td.is-link,.table th.is-link{background-color:#2e63b8;border-color:#2e63b8;color:#fff}.table td.is-info,.table th.is-info{background-color:#209cee;border-color:#209cee;color:#fff}.table td.is-success,.table th.is-success{background-color:#22c35b;border-color:#22c35b;color:#fff}.table td.is-warning,.table th.is-warning{background-color:#ffdd57;border-color:#ffdd57;color:rgba(0,0,0,0.7)}.table td.is-danger,.table th.is-danger{background-color:#da0b00;border-color:#da0b00;color:#fff}.table td.is-narrow,.table th.is-narrow{white-space:nowrap;width:1%}.table td.is-selected,.table th.is-selected{background-color:#4eb5de;color:#fff}.table td.is-selected a,.table td.is-selected strong,.table th.is-selected a,.table th.is-selected strong{color:currentColor}.table td.is-vcentered,.table th.is-vcentered{vertical-align:middle}.table th{color:#222}.table th:not([align]){text-align:left}.table tr.is-selected{background-color:#4eb5de;color:#fff}.table tr.is-selected a,.table tr.is-selected strong{color:currentColor}.table tr.is-selected td,.table tr.is-selected th{border-color:#fff;color:currentColor}.table thead{background-color:rgba(0,0,0,0)}.table thead td,.table thead th{border-width:0 0 2px;color:#222}.table tfoot{background-color:rgba(0,0,0,0)}.table tfoot td,.table tfoot th{border-width:2px 0 0;color:#222}.table tbody{background-color:rgba(0,0,0,0)}.table tbody tr:last-child td,.table tbody tr:last-child th{border-bottom-width:0}.table.is-bordered td,.table.is-bordered th{border-width:1px}.table.is-bordered tr:last-child td,.table.is-bordered tr:last-child th{border-bottom-width:1px}.table.is-fullwidth{width:100%}.table.is-hoverable tbody tr:not(.is-selected):hover{background-color:#fafafa}.table.is-hoverable.is-striped tbody tr:not(.is-selected):hover{background-color:#fafafa}.table.is-hoverable.is-striped tbody tr:not(.is-selected):hover:nth-child(even){background-color:#f5f5f5}.table.is-narrow td,.table.is-narrow th{padding:0.25em 0.5em}.table.is-striped tbody tr:not(.is-selected):nth-child(even){background-color:#fafafa}.table-container{-webkit-overflow-scrolling:touch;overflow:auto;overflow-y:hidden;max-width:100%}.tags{align-items:center;display:flex;flex-wrap:wrap;justify-content:flex-start}.tags .tag,.tags .content kbd,.content .tags kbd,.tags .docstring>section>a.docs-sourcelink{margin-bottom:0.5rem}.tags .tag:not(:last-child),.tags .content kbd:not(:last-child),.content .tags kbd:not(:last-child),.tags .docstring>section>a.docs-sourcelink:not(:last-child){margin-right:.5rem}.tags:last-child{margin-bottom:-0.5rem}.tags:not(:last-child){margin-bottom:1rem}.tags.are-medium .tag:not(.is-normal):not(.is-large),.tags.are-medium .content kbd:not(.is-normal):not(.is-large),.content .tags.are-medium kbd:not(.is-normal):not(.is-large),.tags.are-medium .docstring>section>a.docs-sourcelink:not(.is-normal):not(.is-large){font-size:1rem}.tags.are-large .tag:not(.is-normal):not(.is-medium),.tags.are-large .content kbd:not(.is-normal):not(.is-medium),.content .tags.are-large kbd:not(.is-normal):not(.is-medium),.tags.are-large .docstring>section>a.docs-sourcelink:not(.is-normal):not(.is-medium){font-size:1.25rem}.tags.is-centered{justify-content:center}.tags.is-centered .tag,.tags.is-centered .content kbd,.content .tags.is-centered kbd,.tags.is-centered .docstring>section>a.docs-sourcelink{margin-right:0.25rem;margin-left:0.25rem}.tags.is-right{justify-content:flex-end}.tags.is-right .tag:not(:first-child),.tags.is-right .content kbd:not(:first-child),.content .tags.is-right kbd:not(:first-child),.tags.is-right .docstring>section>a.docs-sourcelink:not(:first-child){margin-left:0.5rem}.tags.is-right .tag:not(:last-child),.tags.is-right .content kbd:not(:last-child),.content .tags.is-right kbd:not(:last-child),.tags.is-right .docstring>section>a.docs-sourcelink:not(:last-child){margin-right:0}.tags.has-addons .tag,.tags.has-addons .content kbd,.content .tags.has-addons kbd,.tags.has-addons .docstring>section>a.docs-sourcelink{margin-right:0}.tags.has-addons .tag:not(:first-child),.tags.has-addons .content kbd:not(:first-child),.content .tags.has-addons kbd:not(:first-child),.tags.has-addons .docstring>section>a.docs-sourcelink:not(:first-child){margin-left:0;border-top-left-radius:0;border-bottom-left-radius:0}.tags.has-addons .tag:not(:last-child),.tags.has-addons .content kbd:not(:last-child),.content .tags.has-addons kbd:not(:last-child),.tags.has-addons .docstring>section>a.docs-sourcelink:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.tag:not(body),.content kbd:not(body),.docstring>section>a.docs-sourcelink:not(body){align-items:center;background-color:#f5f5f5;border-radius:4px;color:#222;display:inline-flex;font-size:.75rem;height:2em;justify-content:center;line-height:1.5;padding-left:0.75em;padding-right:0.75em;white-space:nowrap}.tag:not(body) .delete,.content kbd:not(body) .delete,.docstring>section>a.docs-sourcelink:not(body) .delete{margin-left:.25rem;margin-right:-.375rem}.tag.is-white:not(body),.content kbd.is-white:not(body),.docstring>section>a.docs-sourcelink.is-white:not(body){background-color:#fff;color:#0a0a0a}.tag.is-black:not(body),.content kbd.is-black:not(body),.docstring>section>a.docs-sourcelink.is-black:not(body){background-color:#0a0a0a;color:#fff}.tag.is-light:not(body),.content kbd.is-light:not(body),.docstring>section>a.docs-sourcelink.is-light:not(body){background-color:#f5f5f5;color:rgba(0,0,0,0.7)}.tag.is-dark:not(body),.content kbd:not(body),.docstring>section>a.docs-sourcelink.is-dark:not(body),.content .docstring>section>kbd:not(body){background-color:#363636;color:#fff}.tag.is-primary:not(body),.content kbd.is-primary:not(body),.docstring>section>a.docs-sourcelink:not(body){background-color:#4eb5de;color:#fff}.tag.is-primary.is-light:not(body),.content kbd.is-primary.is-light:not(body),.docstring>section>a.docs-sourcelink.is-light:not(body){background-color:#eef8fc;color:#1a6d8e}.tag.is-link:not(body),.content kbd.is-link:not(body),.docstring>section>a.docs-sourcelink.is-link:not(body){background-color:#2e63b8;color:#fff}.tag.is-link.is-light:not(body),.content kbd.is-link.is-light:not(body),.docstring>section>a.docs-sourcelink.is-link.is-light:not(body){background-color:#eff3fb;color:#3169c4}.tag.is-info:not(body),.content kbd.is-info:not(body),.docstring>section>a.docs-sourcelink.is-info:not(body){background-color:#209cee;color:#fff}.tag.is-info.is-light:not(body),.content kbd.is-info.is-light:not(body),.docstring>section>a.docs-sourcelink.is-info.is-light:not(body){background-color:#ecf7fe;color:#0e72b4}.tag.is-success:not(body),.content kbd.is-success:not(body),.docstring>section>a.docs-sourcelink.is-success:not(body){background-color:#22c35b;color:#fff}.tag.is-success.is-light:not(body),.content kbd.is-success.is-light:not(body),.docstring>section>a.docs-sourcelink.is-success.is-light:not(body){background-color:#eefcf3;color:#198f43}.tag.is-warning:not(body),.content kbd.is-warning:not(body),.docstring>section>a.docs-sourcelink.is-warning:not(body){background-color:#ffdd57;color:rgba(0,0,0,0.7)}.tag.is-warning.is-light:not(body),.content kbd.is-warning.is-light:not(body),.docstring>section>a.docs-sourcelink.is-warning.is-light:not(body){background-color:#fffbeb;color:#947600}.tag.is-danger:not(body),.content kbd.is-danger:not(body),.docstring>section>a.docs-sourcelink.is-danger:not(body){background-color:#da0b00;color:#fff}.tag.is-danger.is-light:not(body),.content kbd.is-danger.is-light:not(body),.docstring>section>a.docs-sourcelink.is-danger.is-light:not(body){background-color:#ffeceb;color:#f50c00}.tag.is-normal:not(body),.content kbd.is-normal:not(body),.docstring>section>a.docs-sourcelink.is-normal:not(body){font-size:.75rem}.tag.is-medium:not(body),.content kbd.is-medium:not(body),.docstring>section>a.docs-sourcelink.is-medium:not(body){font-size:1rem}.tag.is-large:not(body),.content kbd.is-large:not(body),.docstring>section>a.docs-sourcelink.is-large:not(body){font-size:1.25rem}.tag:not(body) .icon:first-child:not(:last-child),.content kbd:not(body) .icon:first-child:not(:last-child),.docstring>section>a.docs-sourcelink:not(body) .icon:first-child:not(:last-child){margin-left:-.375em;margin-right:.1875em}.tag:not(body) .icon:last-child:not(:first-child),.content kbd:not(body) .icon:last-child:not(:first-child),.docstring>section>a.docs-sourcelink:not(body) .icon:last-child:not(:first-child){margin-left:.1875em;margin-right:-.375em}.tag:not(body) .icon:first-child:last-child,.content kbd:not(body) .icon:first-child:last-child,.docstring>section>a.docs-sourcelink:not(body) .icon:first-child:last-child{margin-left:-.375em;margin-right:-.375em}.tag.is-delete:not(body),.content kbd.is-delete:not(body),.docstring>section>a.docs-sourcelink.is-delete:not(body){margin-left:1px;padding:0;position:relative;width:2em}.tag.is-delete:not(body)::before,.content kbd.is-delete:not(body)::before,.docstring>section>a.docs-sourcelink.is-delete:not(body)::before,.tag.is-delete:not(body)::after,.content kbd.is-delete:not(body)::after,.docstring>section>a.docs-sourcelink.is-delete:not(body)::after{background-color:currentColor;content:"";display:block;left:50%;position:absolute;top:50%;transform:translateX(-50%) translateY(-50%) rotate(45deg);transform-origin:center center}.tag.is-delete:not(body)::before,.content kbd.is-delete:not(body)::before,.docstring>section>a.docs-sourcelink.is-delete:not(body)::before{height:1px;width:50%}.tag.is-delete:not(body)::after,.content kbd.is-delete:not(body)::after,.docstring>section>a.docs-sourcelink.is-delete:not(body)::after{height:50%;width:1px}.tag.is-delete:not(body):hover,.content kbd.is-delete:not(body):hover,.docstring>section>a.docs-sourcelink.is-delete:not(body):hover,.tag.is-delete:not(body):focus,.content kbd.is-delete:not(body):focus,.docstring>section>a.docs-sourcelink.is-delete:not(body):focus{background-color:#e8e8e8}.tag.is-delete:not(body):active,.content kbd.is-delete:not(body):active,.docstring>section>a.docs-sourcelink.is-delete:not(body):active{background-color:#dbdbdb}.tag.is-rounded:not(body),#documenter .docs-sidebar form.docs-search>input:not(body),.content kbd.is-rounded:not(body),#documenter .docs-sidebar .content form.docs-search>input:not(body),.docstring>section>a.docs-sourcelink.is-rounded:not(body){border-radius:9999px}a.tag:hover,.docstring>section>a.docs-sourcelink:hover{text-decoration:underline}.title,.subtitle{word-break:break-word}.title em,.title span,.subtitle em,.subtitle span{font-weight:inherit}.title sub,.subtitle sub{font-size:.75em}.title sup,.subtitle sup{font-size:.75em}.title .tag,.title .content kbd,.content .title kbd,.title .docstring>section>a.docs-sourcelink,.subtitle .tag,.subtitle .content kbd,.content .subtitle kbd,.subtitle .docstring>section>a.docs-sourcelink{vertical-align:middle}.title{color:#222;font-size:2rem;font-weight:600;line-height:1.125}.title strong{color:inherit;font-weight:inherit}.title:not(.is-spaced)+.subtitle{margin-top:-1.25rem}.title.is-1{font-size:3rem}.title.is-2{font-size:2.5rem}.title.is-3{font-size:2rem}.title.is-4{font-size:1.5rem}.title.is-5{font-size:1.25rem}.title.is-6{font-size:1rem}.title.is-7{font-size:.75rem}.subtitle{color:#222;font-size:1.25rem;font-weight:400;line-height:1.25}.subtitle strong{color:#222;font-weight:600}.subtitle:not(.is-spaced)+.title{margin-top:-1.25rem}.subtitle.is-1{font-size:3rem}.subtitle.is-2{font-size:2.5rem}.subtitle.is-3{font-size:2rem}.subtitle.is-4{font-size:1.5rem}.subtitle.is-5{font-size:1.25rem}.subtitle.is-6{font-size:1rem}.subtitle.is-7{font-size:.75rem}.heading{display:block;font-size:11px;letter-spacing:1px;margin-bottom:5px;text-transform:uppercase}.number{align-items:center;background-color:#f5f5f5;border-radius:9999px;display:inline-flex;font-size:1.25rem;height:2em;justify-content:center;margin-right:1.5rem;min-width:2.5em;padding:0.25rem 0.5rem;text-align:center;vertical-align:top}.select select,.textarea,.input,#documenter .docs-sidebar form.docs-search>input{background-color:#fff;border-color:#dbdbdb;border-radius:4px;color:#222}.select select::-moz-placeholder,.textarea::-moz-placeholder,.input::-moz-placeholder,#documenter .docs-sidebar form.docs-search>input::-moz-placeholder{color:#707070}.select select::-webkit-input-placeholder,.textarea::-webkit-input-placeholder,.input::-webkit-input-placeholder,#documenter .docs-sidebar form.docs-search>input::-webkit-input-placeholder{color:#707070}.select select:-moz-placeholder,.textarea:-moz-placeholder,.input:-moz-placeholder,#documenter .docs-sidebar form.docs-search>input:-moz-placeholder{color:#707070}.select select:-ms-input-placeholder,.textarea:-ms-input-placeholder,.input:-ms-input-placeholder,#documenter .docs-sidebar form.docs-search>input:-ms-input-placeholder{color:#707070}.select select:hover,.textarea:hover,.input:hover,#documenter .docs-sidebar form.docs-search>input:hover,.select select.is-hovered,.is-hovered.textarea,.is-hovered.input,#documenter .docs-sidebar form.docs-search>input.is-hovered{border-color:#b5b5b5}.select select:focus,.textarea:focus,.input:focus,#documenter .docs-sidebar form.docs-search>input:focus,.select select.is-focused,.is-focused.textarea,.is-focused.input,#documenter .docs-sidebar form.docs-search>input.is-focused,.select select:active,.textarea:active,.input:active,#documenter .docs-sidebar form.docs-search>input:active,.select select.is-active,.is-active.textarea,.is-active.input,#documenter .docs-sidebar form.docs-search>input.is-active{border-color:#2e63b8;box-shadow:0 0 0 0.125em rgba(46,99,184,0.25)}.select select[disabled],.textarea[disabled],.input[disabled],#documenter .docs-sidebar form.docs-search>input[disabled],fieldset[disabled] .select select,.select fieldset[disabled] select,fieldset[disabled] .textarea,fieldset[disabled] .input,fieldset[disabled] #documenter .docs-sidebar form.docs-search>input,#documenter .docs-sidebar fieldset[disabled] form.docs-search>input{background-color:#f5f5f5;border-color:#f5f5f5;box-shadow:none;color:#6b6b6b}.select select[disabled]::-moz-placeholder,.textarea[disabled]::-moz-placeholder,.input[disabled]::-moz-placeholder,#documenter .docs-sidebar form.docs-search>input[disabled]::-moz-placeholder,fieldset[disabled] .select select::-moz-placeholder,.select fieldset[disabled] select::-moz-placeholder,fieldset[disabled] .textarea::-moz-placeholder,fieldset[disabled] .input::-moz-placeholder,fieldset[disabled] #documenter .docs-sidebar form.docs-search>input::-moz-placeholder,#documenter .docs-sidebar fieldset[disabled] form.docs-search>input::-moz-placeholder{color:rgba(107,107,107,0.3)}.select select[disabled]::-webkit-input-placeholder,.textarea[disabled]::-webkit-input-placeholder,.input[disabled]::-webkit-input-placeholder,#documenter .docs-sidebar form.docs-search>input[disabled]::-webkit-input-placeholder,fieldset[disabled] .select select::-webkit-input-placeholder,.select fieldset[disabled] select::-webkit-input-placeholder,fieldset[disabled] .textarea::-webkit-input-placeholder,fieldset[disabled] .input::-webkit-input-placeholder,fieldset[disabled] #documenter .docs-sidebar form.docs-search>input::-webkit-input-placeholder,#documenter .docs-sidebar fieldset[disabled] form.docs-search>input::-webkit-input-placeholder{color:rgba(107,107,107,0.3)}.select select[disabled]:-moz-placeholder,.textarea[disabled]:-moz-placeholder,.input[disabled]:-moz-placeholder,#documenter .docs-sidebar form.docs-search>input[disabled]:-moz-placeholder,fieldset[disabled] .select select:-moz-placeholder,.select fieldset[disabled] select:-moz-placeholder,fieldset[disabled] .textarea:-moz-placeholder,fieldset[disabled] .input:-moz-placeholder,fieldset[disabled] #documenter .docs-sidebar form.docs-search>input:-moz-placeholder,#documenter .docs-sidebar fieldset[disabled] form.docs-search>input:-moz-placeholder{color:rgba(107,107,107,0.3)}.select select[disabled]:-ms-input-placeholder,.textarea[disabled]:-ms-input-placeholder,.input[disabled]:-ms-input-placeholder,#documenter .docs-sidebar form.docs-search>input[disabled]:-ms-input-placeholder,fieldset[disabled] .select select:-ms-input-placeholder,.select fieldset[disabled] select:-ms-input-placeholder,fieldset[disabled] .textarea:-ms-input-placeholder,fieldset[disabled] .input:-ms-input-placeholder,fieldset[disabled] #documenter .docs-sidebar form.docs-search>input:-ms-input-placeholder,#documenter .docs-sidebar fieldset[disabled] form.docs-search>input:-ms-input-placeholder{color:rgba(107,107,107,0.3)}.textarea,.input,#documenter .docs-sidebar form.docs-search>input{box-shadow:inset 0 0.0625em 0.125em rgba(10,10,10,0.05);max-width:100%;width:100%}.textarea[readonly],.input[readonly],#documenter .docs-sidebar form.docs-search>input[readonly]{box-shadow:none}.is-white.textarea,.is-white.input,#documenter .docs-sidebar form.docs-search>input.is-white{border-color:#fff}.is-white.textarea:focus,.is-white.input:focus,#documenter .docs-sidebar form.docs-search>input.is-white:focus,.is-white.is-focused.textarea,.is-white.is-focused.input,#documenter .docs-sidebar form.docs-search>input.is-focused,.is-white.textarea:active,.is-white.input:active,#documenter .docs-sidebar form.docs-search>input.is-white:active,.is-white.is-active.textarea,.is-white.is-active.input,#documenter .docs-sidebar form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(255,255,255,0.25)}.is-black.textarea,.is-black.input,#documenter .docs-sidebar form.docs-search>input.is-black{border-color:#0a0a0a}.is-black.textarea:focus,.is-black.input:focus,#documenter .docs-sidebar form.docs-search>input.is-black:focus,.is-black.is-focused.textarea,.is-black.is-focused.input,#documenter .docs-sidebar form.docs-search>input.is-focused,.is-black.textarea:active,.is-black.input:active,#documenter .docs-sidebar form.docs-search>input.is-black:active,.is-black.is-active.textarea,.is-black.is-active.input,#documenter .docs-sidebar form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(10,10,10,0.25)}.is-light.textarea,.is-light.input,#documenter .docs-sidebar form.docs-search>input.is-light{border-color:#f5f5f5}.is-light.textarea:focus,.is-light.input:focus,#documenter .docs-sidebar form.docs-search>input.is-light:focus,.is-light.is-focused.textarea,.is-light.is-focused.input,#documenter .docs-sidebar form.docs-search>input.is-focused,.is-light.textarea:active,.is-light.input:active,#documenter .docs-sidebar form.docs-search>input.is-light:active,.is-light.is-active.textarea,.is-light.is-active.input,#documenter .docs-sidebar form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(245,245,245,0.25)}.is-dark.textarea,.content kbd.textarea,.is-dark.input,#documenter .docs-sidebar form.docs-search>input.is-dark,.content kbd.input{border-color:#363636}.is-dark.textarea:focus,.content kbd.textarea:focus,.is-dark.input:focus,#documenter .docs-sidebar form.docs-search>input.is-dark:focus,.content kbd.input:focus,.is-dark.is-focused.textarea,.content kbd.is-focused.textarea,.is-dark.is-focused.input,#documenter .docs-sidebar form.docs-search>input.is-focused,.content kbd.is-focused.input,#documenter .docs-sidebar .content form.docs-search>input.is-focused,.is-dark.textarea:active,.content kbd.textarea:active,.is-dark.input:active,#documenter .docs-sidebar form.docs-search>input.is-dark:active,.content kbd.input:active,.is-dark.is-active.textarea,.content kbd.is-active.textarea,.is-dark.is-active.input,#documenter .docs-sidebar form.docs-search>input.is-active,.content kbd.is-active.input,#documenter .docs-sidebar .content form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(54,54,54,0.25)}.is-primary.textarea,.docstring>section>a.textarea.docs-sourcelink,.is-primary.input,#documenter .docs-sidebar form.docs-search>input.is-primary,.docstring>section>a.input.docs-sourcelink{border-color:#4eb5de}.is-primary.textarea:focus,.docstring>section>a.textarea.docs-sourcelink:focus,.is-primary.input:focus,#documenter .docs-sidebar form.docs-search>input.is-primary:focus,.docstring>section>a.input.docs-sourcelink:focus,.is-primary.is-focused.textarea,.docstring>section>a.is-focused.textarea.docs-sourcelink,.is-primary.is-focused.input,#documenter .docs-sidebar form.docs-search>input.is-focused,.docstring>section>a.is-focused.input.docs-sourcelink,.is-primary.textarea:active,.docstring>section>a.textarea.docs-sourcelink:active,.is-primary.input:active,#documenter .docs-sidebar form.docs-search>input.is-primary:active,.docstring>section>a.input.docs-sourcelink:active,.is-primary.is-active.textarea,.docstring>section>a.is-active.textarea.docs-sourcelink,.is-primary.is-active.input,#documenter .docs-sidebar form.docs-search>input.is-active,.docstring>section>a.is-active.input.docs-sourcelink{box-shadow:0 0 0 0.125em rgba(78,181,222,0.25)}.is-link.textarea,.is-link.input,#documenter .docs-sidebar form.docs-search>input.is-link{border-color:#2e63b8}.is-link.textarea:focus,.is-link.input:focus,#documenter .docs-sidebar form.docs-search>input.is-link:focus,.is-link.is-focused.textarea,.is-link.is-focused.input,#documenter .docs-sidebar form.docs-search>input.is-focused,.is-link.textarea:active,.is-link.input:active,#documenter .docs-sidebar form.docs-search>input.is-link:active,.is-link.is-active.textarea,.is-link.is-active.input,#documenter .docs-sidebar form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(46,99,184,0.25)}.is-info.textarea,.is-info.input,#documenter .docs-sidebar form.docs-search>input.is-info{border-color:#209cee}.is-info.textarea:focus,.is-info.input:focus,#documenter .docs-sidebar form.docs-search>input.is-info:focus,.is-info.is-focused.textarea,.is-info.is-focused.input,#documenter .docs-sidebar form.docs-search>input.is-focused,.is-info.textarea:active,.is-info.input:active,#documenter .docs-sidebar form.docs-search>input.is-info:active,.is-info.is-active.textarea,.is-info.is-active.input,#documenter .docs-sidebar form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(32,156,238,0.25)}.is-success.textarea,.is-success.input,#documenter .docs-sidebar form.docs-search>input.is-success{border-color:#22c35b}.is-success.textarea:focus,.is-success.input:focus,#documenter .docs-sidebar form.docs-search>input.is-success:focus,.is-success.is-focused.textarea,.is-success.is-focused.input,#documenter .docs-sidebar form.docs-search>input.is-focused,.is-success.textarea:active,.is-success.input:active,#documenter .docs-sidebar form.docs-search>input.is-success:active,.is-success.is-active.textarea,.is-success.is-active.input,#documenter .docs-sidebar form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(34,195,91,0.25)}.is-warning.textarea,.is-warning.input,#documenter .docs-sidebar form.docs-search>input.is-warning{border-color:#ffdd57}.is-warning.textarea:focus,.is-warning.input:focus,#documenter .docs-sidebar form.docs-search>input.is-warning:focus,.is-warning.is-focused.textarea,.is-warning.is-focused.input,#documenter .docs-sidebar form.docs-search>input.is-focused,.is-warning.textarea:active,.is-warning.input:active,#documenter .docs-sidebar form.docs-search>input.is-warning:active,.is-warning.is-active.textarea,.is-warning.is-active.input,#documenter .docs-sidebar form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(255,221,87,0.25)}.is-danger.textarea,.is-danger.input,#documenter .docs-sidebar form.docs-search>input.is-danger{border-color:#da0b00}.is-danger.textarea:focus,.is-danger.input:focus,#documenter .docs-sidebar form.docs-search>input.is-danger:focus,.is-danger.is-focused.textarea,.is-danger.is-focused.input,#documenter .docs-sidebar form.docs-search>input.is-focused,.is-danger.textarea:active,.is-danger.input:active,#documenter .docs-sidebar form.docs-search>input.is-danger:active,.is-danger.is-active.textarea,.is-danger.is-active.input,#documenter .docs-sidebar form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(218,11,0,0.25)}.is-small.textarea,.is-small.input,#documenter .docs-sidebar form.docs-search>input{border-radius:2px;font-size:.75rem}.is-medium.textarea,.is-medium.input,#documenter .docs-sidebar form.docs-search>input.is-medium{font-size:1.25rem}.is-large.textarea,.is-large.input,#documenter .docs-sidebar form.docs-search>input.is-large{font-size:1.5rem}.is-fullwidth.textarea,.is-fullwidth.input,#documenter .docs-sidebar form.docs-search>input.is-fullwidth{display:block;width:100%}.is-inline.textarea,.is-inline.input,#documenter .docs-sidebar form.docs-search>input.is-inline{display:inline;width:auto}.input.is-rounded,#documenter .docs-sidebar form.docs-search>input{border-radius:9999px;padding-left:calc(calc(0.75em - 1px) + 0.375em);padding-right:calc(calc(0.75em - 1px) + 0.375em)}.input.is-static,#documenter .docs-sidebar form.docs-search>input.is-static{background-color:transparent;border-color:transparent;box-shadow:none;padding-left:0;padding-right:0}.textarea{display:block;max-width:100%;min-width:100%;padding:calc(0.75em - 1px);resize:vertical}.textarea:not([rows]){max-height:40em;min-height:8em}.textarea[rows]{height:initial}.textarea.has-fixed-size{resize:none}.radio,.checkbox{cursor:pointer;display:inline-block;line-height:1.25;position:relative}.radio input,.checkbox input{cursor:pointer}.radio:hover,.checkbox:hover{color:#222}.radio[disabled],.checkbox[disabled],fieldset[disabled] .radio,fieldset[disabled] .checkbox,.radio input[disabled],.checkbox input[disabled]{color:#6b6b6b;cursor:not-allowed}.radio+.radio{margin-left:.5em}.select{display:inline-block;max-width:100%;position:relative;vertical-align:top}.select:not(.is-multiple){height:2.5em}.select:not(.is-multiple):not(.is-loading)::after{border-color:#2e63b8;right:1.125em;z-index:4}.select.is-rounded select,#documenter .docs-sidebar form.docs-search>input.select select{border-radius:9999px;padding-left:1em}.select select{cursor:pointer;display:block;font-size:1em;max-width:100%;outline:none}.select select::-ms-expand{display:none}.select select[disabled]:hover,fieldset[disabled] .select select:hover{border-color:#f5f5f5}.select select:not([multiple]){padding-right:2.5em}.select select[multiple]{height:auto;padding:0}.select select[multiple] option{padding:0.5em 1em}.select:not(.is-multiple):not(.is-loading):hover::after{border-color:#222}.select.is-white:not(:hover)::after{border-color:#fff}.select.is-white select{border-color:#fff}.select.is-white select:hover,.select.is-white select.is-hovered{border-color:#f2f2f2}.select.is-white select:focus,.select.is-white select.is-focused,.select.is-white select:active,.select.is-white select.is-active{box-shadow:0 0 0 0.125em rgba(255,255,255,0.25)}.select.is-black:not(:hover)::after{border-color:#0a0a0a}.select.is-black select{border-color:#0a0a0a}.select.is-black select:hover,.select.is-black select.is-hovered{border-color:#000}.select.is-black select:focus,.select.is-black select.is-focused,.select.is-black select:active,.select.is-black select.is-active{box-shadow:0 0 0 0.125em rgba(10,10,10,0.25)}.select.is-light:not(:hover)::after{border-color:#f5f5f5}.select.is-light select{border-color:#f5f5f5}.select.is-light select:hover,.select.is-light select.is-hovered{border-color:#e8e8e8}.select.is-light select:focus,.select.is-light select.is-focused,.select.is-light select:active,.select.is-light select.is-active{box-shadow:0 0 0 0.125em rgba(245,245,245,0.25)}.select.is-dark:not(:hover)::after,.content kbd.select:not(:hover)::after{border-color:#363636}.select.is-dark select,.content kbd.select select{border-color:#363636}.select.is-dark select:hover,.content kbd.select select:hover,.select.is-dark select.is-hovered,.content kbd.select select.is-hovered{border-color:#292929}.select.is-dark select:focus,.content kbd.select select:focus,.select.is-dark select.is-focused,.content kbd.select select.is-focused,.select.is-dark select:active,.content kbd.select select:active,.select.is-dark select.is-active,.content kbd.select select.is-active{box-shadow:0 0 0 0.125em rgba(54,54,54,0.25)}.select.is-primary:not(:hover)::after,.docstring>section>a.select.docs-sourcelink:not(:hover)::after{border-color:#4eb5de}.select.is-primary select,.docstring>section>a.select.docs-sourcelink select{border-color:#4eb5de}.select.is-primary select:hover,.docstring>section>a.select.docs-sourcelink select:hover,.select.is-primary select.is-hovered,.docstring>section>a.select.docs-sourcelink select.is-hovered{border-color:#39acda}.select.is-primary select:focus,.docstring>section>a.select.docs-sourcelink select:focus,.select.is-primary select.is-focused,.docstring>section>a.select.docs-sourcelink select.is-focused,.select.is-primary select:active,.docstring>section>a.select.docs-sourcelink select:active,.select.is-primary select.is-active,.docstring>section>a.select.docs-sourcelink select.is-active{box-shadow:0 0 0 0.125em rgba(78,181,222,0.25)}.select.is-link:not(:hover)::after{border-color:#2e63b8}.select.is-link select{border-color:#2e63b8}.select.is-link select:hover,.select.is-link select.is-hovered{border-color:#2958a4}.select.is-link select:focus,.select.is-link select.is-focused,.select.is-link select:active,.select.is-link select.is-active{box-shadow:0 0 0 0.125em rgba(46,99,184,0.25)}.select.is-info:not(:hover)::after{border-color:#209cee}.select.is-info select{border-color:#209cee}.select.is-info select:hover,.select.is-info select.is-hovered{border-color:#1190e3}.select.is-info select:focus,.select.is-info select.is-focused,.select.is-info select:active,.select.is-info select.is-active{box-shadow:0 0 0 0.125em rgba(32,156,238,0.25)}.select.is-success:not(:hover)::after{border-color:#22c35b}.select.is-success select{border-color:#22c35b}.select.is-success select:hover,.select.is-success select.is-hovered{border-color:#1ead51}.select.is-success select:focus,.select.is-success select.is-focused,.select.is-success select:active,.select.is-success select.is-active{box-shadow:0 0 0 0.125em rgba(34,195,91,0.25)}.select.is-warning:not(:hover)::after{border-color:#ffdd57}.select.is-warning select{border-color:#ffdd57}.select.is-warning select:hover,.select.is-warning select.is-hovered{border-color:#ffd83e}.select.is-warning select:focus,.select.is-warning select.is-focused,.select.is-warning select:active,.select.is-warning select.is-active{box-shadow:0 0 0 0.125em rgba(255,221,87,0.25)}.select.is-danger:not(:hover)::after{border-color:#da0b00}.select.is-danger select{border-color:#da0b00}.select.is-danger select:hover,.select.is-danger select.is-hovered{border-color:#c10a00}.select.is-danger select:focus,.select.is-danger select.is-focused,.select.is-danger select:active,.select.is-danger select.is-active{box-shadow:0 0 0 0.125em rgba(218,11,0,0.25)}.select.is-small,#documenter .docs-sidebar form.docs-search>input.select{border-radius:2px;font-size:.75rem}.select.is-medium{font-size:1.25rem}.select.is-large{font-size:1.5rem}.select.is-disabled::after{border-color:#6b6b6b !important;opacity:0.5}.select.is-fullwidth{width:100%}.select.is-fullwidth select{width:100%}.select.is-loading::after{margin-top:0;position:absolute;right:.625em;top:0.625em;transform:none}.select.is-loading.is-small:after,#documenter .docs-sidebar form.docs-search>input.is-loading:after{font-size:.75rem}.select.is-loading.is-medium:after{font-size:1.25rem}.select.is-loading.is-large:after{font-size:1.5rem}.file{align-items:stretch;display:flex;justify-content:flex-start;position:relative}.file.is-white .file-cta{background-color:#fff;border-color:transparent;color:#0a0a0a}.file.is-white:hover .file-cta,.file.is-white.is-hovered .file-cta{background-color:#f9f9f9;border-color:transparent;color:#0a0a0a}.file.is-white:focus .file-cta,.file.is-white.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(255,255,255,0.25);color:#0a0a0a}.file.is-white:active .file-cta,.file.is-white.is-active .file-cta{background-color:#f2f2f2;border-color:transparent;color:#0a0a0a}.file.is-black .file-cta{background-color:#0a0a0a;border-color:transparent;color:#fff}.file.is-black:hover .file-cta,.file.is-black.is-hovered .file-cta{background-color:#040404;border-color:transparent;color:#fff}.file.is-black:focus .file-cta,.file.is-black.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(10,10,10,0.25);color:#fff}.file.is-black:active .file-cta,.file.is-black.is-active .file-cta{background-color:#000;border-color:transparent;color:#fff}.file.is-light .file-cta{background-color:#f5f5f5;border-color:transparent;color:rgba(0,0,0,0.7)}.file.is-light:hover .file-cta,.file.is-light.is-hovered .file-cta{background-color:#eee;border-color:transparent;color:rgba(0,0,0,0.7)}.file.is-light:focus .file-cta,.file.is-light.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(245,245,245,0.25);color:rgba(0,0,0,0.7)}.file.is-light:active .file-cta,.file.is-light.is-active .file-cta{background-color:#e8e8e8;border-color:transparent;color:rgba(0,0,0,0.7)}.file.is-dark .file-cta,.content kbd.file .file-cta{background-color:#363636;border-color:transparent;color:#fff}.file.is-dark:hover .file-cta,.content kbd.file:hover .file-cta,.file.is-dark.is-hovered .file-cta,.content kbd.file.is-hovered .file-cta{background-color:#2f2f2f;border-color:transparent;color:#fff}.file.is-dark:focus .file-cta,.content kbd.file:focus .file-cta,.file.is-dark.is-focused .file-cta,.content kbd.file.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(54,54,54,0.25);color:#fff}.file.is-dark:active .file-cta,.content kbd.file:active .file-cta,.file.is-dark.is-active .file-cta,.content kbd.file.is-active .file-cta{background-color:#292929;border-color:transparent;color:#fff}.file.is-primary .file-cta,.docstring>section>a.file.docs-sourcelink .file-cta{background-color:#4eb5de;border-color:transparent;color:#fff}.file.is-primary:hover .file-cta,.docstring>section>a.file.docs-sourcelink:hover .file-cta,.file.is-primary.is-hovered .file-cta,.docstring>section>a.file.is-hovered.docs-sourcelink .file-cta{background-color:#43b1dc;border-color:transparent;color:#fff}.file.is-primary:focus .file-cta,.docstring>section>a.file.docs-sourcelink:focus .file-cta,.file.is-primary.is-focused .file-cta,.docstring>section>a.file.is-focused.docs-sourcelink .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(78,181,222,0.25);color:#fff}.file.is-primary:active .file-cta,.docstring>section>a.file.docs-sourcelink:active .file-cta,.file.is-primary.is-active .file-cta,.docstring>section>a.file.is-active.docs-sourcelink .file-cta{background-color:#39acda;border-color:transparent;color:#fff}.file.is-link .file-cta{background-color:#2e63b8;border-color:transparent;color:#fff}.file.is-link:hover .file-cta,.file.is-link.is-hovered .file-cta{background-color:#2b5eae;border-color:transparent;color:#fff}.file.is-link:focus .file-cta,.file.is-link.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(46,99,184,0.25);color:#fff}.file.is-link:active .file-cta,.file.is-link.is-active .file-cta{background-color:#2958a4;border-color:transparent;color:#fff}.file.is-info .file-cta{background-color:#209cee;border-color:transparent;color:#fff}.file.is-info:hover .file-cta,.file.is-info.is-hovered .file-cta{background-color:#1497ed;border-color:transparent;color:#fff}.file.is-info:focus .file-cta,.file.is-info.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(32,156,238,0.25);color:#fff}.file.is-info:active .file-cta,.file.is-info.is-active .file-cta{background-color:#1190e3;border-color:transparent;color:#fff}.file.is-success .file-cta{background-color:#22c35b;border-color:transparent;color:#fff}.file.is-success:hover .file-cta,.file.is-success.is-hovered .file-cta{background-color:#20b856;border-color:transparent;color:#fff}.file.is-success:focus .file-cta,.file.is-success.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(34,195,91,0.25);color:#fff}.file.is-success:active .file-cta,.file.is-success.is-active .file-cta{background-color:#1ead51;border-color:transparent;color:#fff}.file.is-warning .file-cta{background-color:#ffdd57;border-color:transparent;color:rgba(0,0,0,0.7)}.file.is-warning:hover .file-cta,.file.is-warning.is-hovered .file-cta{background-color:#ffda4a;border-color:transparent;color:rgba(0,0,0,0.7)}.file.is-warning:focus .file-cta,.file.is-warning.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(255,221,87,0.25);color:rgba(0,0,0,0.7)}.file.is-warning:active .file-cta,.file.is-warning.is-active .file-cta{background-color:#ffd83e;border-color:transparent;color:rgba(0,0,0,0.7)}.file.is-danger .file-cta{background-color:#da0b00;border-color:transparent;color:#fff}.file.is-danger:hover .file-cta,.file.is-danger.is-hovered .file-cta{background-color:#cd0a00;border-color:transparent;color:#fff}.file.is-danger:focus .file-cta,.file.is-danger.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(218,11,0,0.25);color:#fff}.file.is-danger:active .file-cta,.file.is-danger.is-active .file-cta{background-color:#c10a00;border-color:transparent;color:#fff}.file.is-small,#documenter .docs-sidebar form.docs-search>input.file{font-size:.75rem}.file.is-normal{font-size:1rem}.file.is-medium{font-size:1.25rem}.file.is-medium .file-icon .fa{font-size:21px}.file.is-large{font-size:1.5rem}.file.is-large .file-icon .fa{font-size:28px}.file.has-name .file-cta{border-bottom-right-radius:0;border-top-right-radius:0}.file.has-name .file-name{border-bottom-left-radius:0;border-top-left-radius:0}.file.has-name.is-empty .file-cta{border-radius:4px}.file.has-name.is-empty .file-name{display:none}.file.is-boxed .file-label{flex-direction:column}.file.is-boxed .file-cta{flex-direction:column;height:auto;padding:1em 3em}.file.is-boxed .file-name{border-width:0 1px 1px}.file.is-boxed .file-icon{height:1.5em;width:1.5em}.file.is-boxed .file-icon .fa{font-size:21px}.file.is-boxed.is-small .file-icon .fa,#documenter .docs-sidebar form.docs-search>input.is-boxed .file-icon .fa{font-size:14px}.file.is-boxed.is-medium .file-icon .fa{font-size:28px}.file.is-boxed.is-large .file-icon .fa{font-size:35px}.file.is-boxed.has-name .file-cta{border-radius:4px 4px 0 0}.file.is-boxed.has-name .file-name{border-radius:0 0 4px 4px;border-width:0 1px 1px}.file.is-centered{justify-content:center}.file.is-fullwidth .file-label{width:100%}.file.is-fullwidth .file-name{flex-grow:1;max-width:none}.file.is-right{justify-content:flex-end}.file.is-right .file-cta{border-radius:0 4px 4px 0}.file.is-right .file-name{border-radius:4px 0 0 4px;border-width:1px 0 1px 1px;order:-1}.file-label{align-items:stretch;display:flex;cursor:pointer;justify-content:flex-start;overflow:hidden;position:relative}.file-label:hover .file-cta{background-color:#eee;color:#222}.file-label:hover .file-name{border-color:#d5d5d5}.file-label:active .file-cta{background-color:#e8e8e8;color:#222}.file-label:active .file-name{border-color:#cfcfcf}.file-input{height:100%;left:0;opacity:0;outline:none;position:absolute;top:0;width:100%}.file-cta,.file-name{border-color:#dbdbdb;border-radius:4px;font-size:1em;padding-left:1em;padding-right:1em;white-space:nowrap}.file-cta{background-color:#f5f5f5;color:#222}.file-name{border-color:#dbdbdb;border-style:solid;border-width:1px 1px 1px 0;display:block;max-width:16em;overflow:hidden;text-align:inherit;text-overflow:ellipsis}.file-icon{align-items:center;display:flex;height:1em;justify-content:center;margin-right:.5em;width:1em}.file-icon .fa{font-size:14px}.label{color:#222;display:block;font-size:1rem;font-weight:700}.label:not(:last-child){margin-bottom:0.5em}.label.is-small,#documenter .docs-sidebar form.docs-search>input.label{font-size:.75rem}.label.is-medium{font-size:1.25rem}.label.is-large{font-size:1.5rem}.help{display:block;font-size:.75rem;margin-top:0.25rem}.help.is-white{color:#fff}.help.is-black{color:#0a0a0a}.help.is-light{color:#f5f5f5}.help.is-dark,.content kbd.help{color:#363636}.help.is-primary,.docstring>section>a.help.docs-sourcelink{color:#4eb5de}.help.is-link{color:#2e63b8}.help.is-info{color:#209cee}.help.is-success{color:#22c35b}.help.is-warning{color:#ffdd57}.help.is-danger{color:#da0b00}.field:not(:last-child){margin-bottom:0.75rem}.field.has-addons{display:flex;justify-content:flex-start}.field.has-addons .control:not(:last-child){margin-right:-1px}.field.has-addons .control:not(:first-child):not(:last-child) .button,.field.has-addons .control:not(:first-child):not(:last-child) .input,.field.has-addons .control:not(:first-child):not(:last-child) #documenter .docs-sidebar form.docs-search>input,#documenter .docs-sidebar .field.has-addons .control:not(:first-child):not(:last-child) form.docs-search>input,.field.has-addons .control:not(:first-child):not(:last-child) .select select{border-radius:0}.field.has-addons .control:first-child:not(:only-child) .button,.field.has-addons .control:first-child:not(:only-child) .input,.field.has-addons .control:first-child:not(:only-child) #documenter .docs-sidebar form.docs-search>input,#documenter .docs-sidebar .field.has-addons .control:first-child:not(:only-child) form.docs-search>input,.field.has-addons .control:first-child:not(:only-child) .select select{border-bottom-right-radius:0;border-top-right-radius:0}.field.has-addons .control:last-child:not(:only-child) .button,.field.has-addons .control:last-child:not(:only-child) .input,.field.has-addons .control:last-child:not(:only-child) #documenter .docs-sidebar form.docs-search>input,#documenter .docs-sidebar .field.has-addons .control:last-child:not(:only-child) form.docs-search>input,.field.has-addons .control:last-child:not(:only-child) .select select{border-bottom-left-radius:0;border-top-left-radius:0}.field.has-addons .control .button:not([disabled]):hover,.field.has-addons .control .button.is-hovered:not([disabled]),.field.has-addons .control .input:not([disabled]):hover,.field.has-addons .control #documenter .docs-sidebar form.docs-search>input:not([disabled]):hover,#documenter .docs-sidebar .field.has-addons .control form.docs-search>input:not([disabled]):hover,.field.has-addons .control .input.is-hovered:not([disabled]),.field.has-addons .control #documenter .docs-sidebar form.docs-search>input.is-hovered:not([disabled]),#documenter .docs-sidebar .field.has-addons .control form.docs-search>input.is-hovered:not([disabled]),.field.has-addons .control .select select:not([disabled]):hover,.field.has-addons .control .select select.is-hovered:not([disabled]){z-index:2}.field.has-addons .control .button:not([disabled]):focus,.field.has-addons .control .button.is-focused:not([disabled]),.field.has-addons .control .button:not([disabled]):active,.field.has-addons .control .button.is-active:not([disabled]),.field.has-addons .control .input:not([disabled]):focus,.field.has-addons .control #documenter .docs-sidebar form.docs-search>input:not([disabled]):focus,#documenter .docs-sidebar .field.has-addons .control form.docs-search>input:not([disabled]):focus,.field.has-addons .control .input.is-focused:not([disabled]),.field.has-addons .control #documenter .docs-sidebar form.docs-search>input.is-focused:not([disabled]),#documenter .docs-sidebar .field.has-addons .control form.docs-search>input.is-focused:not([disabled]),.field.has-addons .control .input:not([disabled]):active,.field.has-addons .control #documenter .docs-sidebar form.docs-search>input:not([disabled]):active,#documenter .docs-sidebar .field.has-addons .control form.docs-search>input:not([disabled]):active,.field.has-addons .control .input.is-active:not([disabled]),.field.has-addons .control #documenter .docs-sidebar form.docs-search>input.is-active:not([disabled]),#documenter .docs-sidebar .field.has-addons .control form.docs-search>input.is-active:not([disabled]),.field.has-addons .control .select select:not([disabled]):focus,.field.has-addons .control .select select.is-focused:not([disabled]),.field.has-addons .control .select select:not([disabled]):active,.field.has-addons .control .select select.is-active:not([disabled]){z-index:3}.field.has-addons .control .button:not([disabled]):focus:hover,.field.has-addons .control .button.is-focused:not([disabled]):hover,.field.has-addons .control .button:not([disabled]):active:hover,.field.has-addons .control .button.is-active:not([disabled]):hover,.field.has-addons .control .input:not([disabled]):focus:hover,.field.has-addons .control #documenter .docs-sidebar form.docs-search>input:not([disabled]):focus:hover,#documenter .docs-sidebar .field.has-addons .control form.docs-search>input:not([disabled]):focus:hover,.field.has-addons .control .input.is-focused:not([disabled]):hover,.field.has-addons .control #documenter .docs-sidebar form.docs-search>input.is-focused:not([disabled]):hover,#documenter .docs-sidebar .field.has-addons .control form.docs-search>input.is-focused:not([disabled]):hover,.field.has-addons .control .input:not([disabled]):active:hover,.field.has-addons .control #documenter .docs-sidebar form.docs-search>input:not([disabled]):active:hover,#documenter .docs-sidebar .field.has-addons .control form.docs-search>input:not([disabled]):active:hover,.field.has-addons .control .input.is-active:not([disabled]):hover,.field.has-addons .control #documenter .docs-sidebar form.docs-search>input.is-active:not([disabled]):hover,#documenter .docs-sidebar .field.has-addons .control form.docs-search>input.is-active:not([disabled]):hover,.field.has-addons .control .select select:not([disabled]):focus:hover,.field.has-addons .control .select select.is-focused:not([disabled]):hover,.field.has-addons .control .select select:not([disabled]):active:hover,.field.has-addons .control .select select.is-active:not([disabled]):hover{z-index:4}.field.has-addons .control.is-expanded{flex-grow:1;flex-shrink:1}.field.has-addons.has-addons-centered{justify-content:center}.field.has-addons.has-addons-right{justify-content:flex-end}.field.has-addons.has-addons-fullwidth .control{flex-grow:1;flex-shrink:0}.field.is-grouped{display:flex;justify-content:flex-start}.field.is-grouped>.control{flex-shrink:0}.field.is-grouped>.control:not(:last-child){margin-bottom:0;margin-right:.75rem}.field.is-grouped>.control.is-expanded{flex-grow:1;flex-shrink:1}.field.is-grouped.is-grouped-centered{justify-content:center}.field.is-grouped.is-grouped-right{justify-content:flex-end}.field.is-grouped.is-grouped-multiline{flex-wrap:wrap}.field.is-grouped.is-grouped-multiline>.control:last-child,.field.is-grouped.is-grouped-multiline>.control:not(:last-child){margin-bottom:0.75rem}.field.is-grouped.is-grouped-multiline:last-child{margin-bottom:-0.75rem}.field.is-grouped.is-grouped-multiline:not(:last-child){margin-bottom:0}@media screen and (min-width: 769px),print{.field.is-horizontal{display:flex}}.field-label .label{font-size:inherit}@media screen and (max-width: 768px){.field-label{margin-bottom:0.5rem}}@media screen and (min-width: 769px),print{.field-label{flex-basis:0;flex-grow:1;flex-shrink:0;margin-right:1.5rem;text-align:right}.field-label.is-small,#documenter .docs-sidebar form.docs-search>input.field-label{font-size:.75rem;padding-top:0.375em}.field-label.is-normal{padding-top:0.375em}.field-label.is-medium{font-size:1.25rem;padding-top:0.375em}.field-label.is-large{font-size:1.5rem;padding-top:0.375em}}.field-body .field .field{margin-bottom:0}@media screen and (min-width: 769px),print{.field-body{display:flex;flex-basis:0;flex-grow:5;flex-shrink:1}.field-body .field{margin-bottom:0}.field-body>.field{flex-shrink:1}.field-body>.field:not(.is-narrow){flex-grow:1}.field-body>.field:not(:last-child){margin-right:.75rem}}.control{box-sizing:border-box;clear:both;font-size:1rem;position:relative;text-align:inherit}.control.has-icons-left .input:focus~.icon,.control.has-icons-left #documenter .docs-sidebar form.docs-search>input:focus~.icon,#documenter .docs-sidebar .control.has-icons-left form.docs-search>input:focus~.icon,.control.has-icons-left .select:focus~.icon,.control.has-icons-right .input:focus~.icon,.control.has-icons-right #documenter .docs-sidebar form.docs-search>input:focus~.icon,#documenter .docs-sidebar .control.has-icons-right form.docs-search>input:focus~.icon,.control.has-icons-right .select:focus~.icon{color:#222}.control.has-icons-left .input.is-small~.icon,.control.has-icons-left #documenter .docs-sidebar form.docs-search>input~.icon,#documenter .docs-sidebar .control.has-icons-left form.docs-search>input~.icon,.control.has-icons-left .select.is-small~.icon,.control.has-icons-right .input.is-small~.icon,.control.has-icons-right #documenter .docs-sidebar form.docs-search>input~.icon,#documenter .docs-sidebar .control.has-icons-right form.docs-search>input~.icon,.control.has-icons-right .select.is-small~.icon{font-size:.75rem}.control.has-icons-left .input.is-medium~.icon,.control.has-icons-left #documenter .docs-sidebar form.docs-search>input.is-medium~.icon,#documenter .docs-sidebar .control.has-icons-left form.docs-search>input.is-medium~.icon,.control.has-icons-left .select.is-medium~.icon,.control.has-icons-right .input.is-medium~.icon,.control.has-icons-right #documenter .docs-sidebar form.docs-search>input.is-medium~.icon,#documenter .docs-sidebar .control.has-icons-right form.docs-search>input.is-medium~.icon,.control.has-icons-right .select.is-medium~.icon{font-size:1.25rem}.control.has-icons-left .input.is-large~.icon,.control.has-icons-left #documenter .docs-sidebar form.docs-search>input.is-large~.icon,#documenter .docs-sidebar .control.has-icons-left form.docs-search>input.is-large~.icon,.control.has-icons-left .select.is-large~.icon,.control.has-icons-right .input.is-large~.icon,.control.has-icons-right #documenter .docs-sidebar form.docs-search>input.is-large~.icon,#documenter .docs-sidebar .control.has-icons-right form.docs-search>input.is-large~.icon,.control.has-icons-right .select.is-large~.icon{font-size:1.5rem}.control.has-icons-left .icon,.control.has-icons-right .icon{color:#dbdbdb;height:2.5em;pointer-events:none;position:absolute;top:0;width:2.5em;z-index:4}.control.has-icons-left .input,.control.has-icons-left #documenter .docs-sidebar form.docs-search>input,#documenter .docs-sidebar .control.has-icons-left form.docs-search>input,.control.has-icons-left .select select{padding-left:2.5em}.control.has-icons-left .icon.is-left{left:0}.control.has-icons-right .input,.control.has-icons-right #documenter .docs-sidebar form.docs-search>input,#documenter .docs-sidebar .control.has-icons-right form.docs-search>input,.control.has-icons-right .select select{padding-right:2.5em}.control.has-icons-right .icon.is-right{right:0}.control.is-loading::after{position:absolute !important;right:.625em;top:0.625em;z-index:4}.control.is-loading.is-small:after,#documenter .docs-sidebar form.docs-search>input.is-loading:after{font-size:.75rem}.control.is-loading.is-medium:after{font-size:1.25rem}.control.is-loading.is-large:after{font-size:1.5rem}.breadcrumb{font-size:1rem;white-space:nowrap}.breadcrumb a{align-items:center;color:#2e63b8;display:flex;justify-content:center;padding:0 .75em}.breadcrumb a:hover{color:#363636}.breadcrumb li{align-items:center;display:flex}.breadcrumb li:first-child a{padding-left:0}.breadcrumb li.is-active a{color:#222;cursor:default;pointer-events:none}.breadcrumb li+li::before{color:#b5b5b5;content:"\0002f"}.breadcrumb ul,.breadcrumb ol{align-items:flex-start;display:flex;flex-wrap:wrap;justify-content:flex-start}.breadcrumb .icon:first-child{margin-right:.5em}.breadcrumb .icon:last-child{margin-left:.5em}.breadcrumb.is-centered ol,.breadcrumb.is-centered ul{justify-content:center}.breadcrumb.is-right ol,.breadcrumb.is-right ul{justify-content:flex-end}.breadcrumb.is-small,#documenter .docs-sidebar form.docs-search>input.breadcrumb{font-size:.75rem}.breadcrumb.is-medium{font-size:1.25rem}.breadcrumb.is-large{font-size:1.5rem}.breadcrumb.has-arrow-separator li+li::before{content:"\02192"}.breadcrumb.has-bullet-separator li+li::before{content:"\02022"}.breadcrumb.has-dot-separator li+li::before{content:"\000b7"}.breadcrumb.has-succeeds-separator li+li::before{content:"\0227B"}.card{background-color:#fff;border-radius:.25rem;box-shadow:#bbb;color:#222;max-width:100%;position:relative}.card-footer:first-child,.card-content:first-child,.card-header:first-child{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.card-footer:last-child,.card-content:last-child,.card-header:last-child{border-bottom-left-radius:.25rem;border-bottom-right-radius:.25rem}.card-header{background-color:rgba(0,0,0,0);align-items:stretch;box-shadow:0 0.125em 0.25em rgba(10,10,10,0.1);display:flex}.card-header-title{align-items:center;color:#222;display:flex;flex-grow:1;font-weight:700;padding:0.75rem 1rem}.card-header-title.is-centered{justify-content:center}.card-header-icon{-moz-appearance:none;-webkit-appearance:none;appearance:none;background:none;border:none;color:currentColor;font-family:inherit;font-size:1em;margin:0;padding:0;align-items:center;cursor:pointer;display:flex;justify-content:center;padding:0.75rem 1rem}.card-image{display:block;position:relative}.card-image:first-child img{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.card-image:last-child img{border-bottom-left-radius:.25rem;border-bottom-right-radius:.25rem}.card-content{background-color:rgba(0,0,0,0);padding:1.5rem}.card-footer{background-color:rgba(0,0,0,0);border-top:1px solid #ededed;align-items:stretch;display:flex}.card-footer-item{align-items:center;display:flex;flex-basis:0;flex-grow:1;flex-shrink:0;justify-content:center;padding:.75rem}.card-footer-item:not(:last-child){border-right:1px solid #ededed}.card .media:not(:last-child){margin-bottom:1.5rem}.dropdown{display:inline-flex;position:relative;vertical-align:top}.dropdown.is-active .dropdown-menu,.dropdown.is-hoverable:hover .dropdown-menu{display:block}.dropdown.is-right .dropdown-menu{left:auto;right:0}.dropdown.is-up .dropdown-menu{bottom:100%;padding-bottom:4px;padding-top:initial;top:auto}.dropdown-menu{display:none;left:0;min-width:12rem;padding-top:4px;position:absolute;top:100%;z-index:20}.dropdown-content{background-color:#fff;border-radius:4px;box-shadow:#bbb;padding-bottom:.5rem;padding-top:.5rem}.dropdown-item{color:#222;display:block;font-size:0.875rem;line-height:1.5;padding:0.375rem 1rem;position:relative}a.dropdown-item,button.dropdown-item{padding-right:3rem;text-align:inherit;white-space:nowrap;width:100%}a.dropdown-item:hover,button.dropdown-item:hover{background-color:#f5f5f5;color:#0a0a0a}a.dropdown-item.is-active,button.dropdown-item.is-active{background-color:#2e63b8;color:#fff}.dropdown-divider{background-color:#ededed;border:none;display:block;height:1px;margin:0.5rem 0}.level{align-items:center;justify-content:space-between}.level code{border-radius:4px}.level img{display:inline-block;vertical-align:top}.level.is-mobile{display:flex}.level.is-mobile .level-left,.level.is-mobile .level-right{display:flex}.level.is-mobile .level-left+.level-right{margin-top:0}.level.is-mobile .level-item:not(:last-child){margin-bottom:0;margin-right:.75rem}.level.is-mobile .level-item:not(.is-narrow){flex-grow:1}@media screen and (min-width: 769px),print{.level{display:flex}.level>.level-item:not(.is-narrow){flex-grow:1}}.level-item{align-items:center;display:flex;flex-basis:auto;flex-grow:0;flex-shrink:0;justify-content:center}.level-item .title,.level-item .subtitle{margin-bottom:0}@media screen and (max-width: 768px){.level-item:not(:last-child){margin-bottom:.75rem}}.level-left,.level-right{flex-basis:auto;flex-grow:0;flex-shrink:0}.level-left .level-item.is-flexible,.level-right .level-item.is-flexible{flex-grow:1}@media screen and (min-width: 769px),print{.level-left .level-item:not(:last-child),.level-right .level-item:not(:last-child){margin-right:.75rem}}.level-left{align-items:center;justify-content:flex-start}@media screen and (max-width: 768px){.level-left+.level-right{margin-top:1.5rem}}@media screen and (min-width: 769px),print{.level-left{display:flex}}.level-right{align-items:center;justify-content:flex-end}@media screen and (min-width: 769px),print{.level-right{display:flex}}.media{align-items:flex-start;display:flex;text-align:inherit}.media .content:not(:last-child){margin-bottom:.75rem}.media .media{border-top:1px solid rgba(219,219,219,0.5);display:flex;padding-top:.75rem}.media .media .content:not(:last-child),.media .media .control:not(:last-child){margin-bottom:.5rem}.media .media .media{padding-top:.5rem}.media .media .media+.media{margin-top:.5rem}.media+.media{border-top:1px solid rgba(219,219,219,0.5);margin-top:1rem;padding-top:1rem}.media.is-large+.media{margin-top:1.5rem;padding-top:1.5rem}.media-left,.media-right{flex-basis:auto;flex-grow:0;flex-shrink:0}.media-left{margin-right:1rem}.media-right{margin-left:1rem}.media-content{flex-basis:auto;flex-grow:1;flex-shrink:1;text-align:inherit}@media screen and (max-width: 768px){.media-content{overflow-x:auto}}.menu{font-size:1rem}.menu.is-small,#documenter .docs-sidebar form.docs-search>input.menu{font-size:.75rem}.menu.is-medium{font-size:1.25rem}.menu.is-large{font-size:1.5rem}.menu-list{line-height:1.25}.menu-list a{border-radius:2px;color:#222;display:block;padding:0.5em 0.75em}.menu-list a:hover{background-color:#f5f5f5;color:#222}.menu-list a.is-active{background-color:#2e63b8;color:#fff}.menu-list li ul{border-left:1px solid #dbdbdb;margin:.75em;padding-left:.75em}.menu-label{color:#6b6b6b;font-size:.75em;letter-spacing:.1em;text-transform:uppercase}.menu-label:not(:first-child){margin-top:1em}.menu-label:not(:last-child){margin-bottom:1em}.message{background-color:#f5f5f5;border-radius:4px;font-size:1rem}.message strong{color:currentColor}.message a:not(.button):not(.tag):not(.dropdown-item){color:currentColor;text-decoration:underline}.message.is-small,#documenter .docs-sidebar form.docs-search>input.message{font-size:.75rem}.message.is-medium{font-size:1.25rem}.message.is-large{font-size:1.5rem}.message.is-white{background-color:#fff}.message.is-white .message-header{background-color:#fff;color:#0a0a0a}.message.is-white .message-body{border-color:#fff}.message.is-black{background-color:#fafafa}.message.is-black .message-header{background-color:#0a0a0a;color:#fff}.message.is-black .message-body{border-color:#0a0a0a}.message.is-light{background-color:#fafafa}.message.is-light .message-header{background-color:#f5f5f5;color:rgba(0,0,0,0.7)}.message.is-light .message-body{border-color:#f5f5f5}.message.is-dark,.content kbd.message{background-color:#fafafa}.message.is-dark .message-header,.content kbd.message .message-header{background-color:#363636;color:#fff}.message.is-dark .message-body,.content kbd.message .message-body{border-color:#363636}.message.is-primary,.docstring>section>a.message.docs-sourcelink{background-color:#eef8fc}.message.is-primary .message-header,.docstring>section>a.message.docs-sourcelink .message-header{background-color:#4eb5de;color:#fff}.message.is-primary .message-body,.docstring>section>a.message.docs-sourcelink .message-body{border-color:#4eb5de;color:#1a6d8e}.message.is-link{background-color:#eff3fb}.message.is-link .message-header{background-color:#2e63b8;color:#fff}.message.is-link .message-body{border-color:#2e63b8;color:#3169c4}.message.is-info{background-color:#ecf7fe}.message.is-info .message-header{background-color:#209cee;color:#fff}.message.is-info .message-body{border-color:#209cee;color:#0e72b4}.message.is-success{background-color:#eefcf3}.message.is-success .message-header{background-color:#22c35b;color:#fff}.message.is-success .message-body{border-color:#22c35b;color:#198f43}.message.is-warning{background-color:#fffbeb}.message.is-warning .message-header{background-color:#ffdd57;color:rgba(0,0,0,0.7)}.message.is-warning .message-body{border-color:#ffdd57;color:#947600}.message.is-danger{background-color:#ffeceb}.message.is-danger .message-header{background-color:#da0b00;color:#fff}.message.is-danger .message-body{border-color:#da0b00;color:#f50c00}.message-header{align-items:center;background-color:#222;border-radius:4px 4px 0 0;color:#fff;display:flex;font-weight:700;justify-content:space-between;line-height:1.25;padding:0.75em 1em;position:relative}.message-header .delete{flex-grow:0;flex-shrink:0;margin-left:.75em}.message-header+.message-body{border-width:0;border-top-left-radius:0;border-top-right-radius:0}.message-body{border-color:#dbdbdb;border-radius:4px;border-style:solid;border-width:0 0 0 4px;color:#222;padding:1.25em 1.5em}.message-body code,.message-body pre{background-color:#fff}.message-body pre code{background-color:rgba(0,0,0,0)}.modal{align-items:center;display:none;flex-direction:column;justify-content:center;overflow:hidden;position:fixed;z-index:40}.modal.is-active{display:flex}.modal-background{background-color:rgba(10,10,10,0.86)}.modal-content,.modal-card{margin:0 20px;max-height:calc(100vh - 160px);overflow:auto;position:relative;width:100%}@media screen and (min-width: 769px){.modal-content,.modal-card{margin:0 auto;max-height:calc(100vh - 40px);width:640px}}.modal-close{background:none;height:40px;position:fixed;right:20px;top:20px;width:40px}.modal-card{display:flex;flex-direction:column;max-height:calc(100vh - 40px);overflow:hidden;-ms-overflow-y:visible}.modal-card-head,.modal-card-foot{align-items:center;background-color:#f5f5f5;display:flex;flex-shrink:0;justify-content:flex-start;padding:20px;position:relative}.modal-card-head{border-bottom:1px solid #dbdbdb;border-top-left-radius:6px;border-top-right-radius:6px}.modal-card-title{color:#222;flex-grow:1;flex-shrink:0;font-size:1.5rem;line-height:1}.modal-card-foot{border-bottom-left-radius:6px;border-bottom-right-radius:6px;border-top:1px solid #dbdbdb}.modal-card-foot .button:not(:last-child){margin-right:.5em}.modal-card-body{-webkit-overflow-scrolling:touch;background-color:#fff;flex-grow:1;flex-shrink:1;overflow:auto;padding:20px}.navbar{background-color:#fff;min-height:3.25rem;position:relative;z-index:30}.navbar.is-white{background-color:#fff;color:#0a0a0a}.navbar.is-white .navbar-brand>.navbar-item,.navbar.is-white .navbar-brand .navbar-link{color:#0a0a0a}.navbar.is-white .navbar-brand>a.navbar-item:focus,.navbar.is-white .navbar-brand>a.navbar-item:hover,.navbar.is-white .navbar-brand>a.navbar-item.is-active,.navbar.is-white .navbar-brand .navbar-link:focus,.navbar.is-white .navbar-brand .navbar-link:hover,.navbar.is-white .navbar-brand .navbar-link.is-active{background-color:#f2f2f2;color:#0a0a0a}.navbar.is-white .navbar-brand .navbar-link::after{border-color:#0a0a0a}.navbar.is-white .navbar-burger{color:#0a0a0a}@media screen and (min-width: 1056px){.navbar.is-white .navbar-start>.navbar-item,.navbar.is-white .navbar-start .navbar-link,.navbar.is-white .navbar-end>.navbar-item,.navbar.is-white .navbar-end .navbar-link{color:#0a0a0a}.navbar.is-white .navbar-start>a.navbar-item:focus,.navbar.is-white .navbar-start>a.navbar-item:hover,.navbar.is-white .navbar-start>a.navbar-item.is-active,.navbar.is-white .navbar-start .navbar-link:focus,.navbar.is-white .navbar-start .navbar-link:hover,.navbar.is-white .navbar-start .navbar-link.is-active,.navbar.is-white .navbar-end>a.navbar-item:focus,.navbar.is-white .navbar-end>a.navbar-item:hover,.navbar.is-white .navbar-end>a.navbar-item.is-active,.navbar.is-white .navbar-end .navbar-link:focus,.navbar.is-white .navbar-end .navbar-link:hover,.navbar.is-white .navbar-end .navbar-link.is-active{background-color:#f2f2f2;color:#0a0a0a}.navbar.is-white .navbar-start .navbar-link::after,.navbar.is-white .navbar-end .navbar-link::after{border-color:#0a0a0a}.navbar.is-white .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-white .navbar-item.has-dropdown:hover .navbar-link,.navbar.is-white .navbar-item.has-dropdown.is-active .navbar-link{background-color:#f2f2f2;color:#0a0a0a}.navbar.is-white .navbar-dropdown a.navbar-item.is-active{background-color:#fff;color:#0a0a0a}}.navbar.is-black{background-color:#0a0a0a;color:#fff}.navbar.is-black .navbar-brand>.navbar-item,.navbar.is-black .navbar-brand .navbar-link{color:#fff}.navbar.is-black .navbar-brand>a.navbar-item:focus,.navbar.is-black .navbar-brand>a.navbar-item:hover,.navbar.is-black .navbar-brand>a.navbar-item.is-active,.navbar.is-black .navbar-brand .navbar-link:focus,.navbar.is-black .navbar-brand .navbar-link:hover,.navbar.is-black .navbar-brand .navbar-link.is-active{background-color:#000;color:#fff}.navbar.is-black .navbar-brand .navbar-link::after{border-color:#fff}.navbar.is-black .navbar-burger{color:#fff}@media screen and (min-width: 1056px){.navbar.is-black .navbar-start>.navbar-item,.navbar.is-black .navbar-start .navbar-link,.navbar.is-black .navbar-end>.navbar-item,.navbar.is-black .navbar-end .navbar-link{color:#fff}.navbar.is-black .navbar-start>a.navbar-item:focus,.navbar.is-black .navbar-start>a.navbar-item:hover,.navbar.is-black .navbar-start>a.navbar-item.is-active,.navbar.is-black .navbar-start .navbar-link:focus,.navbar.is-black .navbar-start .navbar-link:hover,.navbar.is-black .navbar-start .navbar-link.is-active,.navbar.is-black .navbar-end>a.navbar-item:focus,.navbar.is-black .navbar-end>a.navbar-item:hover,.navbar.is-black .navbar-end>a.navbar-item.is-active,.navbar.is-black .navbar-end .navbar-link:focus,.navbar.is-black .navbar-end .navbar-link:hover,.navbar.is-black .navbar-end .navbar-link.is-active{background-color:#000;color:#fff}.navbar.is-black .navbar-start .navbar-link::after,.navbar.is-black .navbar-end .navbar-link::after{border-color:#fff}.navbar.is-black .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-black .navbar-item.has-dropdown:hover .navbar-link,.navbar.is-black .navbar-item.has-dropdown.is-active .navbar-link{background-color:#000;color:#fff}.navbar.is-black .navbar-dropdown a.navbar-item.is-active{background-color:#0a0a0a;color:#fff}}.navbar.is-light{background-color:#f5f5f5;color:rgba(0,0,0,0.7)}.navbar.is-light .navbar-brand>.navbar-item,.navbar.is-light .navbar-brand .navbar-link{color:rgba(0,0,0,0.7)}.navbar.is-light .navbar-brand>a.navbar-item:focus,.navbar.is-light .navbar-brand>a.navbar-item:hover,.navbar.is-light .navbar-brand>a.navbar-item.is-active,.navbar.is-light .navbar-brand .navbar-link:focus,.navbar.is-light .navbar-brand .navbar-link:hover,.navbar.is-light .navbar-brand .navbar-link.is-active{background-color:#e8e8e8;color:rgba(0,0,0,0.7)}.navbar.is-light .navbar-brand .navbar-link::after{border-color:rgba(0,0,0,0.7)}.navbar.is-light .navbar-burger{color:rgba(0,0,0,0.7)}@media screen and (min-width: 1056px){.navbar.is-light .navbar-start>.navbar-item,.navbar.is-light .navbar-start .navbar-link,.navbar.is-light .navbar-end>.navbar-item,.navbar.is-light .navbar-end .navbar-link{color:rgba(0,0,0,0.7)}.navbar.is-light .navbar-start>a.navbar-item:focus,.navbar.is-light .navbar-start>a.navbar-item:hover,.navbar.is-light .navbar-start>a.navbar-item.is-active,.navbar.is-light .navbar-start .navbar-link:focus,.navbar.is-light .navbar-start .navbar-link:hover,.navbar.is-light .navbar-start .navbar-link.is-active,.navbar.is-light .navbar-end>a.navbar-item:focus,.navbar.is-light .navbar-end>a.navbar-item:hover,.navbar.is-light .navbar-end>a.navbar-item.is-active,.navbar.is-light .navbar-end .navbar-link:focus,.navbar.is-light .navbar-end .navbar-link:hover,.navbar.is-light .navbar-end .navbar-link.is-active{background-color:#e8e8e8;color:rgba(0,0,0,0.7)}.navbar.is-light .navbar-start .navbar-link::after,.navbar.is-light .navbar-end .navbar-link::after{border-color:rgba(0,0,0,0.7)}.navbar.is-light .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-light .navbar-item.has-dropdown:hover .navbar-link,.navbar.is-light .navbar-item.has-dropdown.is-active .navbar-link{background-color:#e8e8e8;color:rgba(0,0,0,0.7)}.navbar.is-light .navbar-dropdown a.navbar-item.is-active{background-color:#f5f5f5;color:rgba(0,0,0,0.7)}}.navbar.is-dark,.content kbd.navbar{background-color:#363636;color:#fff}.navbar.is-dark .navbar-brand>.navbar-item,.content kbd.navbar .navbar-brand>.navbar-item,.navbar.is-dark .navbar-brand .navbar-link,.content kbd.navbar .navbar-brand .navbar-link{color:#fff}.navbar.is-dark .navbar-brand>a.navbar-item:focus,.content kbd.navbar .navbar-brand>a.navbar-item:focus,.navbar.is-dark .navbar-brand>a.navbar-item:hover,.content kbd.navbar .navbar-brand>a.navbar-item:hover,.navbar.is-dark .navbar-brand>a.navbar-item.is-active,.content kbd.navbar .navbar-brand>a.navbar-item.is-active,.navbar.is-dark .navbar-brand .navbar-link:focus,.content kbd.navbar .navbar-brand .navbar-link:focus,.navbar.is-dark .navbar-brand .navbar-link:hover,.content kbd.navbar .navbar-brand .navbar-link:hover,.navbar.is-dark .navbar-brand .navbar-link.is-active,.content kbd.navbar .navbar-brand .navbar-link.is-active{background-color:#292929;color:#fff}.navbar.is-dark .navbar-brand .navbar-link::after,.content kbd.navbar .navbar-brand .navbar-link::after{border-color:#fff}.navbar.is-dark .navbar-burger,.content kbd.navbar .navbar-burger{color:#fff}@media screen and (min-width: 1056px){.navbar.is-dark .navbar-start>.navbar-item,.content kbd.navbar .navbar-start>.navbar-item,.navbar.is-dark .navbar-start .navbar-link,.content kbd.navbar .navbar-start .navbar-link,.navbar.is-dark .navbar-end>.navbar-item,.content kbd.navbar .navbar-end>.navbar-item,.navbar.is-dark .navbar-end .navbar-link,.content kbd.navbar .navbar-end .navbar-link{color:#fff}.navbar.is-dark .navbar-start>a.navbar-item:focus,.content kbd.navbar .navbar-start>a.navbar-item:focus,.navbar.is-dark .navbar-start>a.navbar-item:hover,.content kbd.navbar .navbar-start>a.navbar-item:hover,.navbar.is-dark .navbar-start>a.navbar-item.is-active,.content kbd.navbar .navbar-start>a.navbar-item.is-active,.navbar.is-dark .navbar-start .navbar-link:focus,.content kbd.navbar .navbar-start .navbar-link:focus,.navbar.is-dark .navbar-start .navbar-link:hover,.content kbd.navbar .navbar-start .navbar-link:hover,.navbar.is-dark .navbar-start .navbar-link.is-active,.content kbd.navbar .navbar-start .navbar-link.is-active,.navbar.is-dark .navbar-end>a.navbar-item:focus,.content kbd.navbar .navbar-end>a.navbar-item:focus,.navbar.is-dark .navbar-end>a.navbar-item:hover,.content kbd.navbar .navbar-end>a.navbar-item:hover,.navbar.is-dark .navbar-end>a.navbar-item.is-active,.content kbd.navbar .navbar-end>a.navbar-item.is-active,.navbar.is-dark .navbar-end .navbar-link:focus,.content kbd.navbar .navbar-end .navbar-link:focus,.navbar.is-dark .navbar-end .navbar-link:hover,.content kbd.navbar .navbar-end .navbar-link:hover,.navbar.is-dark .navbar-end .navbar-link.is-active,.content kbd.navbar .navbar-end .navbar-link.is-active{background-color:#292929;color:#fff}.navbar.is-dark .navbar-start .navbar-link::after,.content kbd.navbar .navbar-start .navbar-link::after,.navbar.is-dark .navbar-end .navbar-link::after,.content kbd.navbar .navbar-end .navbar-link::after{border-color:#fff}.navbar.is-dark .navbar-item.has-dropdown:focus .navbar-link,.content kbd.navbar .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-dark .navbar-item.has-dropdown:hover .navbar-link,.content kbd.navbar .navbar-item.has-dropdown:hover .navbar-link,.navbar.is-dark .navbar-item.has-dropdown.is-active .navbar-link,.content kbd.navbar .navbar-item.has-dropdown.is-active .navbar-link{background-color:#292929;color:#fff}.navbar.is-dark .navbar-dropdown a.navbar-item.is-active,.content kbd.navbar .navbar-dropdown a.navbar-item.is-active{background-color:#363636;color:#fff}}.navbar.is-primary,.docstring>section>a.navbar.docs-sourcelink{background-color:#4eb5de;color:#fff}.navbar.is-primary .navbar-brand>.navbar-item,.docstring>section>a.navbar.docs-sourcelink .navbar-brand>.navbar-item,.navbar.is-primary .navbar-brand .navbar-link,.docstring>section>a.navbar.docs-sourcelink .navbar-brand .navbar-link{color:#fff}.navbar.is-primary .navbar-brand>a.navbar-item:focus,.docstring>section>a.navbar.docs-sourcelink .navbar-brand>a.navbar-item:focus,.navbar.is-primary .navbar-brand>a.navbar-item:hover,.docstring>section>a.navbar.docs-sourcelink .navbar-brand>a.navbar-item:hover,.navbar.is-primary .navbar-brand>a.navbar-item.is-active,.docstring>section>a.navbar.docs-sourcelink .navbar-brand>a.navbar-item.is-active,.navbar.is-primary .navbar-brand .navbar-link:focus,.docstring>section>a.navbar.docs-sourcelink .navbar-brand .navbar-link:focus,.navbar.is-primary .navbar-brand .navbar-link:hover,.docstring>section>a.navbar.docs-sourcelink .navbar-brand .navbar-link:hover,.navbar.is-primary .navbar-brand .navbar-link.is-active,.docstring>section>a.navbar.docs-sourcelink .navbar-brand .navbar-link.is-active{background-color:#39acda;color:#fff}.navbar.is-primary .navbar-brand .navbar-link::after,.docstring>section>a.navbar.docs-sourcelink .navbar-brand .navbar-link::after{border-color:#fff}.navbar.is-primary .navbar-burger,.docstring>section>a.navbar.docs-sourcelink .navbar-burger{color:#fff}@media screen and (min-width: 1056px){.navbar.is-primary .navbar-start>.navbar-item,.docstring>section>a.navbar.docs-sourcelink .navbar-start>.navbar-item,.navbar.is-primary .navbar-start .navbar-link,.docstring>section>a.navbar.docs-sourcelink .navbar-start .navbar-link,.navbar.is-primary .navbar-end>.navbar-item,.docstring>section>a.navbar.docs-sourcelink .navbar-end>.navbar-item,.navbar.is-primary .navbar-end .navbar-link,.docstring>section>a.navbar.docs-sourcelink .navbar-end .navbar-link{color:#fff}.navbar.is-primary .navbar-start>a.navbar-item:focus,.docstring>section>a.navbar.docs-sourcelink .navbar-start>a.navbar-item:focus,.navbar.is-primary .navbar-start>a.navbar-item:hover,.docstring>section>a.navbar.docs-sourcelink .navbar-start>a.navbar-item:hover,.navbar.is-primary .navbar-start>a.navbar-item.is-active,.docstring>section>a.navbar.docs-sourcelink .navbar-start>a.navbar-item.is-active,.navbar.is-primary .navbar-start .navbar-link:focus,.docstring>section>a.navbar.docs-sourcelink .navbar-start .navbar-link:focus,.navbar.is-primary .navbar-start .navbar-link:hover,.docstring>section>a.navbar.docs-sourcelink .navbar-start .navbar-link:hover,.navbar.is-primary .navbar-start .navbar-link.is-active,.docstring>section>a.navbar.docs-sourcelink .navbar-start .navbar-link.is-active,.navbar.is-primary .navbar-end>a.navbar-item:focus,.docstring>section>a.navbar.docs-sourcelink .navbar-end>a.navbar-item:focus,.navbar.is-primary .navbar-end>a.navbar-item:hover,.docstring>section>a.navbar.docs-sourcelink .navbar-end>a.navbar-item:hover,.navbar.is-primary .navbar-end>a.navbar-item.is-active,.docstring>section>a.navbar.docs-sourcelink .navbar-end>a.navbar-item.is-active,.navbar.is-primary .navbar-end .navbar-link:focus,.docstring>section>a.navbar.docs-sourcelink .navbar-end .navbar-link:focus,.navbar.is-primary .navbar-end .navbar-link:hover,.docstring>section>a.navbar.docs-sourcelink .navbar-end .navbar-link:hover,.navbar.is-primary .navbar-end .navbar-link.is-active,.docstring>section>a.navbar.docs-sourcelink .navbar-end .navbar-link.is-active{background-color:#39acda;color:#fff}.navbar.is-primary .navbar-start .navbar-link::after,.docstring>section>a.navbar.docs-sourcelink .navbar-start .navbar-link::after,.navbar.is-primary .navbar-end .navbar-link::after,.docstring>section>a.navbar.docs-sourcelink .navbar-end .navbar-link::after{border-color:#fff}.navbar.is-primary .navbar-item.has-dropdown:focus .navbar-link,.docstring>section>a.navbar.docs-sourcelink .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-primary .navbar-item.has-dropdown:hover .navbar-link,.docstring>section>a.navbar.docs-sourcelink .navbar-item.has-dropdown:hover .navbar-link,.navbar.is-primary .navbar-item.has-dropdown.is-active .navbar-link,.docstring>section>a.navbar.docs-sourcelink .navbar-item.has-dropdown.is-active .navbar-link{background-color:#39acda;color:#fff}.navbar.is-primary .navbar-dropdown a.navbar-item.is-active,.docstring>section>a.navbar.docs-sourcelink .navbar-dropdown a.navbar-item.is-active{background-color:#4eb5de;color:#fff}}.navbar.is-link{background-color:#2e63b8;color:#fff}.navbar.is-link .navbar-brand>.navbar-item,.navbar.is-link .navbar-brand .navbar-link{color:#fff}.navbar.is-link .navbar-brand>a.navbar-item:focus,.navbar.is-link .navbar-brand>a.navbar-item:hover,.navbar.is-link .navbar-brand>a.navbar-item.is-active,.navbar.is-link .navbar-brand .navbar-link:focus,.navbar.is-link .navbar-brand .navbar-link:hover,.navbar.is-link .navbar-brand .navbar-link.is-active{background-color:#2958a4;color:#fff}.navbar.is-link .navbar-brand .navbar-link::after{border-color:#fff}.navbar.is-link .navbar-burger{color:#fff}@media screen and (min-width: 1056px){.navbar.is-link .navbar-start>.navbar-item,.navbar.is-link .navbar-start .navbar-link,.navbar.is-link .navbar-end>.navbar-item,.navbar.is-link .navbar-end .navbar-link{color:#fff}.navbar.is-link .navbar-start>a.navbar-item:focus,.navbar.is-link .navbar-start>a.navbar-item:hover,.navbar.is-link .navbar-start>a.navbar-item.is-active,.navbar.is-link .navbar-start .navbar-link:focus,.navbar.is-link .navbar-start .navbar-link:hover,.navbar.is-link .navbar-start .navbar-link.is-active,.navbar.is-link .navbar-end>a.navbar-item:focus,.navbar.is-link .navbar-end>a.navbar-item:hover,.navbar.is-link .navbar-end>a.navbar-item.is-active,.navbar.is-link .navbar-end .navbar-link:focus,.navbar.is-link .navbar-end .navbar-link:hover,.navbar.is-link .navbar-end .navbar-link.is-active{background-color:#2958a4;color:#fff}.navbar.is-link .navbar-start .navbar-link::after,.navbar.is-link .navbar-end .navbar-link::after{border-color:#fff}.navbar.is-link .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-link .navbar-item.has-dropdown:hover .navbar-link,.navbar.is-link .navbar-item.has-dropdown.is-active .navbar-link{background-color:#2958a4;color:#fff}.navbar.is-link .navbar-dropdown a.navbar-item.is-active{background-color:#2e63b8;color:#fff}}.navbar.is-info{background-color:#209cee;color:#fff}.navbar.is-info .navbar-brand>.navbar-item,.navbar.is-info .navbar-brand .navbar-link{color:#fff}.navbar.is-info .navbar-brand>a.navbar-item:focus,.navbar.is-info .navbar-brand>a.navbar-item:hover,.navbar.is-info .navbar-brand>a.navbar-item.is-active,.navbar.is-info .navbar-brand .navbar-link:focus,.navbar.is-info .navbar-brand .navbar-link:hover,.navbar.is-info .navbar-brand .navbar-link.is-active{background-color:#1190e3;color:#fff}.navbar.is-info .navbar-brand .navbar-link::after{border-color:#fff}.navbar.is-info .navbar-burger{color:#fff}@media screen and (min-width: 1056px){.navbar.is-info .navbar-start>.navbar-item,.navbar.is-info .navbar-start .navbar-link,.navbar.is-info .navbar-end>.navbar-item,.navbar.is-info .navbar-end .navbar-link{color:#fff}.navbar.is-info .navbar-start>a.navbar-item:focus,.navbar.is-info .navbar-start>a.navbar-item:hover,.navbar.is-info .navbar-start>a.navbar-item.is-active,.navbar.is-info .navbar-start .navbar-link:focus,.navbar.is-info .navbar-start .navbar-link:hover,.navbar.is-info .navbar-start .navbar-link.is-active,.navbar.is-info .navbar-end>a.navbar-item:focus,.navbar.is-info .navbar-end>a.navbar-item:hover,.navbar.is-info .navbar-end>a.navbar-item.is-active,.navbar.is-info .navbar-end .navbar-link:focus,.navbar.is-info .navbar-end .navbar-link:hover,.navbar.is-info .navbar-end .navbar-link.is-active{background-color:#1190e3;color:#fff}.navbar.is-info .navbar-start .navbar-link::after,.navbar.is-info .navbar-end .navbar-link::after{border-color:#fff}.navbar.is-info .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-info .navbar-item.has-dropdown:hover .navbar-link,.navbar.is-info .navbar-item.has-dropdown.is-active .navbar-link{background-color:#1190e3;color:#fff}.navbar.is-info .navbar-dropdown a.navbar-item.is-active{background-color:#209cee;color:#fff}}.navbar.is-success{background-color:#22c35b;color:#fff}.navbar.is-success .navbar-brand>.navbar-item,.navbar.is-success .navbar-brand .navbar-link{color:#fff}.navbar.is-success .navbar-brand>a.navbar-item:focus,.navbar.is-success .navbar-brand>a.navbar-item:hover,.navbar.is-success .navbar-brand>a.navbar-item.is-active,.navbar.is-success .navbar-brand .navbar-link:focus,.navbar.is-success .navbar-brand .navbar-link:hover,.navbar.is-success .navbar-brand .navbar-link.is-active{background-color:#1ead51;color:#fff}.navbar.is-success .navbar-brand .navbar-link::after{border-color:#fff}.navbar.is-success .navbar-burger{color:#fff}@media screen and (min-width: 1056px){.navbar.is-success .navbar-start>.navbar-item,.navbar.is-success .navbar-start .navbar-link,.navbar.is-success .navbar-end>.navbar-item,.navbar.is-success .navbar-end .navbar-link{color:#fff}.navbar.is-success .navbar-start>a.navbar-item:focus,.navbar.is-success .navbar-start>a.navbar-item:hover,.navbar.is-success .navbar-start>a.navbar-item.is-active,.navbar.is-success .navbar-start .navbar-link:focus,.navbar.is-success .navbar-start .navbar-link:hover,.navbar.is-success .navbar-start .navbar-link.is-active,.navbar.is-success .navbar-end>a.navbar-item:focus,.navbar.is-success .navbar-end>a.navbar-item:hover,.navbar.is-success .navbar-end>a.navbar-item.is-active,.navbar.is-success .navbar-end .navbar-link:focus,.navbar.is-success .navbar-end .navbar-link:hover,.navbar.is-success .navbar-end .navbar-link.is-active{background-color:#1ead51;color:#fff}.navbar.is-success .navbar-start .navbar-link::after,.navbar.is-success .navbar-end .navbar-link::after{border-color:#fff}.navbar.is-success .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-success .navbar-item.has-dropdown:hover .navbar-link,.navbar.is-success .navbar-item.has-dropdown.is-active .navbar-link{background-color:#1ead51;color:#fff}.navbar.is-success .navbar-dropdown a.navbar-item.is-active{background-color:#22c35b;color:#fff}}.navbar.is-warning{background-color:#ffdd57;color:rgba(0,0,0,0.7)}.navbar.is-warning .navbar-brand>.navbar-item,.navbar.is-warning .navbar-brand .navbar-link{color:rgba(0,0,0,0.7)}.navbar.is-warning .navbar-brand>a.navbar-item:focus,.navbar.is-warning .navbar-brand>a.navbar-item:hover,.navbar.is-warning .navbar-brand>a.navbar-item.is-active,.navbar.is-warning .navbar-brand .navbar-link:focus,.navbar.is-warning .navbar-brand .navbar-link:hover,.navbar.is-warning .navbar-brand .navbar-link.is-active{background-color:#ffd83e;color:rgba(0,0,0,0.7)}.navbar.is-warning .navbar-brand .navbar-link::after{border-color:rgba(0,0,0,0.7)}.navbar.is-warning .navbar-burger{color:rgba(0,0,0,0.7)}@media screen and (min-width: 1056px){.navbar.is-warning .navbar-start>.navbar-item,.navbar.is-warning .navbar-start .navbar-link,.navbar.is-warning .navbar-end>.navbar-item,.navbar.is-warning .navbar-end .navbar-link{color:rgba(0,0,0,0.7)}.navbar.is-warning .navbar-start>a.navbar-item:focus,.navbar.is-warning .navbar-start>a.navbar-item:hover,.navbar.is-warning .navbar-start>a.navbar-item.is-active,.navbar.is-warning .navbar-start .navbar-link:focus,.navbar.is-warning .navbar-start .navbar-link:hover,.navbar.is-warning .navbar-start .navbar-link.is-active,.navbar.is-warning .navbar-end>a.navbar-item:focus,.navbar.is-warning .navbar-end>a.navbar-item:hover,.navbar.is-warning .navbar-end>a.navbar-item.is-active,.navbar.is-warning .navbar-end .navbar-link:focus,.navbar.is-warning .navbar-end .navbar-link:hover,.navbar.is-warning .navbar-end .navbar-link.is-active{background-color:#ffd83e;color:rgba(0,0,0,0.7)}.navbar.is-warning .navbar-start .navbar-link::after,.navbar.is-warning .navbar-end .navbar-link::after{border-color:rgba(0,0,0,0.7)}.navbar.is-warning .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-warning .navbar-item.has-dropdown:hover .navbar-link,.navbar.is-warning .navbar-item.has-dropdown.is-active .navbar-link{background-color:#ffd83e;color:rgba(0,0,0,0.7)}.navbar.is-warning .navbar-dropdown a.navbar-item.is-active{background-color:#ffdd57;color:rgba(0,0,0,0.7)}}.navbar.is-danger{background-color:#da0b00;color:#fff}.navbar.is-danger .navbar-brand>.navbar-item,.navbar.is-danger .navbar-brand .navbar-link{color:#fff}.navbar.is-danger .navbar-brand>a.navbar-item:focus,.navbar.is-danger .navbar-brand>a.navbar-item:hover,.navbar.is-danger .navbar-brand>a.navbar-item.is-active,.navbar.is-danger .navbar-brand .navbar-link:focus,.navbar.is-danger .navbar-brand .navbar-link:hover,.navbar.is-danger .navbar-brand .navbar-link.is-active{background-color:#c10a00;color:#fff}.navbar.is-danger .navbar-brand .navbar-link::after{border-color:#fff}.navbar.is-danger .navbar-burger{color:#fff}@media screen and (min-width: 1056px){.navbar.is-danger .navbar-start>.navbar-item,.navbar.is-danger .navbar-start .navbar-link,.navbar.is-danger .navbar-end>.navbar-item,.navbar.is-danger .navbar-end .navbar-link{color:#fff}.navbar.is-danger .navbar-start>a.navbar-item:focus,.navbar.is-danger .navbar-start>a.navbar-item:hover,.navbar.is-danger .navbar-start>a.navbar-item.is-active,.navbar.is-danger .navbar-start .navbar-link:focus,.navbar.is-danger .navbar-start .navbar-link:hover,.navbar.is-danger .navbar-start .navbar-link.is-active,.navbar.is-danger .navbar-end>a.navbar-item:focus,.navbar.is-danger .navbar-end>a.navbar-item:hover,.navbar.is-danger .navbar-end>a.navbar-item.is-active,.navbar.is-danger .navbar-end .navbar-link:focus,.navbar.is-danger .navbar-end .navbar-link:hover,.navbar.is-danger .navbar-end .navbar-link.is-active{background-color:#c10a00;color:#fff}.navbar.is-danger .navbar-start .navbar-link::after,.navbar.is-danger .navbar-end .navbar-link::after{border-color:#fff}.navbar.is-danger .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-danger .navbar-item.has-dropdown:hover .navbar-link,.navbar.is-danger .navbar-item.has-dropdown.is-active .navbar-link{background-color:#c10a00;color:#fff}.navbar.is-danger .navbar-dropdown a.navbar-item.is-active{background-color:#da0b00;color:#fff}}.navbar>.container{align-items:stretch;display:flex;min-height:3.25rem;width:100%}.navbar.has-shadow{box-shadow:0 2px 0 0 #f5f5f5}.navbar.is-fixed-bottom,.navbar.is-fixed-top{left:0;position:fixed;right:0;z-index:30}.navbar.is-fixed-bottom{bottom:0}.navbar.is-fixed-bottom.has-shadow{box-shadow:0 -2px 0 0 #f5f5f5}.navbar.is-fixed-top{top:0}html.has-navbar-fixed-top,body.has-navbar-fixed-top{padding-top:3.25rem}html.has-navbar-fixed-bottom,body.has-navbar-fixed-bottom{padding-bottom:3.25rem}.navbar-brand,.navbar-tabs{align-items:stretch;display:flex;flex-shrink:0;min-height:3.25rem}.navbar-brand a.navbar-item:focus,.navbar-brand a.navbar-item:hover{background-color:transparent}.navbar-tabs{-webkit-overflow-scrolling:touch;max-width:100vw;overflow-x:auto;overflow-y:hidden}.navbar-burger{color:#222;-moz-appearance:none;-webkit-appearance:none;appearance:none;background:none;border:none;cursor:pointer;display:block;height:3.25rem;position:relative;width:3.25rem;margin-left:auto}.navbar-burger span{background-color:currentColor;display:block;height:1px;left:calc(50% - 8px);position:absolute;transform-origin:center;transition-duration:86ms;transition-property:background-color, opacity, transform;transition-timing-function:ease-out;width:16px}.navbar-burger span:nth-child(1){top:calc(50% - 6px)}.navbar-burger span:nth-child(2){top:calc(50% - 1px)}.navbar-burger span:nth-child(3){top:calc(50% + 4px)}.navbar-burger:hover{background-color:rgba(0,0,0,0.05)}.navbar-burger.is-active span:nth-child(1){transform:translateY(5px) rotate(45deg)}.navbar-burger.is-active span:nth-child(2){opacity:0}.navbar-burger.is-active span:nth-child(3){transform:translateY(-5px) rotate(-45deg)}.navbar-menu{display:none}.navbar-item,.navbar-link{color:#222;display:block;line-height:1.5;padding:0.5rem 0.75rem;position:relative}.navbar-item .icon:only-child,.navbar-link .icon:only-child{margin-left:-0.25rem;margin-right:-0.25rem}a.navbar-item,.navbar-link{cursor:pointer}a.navbar-item:focus,a.navbar-item:focus-within,a.navbar-item:hover,a.navbar-item.is-active,.navbar-link:focus,.navbar-link:focus-within,.navbar-link:hover,.navbar-link.is-active{background-color:#fafafa;color:#2e63b8}.navbar-item{flex-grow:0;flex-shrink:0}.navbar-item img{max-height:1.75rem}.navbar-item.has-dropdown{padding:0}.navbar-item.is-expanded{flex-grow:1;flex-shrink:1}.navbar-item.is-tab{border-bottom:1px solid transparent;min-height:3.25rem;padding-bottom:calc(0.5rem - 1px)}.navbar-item.is-tab:focus,.navbar-item.is-tab:hover{background-color:rgba(0,0,0,0);border-bottom-color:#2e63b8}.navbar-item.is-tab.is-active{background-color:rgba(0,0,0,0);border-bottom-color:#2e63b8;border-bottom-style:solid;border-bottom-width:3px;color:#2e63b8;padding-bottom:calc(0.5rem - 3px)}.navbar-content{flex-grow:1;flex-shrink:1}.navbar-link:not(.is-arrowless){padding-right:2.5em}.navbar-link:not(.is-arrowless)::after{border-color:#2e63b8;margin-top:-0.375em;right:1.125em}.navbar-dropdown{font-size:0.875rem;padding-bottom:0.5rem;padding-top:0.5rem}.navbar-dropdown .navbar-item{padding-left:1.5rem;padding-right:1.5rem}.navbar-divider{background-color:#f5f5f5;border:none;display:none;height:2px;margin:0.5rem 0}@media screen and (max-width: 1055px){.navbar>.container{display:block}.navbar-brand .navbar-item,.navbar-tabs .navbar-item{align-items:center;display:flex}.navbar-link::after{display:none}.navbar-menu{background-color:#fff;box-shadow:0 8px 16px rgba(10,10,10,0.1);padding:0.5rem 0}.navbar-menu.is-active{display:block}.navbar.is-fixed-bottom-touch,.navbar.is-fixed-top-touch{left:0;position:fixed;right:0;z-index:30}.navbar.is-fixed-bottom-touch{bottom:0}.navbar.is-fixed-bottom-touch.has-shadow{box-shadow:0 -2px 3px rgba(10,10,10,0.1)}.navbar.is-fixed-top-touch{top:0}.navbar.is-fixed-top .navbar-menu,.navbar.is-fixed-top-touch .navbar-menu{-webkit-overflow-scrolling:touch;max-height:calc(100vh - 3.25rem);overflow:auto}html.has-navbar-fixed-top-touch,body.has-navbar-fixed-top-touch{padding-top:3.25rem}html.has-navbar-fixed-bottom-touch,body.has-navbar-fixed-bottom-touch{padding-bottom:3.25rem}}@media screen and (min-width: 1056px){.navbar,.navbar-menu,.navbar-start,.navbar-end{align-items:stretch;display:flex}.navbar{min-height:3.25rem}.navbar.is-spaced{padding:1rem 2rem}.navbar.is-spaced .navbar-start,.navbar.is-spaced .navbar-end{align-items:center}.navbar.is-spaced a.navbar-item,.navbar.is-spaced .navbar-link{border-radius:4px}.navbar.is-transparent a.navbar-item:focus,.navbar.is-transparent a.navbar-item:hover,.navbar.is-transparent a.navbar-item.is-active,.navbar.is-transparent .navbar-link:focus,.navbar.is-transparent .navbar-link:hover,.navbar.is-transparent .navbar-link.is-active{background-color:transparent !important}.navbar.is-transparent .navbar-item.has-dropdown.is-active .navbar-link,.navbar.is-transparent .navbar-item.has-dropdown.is-hoverable:focus .navbar-link,.navbar.is-transparent .navbar-item.has-dropdown.is-hoverable:focus-within .navbar-link,.navbar.is-transparent .navbar-item.has-dropdown.is-hoverable:hover .navbar-link{background-color:transparent !important}.navbar.is-transparent .navbar-dropdown a.navbar-item:focus,.navbar.is-transparent .navbar-dropdown a.navbar-item:hover{background-color:#f5f5f5;color:#0a0a0a}.navbar.is-transparent .navbar-dropdown a.navbar-item.is-active{background-color:#f5f5f5;color:#2e63b8}.navbar-burger{display:none}.navbar-item,.navbar-link{align-items:center;display:flex}.navbar-item.has-dropdown{align-items:stretch}.navbar-item.has-dropdown-up .navbar-link::after{transform:rotate(135deg) translate(0.25em, -0.25em)}.navbar-item.has-dropdown-up .navbar-dropdown{border-bottom:2px solid #dbdbdb;border-radius:6px 6px 0 0;border-top:none;bottom:100%;box-shadow:0 -8px 8px rgba(10,10,10,0.1);top:auto}.navbar-item.is-active .navbar-dropdown,.navbar-item.is-hoverable:focus .navbar-dropdown,.navbar-item.is-hoverable:focus-within .navbar-dropdown,.navbar-item.is-hoverable:hover .navbar-dropdown{display:block}.navbar.is-spaced .navbar-item.is-active .navbar-dropdown,.navbar-item.is-active .navbar-dropdown.is-boxed,.navbar.is-spaced .navbar-item.is-hoverable:focus .navbar-dropdown,.navbar-item.is-hoverable:focus .navbar-dropdown.is-boxed,.navbar.is-spaced .navbar-item.is-hoverable:focus-within .navbar-dropdown,.navbar-item.is-hoverable:focus-within .navbar-dropdown.is-boxed,.navbar.is-spaced .navbar-item.is-hoverable:hover .navbar-dropdown,.navbar-item.is-hoverable:hover .navbar-dropdown.is-boxed{opacity:1;pointer-events:auto;transform:translateY(0)}.navbar-menu{flex-grow:1;flex-shrink:0}.navbar-start{justify-content:flex-start;margin-right:auto}.navbar-end{justify-content:flex-end;margin-left:auto}.navbar-dropdown{background-color:#fff;border-bottom-left-radius:6px;border-bottom-right-radius:6px;border-top:2px solid #dbdbdb;box-shadow:0 8px 8px rgba(10,10,10,0.1);display:none;font-size:0.875rem;left:0;min-width:100%;position:absolute;top:100%;z-index:20}.navbar-dropdown .navbar-item{padding:0.375rem 1rem;white-space:nowrap}.navbar-dropdown a.navbar-item{padding-right:3rem}.navbar-dropdown a.navbar-item:focus,.navbar-dropdown a.navbar-item:hover{background-color:#f5f5f5;color:#0a0a0a}.navbar-dropdown a.navbar-item.is-active{background-color:#f5f5f5;color:#2e63b8}.navbar.is-spaced .navbar-dropdown,.navbar-dropdown.is-boxed{border-radius:6px;border-top:none;box-shadow:0 8px 8px rgba(10,10,10,0.1), 0 0 0 1px rgba(10,10,10,0.1);display:block;opacity:0;pointer-events:none;top:calc(100% + (-4px));transform:translateY(-5px);transition-duration:86ms;transition-property:opacity, transform}.navbar-dropdown.is-right{left:auto;right:0}.navbar-divider{display:block}.navbar>.container .navbar-brand,.container>.navbar .navbar-brand{margin-left:-.75rem}.navbar>.container .navbar-menu,.container>.navbar .navbar-menu{margin-right:-.75rem}.navbar.is-fixed-bottom-desktop,.navbar.is-fixed-top-desktop{left:0;position:fixed;right:0;z-index:30}.navbar.is-fixed-bottom-desktop{bottom:0}.navbar.is-fixed-bottom-desktop.has-shadow{box-shadow:0 -2px 3px rgba(10,10,10,0.1)}.navbar.is-fixed-top-desktop{top:0}html.has-navbar-fixed-top-desktop,body.has-navbar-fixed-top-desktop{padding-top:3.25rem}html.has-navbar-fixed-bottom-desktop,body.has-navbar-fixed-bottom-desktop{padding-bottom:3.25rem}html.has-spaced-navbar-fixed-top,body.has-spaced-navbar-fixed-top{padding-top:5.25rem}html.has-spaced-navbar-fixed-bottom,body.has-spaced-navbar-fixed-bottom{padding-bottom:5.25rem}a.navbar-item.is-active,.navbar-link.is-active{color:#0a0a0a}a.navbar-item.is-active:not(:focus):not(:hover),.navbar-link.is-active:not(:focus):not(:hover){background-color:rgba(0,0,0,0)}.navbar-item.has-dropdown:focus .navbar-link,.navbar-item.has-dropdown:hover .navbar-link,.navbar-item.has-dropdown.is-active .navbar-link{background-color:#fafafa}}.hero.is-fullheight-with-navbar{min-height:calc(100vh - 3.25rem)}.pagination{font-size:1rem;margin:-.25rem}.pagination.is-small,#documenter .docs-sidebar form.docs-search>input.pagination{font-size:.75rem}.pagination.is-medium{font-size:1.25rem}.pagination.is-large{font-size:1.5rem}.pagination.is-rounded .pagination-previous,#documenter .docs-sidebar form.docs-search>input.pagination .pagination-previous,.pagination.is-rounded .pagination-next,#documenter .docs-sidebar form.docs-search>input.pagination .pagination-next{padding-left:1em;padding-right:1em;border-radius:9999px}.pagination.is-rounded .pagination-link,#documenter .docs-sidebar form.docs-search>input.pagination .pagination-link{border-radius:9999px}.pagination,.pagination-list{align-items:center;display:flex;justify-content:center;text-align:center}.pagination-previous,.pagination-next,.pagination-link,.pagination-ellipsis{font-size:1em;justify-content:center;margin:.25rem;padding-left:.5em;padding-right:.5em;text-align:center}.pagination-previous,.pagination-next,.pagination-link{border-color:#dbdbdb;color:#222;min-width:2.5em}.pagination-previous:hover,.pagination-next:hover,.pagination-link:hover{border-color:#b5b5b5;color:#363636}.pagination-previous:focus,.pagination-next:focus,.pagination-link:focus{border-color:#3c5dcd}.pagination-previous:active,.pagination-next:active,.pagination-link:active{box-shadow:inset 0 1px 2px rgba(10,10,10,0.2)}.pagination-previous[disabled],.pagination-previous.is-disabled,.pagination-next[disabled],.pagination-next.is-disabled,.pagination-link[disabled],.pagination-link.is-disabled{background-color:#dbdbdb;border-color:#dbdbdb;box-shadow:none;color:#6b6b6b;opacity:0.5}.pagination-previous,.pagination-next{padding-left:.75em;padding-right:.75em;white-space:nowrap}.pagination-link.is-current{background-color:#2e63b8;border-color:#2e63b8;color:#fff}.pagination-ellipsis{color:#b5b5b5;pointer-events:none}.pagination-list{flex-wrap:wrap}.pagination-list li{list-style:none}@media screen and (max-width: 768px){.pagination{flex-wrap:wrap}.pagination-previous,.pagination-next{flex-grow:1;flex-shrink:1}.pagination-list li{flex-grow:1;flex-shrink:1}}@media screen and (min-width: 769px),print{.pagination-list{flex-grow:1;flex-shrink:1;justify-content:flex-start;order:1}.pagination-previous,.pagination-next,.pagination-link,.pagination-ellipsis{margin-bottom:0;margin-top:0}.pagination-previous{order:2}.pagination-next{order:3}.pagination{justify-content:space-between;margin-bottom:0;margin-top:0}.pagination.is-centered .pagination-previous{order:1}.pagination.is-centered .pagination-list{justify-content:center;order:2}.pagination.is-centered .pagination-next{order:3}.pagination.is-right .pagination-previous{order:1}.pagination.is-right .pagination-next{order:2}.pagination.is-right .pagination-list{justify-content:flex-end;order:3}}.panel{border-radius:6px;box-shadow:#bbb;font-size:1rem}.panel:not(:last-child){margin-bottom:1.5rem}.panel.is-white .panel-heading{background-color:#fff;color:#0a0a0a}.panel.is-white .panel-tabs a.is-active{border-bottom-color:#fff}.panel.is-white .panel-block.is-active .panel-icon{color:#fff}.panel.is-black .panel-heading{background-color:#0a0a0a;color:#fff}.panel.is-black .panel-tabs a.is-active{border-bottom-color:#0a0a0a}.panel.is-black .panel-block.is-active .panel-icon{color:#0a0a0a}.panel.is-light .panel-heading{background-color:#f5f5f5;color:rgba(0,0,0,0.7)}.panel.is-light .panel-tabs a.is-active{border-bottom-color:#f5f5f5}.panel.is-light .panel-block.is-active .panel-icon{color:#f5f5f5}.panel.is-dark .panel-heading,.content kbd.panel .panel-heading{background-color:#363636;color:#fff}.panel.is-dark .panel-tabs a.is-active,.content kbd.panel .panel-tabs a.is-active{border-bottom-color:#363636}.panel.is-dark .panel-block.is-active .panel-icon,.content kbd.panel .panel-block.is-active .panel-icon{color:#363636}.panel.is-primary .panel-heading,.docstring>section>a.panel.docs-sourcelink .panel-heading{background-color:#4eb5de;color:#fff}.panel.is-primary .panel-tabs a.is-active,.docstring>section>a.panel.docs-sourcelink .panel-tabs a.is-active{border-bottom-color:#4eb5de}.panel.is-primary .panel-block.is-active .panel-icon,.docstring>section>a.panel.docs-sourcelink .panel-block.is-active .panel-icon{color:#4eb5de}.panel.is-link .panel-heading{background-color:#2e63b8;color:#fff}.panel.is-link .panel-tabs a.is-active{border-bottom-color:#2e63b8}.panel.is-link .panel-block.is-active .panel-icon{color:#2e63b8}.panel.is-info .panel-heading{background-color:#209cee;color:#fff}.panel.is-info .panel-tabs a.is-active{border-bottom-color:#209cee}.panel.is-info .panel-block.is-active .panel-icon{color:#209cee}.panel.is-success .panel-heading{background-color:#22c35b;color:#fff}.panel.is-success .panel-tabs a.is-active{border-bottom-color:#22c35b}.panel.is-success .panel-block.is-active .panel-icon{color:#22c35b}.panel.is-warning .panel-heading{background-color:#ffdd57;color:rgba(0,0,0,0.7)}.panel.is-warning .panel-tabs a.is-active{border-bottom-color:#ffdd57}.panel.is-warning .panel-block.is-active .panel-icon{color:#ffdd57}.panel.is-danger .panel-heading{background-color:#da0b00;color:#fff}.panel.is-danger .panel-tabs a.is-active{border-bottom-color:#da0b00}.panel.is-danger .panel-block.is-active .panel-icon{color:#da0b00}.panel-tabs:not(:last-child),.panel-block:not(:last-child){border-bottom:1px solid #ededed}.panel-heading{background-color:#ededed;border-radius:6px 6px 0 0;color:#222;font-size:1.25em;font-weight:700;line-height:1.25;padding:0.75em 1em}.panel-tabs{align-items:flex-end;display:flex;font-size:.875em;justify-content:center}.panel-tabs a{border-bottom:1px solid #dbdbdb;margin-bottom:-1px;padding:0.5em}.panel-tabs a.is-active{border-bottom-color:#4a4a4a;color:#363636}.panel-list a{color:#222}.panel-list a:hover{color:#2e63b8}.panel-block{align-items:center;color:#222;display:flex;justify-content:flex-start;padding:0.5em 0.75em}.panel-block input[type="checkbox"]{margin-right:.75em}.panel-block>.control{flex-grow:1;flex-shrink:1;width:100%}.panel-block.is-wrapped{flex-wrap:wrap}.panel-block.is-active{border-left-color:#2e63b8;color:#363636}.panel-block.is-active .panel-icon{color:#2e63b8}.panel-block:last-child{border-bottom-left-radius:6px;border-bottom-right-radius:6px}a.panel-block,label.panel-block{cursor:pointer}a.panel-block:hover,label.panel-block:hover{background-color:#f5f5f5}.panel-icon{display:inline-block;font-size:14px;height:1em;line-height:1em;text-align:center;vertical-align:top;width:1em;color:#6b6b6b;margin-right:.75em}.panel-icon .fa{font-size:inherit;line-height:inherit}.tabs{-webkit-overflow-scrolling:touch;align-items:stretch;display:flex;font-size:1rem;justify-content:space-between;overflow:hidden;overflow-x:auto;white-space:nowrap}.tabs a{align-items:center;border-bottom-color:#dbdbdb;border-bottom-style:solid;border-bottom-width:1px;color:#222;display:flex;justify-content:center;margin-bottom:-1px;padding:0.5em 1em;vertical-align:top}.tabs a:hover{border-bottom-color:#222;color:#222}.tabs li{display:block}.tabs li.is-active a{border-bottom-color:#2e63b8;color:#2e63b8}.tabs ul{align-items:center;border-bottom-color:#dbdbdb;border-bottom-style:solid;border-bottom-width:1px;display:flex;flex-grow:1;flex-shrink:0;justify-content:flex-start}.tabs ul.is-left{padding-right:0.75em}.tabs ul.is-center{flex:none;justify-content:center;padding-left:0.75em;padding-right:0.75em}.tabs ul.is-right{justify-content:flex-end;padding-left:0.75em}.tabs .icon:first-child{margin-right:.5em}.tabs .icon:last-child{margin-left:.5em}.tabs.is-centered ul{justify-content:center}.tabs.is-right ul{justify-content:flex-end}.tabs.is-boxed a{border:1px solid transparent;border-radius:4px 4px 0 0}.tabs.is-boxed a:hover{background-color:#f5f5f5;border-bottom-color:#dbdbdb}.tabs.is-boxed li.is-active a{background-color:#fff;border-color:#dbdbdb;border-bottom-color:rgba(0,0,0,0) !important}.tabs.is-fullwidth li{flex-grow:1;flex-shrink:0}.tabs.is-toggle a{border-color:#dbdbdb;border-style:solid;border-width:1px;margin-bottom:0;position:relative}.tabs.is-toggle a:hover{background-color:#f5f5f5;border-color:#b5b5b5;z-index:2}.tabs.is-toggle li+li{margin-left:-1px}.tabs.is-toggle li:first-child a{border-top-left-radius:4px;border-bottom-left-radius:4px}.tabs.is-toggle li:last-child a{border-top-right-radius:4px;border-bottom-right-radius:4px}.tabs.is-toggle li.is-active a{background-color:#2e63b8;border-color:#2e63b8;color:#fff;z-index:1}.tabs.is-toggle ul{border-bottom:none}.tabs.is-toggle.is-toggle-rounded li:first-child a{border-bottom-left-radius:9999px;border-top-left-radius:9999px;padding-left:1.25em}.tabs.is-toggle.is-toggle-rounded li:last-child a{border-bottom-right-radius:9999px;border-top-right-radius:9999px;padding-right:1.25em}.tabs.is-small,#documenter .docs-sidebar form.docs-search>input.tabs{font-size:.75rem}.tabs.is-medium{font-size:1.25rem}.tabs.is-large{font-size:1.5rem}.column{display:block;flex-basis:0;flex-grow:1;flex-shrink:1;padding:.75rem}.columns.is-mobile>.column.is-narrow{flex:none;width:unset}.columns.is-mobile>.column.is-full{flex:none;width:100%}.columns.is-mobile>.column.is-three-quarters{flex:none;width:75%}.columns.is-mobile>.column.is-two-thirds{flex:none;width:66.6666%}.columns.is-mobile>.column.is-half{flex:none;width:50%}.columns.is-mobile>.column.is-one-third{flex:none;width:33.3333%}.columns.is-mobile>.column.is-one-quarter{flex:none;width:25%}.columns.is-mobile>.column.is-one-fifth{flex:none;width:20%}.columns.is-mobile>.column.is-two-fifths{flex:none;width:40%}.columns.is-mobile>.column.is-three-fifths{flex:none;width:60%}.columns.is-mobile>.column.is-four-fifths{flex:none;width:80%}.columns.is-mobile>.column.is-offset-three-quarters{margin-left:75%}.columns.is-mobile>.column.is-offset-two-thirds{margin-left:66.6666%}.columns.is-mobile>.column.is-offset-half{margin-left:50%}.columns.is-mobile>.column.is-offset-one-third{margin-left:33.3333%}.columns.is-mobile>.column.is-offset-one-quarter{margin-left:25%}.columns.is-mobile>.column.is-offset-one-fifth{margin-left:20%}.columns.is-mobile>.column.is-offset-two-fifths{margin-left:40%}.columns.is-mobile>.column.is-offset-three-fifths{margin-left:60%}.columns.is-mobile>.column.is-offset-four-fifths{margin-left:80%}.columns.is-mobile>.column.is-0{flex:none;width:0%}.columns.is-mobile>.column.is-offset-0{margin-left:0%}.columns.is-mobile>.column.is-1{flex:none;width:8.33333337%}.columns.is-mobile>.column.is-offset-1{margin-left:8.33333337%}.columns.is-mobile>.column.is-2{flex:none;width:16.66666674%}.columns.is-mobile>.column.is-offset-2{margin-left:16.66666674%}.columns.is-mobile>.column.is-3{flex:none;width:25%}.columns.is-mobile>.column.is-offset-3{margin-left:25%}.columns.is-mobile>.column.is-4{flex:none;width:33.33333337%}.columns.is-mobile>.column.is-offset-4{margin-left:33.33333337%}.columns.is-mobile>.column.is-5{flex:none;width:41.66666674%}.columns.is-mobile>.column.is-offset-5{margin-left:41.66666674%}.columns.is-mobile>.column.is-6{flex:none;width:50%}.columns.is-mobile>.column.is-offset-6{margin-left:50%}.columns.is-mobile>.column.is-7{flex:none;width:58.33333337%}.columns.is-mobile>.column.is-offset-7{margin-left:58.33333337%}.columns.is-mobile>.column.is-8{flex:none;width:66.66666674%}.columns.is-mobile>.column.is-offset-8{margin-left:66.66666674%}.columns.is-mobile>.column.is-9{flex:none;width:75%}.columns.is-mobile>.column.is-offset-9{margin-left:75%}.columns.is-mobile>.column.is-10{flex:none;width:83.33333337%}.columns.is-mobile>.column.is-offset-10{margin-left:83.33333337%}.columns.is-mobile>.column.is-11{flex:none;width:91.66666674%}.columns.is-mobile>.column.is-offset-11{margin-left:91.66666674%}.columns.is-mobile>.column.is-12{flex:none;width:100%}.columns.is-mobile>.column.is-offset-12{margin-left:100%}@media screen and (max-width: 768px){.column.is-narrow-mobile{flex:none;width:unset}.column.is-full-mobile{flex:none;width:100%}.column.is-three-quarters-mobile{flex:none;width:75%}.column.is-two-thirds-mobile{flex:none;width:66.6666%}.column.is-half-mobile{flex:none;width:50%}.column.is-one-third-mobile{flex:none;width:33.3333%}.column.is-one-quarter-mobile{flex:none;width:25%}.column.is-one-fifth-mobile{flex:none;width:20%}.column.is-two-fifths-mobile{flex:none;width:40%}.column.is-three-fifths-mobile{flex:none;width:60%}.column.is-four-fifths-mobile{flex:none;width:80%}.column.is-offset-three-quarters-mobile{margin-left:75%}.column.is-offset-two-thirds-mobile{margin-left:66.6666%}.column.is-offset-half-mobile{margin-left:50%}.column.is-offset-one-third-mobile{margin-left:33.3333%}.column.is-offset-one-quarter-mobile{margin-left:25%}.column.is-offset-one-fifth-mobile{margin-left:20%}.column.is-offset-two-fifths-mobile{margin-left:40%}.column.is-offset-three-fifths-mobile{margin-left:60%}.column.is-offset-four-fifths-mobile{margin-left:80%}.column.is-0-mobile{flex:none;width:0%}.column.is-offset-0-mobile{margin-left:0%}.column.is-1-mobile{flex:none;width:8.33333337%}.column.is-offset-1-mobile{margin-left:8.33333337%}.column.is-2-mobile{flex:none;width:16.66666674%}.column.is-offset-2-mobile{margin-left:16.66666674%}.column.is-3-mobile{flex:none;width:25%}.column.is-offset-3-mobile{margin-left:25%}.column.is-4-mobile{flex:none;width:33.33333337%}.column.is-offset-4-mobile{margin-left:33.33333337%}.column.is-5-mobile{flex:none;width:41.66666674%}.column.is-offset-5-mobile{margin-left:41.66666674%}.column.is-6-mobile{flex:none;width:50%}.column.is-offset-6-mobile{margin-left:50%}.column.is-7-mobile{flex:none;width:58.33333337%}.column.is-offset-7-mobile{margin-left:58.33333337%}.column.is-8-mobile{flex:none;width:66.66666674%}.column.is-offset-8-mobile{margin-left:66.66666674%}.column.is-9-mobile{flex:none;width:75%}.column.is-offset-9-mobile{margin-left:75%}.column.is-10-mobile{flex:none;width:83.33333337%}.column.is-offset-10-mobile{margin-left:83.33333337%}.column.is-11-mobile{flex:none;width:91.66666674%}.column.is-offset-11-mobile{margin-left:91.66666674%}.column.is-12-mobile{flex:none;width:100%}.column.is-offset-12-mobile{margin-left:100%}}@media screen and (min-width: 769px),print{.column.is-narrow,.column.is-narrow-tablet{flex:none;width:unset}.column.is-full,.column.is-full-tablet{flex:none;width:100%}.column.is-three-quarters,.column.is-three-quarters-tablet{flex:none;width:75%}.column.is-two-thirds,.column.is-two-thirds-tablet{flex:none;width:66.6666%}.column.is-half,.column.is-half-tablet{flex:none;width:50%}.column.is-one-third,.column.is-one-third-tablet{flex:none;width:33.3333%}.column.is-one-quarter,.column.is-one-quarter-tablet{flex:none;width:25%}.column.is-one-fifth,.column.is-one-fifth-tablet{flex:none;width:20%}.column.is-two-fifths,.column.is-two-fifths-tablet{flex:none;width:40%}.column.is-three-fifths,.column.is-three-fifths-tablet{flex:none;width:60%}.column.is-four-fifths,.column.is-four-fifths-tablet{flex:none;width:80%}.column.is-offset-three-quarters,.column.is-offset-three-quarters-tablet{margin-left:75%}.column.is-offset-two-thirds,.column.is-offset-two-thirds-tablet{margin-left:66.6666%}.column.is-offset-half,.column.is-offset-half-tablet{margin-left:50%}.column.is-offset-one-third,.column.is-offset-one-third-tablet{margin-left:33.3333%}.column.is-offset-one-quarter,.column.is-offset-one-quarter-tablet{margin-left:25%}.column.is-offset-one-fifth,.column.is-offset-one-fifth-tablet{margin-left:20%}.column.is-offset-two-fifths,.column.is-offset-two-fifths-tablet{margin-left:40%}.column.is-offset-three-fifths,.column.is-offset-three-fifths-tablet{margin-left:60%}.column.is-offset-four-fifths,.column.is-offset-four-fifths-tablet{margin-left:80%}.column.is-0,.column.is-0-tablet{flex:none;width:0%}.column.is-offset-0,.column.is-offset-0-tablet{margin-left:0%}.column.is-1,.column.is-1-tablet{flex:none;width:8.33333337%}.column.is-offset-1,.column.is-offset-1-tablet{margin-left:8.33333337%}.column.is-2,.column.is-2-tablet{flex:none;width:16.66666674%}.column.is-offset-2,.column.is-offset-2-tablet{margin-left:16.66666674%}.column.is-3,.column.is-3-tablet{flex:none;width:25%}.column.is-offset-3,.column.is-offset-3-tablet{margin-left:25%}.column.is-4,.column.is-4-tablet{flex:none;width:33.33333337%}.column.is-offset-4,.column.is-offset-4-tablet{margin-left:33.33333337%}.column.is-5,.column.is-5-tablet{flex:none;width:41.66666674%}.column.is-offset-5,.column.is-offset-5-tablet{margin-left:41.66666674%}.column.is-6,.column.is-6-tablet{flex:none;width:50%}.column.is-offset-6,.column.is-offset-6-tablet{margin-left:50%}.column.is-7,.column.is-7-tablet{flex:none;width:58.33333337%}.column.is-offset-7,.column.is-offset-7-tablet{margin-left:58.33333337%}.column.is-8,.column.is-8-tablet{flex:none;width:66.66666674%}.column.is-offset-8,.column.is-offset-8-tablet{margin-left:66.66666674%}.column.is-9,.column.is-9-tablet{flex:none;width:75%}.column.is-offset-9,.column.is-offset-9-tablet{margin-left:75%}.column.is-10,.column.is-10-tablet{flex:none;width:83.33333337%}.column.is-offset-10,.column.is-offset-10-tablet{margin-left:83.33333337%}.column.is-11,.column.is-11-tablet{flex:none;width:91.66666674%}.column.is-offset-11,.column.is-offset-11-tablet{margin-left:91.66666674%}.column.is-12,.column.is-12-tablet{flex:none;width:100%}.column.is-offset-12,.column.is-offset-12-tablet{margin-left:100%}}@media screen and (max-width: 1055px){.column.is-narrow-touch{flex:none;width:unset}.column.is-full-touch{flex:none;width:100%}.column.is-three-quarters-touch{flex:none;width:75%}.column.is-two-thirds-touch{flex:none;width:66.6666%}.column.is-half-touch{flex:none;width:50%}.column.is-one-third-touch{flex:none;width:33.3333%}.column.is-one-quarter-touch{flex:none;width:25%}.column.is-one-fifth-touch{flex:none;width:20%}.column.is-two-fifths-touch{flex:none;width:40%}.column.is-three-fifths-touch{flex:none;width:60%}.column.is-four-fifths-touch{flex:none;width:80%}.column.is-offset-three-quarters-touch{margin-left:75%}.column.is-offset-two-thirds-touch{margin-left:66.6666%}.column.is-offset-half-touch{margin-left:50%}.column.is-offset-one-third-touch{margin-left:33.3333%}.column.is-offset-one-quarter-touch{margin-left:25%}.column.is-offset-one-fifth-touch{margin-left:20%}.column.is-offset-two-fifths-touch{margin-left:40%}.column.is-offset-three-fifths-touch{margin-left:60%}.column.is-offset-four-fifths-touch{margin-left:80%}.column.is-0-touch{flex:none;width:0%}.column.is-offset-0-touch{margin-left:0%}.column.is-1-touch{flex:none;width:8.33333337%}.column.is-offset-1-touch{margin-left:8.33333337%}.column.is-2-touch{flex:none;width:16.66666674%}.column.is-offset-2-touch{margin-left:16.66666674%}.column.is-3-touch{flex:none;width:25%}.column.is-offset-3-touch{margin-left:25%}.column.is-4-touch{flex:none;width:33.33333337%}.column.is-offset-4-touch{margin-left:33.33333337%}.column.is-5-touch{flex:none;width:41.66666674%}.column.is-offset-5-touch{margin-left:41.66666674%}.column.is-6-touch{flex:none;width:50%}.column.is-offset-6-touch{margin-left:50%}.column.is-7-touch{flex:none;width:58.33333337%}.column.is-offset-7-touch{margin-left:58.33333337%}.column.is-8-touch{flex:none;width:66.66666674%}.column.is-offset-8-touch{margin-left:66.66666674%}.column.is-9-touch{flex:none;width:75%}.column.is-offset-9-touch{margin-left:75%}.column.is-10-touch{flex:none;width:83.33333337%}.column.is-offset-10-touch{margin-left:83.33333337%}.column.is-11-touch{flex:none;width:91.66666674%}.column.is-offset-11-touch{margin-left:91.66666674%}.column.is-12-touch{flex:none;width:100%}.column.is-offset-12-touch{margin-left:100%}}@media screen and (min-width: 1056px){.column.is-narrow-desktop{flex:none;width:unset}.column.is-full-desktop{flex:none;width:100%}.column.is-three-quarters-desktop{flex:none;width:75%}.column.is-two-thirds-desktop{flex:none;width:66.6666%}.column.is-half-desktop{flex:none;width:50%}.column.is-one-third-desktop{flex:none;width:33.3333%}.column.is-one-quarter-desktop{flex:none;width:25%}.column.is-one-fifth-desktop{flex:none;width:20%}.column.is-two-fifths-desktop{flex:none;width:40%}.column.is-three-fifths-desktop{flex:none;width:60%}.column.is-four-fifths-desktop{flex:none;width:80%}.column.is-offset-three-quarters-desktop{margin-left:75%}.column.is-offset-two-thirds-desktop{margin-left:66.6666%}.column.is-offset-half-desktop{margin-left:50%}.column.is-offset-one-third-desktop{margin-left:33.3333%}.column.is-offset-one-quarter-desktop{margin-left:25%}.column.is-offset-one-fifth-desktop{margin-left:20%}.column.is-offset-two-fifths-desktop{margin-left:40%}.column.is-offset-three-fifths-desktop{margin-left:60%}.column.is-offset-four-fifths-desktop{margin-left:80%}.column.is-0-desktop{flex:none;width:0%}.column.is-offset-0-desktop{margin-left:0%}.column.is-1-desktop{flex:none;width:8.33333337%}.column.is-offset-1-desktop{margin-left:8.33333337%}.column.is-2-desktop{flex:none;width:16.66666674%}.column.is-offset-2-desktop{margin-left:16.66666674%}.column.is-3-desktop{flex:none;width:25%}.column.is-offset-3-desktop{margin-left:25%}.column.is-4-desktop{flex:none;width:33.33333337%}.column.is-offset-4-desktop{margin-left:33.33333337%}.column.is-5-desktop{flex:none;width:41.66666674%}.column.is-offset-5-desktop{margin-left:41.66666674%}.column.is-6-desktop{flex:none;width:50%}.column.is-offset-6-desktop{margin-left:50%}.column.is-7-desktop{flex:none;width:58.33333337%}.column.is-offset-7-desktop{margin-left:58.33333337%}.column.is-8-desktop{flex:none;width:66.66666674%}.column.is-offset-8-desktop{margin-left:66.66666674%}.column.is-9-desktop{flex:none;width:75%}.column.is-offset-9-desktop{margin-left:75%}.column.is-10-desktop{flex:none;width:83.33333337%}.column.is-offset-10-desktop{margin-left:83.33333337%}.column.is-11-desktop{flex:none;width:91.66666674%}.column.is-offset-11-desktop{margin-left:91.66666674%}.column.is-12-desktop{flex:none;width:100%}.column.is-offset-12-desktop{margin-left:100%}}@media screen and (min-width: 1216px){.column.is-narrow-widescreen{flex:none;width:unset}.column.is-full-widescreen{flex:none;width:100%}.column.is-three-quarters-widescreen{flex:none;width:75%}.column.is-two-thirds-widescreen{flex:none;width:66.6666%}.column.is-half-widescreen{flex:none;width:50%}.column.is-one-third-widescreen{flex:none;width:33.3333%}.column.is-one-quarter-widescreen{flex:none;width:25%}.column.is-one-fifth-widescreen{flex:none;width:20%}.column.is-two-fifths-widescreen{flex:none;width:40%}.column.is-three-fifths-widescreen{flex:none;width:60%}.column.is-four-fifths-widescreen{flex:none;width:80%}.column.is-offset-three-quarters-widescreen{margin-left:75%}.column.is-offset-two-thirds-widescreen{margin-left:66.6666%}.column.is-offset-half-widescreen{margin-left:50%}.column.is-offset-one-third-widescreen{margin-left:33.3333%}.column.is-offset-one-quarter-widescreen{margin-left:25%}.column.is-offset-one-fifth-widescreen{margin-left:20%}.column.is-offset-two-fifths-widescreen{margin-left:40%}.column.is-offset-three-fifths-widescreen{margin-left:60%}.column.is-offset-four-fifths-widescreen{margin-left:80%}.column.is-0-widescreen{flex:none;width:0%}.column.is-offset-0-widescreen{margin-left:0%}.column.is-1-widescreen{flex:none;width:8.33333337%}.column.is-offset-1-widescreen{margin-left:8.33333337%}.column.is-2-widescreen{flex:none;width:16.66666674%}.column.is-offset-2-widescreen{margin-left:16.66666674%}.column.is-3-widescreen{flex:none;width:25%}.column.is-offset-3-widescreen{margin-left:25%}.column.is-4-widescreen{flex:none;width:33.33333337%}.column.is-offset-4-widescreen{margin-left:33.33333337%}.column.is-5-widescreen{flex:none;width:41.66666674%}.column.is-offset-5-widescreen{margin-left:41.66666674%}.column.is-6-widescreen{flex:none;width:50%}.column.is-offset-6-widescreen{margin-left:50%}.column.is-7-widescreen{flex:none;width:58.33333337%}.column.is-offset-7-widescreen{margin-left:58.33333337%}.column.is-8-widescreen{flex:none;width:66.66666674%}.column.is-offset-8-widescreen{margin-left:66.66666674%}.column.is-9-widescreen{flex:none;width:75%}.column.is-offset-9-widescreen{margin-left:75%}.column.is-10-widescreen{flex:none;width:83.33333337%}.column.is-offset-10-widescreen{margin-left:83.33333337%}.column.is-11-widescreen{flex:none;width:91.66666674%}.column.is-offset-11-widescreen{margin-left:91.66666674%}.column.is-12-widescreen{flex:none;width:100%}.column.is-offset-12-widescreen{margin-left:100%}}@media screen and (min-width: 1408px){.column.is-narrow-fullhd{flex:none;width:unset}.column.is-full-fullhd{flex:none;width:100%}.column.is-three-quarters-fullhd{flex:none;width:75%}.column.is-two-thirds-fullhd{flex:none;width:66.6666%}.column.is-half-fullhd{flex:none;width:50%}.column.is-one-third-fullhd{flex:none;width:33.3333%}.column.is-one-quarter-fullhd{flex:none;width:25%}.column.is-one-fifth-fullhd{flex:none;width:20%}.column.is-two-fifths-fullhd{flex:none;width:40%}.column.is-three-fifths-fullhd{flex:none;width:60%}.column.is-four-fifths-fullhd{flex:none;width:80%}.column.is-offset-three-quarters-fullhd{margin-left:75%}.column.is-offset-two-thirds-fullhd{margin-left:66.6666%}.column.is-offset-half-fullhd{margin-left:50%}.column.is-offset-one-third-fullhd{margin-left:33.3333%}.column.is-offset-one-quarter-fullhd{margin-left:25%}.column.is-offset-one-fifth-fullhd{margin-left:20%}.column.is-offset-two-fifths-fullhd{margin-left:40%}.column.is-offset-three-fifths-fullhd{margin-left:60%}.column.is-offset-four-fifths-fullhd{margin-left:80%}.column.is-0-fullhd{flex:none;width:0%}.column.is-offset-0-fullhd{margin-left:0%}.column.is-1-fullhd{flex:none;width:8.33333337%}.column.is-offset-1-fullhd{margin-left:8.33333337%}.column.is-2-fullhd{flex:none;width:16.66666674%}.column.is-offset-2-fullhd{margin-left:16.66666674%}.column.is-3-fullhd{flex:none;width:25%}.column.is-offset-3-fullhd{margin-left:25%}.column.is-4-fullhd{flex:none;width:33.33333337%}.column.is-offset-4-fullhd{margin-left:33.33333337%}.column.is-5-fullhd{flex:none;width:41.66666674%}.column.is-offset-5-fullhd{margin-left:41.66666674%}.column.is-6-fullhd{flex:none;width:50%}.column.is-offset-6-fullhd{margin-left:50%}.column.is-7-fullhd{flex:none;width:58.33333337%}.column.is-offset-7-fullhd{margin-left:58.33333337%}.column.is-8-fullhd{flex:none;width:66.66666674%}.column.is-offset-8-fullhd{margin-left:66.66666674%}.column.is-9-fullhd{flex:none;width:75%}.column.is-offset-9-fullhd{margin-left:75%}.column.is-10-fullhd{flex:none;width:83.33333337%}.column.is-offset-10-fullhd{margin-left:83.33333337%}.column.is-11-fullhd{flex:none;width:91.66666674%}.column.is-offset-11-fullhd{margin-left:91.66666674%}.column.is-12-fullhd{flex:none;width:100%}.column.is-offset-12-fullhd{margin-left:100%}}.columns{margin-left:-.75rem;margin-right:-.75rem;margin-top:-.75rem}.columns:last-child{margin-bottom:-.75rem}.columns:not(:last-child){margin-bottom:calc(1.5rem - .75rem)}.columns.is-centered{justify-content:center}.columns.is-gapless{margin-left:0;margin-right:0;margin-top:0}.columns.is-gapless>.column{margin:0;padding:0 !important}.columns.is-gapless:not(:last-child){margin-bottom:1.5rem}.columns.is-gapless:last-child{margin-bottom:0}.columns.is-mobile{display:flex}.columns.is-multiline{flex-wrap:wrap}.columns.is-vcentered{align-items:center}@media screen and (min-width: 769px),print{.columns:not(.is-desktop){display:flex}}@media screen and (min-width: 1056px){.columns.is-desktop{display:flex}}.columns.is-variable{--columnGap: 0.75rem;margin-left:calc(-1 * var(--columnGap));margin-right:calc(-1 * var(--columnGap))}.columns.is-variable>.column{padding-left:var(--columnGap);padding-right:var(--columnGap)}.columns.is-variable.is-0{--columnGap: 0rem}@media screen and (max-width: 768px){.columns.is-variable.is-0-mobile{--columnGap: 0rem}}@media screen and (min-width: 769px),print{.columns.is-variable.is-0-tablet{--columnGap: 0rem}}@media screen and (min-width: 769px) and (max-width: 1055px){.columns.is-variable.is-0-tablet-only{--columnGap: 0rem}}@media screen and (max-width: 1055px){.columns.is-variable.is-0-touch{--columnGap: 0rem}}@media screen and (min-width: 1056px){.columns.is-variable.is-0-desktop{--columnGap: 0rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){.columns.is-variable.is-0-desktop-only{--columnGap: 0rem}}@media screen and (min-width: 1216px){.columns.is-variable.is-0-widescreen{--columnGap: 0rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){.columns.is-variable.is-0-widescreen-only{--columnGap: 0rem}}@media screen and (min-width: 1408px){.columns.is-variable.is-0-fullhd{--columnGap: 0rem}}.columns.is-variable.is-1{--columnGap: .25rem}@media screen and (max-width: 768px){.columns.is-variable.is-1-mobile{--columnGap: .25rem}}@media screen and (min-width: 769px),print{.columns.is-variable.is-1-tablet{--columnGap: .25rem}}@media screen and (min-width: 769px) and (max-width: 1055px){.columns.is-variable.is-1-tablet-only{--columnGap: .25rem}}@media screen and (max-width: 1055px){.columns.is-variable.is-1-touch{--columnGap: .25rem}}@media screen and (min-width: 1056px){.columns.is-variable.is-1-desktop{--columnGap: .25rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){.columns.is-variable.is-1-desktop-only{--columnGap: .25rem}}@media screen and (min-width: 1216px){.columns.is-variable.is-1-widescreen{--columnGap: .25rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){.columns.is-variable.is-1-widescreen-only{--columnGap: .25rem}}@media screen and (min-width: 1408px){.columns.is-variable.is-1-fullhd{--columnGap: .25rem}}.columns.is-variable.is-2{--columnGap: .5rem}@media screen and (max-width: 768px){.columns.is-variable.is-2-mobile{--columnGap: .5rem}}@media screen and (min-width: 769px),print{.columns.is-variable.is-2-tablet{--columnGap: .5rem}}@media screen and (min-width: 769px) and (max-width: 1055px){.columns.is-variable.is-2-tablet-only{--columnGap: .5rem}}@media screen and (max-width: 1055px){.columns.is-variable.is-2-touch{--columnGap: .5rem}}@media screen and (min-width: 1056px){.columns.is-variable.is-2-desktop{--columnGap: .5rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){.columns.is-variable.is-2-desktop-only{--columnGap: .5rem}}@media screen and (min-width: 1216px){.columns.is-variable.is-2-widescreen{--columnGap: .5rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){.columns.is-variable.is-2-widescreen-only{--columnGap: .5rem}}@media screen and (min-width: 1408px){.columns.is-variable.is-2-fullhd{--columnGap: .5rem}}.columns.is-variable.is-3{--columnGap: .75rem}@media screen and (max-width: 768px){.columns.is-variable.is-3-mobile{--columnGap: .75rem}}@media screen and (min-width: 769px),print{.columns.is-variable.is-3-tablet{--columnGap: .75rem}}@media screen and (min-width: 769px) and (max-width: 1055px){.columns.is-variable.is-3-tablet-only{--columnGap: .75rem}}@media screen and (max-width: 1055px){.columns.is-variable.is-3-touch{--columnGap: .75rem}}@media screen and (min-width: 1056px){.columns.is-variable.is-3-desktop{--columnGap: .75rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){.columns.is-variable.is-3-desktop-only{--columnGap: .75rem}}@media screen and (min-width: 1216px){.columns.is-variable.is-3-widescreen{--columnGap: .75rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){.columns.is-variable.is-3-widescreen-only{--columnGap: .75rem}}@media screen and (min-width: 1408px){.columns.is-variable.is-3-fullhd{--columnGap: .75rem}}.columns.is-variable.is-4{--columnGap: 1rem}@media screen and (max-width: 768px){.columns.is-variable.is-4-mobile{--columnGap: 1rem}}@media screen and (min-width: 769px),print{.columns.is-variable.is-4-tablet{--columnGap: 1rem}}@media screen and (min-width: 769px) and (max-width: 1055px){.columns.is-variable.is-4-tablet-only{--columnGap: 1rem}}@media screen and (max-width: 1055px){.columns.is-variable.is-4-touch{--columnGap: 1rem}}@media screen and (min-width: 1056px){.columns.is-variable.is-4-desktop{--columnGap: 1rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){.columns.is-variable.is-4-desktop-only{--columnGap: 1rem}}@media screen and (min-width: 1216px){.columns.is-variable.is-4-widescreen{--columnGap: 1rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){.columns.is-variable.is-4-widescreen-only{--columnGap: 1rem}}@media screen and (min-width: 1408px){.columns.is-variable.is-4-fullhd{--columnGap: 1rem}}.columns.is-variable.is-5{--columnGap: 1.25rem}@media screen and (max-width: 768px){.columns.is-variable.is-5-mobile{--columnGap: 1.25rem}}@media screen and (min-width: 769px),print{.columns.is-variable.is-5-tablet{--columnGap: 1.25rem}}@media screen and (min-width: 769px) and (max-width: 1055px){.columns.is-variable.is-5-tablet-only{--columnGap: 1.25rem}}@media screen and (max-width: 1055px){.columns.is-variable.is-5-touch{--columnGap: 1.25rem}}@media screen and (min-width: 1056px){.columns.is-variable.is-5-desktop{--columnGap: 1.25rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){.columns.is-variable.is-5-desktop-only{--columnGap: 1.25rem}}@media screen and (min-width: 1216px){.columns.is-variable.is-5-widescreen{--columnGap: 1.25rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){.columns.is-variable.is-5-widescreen-only{--columnGap: 1.25rem}}@media screen and (min-width: 1408px){.columns.is-variable.is-5-fullhd{--columnGap: 1.25rem}}.columns.is-variable.is-6{--columnGap: 1.5rem}@media screen and (max-width: 768px){.columns.is-variable.is-6-mobile{--columnGap: 1.5rem}}@media screen and (min-width: 769px),print{.columns.is-variable.is-6-tablet{--columnGap: 1.5rem}}@media screen and (min-width: 769px) and (max-width: 1055px){.columns.is-variable.is-6-tablet-only{--columnGap: 1.5rem}}@media screen and (max-width: 1055px){.columns.is-variable.is-6-touch{--columnGap: 1.5rem}}@media screen and (min-width: 1056px){.columns.is-variable.is-6-desktop{--columnGap: 1.5rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){.columns.is-variable.is-6-desktop-only{--columnGap: 1.5rem}}@media screen and (min-width: 1216px){.columns.is-variable.is-6-widescreen{--columnGap: 1.5rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){.columns.is-variable.is-6-widescreen-only{--columnGap: 1.5rem}}@media screen and (min-width: 1408px){.columns.is-variable.is-6-fullhd{--columnGap: 1.5rem}}.columns.is-variable.is-7{--columnGap: 1.75rem}@media screen and (max-width: 768px){.columns.is-variable.is-7-mobile{--columnGap: 1.75rem}}@media screen and (min-width: 769px),print{.columns.is-variable.is-7-tablet{--columnGap: 1.75rem}}@media screen and (min-width: 769px) and (max-width: 1055px){.columns.is-variable.is-7-tablet-only{--columnGap: 1.75rem}}@media screen and (max-width: 1055px){.columns.is-variable.is-7-touch{--columnGap: 1.75rem}}@media screen and (min-width: 1056px){.columns.is-variable.is-7-desktop{--columnGap: 1.75rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){.columns.is-variable.is-7-desktop-only{--columnGap: 1.75rem}}@media screen and (min-width: 1216px){.columns.is-variable.is-7-widescreen{--columnGap: 1.75rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){.columns.is-variable.is-7-widescreen-only{--columnGap: 1.75rem}}@media screen and (min-width: 1408px){.columns.is-variable.is-7-fullhd{--columnGap: 1.75rem}}.columns.is-variable.is-8{--columnGap: 2rem}@media screen and (max-width: 768px){.columns.is-variable.is-8-mobile{--columnGap: 2rem}}@media screen and (min-width: 769px),print{.columns.is-variable.is-8-tablet{--columnGap: 2rem}}@media screen and (min-width: 769px) and (max-width: 1055px){.columns.is-variable.is-8-tablet-only{--columnGap: 2rem}}@media screen and (max-width: 1055px){.columns.is-variable.is-8-touch{--columnGap: 2rem}}@media screen and (min-width: 1056px){.columns.is-variable.is-8-desktop{--columnGap: 2rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){.columns.is-variable.is-8-desktop-only{--columnGap: 2rem}}@media screen and (min-width: 1216px){.columns.is-variable.is-8-widescreen{--columnGap: 2rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){.columns.is-variable.is-8-widescreen-only{--columnGap: 2rem}}@media screen and (min-width: 1408px){.columns.is-variable.is-8-fullhd{--columnGap: 2rem}}.tile{align-items:stretch;display:block;flex-basis:0;flex-grow:1;flex-shrink:1;min-height:min-content}.tile.is-ancestor{margin-left:-.75rem;margin-right:-.75rem;margin-top:-.75rem}.tile.is-ancestor:last-child{margin-bottom:-.75rem}.tile.is-ancestor:not(:last-child){margin-bottom:.75rem}.tile.is-child{margin:0 !important}.tile.is-parent{padding:.75rem}.tile.is-vertical{flex-direction:column}.tile.is-vertical>.tile.is-child:not(:last-child){margin-bottom:1.5rem !important}@media screen and (min-width: 769px),print{.tile:not(.is-child){display:flex}.tile.is-1{flex:none;width:8.33333337%}.tile.is-2{flex:none;width:16.66666674%}.tile.is-3{flex:none;width:25%}.tile.is-4{flex:none;width:33.33333337%}.tile.is-5{flex:none;width:41.66666674%}.tile.is-6{flex:none;width:50%}.tile.is-7{flex:none;width:58.33333337%}.tile.is-8{flex:none;width:66.66666674%}.tile.is-9{flex:none;width:75%}.tile.is-10{flex:none;width:83.33333337%}.tile.is-11{flex:none;width:91.66666674%}.tile.is-12{flex:none;width:100%}}.hero{align-items:stretch;display:flex;flex-direction:column;justify-content:space-between}.hero .navbar{background:none}.hero .tabs ul{border-bottom:none}.hero.is-white{background-color:#fff;color:#0a0a0a}.hero.is-white a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-white strong{color:inherit}.hero.is-white .title{color:#0a0a0a}.hero.is-white .subtitle{color:rgba(10,10,10,0.9)}.hero.is-white .subtitle a:not(.button),.hero.is-white .subtitle strong{color:#0a0a0a}@media screen and (max-width: 1055px){.hero.is-white .navbar-menu{background-color:#fff}}.hero.is-white .navbar-item,.hero.is-white .navbar-link{color:rgba(10,10,10,0.7)}.hero.is-white a.navbar-item:hover,.hero.is-white a.navbar-item.is-active,.hero.is-white .navbar-link:hover,.hero.is-white .navbar-link.is-active{background-color:#f2f2f2;color:#0a0a0a}.hero.is-white .tabs a{color:#0a0a0a;opacity:0.9}.hero.is-white .tabs a:hover{opacity:1}.hero.is-white .tabs li.is-active a{color:#fff !important;opacity:1}.hero.is-white .tabs.is-boxed a,.hero.is-white .tabs.is-toggle a{color:#0a0a0a}.hero.is-white .tabs.is-boxed a:hover,.hero.is-white .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}.hero.is-white .tabs.is-boxed li.is-active a,.hero.is-white .tabs.is-boxed li.is-active a:hover,.hero.is-white .tabs.is-toggle li.is-active a,.hero.is-white .tabs.is-toggle li.is-active a:hover{background-color:#0a0a0a;border-color:#0a0a0a;color:#fff}.hero.is-white.is-bold{background-image:linear-gradient(141deg, #e8e3e4 0%, #fff 71%, #fff 100%)}@media screen and (max-width: 768px){.hero.is-white.is-bold .navbar-menu{background-image:linear-gradient(141deg, #e8e3e4 0%, #fff 71%, #fff 100%)}}.hero.is-black{background-color:#0a0a0a;color:#fff}.hero.is-black a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-black strong{color:inherit}.hero.is-black .title{color:#fff}.hero.is-black .subtitle{color:rgba(255,255,255,0.9)}.hero.is-black .subtitle a:not(.button),.hero.is-black .subtitle strong{color:#fff}@media screen and (max-width: 1055px){.hero.is-black .navbar-menu{background-color:#0a0a0a}}.hero.is-black .navbar-item,.hero.is-black .navbar-link{color:rgba(255,255,255,0.7)}.hero.is-black a.navbar-item:hover,.hero.is-black a.navbar-item.is-active,.hero.is-black .navbar-link:hover,.hero.is-black .navbar-link.is-active{background-color:#000;color:#fff}.hero.is-black .tabs a{color:#fff;opacity:0.9}.hero.is-black .tabs a:hover{opacity:1}.hero.is-black .tabs li.is-active a{color:#0a0a0a !important;opacity:1}.hero.is-black .tabs.is-boxed a,.hero.is-black .tabs.is-toggle a{color:#fff}.hero.is-black .tabs.is-boxed a:hover,.hero.is-black .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}.hero.is-black .tabs.is-boxed li.is-active a,.hero.is-black .tabs.is-boxed li.is-active a:hover,.hero.is-black .tabs.is-toggle li.is-active a,.hero.is-black .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#0a0a0a}.hero.is-black.is-bold{background-image:linear-gradient(141deg, #000 0%, #0a0a0a 71%, #181616 100%)}@media screen and (max-width: 768px){.hero.is-black.is-bold .navbar-menu{background-image:linear-gradient(141deg, #000 0%, #0a0a0a 71%, #181616 100%)}}.hero.is-light{background-color:#f5f5f5;color:rgba(0,0,0,0.7)}.hero.is-light a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-light strong{color:inherit}.hero.is-light .title{color:rgba(0,0,0,0.7)}.hero.is-light .subtitle{color:rgba(0,0,0,0.9)}.hero.is-light .subtitle a:not(.button),.hero.is-light .subtitle strong{color:rgba(0,0,0,0.7)}@media screen and (max-width: 1055px){.hero.is-light .navbar-menu{background-color:#f5f5f5}}.hero.is-light .navbar-item,.hero.is-light .navbar-link{color:rgba(0,0,0,0.7)}.hero.is-light a.navbar-item:hover,.hero.is-light a.navbar-item.is-active,.hero.is-light .navbar-link:hover,.hero.is-light .navbar-link.is-active{background-color:#e8e8e8;color:rgba(0,0,0,0.7)}.hero.is-light .tabs a{color:rgba(0,0,0,0.7);opacity:0.9}.hero.is-light .tabs a:hover{opacity:1}.hero.is-light .tabs li.is-active a{color:#f5f5f5 !important;opacity:1}.hero.is-light .tabs.is-boxed a,.hero.is-light .tabs.is-toggle a{color:rgba(0,0,0,0.7)}.hero.is-light .tabs.is-boxed a:hover,.hero.is-light .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}.hero.is-light .tabs.is-boxed li.is-active a,.hero.is-light .tabs.is-boxed li.is-active a:hover,.hero.is-light .tabs.is-toggle li.is-active a,.hero.is-light .tabs.is-toggle li.is-active a:hover{background-color:rgba(0,0,0,0.7);border-color:rgba(0,0,0,0.7);color:#f5f5f5}.hero.is-light.is-bold{background-image:linear-gradient(141deg, #dfd8d9 0%, #f5f5f5 71%, #fff 100%)}@media screen and (max-width: 768px){.hero.is-light.is-bold .navbar-menu{background-image:linear-gradient(141deg, #dfd8d9 0%, #f5f5f5 71%, #fff 100%)}}.hero.is-dark,.content kbd.hero{background-color:#363636;color:#fff}.hero.is-dark a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.content kbd.hero a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-dark strong,.content kbd.hero strong{color:inherit}.hero.is-dark .title,.content kbd.hero .title{color:#fff}.hero.is-dark .subtitle,.content kbd.hero .subtitle{color:rgba(255,255,255,0.9)}.hero.is-dark .subtitle a:not(.button),.content kbd.hero .subtitle a:not(.button),.hero.is-dark .subtitle strong,.content kbd.hero .subtitle strong{color:#fff}@media screen and (max-width: 1055px){.hero.is-dark .navbar-menu,.content kbd.hero .navbar-menu{background-color:#363636}}.hero.is-dark .navbar-item,.content kbd.hero .navbar-item,.hero.is-dark .navbar-link,.content kbd.hero .navbar-link{color:rgba(255,255,255,0.7)}.hero.is-dark a.navbar-item:hover,.content kbd.hero a.navbar-item:hover,.hero.is-dark a.navbar-item.is-active,.content kbd.hero a.navbar-item.is-active,.hero.is-dark .navbar-link:hover,.content kbd.hero .navbar-link:hover,.hero.is-dark .navbar-link.is-active,.content kbd.hero .navbar-link.is-active{background-color:#292929;color:#fff}.hero.is-dark .tabs a,.content kbd.hero .tabs a{color:#fff;opacity:0.9}.hero.is-dark .tabs a:hover,.content kbd.hero .tabs a:hover{opacity:1}.hero.is-dark .tabs li.is-active a,.content kbd.hero .tabs li.is-active a{color:#363636 !important;opacity:1}.hero.is-dark .tabs.is-boxed a,.content kbd.hero .tabs.is-boxed a,.hero.is-dark .tabs.is-toggle a,.content kbd.hero .tabs.is-toggle a{color:#fff}.hero.is-dark .tabs.is-boxed a:hover,.content kbd.hero .tabs.is-boxed a:hover,.hero.is-dark .tabs.is-toggle a:hover,.content kbd.hero .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}.hero.is-dark .tabs.is-boxed li.is-active a,.content kbd.hero .tabs.is-boxed li.is-active a,.hero.is-dark .tabs.is-boxed li.is-active a:hover,.hero.is-dark .tabs.is-toggle li.is-active a,.content kbd.hero .tabs.is-toggle li.is-active a,.hero.is-dark .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#363636}.hero.is-dark.is-bold,.content kbd.hero.is-bold{background-image:linear-gradient(141deg, #1f191a 0%, #363636 71%, #46403f 100%)}@media screen and (max-width: 768px){.hero.is-dark.is-bold .navbar-menu,.content kbd.hero.is-bold .navbar-menu{background-image:linear-gradient(141deg, #1f191a 0%, #363636 71%, #46403f 100%)}}.hero.is-primary,.docstring>section>a.hero.docs-sourcelink{background-color:#4eb5de;color:#fff}.hero.is-primary a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.docstring>section>a.hero.docs-sourcelink a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-primary strong,.docstring>section>a.hero.docs-sourcelink strong{color:inherit}.hero.is-primary .title,.docstring>section>a.hero.docs-sourcelink .title{color:#fff}.hero.is-primary .subtitle,.docstring>section>a.hero.docs-sourcelink .subtitle{color:rgba(255,255,255,0.9)}.hero.is-primary .subtitle a:not(.button),.docstring>section>a.hero.docs-sourcelink .subtitle a:not(.button),.hero.is-primary .subtitle strong,.docstring>section>a.hero.docs-sourcelink .subtitle strong{color:#fff}@media screen and (max-width: 1055px){.hero.is-primary .navbar-menu,.docstring>section>a.hero.docs-sourcelink .navbar-menu{background-color:#4eb5de}}.hero.is-primary .navbar-item,.docstring>section>a.hero.docs-sourcelink .navbar-item,.hero.is-primary .navbar-link,.docstring>section>a.hero.docs-sourcelink .navbar-link{color:rgba(255,255,255,0.7)}.hero.is-primary a.navbar-item:hover,.docstring>section>a.hero.docs-sourcelink a.navbar-item:hover,.hero.is-primary a.navbar-item.is-active,.docstring>section>a.hero.docs-sourcelink a.navbar-item.is-active,.hero.is-primary .navbar-link:hover,.docstring>section>a.hero.docs-sourcelink .navbar-link:hover,.hero.is-primary .navbar-link.is-active,.docstring>section>a.hero.docs-sourcelink .navbar-link.is-active{background-color:#39acda;color:#fff}.hero.is-primary .tabs a,.docstring>section>a.hero.docs-sourcelink .tabs a{color:#fff;opacity:0.9}.hero.is-primary .tabs a:hover,.docstring>section>a.hero.docs-sourcelink .tabs a:hover{opacity:1}.hero.is-primary .tabs li.is-active a,.docstring>section>a.hero.docs-sourcelink .tabs li.is-active a{color:#4eb5de !important;opacity:1}.hero.is-primary .tabs.is-boxed a,.docstring>section>a.hero.docs-sourcelink .tabs.is-boxed a,.hero.is-primary .tabs.is-toggle a,.docstring>section>a.hero.docs-sourcelink .tabs.is-toggle a{color:#fff}.hero.is-primary .tabs.is-boxed a:hover,.docstring>section>a.hero.docs-sourcelink .tabs.is-boxed a:hover,.hero.is-primary .tabs.is-toggle a:hover,.docstring>section>a.hero.docs-sourcelink .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}.hero.is-primary .tabs.is-boxed li.is-active a,.docstring>section>a.hero.docs-sourcelink .tabs.is-boxed li.is-active a,.hero.is-primary .tabs.is-boxed li.is-active a:hover,.hero.is-primary .tabs.is-toggle li.is-active a,.docstring>section>a.hero.docs-sourcelink .tabs.is-toggle li.is-active a,.hero.is-primary .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#4eb5de}.hero.is-primary.is-bold,.docstring>section>a.hero.is-bold.docs-sourcelink{background-image:linear-gradient(141deg, #1bc7de 0%, #4eb5de 71%, #5fa9e7 100%)}@media screen and (max-width: 768px){.hero.is-primary.is-bold .navbar-menu,.docstring>section>a.hero.is-bold.docs-sourcelink .navbar-menu{background-image:linear-gradient(141deg, #1bc7de 0%, #4eb5de 71%, #5fa9e7 100%)}}.hero.is-link{background-color:#2e63b8;color:#fff}.hero.is-link a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-link strong{color:inherit}.hero.is-link .title{color:#fff}.hero.is-link .subtitle{color:rgba(255,255,255,0.9)}.hero.is-link .subtitle a:not(.button),.hero.is-link .subtitle strong{color:#fff}@media screen and (max-width: 1055px){.hero.is-link .navbar-menu{background-color:#2e63b8}}.hero.is-link .navbar-item,.hero.is-link .navbar-link{color:rgba(255,255,255,0.7)}.hero.is-link a.navbar-item:hover,.hero.is-link a.navbar-item.is-active,.hero.is-link .navbar-link:hover,.hero.is-link .navbar-link.is-active{background-color:#2958a4;color:#fff}.hero.is-link .tabs a{color:#fff;opacity:0.9}.hero.is-link .tabs a:hover{opacity:1}.hero.is-link .tabs li.is-active a{color:#2e63b8 !important;opacity:1}.hero.is-link .tabs.is-boxed a,.hero.is-link .tabs.is-toggle a{color:#fff}.hero.is-link .tabs.is-boxed a:hover,.hero.is-link .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}.hero.is-link .tabs.is-boxed li.is-active a,.hero.is-link .tabs.is-boxed li.is-active a:hover,.hero.is-link .tabs.is-toggle li.is-active a,.hero.is-link .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#2e63b8}.hero.is-link.is-bold{background-image:linear-gradient(141deg, #1b6098 0%, #2e63b8 71%, #2d51d2 100%)}@media screen and (max-width: 768px){.hero.is-link.is-bold .navbar-menu{background-image:linear-gradient(141deg, #1b6098 0%, #2e63b8 71%, #2d51d2 100%)}}.hero.is-info{background-color:#209cee;color:#fff}.hero.is-info a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-info strong{color:inherit}.hero.is-info .title{color:#fff}.hero.is-info .subtitle{color:rgba(255,255,255,0.9)}.hero.is-info .subtitle a:not(.button),.hero.is-info .subtitle strong{color:#fff}@media screen and (max-width: 1055px){.hero.is-info .navbar-menu{background-color:#209cee}}.hero.is-info .navbar-item,.hero.is-info .navbar-link{color:rgba(255,255,255,0.7)}.hero.is-info a.navbar-item:hover,.hero.is-info a.navbar-item.is-active,.hero.is-info .navbar-link:hover,.hero.is-info .navbar-link.is-active{background-color:#1190e3;color:#fff}.hero.is-info .tabs a{color:#fff;opacity:0.9}.hero.is-info .tabs a:hover{opacity:1}.hero.is-info .tabs li.is-active a{color:#209cee !important;opacity:1}.hero.is-info .tabs.is-boxed a,.hero.is-info .tabs.is-toggle a{color:#fff}.hero.is-info .tabs.is-boxed a:hover,.hero.is-info .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}.hero.is-info .tabs.is-boxed li.is-active a,.hero.is-info .tabs.is-boxed li.is-active a:hover,.hero.is-info .tabs.is-toggle li.is-active a,.hero.is-info .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#209cee}.hero.is-info.is-bold{background-image:linear-gradient(141deg, #05a6d6 0%, #209cee 71%, #3287f5 100%)}@media screen and (max-width: 768px){.hero.is-info.is-bold .navbar-menu{background-image:linear-gradient(141deg, #05a6d6 0%, #209cee 71%, #3287f5 100%)}}.hero.is-success{background-color:#22c35b;color:#fff}.hero.is-success a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-success strong{color:inherit}.hero.is-success .title{color:#fff}.hero.is-success .subtitle{color:rgba(255,255,255,0.9)}.hero.is-success .subtitle a:not(.button),.hero.is-success .subtitle strong{color:#fff}@media screen and (max-width: 1055px){.hero.is-success .navbar-menu{background-color:#22c35b}}.hero.is-success .navbar-item,.hero.is-success .navbar-link{color:rgba(255,255,255,0.7)}.hero.is-success a.navbar-item:hover,.hero.is-success a.navbar-item.is-active,.hero.is-success .navbar-link:hover,.hero.is-success .navbar-link.is-active{background-color:#1ead51;color:#fff}.hero.is-success .tabs a{color:#fff;opacity:0.9}.hero.is-success .tabs a:hover{opacity:1}.hero.is-success .tabs li.is-active a{color:#22c35b !important;opacity:1}.hero.is-success .tabs.is-boxed a,.hero.is-success .tabs.is-toggle a{color:#fff}.hero.is-success .tabs.is-boxed a:hover,.hero.is-success .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}.hero.is-success .tabs.is-boxed li.is-active a,.hero.is-success .tabs.is-boxed li.is-active a:hover,.hero.is-success .tabs.is-toggle li.is-active a,.hero.is-success .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#22c35b}.hero.is-success.is-bold{background-image:linear-gradient(141deg, #12a02c 0%, #22c35b 71%, #1fdf83 100%)}@media screen and (max-width: 768px){.hero.is-success.is-bold .navbar-menu{background-image:linear-gradient(141deg, #12a02c 0%, #22c35b 71%, #1fdf83 100%)}}.hero.is-warning{background-color:#ffdd57;color:rgba(0,0,0,0.7)}.hero.is-warning a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-warning strong{color:inherit}.hero.is-warning .title{color:rgba(0,0,0,0.7)}.hero.is-warning .subtitle{color:rgba(0,0,0,0.9)}.hero.is-warning .subtitle a:not(.button),.hero.is-warning .subtitle strong{color:rgba(0,0,0,0.7)}@media screen and (max-width: 1055px){.hero.is-warning .navbar-menu{background-color:#ffdd57}}.hero.is-warning .navbar-item,.hero.is-warning .navbar-link{color:rgba(0,0,0,0.7)}.hero.is-warning a.navbar-item:hover,.hero.is-warning a.navbar-item.is-active,.hero.is-warning .navbar-link:hover,.hero.is-warning .navbar-link.is-active{background-color:#ffd83e;color:rgba(0,0,0,0.7)}.hero.is-warning .tabs a{color:rgba(0,0,0,0.7);opacity:0.9}.hero.is-warning .tabs a:hover{opacity:1}.hero.is-warning .tabs li.is-active a{color:#ffdd57 !important;opacity:1}.hero.is-warning .tabs.is-boxed a,.hero.is-warning .tabs.is-toggle a{color:rgba(0,0,0,0.7)}.hero.is-warning .tabs.is-boxed a:hover,.hero.is-warning .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}.hero.is-warning .tabs.is-boxed li.is-active a,.hero.is-warning .tabs.is-boxed li.is-active a:hover,.hero.is-warning .tabs.is-toggle li.is-active a,.hero.is-warning .tabs.is-toggle li.is-active a:hover{background-color:rgba(0,0,0,0.7);border-color:rgba(0,0,0,0.7);color:#ffdd57}.hero.is-warning.is-bold{background-image:linear-gradient(141deg, #ffae24 0%, #ffdd57 71%, #fffa71 100%)}@media screen and (max-width: 768px){.hero.is-warning.is-bold .navbar-menu{background-image:linear-gradient(141deg, #ffae24 0%, #ffdd57 71%, #fffa71 100%)}}.hero.is-danger{background-color:#da0b00;color:#fff}.hero.is-danger a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-danger strong{color:inherit}.hero.is-danger .title{color:#fff}.hero.is-danger .subtitle{color:rgba(255,255,255,0.9)}.hero.is-danger .subtitle a:not(.button),.hero.is-danger .subtitle strong{color:#fff}@media screen and (max-width: 1055px){.hero.is-danger .navbar-menu{background-color:#da0b00}}.hero.is-danger .navbar-item,.hero.is-danger .navbar-link{color:rgba(255,255,255,0.7)}.hero.is-danger a.navbar-item:hover,.hero.is-danger a.navbar-item.is-active,.hero.is-danger .navbar-link:hover,.hero.is-danger .navbar-link.is-active{background-color:#c10a00;color:#fff}.hero.is-danger .tabs a{color:#fff;opacity:0.9}.hero.is-danger .tabs a:hover{opacity:1}.hero.is-danger .tabs li.is-active a{color:#da0b00 !important;opacity:1}.hero.is-danger .tabs.is-boxed a,.hero.is-danger .tabs.is-toggle a{color:#fff}.hero.is-danger .tabs.is-boxed a:hover,.hero.is-danger .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}.hero.is-danger .tabs.is-boxed li.is-active a,.hero.is-danger .tabs.is-boxed li.is-active a:hover,.hero.is-danger .tabs.is-toggle li.is-active a,.hero.is-danger .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#da0b00}.hero.is-danger.is-bold{background-image:linear-gradient(141deg, #a70013 0%, #da0b00 71%, #f43500 100%)}@media screen and (max-width: 768px){.hero.is-danger.is-bold .navbar-menu{background-image:linear-gradient(141deg, #a70013 0%, #da0b00 71%, #f43500 100%)}}.hero.is-small .hero-body,#documenter .docs-sidebar form.docs-search>input.hero .hero-body{padding:1.5rem}@media screen and (min-width: 769px),print{.hero.is-medium .hero-body{padding:9rem 4.5rem}}@media screen and (min-width: 769px),print{.hero.is-large .hero-body{padding:18rem 6rem}}.hero.is-halfheight .hero-body,.hero.is-fullheight .hero-body,.hero.is-fullheight-with-navbar .hero-body{align-items:center;display:flex}.hero.is-halfheight .hero-body>.container,.hero.is-fullheight .hero-body>.container,.hero.is-fullheight-with-navbar .hero-body>.container{flex-grow:1;flex-shrink:1}.hero.is-halfheight{min-height:50vh}.hero.is-fullheight{min-height:100vh}.hero-video{overflow:hidden}.hero-video video{left:50%;min-height:100%;min-width:100%;position:absolute;top:50%;transform:translate3d(-50%, -50%, 0)}.hero-video.is-transparent{opacity:0.3}@media screen and (max-width: 768px){.hero-video{display:none}}.hero-buttons{margin-top:1.5rem}@media screen and (max-width: 768px){.hero-buttons .button{display:flex}.hero-buttons .button:not(:last-child){margin-bottom:0.75rem}}@media screen and (min-width: 769px),print{.hero-buttons{display:flex;justify-content:center}.hero-buttons .button:not(:last-child){margin-right:1.5rem}}.hero-head,.hero-foot{flex-grow:0;flex-shrink:0}.hero-body{flex-grow:1;flex-shrink:0;padding:3rem 1.5rem}@media screen and (min-width: 769px),print{.hero-body{padding:3rem 3rem}}.section{padding:3rem 1.5rem}@media screen and (min-width: 1056px){.section{padding:3rem 3rem}.section.is-medium{padding:9rem 4.5rem}.section.is-large{padding:18rem 6rem}}.footer{background-color:#fafafa;padding:3rem 1.5rem 6rem}h1 .docs-heading-anchor,h1 .docs-heading-anchor:hover,h1 .docs-heading-anchor:visited,h2 .docs-heading-anchor,h2 .docs-heading-anchor:hover,h2 .docs-heading-anchor:visited,h3 .docs-heading-anchor,h3 .docs-heading-anchor:hover,h3 .docs-heading-anchor:visited,h4 .docs-heading-anchor,h4 .docs-heading-anchor:hover,h4 .docs-heading-anchor:visited,h5 .docs-heading-anchor,h5 .docs-heading-anchor:hover,h5 .docs-heading-anchor:visited,h6 .docs-heading-anchor,h6 .docs-heading-anchor:hover,h6 .docs-heading-anchor:visited{color:#222}h1 .docs-heading-anchor-permalink,h2 .docs-heading-anchor-permalink,h3 .docs-heading-anchor-permalink,h4 .docs-heading-anchor-permalink,h5 .docs-heading-anchor-permalink,h6 .docs-heading-anchor-permalink{visibility:hidden;vertical-align:middle;margin-left:0.5em;font-size:0.7rem}h1 .docs-heading-anchor-permalink::before,h2 .docs-heading-anchor-permalink::before,h3 .docs-heading-anchor-permalink::before,h4 .docs-heading-anchor-permalink::before,h5 .docs-heading-anchor-permalink::before,h6 .docs-heading-anchor-permalink::before{font-family:"Font Awesome 6 Free";font-weight:900;content:"\f0c1"}h1:hover .docs-heading-anchor-permalink,h2:hover .docs-heading-anchor-permalink,h3:hover .docs-heading-anchor-permalink,h4:hover .docs-heading-anchor-permalink,h5:hover .docs-heading-anchor-permalink,h6:hover .docs-heading-anchor-permalink{visibility:visible}.docs-dark-only{display:none !important}pre{position:relative;overflow:hidden}pre code,pre code.hljs{padding:0 .75rem !important;overflow:auto;display:block}pre code:first-of-type,pre code.hljs:first-of-type{padding-top:0.5rem !important}pre code:last-of-type,pre code.hljs:last-of-type{padding-bottom:0.5rem !important}pre .copy-button{opacity:0.2;transition:opacity 0.2s;position:absolute;right:0em;top:0em;padding:0.5em;width:2.5em;height:2.5em;background:transparent;border:none;font-family:"Font Awesome 6 Free";color:#222;cursor:pointer;text-align:center}pre .copy-button:focus,pre .copy-button:hover{opacity:1;background:rgba(34,34,34,0.1);color:#2e63b8}pre .copy-button.success{color:#259a12;opacity:1}pre .copy-button.error{color:#cb3c33;opacity:1}pre:hover .copy-button{opacity:1}.admonition{background-color:#b5b5b5;border-style:solid;border-width:1px;border-color:#363636;border-radius:4px;font-size:1rem}.admonition strong{color:currentColor}.admonition.is-small,#documenter .docs-sidebar form.docs-search>input.admonition{font-size:.75rem}.admonition.is-medium{font-size:1.25rem}.admonition.is-large{font-size:1.5rem}.admonition.is-default{background-color:#b5b5b5;border-color:#363636}.admonition.is-default>.admonition-header{background-color:#363636;color:#fff}.admonition.is-default>.admonition-body{color:#fff}.admonition.is-info{background-color:#def0fc;border-color:#209cee}.admonition.is-info>.admonition-header{background-color:#209cee;color:#fff}.admonition.is-info>.admonition-body{color:rgba(0,0,0,0.7)}.admonition.is-success{background-color:#bdf4d1;border-color:#22c35b}.admonition.is-success>.admonition-header{background-color:#22c35b;color:#fff}.admonition.is-success>.admonition-body{color:rgba(0,0,0,0.7)}.admonition.is-warning{background-color:#fff3c5;border-color:#ffdd57}.admonition.is-warning>.admonition-header{background-color:#ffdd57;color:rgba(0,0,0,0.7)}.admonition.is-warning>.admonition-body{color:rgba(0,0,0,0.7)}.admonition.is-danger{background-color:#ffaba7;border-color:#da0b00}.admonition.is-danger>.admonition-header{background-color:#da0b00;color:#fff}.admonition.is-danger>.admonition-body{color:rgba(0,0,0,0.7)}.admonition.is-compat{background-color:#bdeff5;border-color:#1db5c9}.admonition.is-compat>.admonition-header{background-color:#1db5c9;color:#fff}.admonition.is-compat>.admonition-body{color:rgba(0,0,0,0.7)}.admonition-header{color:#fff;background-color:#363636;align-items:center;font-weight:700;justify-content:space-between;line-height:1.25;padding:0.5rem .75rem;position:relative}.admonition-header:before{font-family:"Font Awesome 6 Free";font-weight:900;margin-right:.75rem;content:"\f06a"}details.admonition.is-details>.admonition-header{list-style:none}details.admonition.is-details>.admonition-header:before{font-family:"Font Awesome 6 Free";font-weight:900;content:"\f055"}details.admonition.is-details[open]>.admonition-header:before{font-family:"Font Awesome 6 Free";font-weight:900;content:"\f056"}.admonition-body{color:#222;padding:0.5rem .75rem}.admonition-body pre{background-color:#f5f5f5}.admonition-body code{background-color:rgba(0,0,0,0.05)}.docstring{margin-bottom:1em;background-color:rgba(0,0,0,0);border:1px solid #dbdbdb;box-shadow:2px 2px 3px rgba(10,10,10,0.1);max-width:100%}.docstring>header{cursor:pointer;display:flex;flex-grow:1;align-items:stretch;padding:0.5rem .75rem;background-color:#f5f5f5;box-shadow:0 0.125em 0.25em rgba(10,10,10,0.1);box-shadow:none;border-bottom:1px solid #dbdbdb;overflow:auto}.docstring>header code{background-color:transparent}.docstring>header .docstring-article-toggle-button{min-width:1.1rem;padding:0.2rem 0.2rem 0.2rem 0}.docstring>header .docstring-binding{margin-right:0.3em}.docstring>header .docstring-category{margin-left:0.3em}.docstring>section{position:relative;padding:.75rem .75rem;border-bottom:1px solid #dbdbdb}.docstring>section:last-child{border-bottom:none}.docstring>section>a.docs-sourcelink{transition:opacity 0.3s;opacity:0;position:absolute;right:.375rem;bottom:.375rem}.docstring>section>a.docs-sourcelink:focus{opacity:1 !important}.docstring:hover>section>a.docs-sourcelink{opacity:0.2}.docstring:focus-within>section>a.docs-sourcelink{opacity:0.2}.docstring>section:hover a.docs-sourcelink{opacity:1}.documenter-example-output{background-color:#fff}.outdated-warning-overlay{position:fixed;top:0;left:0;right:0;box-shadow:0 0 10px rgba(0,0,0,0.3);z-index:999;background-color:#ffaba7;color:rgba(0,0,0,0.7);border-bottom:3px solid #da0b00;padding:10px 35px;text-align:center;font-size:15px}.outdated-warning-overlay .outdated-warning-closer{position:absolute;top:calc(50% - 10px);right:18px;cursor:pointer;width:12px}.outdated-warning-overlay a{color:#2e63b8}.outdated-warning-overlay a:hover{color:#363636}.content pre{border:1px solid #dbdbdb}.content code{font-weight:inherit}.content a code{color:#2e63b8}.content h1 code,.content h2 code,.content h3 code,.content h4 code,.content h5 code,.content h6 code{color:#222}.content table{display:block;width:initial;max-width:100%;overflow-x:auto}.content blockquote>ul:first-child,.content blockquote>ol:first-child,.content .admonition-body>ul:first-child,.content .admonition-body>ol:first-child{margin-top:0}pre,code{font-variant-ligatures:no-contextual}.breadcrumb a.is-disabled{cursor:default;pointer-events:none}.breadcrumb a.is-disabled,.breadcrumb a.is-disabled:hover{color:#222}.hljs{background:initial !important}.katex .katex-mathml{top:0;right:0}.katex-display,mjx-container,.MathJax_Display{margin:0.5em 0 !important}html{-moz-osx-font-smoothing:auto;-webkit-font-smoothing:auto}li.no-marker{list-style:none}#documenter .docs-main>article{overflow-wrap:break-word}#documenter .docs-main>article .math-container{overflow-x:auto;overflow-y:hidden}@media screen and (min-width: 1056px){#documenter .docs-main{max-width:52rem;margin-left:20rem;padding-right:1rem}}@media screen and (max-width: 1055px){#documenter .docs-main{width:100%}#documenter .docs-main>article{max-width:52rem;margin-left:auto;margin-right:auto;margin-bottom:1rem;padding:0 1rem}#documenter .docs-main>header,#documenter .docs-main>nav{max-width:100%;width:100%;margin:0}}#documenter .docs-main header.docs-navbar{background-color:#fff;border-bottom:1px solid #dbdbdb;z-index:2;min-height:4rem;margin-bottom:1rem;display:flex}#documenter .docs-main header.docs-navbar .breadcrumb{flex-grow:1;overflow-x:hidden}#documenter .docs-main header.docs-navbar .docs-sidebar-button{display:block;font-size:1.5rem;padding-bottom:0.1rem;margin-right:1rem}#documenter .docs-main header.docs-navbar .docs-right{display:flex;white-space:nowrap;gap:1rem;align-items:center}#documenter .docs-main header.docs-navbar .docs-right .docs-icon,#documenter .docs-main header.docs-navbar .docs-right .docs-label{display:inline-block}#documenter .docs-main header.docs-navbar .docs-right .docs-label{padding:0;margin-left:0.3em}@media screen and (max-width: 1055px){#documenter .docs-main header.docs-navbar .docs-right .docs-navbar-link{margin-left:0.4rem;margin-right:0.4rem}}#documenter .docs-main header.docs-navbar>*{margin:auto 0}@media screen and (max-width: 1055px){#documenter .docs-main header.docs-navbar{position:sticky;top:0;padding:0 1rem;transition-property:top, box-shadow;-webkit-transition-property:top, box-shadow;transition-duration:0.3s;-webkit-transition-duration:0.3s}#documenter .docs-main header.docs-navbar.headroom--not-top{box-shadow:.2rem 0rem .4rem #bbb;transition-duration:0.7s;-webkit-transition-duration:0.7s}#documenter .docs-main header.docs-navbar.headroom--unpinned.headroom--not-top.headroom--not-bottom{top:-4.5rem;transition-duration:0.7s;-webkit-transition-duration:0.7s}}#documenter .docs-main section.footnotes{border-top:1px solid #dbdbdb}#documenter .docs-main section.footnotes li .tag:first-child,#documenter .docs-main section.footnotes li .docstring>section>a.docs-sourcelink:first-child,#documenter .docs-main section.footnotes li .content kbd:first-child,.content #documenter .docs-main section.footnotes li kbd:first-child{margin-right:1em;margin-bottom:0.4em}#documenter .docs-main .docs-footer{display:flex;flex-wrap:wrap;margin-left:0;margin-right:0;border-top:1px solid #dbdbdb;padding-top:1rem;padding-bottom:1rem}@media screen and (max-width: 1055px){#documenter .docs-main .docs-footer{padding-left:1rem;padding-right:1rem}}#documenter .docs-main .docs-footer .docs-footer-nextpage,#documenter .docs-main .docs-footer .docs-footer-prevpage{flex-grow:1}#documenter .docs-main .docs-footer .docs-footer-nextpage{text-align:right}#documenter .docs-main .docs-footer .flexbox-break{flex-basis:100%;height:0}#documenter .docs-main .docs-footer .footer-message{font-size:0.8em;margin:0.5em auto 0 auto;text-align:center}#documenter .docs-sidebar{display:flex;flex-direction:column;color:#0a0a0a;background-color:#f5f5f5;border-right:1px solid #dbdbdb;padding:0;flex:0 0 18rem;z-index:5;font-size:1rem;position:fixed;left:-18rem;width:18rem;height:100%;transition:left 0.3s}#documenter .docs-sidebar.visible{left:0;box-shadow:.4rem 0rem .8rem #bbb}@media screen and (min-width: 1056px){#documenter .docs-sidebar.visible{box-shadow:none}}@media screen and (min-width: 1056px){#documenter .docs-sidebar{left:0;top:0}}#documenter .docs-sidebar .docs-logo{margin-top:1rem;padding:0 1rem}#documenter .docs-sidebar .docs-logo>img{max-height:6rem;margin:auto}#documenter .docs-sidebar .docs-package-name{flex-shrink:0;font-size:1.5rem;font-weight:700;text-align:center;white-space:nowrap;overflow:hidden;padding:0.5rem 0}#documenter .docs-sidebar .docs-package-name .docs-autofit{max-width:16.2rem}#documenter .docs-sidebar .docs-package-name a,#documenter .docs-sidebar .docs-package-name a:hover{color:#0a0a0a}#documenter .docs-sidebar .docs-version-selector{border-top:1px solid #dbdbdb;display:none;padding:0.5rem}#documenter .docs-sidebar .docs-version-selector.visible{display:flex}#documenter .docs-sidebar ul.docs-menu{flex-grow:1;user-select:none;border-top:1px solid #dbdbdb;padding-bottom:1.5rem}#documenter .docs-sidebar ul.docs-menu>li>.tocitem{font-weight:bold}#documenter .docs-sidebar ul.docs-menu>li li{font-size:.95rem;margin-left:1em;border-left:1px solid #dbdbdb}#documenter .docs-sidebar ul.docs-menu input.collapse-toggle{display:none}#documenter .docs-sidebar ul.docs-menu ul.collapsed{display:none}#documenter .docs-sidebar ul.docs-menu input:checked~ul.collapsed{display:block}#documenter .docs-sidebar ul.docs-menu label.tocitem{display:flex}#documenter .docs-sidebar ul.docs-menu label.tocitem .docs-label{flex-grow:2}#documenter .docs-sidebar ul.docs-menu label.tocitem .docs-chevron{display:inline-block;font-style:normal;font-variant:normal;text-rendering:auto;line-height:1;font-size:.75rem;margin-left:1rem;margin-top:auto;margin-bottom:auto}#documenter .docs-sidebar ul.docs-menu label.tocitem .docs-chevron::before{font-family:"Font Awesome 6 Free";font-weight:900;content:"\f054"}#documenter .docs-sidebar ul.docs-menu input:checked~label.tocitem .docs-chevron::before{content:"\f078"}#documenter .docs-sidebar ul.docs-menu .tocitem{display:block;padding:0.5rem 0.5rem}#documenter .docs-sidebar ul.docs-menu .tocitem,#documenter .docs-sidebar ul.docs-menu .tocitem:hover{color:#0a0a0a;background:#f5f5f5}#documenter .docs-sidebar ul.docs-menu a.tocitem:hover,#documenter .docs-sidebar ul.docs-menu label.tocitem:hover{color:#0a0a0a;background-color:#ebebeb}#documenter .docs-sidebar ul.docs-menu li.is-active{border-top:1px solid #dbdbdb;border-bottom:1px solid #dbdbdb;background-color:#fff}#documenter .docs-sidebar ul.docs-menu li.is-active .tocitem,#documenter .docs-sidebar ul.docs-menu li.is-active .tocitem:hover{background-color:#fff;color:#0a0a0a}#documenter .docs-sidebar ul.docs-menu li.is-active ul.internal .tocitem:hover{background-color:#ebebeb;color:#0a0a0a}#documenter .docs-sidebar ul.docs-menu>li.is-active:first-child{border-top:none}#documenter .docs-sidebar ul.docs-menu ul.internal{margin:0 0.5rem 0.5rem;border-top:1px solid #dbdbdb}#documenter .docs-sidebar ul.docs-menu ul.internal li{font-size:.85rem;border-left:none;margin-left:0;margin-top:0.5rem}#documenter .docs-sidebar ul.docs-menu ul.internal .tocitem{width:100%;padding:0}#documenter .docs-sidebar ul.docs-menu ul.internal .tocitem::before{content:"⚬";margin-right:0.4em}#documenter .docs-sidebar form.docs-search{margin:auto;margin-top:0.5rem;margin-bottom:0.5rem}#documenter .docs-sidebar form.docs-search>input{width:14.4rem}#documenter .docs-sidebar #documenter-search-query{color:#707070;width:14.4rem;box-shadow:inset 0 1px 2px rgba(10,10,10,0.1)}@media screen and (min-width: 1056px){#documenter .docs-sidebar ul.docs-menu{overflow-y:auto;-webkit-overflow-scroll:touch}#documenter .docs-sidebar ul.docs-menu::-webkit-scrollbar{width:.3rem;background:none}#documenter .docs-sidebar ul.docs-menu::-webkit-scrollbar-thumb{border-radius:5px 0px 0px 5px;background:#e0e0e0}#documenter .docs-sidebar ul.docs-menu::-webkit-scrollbar-thumb:hover{background:#ccc}}@media screen and (max-width: 1055px){#documenter .docs-sidebar{overflow-y:auto;-webkit-overflow-scroll:touch}#documenter .docs-sidebar::-webkit-scrollbar{width:.3rem;background:none}#documenter .docs-sidebar::-webkit-scrollbar-thumb{border-radius:5px 0px 0px 5px;background:#e0e0e0}#documenter .docs-sidebar::-webkit-scrollbar-thumb:hover{background:#ccc}}kbd.search-modal-key-hints{border-radius:0.25rem;border:1px solid rgba(0,0,0,0.6);box-shadow:0 2px 0 1px rgba(0,0,0,0.6);cursor:default;font-size:0.9rem;line-height:1.5;min-width:0.75rem;text-align:center;padding:0.1rem 0.3rem;position:relative;top:-1px}.search-min-width-50{min-width:50%}.search-min-height-100{min-height:100%}.search-modal-card-body{max-height:calc(100vh - 15rem)}.search-result-link{border-radius:0.7em;transition:all 300ms}.search-result-link:hover,.search-result-link:focus{background-color:rgba(0,128,128,0.1)}.search-result-link .property-search-result-badge,.search-result-link .search-filter{transition:all 300ms}.property-search-result-badge,.search-filter{padding:0.15em 0.5em;font-size:0.8em;font-style:italic;text-transform:none !important;line-height:1.5;color:#f5f5f5;background-color:rgba(51,65,85,0.501961);border-radius:0.6rem}.search-result-link:hover .property-search-result-badge,.search-result-link:hover .search-filter,.search-result-link:focus .property-search-result-badge,.search-result-link:focus .search-filter{color:#f1f5f9;background-color:#333}.search-filter{color:#333;background-color:#f5f5f5;transition:all 300ms}.search-filter:hover,.search-filter:focus{color:#333}.search-filter-selected{color:#f5f5f5;background-color:rgba(139,0,139,0.5)}.search-filter-selected:hover,.search-filter-selected:focus{color:#f5f5f5}.search-result-highlight{background-color:#ffdd57;color:black}.search-divider{border-bottom:1px solid #dbdbdb}.search-result-title{width:85%;color:#333}.search-result-code-title{font-size:0.875rem;font-family:"JuliaMono","SFMono-Regular","Menlo","Consolas","Liberation Mono","DejaVu Sans Mono",monospace}#search-modal .modal-card-body::-webkit-scrollbar,#search-modal .filter-tabs::-webkit-scrollbar{height:10px;width:10px;background-color:transparent}#search-modal .modal-card-body::-webkit-scrollbar-thumb,#search-modal .filter-tabs::-webkit-scrollbar-thumb{background-color:gray;border-radius:1rem}#search-modal .modal-card-body::-webkit-scrollbar-track,#search-modal .filter-tabs::-webkit-scrollbar-track{-webkit-box-shadow:inset 0 0 6px rgba(0,0,0,0.6);background-color:transparent}.w-100{width:100%}.gap-2{gap:0.5rem}.gap-4{gap:1rem}.gap-8{gap:2rem}.ansi span.sgr1{font-weight:bolder}.ansi span.sgr2{font-weight:lighter}.ansi span.sgr3{font-style:italic}.ansi span.sgr4{text-decoration:underline}.ansi span.sgr7{color:#fff;background-color:#222}.ansi span.sgr8{color:transparent}.ansi span.sgr8 span{color:transparent}.ansi span.sgr9{text-decoration:line-through}.ansi span.sgr30{color:#242424}.ansi span.sgr31{color:#a7201f}.ansi span.sgr32{color:#066f00}.ansi span.sgr33{color:#856b00}.ansi span.sgr34{color:#2149b0}.ansi span.sgr35{color:#7d4498}.ansi span.sgr36{color:#007989}.ansi span.sgr37{color:gray}.ansi span.sgr40{background-color:#242424}.ansi span.sgr41{background-color:#a7201f}.ansi span.sgr42{background-color:#066f00}.ansi span.sgr43{background-color:#856b00}.ansi span.sgr44{background-color:#2149b0}.ansi span.sgr45{background-color:#7d4498}.ansi span.sgr46{background-color:#007989}.ansi span.sgr47{background-color:gray}.ansi span.sgr90{color:#616161}.ansi span.sgr91{color:#cb3c33}.ansi span.sgr92{color:#0e8300}.ansi span.sgr93{color:#a98800}.ansi span.sgr94{color:#3c5dcd}.ansi span.sgr95{color:#9256af}.ansi span.sgr96{color:#008fa3}.ansi span.sgr97{color:#f5f5f5}.ansi span.sgr100{background-color:#616161}.ansi span.sgr101{background-color:#cb3c33}.ansi span.sgr102{background-color:#0e8300}.ansi span.sgr103{background-color:#a98800}.ansi span.sgr104{background-color:#3c5dcd}.ansi span.sgr105{background-color:#9256af}.ansi span.sgr106{background-color:#008fa3}.ansi span.sgr107{background-color:#f5f5f5}code.language-julia-repl>span.hljs-meta{color:#066f00;font-weight:bolder}/*! + Theme: Default + Description: Original highlight.js style + Author: (c) Ivan Sagalaev + Maintainer: @highlightjs/core-team + Website: https://highlightjs.org/ + License: see project LICENSE + Touched: 2021 +*/pre code.hljs{display:block;overflow-x:auto;padding:1em}code.hljs{padding:3px 5px}.hljs{background:#F3F3F3;color:#444}.hljs-comment{color:#697070}.hljs-tag,.hljs-punctuation{color:#444a}.hljs-tag .hljs-name,.hljs-tag .hljs-attr{color:#444}.hljs-keyword,.hljs-attribute,.hljs-selector-tag,.hljs-meta .hljs-keyword,.hljs-doctag,.hljs-name{font-weight:bold}.hljs-type,.hljs-string,.hljs-number,.hljs-selector-id,.hljs-selector-class,.hljs-quote,.hljs-template-tag,.hljs-deletion{color:#880000}.hljs-title,.hljs-section{color:#880000;font-weight:bold}.hljs-regexp,.hljs-symbol,.hljs-variable,.hljs-template-variable,.hljs-link,.hljs-selector-attr,.hljs-operator,.hljs-selector-pseudo{color:#ab5656}.hljs-literal{color:#695}.hljs-built_in,.hljs-bullet,.hljs-code,.hljs-addition{color:#397300}.hljs-meta{color:#1f7199}.hljs-meta .hljs-string{color:#38a}.hljs-emphasis{font-style:italic}.hljs-strong{font-weight:bold}.gap-4{gap:1rem} diff --git a/v1.8.0/assets/themeswap.js b/v1.8.0/assets/themeswap.js new file mode 100644 index 000000000..9f5eebe6a --- /dev/null +++ b/v1.8.0/assets/themeswap.js @@ -0,0 +1,84 @@ +// Small function to quickly swap out themes. Gets put into the tag.. +function set_theme_from_local_storage() { + // Initialize the theme to null, which means default + var theme = null; + // If the browser supports the localstorage and is not disabled then try to get the + // documenter theme + if (window.localStorage != null) { + // Get the user-picked theme from localStorage. May be `null`, which means the default + // theme. + theme = window.localStorage.getItem("documenter-theme"); + } + // Check if the users preference is for dark color scheme + var darkPreference = + window.matchMedia("(prefers-color-scheme: dark)").matches === true; + // Initialize a few variables for the loop: + // + // - active: will contain the index of the theme that should be active. Note that there + // is no guarantee that localStorage contains sane values. If `active` stays `null` + // we either could not find the theme or it is the default (primary) theme anyway. + // Either way, we then need to stick to the primary theme. + // + // - disabled: style sheets that should be disabled (i.e. all the theme style sheets + // that are not the currently active theme) + var active = null; + var disabled = []; + var primaryLightTheme = null; + var primaryDarkTheme = null; + for (var i = 0; i < document.styleSheets.length; i++) { + var ss = document.styleSheets[i]; + // The tag of each style sheet is expected to have a data-theme-name attribute + // which must contain the name of the theme. The names in localStorage much match this. + var themename = ss.ownerNode.getAttribute("data-theme-name"); + // attribute not set => non-theme stylesheet => ignore + if (themename === null) continue; + // To distinguish the default (primary) theme, it needs to have the data-theme-primary + // attribute set. + if (ss.ownerNode.getAttribute("data-theme-primary") !== null) { + primaryLightTheme = themename; + } + // Check if the theme is primary dark theme so that we could store its name in darkTheme + if (ss.ownerNode.getAttribute("data-theme-primary-dark") !== null) { + primaryDarkTheme = themename; + } + // If we find a matching theme (and it's not the default), we'll set active to non-null + if (themename === theme) active = i; + // Store the style sheets of inactive themes so that we could disable them + if (themename !== theme) disabled.push(ss); + } + var activeTheme = null; + if (active !== null) { + // If we did find an active theme, we'll (1) add the theme--$(theme) class to + document.getElementsByTagName("html")[0].className = "theme--" + theme; + activeTheme = theme; + } else { + // If we did _not_ find an active theme, then we need to fall back to the primary theme + // which can either be dark or light, depending on the user's OS preference. + var activeTheme = darkPreference ? primaryDarkTheme : primaryLightTheme; + // In case it somehow happens that the relevant primary theme was not found in the + // preceding loop, we abort without doing anything. + if (activeTheme === null) { + console.error("Unable to determine primary theme."); + return; + } + // When switching to the primary light theme, then we must not have a class name + // for the tag. That's only for non-primary or the primary dark theme. + if (darkPreference) { + document.getElementsByTagName("html")[0].className = + "theme--" + activeTheme; + } else { + document.getElementsByTagName("html")[0].className = ""; + } + } + for (var i = 0; i < document.styleSheets.length; i++) { + var ss = document.styleSheets[i]; + // The tag of each style sheet is expected to have a data-theme-name attribute + // which must contain the name of the theme. The names in localStorage much match this. + var themename = ss.ownerNode.getAttribute("data-theme-name"); + // attribute not set => non-theme stylesheet => ignore + if (themename === null) continue; + // we'll disable all the stylesheets, except for the active one + ss.disabled = !(themename == activeTheme); + } +} +set_theme_from_local_storage(); diff --git a/v1.8.0/assets/warner.js b/v1.8.0/assets/warner.js new file mode 100644 index 000000000..3f6f5d008 --- /dev/null +++ b/v1.8.0/assets/warner.js @@ -0,0 +1,52 @@ +function maybeAddWarning() { + // DOCUMENTER_NEWEST is defined in versions.js, DOCUMENTER_CURRENT_VERSION and DOCUMENTER_STABLE + // in siteinfo.js. + // If either of these are undefined something went horribly wrong, so we abort. + if ( + window.DOCUMENTER_NEWEST === undefined || + window.DOCUMENTER_CURRENT_VERSION === undefined || + window.DOCUMENTER_STABLE === undefined + ) { + return; + } + + // Current version is not a version number, so we can't tell if it's the newest version. Abort. + if (!/v(\d+\.)*\d+/.test(window.DOCUMENTER_CURRENT_VERSION)) { + return; + } + + // Current version is newest version, so no need to add a warning. + if (window.DOCUMENTER_NEWEST === window.DOCUMENTER_CURRENT_VERSION) { + return; + } + + // Add a noindex meta tag (unless one exists) so that search engines don't index this version of the docs. + if (document.body.querySelector('meta[name="robots"]') === null) { + const meta = document.createElement("meta"); + meta.name = "robots"; + meta.content = "noindex"; + + document.getElementsByTagName("head")[0].appendChild(meta); + } + + const div = document.createElement("div"); + div.classList.add("outdated-warning-overlay"); + const closer = document.createElement("button"); + closer.classList.add("outdated-warning-closer", "delete"); + closer.addEventListener("click", function () { + document.body.removeChild(div); + }); + const href = window.documenterBaseURL + "/../" + window.DOCUMENTER_STABLE; + div.innerHTML = + 'This documentation is not for the latest stable release, but for either the development version or an older release.
      Click here to go to the documentation for the latest stable release.'; + div.appendChild(closer); + document.body.appendChild(div); +} + +if (document.readyState === "loading") { + document.addEventListener("DOMContentLoaded", maybeAddWarning); +} else { + maybeAddWarning(); +} diff --git a/v1.8.0/contributing/index.html b/v1.8.0/contributing/index.html new file mode 100644 index 000000000..ddcaac540 --- /dev/null +++ b/v1.8.0/contributing/index.html @@ -0,0 +1,2 @@ + +Contributing · Rocket.jl

      Contribution guidelines

      We welcome all possible contributors. This page details the some of the guidelines that should be followed when contributing to this package.

      Reporting bugs

      We track bugs using GitHub issues. We encourage you to write complete, specific, reproducible bug reports. Mention the versions of Julia and Rocket.jl for which you observe unexpected behavior. Please provide a concise description of the problem and complement it with code snippets, test cases, screenshots, tracebacks or any other information that you consider relevant. This will help us to replicate the problem and narrow the search space for solutions.

      Suggesting features

      We welcome new feature proposals. However, before submitting a feature request, consider a few things:

      • Does the feature require changes in the core Rocket.jl code? If it doesn't (for example, you would like to add a operator for a particular application), consider making a separate repository for your extensions.
      • If you would like to add an implementation of a feature that changes a lot in the core Rocket.jl code, please open an issue on GitHub and describe your proposal first. This will allow us to discuss your proposal with you before you invest your time in implementing something that may be difficult to merge later on.

      Contributing code

      Installing Rocket

      We suggest that you use the dev command from the new Julia package manager to install Rocket.jl for development purposes. To work on your fork of Rocket.jl, use your fork's URL address in the dev command, for example:

      ] dev git@github.com:your_username/Rocket.jl.git

      The dev command clones Rocket.jl to ~/.julia/dev/Rocket. All local changes to Rocket code will be reflected in imported code.

      Note

      It is also might be useful to install Revise.jl package as it allows you to modify code and use the changes without restarting Julia.

      Committing code

      We use the standard GitHub Flow workflow where all contributions are added through pull requests. In order to contribute, first fork the repository, then commit your contributions to your fork, and then create a pull request on the master branch of the Rocket.jl repository.

      Before opening a pull request, please make sure that all tests pass without failing! All demos (can be found in /demo/ directory) have to run without errors as well.

      Style conventions

      We use default Julia style guide. We list here a few important points and our modifications to the Julia style guide:

      • Use 4 spaces for indentation
      • Type names use UpperCamelCase. For example: ArrayObservable, MapOperator, etc..
      • Function names are lowercase with underscores, when necessary. For example: next!, subscribe!, as_actor, etc..
      • Variable names and function arguments use snake_case
      • The name of a method that modifies its argument(s) must end in !

      Unit tests

      We use the test-driven development (TDD) methodology for Rocket.jl development. The test coverage should be as complete as possible. Please make sure that you write tests for each piece of code that you want to add.

      All unit tests are located in the /test/ directory. The /test/ directory follows the structure of the /src/ directory. Each test file should have following filename format: test_*.jl. Some tests are also present in jldoctest docs annotations directly in the source code. See Julia's documentation about doctests.

      The tests can be evaluated by running following command in the Julia REPL:

      ] test Rocket
      diff --git a/v1.8.0/getting-started/index.html b/v1.8.0/getting-started/index.html new file mode 100644 index 000000000..1152ccbc1 --- /dev/null +++ b/v1.8.0/getting-started/index.html @@ -0,0 +1,22 @@ + +Getting started · Rocket.jl

      Getting started

      Rocket.jl is a Julia package for reactive programming that makes it easier to work with asynchronous data. It is inspired by the RxJS and ReactiveX communities.

      In order to combine good performance with a convenient API, Rocket.jl employs Observer patterns, Actor models and Functional programming.

      Installation

      Install Rocket.jl through the Julia package manager:

      ] add Rocket

      Concepts

      Rocket.jl has been designed with a focus on performance and modularity.

      The essential concepts in Rocket.jl are:

      • Observable: represents a collection of future messages (data or/and events).
      • Actor: is an object that knows how to react on incoming messages delivered by the Observable.
      • Subscription: represents a teardown logic that is useful for cancelling the execution of an Observable.
      • Operator: an object that deals with collection operations, such as map, filter, reduce, etc.
      • Subject: the way of multicasting a message to multiple Observers.

      First example

      Conventionally, arrays are used for processing data.

      for value in array_of_values
      +    doSomethingWithMyData(value)
      +end

      In contrast, Rocket.jl uses observables.

      subscription = subscribe!(source_of_values, lambda(
      +    on_next     = (data)  -> doSomethingWithMyData(data),
      +    on_error    = (error) -> doSomethingWithAnError(error),
      +    on_complete = ()      -> println("Completed!")
      +))

      At some point in time you may decide to stop listening for new messages.

      unsubscribe!(subscription)

      Actors

      In order to process messages from an observable you will need to define an Actor that knows how to react to incoming messages.

      struct MyActor <: Rocket.Actor{Int} end
      +
      +Rocket.on_next!(actor::MyActor, data::Int) = doSomethingWithMyData(data)
      +Rocket.on_error!(actor::MyActor, error)    = doSomethingWithAnError(error)
      +Rocket.on_complete!(actor::MyActor)        = println("Completed!")

      An actor can also have its own local state.

      struct StoreActor{D} <: Rocket.Actor{D}
      +    values :: Vector{D}
      +
      +    StoreActor{D}() where D = new(Vector{D}())
      +end
      +
      +Rocket.on_next!(actor::StoreActor{D}, data::D) where D = push!(actor.values, data)
      +Rocket.on_error!(actor::StoreActor, error)             = doSomethingWithAnError(error)
      +Rocket.on_complete!(actor::StoreActor)                 = println("Completed: $(actor.values)")

      For debugging purposes you can use a general LambdaActor actor or just pass a function object as an actor in subscribe! function..

      Operators

      What makes Rocket.jl powerful is its ability to help you process, transform and modify the messages that flow through your observables, using Operators.

      subscribe!(squared_int_values |> map(Int, (d) -> d ^ 2), lambda(
      +    on_next = (data) -> println(data)
      +))
      diff --git a/v1.8.0/index.html b/v1.8.0/index.html new file mode 100644 index 000000000..624601001 --- /dev/null +++ b/v1.8.0/index.html @@ -0,0 +1,2 @@ + +Home · Rocket.jl

      Rocket.jl Documentation

      Welcome to the documentation for Rocket.jl.

      This documentation is an adaptation of the RxJS library documentation.

      Table of Contents

      Index

      diff --git a/v1.8.0/objects.inv b/v1.8.0/objects.inv new file mode 100644 index 000000000..66a4480e9 Binary files /dev/null and b/v1.8.0/objects.inv differ diff --git a/v1.8.0/observables/about/index.html b/v1.8.0/observables/about/index.html new file mode 100644 index 000000000..a38004286 --- /dev/null +++ b/v1.8.0/observables/about/index.html @@ -0,0 +1,94 @@ + +Observable · Rocket.jl

      Observables

      Observables are lazy Push collections of multiple values. They fill the missing spot in the following table:

      TypeSingleMultiple
      PullFunctionIterator
      PushPromiseObservable

      First example

      For example, the following code specifies an Observable that pushes the values 1, 2, 3 immediately (synchronously) when subscribed to, and the value 4 after one second has passed since subscription.

      using Rocket
      +
      +source = make(Int) do actor
      +    next!(actor, 1)
      +    next!(actor, 2)
      +    next!(actor, 3)
      +    setTimeout(1000) do
      +        next!(actor, 4)
      +        complete!(actor)
      +    end
      +end

      To invoke the Observable and inspect these values, we need to subscribe to it. It is important to note that observables are lazy collections which means they don't emit anything until someone subscribes to it. Every subscription spawns its own independent execution of observable. There are some exceptions to this rule, e.g. Subjects and some operators (share(), etc..) which may change this behaviour

      using Rocket
      +
      +source = make(Int) do actor
      +    next!(actor, 1)
      +    next!(actor, 2)
      +    next!(actor, 3)
      +    setTimeout(1000) do
      +        next!(actor, 4)
      +        complete!(actor)
      +    end
      +end
      +
      +println("Just before subscribe")
      +subscribe!(source, lambda(
      +    on_next     = (d) -> println(d),
      +    on_complete = ()  -> println("Completed")
      +))
      +println("Just after subscribe")
      +
      +# Logs
      +# Just before subscribe
      +# 1
      +# 2
      +# 3
      +# Just after subscribe
      +# 4
      +# Completed

      Pull vs Push

      Pull and Push are two different protocols that describe how a data Producer communicates with a data Consumer.

      In a Pull system, the Consumer determines when it receives data from the Producer. The Producer itself is unaware of when the data are delivered to the Consumer.

      Every Julia Function is a Pull system. The function is a Producer of data, and the code that calls the function is consuming data by "pulling" a return value from the call.

      TypePRODUCERCONSUMER
      PullPassive: produces data when requested.Active: decides when data is requested.
      PushActive: produces data at its own pace.Passive: reacts to received data.

      In Push systems, the Producer determines when to send data to the Consumer. The Consumer is unaware of when it will receive that data.

      Futures and promises are the most common type of Push systems today. A Promise (the Producer) delivers a resolved value to registered callbacks (the Consumers). Unlike functions, it is the Promise that determines precisely when a value is "pushed" to the callbacks.

      Rocket.jl introduces Observables, a new Push system for Julia. An Observable is a Producer of multiple values, "pushing" them to Observers (Consumers or Actors).

      • A Function is a lazily evaluated computation that synchronously returns a single value on invocation.
      • A Generator is a lazily evaluated computation that synchronously returns zero to (potentially) infinite values on iteration.
      • A Promise is a computation that may (or may not) eventually return a single value.
      • An Observable is a lazily evaluated computation that can synchronously or asynchronously return zero to (potentially) infinite values from the time it's invoked.

      Observables as generalizations of functions

      In contrast to functions, Observables can "return" multiple values over time. For example, functions can't do this:

      function foo()
      +    println("Hello!")
      +    return 0
      +    return 1 # Dead code, will never happen
      +end

      Observables, however, can do this:

      using Rocket
      +
      +foo = make(Int) do actor
      +    next!(actor, 0)
      +    next!(actor, 1)
      +    complete!(actor)
      +end
      +

      Observables can also "return" values asynchronously after some time:

      using Rocket
      +
      +foo = make(Int) do actor
      +    setTimeout(1000) do
      +        next!(actor, 0)
      +        complete!(actor)
      +    end
      +end

      Assume we have a function foo and some observable:

      • Function call foo(args...) means "give me one value synchronously" (pull strategy)
      • In contrast subscription to an observable with subscribe(observable, ...) means "notify me about any amount of values, either synchronously or asynchronously" (push strategy)

      When a new value is available in an observable we say that the observable emits or generates an update. Values that are generated by an observable are sometimes also called future values, because there is no principled way to predict when an observable will generate a new value. In some programming languages, observables are referred to as generators or streams and we will use all three terms interchangeably.

      Anatomy of an Observable

      Observables are (1) created using creation operators (it is also possible to build an Observable from scratch with custom logic); (2) subscribed to with an Actor; (3) execute to deliver next! / error! / complete! notifications to the Actor, and (4) their execution may be disposed. These four aspects are all encoded in an Observable instance, but some of these aspects are related to other types, such as Subscribable and Subscription.

      The core responsibilities of an Observable are:

      • Creating Observables
      • Subscribing to Observables
      • Executing the Observable
      • Disposing Observables

      Creating Observables

      You can create an Observable in various ways using Creation operators. You can also build an Observable from scratch. To see how you can build an Observable with custom logic, consult the API Section.

      Subscribing to Observables

      The Observable source in the example can be subscribed to.

      using Rocket
      +
      +subscribe!(source, lambda(
      +    on_next = (d) -> println(d)
      +))

      This example shows how subscribe calls are not shared among multiple Actors of the same Observable. When calling subscribe! with an Actor, the function on_subscribe! that is attached to this particular Observable is executed for that given actor. Each call to subscribe! triggers its own independent setup for that given actor.

      Note

      Subscribing to an Observable is like calling a function, providing callbacks where the data will be delivered to.

      The subscribe! function also supports multiple subscriptions at once. If the input argument to the subscribe! function is a tuple or a vector, it will first check that all of the arguments are valid source objects and actors and if its true will subscribe from each of them individually.

      
      +source1 = Subject(Int)
      +source2 = Subject(Int)
      +
      +subscriptions = subscribe!([
      +    (source1, logger()),
      +    (source2, logger()),
      +])
      +
      +# Later on
      +# unsubscribe!(subscriptions)
      +

      Executing Observables

      The execution produces multiple values over time, either synchronously or asynchronously.

      An Observable Execution can deliver three types of notifications:

      • Next: sends a value, such as an Int, String, Dict, etc.;
      • Error: sends any error as a value;
      • Complete: does not send a value.

      "Next" notifications are the most important and most common type: they represent actual data being delivered to an subscriber. "Error" and "Complete" notifications terminate the Observable Execution.

      Note

      In an Observable Execution, any number of Next notifications may be delivered. However, once a single Error or Complete notification is delivered, nothing else can be delivered afterwards.

      The following is an example of an Observable execution that delivers three Next notifications and subsequently completes:

      using Rocket
      +
      +source = make(Int) do actor
      +    next!(actor, 1)
      +    next!(actor, 2)
      +    next!(actor, 3)
      +    complete!(actor)
      +end
      +
      +# or the same with creation operator
      +
      +source = from([ 1, 2, 3 ])

      It is advised to wrap any code in subscribe by a try/catch block that delivers an Error notification upon an exception:

      using Rocket
      +
      +source = make(Int) do actor
      +    try
      +        next!(actor, 1)
      +        next!(actor, 2)
      +        next!(actor, 3)
      +        complete!(actor)
      +    catch e
      +        error!(actor, e)
      +    end
      +end
      +

      Disposing Observable Executions

      It is common for an Actor to abort execution of an Observable Execution. Once the Actor is done receiving values, it may stop the execution in order to free computation power or memory resources.

      When subscribe! is called, the Actor gets attached to the newly created Observable execution. This call also returns an object, the Subscription:

      subscription = subscribe!(source, actor)

      The Subscription represents the ongoing execution, and has a minimal API that allows you to cancel the execution. Read more about Subscription type here.

      With

      unsubscribe!(subscription)

      you can cancel the ongoing execution.

      Note

      subscribe! returns a Subscription that represents the ongoing execution. Simply call unsubscribe! on the Subscription to cancel the execution.

      diff --git a/v1.8.0/observables/types/array/index.html b/v1.8.0/observables/types/array/index.html new file mode 100644 index 000000000..325c9f9c8 --- /dev/null +++ b/v1.8.0/observables/types/array/index.html @@ -0,0 +1,59 @@ + +Array · Rocket.jl

      Array Observable

      Rocket.fromFunction
      from(x; scheduler::H = AsapScheduler()) where { H <: AbstractScheduler }
      +from(a::Vector{D}; scheduler::H = AsapScheduler()) where { D, H <: AbstractScheduler }

      Creation operator for the ArrayObservable that emits either a single value if x has a Scalar trait specification or a collection of values if x has a NonScalar trait specification. Throws an ErrorException if x has UndefinedScalarness trait type. To specify scalarness for arbitrary type T some can implement an additional method for scalarness(::Type{<:MyType}) function and to specify scalarness behavior. Optionally accepts custom scheduler-like object to schedule messages delivery.

      Arguments

      • x: an object to be wrapped into array of values
      • scheduler: optional, scheduler-like object

      For an object x to be a valid input for a from operator it must implement Rocket.scalarness(::Type{ <: T }) method which should return either Rocket.Scalar or Rocket.NonScalar objects. In first case from operator will treat x as a single scalar value and will wrap it into a vector while in the second case from operator will convert x object into an array using collect function.

      For arbitrary iterable objects consider using iterable creation operator.

      Note

      from operators creates a copy of x using collect on a given object.

      Examples

      using Rocket
      +
      +source = from([ 0, 1, 2 ])
      +subscribe!(source, logger())
      +;
      +
      +# output
      +
      +[LogActor] Data: 0
      +[LogActor] Data: 1
      +[LogActor] Data: 2
      +[LogActor] Completed
      +
      using Rocket
      +
      +source = from(( 0, 1, 2 ))
      +subscribe!(source, logger())
      +;
      +
      +# output
      +
      +[LogActor] Data: 0
      +[LogActor] Data: 1
      +[LogActor] Data: 2
      +[LogActor] Completed
      +
      using Rocket
      +
      +source = from(0)
      +subscribe!(source, logger())
      +;
      +
      +# output
      +
      +[LogActor] Data: 0
      +[LogActor] Completed
      +
      using Rocket
      +
      +source = from("Hello, world!")
      +subscribe!(source, logger())
      +;
      +
      +# output
      +
      +[LogActor] Data: H
      +[LogActor] Data: e
      +[LogActor] Data: l
      +[LogActor] Data: l
      +[LogActor] Data: o
      +[LogActor] Data: ,
      +[LogActor] Data:
      +[LogActor] Data: w
      +[LogActor] Data: o
      +[LogActor] Data: r
      +[LogActor] Data: l
      +[LogActor] Data: d
      +[LogActor] Data: !
      +[LogActor] Completed
      +

      See also: ArrayObservable, subscribe!, logger, iterable

      source
      Rocket.ArrayObservableType
      ArrayObservable{D, H}(values::Vector{D}, scheduler::H) where { D, H }

      ArrayObservable wraps a regular Julia array into an observable. Uses scheduler object to schedule messages delivery.

      Constructor arguments

      • values: array of values to be wrapped
      • scheduler: Scheduler-like object

      See also: Subscribable, from

      source
      diff --git a/v1.8.0/observables/types/collected/index.html b/v1.8.0/observables/types/collected/index.html new file mode 100644 index 000000000..f09c63a32 --- /dev/null +++ b/v1.8.0/observables/types/collected/index.html @@ -0,0 +1,14 @@ + +Collected · Rocket.jl

      Collected Observable

      Rocket.collectLatestFunction
      collectLatest(sources::S, mappingFn::F = copy, callbackFn::C = nothing)
      +collectLatest(::Type{T}, ::Type{R}, sources::S, mappingFn::F = copy, callbackFn::C = nothing)

      Collects values from multible Observables and emits it in one single array every time each inner Observable has a new value. Reemits errors from inner observables. Completes when all inner observables completes.

      Arguments

      • sources: input sources
      • mappingFn: optional mappingFn applied to an array of emited values, copy by default, should return a Vector
      • callbackFn: optional callback function, which is called right after mappingFn has been evaluated, accepts the state of the inner actor and the computed value, nothing by default

      Note: collectLatest completes immediately if sources are empty.

      Optional arguments

      • ::Type{T}: optional type of emmiting values of inner observables
      • ::Type{R}: optional return type after applying mappingFn to a vector of values

      Examples

      using Rocket
      +
      +collected = collectLatest([ of(1), from([ 1, 2 ]) ])
      +
      +subscribe!(collected, logger())
      +;
      +
      +# output
      +
      +[LogActor] Data: [1, 1]
      +[LogActor] Data: [1, 2]
      +[LogActor] Completed

      See also: Subscribable, subscribe!, combineLatest

      source

      Description

      collectLatest collects the values from all Observables in its vector argument. This is done by subscribing to each Observable in order and, whenever an Observable emits, collecting a vector of the most recent values from each Observable (in order). If you pass n Observables to collectLatest, the returned Observable will always emit an ordered vector of n values.

      To ensure that the output vector has a consistent length, collectLatest waits for all input Observables to emit at least once before it starts emitting results. This means that if some Observable emits values before other Observables started emitting, all these values but the last will be lost. On the other hand, if some Observable does not emit a value but completes, the resulting Observable will complete simultaneously without emitting anything. Furthermore, if some input Observable does not emit any value and never completes, collectLatest will also never emit and never complete.

      If at least one Observable was passed to collectLatest and all passed Observables emitted, then the resulting Observable will complete when all combined streams complete. So even if some Observable completes, the result of collectLatest will still emit values when the other Observables do. In case of a completed Observable, its value will now remain to be the last emitted value. On the other hand, if any Observable errors, collectLatest will also immediately error.

      diff --git a/v1.8.0/observables/types/combined/index.html b/v1.8.0/observables/types/combined/index.html new file mode 100644 index 000000000..6b155e4d3 --- /dev/null +++ b/v1.8.0/observables/types/combined/index.html @@ -0,0 +1,26 @@ + +Combined · Rocket.jl

      Combined Observable

      Rocket.combineLatestFunction
      combineLatest(sources...; strategy = PushEach())
      +combineLatest(sources::S, strategy::G = PushEach()) where { S <: Tuple, U }

      Combines multiple Observables to create an Observable whose values are calculated from the latest values of each of its input Observables. Accept optimal update strategy object.

      Arguments

      • sources: input sources
      • strategy: optional update strategy for batching new values together

      Note: combineLatest() completes immediately if sources are empty.

      Examples

      using Rocket
      +
      +latest = combineLatest(of(1), from(2:5))
      +
      +subscribe!(latest, logger())
      +;
      +
      +# output
      +
      +[LogActor] Data: (1, 2)
      +[LogActor] Data: (1, 3)
      +[LogActor] Data: (1, 4)
      +[LogActor] Data: (1, 5)
      +[LogActor] Completed
      using Rocket
      +
      +latest = combineLatest(of(1) |> async(0), from(2:5) |> async(0), strategy = PushNew())
      +
      +subscribe!(latest, logger())
      +;
      +
      +# output
      +
      +[LogActor] Data: (1, 2)
      +[LogActor] Completed

      See also: Subscribable, subscribe!, PushEach, PushEachBut, PushNew, PushNewBut, PushStrategy

      source

      Description

      combineLatest combines the values from all Observables in its arguments. This is done by subscribing to each Observable in order and, whenever an Observable emits, collecting a tuple of the most recent values from each Observable (in order). If you pass n Observables to combineLatest, the returned Observable will always emit an ordered tuple of n values.

      To ensure that the output tuple has a consistent length, combineLatest waits for all input Observables to emit at least once before it starts emitting results. This means that if some Observable emits values before other Observables started emitting, all these values but the last will be lost. On the other hand, if some Observable does not emit a value but completes, the resulting Observable will complete simultaneously without emitting anything. Furthermore, if some input Observable does not emit any value and never completes, combineLatest will also never emit and never complete.

      If at least one Observable was passed to combineLatest and all passed Observables emitted, then the resulting Observable will complete when all combined streams complete. So even if some Observable completes, the result of combineLatest will still emit values when the other Observables do. In case of a completed Observable, its value will now remain to be the last emitted value. On the other hand, if any Observable errors, combineLatest will also immediately error.

      It is possible to change default update/complete strategy behaviour with an optional strategy object.

      diff --git a/v1.8.0/observables/types/combined_updates/index.html b/v1.8.0/observables/types/combined_updates/index.html new file mode 100644 index 000000000..aa85018a8 --- /dev/null +++ b/v1.8.0/observables/types/combined_updates/index.html @@ -0,0 +1,3 @@ + +Combined Updates · Rocket.jl

      CombinedUpdates Observable

      Rocket.combineLatestUpdatesFunction
      combineLatestUpdates(sources...; strategy = PushEach())
      +combineLatestUpdates(sources::S, strategy::G = PushEach()) where { S <: Tuple, U }

      combineLatestUpdates is a more effiecient version of combineLatest(sources) + map_to(sources) operators chain.

      Arguments

      • sources: input sources
      • strategy: optional update strategy for batching new values together

      Note: combineLatestUpdates() completes immediately if sources are empty.

      See also: Subscribable, subscribe!, PushEach, PushEachBut, PushNew, PushNewBut, PushStrategy

      source
      diff --git a/v1.8.0/observables/types/completed/index.html b/v1.8.0/observables/types/completed/index.html new file mode 100644 index 000000000..a4465799d --- /dev/null +++ b/v1.8.0/observables/types/completed/index.html @@ -0,0 +1,11 @@ + +Completed · Rocket.jl

      Completed Observable

      Rocket.completedFunction
      completed(::Type{T} = Any; scheduler::H = AsapScheduler()) where { T, H <: AbstractScheduler }

      Creation operator for the CompletedObservable that emits no items to the Actor and immediately sends a complete notification on subscription.

      Arguments

      • T: type of output data source, optional, Any is the default
      • scheduler: optional, scheduler-like object

      Examples

      using Rocket
      +
      +source = completed(Int)
      +subscribe!(source, logger())
      +;
      +
      +# output
      +
      +[LogActor] Completed
      +

      See also: CompletedObservable, subscribe!, logger

      source
      Rocket.CompletedObservableType
      CompletedObservable{D, H}(scheduler::H)

      Observable that emits no items to the Actor and just sends a complete notification on subscription.

      Constructor arguments

      • scheduler: Scheduler-like object

      See also: Subscribable, completed

      source
      diff --git a/v1.8.0/observables/types/concat/index.html b/v1.8.0/observables/types/concat/index.html new file mode 100644 index 000000000..2745b9cda --- /dev/null +++ b/v1.8.0/observables/types/concat/index.html @@ -0,0 +1,25 @@ + +Concat · Rocket.jl

      Concat Observable

      Rocket.concatFunction
      concat(sources...)
      +concat(sources::S) where { S <: Tuple }

      Combines multiple Observables to create an Observable which sequentially emits all values from given Observable and then moves on to the next. All values of each passed Observable merged into a single Observable, in order, in serial fashion.

      Arguments

      • sources: input sources

      Examples

      using Rocket
      +
      +source1 = of(1)
      +source2 = of(2)
      +
      +subscribe!(concat(source1, source2), logger())
      +;
      +
      +# output
      +[LogActor] Data: 1
      +[LogActor] Data: 2
      +[LogActor] Completed
      using Rocket
      +
      +source1 = of(1) |> async()
      +source2 = of(2)
      +
      +subscribe!(concat(source1, source2), logger())
      +;
      +
      +# output
      +[LogActor] Data: 1
      +[LogActor] Data: 2
      +[LogActor] Completed

      See also: Subscribable, subscribe!

      source
      diff --git a/v1.8.0/observables/types/connectable/index.html b/v1.8.0/observables/types/connectable/index.html new file mode 100644 index 000000000..a1fcdafe6 --- /dev/null +++ b/v1.8.0/observables/types/connectable/index.html @@ -0,0 +1,17 @@ + +Connectable · Rocket.jl

      Connectable Observable

      Rocket.connectableFunction
      connectable(subject::J, source::S) where J where S

      Creates a ConnectableObservable with a given subject object and a source observable.

      Example

      using Rocket
      +
      +c = connectable(Subject(Int; scheduler = AsapScheduler()), from(1:3))
      +
      +subscribe!(c, logger());
      +
      +connect(c);
      +;
      +
      +# output
      +
      +[LogActor] Data: 1
      +[LogActor] Data: 2
      +[LogActor] Data: 3
      +[LogActor] Completed
      +

      See also: ConnectableObservable, connect, subscribe!

      source
      Rocket.connectFunction
      connect(connectable::ConnectableObservable)

      When connect is called, the subject passed to the multicast operator is subscribed to the source and the subject’s observers receive the multicast notifications, which fits our basic mental model of stream multicasting. Returns a subscription.

      See also: connectable, ConnectableObservable

      source
      Rocket.ConnectableObservableType
      ConnectableObservable{D}(subject, source)

      A connectable observable encapsulates the multicasting infrastructure with provided subject, but does not immediately subscribe to the source. It subscribes to the source when its connect method is called.

      See also: connect, Subscribable

      source
      diff --git a/v1.8.0/observables/types/defer/index.html b/v1.8.0/observables/types/defer/index.html new file mode 100644 index 000000000..d3d135536 --- /dev/null +++ b/v1.8.0/observables/types/defer/index.html @@ -0,0 +1,13 @@ + +Defer · Rocket.jl

      Defer Observable

      Rocket.deferFunction
      defer(::Type{D}, factoryFn::F) where { D, F <: Function }

      Creates an Observable that, on subscribe, calls an Observable factory to make an Observable for each new Observer.

      Arguments

      • T: type of output data source, created by the factoryFn
      • factoryFn: the Observable factory function to invoke for each Observer that subscribes to the output Observable

      Examples

      using Rocket
      +
      +source = defer(Int, () -> from([ 1, 2, 3 ]))
      +
      +subscribe!(source, logger())
      +;
      +
      +# output
      +[LogActor] Data: 1
      +[LogActor] Data: 2
      +[LogActor] Data: 3
      +[LogActor] Completed

      See also: Subscribable, subscribe!, logger

      source

      Description

      defer allows you to create the Observable only when the Actor subscribes, and create a fresh Observable for each Actor. It waits until an Actor subscribes to it, and then it generates an Observable, typically with an Observable factory function. It does this afresh for each subscriber, so although each subscriber may think it is subscribing to the same Observable, in fact each subscriber gets its own individual Observable.

      diff --git a/v1.8.0/observables/types/faulted/index.html b/v1.8.0/observables/types/faulted/index.html new file mode 100644 index 000000000..cf66422b4 --- /dev/null +++ b/v1.8.0/observables/types/faulted/index.html @@ -0,0 +1,12 @@ + +Faulted · Rocket.jl

      Faulted Observable

      Rocket.faultedFunction
      faulted(err; scheduler::H = AsapScheduler())            where { H <: AbstractScheduler }
      +faulted(::Type{T}, err; scheduler::H = AsapScheduler()) where { T, H <: AbstractScheduler }

      Creation operator for the FaultedObservable that emits no items to the Actor and immediately sends an error notification.

      Arguments

      • err: the particular Error to pass to the error notification.
      • T: type of output data source, optional, Any by default
      • scheduler: optional, scheduler-like object

      Examples

      using Rocket
      +
      +source = faulted("Error!")
      +subscribe!(source, logger())
      +;
      +
      +# output
      +
      +[LogActor] Error: Error!
      +

      See also: FaultedObservable, subscribe!

      source
      Rocket.FaultedObservableType
      FaultedObservable{D, H}(err, scheduler::H)

      Observable that emits no items to the Actor and just sends an error notification on subscription.

      Constructor arguments

      • err: error to emit on subscription
      • scheduler: scheduler-like object

      See also: faulted

      source
      diff --git a/v1.8.0/observables/types/file/index.html b/v1.8.0/observables/types/file/index.html new file mode 100644 index 000000000..d28c048e1 --- /dev/null +++ b/v1.8.0/observables/types/file/index.html @@ -0,0 +1,2 @@ + +File · Rocket.jl
      diff --git a/v1.8.0/observables/types/function/index.html b/v1.8.0/observables/types/function/index.html new file mode 100644 index 000000000..26de09023 --- /dev/null +++ b/v1.8.0/observables/types/function/index.html @@ -0,0 +1,33 @@ + +Function · Rocket.jl

      Function Observable

      Rocket.makeFunction
      make(f::Function, type::Type{D})

      Creation operator for the FunctionObservable.

      Arguments

      • f: function to be invoked on subscription
      • type: type of data in observable

      Examples

      using Rocket
      +
      +source = make(Int) do actor
      +    next!(actor, 0)
      +    complete!(actor)
      +end
      +
      +subscription = subscribe!(source, logger());
      +unsubscribe!(subscription)
      +;
      +
      +# output
      +
      +[LogActor] Data: 0
      +[LogActor] Completed
      +
      using Rocket
      +
      +source = make(Int) do actor
      +    next!(actor, 0)
      +    setTimeout(100) do
      +        next!(actor, 1)
      +        complete!(actor)
      +    end
      +end
      +
      +subscription = subscribe!(source, logger())
      +unsubscribe!(subscription)
      +;
      +
      +# output
      +
      +[LogActor] Data: 0

      See also: FunctionObservable, subscribe!, logger

      source
      Rocket.FunctionObservableType
      FunctionObservable{D}(f::F)

      FunctionObservable wraps a callback f, which is called when the Observable is initially subscribed to. This function is given an Actor, to which new values can be nexted (with next!(actor, data)), or an error! method can be called to raise an error, or complete! can be called to notify of a successful completion.

      Arguments

      • f::F: function to be invoked on subscription

      See also: Subscribable, make

      source
      diff --git a/v1.8.0/observables/types/generate/index.html b/v1.8.0/observables/types/generate/index.html new file mode 100644 index 000000000..9f93cedac --- /dev/null +++ b/v1.8.0/observables/types/generate/index.html @@ -0,0 +1,11 @@ + +Generate · Rocket.jl

      Generate Observable

      Rocket.generateFunction
      generate(initial::D, condition::C, iterator::I; scheduler::H = AsapScheduler()) where { D, C, I, H <: AbstractScheduler }

      Generates an observable sequence by running a state-driven loop producing the sequence's elements, using the specified scheduler to send out observer messages.

      Arguments

      • initial: initial state
      • condition: condition to terminate generation (upon returning false)
      • iterator: iteration step function
      • scheduler: optional, scheduler-like object

      Note

      iterator object should return objects of the same type as initial.

      Examples

      using Rocket
      +
      +source = generate(1, x -> x < 3, x -> x + 1)
      +subscribe!(source, logger())
      +;
      +
      +# output
      +[LogActor] Data: 1
      +[LogActor] Data: 2
      +[LogActor] Completed

      See also: ScheduledSubscribable, subscribe!

      source
      diff --git a/v1.8.0/observables/types/interval/index.html b/v1.8.0/observables/types/interval/index.html new file mode 100644 index 000000000..4c06e689b --- /dev/null +++ b/v1.8.0/observables/types/interval/index.html @@ -0,0 +1,25 @@ + +Interval · Rocket.jl

      Interval Observable

      Rocket.intervalFunction
      interval(period::Union{Int, Nothing} = nothing)

      Creation operator for the TimerObservable. interval returns an Observable that emits an infinite sequence of ascending integers, with a constant interval of time of your choosing between those emissions. The first emission is not sent immediately, but only after the first period has passed.

      Arguments

      • interval: the interval size in milliseconds

      Examples

      using Rocket
      +
      +source = interval(50)
      +
      +subscription = subscribe!(source, logger())
      +sleep(0.215)
      +unsubscribe!(subscription)
      +sleep(0.215)
      +subscription = subscribe!(source, logger())
      +sleep(0.185)
      +unsubscribe!(subscription)
      +
      +close(source)
      +;
      +
      +# output
      +
      +[LogActor] Data: 0
      +[LogActor] Data: 1
      +[LogActor] Data: 2
      +[LogActor] Data: 3
      +[LogActor] Data: 8
      +[LogActor] Data: 9
      +[LogActor] Data: 10

      See also: timer, TimerObservable, Subscribable

      source
      diff --git a/v1.8.0/observables/types/iterable/index.html b/v1.8.0/observables/types/iterable/index.html new file mode 100644 index 000000000..2541555ee --- /dev/null +++ b/v1.8.0/observables/types/iterable/index.html @@ -0,0 +1,26 @@ + +Iterable · Rocket.jl

      Iterable Observable

      Rocket.iterableFunction
      iterable(iterator; scheduler::H = AsapScheduler()) where { H <: AbstractScheduler }

      Creation operator for the IterableObservable that wraps given iterator into an observable object.

      Arguments

      • iterator: an iterator object to be wrapped an observable
      • scheduler: optional, scheduler-like object

      Note

      iterable operators does not create a copy of iterator. Any changes in the iterator object might be visible in the created observable. For side-effects free behavior consider using from creation operator which creates a copy of a given object with a collect function.

      Examples

      using Rocket
      +
      +source = iterable([ 0, 1, 2 ])
      +subscribe!(source, logger())
      +;
      +
      +# output
      +
      +[LogActor] Data: 0
      +[LogActor] Data: 1
      +[LogActor] Data: 2
      +[LogActor] Completed
      using Rocket
      +
      +source = iterable("Hello")
      +subscribe!(source, logger())
      +;
      +
      +# output
      +
      +[LogActor] Data: H
      +[LogActor] Data: e
      +[LogActor] Data: l
      +[LogActor] Data: l
      +[LogActor] Data: o
      +[LogActor] Completed

      See also: ScheduledSubscribable, subscribe!, from

      source
      diff --git a/v1.8.0/observables/types/labeled/index.html b/v1.8.0/observables/types/labeled/index.html new file mode 100644 index 000000000..48f16fa97 --- /dev/null +++ b/v1.8.0/observables/types/labeled/index.html @@ -0,0 +1,13 @@ + +Labeled · Rocket.jl

      Labeled Observable

      Rocket.labeledFunction
      labeled(names::Val, stream)

      Creation operator for the LabeledObservable that wraps given stream, that produces Tuple values into a NamedTuple with given names.

      Arguments

      • names: a Val object that contains a tuple of symbols
      • stream: an observable that emits a Tuple, length of the Tuple events must be equal to the length of the names argument

      Examples

      using Rocket
      +
      +source = labeled(Val((:x, :y)), from([ (1, 2), (2, 3), (3, 4) ]))
      +subscribe!(source, logger())
      +;
      +
      +# output
      +
      +[LogActor] Data: (x = 1, y = 2)
      +[LogActor] Data: (x = 2, y = 3)
      +[LogActor] Data: (x = 3, y = 4)
      +[LogActor] Completed

      See also: ScheduledSubscribable, subscribe!, from

      source
      diff --git a/v1.8.0/observables/types/merged/index.html b/v1.8.0/observables/types/merged/index.html new file mode 100644 index 000000000..180ec2d85 --- /dev/null +++ b/v1.8.0/observables/types/merged/index.html @@ -0,0 +1,46 @@ + +Merged · Rocket.jl

      Merged Observable

      Rocket.mergedFunction
      merged(sources::T) where { T <: Tuple }

      Creation operator for the MergeObservable with a given sources collected in a tuple. merge subscribes to each given input Observable (as arguments), and simply forwards (without doing any transformation) all the values from all the input Observables to the output Observable. The output Observable only completes once all input Observables have completed. Any error delivered by an input Observable will be immediately emitted on the output Observable.

      Examples

      using Rocket
      +
      +observable = merged((from(1:4), of(2.0), from("Hello")))
      +
      +subscribe!(observable, logger())
      +;
      +
      +# output
      +[LogActor] Data: 1
      +[LogActor] Data: 2
      +[LogActor] Data: 3
      +[LogActor] Data: 4
      +[LogActor] Data: 2.0
      +[LogActor] Data: H
      +[LogActor] Data: e
      +[LogActor] Data: l
      +[LogActor] Data: l
      +[LogActor] Data: o
      +[LogActor] Completed
      using Rocket
      +
      +subject = Subject(Int, scheduler = AsyncScheduler())
      +
      +observable = merged((subject, of(2.0), from("Hello")))
      +
      +actor = sync(logger())
      +
      +subscribe!(observable, actor)
      +
      +setTimeout(200) do
      +    next!(subject, 1)
      +    complete!(subject)
      +end
      +
      +wait(actor)
      +;
      +
      +# output
      +[LogActor] Data: 2.0
      +[LogActor] Data: H
      +[LogActor] Data: e
      +[LogActor] Data: l
      +[LogActor] Data: l
      +[LogActor] Data: o
      +[LogActor] Data: 1
      +[LogActor] Completed

      See also: Subscribable

      source
      diff --git a/v1.8.0/observables/types/network/index.html b/v1.8.0/observables/types/network/index.html new file mode 100644 index 000000000..5e1b98b62 --- /dev/null +++ b/v1.8.0/observables/types/network/index.html @@ -0,0 +1,6 @@ + +Network · Rocket.jl

      Network Observable

      Rocket.networkFunction
      network(::Type{D}, port::Int)             where D
      +network(::Type{D}, address::A, port::Int) where { D, A <: IPAddr }
      +
      +network(::Type{Vector{D}}, port::Int, buffer_size::Int)             where D
      +network(::Type{Vector{D}}, address::A, port::Int, buffer_size::Int) where { D, A <: IPAddr }

      Creation operator for the NetworkObservable that emits messages from the server with specified address and port arguments.

      See also: NetworkObservable, subscribe!

      source
      diff --git a/v1.8.0/observables/types/never/index.html b/v1.8.0/observables/types/never/index.html new file mode 100644 index 000000000..b09234757 --- /dev/null +++ b/v1.8.0/observables/types/never/index.html @@ -0,0 +1,9 @@ + +Never · Rocket.jl

      Never Observable

      Rocket.neverFunction
      never(T = Any)

      Creation operator for the NeverObservable that emits neither values nor errors nor the completion notification. It can be used for testing purposes or for composing with other Observables. Please note that by never emitting a complete notification, this Observable keeps the subscription from being disposed automatically. Subscriptions need to be manually disposed.

      Arguments

      • T: Type of Observable data, optional, Any is the default

      Examples

      using Rocket
      +
      +source = never()
      +subscribe!(source, logger())
      +;
      +
      +# output
      +

      See also: NeverObservable, subscribe!, logger

      source
      diff --git a/v1.8.0/observables/types/proxy/index.html b/v1.8.0/observables/types/proxy/index.html new file mode 100644 index 000000000..99e00423f --- /dev/null +++ b/v1.8.0/observables/types/proxy/index.html @@ -0,0 +1,30 @@ + +Proxy · Rocket.jl

      Proxy Observable

      ProxyObservable might help to create a custom operator. It wraps either source and/or actor with their proxied versions providing additional custom logic for on_subscribe! and/or for on_next!, on_error!, on_complete! methods.

      Rocket.proxyFunction
      proxy(::Type{L}, source, proxy) where L

      Creation operator for the ProxyObservable with a given source and proxy objects.

      Example

      using Rocket
      +
      +source = from(1:5)
      +
      +struct MyCustomProxy <: ActorProxy end
      +
      +struct MyCustomActor{A} <: Actor{Int}
      +    actor :: A
      +end
      +
      +Rocket.on_next!(actor::MyCustomActor, data::Int) = next!(actor.actor, data ^ 2)
      +Rocket.on_error!(actor::MyCustomActor, err)      = error!(actor.actor, err)
      +Rocket.on_complete!(actor::MyCustomActor)        = complete!(actor.actor)
      +
      +Rocket.actor_proxy!(::Type{Int}, proxy::MyCustomProxy, actor::A) where A = MyCustomActor{A}(actor)
      +
      +proxied = proxy(Int, source, MyCustomProxy())
      +
      +subscribe!(proxied, logger())
      +;
      +
      +# output
      +
      +[LogActor] Data: 1
      +[LogActor] Data: 4
      +[LogActor] Data: 9
      +[LogActor] Data: 16
      +[LogActor] Data: 25
      +[LogActor] Completed

      See also: ProxyObservable, ActorProxy, SourceProxy, ActorSourceProxy

      source
      Rocket.ActorProxyType
      ActorProxy

      Can be used as a super type for common proxy object. Automatically specifies ValidActorProxy trait behavior. Each ActorProxy must implement its own method for actor_proxy!(::Type, proxy, actor) function which have to return a valid actor object.

      See also: proxy, actor_proxy!

      source
      Rocket.SourceProxyType
      SourceProxy

      Can be used as a super type for common proxy object. Automatically specifies ValidSourceProxy trait behavior. Each SourceProxy must implement its own method for source_proxy!(::Type, proxy, source) function which have to return a valid subscribable object.

      See also: proxy, source_proxy!

      source
      Rocket.ActorSourceProxyType
      ActorSourceProxy

      Can be used as a super type for common proxy object. Automatically specifies ValidActorSourceProxy trait behavior. Each ActorSourceProxy must implement its own method for source_proxy!(::Type, proxy, source) function which have to return a valid subscribable object and also for actor_proxy!(::Type, proxy, actor) function which have to return a valid actor object..

      See also: proxy, actor_proxy!, source_proxy!

      source
      Rocket.actor_proxy!Function
      actor_proxy!(::Type, proxy, actor)

      This is function is used to wrap an actor with its proxied version given a particular proxy object. Must return another actor. Each valid ActorProxy and ActorSourceProxy must implement its own method for actor_proxy! function. The first argument is the same as the type of data of the connected proxy observable.

      See also: proxy, ActorProxy, ActorSourceProxy

      source
      Rocket.source_proxy!Function
      source_proxy!(::Type, proxy, source)

      This is function is used to wrap a source with its proxied version given a particular proxy object. Must return another Observable. Each valid SourceProxy and ActorSourceProxy must implement its own method for source_proxy! function. The first argument is the same as the type of data of the connected proxy observable.

      See also: proxy, SourceProxy, ActorSourceProxy

      source
      diff --git a/v1.8.0/observables/types/race/index.html b/v1.8.0/observables/types/race/index.html new file mode 100644 index 000000000..0d43a5ee1 --- /dev/null +++ b/v1.8.0/observables/types/race/index.html @@ -0,0 +1,23 @@ + +Race · Rocket.jl

      Race Observable

      Rocket.raceFunction
      race(sources...)
      +race(sources::S) where { S <: Tuple }

      Combines multiple Observables to create an Observable that mirrors the output of the first Observable to emit an item. Essentially it subscribes to the observable that was the first to start emitting.

      Arguments

      • sources: input sources

      Examples

      using Rocket
      +
      +source1 = of(1)
      +source2 = of(2)
      +
      +subscribe!(race(source1, source2), logger())
      +;
      +
      +# output
      +[LogActor] Data: 1
      +[LogActor] Completed
      using Rocket
      +
      +source1 = of(1) |> async()
      +source2 = of(2)
      +
      +subscribe!(race(source1, source2), logger())
      +;
      +
      +# output
      +[LogActor] Data: 2
      +[LogActor] Completed

      See also: Subscribable, subscribe!

      source
      diff --git a/v1.8.0/observables/types/single/index.html b/v1.8.0/observables/types/single/index.html new file mode 100644 index 000000000..f22c91a35 --- /dev/null +++ b/v1.8.0/observables/types/single/index.html @@ -0,0 +1,12 @@ + +Single · Rocket.jl

      Single Observable

      Rocket.ofFunction
      of(x; scheduler::H = AsapScheduler()) where { H <: AbstractScheduler }

      Creation operator for the SingleObservable that emits a single value x and then completes.

      Arguments

      • x: value to be emmited before completion

      Examples

      using Rocket
      +
      +source = of(1)
      +subscribe!(source, logger())
      +;
      +
      +# output
      +
      +[LogActor] Data: 1
      +[LogActor] Completed
      +

      See also: SingleObservable, subscribe!, logger

      source
      Rocket.SingleObservableType
      SingleObservable{D, H}(value::D, scheduler::H)

      SingleObservable wraps single value of type D into a observable.

      Constructor arguments

      • value: a single value to emit
      • scheduler: scheduler-like object

      See also: of, Subscribable

      source
      diff --git a/v1.8.0/observables/types/timer/index.html b/v1.8.0/observables/types/timer/index.html new file mode 100644 index 000000000..f3e268b0f --- /dev/null +++ b/v1.8.0/observables/types/timer/index.html @@ -0,0 +1,18 @@ + +Timer · Rocket.jl

      Timer Observable

      Rocket.timerFunction
      timer(delay::Int)
      +timer(delay::Int, period::Int)

      Creation operator for the TimerObservable. Its like interval(@ref), but you can specify when should the emissions start. timer returns an Observable that emits an infinite sequence of ascending integers, with a constant interval of time, period of your choosing between those emissions. The first emission happens after the specified delay. If period is not specified, the output Observable emits only one value, 0. Otherwise, it emits an infinite sequence. The timer closes automatically when the unsubscription happens.

      Arguments

      • delay: the initial delay time specified as an integer denoting milliseconds to wait before emitting the first value of 0.
      • period: the minimum period of time between emissions of the subsequent numbers (in milliseconds).

      Examples

      using Rocket
      +
      +source = timer(0, 50)
      +
      +sleep(0.075)
      +subscription = subscribe!(source, logger())
      +sleep(0.105)
      +unsubscribe!(subscription)
      +
      +;
      +
      +# output
      +
      +[LogActor] Data: 2
      +[LogActor] Data: 3
      +

      See also: interval, TimerObservable, subscribe!, logger

      source
      Rocket.TimerObservableType
      TimerObservable

      An Observable that starts emitting after an delay and emits ever increasing numbers after each period of time thereafter.

      Parameters

      • delay: The initial delay time specified as an integer denoting milliseconds to wait before emitting the first value of 0`.
      • period: The minimum period of time in milliseconds between emissions of the subsequent numbers.

      See also: timer, Subscribable

      source
      diff --git a/v1.8.0/observables/types/zipped/index.html b/v1.8.0/observables/types/zipped/index.html new file mode 100644 index 000000000..ed2d4f393 --- /dev/null +++ b/v1.8.0/observables/types/zipped/index.html @@ -0,0 +1,33 @@ + +Zipped · Rocket.jl

      Zipped Observable

      Rocket.zippedFunction
      zipped(sources...)

      Combines multiple Observables to create an Observable whose values are calculated from the values, in order, of each of its input Observables.

      Arguments

      • sources: input sources

      Examples

      using Rocket
      +
      +source = zipped(of(1), from(2:5))
      +
      +subscribe!(source, logger())
      +;
      +
      +# output
      +
      +[LogActor] Data: (1, 2)
      +[LogActor] Completed
      using Rocket
      +
      +source = zipped(from(1:3), from(1:5))
      +
      +subscribe!(source, logger())
      +;
      +
      +# output
      +
      +[LogActor] Data: (1, 1)
      +[LogActor] Data: (2, 2)
      +[LogActor] Data: (3, 3)
      +[LogActor] Completed
      using Rocket
      +
      +source = zipped(completed(), of(0.0))
      +
      +subscribe!(source, logger())
      +;
      +
      +# output
      +
      +[LogActor] Completed

      See also: Subscribable, subscribe!

      source
      diff --git a/v1.8.0/operators/about/index.html b/v1.8.0/operators/about/index.html new file mode 100644 index 000000000..8fbd2dd1c --- /dev/null +++ b/v1.8.0/operators/about/index.html @@ -0,0 +1,58 @@ + +Operator · Rocket.jl

      Operators

      Even though the Observable is the foundation, reactive extensions are mostly useful because of their operators. Operators are the essential pieces that allow complex asynchronous code to be easily composed in a declarative manner.

      What are operators?

      There are two kinds of operators:

      Pipeable operators

      Pipeable Operators are the kind that can be piped to Observables using the syntax source |> operator(). These include the filter() and map() operators. When called, operators do not change the existing Observable instance. Instead, they return a new Observable, whose subscription logic is based on the first Observable.

      Note

      A Pipeable Operator is a function that takes an Observable as its input and returns another Observable. It is a pure operation: the previous Observable remains unmodified.

      A Pipeable Operator is essentially a pure callable object that accepts one Observable as input and returns another Observable as output. Subscribing to the output Observable will also subscribe to the input Observable.

      For example, the operator called map() is analogous to the Array method of the same name. Just like the array method map((d) -> d ^ 2, [ 1, 2, 3 ]) yields [ 1, 4, 9 ], the Observable emits 1, 4, 9:

      source = from([ 1, 2, 3 ])
      +subscribe!(source |> map(Int, (d) -> d ^ 2), lambda(
      +    on_next = (d) -> println(d)
      +))
      +
      +// Logs:
      +// 1
      +// 4
      +// 9

      Another useful operator is first():

      source = from([ 1, 2, 3 ])
      +subscribe!(source |> first(), lambda(
      +    on_next     = (d) -> println(d),
      +    on_complete = ()  -> "Completed"
      +))
      +
      +// Logs:
      +// 1
      +// Completed

      Creation operators

      Distinct from pipeable operators, creation operators are functions that can be used to create an Observable with some common predefined behavior or by joining other Observables. For example: from([ 1, 2, 3 ]) creates an observable that will sequentially emit 1, 2, and 3.

      source = from([ 1, 2, 3 ])
      +subscribe!(source, lambda(
      +    on_next     = (d) -> println("Value: $d"),
      +    on_error    = (e) -> println("Oh no, error: $e")
      +    on_complete = ()  -> println("Completed")
      +))
      +
      +// Logs:
      +// Value: 1
      +// Value: 2
      +// Value: 3
      +// Completed

      Operators piping

      Pipeable operators are special objects that can be used like ordinary functions with on_call!(operator, source). In practice however they tend to accumulate and quickly grow unreadable: on_call!(operator1, on_call!(operator2, on_call!(operator3, source))). Therefore, Rocket.jl overloads |> for operators and Observables:

      using Rocket
      +
      +source = from(1:100) |> filter((d) -> d % 2 === 0) |> map(Int, (d) -> d ^ 2) |> sum()
      +
      +subscribe!(source, logger())
      +
      +// Logs
      +// [LogActor] Data: 171700
      +// [LogActor] Completed

      It is also possible to create an operator composition with + or |>. It might be useful to create an alias for some often used operator chain

      using Rocket
      +
      +mapAndFilter = map(Int, d -> d ^ 2) + filter(d -> d % 2 == 0) 
      +
      +source = from(1:5) |> mapAndFilter
      +
      +subscribe!(source, logger())
      +
      +// Logs
      +// [LogActor] Data: 4
      +// [LogActor] Data: 16
      +// [LogActor] Completed
      +
      +mapAndFilterAndSum = mapAndFilter + sum()
      +
      +source = from(1:5) |> mapAndFilterAndSum
      +
      +subscribe!(source, logger())
      +
      +// Logs
      +// [LogActor] Data: 20
      +// [LogActor] Completed

      For stylistic reasons, on_call!(operator, source) is never used in practice - even if there is only one operator. Instead, source |> operator() is generally preferred.

      diff --git a/v1.8.0/operators/all/index.html b/v1.8.0/operators/all/index.html new file mode 100644 index 000000000..4fefeb6b7 --- /dev/null +++ b/v1.8.0/operators/all/index.html @@ -0,0 +1,2 @@ + +All · Rocket.jl
      diff --git a/v1.8.0/operators/creation/about/index.html b/v1.8.0/operators/creation/about/index.html new file mode 100644 index 000000000..ee8f38629 --- /dev/null +++ b/v1.8.0/operators/creation/about/index.html @@ -0,0 +1,2 @@ + +Creation · Rocket.jl
      diff --git a/v1.8.0/operators/errors/about/index.html b/v1.8.0/operators/errors/about/index.html new file mode 100644 index 000000000..f4f6a542c --- /dev/null +++ b/v1.8.0/operators/errors/about/index.html @@ -0,0 +1,2 @@ + +About error handling operators · Rocket.jl
      diff --git a/v1.8.0/operators/errors/catch_error/index.html b/v1.8.0/operators/errors/catch_error/index.html new file mode 100644 index 000000000..2d4009a80 --- /dev/null +++ b/v1.8.0/operators/errors/catch_error/index.html @@ -0,0 +1,14 @@ + +catch_error · Rocket.jl

      Catch Error Operator

      Rocket.catch_errorFunction
      catch_error(selectorFn::F) where F

      Creates a CatchErrorOperator, which catches errors on the observable to be handled by returning a new observable or throwing an error.

      Arguments:

      • selectorFn::F: a callable object that takes as arguments err, which is the error, and caught, which is the source observable, in case you'd like to "retry" that observable by returning it again. Whatever observable is returned by the selector will be used to continue the observable chain.

      Producing

      Stream of type <: Subscribable{L} where L refers to type of source stream

      Examples

      using Rocket
      +
      +source = from(1:5) |> safe() |> map(Int, (d) -> d == 4 ? error(4) : d) |> catch_error((err, obs) -> of(1))
      +
      +subscribe!(source, logger())
      +;
      +
      +# output
      +[LogActor] Data: 1
      +[LogActor] Data: 2
      +[LogActor] Data: 3
      +[LogActor] Data: 1
      +[LogActor] Completed

      See also: AbstractOperator, InferableOperator, rerun, logger, safe

      source

      See also

      Operators

      diff --git a/v1.8.0/operators/errors/error_if/index.html b/v1.8.0/operators/errors/error_if/index.html new file mode 100644 index 000000000..05b0d67d3 --- /dev/null +++ b/v1.8.0/operators/errors/error_if/index.html @@ -0,0 +1,16 @@ + +error_if · Rocket.jl

      Error If Operator

      Rocket.error_ifFunction
      error_if(checkFn, errorFn)

      Creates an error_if operator, which performs a check for every emission on the source Observable with checkFn. If checkFn returns true, the operator sends an error event and unsubscribes from the observable.

      Arguments

      • checkFn: check function with (data) -> Bool signature
      • errorFn: error object generating function with (data) -> Any signature, optional

      Producing

      Stream of type <: Subscribable{L} where L refers to type of source stream

      Examples

      using Rocket
      +
      +source = from([1, 2, 3]) |> error_if((data) -> data > 2, (data) -> "CustomError")
      +
      +subscription = subscribe!(source, lambda(
      +    on_next  = (d) -> println("Next: ", d),
      +    on_error = (e) -> println("Error: ", e),
      +    on_complete = () -> println("Completed")
      +))
      +;
      +
      +# output
      +Next: 1
      +Next: 2
      +Error: CustomError

      See also: error_if_not, error_if_empty, default_if_empty, lambda

      source

      See also

      Operators

      diff --git a/v1.8.0/operators/errors/error_if_not/index.html b/v1.8.0/operators/errors/error_if_not/index.html new file mode 100644 index 000000000..4ac37cfae --- /dev/null +++ b/v1.8.0/operators/errors/error_if_not/index.html @@ -0,0 +1,15 @@ + +error_if_not · Rocket.jl

      Error If Not Operator

      Note: error_if_not is an alias for error_if operator with inverted checkFn.

      Rocket.error_if_notFunction
      error_if_not(checkFn, errorFn)

      Creates an error_if_not operator, which performs a check for every emission on the source Observable with checkFn. If checkFn returns false, the operator sends an error event and unsubscribes from the observable.

      Note: error_if_not is an alias for error_if operator with inverted checkFn.

      Arguments

      • checkFn: check function with (data) -> Bool signature
      • errorFn: error object generating function with (data) -> Any signature, optional

      Producing

      Stream of type <: Subscribable{L} where L refers to type of source stream

      Examples

      using Rocket
      +
      +source = from([1, 2, 3]) |> error_if_not((data) -> data < 2, (data) -> "CustomError")
      +
      +subscription = subscribe!(source, lambda(
      +    on_next  = (d) -> println("Next: ", d),
      +    on_error = (e) -> println("Error: ", e),
      +    on_complete = () -> println("Completed")
      +))
      +;
      +
      +# output
      +Next: 1
      +Error: CustomError

      See also: error_if, error_if_empty, default_if_empty, logger

      source

      See also

      Operators

      diff --git a/v1.8.0/operators/errors/rerun/index.html b/v1.8.0/operators/errors/rerun/index.html new file mode 100644 index 000000000..253bc6480 --- /dev/null +++ b/v1.8.0/operators/errors/rerun/index.html @@ -0,0 +1,14 @@ + +rerun · Rocket.jl

      Rerun Operator

      Rocket.rerunFunction
      rerun(count::Int = -1)

      Returns an Observable that mirrors the source Observable with the exception of an error. If the source Observable calls error, this method will resubscribe to the source Observable for a maximum of count resubscriptions (given as a number parameter) rather than propagating the error call.

      Arguments:

      • count::Int: Number of retry attempts before failing. Optional. Default is -1.

      Producing

      Stream of type <: Subscribable{L} where L refers to type of source stream

      Examples

      using Rocket
      +
      +source = from(1:3) |> safe() |> map(Int, (d) -> d > 1 ? error("Error") : d) |> rerun(3)
      +
      +subscribe!(source, logger())
      +;
      +
      +# output
      +[LogActor] Data: 1
      +[LogActor] Data: 1
      +[LogActor] Data: 1
      +[LogActor] Data: 1
      +[LogActor] Error: ErrorException("Error")

      See also: AbstractOperator, InferableOperator, catch_error, logger, safe

      source

      Description

      Any and all items emitted by the source Observable will be emitted by the resulting Observable, even those emitted during failed subscriptions. For example, if an Observable fails at first but emits [1, 2] then succeeds the second time and emits: [1, 2, 3, 4, 5] then the complete stream of emissions and notifications would be: [1, 2, 1, 2, 3, 4, 5, complete].

      See also

      Operators

      diff --git a/v1.8.0/operators/filtering/about/index.html b/v1.8.0/operators/filtering/about/index.html new file mode 100644 index 000000000..007d98dbc --- /dev/null +++ b/v1.8.0/operators/filtering/about/index.html @@ -0,0 +1,2 @@ + +About filtering operators · Rocket.jl
      diff --git a/v1.8.0/operators/filtering/filter/index.html b/v1.8.0/operators/filtering/filter/index.html new file mode 100644 index 000000000..08fb2c95e --- /dev/null +++ b/v1.8.0/operators/filtering/filter/index.html @@ -0,0 +1,13 @@ + +filter · Rocket.jl

      Filter Operator

      Base.filterFunction
      filter(filterFn::F) where { F <: Function }

      Creates a filter operator, which filters items of the source Observable by emitting only those that satisfy a specified filterFn predicate.

      Producing

      Stream of type <: Subscribable{L} where L refers to type of source stream

      Arguments

      • filterFn::F: predicate function with (data::T) -> Bool signature

      Examples

      using Rocket
      +
      +source = from([ 1, 2, 3, 4, 5, 6 ])
      +subscribe!(source |> filter((d) -> d % 2 == 0), logger())
      +;
      +
      +# output
      +
      +[LogActor] Data: 2
      +[LogActor] Data: 4
      +[LogActor] Data: 6
      +[LogActor] Completed

      See also: AbstractOperator, InferableOperator, ProxyObservable, logger

      source

      Description

      Like filter(f, array), this operator takes values from the source Observable, passes them through a predicate function and only emits those values that yielded true.

      See also

      Operators

      diff --git a/v1.8.0/operators/filtering/filter_type/index.html b/v1.8.0/operators/filtering/filter_type/index.html new file mode 100644 index 000000000..72102cd1c --- /dev/null +++ b/v1.8.0/operators/filtering/filter_type/index.html @@ -0,0 +1,13 @@ + +filter_type · Rocket.jl

      FilterType Operator

      Rocket.filter_typeFunction
      filter_type(type::Type{ T }) where { T }

      Creates a filter_type operator, which filters items of the source Observable by emitting only those that match a specified T type with a <: operator. This operator is a more efficient version of filter(v -> v <: T) |> map(T, v -> v) operators chain.

      Producing

      Stream of type <: Subscribable{ T } where T refers to type argument

      Examples

      using Rocket
      +
      +source = from(Real[ 1, 2.0, 3, 4.0, 5, 6.0 ])
      +subscribe!(source |> filter_type(Int), logger())
      +;
      +
      +# output
      +
      +[LogActor] Data: 1
      +[LogActor] Data: 3
      +[LogActor] Data: 5
      +[LogActor] Completed

      See also: AbstractOperator, InferableOperator, ProxyObservable, logger

      source

      See also

      Operators

      diff --git a/v1.8.0/operators/filtering/find/index.html b/v1.8.0/operators/filtering/find/index.html new file mode 100644 index 000000000..94396bbee --- /dev/null +++ b/v1.8.0/operators/filtering/find/index.html @@ -0,0 +1,11 @@ + +find · Rocket.jl

      Find operator

      Rocket.findFunction
      find(conditionFn::F) where { F <: Function }

      Creates a find operator, which emits only the first value emitted by the source Observable that meets some condition.

      Producing

      Stream of type <: Subscribable{L} where L refers to type of source stream

      Arguments

      • conditionFn::F: condition function with (data::T) -> Bool signature

      Examples

      using Rocket
      +
      +source = from([ 1, 2, 3, 4, 5, 6, 7, 8 ])
      +subscribe!(source |> find((d) -> d % 2 == 0), logger())
      +;
      +
      +# output
      +
      +[LogActor] Data: 2
      +[LogActor] Completed

      See also: AbstractOperator, InferableOperator, ProxyObservable, logger

      source

      Description

      find searches for the first item in the source Observable that matches the specified condition embodied by the predicate, and returns the first occurrence in the source. Does not emit an error if a valid value is not found.

      See also

      Operators, take

      diff --git a/v1.8.0/operators/filtering/find_index/index.html b/v1.8.0/operators/filtering/find_index/index.html new file mode 100644 index 000000000..ce4e179ca --- /dev/null +++ b/v1.8.0/operators/filtering/find_index/index.html @@ -0,0 +1,11 @@ + +find_index · Rocket.jl

      Find Index operator

      Rocket.find_indexFunction
      find_index(conditionFn::F) where { F <: Function }

      Creates a find operator, which emits only the index of the first value emitted by the source Observable that meets some condition. Indices are 1-based.

      Producing

      Stream of type <: Subscribable{L} where L refers to type of source stream

      Arguments

      • conditionFn::F: condition function with (data::T) -> Bool signature

      Examples

      using Rocket
      +
      +source = from([ 0, 1, 2, 3, 4, 5, 6, 7, 8 ])
      +subscribe!(source |> find_index((d) -> d !== 0 && d % 2 == 0), logger())
      +;
      +
      +# output
      +
      +[LogActor] Data: 3
      +[LogActor] Completed

      See also: find, AbstractOperator, InferableOperator, ProxyObservable, logger

      source

      Description

      It's like find, but emits the index of the found value, not the value itself.

      See also

      Operators, take

      diff --git a/v1.8.0/operators/filtering/first/index.html b/v1.8.0/operators/filtering/first/index.html new file mode 100644 index 000000000..295d25057 --- /dev/null +++ b/v1.8.0/operators/filtering/first/index.html @@ -0,0 +1,11 @@ + +first · Rocket.jl

      First operator

      Base.firstFunction
      first(; default = nothing)

      Creates a first operator, which returns an Observable that emits only the first value emitted by the source Observable. Sends FirstNotFoundException error message if a given source completes without emitting a single value.

      Arguments

      • default: an optional default value to provide if no values were emitted

      Producing

      Stream of type <: Subscribable{L} where L refers to type of source stream

      Examples

      using Rocket
      +
      +source       = from(1:100)
      +subscription = subscribe!(source |> first(), logger())
      +;
      +
      +# output
      +
      +[LogActor] Data: 1
      +[LogActor] Completed

      See also: take, logger

      source

      Description

      An alias for take(1) operator.

      See also

      Operators, take

      diff --git a/v1.8.0/operators/filtering/ignore/index.html b/v1.8.0/operators/filtering/ignore/index.html new file mode 100644 index 000000000..b7a7c10e2 --- /dev/null +++ b/v1.8.0/operators/filtering/ignore/index.html @@ -0,0 +1,14 @@ + +ignore · Rocket.jl

      Ignore operator

      Rocket.ignoreFunction
      ignore(count::Int)

      Creates a ignore operator, which returns an Observable that skips the first count items emitted by the source Observable.

      Arguments

      • count::Int: the number of times, items emitted by source Observable should be skipped.

      Producing

      Stream of type <: Subscribable{L} where L refers to type of source stream

      Examples

      using Rocket
      +
      +source = from(1:5)
      +
      +subscribe!(source |> ignore(2), logger())
      +;
      +
      +# output
      +
      +[LogActor] Data: 3
      +[LogActor] Data: 4
      +[LogActor] Data: 5
      +[LogActor] Completed

      See also: AbstractOperator, InferableOperator, ProxyObservable, logger

      source

      See also

      Operators

      diff --git a/v1.8.0/operators/filtering/last/index.html b/v1.8.0/operators/filtering/last/index.html new file mode 100644 index 000000000..02127e12c --- /dev/null +++ b/v1.8.0/operators/filtering/last/index.html @@ -0,0 +1,30 @@ + +last · Rocket.jl

      Last Operator

      Base.lastFunction
      last(; default = nothing)

      Creates a last operator, which returns an Observable that emits only the last item emitted by the source Observable. Sends LastNotFoundException error message if a given source completes without emitting a single value.

      Arguments

      • default: an optional default value to provide if no values were emitted

      Producing

      Stream of type <: Subscribable{L} where L refers to type of source stream

      Examples

      using Rocket
      +
      +source = from([ 1, 2, 3 ])
      +subscribe!(source |> last(), logger())
      +;
      +
      +# output
      +
      +[LogActor] Data: 3
      +[LogActor] Completed
      +
      using Rocket
      +
      +source = from(Int[])
      +subscribe!(source |> last() |> catch_error((err, obs) -> of(1)), logger())
      +;
      +
      +# output
      +
      +[LogActor] Data: 1
      +[LogActor] Completed
      using Rocket
      +
      +source = from(Int[])
      +subscribe!(source |> last(default = 1), logger())
      +;
      +
      +# output
      +
      +[LogActor] Data: 1
      +[LogActor] Completed

      See also: AbstractOperator, InferableOperator, ProxyObservable, logger

      source

      Description

      last operator returns an Observable that emits only the last item emitted by the source Observable.

      See also

      Operators

      diff --git a/v1.8.0/operators/filtering/some/index.html b/v1.8.0/operators/filtering/some/index.html new file mode 100644 index 000000000..154864019 --- /dev/null +++ b/v1.8.0/operators/filtering/some/index.html @@ -0,0 +1,13 @@ + +some · Rocket.jl

      Some Operator

      Rocket.someFunction
      some()

      Creates a some operator, which filters out nothing items by the source Observable by emitting only those that not equal to nothing.

      Producing

      Stream of type <: Subscribable{L} where L refers to type of source stream <: Subscribable{Union{L, Nothing}}

      Examples

      using Rocket
      +
      +source = from([ 1, nothing, 3 ])
      +subscribe!(source |> some(), logger())
      +;
      +
      +# output
      +
      +[LogActor] Data: 1
      +[LogActor] Data: 3
      +[LogActor] Completed
      +

      See also: AbstractOperator, InferableOperator, ProxyObservable, max, min, logger

      source

      Description

      This operator takes values from the source Observable and only emits those values that are not nothing.

      See also

      Operators, filter

      diff --git a/v1.8.0/operators/filtering/take/index.html b/v1.8.0/operators/filtering/take/index.html new file mode 100644 index 000000000..7a63e0c96 --- /dev/null +++ b/v1.8.0/operators/filtering/take/index.html @@ -0,0 +1,16 @@ + +take · Rocket.jl

      Take Operator

      Rocket.takeFunction
      take(maxcount::Int)

      Creates a take operator, which returns an Observable that emits only the first maxcount values emitted by the source Observable.

      Arguments

      • maxcount::Int: the maximum number of next values to emit.

      Producing

      Stream of type <: Subscribable{L} where L refers to type of source stream

      Examples

      using Rocket
      +
      +source = from([ i for i in 1:100 ])
      +
      +subscribe!(source |> take(5), logger())
      +;
      +
      +# output
      +
      +[LogActor] Data: 1
      +[LogActor] Data: 2
      +[LogActor] Data: 3
      +[LogActor] Data: 4
      +[LogActor] Data: 5
      +[LogActor] Completed

      See also: AbstractOperator, InferableOperator, ProxyObservable, logger

      source

      Description

      take returns an Observable that emits only the first count values emitted by the source Observable. If the source emits fewer than count values, then all of its values are emitted. Afterwards, the Observable completes regardless of whether the source completed.

      See also

      Operators

      diff --git a/v1.8.0/operators/filtering/take_until/index.html b/v1.8.0/operators/filtering/take_until/index.html new file mode 100644 index 000000000..918e2aea0 --- /dev/null +++ b/v1.8.0/operators/filtering/take_until/index.html @@ -0,0 +1,32 @@ + +take_until · Rocket.jl

      TakeUntil Operator

      Rocket.take_untilFunction
      take_until(notifier::S)

      Creates a take operator, which returns an Observable that emits the values emitted by the source Observable until a notifier Observable emits a value or a completion event.

      Arguments

      • notifier::S: The Observable whose first emitted value will cause the output Observable of take_until to stop emitting values from the source Observable.

      Producing

      Stream of type <: Subscribable{L} where L refers to type of source stream

      Examples

      using Rocket
      +
      +source = interval(100) |> take_until(timer(1000))
      +
      +subscribe!(source, logger())
      +;
      +
      +# output
      +
      +[LogActor] Data: 0
      +[LogActor] Data: 1
      +[LogActor] Data: 2
      +[LogActor] Data: 3
      +[LogActor] Data: 4
      +[LogActor] Data: 5
      +[LogActor] Data: 6
      +[LogActor] Data: 7
      +[LogActor] Data: 8
      +[LogActor] Completed
      using Rocket 
      +
      +source = interval(100)
      +
      +subscribe!(source |> take_until(source |> filter(i -> i == 3)), logger())
      +;
      +
      +# output 
      +
      +[LogActor] Data: 0
      +[LogActor] Data: 1
      +[LogActor] Data: 2
      +[LogActor] Completed

      See also: AbstractOperator, InferableOperator, ProxyObservable, logger

      source

      Description

      take_until subscribes and begins mirroring the source Observable. It also monitors a second Observable, notifier that you provide. If the notifier emits a value, the output Observable stops mirroring the source Observable and completes. If the notifier doesn't emit any value and completes then take_until also completes.

      See also

      Operators

      diff --git a/v1.8.0/operators/join/about/index.html b/v1.8.0/operators/join/about/index.html new file mode 100644 index 000000000..6c0e6e9bd --- /dev/null +++ b/v1.8.0/operators/join/about/index.html @@ -0,0 +1,2 @@ + +Join category · Rocket.jl

      Join category

      There are operators for different purposes, and they may be categorized as: creation, transformation, filtering, joining, multicasting, error handling, utility, etc. In the following list you will find all the operators organized in join category.

      See also

      Operators

      diff --git a/v1.8.0/operators/join/with_latest/index.html b/v1.8.0/operators/join/with_latest/index.html new file mode 100644 index 000000000..fa0e22c24 --- /dev/null +++ b/v1.8.0/operators/join/with_latest/index.html @@ -0,0 +1,11 @@ + +with_latest · Rocket.jl

      WithLatest Operator

      Rocket.with_latestFunction
      with_latest(sources...)

      Creates a with_latest operator, which combines the source Observable with other Observables to create an Observable whose values are calculated from the latest values of each, only when the source emits.

      Examples

      using Rocket
      +
      +source = of(1)
      +subscribe!(source |> with_latest(from(1:5)), logger())
      +;
      +
      +# output
      +
      +[LogActor] Data: (1, 5)
      +[LogActor] Completed

      See also: AbstractOperator, InferableOperator

      source

      See also

      Operators

      diff --git a/v1.8.0/operators/mathematical/about/index.html b/v1.8.0/operators/mathematical/about/index.html new file mode 100644 index 000000000..c2aa6b99b --- /dev/null +++ b/v1.8.0/operators/mathematical/about/index.html @@ -0,0 +1,2 @@ + +About mathematical operators · Rocket.jl
      diff --git a/v1.8.0/operators/mathematical/count/index.html b/v1.8.0/operators/mathematical/count/index.html new file mode 100644 index 000000000..fa922a653 --- /dev/null +++ b/v1.8.0/operators/mathematical/count/index.html @@ -0,0 +1,20 @@ + +count · Rocket.jl

      Count Operator

      Base.countFunction
      count()

      Creates a count operator, which counts the number of emissions on the source and emits that number when the source completes.

      Producing

      Stream of type <: Subscribable{Int}

      Examples

      using Rocket
      +
      +source = from([ i for i in 1:42 ])
      +subscribe!(source |> count(), logger())
      +;
      +
      +# output
      +
      +[LogActor] Data: 42
      +[LogActor] Completed
      +

      See also: AbstractOperator, RightTypedOperator, ProxyObservable, logger

      source

      Description

      count transforms an Observable that emits values into an Observable that emits a single value that represents the number of values emitted by the source Observable. If the source Observable terminates with an error, count will pass this error notification along without emitting a value first. If the source Observable does not terminate at all, count will neither emit a value nor terminate.

      Example

      Counts how many values source Observable have emitted before the complete event happened

      using Rocket
      +
      +source = from([ i for i in 1:42 ])
      +subscribe!(source |> count(), logger())
      +
      +# output
      +
      +[LogActor] Data: 42
      +[LogActor] Completed

      See also

      Operators

      diff --git a/v1.8.0/operators/mathematical/max/index.html b/v1.8.0/operators/mathematical/max/index.html new file mode 100644 index 000000000..121cb58e2 --- /dev/null +++ b/v1.8.0/operators/mathematical/max/index.html @@ -0,0 +1,12 @@ + +max · Rocket.jl

      Max Operator

      Base.maxFunction
      max(; from = nothing)

      Creates a max operator, which emits a single item: the item with the largest value.

      Arguments

      • from: optional initial maximum value, if nothing first item from the source will be used as initial instead

      Producing

      Stream of type <: Subscribable{Union{L, Nothing}} where L refers to type of source stream

      Examples

      using Rocket
      +
      +source = from([ i for i in 1:42 ])
      +subscribe!(source |> max(), logger())
      +;
      +
      +# output
      +
      +[LogActor] Data: 42
      +[LogActor] Completed
      +

      See also: AbstractOperator, InferableOperator, ProxyObservable, logger

      source

      Description

      The max operator operates on an Observable of similar objects. When the source Observable completes, it emits the item with the largest value.

      See also

      Operators

      diff --git a/v1.8.0/operators/mathematical/min/index.html b/v1.8.0/operators/mathematical/min/index.html new file mode 100644 index 000000000..3671f7463 --- /dev/null +++ b/v1.8.0/operators/mathematical/min/index.html @@ -0,0 +1,12 @@ + +min · Rocket.jl

      Min Operator

      Base.minFunction
      min(; from = nothing)

      Creates a min operator, which emits a single item: the item with the smallest value.

      Arguments

      • from: optional initial minimal value, if nothing first item from the source will be used as initial instead

      Producing

      Stream of type <: Subscribable{Union{L, Nothing}} where L refers to type of source stream

      Examples

      using Rocket
      +
      +source = from([ i for i in 1:42 ])
      +subscribe!(source |> min(), logger())
      +;
      +
      +# output
      +
      +[LogActor] Data: 1
      +[LogActor] Completed
      +

      See also: AbstractOperator, InferableOperator, ProxyObservable, logger

      source

      Description

      The min operator operates on an Observable of similar objects. When source Observable completes, it emits the item with the smallest value.

      See also

      Operators

      diff --git a/v1.8.0/operators/mathematical/reduce/index.html b/v1.8.0/operators/mathematical/reduce/index.html new file mode 100644 index 000000000..1d928668b --- /dev/null +++ b/v1.8.0/operators/mathematical/reduce/index.html @@ -0,0 +1,23 @@ + +reduce · Rocket.jl

      Reduce Operator

      Base.reduceFunction
      reduce(::Type{R}, reduceFn::Function, seed::R) where R
      +reduce(reduceFn::F) where { F <: Function }

      Creates a reduce operator, which applies a given accumulator reduceFn function over the source Observable, and returns the accumulated result when the source completes, given an optional seed value. If a seed value is specified, then that value will be used as the initial value for the accumulator. If no seed value is specified, the first item of the source is used as the seed.

      Arguments

      • ::Type{R}: the type of data of transformed value
      • reduceFn::Function: transformation function with (data::T, current::R) -> R signature
      • seed::R: optional seed accumulation value

      Producing

      Stream of type <: Subscribable{R}

      Examples

      using Rocket
      +
      +source = from([ i for i in 1:10 ])
      +subscribe!(source |> reduce(Vector{Int}, (d, c) -> [ c..., d ], Int[]), logger())
      +;
      +
      +# output
      +
      +[LogActor] Data: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
      +[LogActor] Completed
      +
      using Rocket
      +
      +source = from([ i for i in 1:42 ])
      +subscribe!(source |> reduce(+), logger())
      +;
      +
      +# output
      +
      +[LogActor] Data: 903
      +[LogActor] Completed
      +

      See also: AbstractOperator, RightTypedOperator, ProxyObservable, logger

      source

      Description

      reduce applies an accumulator function to each value of the source Observable (from the past) and reduces it to a single value that is emitted by the output Observable. Note that reduce will only emit one value, only when the source Observable completes. It is equivalent to applying scan followed by last.

      It returns an Observable that applies a specified accumulator function to each item emitted by the source Observable. If a seed value is specified, then that value will be used as the initial value of the accumulator. If no seed value is specified, the first item of the source is used as the seed.

      See also

      Operators, scan, last

      diff --git a/v1.8.0/operators/mathematical/sum/index.html b/v1.8.0/operators/mathematical/sum/index.html new file mode 100644 index 000000000..4c888e439 --- /dev/null +++ b/v1.8.0/operators/mathematical/sum/index.html @@ -0,0 +1,22 @@ + +sum · Rocket.jl

      Sum Operator

      Base.sumFunction
      sum(; from = nothing)

      Creates a sum operator, which applies a sum accumulator function over the source Observable, and returns the accumulated result when the source completes, given an optional initial value.

      The sum operator is similar to reduce(T, T, +) (see reduce).

      Arguments

      • from: optional initial accumulation value, if nothing first value will be used instead

      Producing

      Stream of type <: Subscribable{L} where L refers to type of source stream

      Examples

      using Rocket
      +
      +source = from([ i for i in 1:42 ])
      +subscribe!(source |> sum(), logger())
      +;
      +
      +# output
      +
      +[LogActor] Data: 903
      +[LogActor] Completed
      +
      using Rocket
      +
      +source = from([ i for i in 1:42 ])
      +subscribe!(source |> sum(from = 97), logger())
      +;
      +
      +# output
      +
      +[LogActor] Data: 1000
      +[LogActor] Completed
      +

      See also: AbstractOperator, InferableOperator, ProxyObservable, reduce, logger

      source

      Description

      sum operates on an Observable of objects on which + is defined. When the source Observable completes, it emits the sum of all previous items. The sum operator is similar to reduce(T, T, +) (see reduce).

      See also

      Operators, reduce

      diff --git a/v1.8.0/operators/multicasting/about/index.html b/v1.8.0/operators/multicasting/about/index.html new file mode 100644 index 000000000..2619a7a11 --- /dev/null +++ b/v1.8.0/operators/multicasting/about/index.html @@ -0,0 +1,2 @@ + +About multicasting operators · Rocket.jl
      diff --git a/v1.8.0/operators/multicasting/multicast/index.html b/v1.8.0/operators/multicasting/multicast/index.html new file mode 100644 index 000000000..244d12cb9 --- /dev/null +++ b/v1.8.0/operators/multicasting/multicast/index.html @@ -0,0 +1,33 @@ + +multicast · Rocket.jl

      Multicast Operator

      Rocket.multicastFunction
      multicast(subject::S) where S
      +multicast(factory::F) where { F <: AbstractSubjectFactory }

      The multicast()operator takes a Subject and uses it to share the source execution. It returns what’s known as aConnectableObservable`, which has a connect() method. It has one simple job - subscribes to the source with the provided subject.

      Example

      using Rocket
      +
      +subject = Subject(Int)
      +source  = from(1:5) |> multicast(subject)
      +
      +actor1 = logger("1")
      +actor2 = logger("2")
      +
      +subscription1 = subscribe!(source, actor1)
      +subscription2 = subscribe!(source, actor2)
      +
      +connect(source)
      +
      +unsubscribe!(subscription1)
      +unsubscribe!(subscription2)
      +;
      +
      +# output
      +
      +[1] Data: 1
      +[2] Data: 1
      +[1] Data: 2
      +[2] Data: 2
      +[1] Data: 3
      +[2] Data: 3
      +[1] Data: 4
      +[2] Data: 4
      +[1] Data: 5
      +[2] Data: 5
      +[1] Completed
      +[2] Completed

      See also: ConnectableObservable, Subject, share, publish

      source

      See also

      Operators

      diff --git a/v1.8.0/operators/multicasting/publish/index.html b/v1.8.0/operators/multicasting/publish/index.html new file mode 100644 index 000000000..cc2be8cf0 --- /dev/null +++ b/v1.8.0/operators/multicasting/publish/index.html @@ -0,0 +1,2 @@ + +publish · Rocket.jl

      Publish Operators

      See also

      Operators

      diff --git a/v1.8.0/operators/multicasting/share/index.html b/v1.8.0/operators/multicasting/share/index.html new file mode 100644 index 000000000..bf51a34b9 --- /dev/null +++ b/v1.8.0/operators/multicasting/share/index.html @@ -0,0 +1,2 @@ + +share · Rocket.jl

      Share Operators

      See also

      Operators

      diff --git a/v1.8.0/operators/transformation/about/index.html b/v1.8.0/operators/transformation/about/index.html new file mode 100644 index 000000000..b25cf70c6 --- /dev/null +++ b/v1.8.0/operators/transformation/about/index.html @@ -0,0 +1,2 @@ + +About transformation operators · Rocket.jl
      diff --git a/v1.8.0/operators/transformation/accumulated/index.html b/v1.8.0/operators/transformation/accumulated/index.html new file mode 100644 index 000000000..dd4fc90d7 --- /dev/null +++ b/v1.8.0/operators/transformation/accumulated/index.html @@ -0,0 +1,23 @@ + +accumulated · Rocket.jl

      Accumulated Operator

      Rocket.accumulatedFunction
      accumulated()

      Creates an accumulated operator, which returns an Observable that emits the current item with all of the previous items emitted by the source Observable in one single ordered array.

      Producing

      Stream of type <: Subscribable{Vector{L}} where L refers to type of source stream

      Examples

      using Rocket
      +
      +source = from([ 1, 2, 3 ])
      +subscribe!(source |> accumulated(), logger())
      +;
      +
      +# output
      +
      +[LogActor] Data: [1]
      +[LogActor] Data: [1, 2]
      +[LogActor] Data: [1, 2, 3]
      +[LogActor] Completed
      +
      using Rocket
      +
      +source = of(1)
      +subscribe!(source |> accumulated(), logger())
      +;
      +
      +# output
      +
      +[LogActor] Data: [1]
      +[LogActor] Completed

      See also: AbstractOperator, InferableOperator, ProxyObservable, logger

      source

      Description

      Combines all values emitted by the source, using an accumulator function that joins a new source value with the all past values emmited into one single array. This is similar to scan with vcat accumulation function.

      See also

      Operators

      diff --git a/v1.8.0/operators/transformation/concat_map/index.html b/v1.8.0/operators/transformation/concat_map/index.html new file mode 100644 index 000000000..0c46c7660 --- /dev/null +++ b/v1.8.0/operators/transformation/concat_map/index.html @@ -0,0 +1,16 @@ + +concat_map · Rocket.jl

      ConcatMap Operator

      Rocket.concat_mapFunction
      concat_map(::Type{R}, mappingFn::F = identity) where { R, F <: Function }

      Creates a concat_map operator, which returns an Observable that emits the result of applying the projection function to each item emitted by the source Observable and taking values from each projected inner Observable sequentially. Essentialy it projects each source value to an Observable which is merged in the output Observable, in a serialized fashion waiting for each one to complete before merging the next.

      Arguments

      • ::Type{R}: the type of data of output Observables after projection with mappingFn
      • mappingFn::F: projection function with (data) -> Observable{R} signature

      Producing

      Stream of type <: Subscribable{R}

      Examples

      using Rocket
      +
      +source = from([ 0, 0 ]) |> concat_map(Int, d -> from([ 1, 2, 3 ], scheduler = AsyncScheduler(0)))
      +subscribe!(source, logger())
      +;
      +
      +# output
      +
      +[LogActor] Data: 1
      +[LogActor] Data: 2
      +[LogActor] Data: 3
      +[LogActor] Data: 1
      +[LogActor] Data: 2
      +[LogActor] Data: 3
      +[LogActor] Completed

      See also: AbstractOperator, RightTypedOperator, ProxyObservable, logger

      source

      Description

      Returns an Observable that emits items based on applying a function that you supply to each item emitted by the source Observable, where that function returns an (so-called "inner") Observable. Each new inner Observable is concatenated with the previous inner Observable.

      Warning

      If source values arrive endlessly and faster than their corresponding inner Observables can complete, it will result in memory issues as inner Observables amass in an unbounded buffer waiting for their turn to be subscribed to.

      Note

      concat_map is equivalent to merge_map with concurrency parameter set to 1.

      See also

      Operators, merge_map

      diff --git a/v1.8.0/operators/transformation/concat_map_to/index.html b/v1.8.0/operators/transformation/concat_map_to/index.html new file mode 100644 index 000000000..79f3a3b97 --- /dev/null +++ b/v1.8.0/operators/transformation/concat_map_to/index.html @@ -0,0 +1,19 @@ + +concat_map_to · Rocket.jl

      ConcatMapTo Operator

      Rocket.concat_map_toFunction
      switch_map_to(inner_observable)

      Creates a switch_map_to operator, which returns an observable of values merged together by joining the passed observable with itself, one after the other, for each value emitted from the source. Essentially it projects each source value to the same Observable which is merged multiple times in a serialized fashion on the output Observable.

      Arguments

      • inner_observable: an Observable to replace each value from the source Observable.

      Producing

      Stream of type <: Subscribable{R} where R refers to the eltype of inner_observable

      Examples

      using Rocket
      +
      +source = from([ 0, 0, 0 ])
      +subscribe!(source |> concat_map_to(from([ 1, 2, 3 ])), logger())
      +;
      +
      +# output
      +
      +[LogActor] Data: 1
      +[LogActor] Data: 2
      +[LogActor] Data: 3
      +[LogActor] Data: 1
      +[LogActor] Data: 2
      +[LogActor] Data: 3
      +[LogActor] Data: 1
      +[LogActor] Data: 2
      +[LogActor] Data: 3
      +[LogActor] Completed

      See also: concat_map, AbstractOperator, RightTypedOperator, ProxyObservable, logger

      source
      Note

      concat_map_to is equivalent to concat_map with mappingFn set to (_) -> inner_observable.

      See also

      Operators, concat_map

      diff --git a/v1.8.0/operators/transformation/enumerate/index.html b/v1.8.0/operators/transformation/enumerate/index.html new file mode 100644 index 000000000..39c1a8084 --- /dev/null +++ b/v1.8.0/operators/transformation/enumerate/index.html @@ -0,0 +1,27 @@ + +enumerate · Rocket.jl

      Enumerate Operator

      Base.Iterators.enumerateFunction
      enumerate()

      Creates an enumerate operator, which converts each value emitted by the source Observable into a tuple of its order number and the value itself.

      The enumerate operator is similar to scan(Tuple{Int, Int}, (d, c) -> (d, c[2] + 1), (0, 0)) (see scan).

      Producing

      Stream of type <: Subscribable{Tuple{Int, L}} where L refers to type of source stream

      Examples

      using Rocket
      +
      +source = from([ 0 for _ in 1:3 ])
      +subscribe!(source |> enumerate(), logger())
      +;
      +
      +# output
      +
      +[LogActor] Data: (1, 0)
      +[LogActor] Data: (2, 0)
      +[LogActor] Data: (3, 0)
      +[LogActor] Completed
      +

      See also: AbstractOperator, InferableOperator, ProxyObservable, scan, map, logger

      source

      Description

      enumerate returns an Observable that converts each value emitted by the source Observable into a tuple of its order number and the value itself.

      Example

      Get a value from the source with its order number

      using Rocket
      +
      +source = from([ 0.0, 0.2, 0.4, 0.6, 0.8, 1.0 ])
      +subscribe!(source |> enumerate(), logger())
      +
      +# output
      +
      +[LogActor] Data: (0.0, 1)
      +[LogActor] Data: (0.2, 2)
      +[LogActor] Data: (0.4, 3)
      +[LogActor] Data: (0.6, 4)
      +[LogActor] Data: (0.8, 5)
      +[LogActor] Data: (1.0, 6)
      +[LogActor] Completed

      See also

      Operators, scan

      diff --git a/v1.8.0/operators/transformation/exhaust_map/index.html b/v1.8.0/operators/transformation/exhaust_map/index.html new file mode 100644 index 000000000..5fdac1e52 --- /dev/null +++ b/v1.8.0/operators/transformation/exhaust_map/index.html @@ -0,0 +1,12 @@ + +exhaust_map · Rocket.jl

      ExhaustMap Operator

      Rocket.exhaust_mapFunction
      exhaust_map(::Type{R}, mappingFn::F = identity) where { R, F <: Function }

      Creates a exhaust_map operator, which returns an Observable containing projected Observables of each item of the source, ignoring projected Observables that start before their preceding Observable has completed. Essentially it projects each source value to an Observable which is merged in the output Observable only if the previous projected Observable has completed.

      Arguments

      • ::Type{R}: the type of data of output Observables after projection with mappingFn
      • mappingFn::F: projection function with (data) -> Observable{R} signature

      Producing

      Stream of type <: Subscribable{R}

      Examples

      using Rocket
      +
      +source = from([ 0, 0 ]) |> async() |> exhaust_map(Int, d -> from([ 1, 2 ]) |> async())
      +subscribe!(source, logger())
      +;
      +
      +# output
      +
      +[LogActor] Data: 1
      +[LogActor] Data: 2
      +[LogActor] Completed

      See also: AbstractOperator, RightTypedOperator, ProxyObservable, logger

      source

      See also

      Operators

      diff --git a/v1.8.0/operators/transformation/lowercase/index.html b/v1.8.0/operators/transformation/lowercase/index.html new file mode 100644 index 000000000..fbc29c8f3 --- /dev/null +++ b/v1.8.0/operators/transformation/lowercase/index.html @@ -0,0 +1,11 @@ + +lowercase · Rocket.jl

      Lowercase Operator

      Base.Unicode.lowercaseFunction
      lowercase()

      Creates an lowercase operator, which forces each value to be in lower case

      Producing

      Stream of type <: Subscribable{L} where L referes to type of data of input Observable

      Examples

      using Rocket
      +
      +source = of("Hello, world!")
      +subscribe!(source |> lowercase(), logger())
      +;
      +
      +# output
      +
      +[LogActor] Data: hello, world!
      +[LogActor] Completed

      See also: AbstractOperator, InferableOperator, ProxyObservable, logger

      source

      See also

      Operators, map, uppercase

      diff --git a/v1.8.0/operators/transformation/map/index.html b/v1.8.0/operators/transformation/map/index.html new file mode 100644 index 000000000..7ea92f5c3 --- /dev/null +++ b/v1.8.0/operators/transformation/map/index.html @@ -0,0 +1,75 @@ + +map · Rocket.jl

      Map Operator

      Base.mapFunction
      map(::Type{R}, mappingFn::F) where { F <: Function }

      Creates a map operator, which applies a given mappingFn to each value emmited by the source Observable, and emits the resulting values as an Observable. You have to specify output R type after mappingFn projection.

      Arguments

      • ::Type{R}: the type of data of transformed value, may be or may not be the same as source type
      • mappingFn::Function: transformation function with (data::L) -> R signature, where L is type of data in input source

      Producing

      Stream of type <: Subscribable{R}

      Examples

      using Rocket
      +
      +source = from([ 1, 2, 3 ])
      +subscribe!(source |> map(Int, (d) -> d ^ 2), logger())
      +;
      +
      +# output
      +
      +[LogActor] Data: 1
      +[LogActor] Data: 4
      +[LogActor] Data: 9
      +[LogActor] Completed

      See also: AbstractOperator, RightTypedOperator, ProxyObservable, logger

      source

      Description

      The map operator, similar to map(f, array), applies a function to each value from the source. It's important to note that the function f is expected to be pure and without any side effects. The map operator is designed to create a copy of the original observable for each new subscriber. It independently executes the f function for each subscriber and doesn't share the resulting value. This might be inconvenient when f involves complex calculations or side effects.

      using Rocket
      +
      +function f(x)
      +    println("Function `f` called") # Assume heavy calculations or side-effects
      +    return x + 1
      +end
      +
      +subject = Subject(Int)
      +
      +mapped = subject |> map(Int, f)
      +
      +subscription1 = subscribe!(mapped, logger())
      +subscription2 = subscribe!(mapped, logger())
      +
      +next!(subject, 1)
      +
      +unsubscribe!(subscription1)
      +unsubscribe!(subscription2)
      Function `f` called
      +[LogActor] Data: 2
      +Function `f` called
      +[LogActor] Data: 2

      In the example, you'll observe that "Function f called" is displayed twice. This happens because each subscriber receives their individual, distinct version of the modified data. To alter this behavior, one can utilize the share() operator. This operator creates only a single copy of the modified observable and shares the computed results.

      mapped_and_shared = mapped |> share()
      +
      +subscription1 = subscribe!(mapped_and_shared, logger())
      +subscription2 = subscribe!(mapped_and_shared, logger())
      +
      +next!(subject, 1)
      +
      +unsubscribe!(subscription1)
      +unsubscribe!(subscription2)
      Function `f` called
      +[LogActor] Data: 2
      +[LogActor] Data: 2

      In this example, "Function f called" appears only once, and the computed value is shared between the two subscribers. Note, however, that this behaviour might be confusing in cases where the first subscribers completes the observable till its completion stage. For example:

      mapped_and_shared = from([ 0, 1, 2 ]) |> map(Int, f) |> share()
      +
      +subscription1 = subscribe!(mapped_and_shared, logger())
      +subscription2 = subscribe!(mapped_and_shared, logger())
      +
      +unsubscribe!(subscription1)
      +unsubscribe!(subscription2)
      Function `f` called
      +[LogActor] Data: 1
      +Function `f` called
      +[LogActor] Data: 2
      +Function `f` called
      +[LogActor] Data: 3
      +[LogActor] Completed
      +[LogActor] Completed

      In this scenario, the second subscriber doesn't receive any values because the first subscriber exhausts the single shared observable. Once the shared observable is used up, it doesn't produce any further values. This doesn't occur without the share() operator.

      mapped = from([ 0, 1, 2 ]) |> map(Int, f)
      +
      +subscription1 = subscribe!(mapped, logger())
      +subscription2 = subscribe!(mapped, logger())
      +
      +unsubscribe!(subscription1)
      +unsubscribe!(subscription2)
      Function `f` called
      +[LogActor] Data: 1
      +Function `f` called
      +[LogActor] Data: 2
      +Function `f` called
      +[LogActor] Data: 3
      +[LogActor] Completed
      +Function `f` called
      +[LogActor] Data: 1
      +Function `f` called
      +[LogActor] Data: 2
      +Function `f` called
      +[LogActor] Data: 3
      +[LogActor] Completed

      See also

      Operators

      diff --git a/v1.8.0/operators/transformation/map_to/index.html b/v1.8.0/operators/transformation/map_to/index.html new file mode 100644 index 000000000..8f1704d55 --- /dev/null +++ b/v1.8.0/operators/transformation/map_to/index.html @@ -0,0 +1,13 @@ + +map_to · Rocket.jl

      MapTo Operator

      Rocket.map_toFunction
      map_to(value::T) where T

      Creates a map operator, which emits the given constant value on the output Observable every time the source Observable emits a value.

      Arguments

      • value::T: the constant value to map each source value to

      Producing

      Stream of type <: Subscribable{T}

      Examples

      using Rocket
      +
      +source = from([ 1, 2, 3 ])
      +subscribe!(source |> map_to('a'), logger())
      +;
      +
      +# output
      +
      +[LogActor] Data: a
      +[LogActor] Data: a
      +[LogActor] Data: a
      +[LogActor] Completed

      See also: map, AbstractOperator, RightTypedOperator, ProxyObservable, logger

      source

      Description

      Takes a constant value as argument, and emits that whenever the source Observable emits a value. In other words, ignores the actual source value, and simply uses the emission moment to know when to emit the given value.

      See also

      Operators

      diff --git a/v1.8.0/operators/transformation/merge_map/index.html b/v1.8.0/operators/transformation/merge_map/index.html new file mode 100644 index 000000000..5d4846bb4 --- /dev/null +++ b/v1.8.0/operators/transformation/merge_map/index.html @@ -0,0 +1,16 @@ + +merge_map · Rocket.jl

      MergeMap Operator

      Rocket.merge_mapFunction
      merge_map(::Type{R}, mappingFn::F = identity; concurrent::Int = typemax(Int)) where { R, F <: Function }

      Creates a merge_map operator, which returns an Observable that emits the result of applying the projection function mappingFn to each item emitted by the source Observable and merging the results of the Observables obtained from this transformation.

      Arguments

      • ::Type{R}: the type of data of output Observables after projection with mappingFn
      • mappingFn::F: projection function with (data) -> Observable{R} signature
      • concurrent::Int: optional, default is typemax(Int), maximum number of input Observables being subscribed to concurrently

      Producing

      Stream of type <: Subscribable{R}

      Examples

      using Rocket
      +
      +source = from([ 0, 0 ]) |> merge_map(Int, d -> from([ 1, 2, 3 ], scheduler = AsyncScheduler(0)))
      +subscribe!(source, logger())
      +;
      +
      +# output
      +
      +[LogActor] Data: 1
      +[LogActor] Data: 1
      +[LogActor] Data: 2
      +[LogActor] Data: 2
      +[LogActor] Data: 3
      +[LogActor] Data: 3
      +[LogActor] Completed

      See also: AbstractOperator, RightTypedOperator, ProxyObservable, logger

      source

      See also

      Operators

      diff --git a/v1.8.0/operators/transformation/override/index.html b/v1.8.0/operators/transformation/override/index.html new file mode 100644 index 000000000..7df0154bf --- /dev/null +++ b/v1.8.0/operators/transformation/override/index.html @@ -0,0 +1,33 @@ + +override · Rocket.jl

      Override Operator

      Rocket.overrideFunction
      override(handler::OverrideHandler)

      Creates an override operator that overrides each emission from source observable with value provided in handler. If handler contains nothing source observable emits as usual. For constant override see map_to. Use Rocket.setvalue! to set new value for handler.

      Producing

      Stream of type <: Subscribable{Union{L, T}} where L refers to the type of source stream and T referes to the type of handler's value

      Examples

      using Rocket 
      +
      +subject = Subject(Int)
      +handler = OverrideHandler(Int, -1)
      +
      +source = subject |> override(handler)
      +
      +subscription = subscribe!(source, logger())
      +
      +next!(subject, 1)
      +next!(subject, 2)
      +
      +Rocket.setvalue!(handler, nothing)
      +
      +next!(subject, 3)
      +next!(subject, 4)
      +
      +Rocket.setvalue!(handler, -2)
      +
      +next!(subject, 5)
      +next!(subject, 6)
      +
      +unsubscribe!(subscription)
      +
      +# output
      +[LogActor] Data: -1
      +[LogActor] Data: -1
      +[LogActor] Data: 3
      +[LogActor] Data: 4
      +[LogActor] Data: -2
      +[LogActor] Data: -2

      See also: OverrideHandler

      source

      See also

      Operators

      diff --git a/v1.8.0/operators/transformation/pairwise/index.html b/v1.8.0/operators/transformation/pairwise/index.html new file mode 100644 index 000000000..a52064f0e --- /dev/null +++ b/v1.8.0/operators/transformation/pairwise/index.html @@ -0,0 +1,29 @@ + +pairwise · Rocket.jl

      Pairwise Operator

      Rocket.pairwiseFunction
      pairwise([ initial ])

      Creates a pairwise operator, which groups pairs of consecutive emissions together and emits them as a tuple of two values. Accepts optional initial seed value to start pairing from.

      using Rocket
      +
      +source = from(1:5) |> pairwise()
      +
      +subscribe!(source, logger())
      +;
      +
      +# output
      +
      +[LogActor] Data: (1, 2)
      +[LogActor] Data: (2, 3)
      +[LogActor] Data: (3, 4)
      +[LogActor] Data: (4, 5)
      +[LogActor] Completed
      using Rocket
      +
      +source = from(1:5) |> pairwise(0)
      +
      +subscribe!(source, logger())
      +;
      +
      +# output
      +
      +[LogActor] Data: (0, 1)
      +[LogActor] Data: (1, 2)
      +[LogActor] Data: (2, 3)
      +[LogActor] Data: (3, 4)
      +[LogActor] Data: (4, 5)
      +[LogActor] Completed

      See also: AbstractOperator, InferableOperator, logger

      source

      See also

      Operators

      diff --git a/v1.8.0/operators/transformation/scan/index.html b/v1.8.0/operators/transformation/scan/index.html new file mode 100644 index 000000000..690293cc9 --- /dev/null +++ b/v1.8.0/operators/transformation/scan/index.html @@ -0,0 +1,27 @@ + +scan · Rocket.jl

      Scan Operator

      Rocket.scanFunction
      scan(::Type{R}, scanFn::F, seed::R) where { R, F <: Function }
      +scan(scanFn::F) where { F <: Function }

      Creates a scan operator, which applies a given accumulator scanFn function to each value emmited by the source Observable, and returns each intermediate result with an optional seed value. If a seed value is specified, then that value will be used as the initial value for the accumulator. If no seed value is specified, the first item of the source is used as the seed.

      Arguments

      • ::Type{R}: the type of data of transformed value, may be or may not be the same as type of input source
      • scanFn::Function: accumulator function with (data::T, current::R) -> R signature
      • seed::R: optional initial value for accumulator function

      Producing

      Stream of type <: Subscribable{R}

      Examples

      using Rocket
      +
      +source = from([ 1, 2, 3 ])
      +subscribe!(source |> scan(+), logger())
      +;
      +
      +# output
      +
      +[LogActor] Data: 1
      +[LogActor] Data: 3
      +[LogActor] Data: 6
      +[LogActor] Completed
      +
      using Rocket
      +
      +source = from([ 1, 2, 3 ])
      +subscribe!(source |> scan(Vector{Int}, (d, c) -> [ c..., d ], Int[]), logger())
      +;
      +
      +# output
      +
      +[LogActor] Data: [1]
      +[LogActor] Data: [1, 2]
      +[LogActor] Data: [1, 2, 3]
      +[LogActor] Completed
      +

      See also: AbstractOperator, RightTypedOperator, ProxyObservable, reduce, logger

      source

      Description

      Combines all values emitted by the source, using an accumulator function that joins a new source value with the past accumulation. This is similar to reduce, but emits the intermediate accumulations.

      Returns an Observable that applies a specified accumulator function to each item emitted by the source Observable. If a seed value is specified, then that value will be used as the initial value for the accumulator. If no seed value is specified, the first item of the source is used as the seed.

      See also

      Operators

      diff --git a/v1.8.0/operators/transformation/start_with/index.html b/v1.8.0/operators/transformation/start_with/index.html new file mode 100644 index 000000000..ea0699d17 --- /dev/null +++ b/v1.8.0/operators/transformation/start_with/index.html @@ -0,0 +1,14 @@ + +start_with · Rocket.jl

      StartWith Operator

      Rocket.start_withFunction
      start_with(object::O) where O

      Creates a start_with operator, which forces an observable to emit given object as a first value.

      Producing

      Stream of type <: Subscribable{Union{L, O}} where L refers to type of source stream <: Subscribable{L}

      Examples

      using Rocket
      +
      +source = from(1:3) |> start_with(0)
      +subscribe!(source, logger())
      +;
      +
      +# output
      +
      +[LogActor] Data: 0
      +[LogActor] Data: 1
      +[LogActor] Data: 2
      +[LogActor] Data: 3
      +[LogActor] Completed

      See also: AbstractOperator, InferableOperator, ProxyObservable, logger

      source

      See also

      Operators

      diff --git a/v1.8.0/operators/transformation/substitute/index.html b/v1.8.0/operators/transformation/substitute/index.html new file mode 100644 index 000000000..497822fc6 --- /dev/null +++ b/v1.8.0/operators/transformation/substitute/index.html @@ -0,0 +1,31 @@ + +substitute · Rocket.jl

      Substitute Operator

      Rocket.substituteFunction
      substitute(::Type{T}, mapFn::F, handler::SubstituteHandler) where { T, F <: Function }

      This operator forces observable to substitute each emmited value with the latest computed value with the corresponding handler and release! function. After release! on handler substitute operator computes new value with mapFn but does not emit it until next emission from source observable. Always calls mapFn on first value from source observable.

      Producing

      Stream of type <: Subscribable{T}

      Examples

      using Rocket
      +
      +subject = Subject(Int)
      +
      +handler = SubstituteHandler()
      +source  = subject |> substitute(String, i -> string("i = ", i), handler)
      +
      +subscription = subscribe!(source, logger())
      +
      +next!(subject, 1)
      +next!(subject, 2)
      +next!(subject, 3)
      +
      +release!(handler)
      +
      +next!(subject, 4)
      +next!(subject, 5)
      +next!(subject, 6)
      +
      +unsubscribe!(subscription)
      +;
      +
      +# output
      +
      +[LogActor] Data: i = 1
      +[LogActor] Data: i = 1
      +[LogActor] Data: i = 1
      +[LogActor] Data: i = 3
      +[LogActor] Data: i = 3
      +[LogActor] Data: i = 3

      See also: SubstituteHandler

      source

      See also

      Operators

      diff --git a/v1.8.0/operators/transformation/switch_map/index.html b/v1.8.0/operators/transformation/switch_map/index.html new file mode 100644 index 000000000..a92bf85a5 --- /dev/null +++ b/v1.8.0/operators/transformation/switch_map/index.html @@ -0,0 +1,24 @@ + +switch_map · Rocket.jl

      SwitchMap Operator

      Rocket.switch_mapFunction
      switch_map(::Type{R}, mappingFn::F = identity) where { R, F <: Function }

      Creates a switch_map operator, which returns an Observable that emits items based on applying a function mappingFn that you supply to each item emitted by the source Observable, where that function returns an (so-called "inner") Observable. Each time it observes one of these inner Observables, the output Observable begins emitting the items emitted by that inner Observable. When a new inner Observable is emitted, switch_map stops emitting items from the earlier-emitted inner Observable and begins emitting items from the new one. It continues to behave like this for subsequent inner Observables.

      Arguments

      • ::Type{R}: the type of data of output Observables after projection with mappingFn
      • mappingFn::F: projection function with (data) -> Observable{R} signature

      Producing

      Stream of type <: Subscribable{R}

      Examples

      using Rocket
      +
      +source = from([ of(1), of(2), of(3) ])
      +subscribe!(source |> switch_map(Int), logger())
      +;
      +
      +# output
      +
      +[LogActor] Data: 1
      +[LogActor] Data: 2
      +[LogActor] Data: 3
      +[LogActor] Completed
      using Rocket
      +
      +source = from([ 1, 2, 3 ])
      +subscribe!(source |> switch_map(Float64, (d) -> of(convert(Float64, d ^ 2))), logger())
      +;
      +
      +# output
      +
      +[LogActor] Data: 1.0
      +[LogActor] Data: 4.0
      +[LogActor] Data: 9.0
      +[LogActor] Completed

      See also: AbstractOperator, RightTypedOperator, ProxyObservable, logger

      source

      See also

      Operators

      diff --git a/v1.8.0/operators/transformation/switch_map_to/index.html b/v1.8.0/operators/transformation/switch_map_to/index.html new file mode 100644 index 000000000..eebec7e85 --- /dev/null +++ b/v1.8.0/operators/transformation/switch_map_to/index.html @@ -0,0 +1,19 @@ + +switch_map_to · Rocket.jl

      SwitchMapTo Operator

      Rocket.switch_map_toFunction
      switch_map_to(inner_observable)

      Creates a switch_map_to operator, which projects each source value to the same Observable which is flattened multiple times with switch_map in the output Observable.

      Arguments

      • inner_observable: an Observable to replace each value from the source Observable.

      Producing

      Stream of type <: Subscribable{R} where R refers to the eltype of inner_observable

      Examples

      using Rocket
      +
      +source = from([ 0, 0, 0 ])
      +subscribe!(source |> switch_map_to(from([ 1, 2, 3 ])), logger())
      +;
      +
      +# output
      +
      +[LogActor] Data: 1
      +[LogActor] Data: 2
      +[LogActor] Data: 3
      +[LogActor] Data: 1
      +[LogActor] Data: 2
      +[LogActor] Data: 3
      +[LogActor] Data: 1
      +[LogActor] Data: 2
      +[LogActor] Data: 3
      +[LogActor] Completed

      See also: switch_map, AbstractOperator, RightTypedOperator, ProxyObservable, logger

      source
      Note

      switch_map_to is equivalent to switch_map with mappingFn set to (_) -> inner_observable.

      See also

      Operators

      diff --git a/v1.8.0/operators/transformation/to_array/index.html b/v1.8.0/operators/transformation/to_array/index.html new file mode 100644 index 000000000..d3d2fe8b8 --- /dev/null +++ b/v1.8.0/operators/transformation/to_array/index.html @@ -0,0 +1,12 @@ + +to_array · Rocket.jl

      Uppercase Operator

      Rocket.to_arrayFunction
      to_array()

      Creates a to_array operator, which reduces all values into a single array and returns this result when the source completes.

      Producing

      Stream of type <: Subscribable{Vector{L}} where L refers to type of source stream

      Examples

      using Rocket
      +
      +source = from([ 1, 2, 3 ])
      +subscribe!(source |> to_array(), logger())
      +;
      +
      +# output
      +
      +[LogActor] Data: [1, 2, 3]
      +[LogActor] Completed
      +

      See also: AbstractOperator, InferableOperator, ProxyObservable, logger

      source

      See also

      Operators, map, lowercase

      diff --git a/v1.8.0/operators/transformation/uppercase/index.html b/v1.8.0/operators/transformation/uppercase/index.html new file mode 100644 index 000000000..8c1c429cf --- /dev/null +++ b/v1.8.0/operators/transformation/uppercase/index.html @@ -0,0 +1,11 @@ + +uppercase · Rocket.jl

      Uppercase Operator

      Base.Unicode.uppercaseFunction
      uppercase()

      Creates an uppercase operator, which forces each value to be in upper case

      Producing

      Stream of type <: Subscribable{L} where L referes to type of data of input Observable

      Examples

      using Rocket
      +
      +source = of("Hello, world!")
      +subscribe!(source |> uppercase(), logger())
      +;
      +
      +# output
      +
      +[LogActor] Data: HELLO, WORLD!
      +[LogActor] Completed

      See also: AbstractOperator, InferableOperator, ProxyObservable, logger

      source

      See also

      Operators, map, lowercase

      diff --git a/v1.8.0/operators/utility/about/index.html b/v1.8.0/operators/utility/about/index.html new file mode 100644 index 000000000..8486a2db5 --- /dev/null +++ b/v1.8.0/operators/utility/about/index.html @@ -0,0 +1,2 @@ + +About utility operators · Rocket.jl
      diff --git a/v1.8.0/operators/utility/async/index.html b/v1.8.0/operators/utility/async/index.html new file mode 100644 index 000000000..8ab4141f0 --- /dev/null +++ b/v1.8.0/operators/utility/async/index.html @@ -0,0 +1,2 @@ + +async · Rocket.jl
      diff --git a/v1.8.0/operators/utility/default_if_empty/index.html b/v1.8.0/operators/utility/default_if_empty/index.html new file mode 100644 index 000000000..aa29025aa --- /dev/null +++ b/v1.8.0/operators/utility/default_if_empty/index.html @@ -0,0 +1,21 @@ + +default_if_empty · Rocket.jl

      DefaultIfEmpty Operator

      Rocket.default_if_emptyFunction
      default_if_empty(value::T)
      +default_if_empty(callback::Function)

      Creates a default_if_empty operator, which emits a given value if the source Observable completes without emitting any next value, otherwise mirrors the source Observable. Optionally accepts a zero-argument callback that will be executed to generate default value. Note: Callback function's output is always converted to the eltype of the original observable.

      using Rocket
      +
      +source = completed(Int) |> default_if_empty(0)
      +
      +subscribe!(source, logger())
      +;
      +
      +# output
      +[LogActor] Data: 0
      +[LogActor] Completed
      using Rocket
      +
      +source = completed(Int) |> default_if_empty(() -> 42)
      +
      +subscribe!(source, logger())
      +;
      +
      +# output
      +[LogActor] Data: 42
      +[LogActor] Completed

      See also: AbstractOperator, InferableOperator, logger, map

      source

      Description

      default_if_empty emits the values emitted by the source Observable or a specified default value if the source Observable is empty (completes without having emitted any next value).

      See also

      Operators

      diff --git a/v1.8.0/operators/utility/delay/index.html b/v1.8.0/operators/utility/delay/index.html new file mode 100644 index 000000000..32c722f57 --- /dev/null +++ b/v1.8.0/operators/utility/delay/index.html @@ -0,0 +1,17 @@ + +delay · Rocket.jl

      Delay Operator

      Rocket.delayFunction
      delay(delay::Int)

      Creates a delay operator, which delays the emission of items from the source Observable by a given timeout.

      Arguments:

      • delay::Int: the delay duration in milliseconds (a number) until which the emission of the source items is delayed.

      Producing

      Stream of type <: Subscribable{L} where L refers to type of source stream

      See also: AbstractOperator, InferableOperator, ProxyObservable

      source

      Description

      Delays the emission of items from the source Observable by a given timeout

      Example

      Delay every value with 1 second to the output

      using Rocket
      +using Dates
      +
      +source = from([ 1, 2, 3 ])
      +println(Dates.format(now(), "MM:SS"))
      +subscription = subscribe!(source |> delay(2000), lambda(
      +    on_next = (d) -> println("$(Dates.format(now(), "MM:SS")): $d")
      +));
      +
      +# output
      +
      +03:41
      +03:43: 1
      +03:43: 2
      +03:43: 3
      +

      See also

      Operators

      diff --git a/v1.8.0/operators/utility/discontinue/index.html b/v1.8.0/operators/utility/discontinue/index.html new file mode 100644 index 000000000..2f8fab469 --- /dev/null +++ b/v1.8.0/operators/utility/discontinue/index.html @@ -0,0 +1,13 @@ + +discontinue · Rocket.jl

      Discontinue Operator

      Rocket.discontinueFunction
      discontinue()

      Creates an operator, which prevents an emitting of self-depending messages and breaks a possible infinite loop. Does nothing if observable scheduled asynchronously.

      Producing

      Stream of type <: Subscribable{L} where L refers to type of source stream

      Examples

      using Rocket
      +
      +s = BehaviorSubject(0)
      +
      +subscription1 = subscribe!(s, logger())
      +subscription2 = subscribe!(s |> map(Int, d -> d + 1) |> discontinue(), s)
      +;
      +
      +# output
      +
      +[LogActor] Data: 0
      +[LogActor] Data: 1

      See also: AbstractOperator, RightTypedOperator, ProxyObservable, logger

      source

      See also

      Operators

      diff --git a/v1.8.0/operators/utility/error_if_empty/index.html b/v1.8.0/operators/utility/error_if_empty/index.html new file mode 100644 index 000000000..6128498a3 --- /dev/null +++ b/v1.8.0/operators/utility/error_if_empty/index.html @@ -0,0 +1,10 @@ + +error_if_empty · Rocket.jl

      ErrorIfEmpty Operator

      Rocket.error_if_emptyFunction
      error_if_empty(err)

      Creates a error_if_empty operator, which emits a given error if the source Observable completes without emitting any next value, otherwise mirrors the source Observable.

      using Rocket
      +
      +source = completed(Int) |> error_if_empty("Empty")
      +
      +subscribe!(source, logger())
      +;
      +
      +# output
      +[LogActor] Error: Empty

      See also: AbstractOperator, InferableOperator, logger, map

      source

      Description

      error_if_empty emits the values emitted by the source Observable or a specified error message if the source Observable is empty (completes without having emitted any next value).

      See also

      Operators

      diff --git a/v1.8.0/operators/utility/limit_subscribers/index.html b/v1.8.0/operators/utility/limit_subscribers/index.html new file mode 100644 index 000000000..e84b91b1a --- /dev/null +++ b/v1.8.0/operators/utility/limit_subscribers/index.html @@ -0,0 +1,13 @@ + +limit_subscribers · Rocket.jl

      LimitSubscribers Operator

      Rocket.LimitSubscribersGuardType
      LimitSubscribersGuard(limit::Int = 1, exclusive = true)

      Guard structure used in limit_subscribers operator.

      Arguments

      • limit: number of concurrent subscribers
      • exclusive: boolean flag, which indicates whenever this guard can be shared with other observables in other limit_subscribers operator. If set to true, reusing this guard in a different limit_subscribers operator for other observable will result in automatic unsubscription of all present actors.

      Note

      This structure is useful in Pluto.jl notebooks in particular, allowing for automatic subscription/unsubscription of observables.

      Example

      
      +# Cell 1
      +guard = LimitSubscribersGuard()
      +
      +# Cell 2
      +subscription = subscribe!(some_stream |> limit_subscribers(guard), logger())

      See also: limit_subscribers, subscribe!

      source
      Rocket.limit_subscribersFunction
      limit_subscribers(limit::Int = 1, exclusive::Bool = true)
      +limit_subscribers(guard::LimitSubscribersGuard)

      Creates an operator that limits number of concurrent actors to the given observable. On new subscription, if limit is exceeded, oldest actor is automatically unsubscribed and receives a completion event.

      Arguments

      • limit: number of concurrent subscribers
      • exclusive: boolean flag, which indicates whenever this guard can be shared with other observables in other limit_subscribers operator. If set to true, reusing this guard in a different limit_subscribers operator for other observable will result in automatic unsubscription of all present actors.

      Note

      This structure is useful in Pluto.jl notebooks in particular, allowing for automatic subscription/unsubscription of observables.

      Example

      
      +# Cell 1
      +guard = LimitSubscribersGuard()
      +
      +# Cell 2
      +subscription = subscribe!(some_stream |> limit_subscribers(guard), logger())

      See also: LimitSubscribersGuard

      source

      See also

      Operators

      diff --git a/v1.8.0/operators/utility/noop/index.html b/v1.8.0/operators/utility/noop/index.html new file mode 100644 index 000000000..834b60405 --- /dev/null +++ b/v1.8.0/operators/utility/noop/index.html @@ -0,0 +1,25 @@ + +noop · Rocket.jl

      Noop Operator

      Rocket.noopFunction
      noop()

      Creates a noop operator, which does nothing, but breaks operator composition type inference checking procedure for Julia's compiler. It might be useful for very long chain of operators, because Julia tries to statically infer data types at compile-time for the whole chain and can run into StackOverflow issues.

      using Rocket
      +
      +# foo() block to enforce local scope for scope variable
      +function foo()
      +    source = from(1:5)
      +
      +    for i in 1:1000
      +        source = source |> map(Int, d -> d + 1) |> noop()
      +    end
      +
      +    subscribe!(source, logger())
      +end
      +
      +foo()
      +;
      +
      +# output
      +
      +[LogActor] Data: 1001
      +[LogActor] Data: 1002
      +[LogActor] Data: 1003
      +[LogActor] Data: 1004
      +[LogActor] Data: 1005
      +[LogActor] Completed

      See also: AbstractOperator, InferableOperator, logger, map

      source

      See also

      Operators

      diff --git a/v1.8.0/operators/utility/ref_count/index.html b/v1.8.0/operators/utility/ref_count/index.html new file mode 100644 index 000000000..7590f323f --- /dev/null +++ b/v1.8.0/operators/utility/ref_count/index.html @@ -0,0 +1,24 @@ + +ref_count · Rocket.jl

      Ref Count Operator

      Rocket.ref_countFunction
      ref_count()

      Make a ConnectableObservable behave like a ordinary observable and automates the way you can connect to it. Internally it counts the subscriptions to the observable and subscribes (only once) to the source if the number of subscriptions is larger than 0. If the number of subscriptions is smaller than 1, it unsubscribes from the source. This way you can make sure that everything before the published refCount has only a single subscription independently of the number of subscribers to the target observable.

      Note that using the share operator is exactly the same as using the publish operator (making the observable hot) and the ref_count() operator in a sequence.

      Example

      using Rocket
      +
      +subject = Subject(Int, scheduler = AsapScheduler())
      +source  = from(1:5) |> multicast(subject) |> ref_count()
      +
      +actor1 = logger("1")
      +actor2 = logger("2")
      +
      +subscription1 = subscribe!(source, actor1)
      +subscription2 = subscribe!(source, actor2)
      +
      +unsubscribe!(subscription1)
      +unsubscribe!(subscription2)
      +;
      +
      +# output
      +[1] Data: 1
      +[1] Data: 2
      +[1] Data: 3
      +[1] Data: 4
      +[1] Data: 5
      +[1] Completed
      +[2] Completed

      See also: AbstractOperator, publish, multicast, share

      source

      See also

      Operators

      diff --git a/v1.8.0/operators/utility/safe/index.html b/v1.8.0/operators/utility/safe/index.html new file mode 100644 index 000000000..ddc3802b9 --- /dev/null +++ b/v1.8.0/operators/utility/safe/index.html @@ -0,0 +1,2 @@ + +safe · Rocket.jl
      diff --git a/v1.8.0/operators/utility/skip_complete/index.html b/v1.8.0/operators/utility/skip_complete/index.html new file mode 100644 index 000000000..d21e1e40a --- /dev/null +++ b/v1.8.0/operators/utility/skip_complete/index.html @@ -0,0 +1,12 @@ + +skip_complete · Rocket.jl

      SkipComplete Operator

      Rocket.skip_completeFunction
      skip_complete()

      Creates a skip_complete operator, which filters out complete event by the source Observable by emitting only next and error messages.

      Producing

      Stream of type <: Subscribable{L} where L refers to type of source stream

      Examples

      using Rocket
      +
      +source = from([ 1, 2, 3 ])
      +subscribe!(source |> skip_complete(), logger())
      +;
      +
      +# output
      +[LogActor] Data: 1
      +[LogActor] Data: 2
      +[LogActor] Data: 3
      +

      See also: AbstractOperator, InferableOperator, ProxyObservable, skip_error, skip_next, logger

      source

      See also

      Operators

      diff --git a/v1.8.0/operators/utility/skip_error/index.html b/v1.8.0/operators/utility/skip_error/index.html new file mode 100644 index 000000000..f305a1a48 --- /dev/null +++ b/v1.8.0/operators/utility/skip_error/index.html @@ -0,0 +1,9 @@ + +skip_error · Rocket.jl

      SkipError Operator

      See also

      Operators

      diff --git a/v1.8.0/operators/utility/skip_next/index.html b/v1.8.0/operators/utility/skip_next/index.html new file mode 100644 index 000000000..ace5b45b0 --- /dev/null +++ b/v1.8.0/operators/utility/skip_next/index.html @@ -0,0 +1,10 @@ + +skip_next · Rocket.jl

      SkipNext Operator

      Rocket.skip_nextFunction
      skip_next()

      Creates a skip_next operator, which filters out all next messages by the source Observable by emitting only error and complete messages.

      Producing

      Stream of type <: Subscribable{L} where L refers to type of source stream

      Examples

      using Rocket
      +
      +source = from([ 1, 2, 3 ])
      +subscribe!(source |> skip_next(), logger())
      +;
      +
      +# output
      +[LogActor] Completed
      +

      See also: AbstractOperator, InferableOperator, ProxyObservable, skip_error, skip_complete, logger

      source

      See also

      Operators

      diff --git a/v1.8.0/operators/utility/tap/index.html b/v1.8.0/operators/utility/tap/index.html new file mode 100644 index 000000000..ee32a356b --- /dev/null +++ b/v1.8.0/operators/utility/tap/index.html @@ -0,0 +1,17 @@ + +tap · Rocket.jl

      Tap Operator

      Rocket.tapFunction
      tap(tapFn::F) where { F <: Function }

      Creates a tap operator, which performs a side effect for every emission on the source Observable, but return an Observable that is identical to the source.

      Arguments

      • tapFn::Function: side-effect tap function with (data) -> Nothing signature

      Producing

      Stream of type <: Subscribable{L} where L refers to type of source stream

      Examples

      using Rocket
      +
      +source = from([ 1, 2, 3 ])
      +subscribe!(source |> tap((d) -> println("In tap: $d")), logger())
      +;
      +
      +# output
      +
      +In tap: 1
      +[LogActor] Data: 1
      +In tap: 2
      +[LogActor] Data: 2
      +In tap: 3
      +[LogActor] Data: 3
      +[LogActor] Completed
      +

      See also: tap_on_subscribe, tap_on_complete, logger

      source

      Description

      Returns an Observable that resembles the source Observable, but modifies it so that the provided Observer is called to perform a side effect for every value emitted by the source.

      This operator is useful for debugging your Observables, verifying correct values, or performing other side effects.

      Note: this operator differs from a subscribe on the Observable. If the Observable returned by tap is not subscribed, the side effects specified by the Observer will never happen. tap therefore simply spies on existing execution, it does not trigger an execution to happen like subscribe does.

      See also

      Operators

      diff --git a/v1.8.0/operators/utility/tap_on_complete/index.html b/v1.8.0/operators/utility/tap_on_complete/index.html new file mode 100644 index 000000000..17eb99195 --- /dev/null +++ b/v1.8.0/operators/utility/tap_on_complete/index.html @@ -0,0 +1,15 @@ + +tap_on_complete · Rocket.jl

      TapOnComplete Operator

      Rocket.tap_on_completeFunction
      tap_on_complete(tapFn::F) where { F <: Function }

      Creates a tap operator, which performs a side effect for only complete emission on the source Observable, but return an Observable that is identical to the source.

      Arguments

      • tapFn::Function: side-effect tap function with () -> Nothing signature

      Producing

      Stream of type <: Subscribable{L} where L refers to type of source stream

      Examples

      using Rocket
      +
      +source = from([ 1, 2, 3 ])
      +subscribe!(source |> tap_on_complete(() -> println("Complete event received")), logger())
      +;
      +
      +# output
      +
      +[LogActor] Data: 1
      +[LogActor] Data: 2
      +[LogActor] Data: 3
      +[LogActor] Completed
      +Complete event received
      +

      See also: tap_on_subscribe, tap, logger

      source

      Description

      Returns an Observable that resembles the source Observable, but modifies it so that the provided Observer is called to perform a side effect on complete event emission by the source.

      This operator is useful for debugging your Observables, verifying correctness, or performing other side effects.

      Note: this operator differs from a subscribe on the Observable. If the Observable returned by tap_on_complete is not subscribed, the side effects specified by the Observer will never happen. tap_on_complete therefore simply spies on future execution, it does not trigger an execution to happen like subscribe does.

      See also

      Operators

      diff --git a/v1.8.0/operators/utility/tap_on_subscribe/index.html b/v1.8.0/operators/utility/tap_on_subscribe/index.html new file mode 100644 index 000000000..a33e15f96 --- /dev/null +++ b/v1.8.0/operators/utility/tap_on_subscribe/index.html @@ -0,0 +1,26 @@ + +tap_on_subscribe · Rocket.jl

      TapOnSubscribe Operator

      Rocket.tap_on_subscribeFunction
      tap_on_subscribe(tapFn::F, strategy::S = TapBeforeSubscription()) where { F <: Function }

      Creates a tap operator, which performs a side effect on the subscription on the source Observable, but return an Observable that is identical to the source.

      Arguments

      • tapFn::Function: side-effect tap function with () -> Nothing signature
      • strategy: (optional), specifies the order of a side-effect and an actual subscription, uses TapBeforeSubscription by default

      Producing

      Stream of type <: Subscribable{L} where L refers to type of source stream

      Examples

      using Rocket
      +
      +source = from([ 1, 2, 3 ])
      +subscribe!(source |> tap_on_subscribe(() -> println("Someone subscribed")), logger())
      +;
      +
      +# output
      +
      +Someone subscribed
      +[LogActor] Data: 1
      +[LogActor] Data: 2
      +[LogActor] Data: 3
      +[LogActor] Completed
      using Rocket
      +
      +source = from([ 1, 2, 3 ])
      +subscribe!(source |> tap_on_subscribe(() -> println("Someone subscribed"), TapAfterSubscription()), logger())
      +;
      +
      +# output
      +
      +[LogActor] Data: 1
      +[LogActor] Data: 2
      +[LogActor] Data: 3
      +[LogActor] Completed
      +Someone subscribed

      See also: TapBeforeSubscription, TapAfterSubscription, tap, tap_on_unsubscribe, tap_on_complete, logger

      source

      Description

      Returns an Observable that resembles the source Observable, but modifies it so that the provided Observer is called to perform a side effect on subscription to the source.

      This operator is useful for debugging your Observables, verifying correctness, or performing other side effects.

      Note: this operator differs from a subscribe on the Observable. If the Observable returned by tap_on_subscribe is not subscribed, the side effects specified by the Observer will never happen. tap_on_subscribe therefore simply spies on future execution, it does not trigger an execution to happen like subscribe does.

      See also

      Operators

      diff --git a/v1.8.0/operators/utility/tap_on_unsubscribe/index.html b/v1.8.0/operators/utility/tap_on_unsubscribe/index.html new file mode 100644 index 000000000..80305725f --- /dev/null +++ b/v1.8.0/operators/utility/tap_on_unsubscribe/index.html @@ -0,0 +1,15 @@ + +tap_on_unsubscribe · Rocket.jl

      TapOnUnsubscribe Operator

      Rocket.tap_on_unsubscribeFunction
      tap_on_unsubscribe(tapFn::F, strategy::S = TapBeforeUnsubscription()) where { F <: Function }

      Creates a tap operator, which performs a side effect on the unsubscription on the source Observable, but return an Observable that is identical to the source. Tap callback triggers only once.

      Arguments

      • tapFn::Function: side-effect tap function with () -> Nothing signature
      • strategy: (optional), specifies the order of a side-effect and an actual unsubscription, uses TapBeforeUnsubscription by default

      Producing

      Stream of type <: Subscribable{L} where L refers to type of source stream

      Examples

      using Rocket
      +
      +source = from([ 1, 2, 3 ])
      +subscription = subscribe!(source |> tap_on_unsubscribe(() -> println("Someone unsubscribed")), logger())
      +unsubscribe!(subscription)
      +;
      +
      +# output
      +
      +[LogActor] Data: 1
      +[LogActor] Data: 2
      +[LogActor] Data: 3
      +[LogActor] Completed
      +Someone unsubscribed

      See also: TapBeforeUnsubscription, TapAfterUnsubscription, tap, tap_on_subscribe, tap_on_complete, logger

      source

      Description

      Returns an Observable that resembles the source Observable, but modifies it so that the provided Observer is called to perform a side effect on unsubscription from the source.

      This operator is useful for debugging your Observables, verifying correctness, or performing other side effects.

      See also

      Operators

      diff --git a/v1.8.0/search_index.js b/v1.8.0/search_index.js new file mode 100644 index 000000000..6002ccdf7 --- /dev/null +++ b/v1.8.0/search_index.js @@ -0,0 +1,3 @@ +var documenterSearchIndex = {"docs": +[{"location":"operators/utility/skip_complete/#operator_skip_complete","page":"skip_complete","title":"SkipComplete Operator","text":"","category":"section"},{"location":"operators/utility/skip_complete/","page":"skip_complete","title":"skip_complete","text":"skip_complete","category":"page"},{"location":"operators/utility/skip_complete/#Rocket.skip_complete","page":"skip_complete","title":"Rocket.skip_complete","text":"skip_complete()\n\nCreates a skip_complete operator, which filters out complete event by the source Observable by emitting only next and error messages.\n\nProducing\n\nStream of type <: Subscribable{L} where L refers to type of source stream\n\nExamples\n\nusing Rocket\n\nsource = from([ 1, 2, 3 ])\nsubscribe!(source |> skip_complete(), logger())\n;\n\n# output\n[LogActor] Data: 1\n[LogActor] Data: 2\n[LogActor] Data: 3\n\n\nSee also: AbstractOperator, InferableOperator, ProxyObservable, skip_error, skip_next, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/utility/skip_complete/#See-also","page":"skip_complete","title":"See also","text":"","category":"section"},{"location":"operators/utility/skip_complete/","page":"skip_complete","title":"skip_complete","text":"Operators","category":"page"},{"location":"operators/transformation/start_with/#operator_start_with","page":"start_with","title":"StartWith Operator","text":"","category":"section"},{"location":"operators/transformation/start_with/","page":"start_with","title":"start_with","text":"start_with","category":"page"},{"location":"operators/transformation/start_with/#Rocket.start_with","page":"start_with","title":"Rocket.start_with","text":"start_with(object::O) where O\n\nCreates a start_with operator, which forces an observable to emit given object as a first value.\n\nProducing\n\nStream of type <: Subscribable{Union{L, O}} where L refers to type of source stream <: Subscribable{L}\n\nExamples\n\nusing Rocket\n\nsource = from(1:3) |> start_with(0)\nsubscribe!(source, logger())\n;\n\n# output\n\n[LogActor] Data: 0\n[LogActor] Data: 1\n[LogActor] Data: 2\n[LogActor] Data: 3\n[LogActor] Completed\n\nSee also: AbstractOperator, InferableOperator, ProxyObservable, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/transformation/start_with/#See-also","page":"start_with","title":"See also","text":"","category":"section"},{"location":"operators/transformation/start_with/","page":"start_with","title":"start_with","text":"Operators","category":"page"},{"location":"actors/types/server/#actor_server","page":"Server","title":"Server actor","text":"","category":"section"},{"location":"actors/types/server/","page":"Server","title":"Server","text":"server","category":"page"},{"location":"actors/types/server/#Rocket.server","page":"Server","title":"Rocket.server","text":"server(port::Int)\nserver(address::A, port::Int) where { A <: IPAddr }\nserver(::Type{D}, port::Int)\nserver(::Type{D}, address::A, port::Int) where { A <: IPAddr }\n\nCreation operator for the ServerActor actor.\n\nSee also: AbstractActor\n\n\n\n\n\n","category":"function"},{"location":"actors/types/server/","page":"Server","title":"Server","text":"ServerActor","category":"page"},{"location":"actors/types/server/#Rocket.ServerActor","page":"Server","title":"Rocket.ServerActor","text":"ServerActor{D, Address, Port}() where D\n\nThe ServerActor sends all next!/error!/complete! events to the local network listeners with specified Address and Port parameters via TCPSocket.\n\nSee also: Actor, server\n\n\n\n\n\n","category":"type"},{"location":"operators/transformation/exhaust_map/#operator_exhaust_map","page":"exhaust_map","title":"ExhaustMap Operator","text":"","category":"section"},{"location":"operators/transformation/exhaust_map/","page":"exhaust_map","title":"exhaust_map","text":"exhaust_map","category":"page"},{"location":"operators/transformation/exhaust_map/#Rocket.exhaust_map","page":"exhaust_map","title":"Rocket.exhaust_map","text":"exhaust_map(::Type{R}, mappingFn::F = identity) where { R, F <: Function }\n\nCreates a exhaust_map operator, which returns an Observable containing projected Observables of each item of the source, ignoring projected Observables that start before their preceding Observable has completed. Essentially it projects each source value to an Observable which is merged in the output Observable only if the previous projected Observable has completed.\n\nArguments\n\n::Type{R}: the type of data of output Observables after projection with mappingFn\nmappingFn::F: projection function with (data) -> Observable{R} signature\n\nProducing\n\nStream of type <: Subscribable{R}\n\nExamples\n\nusing Rocket\n\nsource = from([ 0, 0 ]) |> async() |> exhaust_map(Int, d -> from([ 1, 2 ]) |> async())\nsubscribe!(source, logger())\n;\n\n# output\n\n[LogActor] Data: 1\n[LogActor] Data: 2\n[LogActor] Completed\n\nSee also: AbstractOperator, RightTypedOperator, ProxyObservable, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/transformation/exhaust_map/#See-also","page":"exhaust_map","title":"See also","text":"","category":"section"},{"location":"operators/transformation/exhaust_map/","page":"exhaust_map","title":"exhaust_map","text":"Operators","category":"page"},{"location":"operators/utility/ref_count/#operator_ref_count","page":"ref_count","title":"Ref Count Operator","text":"","category":"section"},{"location":"operators/utility/ref_count/","page":"ref_count","title":"ref_count","text":"ref_count","category":"page"},{"location":"operators/utility/ref_count/#Rocket.ref_count","page":"ref_count","title":"Rocket.ref_count","text":"ref_count()\n\nMake a ConnectableObservable behave like a ordinary observable and automates the way you can connect to it. Internally it counts the subscriptions to the observable and subscribes (only once) to the source if the number of subscriptions is larger than 0. If the number of subscriptions is smaller than 1, it unsubscribes from the source. This way you can make sure that everything before the published refCount has only a single subscription independently of the number of subscribers to the target observable.\n\nNote that using the share operator is exactly the same as using the publish operator (making the observable hot) and the ref_count() operator in a sequence.\n\nExample\n\nusing Rocket\n\nsubject = Subject(Int, scheduler = AsapScheduler())\nsource = from(1:5) |> multicast(subject) |> ref_count()\n\nactor1 = logger(\"1\")\nactor2 = logger(\"2\")\n\nsubscription1 = subscribe!(source, actor1)\nsubscription2 = subscribe!(source, actor2)\n\nunsubscribe!(subscription1)\nunsubscribe!(subscription2)\n;\n\n# output\n[1] Data: 1\n[1] Data: 2\n[1] Data: 3\n[1] Data: 4\n[1] Data: 5\n[1] Completed\n[2] Completed\n\nSee also: AbstractOperator, publish, multicast, share\n\n\n\n\n\n","category":"function"},{"location":"operators/utility/ref_count/#See-also","page":"ref_count","title":"See also","text":"","category":"section"},{"location":"operators/utility/ref_count/","page":"ref_count","title":"ref_count","text":"Operators","category":"page"},{"location":"actors/types/keep/#actor_keep","page":"Keep","title":"Keep actor","text":"","category":"section"},{"location":"actors/types/keep/","page":"Keep","title":"Keep","text":"keep","category":"page"},{"location":"actors/types/keep/#Rocket.keep","page":"Keep","title":"Rocket.keep","text":"keep(::Type{T}) where T\n\nArguments\n\n::Type{T}: Type of keep data\n\nCreation operator for the KeepActor actor.\n\nExamples\n\nusing Rocket\n\nactor = keep(Int)\nactor isa KeepActor{Int}\n\n# output\ntrue\n\nSee also: KeepActor, AbstractActor\n\n\n\n\n\n","category":"function"},{"location":"actors/types/keep/","page":"Keep","title":"Keep","text":"KeepActor","category":"page"},{"location":"actors/types/keep/#Rocket.KeepActor","page":"Keep","title":"Rocket.KeepActor","text":"KeepActor{D}() where D\n\nKeep actor provides a storage actor. It saves all incoming successful next events in a values array, throws an ErrorException on error! event and does nothing on completion event.\n\nExamples\n\nusing Rocket\n\nsource = from(1:5)\nactor = keep(Int)\n\nsubscribe!(source, actor)\nshow(getvalues(actor))\n\n# output\n[1, 2, 3, 4, 5]\n\nSee also: Actor, keep\n\n\n\n\n\n","category":"type"},{"location":"observables/types/collected/#observable_collected","page":"Collected","title":"Collected Observable","text":"","category":"section"},{"location":"observables/types/collected/","page":"Collected","title":"Collected","text":"collectLatest","category":"page"},{"location":"observables/types/collected/#Rocket.collectLatest","page":"Collected","title":"Rocket.collectLatest","text":"collectLatest(sources::S, mappingFn::F = copy, callbackFn::C = nothing)\ncollectLatest(::Type{T}, ::Type{R}, sources::S, mappingFn::F = copy, callbackFn::C = nothing)\n\nCollects values from multible Observables and emits it in one single array every time each inner Observable has a new value. Reemits errors from inner observables. Completes when all inner observables completes.\n\nArguments\n\nsources: input sources\nmappingFn: optional mappingFn applied to an array of emited values, copy by default, should return a Vector\ncallbackFn: optional callback function, which is called right after mappingFn has been evaluated, accepts the state of the inner actor and the computed value, nothing by default\n\nNote: collectLatest completes immediately if sources are empty.\n\nOptional arguments\n\n::Type{T}: optional type of emmiting values of inner observables\n::Type{R}: optional return type after applying mappingFn to a vector of values\n\nExamples\n\nusing Rocket\n\ncollected = collectLatest([ of(1), from([ 1, 2 ]) ])\n\nsubscribe!(collected, logger())\n;\n\n# output\n\n[LogActor] Data: [1, 1]\n[LogActor] Data: [1, 2]\n[LogActor] Completed\n\nSee also: Subscribable, subscribe!, combineLatest\n\n\n\n\n\n","category":"function"},{"location":"observables/types/collected/#Description","page":"Collected","title":"Description","text":"","category":"section"},{"location":"observables/types/collected/","page":"Collected","title":"Collected","text":"collectLatest collects the values from all Observables in its vector argument. This is done by subscribing to each Observable in order and, whenever an Observable emits, collecting a vector of the most recent values from each Observable (in order). If you pass n Observables to collectLatest, the returned Observable will always emit an ordered vector of n values.","category":"page"},{"location":"observables/types/collected/","page":"Collected","title":"Collected","text":"To ensure that the output vector has a consistent length, collectLatest waits for all input Observables to emit at least once before it starts emitting results. This means that if some Observable emits values before other Observables started emitting, all these values but the last will be lost. On the other hand, if some Observable does not emit a value but completes, the resulting Observable will complete simultaneously without emitting anything. Furthermore, if some input Observable does not emit any value and never completes, collectLatest will also never emit and never complete.","category":"page"},{"location":"observables/types/collected/","page":"Collected","title":"Collected","text":"If at least one Observable was passed to collectLatest and all passed Observables emitted, then the resulting Observable will complete when all combined streams complete. So even if some Observable completes, the result of collectLatest will still emit values when the other Observables do. In case of a completed Observable, its value will now remain to be the last emitted value. On the other hand, if any Observable errors, collectLatest will also immediately error.","category":"page"},{"location":"observables/types/defer/#observable_defer","page":"Defer","title":"Defer Observable","text":"","category":"section"},{"location":"observables/types/defer/","page":"Defer","title":"Defer","text":"defer","category":"page"},{"location":"observables/types/defer/#Rocket.defer","page":"Defer","title":"Rocket.defer","text":"defer(::Type{D}, factoryFn::F) where { D, F <: Function }\n\nCreates an Observable that, on subscribe, calls an Observable factory to make an Observable for each new Observer.\n\nArguments\n\nT: type of output data source, created by the factoryFn\nfactoryFn: the Observable factory function to invoke for each Observer that subscribes to the output Observable\n\nExamples\n\nusing Rocket\n\nsource = defer(Int, () -> from([ 1, 2, 3 ]))\n\nsubscribe!(source, logger())\n;\n\n# output\n[LogActor] Data: 1\n[LogActor] Data: 2\n[LogActor] Data: 3\n[LogActor] Completed\n\nSee also: Subscribable, subscribe!, logger\n\n\n\n\n\n","category":"function"},{"location":"observables/types/defer/#Description","page":"Defer","title":"Description","text":"","category":"section"},{"location":"observables/types/defer/","page":"Defer","title":"Defer","text":"defer allows you to create the Observable only when the Actor subscribes, and create a fresh Observable for each Actor. It waits until an Actor subscribes to it, and then it generates an Observable, typically with an Observable factory function. It does this afresh for each subscriber, so although each subscriber may think it is subscribing to the same Observable, in fact each subscriber gets its own individual Observable.","category":"page"},{"location":"operators/filtering/last/#operator_last","page":"last","title":"Last Operator","text":"","category":"section"},{"location":"operators/filtering/last/","page":"last","title":"last","text":"last","category":"page"},{"location":"operators/filtering/last/#Base.last","page":"last","title":"Base.last","text":"last(; default = nothing)\n\nCreates a last operator, which returns an Observable that emits only the last item emitted by the source Observable. Sends LastNotFoundException error message if a given source completes without emitting a single value.\n\nArguments\n\ndefault: an optional default value to provide if no values were emitted\n\nProducing\n\nStream of type <: Subscribable{L} where L refers to type of source stream\n\nExamples\n\nusing Rocket\n\nsource = from([ 1, 2, 3 ])\nsubscribe!(source |> last(), logger())\n;\n\n# output\n\n[LogActor] Data: 3\n[LogActor] Completed\n\n\nusing Rocket\n\nsource = from(Int[])\nsubscribe!(source |> last() |> catch_error((err, obs) -> of(1)), logger())\n;\n\n# output\n\n[LogActor] Data: 1\n[LogActor] Completed\n\nusing Rocket\n\nsource = from(Int[])\nsubscribe!(source |> last(default = 1), logger())\n;\n\n# output\n\n[LogActor] Data: 1\n[LogActor] Completed\n\nSee also: AbstractOperator, InferableOperator, ProxyObservable, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/filtering/last/#Description","page":"last","title":"Description","text":"","category":"section"},{"location":"operators/filtering/last/","page":"last","title":"last","text":"last operator returns an Observable that emits only the last item emitted by the source Observable.","category":"page"},{"location":"operators/filtering/last/#See-also","page":"last","title":"See also","text":"","category":"section"},{"location":"operators/filtering/last/","page":"last","title":"last","text":"Operators","category":"page"},{"location":"operators/utility/tap_on_subscribe/#operator_tap_on_subscribe","page":"tap_on_subscribe","title":"TapOnSubscribe Operator","text":"","category":"section"},{"location":"operators/utility/tap_on_subscribe/","page":"tap_on_subscribe","title":"tap_on_subscribe","text":"TapBeforeSubscription\nTapAfterSubscription\ntap_on_subscribe","category":"page"},{"location":"operators/utility/tap_on_subscribe/#Rocket.TapBeforeSubscription","page":"tap_on_subscribe","title":"Rocket.TapBeforeSubscription","text":"TapBeforeSubscription\n\nOne of the strategies for tap_on_subscribe operator. With TapBeforeSubscription tap callback will be called before actual subscription.\n\nSee also: tap_on_subscribe, TapAfterSubscription\n\n\n\n\n\n","category":"type"},{"location":"operators/utility/tap_on_subscribe/#Rocket.TapAfterSubscription","page":"tap_on_subscribe","title":"Rocket.TapAfterSubscription","text":"TapAfterSubscription\n\nOne of the strategies for tap_on_subscribe operator. With TapBeforeSubscription tap callback will be called after actual subscription.\n\nSee also: tap_on_subscribe, TapBeforeSubscription\n\n\n\n\n\n","category":"type"},{"location":"operators/utility/tap_on_subscribe/#Rocket.tap_on_subscribe","page":"tap_on_subscribe","title":"Rocket.tap_on_subscribe","text":"tap_on_subscribe(tapFn::F, strategy::S = TapBeforeSubscription()) where { F <: Function }\n\nCreates a tap operator, which performs a side effect on the subscription on the source Observable, but return an Observable that is identical to the source.\n\nArguments\n\ntapFn::Function: side-effect tap function with () -> Nothing signature\nstrategy: (optional), specifies the order of a side-effect and an actual subscription, uses TapBeforeSubscription by default\n\nProducing\n\nStream of type <: Subscribable{L} where L refers to type of source stream\n\nExamples\n\nusing Rocket\n\nsource = from([ 1, 2, 3 ])\nsubscribe!(source |> tap_on_subscribe(() -> println(\"Someone subscribed\")), logger())\n;\n\n# output\n\nSomeone subscribed\n[LogActor] Data: 1\n[LogActor] Data: 2\n[LogActor] Data: 3\n[LogActor] Completed\n\nusing Rocket\n\nsource = from([ 1, 2, 3 ])\nsubscribe!(source |> tap_on_subscribe(() -> println(\"Someone subscribed\"), TapAfterSubscription()), logger())\n;\n\n# output\n\n[LogActor] Data: 1\n[LogActor] Data: 2\n[LogActor] Data: 3\n[LogActor] Completed\nSomeone subscribed\n\nSee also: TapBeforeSubscription, TapAfterSubscription, tap, tap_on_unsubscribe, tap_on_complete, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/utility/tap_on_subscribe/#Description","page":"tap_on_subscribe","title":"Description","text":"","category":"section"},{"location":"operators/utility/tap_on_subscribe/","page":"tap_on_subscribe","title":"tap_on_subscribe","text":"Returns an Observable that resembles the source Observable, but modifies it so that the provided Observer is called to perform a side effect on subscription to the source.","category":"page"},{"location":"operators/utility/tap_on_subscribe/","page":"tap_on_subscribe","title":"tap_on_subscribe","text":"This operator is useful for debugging your Observables, verifying correctness, or performing other side effects.","category":"page"},{"location":"operators/utility/tap_on_subscribe/","page":"tap_on_subscribe","title":"tap_on_subscribe","text":"Note: this operator differs from a subscribe on the Observable. If the Observable returned by tap_on_subscribe is not subscribed, the side effects specified by the Observer will never happen. tap_on_subscribe therefore simply spies on future execution, it does not trigger an execution to happen like subscribe does.","category":"page"},{"location":"operators/utility/tap_on_subscribe/#See-also","page":"tap_on_subscribe","title":"See also","text":"","category":"section"},{"location":"operators/utility/tap_on_subscribe/","page":"tap_on_subscribe","title":"tap_on_subscribe","text":"Operators","category":"page"},{"location":"operators/utility/safe/#operator_safe","page":"safe","title":"Safe Operator","text":"","category":"section"},{"location":"operators/utility/safe/","page":"safe","title":"safe","text":"safe","category":"page"},{"location":"operators/utility/safe/#Rocket.safe","page":"safe","title":"Rocket.safe","text":"safe()\n\nCreates a SafeOperator, which wraps on_subscribe! and each next!, error! and complete! callbacks into try-catch block.\n\nProducing\n\nStream of type <: Subscribable{L} where L refers to type of source stream\n\nSee also: AbstractOperator, InferableOperator, ProxyObservable, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/utility/safe/#See-also","page":"safe","title":"See also","text":"","category":"section"},{"location":"operators/utility/safe/","page":"safe","title":"safe","text":"Operators","category":"page"},{"location":"operators/utility/skip_next/#operator_skip_next","page":"skip_next","title":"SkipNext Operator","text":"","category":"section"},{"location":"operators/utility/skip_next/","page":"skip_next","title":"skip_next","text":"skip_next","category":"page"},{"location":"operators/utility/skip_next/#Rocket.skip_next","page":"skip_next","title":"Rocket.skip_next","text":"skip_next()\n\nCreates a skip_next operator, which filters out all next messages by the source Observable by emitting only error and complete messages.\n\nProducing\n\nStream of type <: Subscribable{L} where L refers to type of source stream\n\nExamples\n\nusing Rocket\n\nsource = from([ 1, 2, 3 ])\nsubscribe!(source |> skip_next(), logger())\n;\n\n# output\n[LogActor] Completed\n\n\nSee also: AbstractOperator, InferableOperator, ProxyObservable, skip_error, skip_complete, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/utility/skip_next/#See-also","page":"skip_next","title":"See also","text":"","category":"section"},{"location":"operators/utility/skip_next/","page":"skip_next","title":"skip_next","text":"Operators","category":"page"},{"location":"operators/transformation/switch_map/#operator_switch_map","page":"switch_map","title":"SwitchMap Operator","text":"","category":"section"},{"location":"operators/transformation/switch_map/","page":"switch_map","title":"switch_map","text":"switch_map","category":"page"},{"location":"operators/transformation/switch_map/#Rocket.switch_map","page":"switch_map","title":"Rocket.switch_map","text":"switch_map(::Type{R}, mappingFn::F = identity) where { R, F <: Function }\n\nCreates a switch_map operator, which returns an Observable that emits items based on applying a function mappingFn that you supply to each item emitted by the source Observable, where that function returns an (so-called \"inner\") Observable. Each time it observes one of these inner Observables, the output Observable begins emitting the items emitted by that inner Observable. When a new inner Observable is emitted, switch_map stops emitting items from the earlier-emitted inner Observable and begins emitting items from the new one. It continues to behave like this for subsequent inner Observables.\n\nArguments\n\n::Type{R}: the type of data of output Observables after projection with mappingFn\nmappingFn::F: projection function with (data) -> Observable{R} signature\n\nProducing\n\nStream of type <: Subscribable{R}\n\nExamples\n\nusing Rocket\n\nsource = from([ of(1), of(2), of(3) ])\nsubscribe!(source |> switch_map(Int), logger())\n;\n\n# output\n\n[LogActor] Data: 1\n[LogActor] Data: 2\n[LogActor] Data: 3\n[LogActor] Completed\n\nusing Rocket\n\nsource = from([ 1, 2, 3 ])\nsubscribe!(source |> switch_map(Float64, (d) -> of(convert(Float64, d ^ 2))), logger())\n;\n\n# output\n\n[LogActor] Data: 1.0\n[LogActor] Data: 4.0\n[LogActor] Data: 9.0\n[LogActor] Completed\n\nSee also: AbstractOperator, RightTypedOperator, ProxyObservable, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/transformation/switch_map/#See-also","page":"switch_map","title":"See also","text":"","category":"section"},{"location":"operators/transformation/switch_map/","page":"switch_map","title":"switch_map","text":"Operators","category":"page"},{"location":"api/actors/#actors_api","page":"Actors","title":"Actors API","text":"","category":"section"},{"location":"api/actors/#How-to-create-a-custom-Actor","page":"Actors","title":"How to create a custom Actor","text":"","category":"section"},{"location":"api/actors/","page":"Actors","title":"Actors","text":"At first custom actor should implement a custom method for the as_actor function. Rocket.jl also provides a number of helper actor abstract types with predefined as_actor method behavior (see Traits API section).","category":"page"},{"location":"api/actors/","page":"Actors","title":"Actors","text":"using Rocket\n\nstruct MyCustomActor end\n\nas_actor(::Type{<:MyCustomActor}) = Rocket.BaseActorTrait{Int}()\n","category":"page"},{"location":"api/actors/","page":"Actors","title":"Actors","text":"or","category":"page"},{"location":"api/actors/","page":"Actors","title":"Actors","text":"using Rocket\n\nstruct MyCustomActor <: Actor{Int} end # Automatically specifies BaseActorTrait{Int} behavior.","category":"page"},{"location":"api/actors/","page":"Actors","title":"Actors","text":"Additionally custom actor must provide a custom methods for on_next!, on_error! and/or on_complete! functions. Depending on specified actor trait behavior some methods may or may not be optional.","category":"page"},{"location":"api/actors/","page":"Actors","title":"Actors","text":"using Rocket\n\nstruct MyCustomActor <: Actor{Int} end\n\nRocket.on_next!(actor::MyCustomActor, data::Int) = # custom logic here\nRocket.on_error!(actor::MyCustomActor, err) = # custom logic here\nRocket.on_complete!(actor::MyCustomActor) = # custom logic here","category":"page"},{"location":"api/actors/","page":"Actors","title":"Actors","text":"or","category":"page"},{"location":"api/actors/","page":"Actors","title":"Actors","text":"using Rocket\n\nstruct MyCustomCompletionActor <: CompletionActor{Int} end\n\nRocket.on_complete!(actor::MyCustomCompletionActor) = # custom logic here","category":"page"},{"location":"api/actors/#actors_api_traits","page":"Actors","title":"Traits","text":"","category":"section"},{"location":"api/actors/","page":"Actors","title":"Actors","text":"as_actor\nActorTrait\nBaseActorTrait\nNextActorTrait\nErrorActorTrait\nCompletionActorTrait\nInvalidActorTrait","category":"page"},{"location":"api/actors/#Rocket.as_actor","page":"Actors","title":"Rocket.as_actor","text":"as_actor(any)\n\nThis function checks actor trait behavior specification. May be used explicitly to specify actor trait behavior for any object.\n\nSee also: ActorTrait\n\n\n\n\n\n","category":"function"},{"location":"api/actors/#Rocket.ActorTrait","page":"Actors","title":"Rocket.ActorTrait","text":"Abstract type for all possible actor traits\n\nSee also: BaseActorTrait, NextActorTrait, ErrorActorTrait, CompletionActorTrait, InvalidActorTrait\n\n\n\n\n\n","category":"type"},{"location":"api/actors/#Rocket.BaseActorTrait","page":"Actors","title":"Rocket.BaseActorTrait","text":"Base actor trait specifies actor to listen for all next!, error! and complete! events. BaseActorTrait is a subtype of ActorTrait.\n\nSee also: Actor\n\n\n\n\n\n","category":"type"},{"location":"api/actors/#Rocket.NextActorTrait","page":"Actors","title":"Rocket.NextActorTrait","text":"Next actor trait specifies actor to listen for next! events only. NextActorTrait is a subtype of ActorTrait.\n\nSee also: NextActor\n\n\n\n\n\n","category":"type"},{"location":"api/actors/#Rocket.ErrorActorTrait","page":"Actors","title":"Rocket.ErrorActorTrait","text":"Error actor trait specifies actor to listen for error! events only. ErrorActorTrait is a subtype of ActorTrait.\n\nSee also: ErrorActor\n\n\n\n\n\n","category":"type"},{"location":"api/actors/#Rocket.CompletionActorTrait","page":"Actors","title":"Rocket.CompletionActorTrait","text":"Completion actor trait specifies actor to listen for complete! events only. CompletionActorTrait is a subtype of ActorTrait.\n\nSee also: CompletionActor\n\n\n\n\n\n","category":"type"},{"location":"api/actors/#Rocket.InvalidActorTrait","page":"Actors","title":"Rocket.InvalidActorTrait","text":"Default actor trait behavior for any object. Actor with such a trait specificaion cannot be used as a valid actor in subscribe! function. Doing so will raise an error. InvalidActorTrait is a subtype of ActorTrait.\n\nSee also: ActorTrait\n\n\n\n\n\n","category":"type"},{"location":"api/actors/#Types","page":"Actors","title":"Types","text":"","category":"section"},{"location":"api/actors/","page":"Actors","title":"Actors","text":"AbstractActor\nActor\nNextActor\nErrorActor\nCompletionActor","category":"page"},{"location":"api/actors/#Rocket.AbstractActor","page":"Actors","title":"Rocket.AbstractActor","text":"Supertype type for Actor, NextActor, ErrorActor and CompletionActor types.\n\nSee also: Actor, NextActor, ErrorActor, CompletionActor\n\n\n\n\n\n","category":"type"},{"location":"api/actors/#Rocket.Actor","page":"Actors","title":"Rocket.Actor","text":"Can be used as a super type for common actor. Automatically specifies a BaseActorTrait trait behavior. Every Actor must implement its own methods for on_next!(actor, data), on_error!(actor, err) and on_complete!(actor) functions. Actor is a subtype of AbstractActor type.\n\nExamples\n\nusing Rocket\n\nstruct MyActor <: Actor{String} end\n\nRocket.as_actor(MyActor)\n\n# output\n\nBaseActorTrait{String}()\n\nSee also: AbstractActor, as_actor, BaseActorTrait, ActorTrait, on_next!, on_error!, on_complete!\n\n\n\n\n\n","category":"type"},{"location":"api/actors/#Rocket.NextActor","page":"Actors","title":"Rocket.NextActor","text":"Can be used as a super type for \"next-only\" actor. Automatically specifies a NextActorTrait trait behavior. Every NextActor must implement its own methods for on_next!(actor, data) function only. NextActor is a subtype of AbstractActor type.\n\nExamples\n\nusing Rocket\n\nstruct MyNextActor <: NextActor{String} end\n\nRocket.as_actor(MyNextActor)\n\n# output\n\nNextActorTrait{String}()\n\nSee also: AbstractActor, as_actor, NextActorTrait, ActorTrait, on_next!\n\n\n\n\n\n","category":"type"},{"location":"api/actors/#Rocket.ErrorActor","page":"Actors","title":"Rocket.ErrorActor","text":"Can be used as a super type for \"error-only\" actor. Automatically specifies a ErrorActorTrait trait behavior. Every ErrorActor must implement its own methods for on_error!(actor, err) function only. ErrorActor is a subtype of AbstractActor type.\n\nExamples\n\nusing Rocket\n\nstruct MyErrorActor <: ErrorActor{String} end\n\nRocket.as_actor(MyErrorActor)\n\n# output\n\nErrorActorTrait{String}()\n\nSee also: AbstractActor, as_actor, ErrorActorTrait, ActorTrait, on_error!\n\n\n\n\n\n","category":"type"},{"location":"api/actors/#Rocket.CompletionActor","page":"Actors","title":"Rocket.CompletionActor","text":"Can be used as a super type for \"completion-only\" actor. Automatically specifies a CompletionActorTrait trait behavior. Every CompletionActor must implement its own methods for on_complete!(actor) function only. CompletionActor is a subtype of AbstractActor type.\n\nExamples\n\nusing Rocket\n\nstruct MyCompletionActor <: CompletionActor{String} end\n\nRocket.as_actor(MyCompletionActor)\n\n# output\n\nCompletionActorTrait{String}()\n\nSee also: AbstractActor, as_actor, CompletionActorTrait, ActorTrait, on_complete!\n\n\n\n\n\n","category":"type"},{"location":"api/actors/#Events","page":"Actors","title":"Events","text":"","category":"section"},{"location":"api/actors/","page":"Actors","title":"Actors","text":"next!\nerror!\ncomplete!","category":"page"},{"location":"api/actors/#Rocket.next!","page":"Actors","title":"Rocket.next!","text":"next!(actor, data)\nnext!(actor, data, scheduler)\n\nThis function is used to deliver a \"next\" event to an actor with some data. Takes optional scheduler object to schedule execution of data delivery.\n\nSee also: AbstractActor, on_next!\n\n\n\n\n\n","category":"function"},{"location":"api/actors/#Rocket.error!","page":"Actors","title":"Rocket.error!","text":"error!(actor, err)\nerror!(actor, err, scheduler)\n\nThis function is used to deliver a \"error\" event to an actor with some err. Takes optional scheduler object to schedule execution of error delivery.\n\nSee also: AbstractActor, on_error!\n\n\n\n\n\n","category":"function"},{"location":"api/actors/#Rocket.complete!","page":"Actors","title":"Rocket.complete!","text":"complete!(actor)\ncomplete!(actor, scheduler)\n\nThis function is used to deliver a \"complete\" event to an actor. Takes optional scheduler object to schedule execution of complete event delivery.\n\nSee also: AbstractActor, on_complete!\n\n\n\n\n\n","category":"function"},{"location":"api/actors/","page":"Actors","title":"Actors","text":"on_next!\non_error!\non_complete!","category":"page"},{"location":"api/actors/#Rocket.on_next!","page":"Actors","title":"Rocket.on_next!","text":"on_next!(actor, data)\n\nBoth Actor and NextActor objects must implement its own method for on_next! function which will be called on \"next\" event.\n\nSee also: Actor, NextActor\n\n\n\n\n\n","category":"function"},{"location":"api/actors/#Rocket.on_error!","page":"Actors","title":"Rocket.on_error!","text":"on_error!(actor, err)\n\nBoth Actor and ErrorActor objects must implement its own method for on_error! function which will be called on \"error\" event.\n\nSee also: Actor, ErrorActor\n\n\n\n\n\n","category":"function"},{"location":"api/actors/#Rocket.on_complete!","page":"Actors","title":"Rocket.on_complete!","text":"on_complete!(actor)\n\nBoth Actor and CompletionActor objects must implement its own method for on_complete! function which will be called on \"complete\" event.\n\nSee also: Actor, CompletionActor\n\n\n\n\n\n","category":"function"},{"location":"api/actors/#Factory","page":"Actors","title":"Factory","text":"","category":"section"},{"location":"api/actors/","page":"Actors","title":"Actors","text":"AbstractActorFactory\ncreate_actor\nMissingCreateActorFactoryImplementationError","category":"page"},{"location":"api/actors/#Rocket.AbstractActorFactory","page":"Actors","title":"Rocket.AbstractActorFactory","text":"Abstract type for all possible actor factories\n\nSee also: Actor\n\n\n\n\n\n","category":"type"},{"location":"api/actors/#Rocket.create_actor","page":"Actors","title":"Rocket.create_actor","text":"create_actor(::Type{L}, factory::F) where { L, F <: AbstractActorFactory }\n\nActor creator function for a given factory F. Should be implemented explicitly for any AbstractActorFactory object\n\nSee also: AbstractActorFactory, MissingCreateActorFactoryImplementationError\n\n\n\n\n\n","category":"function"},{"location":"api/actors/#Rocket.MissingCreateActorFactoryImplementationError","page":"Actors","title":"Rocket.MissingCreateActorFactoryImplementationError","text":"This error will be throw if Julia cannot find specific method of 'create_actor()' function for given actor factory\n\nSee also: AbstractActorFactory, create_actor\n\n\n\n\n\n","category":"type"},{"location":"api/actors/#Errors","page":"Actors","title":"Errors","text":"","category":"section"},{"location":"api/actors/","page":"Actors","title":"Actors","text":"InvalidActorTraitUsageError\nInconsistentSourceActorDataTypesError\nMissingDataArgumentInNextCall\nMissingErrorArgumentInErrorCall\nExtraArgumentInCompleteCall\nMissingOnNextImplementationError\nMissingOnErrorImplementationError\nMissingOnCompleteImplementationError","category":"page"},{"location":"api/actors/#Rocket.InvalidActorTraitUsageError","page":"Actors","title":"Rocket.InvalidActorTraitUsageError","text":"This error will be thrown if next!, error! or complete! functions are called with invalid actor object\n\nSee also: next!, error!, complete!, InvalidActorTrait\n\n\n\n\n\n","category":"type"},{"location":"api/actors/#Rocket.InconsistentSourceActorDataTypesError","page":"Actors","title":"Rocket.InconsistentSourceActorDataTypesError","text":"This error will be thrown if next! function is called with inconsistent data type\n\nSee also: AbstractActor, Subscribable, next!\n\n\n\n\n\n","category":"type"},{"location":"api/actors/#Rocket.MissingDataArgumentInNextCall","page":"Actors","title":"Rocket.MissingDataArgumentInNextCall","text":"This error will be thrown if next! function is called without data argument\n\nSee also: next!\n\n\n\n\n\n","category":"type"},{"location":"api/actors/#Rocket.MissingErrorArgumentInErrorCall","page":"Actors","title":"Rocket.MissingErrorArgumentInErrorCall","text":"This error will be thrown if error! function is called without err argument\n\nSee also: error!\n\n\n\n\n\n","category":"type"},{"location":"api/actors/#Rocket.ExtraArgumentInCompleteCall","page":"Actors","title":"Rocket.ExtraArgumentInCompleteCall","text":"This error will be thrown if complete! function is called with extra data/err argument\n\nSee also: complete!\n\n\n\n\n\n","category":"type"},{"location":"api/actors/#Rocket.MissingOnNextImplementationError","page":"Actors","title":"Rocket.MissingOnNextImplementationError","text":"This error will be thrown if Julia cannot find specific method of 'on_next!()' function for given actor and data\n\nSee also: on_next!\n\n\n\n\n\n","category":"type"},{"location":"api/actors/#Rocket.MissingOnErrorImplementationError","page":"Actors","title":"Rocket.MissingOnErrorImplementationError","text":"This error will be thrown if Julia cannot find specific method of 'on_error!()' function for given actor\n\nSee also: on_error!\n\n\n\n\n\n","category":"type"},{"location":"api/actors/#Rocket.MissingOnCompleteImplementationError","page":"Actors","title":"Rocket.MissingOnCompleteImplementationError","text":"This error will be thrown if Julia cannot find specific method of 'on_complete!()' function for given actor and data\n\nSee also: on_next!\n\n\n\n\n\n","category":"type"},{"location":"observables/types/array/#observable_array","page":"Array","title":"Array Observable","text":"","category":"section"},{"location":"observables/types/array/","page":"Array","title":"Array","text":"from","category":"page"},{"location":"observables/types/array/#Rocket.from","page":"Array","title":"Rocket.from","text":"from(x; scheduler::H = AsapScheduler()) where { H <: AbstractScheduler }\nfrom(a::Vector{D}; scheduler::H = AsapScheduler()) where { D, H <: AbstractScheduler }\n\nCreation operator for the ArrayObservable that emits either a single value if x has a Scalar trait specification or a collection of values if x has a NonScalar trait specification. Throws an ErrorException if x has UndefinedScalarness trait type. To specify scalarness for arbitrary type T some can implement an additional method for scalarness(::Type{<:MyType}) function and to specify scalarness behavior. Optionally accepts custom scheduler-like object to schedule messages delivery.\n\nArguments\n\nx: an object to be wrapped into array of values\nscheduler: optional, scheduler-like object\n\nFor an object x to be a valid input for a from operator it must implement Rocket.scalarness(::Type{ <: T }) method which should return either Rocket.Scalar or Rocket.NonScalar objects. In first case from operator will treat x as a single scalar value and will wrap it into a vector while in the second case from operator will convert x object into an array using collect function.\n\nFor arbitrary iterable objects consider using iterable creation operator.\n\nNote\n\nfrom operators creates a copy of x using collect on a given object.\n\nExamples\n\nusing Rocket\n\nsource = from([ 0, 1, 2 ])\nsubscribe!(source, logger())\n;\n\n# output\n\n[LogActor] Data: 0\n[LogActor] Data: 1\n[LogActor] Data: 2\n[LogActor] Completed\n\n\nusing Rocket\n\nsource = from(( 0, 1, 2 ))\nsubscribe!(source, logger())\n;\n\n# output\n\n[LogActor] Data: 0\n[LogActor] Data: 1\n[LogActor] Data: 2\n[LogActor] Completed\n\n\nusing Rocket\n\nsource = from(0)\nsubscribe!(source, logger())\n;\n\n# output\n\n[LogActor] Data: 0\n[LogActor] Completed\n\n\nusing Rocket\n\nsource = from(\"Hello, world!\")\nsubscribe!(source, logger())\n;\n\n# output\n\n[LogActor] Data: H\n[LogActor] Data: e\n[LogActor] Data: l\n[LogActor] Data: l\n[LogActor] Data: o\n[LogActor] Data: ,\n[LogActor] Data:\n[LogActor] Data: w\n[LogActor] Data: o\n[LogActor] Data: r\n[LogActor] Data: l\n[LogActor] Data: d\n[LogActor] Data: !\n[LogActor] Completed\n\n\nSee also: ArrayObservable, subscribe!, logger, iterable\n\n\n\n\n\n","category":"function"},{"location":"observables/types/array/","page":"Array","title":"Array","text":"ArrayObservable","category":"page"},{"location":"observables/types/array/#Rocket.ArrayObservable","page":"Array","title":"Rocket.ArrayObservable","text":"ArrayObservable{D, H}(values::Vector{D}, scheduler::H) where { D, H }\n\nArrayObservable wraps a regular Julia array into an observable. Uses scheduler object to schedule messages delivery.\n\nConstructor arguments\n\nvalues: array of values to be wrapped\nscheduler: Scheduler-like object\n\nSee also: Subscribable, from\n\n\n\n\n\n","category":"type"},{"location":"api/teardown/#teardown_api","page":"Teardown","title":"Teardown API","text":"","category":"section"},{"location":"api/teardown/","page":"Teardown","title":"Teardown","text":"Any subscription-like object should implement a valid teardown logic.","category":"page"},{"location":"api/teardown/#Example","page":"Teardown","title":"Example","text":"","category":"section"},{"location":"api/teardown/","page":"Teardown","title":"Teardown","text":"using Rocket\n\nstruct MuCustomSubscription <: Teardown\n # some fields here\nend\n\nRocket.as_teardown(::Type{<:MuCustomSubscription}) = UnsubscribableTeardownLogic()\n\nfunction on_unsubscribe!(subscription::MyCustomSubscription)\n # dispose resources here\nend","category":"page"},{"location":"api/teardown/#Traits","page":"Teardown","title":"Traits","text":"","category":"section"},{"location":"api/teardown/","page":"Teardown","title":"Teardown","text":"TeardownLogic\nas_teardown\nUnsubscribableTeardownLogic\non_unsubscribe!\nCallableTeardownLogic\nVoidTeardownLogic\nInvalidTeardownLogic","category":"page"},{"location":"api/teardown/#Rocket.TeardownLogic","page":"Teardown","title":"Rocket.TeardownLogic","text":"Abstract type for all possible teardown logic traits.\n\nSee also: UnsubscribableTeardownLogic, CallableTeardownLogic, VoidTeardownLogic, InvalidTeardownLogic\n\n\n\n\n\n","category":"type"},{"location":"api/teardown/#Rocket.as_teardown","page":"Teardown","title":"Rocket.as_teardown","text":"as_teardown(::Type)\n\nThis function checks teardown trait behavior specification. Should be used explicitly to specify teardown logic trait behavior for any object.\n\nExamples\n\nusing Rocket\n\nstruct MySubscription <: Teardown end\n\nRocket.as_teardown(::Type{<:MySubscription}) = UnsubscribableTeardownLogic()\nRocket.on_unsubscribe!(s::MySubscription) = println(\"Unsubscribed!\")\n\nsubscription = MySubscription()\nunsubscribe!(subscription)\n;\n\n# output\n\nUnsubscribed!\n\nSee also: Teardown, TeardownLogic\n\n\n\n\n\n","category":"function"},{"location":"api/teardown/#Rocket.UnsubscribableTeardownLogic","page":"Teardown","title":"Rocket.UnsubscribableTeardownLogic","text":"Unsubscribable teardown logic trait behavior. Unsubscribable teardown object must define its own method for on_unsubscribe!() function which will be invoked when actor decides to unsubscribe! from Observable.\n\nSee also: TeardownLogic, on_unsubscribe!, unsubscribe!\n\n\n\n\n\n","category":"type"},{"location":"api/teardown/#Rocket.on_unsubscribe!","page":"Teardown","title":"Rocket.on_unsubscribe!","text":"on_unsubscribe!(teardown)\n\nEach valid teardown object with UnsubscribableTeardownLogic trait behavior must implement its own method for on_unsubscribe!() function which will be invoked when actor decides to unsubscribe! from Observable.\n\nSee also: Teardown, TeardownLogic, UnsubscribableTeardownLogic\n\n\n\n\n\n","category":"function"},{"location":"api/teardown/#Rocket.CallableTeardownLogic","page":"Teardown","title":"Rocket.CallableTeardownLogic","text":"Callable teardown logic trait behavior. Callable teardown object must be callable (insert meme with a surprised Pikachu here).\n\nSee also: TeardownLogic, on_unsubscribe!, unsubscribe!\n\n\n\n\n\n","category":"type"},{"location":"api/teardown/#Rocket.VoidTeardownLogic","page":"Teardown","title":"Rocket.VoidTeardownLogic","text":"Void teardown logic trait behavior. Void teardown object does nothing in unsubscribe! and may not define any additional methods.\n\nSee also: TeardownLogic, on_unsubscribe!, unsubscribe!\n\n\n\n\n\n","category":"type"},{"location":"api/teardown/#Rocket.InvalidTeardownLogic","page":"Teardown","title":"Rocket.InvalidTeardownLogic","text":"Default teardown logic trait behavour. Invalid teardwon object cannot be used in unsubscribe! function. Doing so will raise an error.\n\nSee also: TeardownLogic, on_unsubscribe!, unsubscribe!\n\n\n\n\n\n","category":"type"},{"location":"api/teardown/#Types","page":"Teardown","title":"Types","text":"","category":"section"},{"location":"api/teardown/","page":"Teardown","title":"Teardown","text":"Teardown\nunsubscribe!","category":"page"},{"location":"api/teardown/#Rocket.Teardown","page":"Teardown","title":"Rocket.Teardown","text":"Abstract type for any teardown object. Each teardown object must be a subtype of Teardown.\n\nSee also: TeardownLogic\n\n\n\n\n\n","category":"type"},{"location":"api/teardown/#Rocket.unsubscribe!","page":"Teardown","title":"Rocket.unsubscribe!","text":"unsubscribe!(subscription)\nunsubscribe!(subscriptions::Tuple)\nunsubscribe!(subscriptions::AbstractVector)\n\nunsubscribe! function is used to cancel Observable execution and to dispose any kind of resources used during an Observable execution. If the input argument to the unsubscribe! function is either a tuple or a vector, it will first check that all of the arguments are valid subscription objects and if its true will unsubscribe from each of them individually. \n\nSee also: Teardown, TeardownLogic, on_unsubscribe!\n\n\n\n\n\n","category":"function"},{"location":"api/teardown/#Errors","page":"Teardown","title":"Errors","text":"","category":"section"},{"location":"api/teardown/","page":"Teardown","title":"Teardown","text":"InvalidTeardownLogicTraitUsageError\nInvalidMultipleTeardownLogicTraitUsageError\nMissingOnUnsubscribeImplementationError","category":"page"},{"location":"api/teardown/#Rocket.InvalidTeardownLogicTraitUsageError","page":"Teardown","title":"Rocket.InvalidTeardownLogicTraitUsageError","text":"This error will be thrown if unsubscribe! function is called with invalid teardown object.\n\nSee also: unsubscribe!\n\n\n\n\n\n","category":"type"},{"location":"api/teardown/#Rocket.InvalidMultipleTeardownLogicTraitUsageError","page":"Teardown","title":"Rocket.InvalidMultipleTeardownLogicTraitUsageError","text":"This error will be thrown if unsubscribe! function is called with a tuple with invalid teardown object in it.\n\nSee also: unsubscribe!\n\n\n\n\n\n","category":"type"},{"location":"api/teardown/#Rocket.MissingOnUnsubscribeImplementationError","page":"Teardown","title":"Rocket.MissingOnUnsubscribeImplementationError","text":"This error will be thrown if Julia cannot find specific method of on_unsubscribe!() function for given teardown object.\n\nSee also: on_unsubscribe!\n\n\n\n\n\n","category":"type"},{"location":"operators/transformation/accumulated/#operator_accumulated","page":"accumulated","title":"Accumulated Operator","text":"","category":"section"},{"location":"operators/transformation/accumulated/","page":"accumulated","title":"accumulated","text":"accumulated","category":"page"},{"location":"operators/transformation/accumulated/#Rocket.accumulated","page":"accumulated","title":"Rocket.accumulated","text":"accumulated()\n\nCreates an accumulated operator, which returns an Observable that emits the current item with all of the previous items emitted by the source Observable in one single ordered array.\n\nProducing\n\nStream of type <: Subscribable{Vector{L}} where L refers to type of source stream\n\nExamples\n\nusing Rocket\n\nsource = from([ 1, 2, 3 ])\nsubscribe!(source |> accumulated(), logger())\n;\n\n# output\n\n[LogActor] Data: [1]\n[LogActor] Data: [1, 2]\n[LogActor] Data: [1, 2, 3]\n[LogActor] Completed\n\n\nusing Rocket\n\nsource = of(1)\nsubscribe!(source |> accumulated(), logger())\n;\n\n# output\n\n[LogActor] Data: [1]\n[LogActor] Completed\n\nSee also: AbstractOperator, InferableOperator, ProxyObservable, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/transformation/accumulated/#Description","page":"accumulated","title":"Description","text":"","category":"section"},{"location":"operators/transformation/accumulated/","page":"accumulated","title":"accumulated","text":"Combines all values emitted by the source, using an accumulator function that joins a new source value with the all past values emmited into one single array. This is similar to scan with vcat accumulation function.","category":"page"},{"location":"operators/transformation/accumulated/#See-also","page":"accumulated","title":"See also","text":"","category":"section"},{"location":"operators/transformation/accumulated/","page":"accumulated","title":"accumulated","text":"Operators","category":"page"},{"location":"operators/mathematical/max/#operator_max","page":"max","title":"Max Operator","text":"","category":"section"},{"location":"operators/mathematical/max/","page":"max","title":"max","text":"max","category":"page"},{"location":"operators/mathematical/max/#Base.max","page":"max","title":"Base.max","text":"max(; from = nothing)\n\nCreates a max operator, which emits a single item: the item with the largest value.\n\nArguments\n\nfrom: optional initial maximum value, if nothing first item from the source will be used as initial instead\n\nProducing\n\nStream of type <: Subscribable{Union{L, Nothing}} where L refers to type of source stream\n\nExamples\n\nusing Rocket\n\nsource = from([ i for i in 1:42 ])\nsubscribe!(source |> max(), logger())\n;\n\n# output\n\n[LogActor] Data: 42\n[LogActor] Completed\n\n\nSee also: AbstractOperator, InferableOperator, ProxyObservable, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/mathematical/max/#Description","page":"max","title":"Description","text":"","category":"section"},{"location":"operators/mathematical/max/","page":"max","title":"max","text":"The max operator operates on an Observable of similar objects. When the source Observable completes, it emits the item with the largest value.","category":"page"},{"location":"operators/mathematical/max/#See-also","page":"max","title":"See also","text":"","category":"section"},{"location":"operators/mathematical/max/","page":"max","title":"max","text":"Operators","category":"page"},{"location":"operators/errors/catch_error/#operator_catch_error","page":"catch_error","title":"Catch Error Operator","text":"","category":"section"},{"location":"operators/errors/catch_error/","page":"catch_error","title":"catch_error","text":"catch_error","category":"page"},{"location":"operators/errors/catch_error/#Rocket.catch_error","page":"catch_error","title":"Rocket.catch_error","text":"catch_error(selectorFn::F) where F\n\nCreates a CatchErrorOperator, which catches errors on the observable to be handled by returning a new observable or throwing an error.\n\nArguments:\n\nselectorFn::F: a callable object that takes as arguments err, which is the error, and caught, which is the source observable, in case you'd like to \"retry\" that observable by returning it again. Whatever observable is returned by the selector will be used to continue the observable chain.\n\nProducing\n\nStream of type <: Subscribable{L} where L refers to type of source stream\n\nExamples\n\nusing Rocket\n\nsource = from(1:5) |> safe() |> map(Int, (d) -> d == 4 ? error(4) : d) |> catch_error((err, obs) -> of(1))\n\nsubscribe!(source, logger())\n;\n\n# output\n[LogActor] Data: 1\n[LogActor] Data: 2\n[LogActor] Data: 3\n[LogActor] Data: 1\n[LogActor] Completed\n\nSee also: AbstractOperator, InferableOperator, rerun, logger, safe\n\n\n\n\n\n","category":"function"},{"location":"operators/errors/catch_error/#See-also","page":"catch_error","title":"See also","text":"","category":"section"},{"location":"operators/errors/catch_error/","page":"catch_error","title":"catch_error","text":"Operators","category":"page"},{"location":"operators/about/#section_operators","page":"Operator","title":"Operators","text":"","category":"section"},{"location":"operators/about/","page":"Operator","title":"Operator","text":"Even though the Observable is the foundation, reactive extensions are mostly useful because of their operators. Operators are the essential pieces that allow complex asynchronous code to be easily composed in a declarative manner.","category":"page"},{"location":"operators/about/#what_are_operators","page":"Operator","title":"What are operators?","text":"","category":"section"},{"location":"operators/about/","page":"Operator","title":"Operator","text":"There are two kinds of operators:","category":"page"},{"location":"operators/about/#Pipeable-operators","page":"Operator","title":"Pipeable operators","text":"","category":"section"},{"location":"operators/about/","page":"Operator","title":"Operator","text":"Pipeable Operators are the kind that can be piped to Observables using the syntax source |> operator(). These include the filter() and map() operators. When called, operators do not change the existing Observable instance. Instead, they return a new Observable, whose subscription logic is based on the first Observable.","category":"page"},{"location":"operators/about/","page":"Operator","title":"Operator","text":"note: Note\nA Pipeable Operator is a function that takes an Observable as its input and returns another Observable. It is a pure operation: the previous Observable remains unmodified.","category":"page"},{"location":"operators/about/","page":"Operator","title":"Operator","text":"A Pipeable Operator is essentially a pure callable object that accepts one Observable as input and returns another Observable as output. Subscribing to the output Observable will also subscribe to the input Observable.","category":"page"},{"location":"operators/about/","page":"Operator","title":"Operator","text":"For example, the operator called map() is analogous to the Array method of the same name. Just like the array method map((d) -> d ^ 2, [ 1, 2, 3 ]) yields [ 1, 4, 9 ], the Observable emits 1, 4, 9:","category":"page"},{"location":"operators/about/","page":"Operator","title":"Operator","text":"source = from([ 1, 2, 3 ])\nsubscribe!(source |> map(Int, (d) -> d ^ 2), lambda(\n on_next = (d) -> println(d)\n))\n\n// Logs:\n// 1\n// 4\n// 9","category":"page"},{"location":"operators/about/","page":"Operator","title":"Operator","text":"Another useful operator is first():","category":"page"},{"location":"operators/about/","page":"Operator","title":"Operator","text":"source = from([ 1, 2, 3 ])\nsubscribe!(source |> first(), lambda(\n on_next = (d) -> println(d),\n on_complete = () -> \"Completed\"\n))\n\n// Logs:\n// 1\n// Completed","category":"page"},{"location":"operators/about/#Creation-operators","page":"Operator","title":"Creation operators","text":"","category":"section"},{"location":"operators/about/","page":"Operator","title":"Operator","text":"Distinct from pipeable operators, creation operators are functions that can be used to create an Observable with some common predefined behavior or by joining other Observables. For example: from([ 1, 2, 3 ]) creates an observable that will sequentially emit 1, 2, and 3.","category":"page"},{"location":"operators/about/","page":"Operator","title":"Operator","text":"source = from([ 1, 2, 3 ])\nsubscribe!(source, lambda(\n on_next = (d) -> println(\"Value: $d\"),\n on_error = (e) -> println(\"Oh no, error: $e\")\n on_complete = () -> println(\"Completed\")\n))\n\n// Logs:\n// Value: 1\n// Value: 2\n// Value: 3\n// Completed","category":"page"},{"location":"operators/about/#Operators-piping","page":"Operator","title":"Operators piping","text":"","category":"section"},{"location":"operators/about/","page":"Operator","title":"Operator","text":"Pipeable operators are special objects that can be used like ordinary functions with on_call!(operator, source). In practice however they tend to accumulate and quickly grow unreadable: on_call!(operator1, on_call!(operator2, on_call!(operator3, source))). Therefore, Rocket.jl overloads |> for operators and Observables:","category":"page"},{"location":"operators/about/","page":"Operator","title":"Operator","text":"using Rocket\n\nsource = from(1:100) |> filter((d) -> d % 2 === 0) |> map(Int, (d) -> d ^ 2) |> sum()\n\nsubscribe!(source, logger())\n\n// Logs\n// [LogActor] Data: 171700\n// [LogActor] Completed","category":"page"},{"location":"operators/about/","page":"Operator","title":"Operator","text":"It is also possible to create an operator composition with + or |>. It might be useful to create an alias for some often used operator chain","category":"page"},{"location":"operators/about/","page":"Operator","title":"Operator","text":"using Rocket\n\nmapAndFilter = map(Int, d -> d ^ 2) + filter(d -> d % 2 == 0) \n\nsource = from(1:5) |> mapAndFilter\n\nsubscribe!(source, logger())\n\n// Logs\n// [LogActor] Data: 4\n// [LogActor] Data: 16\n// [LogActor] Completed\n\nmapAndFilterAndSum = mapAndFilter + sum()\n\nsource = from(1:5) |> mapAndFilterAndSum\n\nsubscribe!(source, logger())\n\n// Logs\n// [LogActor] Data: 20\n// [LogActor] Completed","category":"page"},{"location":"operators/about/","page":"Operator","title":"Operator","text":"For stylistic reasons, on_call!(operator, source) is never used in practice - even if there is only one operator. Instead, source |> operator() is generally preferred.","category":"page"},{"location":"observables/types/iterable/#observable_iterable","page":"Iterable","title":"Iterable Observable","text":"","category":"section"},{"location":"observables/types/iterable/","page":"Iterable","title":"Iterable","text":"iterable","category":"page"},{"location":"observables/types/iterable/#Rocket.iterable","page":"Iterable","title":"Rocket.iterable","text":"iterable(iterator; scheduler::H = AsapScheduler()) where { H <: AbstractScheduler }\n\nCreation operator for the IterableObservable that wraps given iterator into an observable object.\n\nArguments\n\niterator: an iterator object to be wrapped an observable\nscheduler: optional, scheduler-like object\n\nNote\n\niterable operators does not create a copy of iterator. Any changes in the iterator object might be visible in the created observable. For side-effects free behavior consider using from creation operator which creates a copy of a given object with a collect function.\n\nExamples\n\nusing Rocket\n\nsource = iterable([ 0, 1, 2 ])\nsubscribe!(source, logger())\n;\n\n# output\n\n[LogActor] Data: 0\n[LogActor] Data: 1\n[LogActor] Data: 2\n[LogActor] Completed\n\nusing Rocket\n\nsource = iterable(\"Hello\")\nsubscribe!(source, logger())\n;\n\n# output\n\n[LogActor] Data: H\n[LogActor] Data: e\n[LogActor] Data: l\n[LogActor] Data: l\n[LogActor] Data: o\n[LogActor] Completed\n\nSee also: ScheduledSubscribable, subscribe!, from\n\n\n\n\n\n","category":"function"},{"location":"observables/types/generate/#observable_generate","page":"Generate","title":"Generate Observable","text":"","category":"section"},{"location":"observables/types/generate/","page":"Generate","title":"Generate","text":"generate","category":"page"},{"location":"observables/types/generate/#Rocket.generate","page":"Generate","title":"Rocket.generate","text":"generate(initial::D, condition::C, iterator::I; scheduler::H = AsapScheduler()) where { D, C, I, H <: AbstractScheduler }\n\nGenerates an observable sequence by running a state-driven loop producing the sequence's elements, using the specified scheduler to send out observer messages.\n\nArguments\n\ninitial: initial state\ncondition: condition to terminate generation (upon returning false)\niterator: iteration step function\nscheduler: optional, scheduler-like object\n\nNote\n\niterator object should return objects of the same type as initial.\n\nExamples\n\nusing Rocket\n\nsource = generate(1, x -> x < 3, x -> x + 1)\nsubscribe!(source, logger())\n;\n\n# output\n[LogActor] Data: 1\n[LogActor] Data: 2\n[LogActor] Completed\n\nSee also: ScheduledSubscribable, subscribe!\n\n\n\n\n\n","category":"function"},{"location":"operators/filtering/ignore/#operator_ignore","page":"ignore","title":"Ignore operator","text":"","category":"section"},{"location":"operators/filtering/ignore/","page":"ignore","title":"ignore","text":"ignore","category":"page"},{"location":"operators/filtering/ignore/#Rocket.ignore","page":"ignore","title":"Rocket.ignore","text":"ignore(count::Int)\n\nCreates a ignore operator, which returns an Observable that skips the first count items emitted by the source Observable.\n\nArguments\n\ncount::Int: the number of times, items emitted by source Observable should be skipped.\n\nProducing\n\nStream of type <: Subscribable{L} where L refers to type of source stream\n\nExamples\n\nusing Rocket\n\nsource = from(1:5)\n\nsubscribe!(source |> ignore(2), logger())\n;\n\n# output\n\n[LogActor] Data: 3\n[LogActor] Data: 4\n[LogActor] Data: 5\n[LogActor] Completed\n\nSee also: AbstractOperator, InferableOperator, ProxyObservable, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/filtering/ignore/#See-also","page":"ignore","title":"See also","text":"","category":"section"},{"location":"operators/filtering/ignore/","page":"ignore","title":"ignore","text":"Operators","category":"page"},{"location":"subjects/types/replay/#subject_replay","page":"Replay","title":"ReplaySubject","text":"","category":"section"},{"location":"subjects/types/replay/","page":"Replay","title":"Replay","text":"ReplaySubject\nReplaySubjectFactory","category":"page"},{"location":"subjects/types/replay/#Rocket.ReplaySubject","page":"Replay","title":"Rocket.ReplaySubject","text":"ReplaySubject(::Type{D}, size::Int) where D\nReplaySubject(::Type{D}, size::Int, factory::F) where { D, F <: AbstractSubjectFactory }\nReplaySubject(::Type{D}, size::Int, subject::S) where { D, S }\n\nA variant of Subject that \"replays\" or emits old values to new subscribers. It buffers a set number of values and will emit those values immediately to any new subscribers in addition to emitting new values to existing subscribers.\n\nSee also: ReplaySubjectFactory, Subject, SubjectFactory\n\n\n\n\n\n","category":"function"},{"location":"subjects/types/replay/#Rocket.ReplaySubjectFactory","page":"Replay","title":"Rocket.ReplaySubjectFactory","text":"ReplaySubjectFactory(size::Int, factory::F) where { F <: AbstractSubjectFactory }\nReplaySubjectFactory(size::Int; scheduler::H = AsapScheduler()) where { H <: AbstractScheduler }\n\nA variant of SubjectFactory that creates an instance of ReplaySubject.\n\nSee also: SubjectFactory, AbstractSubjectFactory, ReplaySubject, Subject\n\n\n\n\n\n","category":"function"},{"location":"subjects/types/replay/#Description","page":"Replay","title":"Description","text":"","category":"section"},{"location":"subjects/types/replay/","page":"Replay","title":"Replay","text":"A ReplaySubject is similar to a BehaviorSubject in that it can send old values to new subscribers, but it can also record a part of the Observable execution.","category":"page"},{"location":"subjects/types/replay/","page":"Replay","title":"Replay","text":"note: Note\nA ReplaySubject records multiple values from the Observable execution and replays them to new subscribers.","category":"page"},{"location":"subjects/types/replay/#Examples","page":"Replay","title":"Examples","text":"","category":"section"},{"location":"subjects/types/replay/","page":"Replay","title":"Replay","text":"When creating a ReplaySubject, you can specify how many values to replay:","category":"page"},{"location":"subjects/types/replay/","page":"Replay","title":"Replay","text":"using Rocket\n\nsubject = ReplaySubject(Int, 3) # buffer 3 values for new subscribers\n\nsubscription1 = subscribe!(subject, logger(\"1\"))\n\nnext!(subject, 1)\nnext!(subject, 2)\nnext!(subject, 3)\nnext!(subject, 4)\n\nsubscription2 = subscribe!(subject, logger(\"2\"))\n\nnext!(subject, 5)\n\nunsubscribe!(subscription1)\nunsubscribe!(subscription2)\n\n// Logs\n// [1] Data: 1\n// [1] Data: 2\n// [1] Data: 3\n// [1] Data: 4\n// [2] Data: 2\n// [2] Data: 3\n// [2] Data: 4\n// [1] Data: 5\n// [2] Data: 5","category":"page"},{"location":"observables/about/#section_observables","page":"Observable","title":"Observables","text":"","category":"section"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"Observables are lazy Push collections of multiple values. They fill the missing spot in the following table:","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"Type Single Multiple\nPull Function Iterator\nPush Promise Observable","category":"page"},{"location":"observables/about/#First-example","page":"Observable","title":"First example","text":"","category":"section"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"For example, the following code specifies an Observable that pushes the values 1, 2, 3 immediately (synchronously) when subscribed to, and the value 4 after one second has passed since subscription.","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"using Rocket\n\nsource = make(Int) do actor\n next!(actor, 1)\n next!(actor, 2)\n next!(actor, 3)\n setTimeout(1000) do\n next!(actor, 4)\n complete!(actor)\n end\nend","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"To invoke the Observable and inspect these values, we need to subscribe to it. It is important to note that observables are lazy collections which means they don't emit anything until someone subscribes to it. Every subscription spawns its own independent execution of observable. There are some exceptions to this rule, e.g. Subjects and some operators (share(), etc..) which may change this behaviour","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"using Rocket\n\nsource = make(Int) do actor\n next!(actor, 1)\n next!(actor, 2)\n next!(actor, 3)\n setTimeout(1000) do\n next!(actor, 4)\n complete!(actor)\n end\nend\n\nprintln(\"Just before subscribe\")\nsubscribe!(source, lambda(\n on_next = (d) -> println(d),\n on_complete = () -> println(\"Completed\")\n))\nprintln(\"Just after subscribe\")\n\n# Logs\n# Just before subscribe\n# 1\n# 2\n# 3\n# Just after subscribe\n# 4\n# Completed","category":"page"},{"location":"observables/about/#Pull-vs-Push","page":"Observable","title":"Pull vs Push","text":"","category":"section"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"Pull and Push are two different protocols that describe how a data Producer communicates with a data Consumer.","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"In a Pull system, the Consumer determines when it receives data from the Producer. The Producer itself is unaware of when the data are delivered to the Consumer.","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"Every Julia Function is a Pull system. The function is a Producer of data, and the code that calls the function is consuming data by \"pulling\" a return value from the call.","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"Type PRODUCER CONSUMER\nPull Passive: produces data when requested. Active: decides when data is requested.\nPush Active: produces data at its own pace. Passive: reacts to received data.","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"In Push systems, the Producer determines when to send data to the Consumer. The Consumer is unaware of when it will receive that data.","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"Futures and promises are the most common type of Push systems today. A Promise (the Producer) delivers a resolved value to registered callbacks (the Consumers). Unlike functions, it is the Promise that determines precisely when a value is \"pushed\" to the callbacks.","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"Rocket.jl introduces Observables, a new Push system for Julia. An Observable is a Producer of multiple values, \"pushing\" them to Observers (Consumers or Actors).","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"A Function is a lazily evaluated computation that synchronously returns a single value on invocation.\nA Generator is a lazily evaluated computation that synchronously returns zero to (potentially) infinite values on iteration.\nA Promise is a computation that may (or may not) eventually return a single value.\nAn Observable is a lazily evaluated computation that can synchronously or asynchronously return zero to (potentially) infinite values from the time it's invoked.","category":"page"},{"location":"observables/about/#Observables-as-generalizations-of-functions","page":"Observable","title":"Observables as generalizations of functions","text":"","category":"section"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"In contrast to functions, Observables can \"return\" multiple values over time. For example, functions can't do this:","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"function foo()\n println(\"Hello!\")\n return 0\n return 1 # Dead code, will never happen\nend","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"Observables, however, can do this:","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"using Rocket\n\nfoo = make(Int) do actor\n next!(actor, 0)\n next!(actor, 1)\n complete!(actor)\nend\n","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"Observables can also \"return\" values asynchronously after some time:","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"using Rocket\n\nfoo = make(Int) do actor\n setTimeout(1000) do\n next!(actor, 0)\n complete!(actor)\n end\nend","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"Assume we have a function foo and some observable:","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"Function call foo(args...) means \"give me one value synchronously\" (pull strategy)\nIn contrast subscription to an observable with subscribe(observable, ...) means \"notify me about any amount of values, either synchronously or asynchronously\" (push strategy)","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"When a new value is available in an observable we say that the observable emits or generates an update. Values that are generated by an observable are sometimes also called future values, because there is no principled way to predict when an observable will generate a new value. In some programming languages, observables are referred to as generators or streams and we will use all three terms interchangeably.","category":"page"},{"location":"observables/about/#Anatomy-of-an-Observable","page":"Observable","title":"Anatomy of an Observable","text":"","category":"section"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"Observables are (1) created using creation operators (it is also possible to build an Observable from scratch with custom logic); (2) subscribed to with an Actor; (3) execute to deliver next! / error! / complete! notifications to the Actor, and (4) their execution may be disposed. These four aspects are all encoded in an Observable instance, but some of these aspects are related to other types, such as Subscribable and Subscription.","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"The core responsibilities of an Observable are:","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"Creating Observables\nSubscribing to Observables\nExecuting the Observable\nDisposing Observables","category":"page"},{"location":"observables/about/#Creating-Observables","page":"Observable","title":"Creating Observables","text":"","category":"section"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"You can create an Observable in various ways using Creation operators. You can also build an Observable from scratch. To see how you can build an Observable with custom logic, consult the API Section.","category":"page"},{"location":"observables/about/#Subscribing-to-Observables","page":"Observable","title":"Subscribing to Observables","text":"","category":"section"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"The Observable source in the example can be subscribed to.","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"using Rocket\n\nsubscribe!(source, lambda(\n on_next = (d) -> println(d)\n))","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"This example shows how subscribe calls are not shared among multiple Actors of the same Observable. When calling subscribe! with an Actor, the function on_subscribe! that is attached to this particular Observable is executed for that given actor. Each call to subscribe! triggers its own independent setup for that given actor.","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"note: Note\nSubscribing to an Observable is like calling a function, providing callbacks where the data will be delivered to.","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"The subscribe! function also supports multiple subscriptions at once. If the input argument to the subscribe! function is a tuple or a vector, it will first check that all of the arguments are valid source objects and actors and if its true will subscribe from each of them individually.","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"\nsource1 = Subject(Int)\nsource2 = Subject(Int)\n\nsubscriptions = subscribe!([\n (source1, logger()),\n (source2, logger()),\n])\n\n# Later on\n# unsubscribe!(subscriptions)\n","category":"page"},{"location":"observables/about/#Executing-Observables","page":"Observable","title":"Executing Observables","text":"","category":"section"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"The execution produces multiple values over time, either synchronously or asynchronously.","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"An Observable Execution can deliver three types of notifications:","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"Next: sends a value, such as an Int, String, Dict, etc.;\nError: sends any error as a value;\nComplete: does not send a value.","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"\"Next\" notifications are the most important and most common type: they represent actual data being delivered to an subscriber. \"Error\" and \"Complete\" notifications terminate the Observable Execution.","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"note: Note\nIn an Observable Execution, any number of Next notifications may be delivered. However, once a single Error or Complete notification is delivered, nothing else can be delivered afterwards.","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"The following is an example of an Observable execution that delivers three Next notifications and subsequently completes:","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"using Rocket\n\nsource = make(Int) do actor\n next!(actor, 1)\n next!(actor, 2)\n next!(actor, 3)\n complete!(actor)\nend\n\n# or the same with creation operator\n\nsource = from([ 1, 2, 3 ])","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"It is advised to wrap any code in subscribe by a try/catch block that delivers an Error notification upon an exception:","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"using Rocket\n\nsource = make(Int) do actor\n try\n next!(actor, 1)\n next!(actor, 2)\n next!(actor, 3)\n complete!(actor)\n catch e\n error!(actor, e)\n end\nend\n","category":"page"},{"location":"observables/about/#Disposing-Observable-Executions","page":"Observable","title":"Disposing Observable Executions","text":"","category":"section"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"It is common for an Actor to abort execution of an Observable Execution. Once the Actor is done receiving values, it may stop the execution in order to free computation power or memory resources.","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"When subscribe! is called, the Actor gets attached to the newly created Observable execution. This call also returns an object, the Subscription:","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"subscription = subscribe!(source, actor)","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"The Subscription represents the ongoing execution, and has a minimal API that allows you to cancel the execution. Read more about Subscription type here.","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"With","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"unsubscribe!(subscription)","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"you can cancel the ongoing execution.","category":"page"},{"location":"observables/about/","page":"Observable","title":"Observable","text":"note: Note\nsubscribe! returns a Subscription that represents the ongoing execution. Simply call unsubscribe! on the Subscription to cancel the execution.","category":"page"},{"location":"actors/types/circularkeep/#actor_circularkeep","page":"CircularKeep","title":"CircularKeep actor","text":"","category":"section"},{"location":"actors/types/circularkeep/","page":"CircularKeep","title":"CircularKeep","text":"circularkeep","category":"page"},{"location":"actors/types/circularkeep/#Rocket.circularkeep","page":"CircularKeep","title":"Rocket.circularkeep","text":"circularkeep(::Type{T}, capacity::Int) where T\n\nArguments\n\n::Type{T}: Type of keep data\ncapacity::Int: circular buffer capacity\n\nCreation operator for the CircularKeepActor actor.\n\nExamples\n\nusing Rocket\n\nactor = circularkeep(Int, 3)\nactor isa CircularKeepActor{Int}\n\n# output\ntrue\n\nSee also: CircularKeepActor, AbstractActor\n\n\n\n\n\n","category":"function"},{"location":"actors/types/circularkeep/","page":"CircularKeep","title":"CircularKeep","text":"CircularKeepActor","category":"page"},{"location":"actors/types/circularkeep/#Rocket.CircularKeepActor","page":"CircularKeep","title":"Rocket.CircularKeepActor","text":"CirucalKeepActor{D}() where D\n\nCircual keep actor is similar to keep actor, but uses CircularBuffer as a storage. It saves all incoming successful next events in a values circular buffer, throws an ErrorException on error! event and does nothing on completion event.\n\nExamples\n\nusing Rocket\n\nsource = from(1:5)\nactor = circularkeep(Int, 3)\n\nsubscribe!(source, actor)\nshow(getvalues(actor))\n\n# output\n[3, 4, 5]\n\nSee also: Actor, keep, circularkeep\n\n\n\n\n\n","category":"type"},{"location":"operators/utility/default_if_empty/#operator_ref_default_if_empty","page":"default_if_empty","title":"DefaultIfEmpty Operator","text":"","category":"section"},{"location":"operators/utility/default_if_empty/","page":"default_if_empty","title":"default_if_empty","text":"default_if_empty","category":"page"},{"location":"operators/utility/default_if_empty/#Rocket.default_if_empty","page":"default_if_empty","title":"Rocket.default_if_empty","text":"default_if_empty(value::T)\ndefault_if_empty(callback::Function)\n\nCreates a default_if_empty operator, which emits a given value if the source Observable completes without emitting any next value, otherwise mirrors the source Observable. Optionally accepts a zero-argument callback that will be executed to generate default value. Note: Callback function's output is always converted to the eltype of the original observable.\n\nusing Rocket\n\nsource = completed(Int) |> default_if_empty(0)\n\nsubscribe!(source, logger())\n;\n\n# output\n[LogActor] Data: 0\n[LogActor] Completed\n\nusing Rocket\n\nsource = completed(Int) |> default_if_empty(() -> 42)\n\nsubscribe!(source, logger())\n;\n\n# output\n[LogActor] Data: 42\n[LogActor] Completed\n\nSee also: AbstractOperator, InferableOperator, logger, map\n\n\n\n\n\n","category":"function"},{"location":"operators/utility/default_if_empty/#Description","page":"default_if_empty","title":"Description","text":"","category":"section"},{"location":"operators/utility/default_if_empty/","page":"default_if_empty","title":"default_if_empty","text":"default_if_empty emits the values emitted by the source Observable or a specified default value if the source Observable is empty (completes without having emitted any next value).","category":"page"},{"location":"operators/utility/default_if_empty/#See-also","page":"default_if_empty","title":"See also","text":"","category":"section"},{"location":"operators/utility/default_if_empty/","page":"default_if_empty","title":"default_if_empty","text":"Operators","category":"page"},{"location":"observables/types/never/#observable_never","page":"Never","title":"Never Observable","text":"","category":"section"},{"location":"observables/types/never/","page":"Never","title":"Never","text":"never","category":"page"},{"location":"observables/types/never/#Rocket.never","page":"Never","title":"Rocket.never","text":"never(T = Any)\n\nCreation operator for the NeverObservable that emits neither values nor errors nor the completion notification. It can be used for testing purposes or for composing with other Observables. Please note that by never emitting a complete notification, this Observable keeps the subscription from being disposed automatically. Subscriptions need to be manually disposed.\n\nArguments\n\nT: Type of Observable data, optional, Any is the default\n\nExamples\n\nusing Rocket\n\nsource = never()\nsubscribe!(source, logger())\n;\n\n# output\n\n\nSee also: NeverObservable, subscribe!, logger\n\n\n\n\n\n","category":"function"},{"location":"observables/types/never/","page":"Never","title":"Never","text":"NeverObservable","category":"page"},{"location":"observables/types/never/#Rocket.NeverObservable","page":"Never","title":"Rocket.NeverObservable","text":"NeverObservable{D}()\n\nAn Observable that emits no items to the Observer and never completes.\n\nType parameters\n\nD: Type of Observable data\n\nSee also: Subscribable, never\n\n\n\n\n\n","category":"type"},{"location":"operators/utility/about/#Utility-category","page":"About utility operators","title":"Utility category","text":"","category":"section"},{"location":"operators/utility/about/","page":"About utility operators","title":"About utility operators","text":"There are operators for different purposes, and they may be categorized as: creation, transformation, filtering, joining, multicasting, error handling, utility, etc. In the following list you will find all the operators organized in utility category.","category":"page"},{"location":"operators/utility/about/","page":"About utility operators","title":"About utility operators","text":"tap\ntap_on_subscribe\ntap_on_unsubscribe\ntap_on_complete\ndelay\nsafe\nnoop\nref_count\nasync\ndefault_if_empty\nerror_if_empty\nskip_next\nskip_error\nskip_complete\ndiscontinue\nlimit_subscribers","category":"page"},{"location":"operators/utility/about/#See-also","page":"About utility operators","title":"See also","text":"","category":"section"},{"location":"operators/utility/about/","page":"About utility operators","title":"About utility operators","text":"Operators","category":"page"},{"location":"operators/all/#operators_list","page":"All","title":"List of all available operators","text":"","category":"section"},{"location":"operators/all/","page":"All","title":"All","text":"There are operators for different purposes, and they may be categorized as: creation, transformation, filtering, joining, multicasting, error handling, utility, etc.","category":"page"},{"location":"operators/all/#Creation-operators","page":"All","title":"Creation operators","text":"","category":"section"},{"location":"operators/all/","page":"All","title":"All","text":"make\nof\nfrom\niterable\nfaulted\nnever\ncompleted\ntimer\ninterval\nproxy\nfile\ncombined\nrace\nconnectable\nmerged\nconcat\ngenerate\nnetwork\ndefer\nzipped","category":"page"},{"location":"operators/all/#Transformation-operators","page":"All","title":"Transformation operators","text":"","category":"section"},{"location":"operators/all/","page":"All","title":"All","text":"map\nmap_to\nscan\naccumulated\nenumerate\nuppercase\nlowercase\nto_array\nswitch_map\nswitch_map_to\nmerge_map\nconcat_map\nconcat_map_to\nexhaust_map\nstart_with\npairwise\nsubstitute\noverride","category":"page"},{"location":"operators/all/#Filtering-operators","page":"All","title":"Filtering operators","text":"","category":"section"},{"location":"operators/all/","page":"All","title":"All","text":"filter\nfilter_type\nsome\ntake\ntake_until\nfirst\nlast\nfind\nfind_index\nignore","category":"page"},{"location":"operators/all/#Mathematical-and-Aggregate-operators","page":"All","title":"Mathematical and Aggregate operators","text":"","category":"section"},{"location":"operators/all/","page":"All","title":"All","text":"count\nmax\nmin\nreduce\nsum","category":"page"},{"location":"operators/all/#Error-handling-operators","page":"All","title":"Error handling operators","text":"","category":"section"},{"location":"operators/all/","page":"All","title":"All","text":"catch_error\nrerun\nerror_if\nerror_if_not","category":"page"},{"location":"operators/all/#Join-operator","page":"All","title":"Join operator","text":"","category":"section"},{"location":"operators/all/","page":"All","title":"All","text":"with_latest","category":"page"},{"location":"operators/all/#Multicasting-operators","page":"All","title":"Multicasting operators","text":"","category":"section"},{"location":"operators/all/","page":"All","title":"All","text":"multicast\npublish\npublish_behavior\npublish_replay\nshare\nshare_replay","category":"page"},{"location":"operators/all/#Utility-operators","page":"All","title":"Utility operators","text":"","category":"section"},{"location":"operators/all/","page":"All","title":"All","text":"tap\ntap_on_subscribe\ntap_on_unsubscribe\ntap_on_complete\ndelay\nsafe\nnoop\nref_count\nasync\ndefault_if_empty\nerror_if_empty\nskip_next\nskip_error\nskip_complete\ndiscontinue\nlimit_subscribers","category":"page"},{"location":"observables/types/concat/#observable_concat","page":"Concat","title":"Concat Observable","text":"","category":"section"},{"location":"observables/types/concat/","page":"Concat","title":"Concat","text":"concat","category":"page"},{"location":"observables/types/concat/#Rocket.concat","page":"Concat","title":"Rocket.concat","text":"concat(sources...)\nconcat(sources::S) where { S <: Tuple }\n\nCombines multiple Observables to create an Observable which sequentially emits all values from given Observable and then moves on to the next. All values of each passed Observable merged into a single Observable, in order, in serial fashion.\n\nArguments\n\nsources: input sources\n\nExamples\n\nusing Rocket\n\nsource1 = of(1)\nsource2 = of(2)\n\nsubscribe!(concat(source1, source2), logger())\n;\n\n# output\n[LogActor] Data: 1\n[LogActor] Data: 2\n[LogActor] Completed\n\nusing Rocket\n\nsource1 = of(1) |> async()\nsource2 = of(2)\n\nsubscribe!(concat(source1, source2), logger())\n;\n\n# output\n[LogActor] Data: 1\n[LogActor] Data: 2\n[LogActor] Completed\n\nSee also: Subscribable, subscribe!\n\n\n\n\n\n","category":"function"},{"location":"observables/types/labeled/#observable_labeled","page":"Labeled","title":"Labeled Observable","text":"","category":"section"},{"location":"observables/types/labeled/","page":"Labeled","title":"Labeled","text":"labeled","category":"page"},{"location":"observables/types/labeled/#Rocket.labeled","page":"Labeled","title":"Rocket.labeled","text":"labeled(names::Val, stream)\n\nCreation operator for the LabeledObservable that wraps given stream, that produces Tuple values into a NamedTuple with given names.\n\nArguments\n\nnames: a Val object that contains a tuple of symbols\nstream: an observable that emits a Tuple, length of the Tuple events must be equal to the length of the names argument\n\nExamples\n\nusing Rocket\n\nsource = labeled(Val((:x, :y)), from([ (1, 2), (2, 3), (3, 4) ]))\nsubscribe!(source, logger())\n;\n\n# output\n\n[LogActor] Data: (x = 1, y = 2)\n[LogActor] Data: (x = 2, y = 3)\n[LogActor] Data: (x = 3, y = 4)\n[LogActor] Completed\n\nSee also: ScheduledSubscribable, subscribe!, from\n\n\n\n\n\n","category":"function"},{"location":"observables/types/labeled/","page":"Labeled","title":"Labeled","text":"LabeledObservable","category":"page"},{"location":"observables/types/labeled/#Rocket.LabeledObservable","page":"Labeled","title":"Rocket.LabeledObservable","text":"LabeledObservable{D, S}()\n\nAn Observable that emits NamesTuple items from a source Observable that emits Tuple items.\n\nSee also: Subscribable, labeled\n\n\n\n\n\n","category":"type"},{"location":"actors/types/lambda/#actor_lambda","page":"Lambda","title":"Lambda actor","text":"","category":"section"},{"location":"actors/types/lambda/","page":"Lambda","title":"Lambda","text":"lambda","category":"page"},{"location":"actors/types/lambda/#Rocket.lambda","page":"Lambda","title":"Rocket.lambda","text":"lambda(; on_next = nothing, on_error = nothing, on_complete = nothing)\nlambda(::Type{T}; on_next = nothing, on_error = nothing, on_complete = nothing) where T\n\nCreation operator for the 'LambdaActor' actor.\n\nExamples\n\nusing Rocket\n\nactor = lambda(Int; on_next = (d) -> println(d))\nactor isa LambdaActor{Int}\n\n# output\ntrue\n\nSee also: LambdaActor, AbstractActor\n\n\n\n\n\n","category":"function"},{"location":"actors/types/lambda/","page":"Lambda","title":"Lambda","text":"LambdaActor","category":"page"},{"location":"actors/types/lambda/#Rocket.LambdaActor","page":"Lambda","title":"Rocket.LambdaActor","text":"LambdaActor{D, N, E, C}(on_next::N, on_error::E, on_complete::C) where D\n\nLambda actor wraps on_next, on_error, on_complete callbacks for data, error and complete events. Should not be used explicitly, use lambda creation operator instead.\n\nConstructor arguments\n\non_next: Callback for data event. Optional. Default is nothing.\non_error: Callback for error event. Optional. Default is nothing.\non_complete: Callback for complete event. Optional. Default is nothing.\n\nSee also: Actor, lambda\n\n\n\n\n\n","category":"type"},{"location":"operators/utility/error_if_empty/#operator_ref_error_if_empty","page":"error_if_empty","title":"ErrorIfEmpty Operator","text":"","category":"section"},{"location":"operators/utility/error_if_empty/","page":"error_if_empty","title":"error_if_empty","text":"error_if_empty","category":"page"},{"location":"operators/utility/error_if_empty/#Rocket.error_if_empty","page":"error_if_empty","title":"Rocket.error_if_empty","text":"error_if_empty(err)\n\nCreates a error_if_empty operator, which emits a given error if the source Observable completes without emitting any next value, otherwise mirrors the source Observable.\n\nusing Rocket\n\nsource = completed(Int) |> error_if_empty(\"Empty\")\n\nsubscribe!(source, logger())\n;\n\n# output\n[LogActor] Error: Empty\n\nSee also: AbstractOperator, InferableOperator, logger, map\n\n\n\n\n\n","category":"function"},{"location":"operators/utility/error_if_empty/#Description","page":"error_if_empty","title":"Description","text":"","category":"section"},{"location":"operators/utility/error_if_empty/","page":"error_if_empty","title":"error_if_empty","text":"error_if_empty emits the values emitted by the source Observable or a specified error message if the source Observable is empty (completes without having emitted any next value).","category":"page"},{"location":"operators/utility/error_if_empty/#See-also","page":"error_if_empty","title":"See also","text":"","category":"section"},{"location":"operators/utility/error_if_empty/","page":"error_if_empty","title":"error_if_empty","text":"Operators","category":"page"},{"location":"subjects/types/subject/#subject","page":"Subject","title":"Subject","text":"","category":"section"},{"location":"subjects/types/subject/","page":"Subject","title":"Subject","text":"Subject\nSubjectFactory","category":"page"},{"location":"subjects/types/subject/#Rocket.Subject","page":"Subject","title":"Rocket.Subject","text":"Subject(::Type{D}; scheduler::H = AsapScheduler())\n\nA Subject is a special type of Observable that allows values to be multicasted to many Observers. Subjects are like EventEmitters. Every Subject is an Observable and an Actor. You can subscribe to a Subject, and you can call next! to feed values as well as error! and complete!.\n\nNote: By convention, every actor subscribed to a Subject observable is not allowed to throw exceptions during next!, error! and complete! calls. Doing so would lead to undefined behaviour. Use safe() operator to bypass this rule. \n\nSee also: SubjectFactory, ReplaySubject, BehaviorSubject, safe\n\n\n\n\n\n","category":"type"},{"location":"subjects/types/subject/#Rocket.SubjectFactory","page":"Subject","title":"Rocket.SubjectFactory","text":"SubjectFactory(scheduler::H) where { H <: AbstractScheduler }\n\nA base subject factory that creates an instance of Subject with specified scheduler.\n\nSee also: AbstractSubjectFactory, Subject\n\n\n\n\n\n","category":"type"},{"location":"subjects/types/subject/#Description","page":"Subject","title":"Description","text":"","category":"section"},{"location":"subjects/types/subject/","page":"Subject","title":"Subject","text":"Every Subject is an Observable. Given a Subject, you can subscribe to it, providing an Actor, which will start receiving values normally. From the perspective of the Observer, it cannot tell whether the Observable execution is coming from a plain unicast Observable or a Subject.","category":"page"},{"location":"subjects/types/subject/","page":"Subject","title":"Subject","text":"Internally to the Subject, subscribe does not invoke a new execution that delivers values. It simply registers the given Observer in a list of Observers.","category":"page"},{"location":"subjects/types/subject/","page":"Subject","title":"Subject","text":"Every Subject is an Actor. It is an object with the methods next!, error!, and complete!. To feed a new value to the Subject, just call next!(subject, theValue), and it will be multicasted to the Actors registered to listen to the Subject.","category":"page"},{"location":"subjects/types/subject/","page":"Subject","title":"Subject","text":"note: Note\nBy convention, every actor subscribed to a Subject observable is not allowed to throw exceptions during next!, error! and complete! calls. Doing so would lead to undefined behaviour. Use safe() operator to bypass this rule. ","category":"page"},{"location":"subjects/types/subject/#Examples","page":"Subject","title":"Examples","text":"","category":"section"},{"location":"subjects/types/subject/","page":"Subject","title":"Subject","text":"In the following example, the BehaviorSubject is initialized with the value 0 which the first Observer receives when it subscribes. The second Observer receives the value 2 even though it subscribed after the value 2 was sent.","category":"page"},{"location":"subjects/types/subject/","page":"Subject","title":"Subject","text":"using Rocket\n\nsubject = Subject(Int)\n\nsubscription1 = subscribe!(subject, logger(\"1\"))\n\nnext!(subject, 1)\nnext!(subject, 2)\n\nsubscription2 = subscribe!(subject, logger(\"2\"))\n\nnext!(subject, 3)\n\nunsubscribe!(subscription1)\nunsubscribe!(subscription2)\n\n// Logs\n// [1] Data: 1\n// [1] Data: 2\n// [1] Data: 3\n// [2] Data: 3","category":"page"},{"location":"utils/#Utils","page":"Utils","title":"Utils","text":"","category":"section"},{"location":"utils/","page":"Utils","title":"Utils","text":"setTimeout\nRocket.combined_type\nRocket.union_type","category":"page"},{"location":"utils/#Rocket.setTimeout","page":"Utils","title":"Rocket.setTimeout","text":"setTimeout(f::Function, timeout::Int)\n\nCreates a Task which will asynchornously invoke fucntion f after specified timeout time in milliseconds.\n\nArguments\n\nf::Function, function to be invoked asynchronously\ntimeout::Int, timeout in milliseconds\n\nExamples\n\nusing Rocket\nusing Dates\n\nprintln(\"Before: \", Dates.format(now(), \"MM:SS\"))\nsetTimeout(1000) do\n println(\"Inside: \", Dates.format(now(), \"MM:SS\"))\nend\nprintln(\"Right after: \", Dates.format(now(), \"MM:SS\"))\n;\n\n# Logs\n# Before: 20:59\n# Right after: 20:59\n# Inside: 21:00\n\n\n\n\n\n","category":"function"},{"location":"utils/#Rocket.combined_type","page":"Utils","title":"Rocket.combined_type","text":"combined_type(sources)\n\nReturns a Tuple el-type of observable el-types in sources argument in the same order\n\n\n\n\n\n","category":"function"},{"location":"utils/#Rocket.union_type","page":"Utils","title":"Rocket.union_type","text":"union_type(sources)\n\nReturns a Union el-type of observable el-types in sources argument\n\n\n\n\n\n","category":"function"},{"location":"utils/#Helpers","page":"Utils","title":"Helpers","text":"","category":"section"},{"location":"utils/","page":"Utils","title":"Utils","text":"Rocket.@MStorage\nRocket.setstorage!","category":"page"},{"location":"utils/#Rocket.@MStorage","page":"Utils","title":"Rocket.@MStorage","text":"@MStorage(n::Int)\n\nHelper function to generate tuple-like structure MStorageN, but with mutable fields and empty constructor. It is possible then to take a snapshot(::MStorage) which returns a tuple with the same types and values from storage. Some operators and observables use pregenerated MStorage to instatiate uninitialized mutable storage in case when stream is allowed to not emit any values before completion.\n\nGenerated structure layout\n\nstruct MStorageN{V1, V2, ..., VN}\n v1 :: V1\n v2 :: V2\n ...\n vn :: VN\nend\n\nSee also: setstorage!\n\n\n\n\n\n","category":"macro"},{"location":"utils/#Rocket.setstorage!","page":"Utils","title":"Rocket.setstorage!","text":"setstorage!(s, v, ::Val{I}) where I\n\nThis function can be used to set a new value v for storage s with a given value v and index I. Using parametrized Val{I} for indexing ensures for index to be resolved at compile-time and if-else branch optimization.\n\nSee also: @MStorage\n\n\n\n\n\n","category":"function"},{"location":"observables/types/completed/#observable_completed","page":"Completed","title":"Completed Observable","text":"","category":"section"},{"location":"observables/types/completed/","page":"Completed","title":"Completed","text":"completed","category":"page"},{"location":"observables/types/completed/#Rocket.completed","page":"Completed","title":"Rocket.completed","text":"completed(::Type{T} = Any; scheduler::H = AsapScheduler()) where { T, H <: AbstractScheduler }\n\nCreation operator for the CompletedObservable that emits no items to the Actor and immediately sends a complete notification on subscription.\n\nArguments\n\nT: type of output data source, optional, Any is the default\nscheduler: optional, scheduler-like object\n\nExamples\n\nusing Rocket\n\nsource = completed(Int)\nsubscribe!(source, logger())\n;\n\n# output\n\n[LogActor] Completed\n\n\nSee also: CompletedObservable, subscribe!, logger\n\n\n\n\n\n","category":"function"},{"location":"observables/types/completed/","page":"Completed","title":"Completed","text":"CompletedObservable","category":"page"},{"location":"observables/types/completed/#Rocket.CompletedObservable","page":"Completed","title":"Rocket.CompletedObservable","text":"CompletedObservable{D, H}(scheduler::H)\n\nObservable that emits no items to the Actor and just sends a complete notification on subscription.\n\nConstructor arguments\n\nscheduler: Scheduler-like object\n\nSee also: Subscribable, completed\n\n\n\n\n\n","category":"type"},{"location":"operators/utility/tap/#operator_tap","page":"tap","title":"Tap Operator","text":"","category":"section"},{"location":"operators/utility/tap/","page":"tap","title":"tap","text":"tap","category":"page"},{"location":"operators/utility/tap/#Rocket.tap","page":"tap","title":"Rocket.tap","text":"tap(tapFn::F) where { F <: Function }\n\nCreates a tap operator, which performs a side effect for every emission on the source Observable, but return an Observable that is identical to the source.\n\nArguments\n\ntapFn::Function: side-effect tap function with (data) -> Nothing signature\n\nProducing\n\nStream of type <: Subscribable{L} where L refers to type of source stream\n\nExamples\n\nusing Rocket\n\nsource = from([ 1, 2, 3 ])\nsubscribe!(source |> tap((d) -> println(\"In tap: $d\")), logger())\n;\n\n# output\n\nIn tap: 1\n[LogActor] Data: 1\nIn tap: 2\n[LogActor] Data: 2\nIn tap: 3\n[LogActor] Data: 3\n[LogActor] Completed\n\n\nSee also: tap_on_subscribe, tap_on_complete, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/utility/tap/#Description","page":"tap","title":"Description","text":"","category":"section"},{"location":"operators/utility/tap/","page":"tap","title":"tap","text":"Returns an Observable that resembles the source Observable, but modifies it so that the provided Observer is called to perform a side effect for every value emitted by the source.","category":"page"},{"location":"operators/utility/tap/","page":"tap","title":"tap","text":"This operator is useful for debugging your Observables, verifying correct values, or performing other side effects.","category":"page"},{"location":"operators/utility/tap/","page":"tap","title":"tap","text":"Note: this operator differs from a subscribe on the Observable. If the Observable returned by tap is not subscribed, the side effects specified by the Observer will never happen. tap therefore simply spies on existing execution, it does not trigger an execution to happen like subscribe does.","category":"page"},{"location":"operators/utility/tap/#See-also","page":"tap","title":"See also","text":"","category":"section"},{"location":"operators/utility/tap/","page":"tap","title":"tap","text":"Operators","category":"page"},{"location":"observables/types/network/#observable_network","page":"Network","title":"Network Observable","text":"","category":"section"},{"location":"observables/types/network/","page":"Network","title":"Network","text":"network","category":"page"},{"location":"observables/types/network/#Rocket.network","page":"Network","title":"Rocket.network","text":"network(::Type{D}, port::Int) where D\nnetwork(::Type{D}, address::A, port::Int) where { D, A <: IPAddr }\n\nnetwork(::Type{Vector{D}}, port::Int, buffer_size::Int) where D\nnetwork(::Type{Vector{D}}, address::A, port::Int, buffer_size::Int) where { D, A <: IPAddr }\n\nCreation operator for the NetworkObservable that emits messages from the server with specified address and port arguments.\n\nSee also: NetworkObservable, subscribe!\n\n\n\n\n\n","category":"function"},{"location":"observables/types/network/","page":"Network","title":"Network","text":"NetworkObservable","category":"page"},{"location":"observables/types/network/#Rocket.NetworkObservable","page":"Network","title":"Rocket.NetworkObservable","text":"NetworkObservable{D, Address, Port, S}()\n\nNetworkObservable listens for the messages of type D from remote server with specified Address and Port parameters.\n\nSee also: network, Subscribable\n\n\n\n\n\n","category":"type"},{"location":"observables/types/function/#observable_function","page":"Function","title":"Function Observable","text":"","category":"section"},{"location":"observables/types/function/","page":"Function","title":"Function","text":"make","category":"page"},{"location":"observables/types/function/#Rocket.make","page":"Function","title":"Rocket.make","text":"make(f::Function, type::Type{D})\n\nCreation operator for the FunctionObservable.\n\nArguments\n\nf: function to be invoked on subscription\ntype: type of data in observable\n\nExamples\n\nusing Rocket\n\nsource = make(Int) do actor\n next!(actor, 0)\n complete!(actor)\nend\n\nsubscription = subscribe!(source, logger());\nunsubscribe!(subscription)\n;\n\n# output\n\n[LogActor] Data: 0\n[LogActor] Completed\n\n\nusing Rocket\n\nsource = make(Int) do actor\n next!(actor, 0)\n setTimeout(100) do\n next!(actor, 1)\n complete!(actor)\n end\nend\n\nsubscription = subscribe!(source, logger())\nunsubscribe!(subscription)\n;\n\n# output\n\n[LogActor] Data: 0\n\nSee also: FunctionObservable, subscribe!, logger\n\n\n\n\n\n","category":"function"},{"location":"observables/types/function/","page":"Function","title":"Function","text":"FunctionObservable","category":"page"},{"location":"observables/types/function/#Rocket.FunctionObservable","page":"Function","title":"Rocket.FunctionObservable","text":"FunctionObservable{D}(f::F)\n\nFunctionObservable wraps a callback f, which is called when the Observable is initially subscribed to. This function is given an Actor, to which new values can be nexted (with next!(actor, data)), or an error! method can be called to raise an error, or complete! can be called to notify of a successful completion.\n\nArguments\n\nf::F: function to be invoked on subscription\n\nSee also: Subscribable, make\n\n\n\n\n\n","category":"type"},{"location":"observables/types/race/#observable_race","page":"Race","title":"Race Observable","text":"","category":"section"},{"location":"observables/types/race/","page":"Race","title":"Race","text":"race","category":"page"},{"location":"observables/types/race/#Rocket.race","page":"Race","title":"Rocket.race","text":"race(sources...)\nrace(sources::S) where { S <: Tuple }\n\nCombines multiple Observables to create an Observable that mirrors the output of the first Observable to emit an item. Essentially it subscribes to the observable that was the first to start emitting.\n\nArguments\n\nsources: input sources\n\nExamples\n\nusing Rocket\n\nsource1 = of(1)\nsource2 = of(2)\n\nsubscribe!(race(source1, source2), logger())\n;\n\n# output\n[LogActor] Data: 1\n[LogActor] Completed\n\nusing Rocket\n\nsource1 = of(1) |> async()\nsource2 = of(2)\n\nsubscribe!(race(source1, source2), logger())\n;\n\n# output\n[LogActor] Data: 2\n[LogActor] Completed\n\nSee also: Subscribable, subscribe!\n\n\n\n\n\n","category":"function"},{"location":"operators/transformation/concat_map_to/#operator_concat_map_to","page":"concat_map_to","title":"ConcatMapTo Operator","text":"","category":"section"},{"location":"operators/transformation/concat_map_to/","page":"concat_map_to","title":"concat_map_to","text":"concat_map_to","category":"page"},{"location":"operators/transformation/concat_map_to/#Rocket.concat_map_to","page":"concat_map_to","title":"Rocket.concat_map_to","text":"switch_map_to(inner_observable)\n\nCreates a switch_map_to operator, which returns an observable of values merged together by joining the passed observable with itself, one after the other, for each value emitted from the source. Essentially it projects each source value to the same Observable which is merged multiple times in a serialized fashion on the output Observable.\n\nArguments\n\ninner_observable: an Observable to replace each value from the source Observable.\n\nProducing\n\nStream of type <: Subscribable{R} where R refers to the eltype of inner_observable\n\nExamples\n\nusing Rocket\n\nsource = from([ 0, 0, 0 ])\nsubscribe!(source |> concat_map_to(from([ 1, 2, 3 ])), logger())\n;\n\n# output\n\n[LogActor] Data: 1\n[LogActor] Data: 2\n[LogActor] Data: 3\n[LogActor] Data: 1\n[LogActor] Data: 2\n[LogActor] Data: 3\n[LogActor] Data: 1\n[LogActor] Data: 2\n[LogActor] Data: 3\n[LogActor] Completed\n\nSee also: concat_map, AbstractOperator, RightTypedOperator, ProxyObservable, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/transformation/concat_map_to/","page":"concat_map_to","title":"concat_map_to","text":"note: Note\nconcat_map_to is equivalent to concat_map with mappingFn set to (_) -> inner_observable.","category":"page"},{"location":"operators/transformation/concat_map_to/#See-also","page":"concat_map_to","title":"See also","text":"","category":"section"},{"location":"operators/transformation/concat_map_to/","page":"concat_map_to","title":"concat_map_to","text":"Operators, concat_map","category":"page"},{"location":"operators/errors/error_if_not/#operator_error_if_not","page":"error_if_not","title":"Error If Not Operator","text":"","category":"section"},{"location":"operators/errors/error_if_not/","page":"error_if_not","title":"error_if_not","text":"Note: error_if_not is an alias for error_if operator with inverted checkFn.","category":"page"},{"location":"operators/errors/error_if_not/","page":"error_if_not","title":"error_if_not","text":"error_if_not","category":"page"},{"location":"operators/errors/error_if_not/#Rocket.error_if_not","page":"error_if_not","title":"Rocket.error_if_not","text":"error_if_not(checkFn, errorFn)\n\nCreates an error_if_not operator, which performs a check for every emission on the source Observable with checkFn. If checkFn returns false, the operator sends an error event and unsubscribes from the observable.\n\nNote: error_if_not is an alias for error_if operator with inverted checkFn.\n\nArguments\n\ncheckFn: check function with (data) -> Bool signature\nerrorFn: error object generating function with (data) -> Any signature, optional\n\nProducing\n\nStream of type <: Subscribable{L} where L refers to type of source stream\n\nExamples\n\nusing Rocket\n\nsource = from([1, 2, 3]) |> error_if_not((data) -> data < 2, (data) -> \"CustomError\")\n\nsubscription = subscribe!(source, lambda(\n on_next = (d) -> println(\"Next: \", d),\n on_error = (e) -> println(\"Error: \", e),\n on_complete = () -> println(\"Completed\")\n))\n;\n\n# output\nNext: 1\nError: CustomError\n\nSee also: error_if, error_if_empty, default_if_empty, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/errors/error_if_not/#See-also","page":"error_if_not","title":"See also","text":"","category":"section"},{"location":"operators/errors/error_if_not/","page":"error_if_not","title":"error_if_not","text":"Operators","category":"page"},{"location":"todo/#TODO","page":"TODO","title":"TODO","text":"","category":"section"},{"location":"todo/","page":"TODO","title":"TODO","text":"This package in under development and some features of the reactive framework not yet implemented.","category":"page"},{"location":"operators/mathematical/count/#operator_count","page":"count","title":"Count Operator","text":"","category":"section"},{"location":"operators/mathematical/count/","page":"count","title":"count","text":"count","category":"page"},{"location":"operators/mathematical/count/#Base.count","page":"count","title":"Base.count","text":"count()\n\nCreates a count operator, which counts the number of emissions on the source and emits that number when the source completes.\n\nProducing\n\nStream of type <: Subscribable{Int}\n\nExamples\n\nusing Rocket\n\nsource = from([ i for i in 1:42 ])\nsubscribe!(source |> count(), logger())\n;\n\n# output\n\n[LogActor] Data: 42\n[LogActor] Completed\n\n\nSee also: AbstractOperator, RightTypedOperator, ProxyObservable, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/mathematical/count/#Description","page":"count","title":"Description","text":"","category":"section"},{"location":"operators/mathematical/count/","page":"count","title":"count","text":"count transforms an Observable that emits values into an Observable that emits a single value that represents the number of values emitted by the source Observable. If the source Observable terminates with an error, count will pass this error notification along without emitting a value first. If the source Observable does not terminate at all, count will neither emit a value nor terminate.","category":"page"},{"location":"operators/mathematical/count/#Example","page":"count","title":"Example","text":"","category":"section"},{"location":"operators/mathematical/count/","page":"count","title":"count","text":"Counts how many values source Observable have emitted before the complete event happened","category":"page"},{"location":"operators/mathematical/count/","page":"count","title":"count","text":"using Rocket\n\nsource = from([ i for i in 1:42 ])\nsubscribe!(source |> count(), logger())\n\n# output\n\n[LogActor] Data: 42\n[LogActor] Completed","category":"page"},{"location":"operators/mathematical/count/#See-also","page":"count","title":"See also","text":"","category":"section"},{"location":"operators/mathematical/count/","page":"count","title":"count","text":"Operators","category":"page"},{"location":"operators/transformation/map_to/#operator_map_to","page":"map_to","title":"MapTo Operator","text":"","category":"section"},{"location":"operators/transformation/map_to/","page":"map_to","title":"map_to","text":"map_to","category":"page"},{"location":"operators/transformation/map_to/#Rocket.map_to","page":"map_to","title":"Rocket.map_to","text":"map_to(value::T) where T\n\nCreates a map operator, which emits the given constant value on the output Observable every time the source Observable emits a value.\n\nArguments\n\nvalue::T: the constant value to map each source value to\n\nProducing\n\nStream of type <: Subscribable{T}\n\nExamples\n\nusing Rocket\n\nsource = from([ 1, 2, 3 ])\nsubscribe!(source |> map_to('a'), logger())\n;\n\n# output\n\n[LogActor] Data: a\n[LogActor] Data: a\n[LogActor] Data: a\n[LogActor] Completed\n\nSee also: map, AbstractOperator, RightTypedOperator, ProxyObservable, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/transformation/map_to/#Description","page":"map_to","title":"Description","text":"","category":"section"},{"location":"operators/transformation/map_to/","page":"map_to","title":"map_to","text":"Takes a constant value as argument, and emits that whenever the source Observable emits a value. In other words, ignores the actual source value, and simply uses the emission moment to know when to emit the given value.","category":"page"},{"location":"operators/transformation/map_to/#See-also","page":"map_to","title":"See also","text":"","category":"section"},{"location":"operators/transformation/map_to/","page":"map_to","title":"map_to","text":"Operators","category":"page"},{"location":"observables/types/merged/#observable_merged","page":"Merged","title":"Merged Observable","text":"","category":"section"},{"location":"observables/types/merged/","page":"Merged","title":"Merged","text":"merged","category":"page"},{"location":"observables/types/merged/#Rocket.merged","page":"Merged","title":"Rocket.merged","text":"merged(sources::T) where { T <: Tuple }\n\nCreation operator for the MergeObservable with a given sources collected in a tuple. merge subscribes to each given input Observable (as arguments), and simply forwards (without doing any transformation) all the values from all the input Observables to the output Observable. The output Observable only completes once all input Observables have completed. Any error delivered by an input Observable will be immediately emitted on the output Observable.\n\nExamples\n\nusing Rocket\n\nobservable = merged((from(1:4), of(2.0), from(\"Hello\")))\n\nsubscribe!(observable, logger())\n;\n\n# output\n[LogActor] Data: 1\n[LogActor] Data: 2\n[LogActor] Data: 3\n[LogActor] Data: 4\n[LogActor] Data: 2.0\n[LogActor] Data: H\n[LogActor] Data: e\n[LogActor] Data: l\n[LogActor] Data: l\n[LogActor] Data: o\n[LogActor] Completed\n\nusing Rocket\n\nsubject = Subject(Int, scheduler = AsyncScheduler())\n\nobservable = merged((subject, of(2.0), from(\"Hello\")))\n\nactor = sync(logger())\n\nsubscribe!(observable, actor)\n\nsetTimeout(200) do\n next!(subject, 1)\n complete!(subject)\nend\n\nwait(actor)\n;\n\n# output\n[LogActor] Data: 2.0\n[LogActor] Data: H\n[LogActor] Data: e\n[LogActor] Data: l\n[LogActor] Data: l\n[LogActor] Data: o\n[LogActor] Data: 1\n[LogActor] Completed\n\nSee also: Subscribable\n\n\n\n\n\n","category":"function"},{"location":"operators/transformation/uppercase/#operator_uppercase","page":"uppercase","title":"Uppercase Operator","text":"","category":"section"},{"location":"operators/transformation/uppercase/","page":"uppercase","title":"uppercase","text":"uppercase","category":"page"},{"location":"operators/transformation/uppercase/#Base.Unicode.uppercase","page":"uppercase","title":"Base.Unicode.uppercase","text":"uppercase()\n\nCreates an uppercase operator, which forces each value to be in upper case\n\nProducing\n\nStream of type <: Subscribable{L} where L referes to type of data of input Observable\n\nExamples\n\nusing Rocket\n\nsource = of(\"Hello, world!\")\nsubscribe!(source |> uppercase(), logger())\n;\n\n# output\n\n[LogActor] Data: HELLO, WORLD!\n[LogActor] Completed\n\nSee also: AbstractOperator, InferableOperator, ProxyObservable, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/transformation/uppercase/#See-also","page":"uppercase","title":"See also","text":"","category":"section"},{"location":"operators/transformation/uppercase/","page":"uppercase","title":"uppercase","text":"Operators, map, lowercase","category":"page"},{"location":"observables/types/file/#observable_file","page":"File","title":"File Observable","text":"","category":"section"},{"location":"observables/types/file/","page":"File","title":"File","text":"file","category":"page"},{"location":"observables/types/file/#Rocket.file","page":"File","title":"Rocket.file","text":"file(path::String)\n\nCreation operator for the SyncFileObservable with a given path.\n\nSee also: SyncFileObservable\n\n\n\n\n\n","category":"function"},{"location":"observables/types/file/","page":"File","title":"File","text":"SyncFileObservable","category":"page"},{"location":"observables/types/file/#Rocket.SyncFileObservable","page":"File","title":"Rocket.SyncFileObservable","text":"SyncFileObservable(path::String)\n\nFile observable, which synchronously emits content of the file line by line as a String objects on subscription.\n\nSee also: file, Subscribable\n\n\n\n\n\n","category":"type"},{"location":"operators/mathematical/reduce/#operator_reduce","page":"reduce","title":"Reduce Operator","text":"","category":"section"},{"location":"operators/mathematical/reduce/","page":"reduce","title":"reduce","text":"reduce","category":"page"},{"location":"operators/mathematical/reduce/#Base.reduce","page":"reduce","title":"Base.reduce","text":"reduce(::Type{R}, reduceFn::Function, seed::R) where R\nreduce(reduceFn::F) where { F <: Function }\n\nCreates a reduce operator, which applies a given accumulator reduceFn function over the source Observable, and returns the accumulated result when the source completes, given an optional seed value. If a seed value is specified, then that value will be used as the initial value for the accumulator. If no seed value is specified, the first item of the source is used as the seed.\n\nArguments\n\n::Type{R}: the type of data of transformed value\nreduceFn::Function: transformation function with (data::T, current::R) -> R signature\nseed::R: optional seed accumulation value\n\nProducing\n\nStream of type <: Subscribable{R}\n\nExamples\n\nusing Rocket\n\nsource = from([ i for i in 1:10 ])\nsubscribe!(source |> reduce(Vector{Int}, (d, c) -> [ c..., d ], Int[]), logger())\n;\n\n# output\n\n[LogActor] Data: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]\n[LogActor] Completed\n\n\nusing Rocket\n\nsource = from([ i for i in 1:42 ])\nsubscribe!(source |> reduce(+), logger())\n;\n\n# output\n\n[LogActor] Data: 903\n[LogActor] Completed\n\n\nSee also: AbstractOperator, RightTypedOperator, ProxyObservable, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/mathematical/reduce/#Description","page":"reduce","title":"Description","text":"","category":"section"},{"location":"operators/mathematical/reduce/","page":"reduce","title":"reduce","text":"reduce applies an accumulator function to each value of the source Observable (from the past) and reduces it to a single value that is emitted by the output Observable. Note that reduce will only emit one value, only when the source Observable completes. It is equivalent to applying scan followed by last.","category":"page"},{"location":"operators/mathematical/reduce/","page":"reduce","title":"reduce","text":"It returns an Observable that applies a specified accumulator function to each item emitted by the source Observable. If a seed value is specified, then that value will be used as the initial value of the accumulator. If no seed value is specified, the first item of the source is used as the seed.","category":"page"},{"location":"operators/mathematical/reduce/#See-also","page":"reduce","title":"See also","text":"","category":"section"},{"location":"operators/mathematical/reduce/","page":"reduce","title":"reduce","text":"Operators, scan, last","category":"page"},{"location":"operators/filtering/some/#operator_some","page":"some","title":"Some Operator","text":"","category":"section"},{"location":"operators/filtering/some/","page":"some","title":"some","text":"some","category":"page"},{"location":"operators/filtering/some/#Rocket.some","page":"some","title":"Rocket.some","text":"some()\n\nCreates a some operator, which filters out nothing items by the source Observable by emitting only those that not equal to nothing.\n\nProducing\n\nStream of type <: Subscribable{L} where L refers to type of source stream <: Subscribable{Union{L, Nothing}}\n\nExamples\n\nusing Rocket\n\nsource = from([ 1, nothing, 3 ])\nsubscribe!(source |> some(), logger())\n;\n\n# output\n\n[LogActor] Data: 1\n[LogActor] Data: 3\n[LogActor] Completed\n\n\nSee also: AbstractOperator, InferableOperator, ProxyObservable, max, min, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/filtering/some/#Description","page":"some","title":"Description","text":"","category":"section"},{"location":"operators/filtering/some/","page":"some","title":"some","text":"This operator takes values from the source Observable and only emits those values that are not nothing.","category":"page"},{"location":"operators/filtering/some/#See-also","page":"some","title":"See also","text":"","category":"section"},{"location":"operators/filtering/some/","page":"some","title":"some","text":"Operators, filter","category":"page"},{"location":"actors/types/storage/#actor_storage","page":"Storage","title":"Storage actor","text":"","category":"section"},{"location":"actors/types/storage/","page":"Storage","title":"Storage","text":"storage","category":"page"},{"location":"actors/types/storage/#Rocket.storage","page":"Storage","title":"Rocket.storage","text":"storage(::Type{T}) where T\n\nArguments\n\n::Type{T}: Type of storage data\n\nCreation operator for the StorageActor actor.\n\nExamples\n\nusing Rocket\n\nactor = storage(Int)\nactor isa StorageActor{Int}\n\n# output\ntrue\n\nSee also: StorageActor, AbstractActor\n\n\n\n\n\n","category":"function"},{"location":"actors/types/storage/","page":"Storage","title":"Storage","text":"StorageActor","category":"page"},{"location":"actors/types/storage/#Rocket.StorageActor","page":"Storage","title":"Rocket.StorageActor","text":"StorageActor{D}() where D\n\nStorage actor provides an actor that stores a single (last) value passed to the next! callback. It saves last incoming successful next event in the value field, throws an ErrorException on error! event and does nothing on completion event. Before any events value initialised with nothing.\n\nExamples\n\nusing Rocket\n\nsource = from(1:5)\nactor = storage(Int)\n\nsubscribe!(source, actor)\nshow(getvalues(actor))\n\n# output\n5\n\nSee also: Actor, storage\n\n\n\n\n\n","category":"type"},{"location":"operators/multicasting/publish/#operator_publish","page":"publish","title":"Publish Operators","text":"","category":"section"},{"location":"operators/multicasting/publish/","page":"publish","title":"publish","text":"publish\npublish_behavior\npublish_replay\npublish_recent","category":"page"},{"location":"operators/multicasting/publish/#Rocket.publish","page":"publish","title":"Rocket.publish","text":"publish(; scheduler::H = AsapScheduler()) where { H <: AbstractScheduler }\n\npublish() is a shortcut for multicast(SubjectFactory())\n\nSee also: AbstractOperator, multicast, SubjectFactory\n\n\n\n\n\n","category":"function"},{"location":"operators/multicasting/publish/#Rocket.publish_behavior","page":"publish","title":"Rocket.publish_behavior","text":"publish_behavior(default; scheduler::H = AsapScheduler()) where { H <: AbstractScheduler }\n\npublish_behavior(default) is a shortcut for multicast(BehaviorSubjectFactory(default))\n\nSee also: AbstractOperator, multicast, BehaviorSubjectFactory\n\n\n\n\n\n","category":"function"},{"location":"operators/multicasting/publish/#Rocket.publish_replay","page":"publish","title":"Rocket.publish_replay","text":"publish_replay(size::Int; scheduler::H = AsapScheduler()) where { H <: AbstractScheduler }\n\npublish_replay(size) is a shortcut for multicast(ReplaySubjectFactory(size))\n\nSee also: AbstractOperator, multicast, ReplaySubjectFactory\n\n\n\n\n\n","category":"function"},{"location":"operators/multicasting/publish/#Rocket.publish_recent","page":"publish","title":"Rocket.publish_recent","text":"publish_recent(; scheduler::H = AsapScheduler()) where { H <: AbstractScheduler }\n\npublish_recent(size) is a shortcut for multicast(RecentSubjectFactory())\n\nSee also: AbstractOperator, multicast, RecentSubjectFactory\n\n\n\n\n\n","category":"function"},{"location":"operators/multicasting/publish/#See-also","page":"publish","title":"See also","text":"","category":"section"},{"location":"operators/multicasting/publish/","page":"publish","title":"publish","text":"Operators","category":"page"},{"location":"#Rocket.jl-Documentation","page":"Home","title":"Rocket.jl Documentation","text":"","category":"section"},{"location":"","page":"Home","title":"Home","text":"Welcome to the documentation for Rocket.jl.","category":"page"},{"location":"","page":"Home","title":"Home","text":"This documentation is an adaptation of the RxJS library documentation.","category":"page"},{"location":"#Table-of-Contents","page":"Home","title":"Table of Contents","text":"","category":"section"},{"location":"","page":"Home","title":"Home","text":"Pages = [\n \"getting-started.md\",\n \"observables/about.md\",\n \"actors/about.md\",\n \"teardown/about.md\",\n \"operators/about.md\",\n \"operators/piping.md\",\n \"operators/create-new-operator.md\",\n \"operators/high-order.md\",\n \"todo.md\",\n \"contributing.md\",\n \"utils.md\"\n]\nDepth = 2","category":"page"},{"location":"#Index","page":"Home","title":"Index","text":"","category":"section"},{"location":"","page":"Home","title":"Home","text":"","category":"page"},{"location":"actors/types/logger/#actor_logger","page":"Logger","title":"Logger actor","text":"","category":"section"},{"location":"actors/types/logger/","page":"Logger","title":"Logger","text":"logger","category":"page"},{"location":"actors/types/logger/#Rocket.logger","page":"Logger","title":"Rocket.logger","text":"logger([ io::IO ], name::String = \"LogActor\")\nlogger(::Type{T}, [ io::IO ], name::String = \"LogActor\") where T\n\nCreation operator for the LoggerActor actor.\n\nExamples\n\nusing Rocket\n\nsource = from([ 0, 1, 2 ])\nsubscribe!(source, logger())\n;\n\n# output\n\n[LogActor] Data: 0\n[LogActor] Data: 1\n[LogActor] Data: 2\n[LogActor] Completed\n\nusing Rocket\n\nsource = from([ 0, 1, 2 ])\nsubscribe!(source, logger(\"CustomName\"))\n;\n\n# output\n\n[CustomName] Data: 0\n[CustomName] Data: 1\n[CustomName] Data: 2\n[CustomName] Completed\n\nusing Rocket\n\nbuffer = IOBuffer()\n\nsource = from([ 0, 1, 2 ])\nsubscribe!(source, logger(buffer, \"CustomBuffer\"))\n;\n\nprint(String(take!(buffer)))\n# output\n\n[CustomBuffer] Data: 0\n[CustomBuffer] Data: 1\n[CustomBuffer] Data: 2\n[CustomBuffer] Completed\n\nSee also: LoggerActor, AbstractActor\n\n\n\n\n\n","category":"function"},{"location":"actors/types/logger/","page":"Logger","title":"Logger","text":"LoggerActor","category":"page"},{"location":"actors/types/logger/#Rocket.LoggerActor","page":"Logger","title":"Rocket.LoggerActor","text":"LoggerActor{D}(name::String = \"LogActor\", io::O) where { D, O }\n\nThe LoggerActor logs all next!/error!/complete! events that are sent from an Observable.\n\nConstructor arguments\n\nname: name of the logger. Optional. Default is LogActor.\nio: io stream to log in, maybe nothing to write to stdout\n\nSee also: Actor, logger\n\n\n\n\n\n","category":"type"},{"location":"operators/multicasting/about/#Multicasting-category","page":"About multicasting operators","title":"Multicasting category","text":"","category":"section"},{"location":"operators/multicasting/about/","page":"About multicasting operators","title":"About multicasting operators","text":"There are operators for different purposes, and they may be categorized as: creation, transformation, filtering, joining, multicasting, error handling, utility, etc. In the following list you will find all the operators organized in multicasting category.","category":"page"},{"location":"operators/multicasting/about/","page":"About multicasting operators","title":"About multicasting operators","text":"multicast\npublish\npublish_behavior\npublish_replay\nshare\nshare_replay","category":"page"},{"location":"operators/multicasting/about/#See-also","page":"About multicasting operators","title":"See also","text":"","category":"section"},{"location":"operators/multicasting/about/","page":"About multicasting operators","title":"About multicasting operators","text":"Operators","category":"page"},{"location":"observables/types/zipped/#observable_zipped","page":"Zipped","title":"Zipped Observable","text":"","category":"section"},{"location":"observables/types/zipped/","page":"Zipped","title":"Zipped","text":"zipped","category":"page"},{"location":"observables/types/zipped/#Rocket.zipped","page":"Zipped","title":"Rocket.zipped","text":"zipped(sources...)\n\nCombines multiple Observables to create an Observable whose values are calculated from the values, in order, of each of its input Observables.\n\nArguments\n\nsources: input sources\n\nExamples\n\nusing Rocket\n\nsource = zipped(of(1), from(2:5))\n\nsubscribe!(source, logger())\n;\n\n# output\n\n[LogActor] Data: (1, 2)\n[LogActor] Completed\n\nusing Rocket\n\nsource = zipped(from(1:3), from(1:5))\n\nsubscribe!(source, logger())\n;\n\n# output\n\n[LogActor] Data: (1, 1)\n[LogActor] Data: (2, 2)\n[LogActor] Data: (3, 3)\n[LogActor] Completed\n\nusing Rocket\n\nsource = zipped(completed(), of(0.0))\n\nsubscribe!(source, logger())\n;\n\n# output\n\n[LogActor] Completed\n\nSee also: Subscribable, subscribe!\n\n\n\n\n\n","category":"function"},{"location":"contributing/#Contribution-guidelines","page":"Contributing","title":"Contribution guidelines","text":"","category":"section"},{"location":"contributing/","page":"Contributing","title":"Contributing","text":"We welcome all possible contributors. This page details the some of the guidelines that should be followed when contributing to this package.","category":"page"},{"location":"contributing/#Reporting-bugs","page":"Contributing","title":"Reporting bugs","text":"","category":"section"},{"location":"contributing/","page":"Contributing","title":"Contributing","text":"We track bugs using GitHub issues. We encourage you to write complete, specific, reproducible bug reports. Mention the versions of Julia and Rocket.jl for which you observe unexpected behavior. Please provide a concise description of the problem and complement it with code snippets, test cases, screenshots, tracebacks or any other information that you consider relevant. This will help us to replicate the problem and narrow the search space for solutions.","category":"page"},{"location":"contributing/#Suggesting-features","page":"Contributing","title":"Suggesting features","text":"","category":"section"},{"location":"contributing/","page":"Contributing","title":"Contributing","text":"We welcome new feature proposals. However, before submitting a feature request, consider a few things:","category":"page"},{"location":"contributing/","page":"Contributing","title":"Contributing","text":"Does the feature require changes in the core Rocket.jl code? If it doesn't (for example, you would like to add a operator for a particular application), consider making a separate repository for your extensions.\nIf you would like to add an implementation of a feature that changes a lot in the core Rocket.jl code, please open an issue on GitHub and describe your proposal first. This will allow us to discuss your proposal with you before you invest your time in implementing something that may be difficult to merge later on.","category":"page"},{"location":"contributing/#Contributing-code","page":"Contributing","title":"Contributing code","text":"","category":"section"},{"location":"contributing/#Installing-Rocket","page":"Contributing","title":"Installing Rocket","text":"","category":"section"},{"location":"contributing/","page":"Contributing","title":"Contributing","text":"We suggest that you use the dev command from the new Julia package manager to install Rocket.jl for development purposes. To work on your fork of Rocket.jl, use your fork's URL address in the dev command, for example:","category":"page"},{"location":"contributing/","page":"Contributing","title":"Contributing","text":"] dev git@github.com:your_username/Rocket.jl.git","category":"page"},{"location":"contributing/","page":"Contributing","title":"Contributing","text":"The dev command clones Rocket.jl to ~/.julia/dev/Rocket. All local changes to Rocket code will be reflected in imported code.","category":"page"},{"location":"contributing/","page":"Contributing","title":"Contributing","text":"note: Note\nIt is also might be useful to install Revise.jl package as it allows you to modify code and use the changes without restarting Julia.","category":"page"},{"location":"contributing/#Committing-code","page":"Contributing","title":"Committing code","text":"","category":"section"},{"location":"contributing/","page":"Contributing","title":"Contributing","text":"We use the standard GitHub Flow workflow where all contributions are added through pull requests. In order to contribute, first fork the repository, then commit your contributions to your fork, and then create a pull request on the master branch of the Rocket.jl repository.","category":"page"},{"location":"contributing/","page":"Contributing","title":"Contributing","text":"Before opening a pull request, please make sure that all tests pass without failing! All demos (can be found in /demo/ directory) have to run without errors as well.","category":"page"},{"location":"contributing/#Style-conventions","page":"Contributing","title":"Style conventions","text":"","category":"section"},{"location":"contributing/","page":"Contributing","title":"Contributing","text":"We use default Julia style guide. We list here a few important points and our modifications to the Julia style guide:","category":"page"},{"location":"contributing/","page":"Contributing","title":"Contributing","text":"Use 4 spaces for indentation\nType names use UpperCamelCase. For example: ArrayObservable, MapOperator, etc..\nFunction names are lowercase with underscores, when necessary. For example: next!, subscribe!, as_actor, etc..\nVariable names and function arguments use snake_case\nThe name of a method that modifies its argument(s) must end in !","category":"page"},{"location":"contributing/#Unit-tests","page":"Contributing","title":"Unit tests","text":"","category":"section"},{"location":"contributing/","page":"Contributing","title":"Contributing","text":"We use the test-driven development (TDD) methodology for Rocket.jl development. The test coverage should be as complete as possible. Please make sure that you write tests for each piece of code that you want to add.","category":"page"},{"location":"contributing/","page":"Contributing","title":"Contributing","text":"All unit tests are located in the /test/ directory. The /test/ directory follows the structure of the /src/ directory. Each test file should have following filename format: test_*.jl. Some tests are also present in jldoctest docs annotations directly in the source code. See Julia's documentation about doctests.","category":"page"},{"location":"contributing/","page":"Contributing","title":"Contributing","text":"The tests can be evaluated by running following command in the Julia REPL:","category":"page"},{"location":"contributing/","page":"Contributing","title":"Contributing","text":"] test Rocket","category":"page"},{"location":"operators/transformation/override/#operator_override","page":"override","title":"Override Operator","text":"","category":"section"},{"location":"operators/transformation/override/","page":"override","title":"override","text":"override\nOverrideHandler","category":"page"},{"location":"operators/transformation/override/#Rocket.override","page":"override","title":"Rocket.override","text":"override(handler::OverrideHandler)\n\nCreates an override operator that overrides each emission from source observable with value provided in handler. If handler contains nothing source observable emits as usual. For constant override see map_to. Use Rocket.setvalue! to set new value for handler.\n\nProducing\n\nStream of type <: Subscribable{Union{L, T}} where L refers to the type of source stream and T referes to the type of handler's value\n\nExamples\n\nusing Rocket \n\nsubject = Subject(Int)\nhandler = OverrideHandler(Int, -1)\n\nsource = subject |> override(handler)\n\nsubscription = subscribe!(source, logger())\n\nnext!(subject, 1)\nnext!(subject, 2)\n\nRocket.setvalue!(handler, nothing)\n\nnext!(subject, 3)\nnext!(subject, 4)\n\nRocket.setvalue!(handler, -2)\n\nnext!(subject, 5)\nnext!(subject, 6)\n\nunsubscribe!(subscription)\n\n# output\n[LogActor] Data: -1\n[LogActor] Data: -1\n[LogActor] Data: 3\n[LogActor] Data: 4\n[LogActor] Data: -2\n[LogActor] Data: -2\n\nSee also: OverrideHandler\n\n\n\n\n\n","category":"function"},{"location":"operators/transformation/override/#Rocket.OverrideHandler","page":"override","title":"Rocket.OverrideHandler","text":"OverrideHandler(::Type{T}, value::Union{Nothing, T}) where T\nOverrideHandler(::Type{T}) where T\n\nHandler used in substitute operator.\n\nSee also: substitute\n\n\n\n\n\n","category":"type"},{"location":"operators/transformation/override/#See-also","page":"override","title":"See also","text":"","category":"section"},{"location":"operators/transformation/override/","page":"override","title":"override","text":"Operators","category":"page"},{"location":"operators/filtering/find/#operator_find","page":"find","title":"Find operator","text":"","category":"section"},{"location":"operators/filtering/find/","page":"find","title":"find","text":"find","category":"page"},{"location":"operators/filtering/find/#Rocket.find","page":"find","title":"Rocket.find","text":"find(conditionFn::F) where { F <: Function }\n\nCreates a find operator, which emits only the first value emitted by the source Observable that meets some condition.\n\nProducing\n\nStream of type <: Subscribable{L} where L refers to type of source stream\n\nArguments\n\nconditionFn::F: condition function with (data::T) -> Bool signature\n\nExamples\n\nusing Rocket\n\nsource = from([ 1, 2, 3, 4, 5, 6, 7, 8 ])\nsubscribe!(source |> find((d) -> d % 2 == 0), logger())\n;\n\n# output\n\n[LogActor] Data: 2\n[LogActor] Completed\n\nSee also: AbstractOperator, InferableOperator, ProxyObservable, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/filtering/find/#Description","page":"find","title":"Description","text":"","category":"section"},{"location":"operators/filtering/find/","page":"find","title":"find","text":"find searches for the first item in the source Observable that matches the specified condition embodied by the predicate, and returns the first occurrence in the source. Does not emit an error if a valid value is not found.","category":"page"},{"location":"operators/filtering/find/#See-also","page":"find","title":"See also","text":"","category":"section"},{"location":"operators/filtering/find/","page":"find","title":"find","text":"Operators, take","category":"page"},{"location":"operators/utility/discontinue/#operator_discontinue","page":"discontinue","title":"Discontinue Operator","text":"","category":"section"},{"location":"operators/utility/discontinue/","page":"discontinue","title":"discontinue","text":"discontinue","category":"page"},{"location":"operators/utility/discontinue/#Rocket.discontinue","page":"discontinue","title":"Rocket.discontinue","text":"discontinue()\n\nCreates an operator, which prevents an emitting of self-depending messages and breaks a possible infinite loop. Does nothing if observable scheduled asynchronously.\n\nProducing\n\nStream of type <: Subscribable{L} where L refers to type of source stream\n\nExamples\n\nusing Rocket\n\ns = BehaviorSubject(0)\n\nsubscription1 = subscribe!(s, logger())\nsubscription2 = subscribe!(s |> map(Int, d -> d + 1) |> discontinue(), s)\n;\n\n# output\n\n[LogActor] Data: 0\n[LogActor] Data: 1\n\nSee also: AbstractOperator, RightTypedOperator, ProxyObservable, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/utility/discontinue/#See-also","page":"discontinue","title":"See also","text":"","category":"section"},{"location":"operators/utility/discontinue/","page":"discontinue","title":"discontinue","text":"Operators","category":"page"},{"location":"teardown/about/#section_subscription","page":"Subscription","title":"Subscription","text":"","category":"section"},{"location":"teardown/about/","page":"Subscription","title":"Subscription","text":"A Subscription represents a disposable resource, usually the execution of an Observable. A Subscription has one important method: unsubscribe!(teardown), which takes some teardown logic object as one argument and disposes the resource held by the subscription.","category":"page"},{"location":"teardown/about/","page":"Subscription","title":"Subscription","text":"using Rocket\n\nsource = Subject(Int)\n\nnext!(source, 0) # Logs nothing as there is no subscribers\n\nsubscription = subscribe!(source, logger())\n\nnext!(source, 1) # Logs [LogActor] Data: 1 into standard output\n\nunsubscribe!(subscription)\n\nnext!(source, 2) # Logs nothing as a single one actor has unsubscribed","category":"page"},{"location":"teardown/about/","page":"Subscription","title":"Subscription","text":"note: Note\nA Subscription essentially just has its own specific method for unsubscribe!() function which releases resources or cancel Observable executions. Any Observable has to return a valid Teardown object.","category":"page"},{"location":"teardown/about/","page":"Subscription","title":"Subscription","text":"The unsubscribe! function also supports multiple unsubscriptions at once. If the input argument to the unsubscribe! function is either a tuple or a vector, it will first check that all of the arguments are valid subscription objects and if this is true it will unsubscribe from each of them individually.","category":"page"},{"location":"teardown/about/","page":"Subscription","title":"Subscription","text":"\nsource = Subject(Int)\n\nsubscription1 = subscribe!(source, logger())\nsubscription2 = subscribe!(source, logger())\n\nunsubscribe!((subscription1, subscription2))\n\n# or similarly\n# unsubscribe!([ subscription1, subscription2 ])\n","category":"page"},{"location":"teardown/about/","page":"Subscription","title":"Subscription","text":"For more information about subscription and teardown logic see the API Section","category":"page"},{"location":"operators/transformation/switch_map_to/#operator_switch_map_to","page":"switch_map_to","title":"SwitchMapTo Operator","text":"","category":"section"},{"location":"operators/transformation/switch_map_to/","page":"switch_map_to","title":"switch_map_to","text":"switch_map_to","category":"page"},{"location":"operators/transformation/switch_map_to/#Rocket.switch_map_to","page":"switch_map_to","title":"Rocket.switch_map_to","text":"switch_map_to(inner_observable)\n\nCreates a switch_map_to operator, which projects each source value to the same Observable which is flattened multiple times with switch_map in the output Observable.\n\nArguments\n\ninner_observable: an Observable to replace each value from the source Observable.\n\nProducing\n\nStream of type <: Subscribable{R} where R refers to the eltype of inner_observable\n\nExamples\n\nusing Rocket\n\nsource = from([ 0, 0, 0 ])\nsubscribe!(source |> switch_map_to(from([ 1, 2, 3 ])), logger())\n;\n\n# output\n\n[LogActor] Data: 1\n[LogActor] Data: 2\n[LogActor] Data: 3\n[LogActor] Data: 1\n[LogActor] Data: 2\n[LogActor] Data: 3\n[LogActor] Data: 1\n[LogActor] Data: 2\n[LogActor] Data: 3\n[LogActor] Completed\n\nSee also: switch_map, AbstractOperator, RightTypedOperator, ProxyObservable, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/transformation/switch_map_to/","page":"switch_map_to","title":"switch_map_to","text":"note: Note\nswitch_map_to is equivalent to switch_map with mappingFn set to (_) -> inner_observable.","category":"page"},{"location":"operators/transformation/switch_map_to/#See-also","page":"switch_map_to","title":"See also","text":"","category":"section"},{"location":"operators/transformation/switch_map_to/","page":"switch_map_to","title":"switch_map_to","text":"Operators","category":"page"},{"location":"operators/errors/rerun/#operator_rerun","page":"rerun","title":"Rerun Operator","text":"","category":"section"},{"location":"operators/errors/rerun/","page":"rerun","title":"rerun","text":"rerun","category":"page"},{"location":"operators/errors/rerun/#Rocket.rerun","page":"rerun","title":"Rocket.rerun","text":"rerun(count::Int = -1)\n\nReturns an Observable that mirrors the source Observable with the exception of an error. If the source Observable calls error, this method will resubscribe to the source Observable for a maximum of count resubscriptions (given as a number parameter) rather than propagating the error call.\n\nArguments:\n\ncount::Int: Number of retry attempts before failing. Optional. Default is -1.\n\nProducing\n\nStream of type <: Subscribable{L} where L refers to type of source stream\n\nExamples\n\nusing Rocket\n\nsource = from(1:3) |> safe() |> map(Int, (d) -> d > 1 ? error(\"Error\") : d) |> rerun(3)\n\nsubscribe!(source, logger())\n;\n\n# output\n[LogActor] Data: 1\n[LogActor] Data: 1\n[LogActor] Data: 1\n[LogActor] Data: 1\n[LogActor] Error: ErrorException(\"Error\")\n\nSee also: AbstractOperator, InferableOperator, catch_error, logger, safe\n\n\n\n\n\n","category":"function"},{"location":"operators/errors/rerun/#Description","page":"rerun","title":"Description","text":"","category":"section"},{"location":"operators/errors/rerun/","page":"rerun","title":"rerun","text":"Any and all items emitted by the source Observable will be emitted by the resulting Observable, even those emitted during failed subscriptions. For example, if an Observable fails at first but emits [1, 2] then succeeds the second time and emits: [1, 2, 3, 4, 5] then the complete stream of emissions and notifications would be: [1, 2, 1, 2, 3, 4, 5, complete].","category":"page"},{"location":"operators/errors/rerun/#See-also","page":"rerun","title":"See also","text":"","category":"section"},{"location":"operators/errors/rerun/","page":"rerun","title":"rerun","text":"Operators","category":"page"},{"location":"observables/types/timer/#observable_timer","page":"Timer","title":"Timer Observable","text":"","category":"section"},{"location":"observables/types/timer/","page":"Timer","title":"Timer","text":"timer","category":"page"},{"location":"observables/types/timer/#Rocket.timer","page":"Timer","title":"Rocket.timer","text":"timer(delay::Int)\ntimer(delay::Int, period::Int)\n\nCreation operator for the TimerObservable. Its like interval(@ref), but you can specify when should the emissions start. timer returns an Observable that emits an infinite sequence of ascending integers, with a constant interval of time, period of your choosing between those emissions. The first emission happens after the specified delay. If period is not specified, the output Observable emits only one value, 0. Otherwise, it emits an infinite sequence. The timer closes automatically when the unsubscription happens.\n\nArguments\n\ndelay: the initial delay time specified as an integer denoting milliseconds to wait before emitting the first value of 0.\nperiod: the minimum period of time between emissions of the subsequent numbers (in milliseconds).\n\nExamples\n\nusing Rocket\n\nsource = timer(0, 50)\n\nsleep(0.075)\nsubscription = subscribe!(source, logger())\nsleep(0.105)\nunsubscribe!(subscription)\n\n;\n\n# output\n\n[LogActor] Data: 2\n[LogActor] Data: 3\n\n\nSee also: interval, TimerObservable, subscribe!, logger\n\n\n\n\n\n","category":"function"},{"location":"observables/types/timer/","page":"Timer","title":"Timer","text":"TimerObservable","category":"page"},{"location":"observables/types/timer/#Rocket.TimerObservable","page":"Timer","title":"Rocket.TimerObservable","text":"TimerObservable\n\nAn Observable that starts emitting after an delay and emits ever increasing numbers after each period of time thereafter.\n\nParameters\n\ndelay: The initial delay time specified as an integer denoting milliseconds to wait before emitting the first value of 0`.\nperiod: The minimum period of time in milliseconds between emissions of the subsequent numbers.\n\nSee also: timer, Subscribable\n\n\n\n\n\n","category":"type"},{"location":"actors/about/#section_actors","page":"Actor","title":"Actors","text":"","category":"section"},{"location":"actors/about/","page":"Actor","title":"Actor","text":"An Actor is the most primitive unit of computation: it receives a message and performs a computation.","category":"page"},{"location":"actors/about/","page":"Actor","title":"Actor","text":"An actor is analogous to an object in an object-oriented languages. An object receives a message (a method call) and does something depending on which message it receives (the method we are calling). The main difference is that actors are completely isolated from each other, and they will never share memory. It’s also worth mentioning that an actor can maintain a private state that should never be changed directly by another actor.","category":"page"},{"location":"actors/about/","page":"Actor","title":"Actor","text":"For a quick introduction to Actor models, see this article.","category":"page"},{"location":"actors/about/","page":"Actor","title":"Actor","text":"The API of Rocket.jl's Actors is similar to RxJS subscribers.","category":"page"},{"location":"actors/about/#First-example","page":"Actor","title":"First example","text":"","category":"section"},{"location":"actors/about/","page":"Actor","title":"Actor","text":"The following example implements an Actor that retains each received value from an Observable.","category":"page"},{"location":"actors/about/","page":"Actor","title":"Actor","text":"using Rocket\n\nstruct CustomKeepActor <: Actor{Int}\n values::Vector{Int}\n\n CustomKeepActor() = new(Vector{Int}())\nend\n\nRocket.on_next!(actor::CustomKeepActor, data::Int) = push!(actor.values, data)\nRocket.on_error!(actor::CustomKeepActor, err) = error(err)\nRocket.on_complete!(actor::CustomKeepActor) = println(\"Completed!\")\n\nsource = from([ 1, 2, 3 ])\nkeep_actor = CustomKeepActor()\nsubscribe!(source, keep_actor)\n\n# Logs\n# Completed!\n\nprintln(keep_actor.values)\n\n# Logs\n# [1, 2, 3]","category":"page"},{"location":"actors/about/","page":"Actor","title":"Actor","text":"An actor may be not interested in the values itself, but merely the completion of an event. In this case, Rocket.jl provides a CompletionActor abstract type. See also NextActor and ErrorActor.","category":"page"},{"location":"actors/about/","page":"Actor","title":"Actor","text":"using Rocket\n\nstruct CompletionNotificationActor <: CompletionActor{Int} end\n\nRocket.on_complete!(::CompletionNotificationActor) = println(\"Completed!\")\n\nsource = from([ 1, 2, 3 ])\nsubscribe!(source, CompletionNotificationActor());\n\n# Logs\n# Completed","category":"page"},{"location":"actors/about/","page":"Actor","title":"Actor","text":"It is also possible to use Julia's multiple dispatch feature and dispatch on type of the event","category":"page"},{"location":"actors/about/","page":"Actor","title":"Actor","text":"using Rocket\n\nstruct MyCustomActor <: NextActor{Any} end\n\nRocket.on_next!(::MyCustomActor, data::Int) = println(\"Int: $data\")\nRocket.on_next!(::MyCustomActor, data::Float64) = println(\"Float64: $data\")\nRocket.on_next!(::MyCustomActor, data) = println(\"Something else: $data\")\n\nsource = from([ 1, 1.0, \"string\" ])\nsubscribe!(source, MyCustomActor());\n\n# Logs\n# Int: 1\n# Float64: 1.0\n# Something else: string\n","category":"page"},{"location":"actors/about/#Lambda-actor","page":"Actor","title":"Lambda actor","text":"","category":"section"},{"location":"actors/about/","page":"Actor","title":"Actor","text":"For debugging purposes it may be convenient to work with a LambdaActor. This provides an interface that defines callbacks for \"next\", \"error\" and \"complete\" events. But this generic actor does not allow to dispatch on the type of the event.","category":"page"},{"location":"actors/about/","page":"Actor","title":"Actor","text":"using Rocket\n\nsource = from([1, 2, 3])\n\nsubscribe!(source, lambda(\n on_next = (d) -> println(d),\n on_error = (e) -> error(e),\n on_complete = () -> println(\"Completed\")\n))\n\n# Logs\n# 1\n# 2\n# 3\n# Completed","category":"page"},{"location":"actors/about/#Function-actor","page":"Actor","title":"Function actor","text":"","category":"section"},{"location":"actors/about/","page":"Actor","title":"Actor","text":"Sometimes it is convenient to pass only on_next callback. Rocket.jl provides a FunctionActor which automatically converts any function object passed in the subscribe! function to a proper actor which listens only for data events, throws an exception on error event and ignores completion message.","category":"page"},{"location":"actors/about/","page":"Actor","title":"Actor","text":"using Rocket\n\nsource = from([1, 2, 3])\n\nsubscribe!(source, (d) -> println(d))\n\n# Logs\n# 1\n# 2\n# 3","category":"page"},{"location":"observables/types/single/#observable_single","page":"Single","title":"Single Observable","text":"","category":"section"},{"location":"observables/types/single/","page":"Single","title":"Single","text":"of","category":"page"},{"location":"observables/types/single/#Rocket.of","page":"Single","title":"Rocket.of","text":"of(x; scheduler::H = AsapScheduler()) where { H <: AbstractScheduler }\n\nCreation operator for the SingleObservable that emits a single value x and then completes.\n\nArguments\n\nx: value to be emmited before completion\n\nExamples\n\nusing Rocket\n\nsource = of(1)\nsubscribe!(source, logger())\n;\n\n# output\n\n[LogActor] Data: 1\n[LogActor] Completed\n\n\nSee also: SingleObservable, subscribe!, logger\n\n\n\n\n\n","category":"function"},{"location":"observables/types/single/","page":"Single","title":"Single","text":"SingleObservable","category":"page"},{"location":"observables/types/single/#Rocket.SingleObservable","page":"Single","title":"Rocket.SingleObservable","text":"SingleObservable{D, H}(value::D, scheduler::H)\n\nSingleObservable wraps single value of type D into a observable.\n\nConstructor arguments\n\nvalue: a single value to emit\nscheduler: scheduler-like object\n\nSee also: of, Subscribable\n\n\n\n\n\n","category":"type"},{"location":"observables/types/interval/#observable_interval","page":"Interval","title":"Interval Observable","text":"","category":"section"},{"location":"observables/types/interval/","page":"Interval","title":"Interval","text":"interval","category":"page"},{"location":"observables/types/interval/#Rocket.interval","page":"Interval","title":"Rocket.interval","text":"interval(period::Union{Int, Nothing} = nothing)\n\nCreation operator for the TimerObservable. interval returns an Observable that emits an infinite sequence of ascending integers, with a constant interval of time of your choosing between those emissions. The first emission is not sent immediately, but only after the first period has passed.\n\nArguments\n\ninterval: the interval size in milliseconds\n\nExamples\n\nusing Rocket\n\nsource = interval(50)\n\nsubscription = subscribe!(source, logger())\nsleep(0.215)\nunsubscribe!(subscription)\nsleep(0.215)\nsubscription = subscribe!(source, logger())\nsleep(0.185)\nunsubscribe!(subscription)\n\nclose(source)\n;\n\n# output\n\n[LogActor] Data: 0\n[LogActor] Data: 1\n[LogActor] Data: 2\n[LogActor] Data: 3\n[LogActor] Data: 8\n[LogActor] Data: 9\n[LogActor] Data: 10\n\nSee also: timer, TimerObservable, Subscribable\n\n\n\n\n\n","category":"function"},{"location":"operators/filtering/take_until/#operator_take_until","page":"take_until","title":"TakeUntil Operator","text":"","category":"section"},{"location":"operators/filtering/take_until/","page":"take_until","title":"take_until","text":"take_until","category":"page"},{"location":"operators/filtering/take_until/#Rocket.take_until","page":"take_until","title":"Rocket.take_until","text":"take_until(notifier::S)\n\nCreates a take operator, which returns an Observable that emits the values emitted by the source Observable until a notifier Observable emits a value or a completion event.\n\nArguments\n\nnotifier::S: The Observable whose first emitted value will cause the output Observable of take_until to stop emitting values from the source Observable.\n\nProducing\n\nStream of type <: Subscribable{L} where L refers to type of source stream\n\nExamples\n\nusing Rocket\n\nsource = interval(100) |> take_until(timer(1000))\n\nsubscribe!(source, logger())\n;\n\n# output\n\n[LogActor] Data: 0\n[LogActor] Data: 1\n[LogActor] Data: 2\n[LogActor] Data: 3\n[LogActor] Data: 4\n[LogActor] Data: 5\n[LogActor] Data: 6\n[LogActor] Data: 7\n[LogActor] Data: 8\n[LogActor] Completed\n\nusing Rocket \n\nsource = interval(100)\n\nsubscribe!(source |> take_until(source |> filter(i -> i == 3)), logger())\n;\n\n# output \n\n[LogActor] Data: 0\n[LogActor] Data: 1\n[LogActor] Data: 2\n[LogActor] Completed\n\nSee also: AbstractOperator, InferableOperator, ProxyObservable, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/filtering/take_until/#Description","page":"take_until","title":"Description","text":"","category":"section"},{"location":"operators/filtering/take_until/","page":"take_until","title":"take_until","text":"take_until subscribes and begins mirroring the source Observable. It also monitors a second Observable, notifier that you provide. If the notifier emits a value, the output Observable stops mirroring the source Observable and completes. If the notifier doesn't emit any value and completes then take_until also completes.","category":"page"},{"location":"operators/filtering/take_until/#See-also","page":"take_until","title":"See also","text":"","category":"section"},{"location":"operators/filtering/take_until/","page":"take_until","title":"take_until","text":"Operators","category":"page"},{"location":"operators/multicasting/share/#operator_share","page":"share","title":"Share Operators","text":"","category":"section"},{"location":"operators/multicasting/share/","page":"share","title":"share","text":"share\nshare_replay\nshare_recent","category":"page"},{"location":"operators/multicasting/share/#Rocket.share","page":"share","title":"Rocket.share","text":"share(; scheduler::H = AsapScheduler()) where { H <: AbstractScheduler }\n\nshare() is a shortcut for publish() + ref_count()\n\nSee also: AbstractOperator, multicast, publish, ref_count\n\n\n\n\n\n","category":"function"},{"location":"operators/multicasting/share/#Rocket.share_replay","page":"share","title":"Rocket.share_replay","text":"share_replay(size::Int; scheduler::H = AsapScheduler()) where { H <: AbstractScheduler }\n\nshare_replay(size) is a shortcut for publish_replay(size) + ref_count()\n\nSee also: AbstractOperator, multicast, publish, publish_replay, ref_count\n\n\n\n\n\n","category":"function"},{"location":"operators/multicasting/share/#Rocket.share_recent","page":"share","title":"Rocket.share_recent","text":"share_recent(; scheduler::H = AsapScheduler()) where { H <: AbstractScheduler }\n\nshare_recent() is a shortcut for publish_recent() + ref_count()\n\nSee also: AbstractOperator, multicast, publish, publish_recent, ref_count\n\n\n\n\n\n","category":"function"},{"location":"operators/multicasting/share/#See-also","page":"share","title":"See also","text":"","category":"section"},{"location":"operators/multicasting/share/","page":"share","title":"share","text":"Operators","category":"page"},{"location":"operators/transformation/concat_map/#operator_concat_map","page":"concat_map","title":"ConcatMap Operator","text":"","category":"section"},{"location":"operators/transformation/concat_map/","page":"concat_map","title":"concat_map","text":"concat_map","category":"page"},{"location":"operators/transformation/concat_map/#Rocket.concat_map","page":"concat_map","title":"Rocket.concat_map","text":"concat_map(::Type{R}, mappingFn::F = identity) where { R, F <: Function }\n\nCreates a concat_map operator, which returns an Observable that emits the result of applying the projection function to each item emitted by the source Observable and taking values from each projected inner Observable sequentially. Essentialy it projects each source value to an Observable which is merged in the output Observable, in a serialized fashion waiting for each one to complete before merging the next.\n\nArguments\n\n::Type{R}: the type of data of output Observables after projection with mappingFn\nmappingFn::F: projection function with (data) -> Observable{R} signature\n\nProducing\n\nStream of type <: Subscribable{R}\n\nExamples\n\nusing Rocket\n\nsource = from([ 0, 0 ]) |> concat_map(Int, d -> from([ 1, 2, 3 ], scheduler = AsyncScheduler(0)))\nsubscribe!(source, logger())\n;\n\n# output\n\n[LogActor] Data: 1\n[LogActor] Data: 2\n[LogActor] Data: 3\n[LogActor] Data: 1\n[LogActor] Data: 2\n[LogActor] Data: 3\n[LogActor] Completed\n\nSee also: AbstractOperator, RightTypedOperator, ProxyObservable, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/transformation/concat_map/#Description","page":"concat_map","title":"Description","text":"","category":"section"},{"location":"operators/transformation/concat_map/","page":"concat_map","title":"concat_map","text":"Returns an Observable that emits items based on applying a function that you supply to each item emitted by the source Observable, where that function returns an (so-called \"inner\") Observable. Each new inner Observable is concatenated with the previous inner Observable.","category":"page"},{"location":"operators/transformation/concat_map/","page":"concat_map","title":"concat_map","text":"warning: Warning\nIf source values arrive endlessly and faster than their corresponding inner Observables can complete, it will result in memory issues as inner Observables amass in an unbounded buffer waiting for their turn to be subscribed to.","category":"page"},{"location":"operators/transformation/concat_map/","page":"concat_map","title":"concat_map","text":"note: Note\nconcat_map is equivalent to merge_map with concurrency parameter set to 1.","category":"page"},{"location":"operators/transformation/concat_map/#See-also","page":"concat_map","title":"See also","text":"","category":"section"},{"location":"operators/transformation/concat_map/","page":"concat_map","title":"concat_map","text":"Operators, merge_map","category":"page"},{"location":"subjects/types/pending/#subject_pending","page":"Pending","title":"PendingSubject","text":"","category":"section"},{"location":"subjects/types/pending/","page":"Pending","title":"Pending","text":"PendingSubject\nPendingSubjectFactory","category":"page"},{"location":"subjects/types/pending/#Rocket.PendingSubject","page":"Pending","title":"Rocket.PendingSubject","text":"PendingSubject(::Type{D}) where D\nPendingSubject(::Type{D}, factory::F) where { D, F <: AbstractFactory }\nPendingSubject(::Type{D}, subject::S) where { D, S }\n\nA variant of Subject that emits its last value on completion. Reemits last value on further subscriptions and then completes.\n\nSee also: PendingSubjectFactory, Subject, SubjectFactory\n\n\n\n\n\n","category":"function"},{"location":"subjects/types/pending/#Rocket.PendingSubjectFactory","page":"Pending","title":"Rocket.PendingSubjectFactory","text":"PendingSubjectFactory(factory::F) where { F <: AbstractSubjectFactory }\nPendingSubjectFactory(; scheduler::H = AsapScheduler()) where { H <: AbstractScheduler }\n\nA variant of SubjectFactory that creates an instance of PendingSubject.\n\nSee also: SubjectFactory, AbstractSubjectFactory, PendingSubject, Subject\n\n\n\n\n\n","category":"function"},{"location":"subjects/types/pending/#Description","page":"Pending","title":"Description","text":"","category":"section"},{"location":"subjects/types/pending/","page":"Pending","title":"Pending","text":"A variant of Subject that only emits a value when it completes. It will emit its latest value to all its observers on completion. It will reemit its latest value to all new observers on further subscription and then complete. It is not possible to overwrite last value after completion.","category":"page"},{"location":"subjects/types/pending/#Examples","page":"Pending","title":"Examples","text":"","category":"section"},{"location":"subjects/types/pending/","page":"Pending","title":"Pending","text":"using Rocket\n\nsubject = PendingSubject(Int)\n\nsubscription1 = subscribe!(subject, logger(\"1\"))\n\nnext!(subject, 1) # Nothing is logged\nnext!(subject, 2) # Nothing is logged\n\nsubscription2 = subscribe!(subject, logger(\"2\"))\n\nnext!(subject, 3) # Nothing is logged\n\ncomplete!(subject)\n\nsubscription3 = subscribe!(subject, logger(\"3\"))\n\n[1] Data: 3\n[2] Data: 3\n[1] Completed\n[2] Completed\n[3] Data: 3\n[3] Completed","category":"page"},{"location":"operators/filtering/filter_type/#operator_filter_type","page":"filter_type","title":"FilterType Operator","text":"","category":"section"},{"location":"operators/filtering/filter_type/","page":"filter_type","title":"filter_type","text":"filter_type","category":"page"},{"location":"operators/filtering/filter_type/#Rocket.filter_type","page":"filter_type","title":"Rocket.filter_type","text":"filter_type(type::Type{ T }) where { T }\n\nCreates a filter_type operator, which filters items of the source Observable by emitting only those that match a specified T type with a <: operator. This operator is a more efficient version of filter(v -> v <: T) |> map(T, v -> v) operators chain.\n\nProducing\n\nStream of type <: Subscribable{ T } where T refers to type argument\n\nExamples\n\nusing Rocket\n\nsource = from(Real[ 1, 2.0, 3, 4.0, 5, 6.0 ])\nsubscribe!(source |> filter_type(Int), logger())\n;\n\n# output\n\n[LogActor] Data: 1\n[LogActor] Data: 3\n[LogActor] Data: 5\n[LogActor] Completed\n\nSee also: AbstractOperator, InferableOperator, ProxyObservable, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/filtering/filter_type/#See-also","page":"filter_type","title":"See also","text":"","category":"section"},{"location":"operators/filtering/filter_type/","page":"filter_type","title":"filter_type","text":"Operators","category":"page"},{"location":"operators/filtering/filter/#operator_filter","page":"filter","title":"Filter Operator","text":"","category":"section"},{"location":"operators/filtering/filter/","page":"filter","title":"filter","text":"filter","category":"page"},{"location":"operators/filtering/filter/#Base.filter","page":"filter","title":"Base.filter","text":"filter(filterFn::F) where { F <: Function }\n\nCreates a filter operator, which filters items of the source Observable by emitting only those that satisfy a specified filterFn predicate.\n\nProducing\n\nStream of type <: Subscribable{L} where L refers to type of source stream\n\nArguments\n\nfilterFn::F: predicate function with (data::T) -> Bool signature\n\nExamples\n\nusing Rocket\n\nsource = from([ 1, 2, 3, 4, 5, 6 ])\nsubscribe!(source |> filter((d) -> d % 2 == 0), logger())\n;\n\n# output\n\n[LogActor] Data: 2\n[LogActor] Data: 4\n[LogActor] Data: 6\n[LogActor] Completed\n\nSee also: AbstractOperator, InferableOperator, ProxyObservable, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/filtering/filter/#Description","page":"filter","title":"Description","text":"","category":"section"},{"location":"operators/filtering/filter/","page":"filter","title":"filter","text":"Like filter(f, array), this operator takes values from the source Observable, passes them through a predicate function and only emits those values that yielded true.","category":"page"},{"location":"operators/filtering/filter/#See-also","page":"filter","title":"See also","text":"","category":"section"},{"location":"operators/filtering/filter/","page":"filter","title":"filter","text":"Operators","category":"page"},{"location":"operators/join/with_latest/#operator_with_latest","page":"with_latest","title":"WithLatest Operator","text":"","category":"section"},{"location":"operators/join/with_latest/","page":"with_latest","title":"with_latest","text":"with_latest","category":"page"},{"location":"operators/join/with_latest/#Rocket.with_latest","page":"with_latest","title":"Rocket.with_latest","text":"with_latest(sources...)\n\nCreates a with_latest operator, which combines the source Observable with other Observables to create an Observable whose values are calculated from the latest values of each, only when the source emits.\n\nExamples\n\nusing Rocket\n\nsource = of(1)\nsubscribe!(source |> with_latest(from(1:5)), logger())\n;\n\n# output\n\n[LogActor] Data: (1, 5)\n[LogActor] Completed\n\nSee also: AbstractOperator, InferableOperator\n\n\n\n\n\n","category":"function"},{"location":"operators/join/with_latest/#See-also","page":"with_latest","title":"See also","text":"","category":"section"},{"location":"operators/join/with_latest/","page":"with_latest","title":"with_latest","text":"Operators","category":"page"},{"location":"operators/join/about/#Join-category","page":"Join category","title":"Join category","text":"","category":"section"},{"location":"operators/join/about/","page":"Join category","title":"Join category","text":"There are operators for different purposes, and they may be categorized as: creation, transformation, filtering, joining, multicasting, error handling, utility, etc. In the following list you will find all the operators organized in join category.","category":"page"},{"location":"operators/join/about/","page":"Join category","title":"Join category","text":"with_latest","category":"page"},{"location":"operators/join/about/#See-also","page":"Join category","title":"See also","text":"","category":"section"},{"location":"operators/join/about/","page":"Join category","title":"Join category","text":"Operators","category":"page"},{"location":"subjects/types/behavior/#subject_behavior","page":"Behavior","title":"BehaviorSubject","text":"","category":"section"},{"location":"subjects/types/behavior/","page":"Behavior","title":"Behavior","text":"BehaviorSubject\nBehaviorSubjectFactory","category":"page"},{"location":"subjects/types/behavior/#Rocket.BehaviorSubject","page":"Behavior","title":"Rocket.BehaviorSubject","text":"BehaviorSubject(value::D) where D\nBehaviorSubject(::Type{D}, value) where D\nBehaviorSubject(::Type{D}, value, factory::F) where { D, F <: AbstractSubjectFactory }\nBehaviorSubject(::Type{D}, value, subject::S) where { D, S }\n\nA variant of Subject that requires an initial value and emits its current value whenever it is subscribed to.\n\nSee also: BehaviorSubjectFactory, Subject, SubjectFactory\n\n\n\n\n\n","category":"function"},{"location":"subjects/types/behavior/#Rocket.BehaviorSubjectFactory","page":"Behavior","title":"Rocket.BehaviorSubjectFactory","text":"BehaviorSubjectFactory(default, factory::F) where { F <: AbstractSubjectFactory }\nBehaviorSubjectFactory(default; scheduler::H = AsapScheduler()) where { H <: AbstractScheduler }\n\nA variant of SubjectFactory that creates an instance of ReplaySubject.\n\nSee also: SubjectFactory, AbstractSubjectFactory, BehaviorSubject, Subject\n\n\n\n\n\n","category":"function"},{"location":"subjects/types/behavior/#Description","page":"Behavior","title":"Description","text":"","category":"section"},{"location":"subjects/types/behavior/","page":"Behavior","title":"Behavior","text":"One of the variants of Subjects is the BehaviorSubject, which has a notion of \"the current value\". It stores the latest value emitted to its consumers, and whenever a new Observer subscribes, it will immediately receive the \"current value\" from the BehaviorSubject.","category":"page"},{"location":"subjects/types/behavior/","page":"Behavior","title":"Behavior","text":"note: Note\nBehaviorSubjects are useful for representing \"values over time\". For instance, an event stream of birthdays is a Subject, but the stream of a person's age would be a BehaviorSubject.","category":"page"},{"location":"subjects/types/behavior/#Examples","page":"Behavior","title":"Examples","text":"","category":"section"},{"location":"subjects/types/behavior/","page":"Behavior","title":"Behavior","text":"In the following example, the BehaviorSubject is initialized with the value 0 which the first Observer receives when it subscribes. The second Observer receives the value 2 even though it subscribed after the value 2 was sent.","category":"page"},{"location":"subjects/types/behavior/","page":"Behavior","title":"Behavior","text":"using Rocket\n\nsubject = BehaviorSubject(Int, 0)\n\nsubscription1 = subscribe!(subject, logger(\"1\"))\n\nnext!(subject, 1)\nnext!(subject, 2)\n\nsubscription2 = subscribe!(subject, logger(\"2\"))\n\nnext!(subject, 3)\n\nunsubscribe!(subscription1)\nunsubscribe!(subscription2)\n\n// Logs\n// [1] Data: 0\n// [1] Data: 1\n// [1] Data: 2\n// [2] Data: 2\n// [1] Data: 3\n// [2] Data: 3","category":"page"},{"location":"api/operators/#operators_api","page":"Operators","title":"Operators API","text":"","category":"section"},{"location":"api/operators/#How-to-create-a-custom-operator","page":"Operators","title":"How to create a custom operator","text":"","category":"section"},{"location":"api/operators/","page":"Operators","title":"Operators","text":"If you need to write an operator that cannot be made from a combination of existing operators, then you can write a custom operator from scratch.","category":"page"},{"location":"api/operators/","page":"Operators","title":"Operators","text":"Each operator (e.g. MyFancyOperator) needs to either be (1) a subtype of one of abstract OperatorTrait trait types, or (2) define a","category":"page"},{"location":"api/operators/","page":"Operators","title":"Operators","text":"Rocket.as_operator(::Type{<:MyFancyOperator}) = TypedOperatorTrait{T, R}()\n# or\nRocket.as_operator(::Type{<:MyFancyOperator}) = InferableOperatorTrait()","category":"page"},{"location":"api/operators/","page":"Operators","title":"Operators","text":"trait behavior.","category":"page"},{"location":"api/operators/","page":"Operators","title":"Operators","text":"In addition, an operator must implement a specific method for on_call! function with custom logic which has to return another Observable as a result of applying MyFancyOperator to a source.","category":"page"},{"location":"api/operators/","page":"Operators","title":"Operators","text":"Rocket.on_call!(::Type{L}, ::Type{R}, operator::MyFancyOperator, source) where L = # some custom logic here\n\n# or\n# for inferable trait types you have to specify 'right' type with Rocket.operator_right which should specify a type of data of produced Observable\n\nRocket.on_call(::Type{L}, ::Type{R}, operator::MyFancyOperator, source) where L = # some custom logic here\nRocket.operator_right(::MyFancyOperator, ::Type{L}) where L = R # where R should be an actual type, Int or even L itself e.g.\n","category":"page"},{"location":"api/operators/","page":"Operators","title":"Operators","text":"note: Note\nIt is not allowed to modify the source Observable in any way; you have to return a new observable.","category":"page"},{"location":"api/operators/","page":"Operators","title":"Operators","text":"See more examples on custom operators in Traits API section","category":"page"},{"location":"api/operators/","page":"Operators","title":"Operators","text":"note: Note\nIt might be useful to return a ProxyObservable from an on_call! function. ProxyObservable is a special Observable which proxying actors with the source and/or source with actors.","category":"page"},{"location":"api/operators/#operators_api_traits","page":"Operators","title":"Traits","text":"","category":"section"},{"location":"api/operators/","page":"Operators","title":"Operators","text":"OperatorTrait\nas_operator\nTypedOperatorTrait\nLeftTypedOperatorTrait\nRightTypedOperatorTrait\nInferableOperatorTrait\nInvalidOperatorTrait","category":"page"},{"location":"api/operators/#Rocket.OperatorTrait","page":"Operators","title":"Rocket.OperatorTrait","text":"Abstract type for all possible operator traits\n\nSee also: TypedOperatorTrait, LeftTypedOperatorTrait, RightTypedOperatorTrait, InferableOperatorTrait, InvalidOperatorTrait,\n\n\n\n\n\n","category":"type"},{"location":"api/operators/#Rocket.as_operator","page":"Operators","title":"Rocket.as_operator","text":"as_operator(any)\n\nThis function checks operator trait behavior. May be used explicitly to specify operator trait behavior for any object.\n\nSee also: OperatorTrait, AbstractOperator\n\n\n\n\n\n","category":"function"},{"location":"api/operators/#Rocket.TypedOperatorTrait","page":"Operators","title":"Rocket.TypedOperatorTrait","text":"Typed operator trait specifies operator to be statically typed with input and output data types. Typed operator with input type L and output type R can only operate on input Observable with data type L and will always produce an Observable with data type R.\n\nExamples\n\nusing Rocket\n\nstruct MyTypedOperator <: TypedOperator{Int, Int} end\n\nfunction Rocket.on_call!(::Type{Int}, ::Type{Int}, op::MyTypedOperator, source)\n return proxy(Int, source, MyTypedOperatorProxy())\nend\n\nstruct MyTypedOperatorProxy <: ActorProxy end\n\nRocket.actor_proxy!(::Type{Int}, ::MyTypedOperatorProxy, actor::A) where A = MyTypedOperatorProxiedActor{A}(actor)\n\nstruct MyTypedOperatorProxiedActor{A} <: Actor{Int}\n actor :: A\nend\n\nfunction Rocket.on_next!(actor::MyTypedOperatorProxiedActor, data::Int)\n # Do something with a data and/or redirect it to actor.actor\n next!(actor.actor, data + 1)\nend\n\nRocket.on_error!(actor::MyTypedOperatorProxiedActor, err) = error!(actor.actor, err)\nRocket.on_complete!(actor::MyTypedOperatorProxiedActor) = complete!(actor.actor)\n\nsource = from([ 0, 1, 2 ])\nsubscribe!(source |> MyTypedOperator(), logger())\n;\n\n# output\n\n[LogActor] Data: 1\n[LogActor] Data: 2\n[LogActor] Data: 3\n[LogActor] Completed\n\nSee also: OperatorTrait, TypedOperator, OperatorTrait, ProxyObservable, ActorProxy, logger\n\n\n\n\n\n","category":"type"},{"location":"api/operators/#Rocket.LeftTypedOperatorTrait","page":"Operators","title":"Rocket.LeftTypedOperatorTrait","text":"Left typed operator trait specifies operator to be statically typed with input data type. To infer output data type this object should specify a special function operator_right(operator, ::Type{L}) where L which will be used to infer output data type. Left typed operator with input type L can only operate on input Observable with data type L and will always produce an Observable with data type inferred from operator_right(operator, ::Type{L}).\n\nExamples\n\nusing Rocket\n\nstruct CountIntegersOperator <: LeftTypedOperator{Int} end\n\nfunction Rocket.on_call!(::Type{Int}, ::Type{Tuple{Int, Int}}, op::CountIntegersOperator, source)\n return proxy(Tuple{Int, Int}, source, CountIntegersOperatorProxy())\nend\n\nRocket.operator_right(::CountIntegersOperator, ::Type{Int}) = Tuple{Int, Int}\n\nstruct CountIntegersOperatorProxy <: ActorProxy end\n\nRocket.actor_proxy!(::Type{Tuple{Int, Int}}, ::CountIntegersOperatorProxy, actor::A) where A = CountIntegersProxiedActor{A}(0, actor)\n\nmutable struct CountIntegersProxiedActor{A} <: Actor{Int}\n current :: Int\n actor :: A\nend\n\nfunction Rocket.on_next!(actor::CountIntegersProxiedActor, data::Int)\n current = actor.current\n actor.current += 1\n next!(actor.actor, (current, data)) # e.g.\nend\n\nRocket.on_error!(actor::CountIntegersProxiedActor, err) = error!(actor.actor, err)\nRocket.on_complete!(actor::CountIntegersProxiedActor) = complete!(actor.actor)\n\nsource = from([ 0, 0, 0 ])\nsubscribe!(source |> CountIntegersOperator(), logger())\n;\n\n# output\n\n[LogActor] Data: (0, 0)\n[LogActor] Data: (1, 0)\n[LogActor] Data: (2, 0)\n[LogActor] Completed\n\nSee also: OperatorTrait, LeftTypedOperator, operator_right, OperatorTrait, ProxyObservable, ActorProxy, enumerate, logger\n\n\n\n\n\n","category":"type"},{"location":"api/operators/#Rocket.RightTypedOperatorTrait","page":"Operators","title":"Rocket.RightTypedOperatorTrait","text":"Right typed operator trait specifies operator to be statically typed with output data type. It can operate on input Observable with any data type L but will always produce an Observable with data type R.\n\nExamples\n\nusing Rocket\n\nstruct ConvertToFloatOperator <: RightTypedOperator{Float64} end\n\nfunction Rocket.on_call!(::Type{L}, ::Type{Float64}, op::ConvertToFloatOperator, source) where L\n return proxy(Float64, source, ConvertToFloatProxy{L}())\nend\n\nstruct ConvertToFloatProxy{L} <: ActorProxy end\n\nfunction Rocket.actor_proxy!(::Type{Float64}, proxy::ConvertToFloatProxy{L}, actor::A) where { L, A }\n return ConvertToFloatProxyActor{L, A}(actor)\nend\n\nstruct ConvertToFloatProxyActor{L, A} <: Actor{L}\n actor :: A\nend\n\nfunction Rocket.on_next!(actor::ConvertToFloatProxyActor{L}, data::L) where L\n next!(actor.actor, convert(Float64, data)) # e.g.\nend\n\nRocket.on_error!(actor::ConvertToFloatProxyActor, err) = error!(actor.actor, err)\nRocket.on_complete!(actor::ConvertToFloatProxyActor) = complete!(actor.actor)\n\nsource = from([ 1, 2, 3 ])\nsubscribe!(source |> ConvertToFloatOperator(), logger())\n;\n\n# output\n\n[LogActor] Data: 1.0\n[LogActor] Data: 2.0\n[LogActor] Data: 3.0\n[LogActor] Completed\n\nSee also: OperatorTrait, RightTypedOperator, OperatorTrait, ProxyObservable, ActorProxy, logger\n\n\n\n\n\n","category":"type"},{"location":"api/operators/#Rocket.InferableOperatorTrait","page":"Operators","title":"Rocket.InferableOperatorTrait","text":"Inferable operator trait specifies operator to be statically typed neither with input data type nor with output data type. To infer output data type this object should specify a special function operator_right(operator, ::Type{L}) where L where L is input data type which will be used to infer output data type.\n\nusing Rocket\n\nstruct IdentityOperator <: InferableOperator end\n\nfunction Rocket.on_call!(::Type{L}, ::Type{L}, op::IdentityOperator, source) where L\n return proxy(L, source, IdentityProxy())\nend\n\nstruct IdentityProxy <: ActorProxy end\n\nRocket.operator_right(::IdentityOperator, ::Type{L}) where L = L\n\nRocket.actor_proxy!(::Type{L}, proxy::IdentityProxy, actor::A) where L where A = IdentityProxyActor{L, A}(actor)\n\nstruct IdentityProxyActor{L, A} <: Actor{L}\n actor :: A\nend\n\nfunction Rocket.on_next!(actor::IdentityProxyActor{L}, data::L) where L\n next!(actor.actor, data) # e.g.\nend\n\nRocket.on_error!(actor::IdentityProxyActor, err) = error!(actor.actor, err)\nRocket.on_complete!(actor::IdentityProxyActor) = complete!(actor.actor)\n\nsource = from([ 1, 2, 3 ])\nsubscribe!(source |> IdentityOperator(), logger())\n\nsource = from([ 1.0, 2.0, 3.0 ])\nsubscribe!(source |> IdentityOperator(), logger())\n;\n\n# output\n\n[LogActor] Data: 1\n[LogActor] Data: 2\n[LogActor] Data: 3\n[LogActor] Completed\n[LogActor] Data: 1.0\n[LogActor] Data: 2.0\n[LogActor] Data: 3.0\n[LogActor] Completed\n\n\nSee also: OperatorTrait, InferableOperator, operator_right, OperatorTrait, ProxyObservable, ActorProxy, logger\n\n\n\n\n\n","category":"type"},{"location":"api/operators/#Rocket.InvalidOperatorTrait","page":"Operators","title":"Rocket.InvalidOperatorTrait","text":"InvalidOperatorTrait trait specifies special 'invalid' behavior and types with such a trait specification cannot be used as an operator for an observable stream. By default any type has InvalidOperatorTrait trait specification\n\nSee also: OperatorTrait\n\n\n\n\n\n","category":"type"},{"location":"api/operators/#Types","page":"Operators","title":"Types","text":"","category":"section"},{"location":"api/operators/","page":"Operators","title":"Operators","text":"AbstractOperator\nTypedOperator\nLeftTypedOperator\nRightTypedOperator\nInferableOperator\non_call!\noperator_right\nOperatorsComposition","category":"page"},{"location":"api/operators/#Rocket.AbstractOperator","page":"Operators","title":"Rocket.AbstractOperator","text":"Supertype for all operators\n\nSee also: TypedOperator, LeftTypedOperator, RightTypedOperator, InferableOperator\n\n\n\n\n\n","category":"type"},{"location":"api/operators/#Rocket.TypedOperator","page":"Operators","title":"Rocket.TypedOperator","text":"Can be used as a supertype for any operator. Automatically specifies TypedOperatorTrait behavior.\n\nExamples\n\nusing Rocket\n\nstruct MyOperator <: TypedOperator{Float64,String} end\n\nas_operator(MyOperator) === TypedOperatorTrait{Float64,String}()\n\n# output\ntrue\n\nSee also: AbstractOperator, TypedOperatorTrait\n\n\n\n\n\n","category":"type"},{"location":"api/operators/#Rocket.LeftTypedOperator","page":"Operators","title":"Rocket.LeftTypedOperator","text":"Can be used as a supertype for any operator. Automatically specifies LeftTypedOperatorTrait behavior.\n\nExamples\n\nusing Rocket\n\nstruct MyOperator <: LeftTypedOperator{Float64} end\n\nas_operator(MyOperator) === LeftTypedOperatorTrait{Float64}()\n\n# output\ntrue\n\nSee also: AbstractOperator, LeftTypedOperatorTrait, operator_right\n\n\n\n\n\n","category":"type"},{"location":"api/operators/#Rocket.RightTypedOperator","page":"Operators","title":"Rocket.RightTypedOperator","text":"Can be used as a supertype for any operator. Automatically specifies RightTypedOperatorTrait behavior.\n\nExamples\n\nusing Rocket\n\nstruct MyOperator <: RightTypedOperator{Float64} end\n\nas_operator(MyOperator) === RightTypedOperatorTrait{Float64}()\n\n# output\ntrue\n\nSee also: AbstractOperator, RightTypedOperatorTrait\n\n\n\n\n\n","category":"type"},{"location":"api/operators/#Rocket.InferableOperator","page":"Operators","title":"Rocket.InferableOperator","text":"Can be used as a supertype for any operator. Automatically specifies InferableOperatorTrait behavior.\n\nExamples\n\nusing Rocket\n\nstruct MyOperator <: InferableOperator end\n\nas_operator(MyOperator) === InferableOperatorTrait()\n\n# output\ntrue\n\nSee also: AbstractOperator, InferableOperatorTrait, operator_right\n\n\n\n\n\n","category":"type"},{"location":"api/operators/#Rocket.on_call!","page":"Operators","title":"Rocket.on_call!","text":"on_call!(::Type, ::Type, operator, source)\n\nEach operator must implement its own method for on_call! function. This function is used to invoke operator on some Observable and to produce another Observable with new logic (operator specific).\n\nSee also: AbstractOperator\n\n\n\n\n\n","category":"function"},{"location":"api/operators/#Rocket.operator_right","page":"Operators","title":"Rocket.operator_right","text":"operator_right(operator, L)\n\nBoth LeftTypedOperator and InferableOperator must implement its own method for operator_right function. This function is used to infer type of data of output Observable given the type of data of input Observable.\n\nSee also: AbstractOperator, LeftTypedOperator, InferableOperator\n\n\n\n\n\n","category":"function"},{"location":"api/operators/#Rocket.OperatorsComposition","page":"Operators","title":"Rocket.OperatorsComposition","text":"OperatorsComposition(operators)\n\nOperatorsComposition is an object which helps to create a composition of multiple operators. To create a composition of two or more operators overloaded + or |> can be used.\n\nusing Rocket\n\ncomposition = map(Int, (d) -> d ^ 2) + filter(d -> d % 2 == 0)\n\nsource = from(1:5) |> composition\n\nsubscribe!(source, logger())\n;\n\n# output\n\n[LogActor] Data: 4\n[LogActor] Data: 16\n[LogActor] Completed\n\nusing Rocket\n\ncomposition = map(Int, (d) -> d ^ 2) |> filter(d -> d % 2 == 0)\n\nsource = from(1:5) |> composition\n\nsubscribe!(source, logger())\n;\n\n# output\n\n[LogActor] Data: 4\n[LogActor] Data: 16\n[LogActor] Completed\n\n\n\n\n\n","category":"type"},{"location":"api/operators/#Errors","page":"Operators","title":"Errors","text":"","category":"section"},{"location":"api/operators/","page":"Operators","title":"Operators","text":"InvalidOperatorTraitUsageError\nInconsistentSourceOperatorDataTypesError\nMissingOnCallImplementationError\nMissingOperatorRightImplementationError","category":"page"},{"location":"api/operators/#Rocket.InvalidOperatorTraitUsageError","page":"Operators","title":"Rocket.InvalidOperatorTraitUsageError","text":"This error will be thrown if |> pipe operator is called with invalid operator object\n\nSee also: on_call!\n\n\n\n\n\n","category":"type"},{"location":"api/operators/#Rocket.InconsistentSourceOperatorDataTypesError","page":"Operators","title":"Rocket.InconsistentSourceOperatorDataTypesError","text":"This error will be thrown if |> pipe operator is called with inconsistent data type\n\nSee also: on_call!\n\n\n\n\n\n","category":"type"},{"location":"api/operators/#Rocket.MissingOnCallImplementationError","page":"Operators","title":"Rocket.MissingOnCallImplementationError","text":"This error will be thrown if Julia cannot find specific method of on_call! function for a given operator.\n\nSee also: on_call!\n\n\n\n\n\n","category":"type"},{"location":"api/operators/#Rocket.MissingOperatorRightImplementationError","page":"Operators","title":"Rocket.MissingOperatorRightImplementationError","text":"This error will be thrown if Julia cannot find specific method of operator_right function for a given operator.\n\nSee also: operator_right\n\n\n\n\n\n","category":"type"},{"location":"observables/types/faulted/#observable_faulted","page":"Faulted","title":"Faulted Observable","text":"","category":"section"},{"location":"observables/types/faulted/","page":"Faulted","title":"Faulted","text":"faulted","category":"page"},{"location":"observables/types/faulted/#Rocket.faulted","page":"Faulted","title":"Rocket.faulted","text":"faulted(err; scheduler::H = AsapScheduler()) where { H <: AbstractScheduler }\nfaulted(::Type{T}, err; scheduler::H = AsapScheduler()) where { T, H <: AbstractScheduler }\n\nCreation operator for the FaultedObservable that emits no items to the Actor and immediately sends an error notification.\n\nArguments\n\nerr: the particular Error to pass to the error notification.\nT: type of output data source, optional, Any by default\nscheduler: optional, scheduler-like object\n\nExamples\n\nusing Rocket\n\nsource = faulted(\"Error!\")\nsubscribe!(source, logger())\n;\n\n# output\n\n[LogActor] Error: Error!\n\n\nSee also: FaultedObservable, subscribe!\n\n\n\n\n\n","category":"function"},{"location":"observables/types/faulted/","page":"Faulted","title":"Faulted","text":"FaultedObservable","category":"page"},{"location":"observables/types/faulted/#Rocket.FaultedObservable","page":"Faulted","title":"Rocket.FaultedObservable","text":"FaultedObservable{D, H}(err, scheduler::H)\n\nObservable that emits no items to the Actor and just sends an error notification on subscription.\n\nConstructor arguments\n\nerr: error to emit on subscription\nscheduler: scheduler-like object\n\nSee also: faulted\n\n\n\n\n\n","category":"type"},{"location":"operators/multicasting/multicast/#operator_multicast","page":"multicast","title":"Multicast Operator","text":"","category":"section"},{"location":"operators/multicasting/multicast/","page":"multicast","title":"multicast","text":"multicast","category":"page"},{"location":"operators/multicasting/multicast/#Rocket.multicast","page":"multicast","title":"Rocket.multicast","text":"multicast(subject::S) where S\nmulticast(factory::F) where { F <: AbstractSubjectFactory }\n\nThe multicast()operator takes a Subject and uses it to share the source execution. It returns what’s known as aConnectableObservable`, which has a connect() method. It has one simple job - subscribes to the source with the provided subject.\n\nExample\n\nusing Rocket\n\nsubject = Subject(Int)\nsource = from(1:5) |> multicast(subject)\n\nactor1 = logger(\"1\")\nactor2 = logger(\"2\")\n\nsubscription1 = subscribe!(source, actor1)\nsubscription2 = subscribe!(source, actor2)\n\nconnect(source)\n\nunsubscribe!(subscription1)\nunsubscribe!(subscription2)\n;\n\n# output\n\n[1] Data: 1\n[2] Data: 1\n[1] Data: 2\n[2] Data: 2\n[1] Data: 3\n[2] Data: 3\n[1] Data: 4\n[2] Data: 4\n[1] Data: 5\n[2] Data: 5\n[1] Completed\n[2] Completed\n\nSee also: ConnectableObservable, Subject, share, publish\n\n\n\n\n\n","category":"function"},{"location":"operators/multicasting/multicast/#See-also","page":"multicast","title":"See also","text":"","category":"section"},{"location":"operators/multicasting/multicast/","page":"multicast","title":"multicast","text":"Operators","category":"page"},{"location":"operators/transformation/map/#operator_map","page":"map","title":"Map Operator","text":"","category":"section"},{"location":"operators/transformation/map/","page":"map","title":"map","text":"map","category":"page"},{"location":"operators/transformation/map/#Base.map","page":"map","title":"Base.map","text":"map(::Type{R}, mappingFn::F) where { F <: Function }\n\nCreates a map operator, which applies a given mappingFn to each value emmited by the source Observable, and emits the resulting values as an Observable. You have to specify output R type after mappingFn projection.\n\nArguments\n\n::Type{R}: the type of data of transformed value, may be or may not be the same as source type\nmappingFn::Function: transformation function with (data::L) -> R signature, where L is type of data in input source\n\nProducing\n\nStream of type <: Subscribable{R}\n\nExamples\n\nusing Rocket\n\nsource = from([ 1, 2, 3 ])\nsubscribe!(source |> map(Int, (d) -> d ^ 2), logger())\n;\n\n# output\n\n[LogActor] Data: 1\n[LogActor] Data: 4\n[LogActor] Data: 9\n[LogActor] Completed\n\nSee also: AbstractOperator, RightTypedOperator, ProxyObservable, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/transformation/map/#Description","page":"map","title":"Description","text":"","category":"section"},{"location":"operators/transformation/map/","page":"map","title":"map","text":"The map operator, similar to map(f, array), applies a function to each value from the source. It's important to note that the function f is expected to be pure and without any side effects. The map operator is designed to create a copy of the original observable for each new subscriber. It independently executes the f function for each subscriber and doesn't share the resulting value. This might be inconvenient when f involves complex calculations or side effects.","category":"page"},{"location":"operators/transformation/map/","page":"map","title":"map","text":"using Rocket\n\nfunction f(x)\n println(\"Function `f` called\") # Assume heavy calculations or side-effects\n return x + 1\nend\n\nsubject = Subject(Int)\n\nmapped = subject |> map(Int, f)\n\nsubscription1 = subscribe!(mapped, logger())\nsubscription2 = subscribe!(mapped, logger())\n\nnext!(subject, 1)\n\nunsubscribe!(subscription1)\nunsubscribe!(subscription2)\nnothing #hide","category":"page"},{"location":"operators/transformation/map/","page":"map","title":"map","text":"In the example, you'll observe that \"Function f called\" is displayed twice. This happens because each subscriber receives their individual, distinct version of the modified data. To alter this behavior, one can utilize the share() operator. This operator creates only a single copy of the modified observable and shares the computed results.","category":"page"},{"location":"operators/transformation/map/","page":"map","title":"map","text":"mapped_and_shared = mapped |> share()\n\nsubscription1 = subscribe!(mapped_and_shared, logger())\nsubscription2 = subscribe!(mapped_and_shared, logger())\n\nnext!(subject, 1)\n\nunsubscribe!(subscription1)\nunsubscribe!(subscription2)\nnothing #hide","category":"page"},{"location":"operators/transformation/map/","page":"map","title":"map","text":"In this example, \"Function f called\" appears only once, and the computed value is shared between the two subscribers. Note, however, that this behaviour might be confusing in cases where the first subscribers completes the observable till its completion stage. For example:","category":"page"},{"location":"operators/transformation/map/","page":"map","title":"map","text":"mapped_and_shared = from([ 0, 1, 2 ]) |> map(Int, f) |> share()\n\nsubscription1 = subscribe!(mapped_and_shared, logger())\nsubscription2 = subscribe!(mapped_and_shared, logger())\n\nunsubscribe!(subscription1)\nunsubscribe!(subscription2)\nnothing #hide","category":"page"},{"location":"operators/transformation/map/","page":"map","title":"map","text":"In this scenario, the second subscriber doesn't receive any values because the first subscriber exhausts the single shared observable. Once the shared observable is used up, it doesn't produce any further values. This doesn't occur without the share() operator.","category":"page"},{"location":"operators/transformation/map/","page":"map","title":"map","text":"mapped = from([ 0, 1, 2 ]) |> map(Int, f)\n\nsubscription1 = subscribe!(mapped, logger())\nsubscription2 = subscribe!(mapped, logger())\n\nunsubscribe!(subscription1)\nunsubscribe!(subscription2)\nnothing #hide","category":"page"},{"location":"operators/transformation/map/#See-also","page":"map","title":"See also","text":"","category":"section"},{"location":"operators/transformation/map/","page":"map","title":"map","text":"Operators","category":"page"},{"location":"operators/utility/tap_on_complete/#operator_tap_on_complete","page":"tap_on_complete","title":"TapOnComplete Operator","text":"","category":"section"},{"location":"operators/utility/tap_on_complete/","page":"tap_on_complete","title":"tap_on_complete","text":"tap_on_complete","category":"page"},{"location":"operators/utility/tap_on_complete/#Rocket.tap_on_complete","page":"tap_on_complete","title":"Rocket.tap_on_complete","text":"tap_on_complete(tapFn::F) where { F <: Function }\n\nCreates a tap operator, which performs a side effect for only complete emission on the source Observable, but return an Observable that is identical to the source.\n\nArguments\n\ntapFn::Function: side-effect tap function with () -> Nothing signature\n\nProducing\n\nStream of type <: Subscribable{L} where L refers to type of source stream\n\nExamples\n\nusing Rocket\n\nsource = from([ 1, 2, 3 ])\nsubscribe!(source |> tap_on_complete(() -> println(\"Complete event received\")), logger())\n;\n\n# output\n\n[LogActor] Data: 1\n[LogActor] Data: 2\n[LogActor] Data: 3\n[LogActor] Completed\nComplete event received\n\n\nSee also: tap_on_subscribe, tap, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/utility/tap_on_complete/#Description","page":"tap_on_complete","title":"Description","text":"","category":"section"},{"location":"operators/utility/tap_on_complete/","page":"tap_on_complete","title":"tap_on_complete","text":"Returns an Observable that resembles the source Observable, but modifies it so that the provided Observer is called to perform a side effect on complete event emission by the source.","category":"page"},{"location":"operators/utility/tap_on_complete/","page":"tap_on_complete","title":"tap_on_complete","text":"This operator is useful for debugging your Observables, verifying correctness, or performing other side effects.","category":"page"},{"location":"operators/utility/tap_on_complete/","page":"tap_on_complete","title":"tap_on_complete","text":"Note: this operator differs from a subscribe on the Observable. If the Observable returned by tap_on_complete is not subscribed, the side effects specified by the Observer will never happen. tap_on_complete therefore simply spies on future execution, it does not trigger an execution to happen like subscribe does.","category":"page"},{"location":"operators/utility/tap_on_complete/#See-also","page":"tap_on_complete","title":"See also","text":"","category":"section"},{"location":"operators/utility/tap_on_complete/","page":"tap_on_complete","title":"tap_on_complete","text":"Operators","category":"page"},{"location":"observables/types/combined_updates/#observable_combined_updates","page":"Combined Updates","title":"CombinedUpdates Observable","text":"","category":"section"},{"location":"observables/types/combined_updates/","page":"Combined Updates","title":"Combined Updates","text":"combineLatestUpdates","category":"page"},{"location":"observables/types/combined_updates/#Rocket.combineLatestUpdates","page":"Combined Updates","title":"Rocket.combineLatestUpdates","text":"combineLatestUpdates(sources...; strategy = PushEach())\ncombineLatestUpdates(sources::S, strategy::G = PushEach()) where { S <: Tuple, U }\n\ncombineLatestUpdates is a more effiecient version of combineLatest(sources) + map_to(sources) operators chain.\n\nArguments\n\nsources: input sources\nstrategy: optional update strategy for batching new values together\n\nNote: combineLatestUpdates() completes immediately if sources are empty.\n\nSee also: Subscribable, subscribe!, PushEach, PushEachBut, PushNew, PushNewBut, PushStrategy\n\n\n\n\n\n","category":"function"},{"location":"observables/types/combined/#observable_combined","page":"Combined","title":"Combined Observable","text":"","category":"section"},{"location":"observables/types/combined/","page":"Combined","title":"Combined","text":"combineLatest\nPushEach\nPushEachBut\nPushNew\nPushNewBut\nPushStrategy","category":"page"},{"location":"observables/types/combined/#Rocket.combineLatest","page":"Combined","title":"Rocket.combineLatest","text":"combineLatest(sources...; strategy = PushEach())\ncombineLatest(sources::S, strategy::G = PushEach()) where { S <: Tuple, U }\n\nCombines multiple Observables to create an Observable whose values are calculated from the latest values of each of its input Observables. Accept optimal update strategy object.\n\nArguments\n\nsources: input sources\nstrategy: optional update strategy for batching new values together\n\nNote: combineLatest() completes immediately if sources are empty.\n\nExamples\n\nusing Rocket\n\nlatest = combineLatest(of(1), from(2:5))\n\nsubscribe!(latest, logger())\n;\n\n# output\n\n[LogActor] Data: (1, 2)\n[LogActor] Data: (1, 3)\n[LogActor] Data: (1, 4)\n[LogActor] Data: (1, 5)\n[LogActor] Completed\n\nusing Rocket\n\nlatest = combineLatest(of(1) |> async(0), from(2:5) |> async(0), strategy = PushNew())\n\nsubscribe!(latest, logger())\n;\n\n# output\n\n[LogActor] Data: (1, 2)\n[LogActor] Completed\n\nSee also: Subscribable, subscribe!, PushEach, PushEachBut, PushNew, PushNewBut, PushStrategy\n\n\n\n\n\n","category":"function"},{"location":"observables/types/combined/#Rocket.PushEach","page":"Combined","title":"Rocket.PushEach","text":"PushEach\n\nPushEach update strategy specifies the strategy to emit new value each time an inner observable emit a new value\n\nSee also: combineLatest, PushEachBut, PushNew, PushNewBut, PushStrategy\n\n\n\n\n\n","category":"type"},{"location":"observables/types/combined/#Rocket.PushEachBut","page":"Combined","title":"Rocket.PushEachBut","text":"PushEachBut{I}\n\nPushEachBut update strategy specifies the strategy to emit new value if and only if an inner observable with index I have a new value\n\nSee also: combineLatest, PushEach, PushNew, PushNewBut, PushStrategy\n\n\n\n\n\n","category":"type"},{"location":"observables/types/combined/#Rocket.PushNew","page":"Combined","title":"Rocket.PushNew","text":"PushNew\n\nPushNew update strategy specifies the strategy to emit new value if and only if all inner observables have a new value\n\nSee also: combineLatest, PushEach, PushEachBut, PushNewBut, PushStrategy\n\n\n\n\n\n","category":"type"},{"location":"observables/types/combined/#Rocket.PushNewBut","page":"Combined","title":"Rocket.PushNewBut","text":"PushNewBut{I}\n\nPushNewBut{I} update strategy specifies the strategy to emit new value if and only if all inner observables except with index I have a new value\n\nSee also: combineLatest, PushEach, PushEachBut, PushNew, PushStrategy\n\n\n\n\n\n","category":"type"},{"location":"observables/types/combined/#Rocket.PushStrategy","page":"Combined","title":"Rocket.PushStrategy","text":"PushStrategy(strategy::BitArray{1})\n\nPushStrategy update strategy specifies the strategy to emit new value if and only if all inner observables with index such that strategy[index] = false have a new value\n\nSee also: combineLatest, PushEach, PushEachBut, PushNew, PushNewBut, collectLatest\n\n\n\n\n\n","category":"type"},{"location":"observables/types/combined/#Description","page":"Combined","title":"Description","text":"","category":"section"},{"location":"observables/types/combined/","page":"Combined","title":"Combined","text":"combineLatest combines the values from all Observables in its arguments. This is done by subscribing to each Observable in order and, whenever an Observable emits, collecting a tuple of the most recent values from each Observable (in order). If you pass n Observables to combineLatest, the returned Observable will always emit an ordered tuple of n values.","category":"page"},{"location":"observables/types/combined/","page":"Combined","title":"Combined","text":"To ensure that the output tuple has a consistent length, combineLatest waits for all input Observables to emit at least once before it starts emitting results. This means that if some Observable emits values before other Observables started emitting, all these values but the last will be lost. On the other hand, if some Observable does not emit a value but completes, the resulting Observable will complete simultaneously without emitting anything. Furthermore, if some input Observable does not emit any value and never completes, combineLatest will also never emit and never complete.","category":"page"},{"location":"observables/types/combined/","page":"Combined","title":"Combined","text":"If at least one Observable was passed to combineLatest and all passed Observables emitted, then the resulting Observable will complete when all combined streams complete. So even if some Observable completes, the result of combineLatest will still emit values when the other Observables do. In case of a completed Observable, its value will now remain to be the last emitted value. On the other hand, if any Observable errors, combineLatest will also immediately error.","category":"page"},{"location":"observables/types/combined/","page":"Combined","title":"Combined","text":"It is possible to change default update/complete strategy behaviour with an optional strategy object.","category":"page"},{"location":"operators/filtering/about/#Filtering-category","page":"About filtering operators","title":"Filtering category","text":"","category":"section"},{"location":"operators/filtering/about/","page":"About filtering operators","title":"About filtering operators","text":"There are operators for different purposes, and they may be categorized as: creation, transformation, filtering, joining, multicasting, error handling, utility, etc. In the following list you will find all the operators organized in filtering category.","category":"page"},{"location":"operators/filtering/about/","page":"About filtering operators","title":"About filtering operators","text":"filter\nfilter_type\ntake\ntake_until\nfirst\nlast\nfind\nfind_index\nignore","category":"page"},{"location":"operators/filtering/about/#See-also","page":"About filtering operators","title":"See also","text":"","category":"section"},{"location":"operators/filtering/about/","page":"About filtering operators","title":"About filtering operators","text":"Operators","category":"page"},{"location":"observables/types/connectable/#observable_connectable","page":"Connectable","title":"Connectable Observable","text":"","category":"section"},{"location":"observables/types/connectable/","page":"Connectable","title":"Connectable","text":"connectable","category":"page"},{"location":"observables/types/connectable/#Rocket.connectable","page":"Connectable","title":"Rocket.connectable","text":"connectable(subject::J, source::S) where J where S\n\nCreates a ConnectableObservable with a given subject object and a source observable.\n\nExample\n\nusing Rocket\n\nc = connectable(Subject(Int; scheduler = AsapScheduler()), from(1:3))\n\nsubscribe!(c, logger());\n\nconnect(c);\n;\n\n# output\n\n[LogActor] Data: 1\n[LogActor] Data: 2\n[LogActor] Data: 3\n[LogActor] Completed\n\n\nSee also: ConnectableObservable, connect, subscribe!\n\n\n\n\n\n","category":"function"},{"location":"observables/types/connectable/","page":"Connectable","title":"Connectable","text":"connect","category":"page"},{"location":"observables/types/connectable/#Rocket.connect","page":"Connectable","title":"Rocket.connect","text":"connect(connectable::ConnectableObservable)\n\nWhen connect is called, the subject passed to the multicast operator is subscribed to the source and the subject’s observers receive the multicast notifications, which fits our basic mental model of stream multicasting. Returns a subscription.\n\nSee also: connectable, ConnectableObservable\n\n\n\n\n\n","category":"function"},{"location":"observables/types/connectable/","page":"Connectable","title":"Connectable","text":"ConnectableObservable","category":"page"},{"location":"observables/types/connectable/#Rocket.ConnectableObservable","page":"Connectable","title":"Rocket.ConnectableObservable","text":"ConnectableObservable{D}(subject, source)\n\nA connectable observable encapsulates the multicasting infrastructure with provided subject, but does not immediately subscribe to the source. It subscribes to the source when its connect method is called.\n\nSee also: connect, Subscribable\n\n\n\n\n\n","category":"type"},{"location":"operators/utility/tap_on_unsubscribe/#operator_tap_on_unsubscribe","page":"tap_on_unsubscribe","title":"TapOnUnsubscribe Operator","text":"","category":"section"},{"location":"operators/utility/tap_on_unsubscribe/","page":"tap_on_unsubscribe","title":"tap_on_unsubscribe","text":"TapBeforeUnsubscription\nTapAfterUnsubscription\ntap_on_unsubscribe","category":"page"},{"location":"operators/utility/tap_on_unsubscribe/#Rocket.TapBeforeUnsubscription","page":"tap_on_unsubscribe","title":"Rocket.TapBeforeUnsubscription","text":"TapBeforeUnsubscription\n\nOne of the strategies for tap_on_unsubscribe operator. With TapBeforeUnubscription tap callback will be called before actual unsubscription.\n\nSee also: tap_on_unsubscribe, TapAfterUnsubscription\n\n\n\n\n\n","category":"type"},{"location":"operators/utility/tap_on_unsubscribe/#Rocket.TapAfterUnsubscription","page":"tap_on_unsubscribe","title":"Rocket.TapAfterUnsubscription","text":"TapAfterUnsubscription\n\nOne of the strategies for tap_on_unsubscribe operator. With TapBeforeUnsubscription tap callback will be called after actual unsubscription.\n\nSee also: tap_on_unsubscribe, TapBeforeUnsubscription\n\n\n\n\n\n","category":"type"},{"location":"operators/utility/tap_on_unsubscribe/#Rocket.tap_on_unsubscribe","page":"tap_on_unsubscribe","title":"Rocket.tap_on_unsubscribe","text":"tap_on_unsubscribe(tapFn::F, strategy::S = TapBeforeUnsubscription()) where { F <: Function }\n\nCreates a tap operator, which performs a side effect on the unsubscription on the source Observable, but return an Observable that is identical to the source. Tap callback triggers only once.\n\nArguments\n\ntapFn::Function: side-effect tap function with () -> Nothing signature\nstrategy: (optional), specifies the order of a side-effect and an actual unsubscription, uses TapBeforeUnsubscription by default\n\nProducing\n\nStream of type <: Subscribable{L} where L refers to type of source stream\n\nExamples\n\nusing Rocket\n\nsource = from([ 1, 2, 3 ])\nsubscription = subscribe!(source |> tap_on_unsubscribe(() -> println(\"Someone unsubscribed\")), logger())\nunsubscribe!(subscription)\n;\n\n# output\n\n[LogActor] Data: 1\n[LogActor] Data: 2\n[LogActor] Data: 3\n[LogActor] Completed\nSomeone unsubscribed\n\nSee also: TapBeforeUnsubscription, TapAfterUnsubscription, tap, tap_on_subscribe, tap_on_complete, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/utility/tap_on_unsubscribe/#Description","page":"tap_on_unsubscribe","title":"Description","text":"","category":"section"},{"location":"operators/utility/tap_on_unsubscribe/","page":"tap_on_unsubscribe","title":"tap_on_unsubscribe","text":"Returns an Observable that resembles the source Observable, but modifies it so that the provided Observer is called to perform a side effect on unsubscription from the source.","category":"page"},{"location":"operators/utility/tap_on_unsubscribe/","page":"tap_on_unsubscribe","title":"tap_on_unsubscribe","text":"This operator is useful for debugging your Observables, verifying correctness, or performing other side effects.","category":"page"},{"location":"operators/utility/tap_on_unsubscribe/#See-also","page":"tap_on_unsubscribe","title":"See also","text":"","category":"section"},{"location":"operators/utility/tap_on_unsubscribe/","page":"tap_on_unsubscribe","title":"tap_on_unsubscribe","text":"Operators","category":"page"},{"location":"operators/errors/about/#Error-handling-category","page":"About error handling operators","title":"Error handling category","text":"","category":"section"},{"location":"operators/errors/about/","page":"About error handling operators","title":"About error handling operators","text":"There are operators for different purposes, and they may be categorized as: creation, transformation, filtering, joining, multicasting, error handling, utility, etc. In the following list you will find all the operators organized in error handling category.","category":"page"},{"location":"operators/errors/about/","page":"About error handling operators","title":"About error handling operators","text":"catch_error\nrerun\nerror_if\nerror_if_not","category":"page"},{"location":"operators/errors/about/#See-also","page":"About error handling operators","title":"See also","text":"","category":"section"},{"location":"operators/errors/about/","page":"About error handling operators","title":"About error handling operators","text":"Operators","category":"page"},{"location":"operators/utility/delay/#operator_delay","page":"delay","title":"Delay Operator","text":"","category":"section"},{"location":"operators/utility/delay/","page":"delay","title":"delay","text":"delay","category":"page"},{"location":"operators/utility/delay/#Rocket.delay","page":"delay","title":"Rocket.delay","text":"delay(delay::Int)\n\nCreates a delay operator, which delays the emission of items from the source Observable by a given timeout.\n\nArguments:\n\ndelay::Int: the delay duration in milliseconds (a number) until which the emission of the source items is delayed.\n\nProducing\n\nStream of type <: Subscribable{L} where L refers to type of source stream\n\nSee also: AbstractOperator, InferableOperator, ProxyObservable\n\n\n\n\n\n","category":"function"},{"location":"operators/utility/delay/#Description","page":"delay","title":"Description","text":"","category":"section"},{"location":"operators/utility/delay/","page":"delay","title":"delay","text":"Delays the emission of items from the source Observable by a given timeout","category":"page"},{"location":"operators/utility/delay/#Example","page":"delay","title":"Example","text":"","category":"section"},{"location":"operators/utility/delay/","page":"delay","title":"delay","text":"Delay every value with 1 second to the output","category":"page"},{"location":"operators/utility/delay/","page":"delay","title":"delay","text":"using Rocket\nusing Dates\n\nsource = from([ 1, 2, 3 ])\nprintln(Dates.format(now(), \"MM:SS\"))\nsubscription = subscribe!(source |> delay(2000), lambda(\n on_next = (d) -> println(\"$(Dates.format(now(), \"MM:SS\")): $d\")\n));\n\n# output\n\n03:41\n03:43: 1\n03:43: 2\n03:43: 3\n","category":"page"},{"location":"operators/utility/delay/#See-also","page":"delay","title":"See also","text":"","category":"section"},{"location":"operators/utility/delay/","page":"delay","title":"delay","text":"Operators","category":"page"},{"location":"operators/filtering/take/#operator_take","page":"take","title":"Take Operator","text":"","category":"section"},{"location":"operators/filtering/take/","page":"take","title":"take","text":"take","category":"page"},{"location":"operators/filtering/take/#Rocket.take","page":"take","title":"Rocket.take","text":"take(maxcount::Int)\n\nCreates a take operator, which returns an Observable that emits only the first maxcount values emitted by the source Observable.\n\nArguments\n\nmaxcount::Int: the maximum number of next values to emit.\n\nProducing\n\nStream of type <: Subscribable{L} where L refers to type of source stream\n\nExamples\n\nusing Rocket\n\nsource = from([ i for i in 1:100 ])\n\nsubscribe!(source |> take(5), logger())\n;\n\n# output\n\n[LogActor] Data: 1\n[LogActor] Data: 2\n[LogActor] Data: 3\n[LogActor] Data: 4\n[LogActor] Data: 5\n[LogActor] Completed\n\nSee also: AbstractOperator, InferableOperator, ProxyObservable, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/filtering/take/#Description","page":"take","title":"Description","text":"","category":"section"},{"location":"operators/filtering/take/","page":"take","title":"take","text":"take returns an Observable that emits only the first count values emitted by the source Observable. If the source emits fewer than count values, then all of its values are emitted. Afterwards, the Observable completes regardless of whether the source completed.","category":"page"},{"location":"operators/filtering/take/#See-also","page":"take","title":"See also","text":"","category":"section"},{"location":"operators/filtering/take/","page":"take","title":"take","text":"Operators","category":"page"},{"location":"operators/transformation/scan/#operator_scan","page":"scan","title":"Scan Operator","text":"","category":"section"},{"location":"operators/transformation/scan/","page":"scan","title":"scan","text":"scan","category":"page"},{"location":"operators/transformation/scan/#Rocket.scan","page":"scan","title":"Rocket.scan","text":"scan(::Type{R}, scanFn::F, seed::R) where { R, F <: Function }\nscan(scanFn::F) where { F <: Function }\n\nCreates a scan operator, which applies a given accumulator scanFn function to each value emmited by the source Observable, and returns each intermediate result with an optional seed value. If a seed value is specified, then that value will be used as the initial value for the accumulator. If no seed value is specified, the first item of the source is used as the seed.\n\nArguments\n\n::Type{R}: the type of data of transformed value, may be or may not be the same as type of input source\nscanFn::Function: accumulator function with (data::T, current::R) -> R signature\nseed::R: optional initial value for accumulator function\n\nProducing\n\nStream of type <: Subscribable{R}\n\nExamples\n\nusing Rocket\n\nsource = from([ 1, 2, 3 ])\nsubscribe!(source |> scan(+), logger())\n;\n\n# output\n\n[LogActor] Data: 1\n[LogActor] Data: 3\n[LogActor] Data: 6\n[LogActor] Completed\n\n\nusing Rocket\n\nsource = from([ 1, 2, 3 ])\nsubscribe!(source |> scan(Vector{Int}, (d, c) -> [ c..., d ], Int[]), logger())\n;\n\n# output\n\n[LogActor] Data: [1]\n[LogActor] Data: [1, 2]\n[LogActor] Data: [1, 2, 3]\n[LogActor] Completed\n\n\nSee also: AbstractOperator, RightTypedOperator, ProxyObservable, reduce, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/transformation/scan/#Description","page":"scan","title":"Description","text":"","category":"section"},{"location":"operators/transformation/scan/","page":"scan","title":"scan","text":"Combines all values emitted by the source, using an accumulator function that joins a new source value with the past accumulation. This is similar to reduce, but emits the intermediate accumulations.","category":"page"},{"location":"operators/transformation/scan/","page":"scan","title":"scan","text":"Returns an Observable that applies a specified accumulator function to each item emitted by the source Observable. If a seed value is specified, then that value will be used as the initial value for the accumulator. If no seed value is specified, the first item of the source is used as the seed.","category":"page"},{"location":"operators/transformation/scan/#See-also","page":"scan","title":"See also","text":"","category":"section"},{"location":"operators/transformation/scan/","page":"scan","title":"scan","text":"Operators","category":"page"},{"location":"actors/types/buffer/#actor_buffer","page":"Buffer","title":"Buffer actor","text":"","category":"section"},{"location":"actors/types/buffer/","page":"Buffer","title":"Buffer","text":"buffer","category":"page"},{"location":"actors/types/buffer/#Rocket.buffer","page":"Buffer","title":"Rocket.buffer","text":"buffer(::Type{T}, size::Int) where T\n\nArguments\n\n::Type{T}: Type of data in buffer\nsize::Int: size of buffer\n\nCreation operator for the BufferActor actor.\n\nExamples\n\nusing Rocket\n\nactor = buffer(Int, 3)\nactor isa BufferActor{Int}\n\n# output\ntrue\n\nSee also: BufferActor, AbstractActor\n\n\n\n\n\n","category":"function"},{"location":"actors/types/buffer/","page":"Buffer","title":"Buffer","text":"BufferActor","category":"page"},{"location":"actors/types/buffer/#Rocket.BufferActor","page":"Buffer","title":"Rocket.BufferActor","text":"BufferActor{D}() where D\n\nBuffer actor provides a storage actor. It copies last incoming successful next events in a values array, throws an ErrorException on error! event and does nothing on completion event. Note: Actor does not check the size of incoming data.\n\nExamples\n\nusing Rocket\n\nsource = of([ 1, 2, 3 ])\nactor = buffer(Int, 3)\n\nsubscribe!(source, actor)\nshow(getvalues(actor))\n\n# output\n[1, 2, 3]\n\nSee also: Actor, buffer\n\n\n\n\n\n","category":"type"},{"location":"operators/creation/about/#Creation-category","page":"Creation","title":"Creation category","text":"","category":"section"},{"location":"operators/creation/about/","page":"Creation","title":"Creation","text":"There are operators for different purposes, and they may be categorized as: creation, transformation, filtering, joining, multicasting, error handling, utility, etc. In the following list you will find all the operators organized in creation category.","category":"page"},{"location":"operators/creation/about/","page":"Creation","title":"Creation","text":"make\nof\nfrom\niterable\nfaulted\nnever\ncompleted\ntimer\ninterval\nproxy\nfile\ncombined\nrace\nconnectable\nmerged\nconcat\ngenerate\nnetwork\ndefer\nzipped","category":"page"},{"location":"operators/creation/about/#See-also","page":"Creation","title":"See also","text":"","category":"section"},{"location":"operators/creation/about/","page":"Creation","title":"Creation","text":"Operators","category":"page"},{"location":"subjects/types/recent/#subject_recent","page":"Recent","title":"RecentSubject","text":"","category":"section"},{"location":"subjects/types/recent/","page":"Recent","title":"Recent","text":"RecentSubject\nRecentSubjectFactory","category":"page"},{"location":"subjects/types/recent/#Rocket.RecentSubject","page":"Recent","title":"Rocket.RecentSubject","text":"RecentSubject(::Type{D}) where D\nRecentSubject(::Type{D}, factory::F) where { D, F <: AbstractSubjectFactory }\nRecentSubject(::Type{D}, subject::S) where { D, S }\n\nA variant of Subject that emits its recent value whenever it is subscribed to.\n\nSee also: RecentSubjectFactory, Subject, SubjectFactory\n\n\n\n\n\n","category":"function"},{"location":"subjects/types/recent/#Rocket.RecentSubjectFactory","page":"Recent","title":"Rocket.RecentSubjectFactory","text":"RecentSubjectFactory(factory::F) where { F <: AbstractSubjectFactory }\nRecentSubjectFactory(; scheduler::H = AsapScheduler()) where { H <: AbstractScheduler }\n\nA variant of SubjectFactory that creates an instance of RecentSubject.\n\nSee also: SubjectFactory, AbstractSubjectFactory, RecentSubject, Subject\n\n\n\n\n\n","category":"function"},{"location":"subjects/types/recent/#Description","page":"Recent","title":"Description","text":"","category":"section"},{"location":"subjects/types/recent/","page":"Recent","title":"Recent","text":"One of the variants of Subjects is the RecentSubject, which has a notion of \"the recent value\". It stores the latest value emitted to its consumers, and whenever a new Observer subscribes, it will immediately receive the \"recent value\" from the RecentSubject.","category":"page"},{"location":"subjects/types/recent/","page":"Recent","title":"Recent","text":"note: Note\nRecentSubjects is a more efficient version of ReplaySubjects with replay size equal to one.","category":"page"},{"location":"subjects/types/recent/#Examples","page":"Recent","title":"Examples","text":"","category":"section"},{"location":"subjects/types/recent/","page":"Recent","title":"Recent","text":"In the following example, after RecentSubject is initialized the first Observer receives nothing when it subscribes. The second Observer receives the value 2 even though it subscribed after the value 2 was sent.","category":"page"},{"location":"subjects/types/recent/","page":"Recent","title":"Recent","text":"using Rocket\n\nsubject = RecentSubject(Int)\n\nsubscription1 = subscribe!(subject, logger(\"1\"))\n\nnext!(subject, 1)\nnext!(subject, 2)\n\nsubscription2 = subscribe!(subject, logger(\"2\"))\n\nnext!(subject, 3)\n\nunsubscribe!(subscription1)\nunsubscribe!(subscription2)\n\n// Logs\n// [1] Data: 1\n// [1] Data: 2\n// [2] Data: 2\n// [1] Data: 3\n// [2] Data: 3","category":"page"},{"location":"operators/utility/noop/#operator_noop","page":"noop","title":"Noop Operator","text":"","category":"section"},{"location":"operators/utility/noop/","page":"noop","title":"noop","text":"noop","category":"page"},{"location":"operators/utility/noop/#Rocket.noop","page":"noop","title":"Rocket.noop","text":"noop()\n\nCreates a noop operator, which does nothing, but breaks operator composition type inference checking procedure for Julia's compiler. It might be useful for very long chain of operators, because Julia tries to statically infer data types at compile-time for the whole chain and can run into StackOverflow issues.\n\nusing Rocket\n\n# foo() block to enforce local scope for scope variable\nfunction foo()\n source = from(1:5)\n\n for i in 1:1000\n source = source |> map(Int, d -> d + 1) |> noop()\n end\n\n subscribe!(source, logger())\nend\n\nfoo()\n;\n\n# output\n\n[LogActor] Data: 1001\n[LogActor] Data: 1002\n[LogActor] Data: 1003\n[LogActor] Data: 1004\n[LogActor] Data: 1005\n[LogActor] Completed\n\nSee also: AbstractOperator, InferableOperator, logger, map\n\n\n\n\n\n","category":"function"},{"location":"operators/utility/noop/#See-also","page":"noop","title":"See also","text":"","category":"section"},{"location":"operators/utility/noop/","page":"noop","title":"noop","text":"Operators","category":"page"},{"location":"getting-started/#Getting-started","page":"Getting started","title":"Getting started","text":"","category":"section"},{"location":"getting-started/","page":"Getting started","title":"Getting started","text":"Rocket.jl is a Julia package for reactive programming that makes it easier to work with asynchronous data. It is inspired by the RxJS and ReactiveX communities.","category":"page"},{"location":"getting-started/","page":"Getting started","title":"Getting started","text":"In order to combine good performance with a convenient API, Rocket.jl employs Observer patterns, Actor models and Functional programming.","category":"page"},{"location":"getting-started/#Installation","page":"Getting started","title":"Installation","text":"","category":"section"},{"location":"getting-started/","page":"Getting started","title":"Getting started","text":"Install Rocket.jl through the Julia package manager:","category":"page"},{"location":"getting-started/","page":"Getting started","title":"Getting started","text":"] add Rocket","category":"page"},{"location":"getting-started/#Concepts","page":"Getting started","title":"Concepts","text":"","category":"section"},{"location":"getting-started/","page":"Getting started","title":"Getting started","text":"Rocket.jl has been designed with a focus on performance and modularity.","category":"page"},{"location":"getting-started/","page":"Getting started","title":"Getting started","text":"The essential concepts in Rocket.jl are:","category":"page"},{"location":"getting-started/","page":"Getting started","title":"Getting started","text":"Observable: represents a collection of future messages (data or/and events).\nActor: is an object that knows how to react on incoming messages delivered by the Observable.\nSubscription: represents a teardown logic that is useful for cancelling the execution of an Observable.\nOperator: an object that deals with collection operations, such as map, filter, reduce, etc.\nSubject: the way of multicasting a message to multiple Observers.","category":"page"},{"location":"getting-started/#First-example","page":"Getting started","title":"First example","text":"","category":"section"},{"location":"getting-started/","page":"Getting started","title":"Getting started","text":"Conventionally, arrays are used for processing data.","category":"page"},{"location":"getting-started/","page":"Getting started","title":"Getting started","text":"for value in array_of_values\n doSomethingWithMyData(value)\nend","category":"page"},{"location":"getting-started/","page":"Getting started","title":"Getting started","text":"In contrast, Rocket.jl uses observables.","category":"page"},{"location":"getting-started/","page":"Getting started","title":"Getting started","text":"subscription = subscribe!(source_of_values, lambda(\n on_next = (data) -> doSomethingWithMyData(data),\n on_error = (error) -> doSomethingWithAnError(error),\n on_complete = () -> println(\"Completed!\")\n))","category":"page"},{"location":"getting-started/","page":"Getting started","title":"Getting started","text":"At some point in time you may decide to stop listening for new messages.","category":"page"},{"location":"getting-started/","page":"Getting started","title":"Getting started","text":"unsubscribe!(subscription)","category":"page"},{"location":"getting-started/#Actors","page":"Getting started","title":"Actors","text":"","category":"section"},{"location":"getting-started/","page":"Getting started","title":"Getting started","text":"In order to process messages from an observable you will need to define an Actor that knows how to react to incoming messages.","category":"page"},{"location":"getting-started/","page":"Getting started","title":"Getting started","text":"struct MyActor <: Rocket.Actor{Int} end\n\nRocket.on_next!(actor::MyActor, data::Int) = doSomethingWithMyData(data)\nRocket.on_error!(actor::MyActor, error) = doSomethingWithAnError(error)\nRocket.on_complete!(actor::MyActor) = println(\"Completed!\")","category":"page"},{"location":"getting-started/","page":"Getting started","title":"Getting started","text":"An actor can also have its own local state.","category":"page"},{"location":"getting-started/","page":"Getting started","title":"Getting started","text":"struct StoreActor{D} <: Rocket.Actor{D}\n values :: Vector{D}\n\n StoreActor{D}() where D = new(Vector{D}())\nend\n\nRocket.on_next!(actor::StoreActor{D}, data::D) where D = push!(actor.values, data)\nRocket.on_error!(actor::StoreActor, error) = doSomethingWithAnError(error)\nRocket.on_complete!(actor::StoreActor) = println(\"Completed: $(actor.values)\")","category":"page"},{"location":"getting-started/","page":"Getting started","title":"Getting started","text":"For debugging purposes you can use a general LambdaActor actor or just pass a function object as an actor in subscribe! function..","category":"page"},{"location":"getting-started/#Operators","page":"Getting started","title":"Operators","text":"","category":"section"},{"location":"getting-started/","page":"Getting started","title":"Getting started","text":"What makes Rocket.jl powerful is its ability to help you process, transform and modify the messages that flow through your observables, using Operators.","category":"page"},{"location":"getting-started/","page":"Getting started","title":"Getting started","text":"subscribe!(squared_int_values |> map(Int, (d) -> d ^ 2), lambda(\n on_next = (data) -> println(data)\n))","category":"page"},{"location":"operators/transformation/pairwise/#operator_pairwise","page":"pairwise","title":"Pairwise Operator","text":"","category":"section"},{"location":"operators/transformation/pairwise/","page":"pairwise","title":"pairwise","text":"pairwise","category":"page"},{"location":"operators/transformation/pairwise/#Rocket.pairwise","page":"pairwise","title":"Rocket.pairwise","text":"pairwise([ initial ])\n\nCreates a pairwise operator, which groups pairs of consecutive emissions together and emits them as a tuple of two values. Accepts optional initial seed value to start pairing from.\n\nusing Rocket\n\nsource = from(1:5) |> pairwise()\n\nsubscribe!(source, logger())\n;\n\n# output\n\n[LogActor] Data: (1, 2)\n[LogActor] Data: (2, 3)\n[LogActor] Data: (3, 4)\n[LogActor] Data: (4, 5)\n[LogActor] Completed\n\nusing Rocket\n\nsource = from(1:5) |> pairwise(0)\n\nsubscribe!(source, logger())\n;\n\n# output\n\n[LogActor] Data: (0, 1)\n[LogActor] Data: (1, 2)\n[LogActor] Data: (2, 3)\n[LogActor] Data: (3, 4)\n[LogActor] Data: (4, 5)\n[LogActor] Completed\n\nSee also: AbstractOperator, InferableOperator, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/transformation/pairwise/#See-also","page":"pairwise","title":"See also","text":"","category":"section"},{"location":"operators/transformation/pairwise/","page":"pairwise","title":"pairwise","text":"Operators","category":"page"},{"location":"operators/filtering/first/#operator_first","page":"first","title":"First operator","text":"","category":"section"},{"location":"operators/filtering/first/","page":"first","title":"first","text":"first","category":"page"},{"location":"operators/filtering/first/#Base.first","page":"first","title":"Base.first","text":"first(; default = nothing)\n\nCreates a first operator, which returns an Observable that emits only the first value emitted by the source Observable. Sends FirstNotFoundException error message if a given source completes without emitting a single value.\n\nArguments\n\ndefault: an optional default value to provide if no values were emitted\n\nProducing\n\nStream of type <: Subscribable{L} where L refers to type of source stream\n\nExamples\n\nusing Rocket\n\nsource = from(1:100)\nsubscription = subscribe!(source |> first(), logger())\n;\n\n# output\n\n[LogActor] Data: 1\n[LogActor] Completed\n\nSee also: take, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/filtering/first/#Description","page":"first","title":"Description","text":"","category":"section"},{"location":"operators/filtering/first/","page":"first","title":"first","text":"An alias for take(1) operator.","category":"page"},{"location":"operators/filtering/first/#See-also","page":"first","title":"See also","text":"","category":"section"},{"location":"operators/filtering/first/","page":"first","title":"first","text":"Operators, take","category":"page"},{"location":"actors/types/function/#actor_function","page":"Function","title":"Function actor","text":"","category":"section"},{"location":"actors/types/function/","page":"Function","title":"Function","text":"FunctionActor","category":"page"},{"location":"actors/types/function/#Rocket.FunctionActor","page":"Function","title":"Rocket.FunctionActor","text":"FunctionActor{D} <: Actor{D}\n\nFunctionActor provides a simple interface to use a single function as a next! callback, error! callback throws an ErrorException and complete! callback does nothing. Should not be used explicitly because it will be created automatically when passing a Function object as an actor in subscribe! function.\n\nExamples\n\nusing Rocket\n\nsource = from(1:5)\nsubscribe!(source, (t) -> println(t))\n;\n\n# output\n1\n2\n3\n4\n5\n\nSee also: Actor, subscribe!\n\n\n\n\n\n","category":"type"},{"location":"operators/mathematical/min/#operator_min","page":"min","title":"Min Operator","text":"","category":"section"},{"location":"operators/mathematical/min/","page":"min","title":"min","text":"min","category":"page"},{"location":"operators/mathematical/min/#Base.min","page":"min","title":"Base.min","text":"min(; from = nothing)\n\nCreates a min operator, which emits a single item: the item with the smallest value.\n\nArguments\n\nfrom: optional initial minimal value, if nothing first item from the source will be used as initial instead\n\nProducing\n\nStream of type <: Subscribable{Union{L, Nothing}} where L refers to type of source stream\n\nExamples\n\nusing Rocket\n\nsource = from([ i for i in 1:42 ])\nsubscribe!(source |> min(), logger())\n;\n\n# output\n\n[LogActor] Data: 1\n[LogActor] Completed\n\n\nSee also: AbstractOperator, InferableOperator, ProxyObservable, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/mathematical/min/#Description","page":"min","title":"Description","text":"","category":"section"},{"location":"operators/mathematical/min/","page":"min","title":"min","text":"The min operator operates on an Observable of similar objects. When source Observable completes, it emits the item with the smallest value.","category":"page"},{"location":"operators/mathematical/min/#See-also","page":"min","title":"See also","text":"","category":"section"},{"location":"operators/mathematical/min/","page":"min","title":"min","text":"Operators","category":"page"},{"location":"operators/errors/error_if/#operator_error_if","page":"error_if","title":"Error If Operator","text":"","category":"section"},{"location":"operators/errors/error_if/","page":"error_if","title":"error_if","text":"error_if","category":"page"},{"location":"operators/errors/error_if/#Rocket.error_if","page":"error_if","title":"Rocket.error_if","text":"error_if(checkFn, errorFn)\n\nCreates an error_if operator, which performs a check for every emission on the source Observable with checkFn. If checkFn returns true, the operator sends an error event and unsubscribes from the observable.\n\nArguments\n\ncheckFn: check function with (data) -> Bool signature\nerrorFn: error object generating function with (data) -> Any signature, optional\n\nProducing\n\nStream of type <: Subscribable{L} where L refers to type of source stream\n\nExamples\n\nusing Rocket\n\nsource = from([1, 2, 3]) |> error_if((data) -> data > 2, (data) -> \"CustomError\")\n\nsubscription = subscribe!(source, lambda(\n on_next = (d) -> println(\"Next: \", d),\n on_error = (e) -> println(\"Error: \", e),\n on_complete = () -> println(\"Completed\")\n))\n;\n\n# output\nNext: 1\nNext: 2\nError: CustomError\n\nSee also: error_if_not, error_if_empty, default_if_empty, lambda\n\n\n\n\n\n","category":"function"},{"location":"operators/errors/error_if/#See-also","page":"error_if","title":"See also","text":"","category":"section"},{"location":"operators/errors/error_if/","page":"error_if","title":"error_if","text":"Operators","category":"page"},{"location":"subjects/about/#section_subjects","page":"Subject","title":"About subjects","text":"","category":"section"},{"location":"subjects/about/","page":"Subject","title":"Subject","text":"A Rocket.jl Subject is a special type of Observable that allows values to be multicasted to many Actors. While plain Observables are unicast (each subscribed Actor owns an independent execution of the Observable), Subjects are multicast.","category":"page"},{"location":"subjects/about/","page":"Subject","title":"Subject","text":"note: Note\nA Subject is like an Observable, but can multicast to many Actors. Subjects are like event emitters: they maintain a registry of many listeners.","category":"page"},{"location":"subjects/about/","page":"Subject","title":"Subject","text":"Every Subject is an Observable. Given a Subject, you can subscribe to it, providing an Actor, which will start receiving values normally. From the perspective of the Actor, it cannot tell whether the Observable execution is coming from a plain unicast Observable or a Subject.","category":"page"},{"location":"subjects/about/","page":"Subject","title":"Subject","text":"Internally to the Subject, subscribe! does not invoke a new execution that delivers values. Instead, it simply registers the given Actor in a list of Actors.","category":"page"},{"location":"subjects/about/","page":"Subject","title":"Subject","text":"Every Subject is an Actor itself. It is an object with the methods next!, error!, and complete!. Call next!(subject, theValue) to feed a new value to the Subject, and it will be multicasted to the Actors that listen to the Subject.","category":"page"},{"location":"subjects/about/","page":"Subject","title":"Subject","text":"In the example below, we have two Observers attached to a Subject, and we feed some values to the Subject:","category":"page"},{"location":"subjects/about/","page":"Subject","title":"Subject","text":"using Rocket\n\nsource = Subject(Int)\n\nsubscription1 = subscribe!(source, lambda(\n on_next = (d) -> println(\"Actor 1: $d\")\n))\n\nsubscription2 = subscribe!(source, lambda(\n on_next = (d) -> println(\"Actor 2: $d\")\n))\n\nnext!(source, 0)\n\n# Logs\n# Actor 1: 0\n# Actor 2: 0\n\nunsubscribe!(subscription1)\nunsubscribe!(subscription2)\n","category":"page"},{"location":"subjects/about/","page":"Subject","title":"Subject","text":"Since a Subject is an actor, this also means you may provide a Subject as the argument to the subscribe of any Observable:","category":"page"},{"location":"subjects/about/","page":"Subject","title":"Subject","text":"using Rocket\n\nsource = Subject(Int)\n\nsubscription1 = subscribe!(source, lambda(\n on_next = (d) -> println(\"Actor 1: $d\")\n))\n\nsubscription2 = subscribe!(source, lambda(\n on_next = (d) -> println(\"Actor 2: $d\")\n))\n\nother_source = from([ 1, 2, 3 ])\nsubscribe!(other_source, source);\n\n# Logs\n# Actor 1: 1\n# Actor 2: 1\n# Actor 1: 2\n# Actor 2: 2\n# Actor 1: 3\n# Actor 2: 3","category":"page"},{"location":"subjects/about/","page":"Subject","title":"Subject","text":"Here, we essentially convert a unicast Observable execution to multicast, through the Subject. This demonstrates how Subjects offer a unique way to share Observable execution with multiple Observers.","category":"page"},{"location":"subjects/about/#Schedulers","page":"Subject","title":"Schedulers","text":"","category":"section"},{"location":"subjects/about/","page":"Subject","title":"Subject","text":"A Subject (and some other observables) uses scheduler objects to schedule message delivery to their listeners.","category":"page"},{"location":"subjects/about/#Synchronous-scheduler","page":"Subject","title":"Synchronous scheduler","text":"","category":"section"},{"location":"subjects/about/","page":"Subject","title":"Subject","text":"One of the variants of schedulers is the AsapScheduler, which delivers every message synchronously. AsapScheduler is a default scheduler for all Subject objects.","category":"page"},{"location":"subjects/about/","page":"Subject","title":"Subject","text":"AsapScheduler","category":"page"},{"location":"subjects/about/#Rocket.AsapScheduler","page":"Subject","title":"Rocket.AsapScheduler","text":"AsapScheduler\n\nAsapScheduler executes scheduled actions as soon as possible and does not introduce any additional logic. AsapScheduler is a default scheduler for almost all observables.\n\n\n\n\n\n","category":"type"},{"location":"subjects/about/","page":"Subject","title":"Subject","text":"using Rocket\n\nsubject = Subject(Int, scheduler = AsapScheduler())\n\nsubscription1 = subscribe!(subject, logger(\"Actor 1\"))\n\nprintln(\"Before next\")\nnext!(subject, 1)\nnext!(subject, 2)\nprintln(\"After next\")\n\nsubscription2 = subscribe!(subject, logger(\"Actor 2\"))\n\nnext!(subject, 3)\n\n# Logs\n# Before next\n# [Actor 1] Data: 1\n# [Actor 1] Data: 2\n# After next\n# [Actor 1] Data: 3\n# [Actor 2] Data: 3","category":"page"},{"location":"subjects/about/#Asynchronous-Scheduler","page":"Subject","title":"Asynchronous Scheduler","text":"","category":"section"},{"location":"subjects/about/","page":"Subject","title":"Subject","text":"An AsyncScheduler is similar to a AsapScheduler. Both allows for Subject to scheduler their messages for multiple listeners, but a AsyncScheduler delivers all messages asynchronously (but still ordered) using a Julia's built-in Task object.","category":"page"},{"location":"subjects/about/","page":"Subject","title":"Subject","text":"AsyncScheduler","category":"page"},{"location":"subjects/about/#Rocket.AsyncScheduler","page":"Subject","title":"Rocket.AsyncScheduler","text":"AsyncScheduler\n\nAsyncScheduler executes scheduled actions asynchronously and uses Channel object to order different actions on a single asynchronous task\n\n\n\n\n\n","category":"type"},{"location":"subjects/about/","page":"Subject","title":"Subject","text":"using Rocket\n\nsubject = Subject(Int, scheduler = AsyncScheduler())\n\nsubscription1 = subscribe!(subject, logger(\"Actor 1\"))\n\nprintln(\"Before next\")\nnext!(subject, 1)\nnext!(subject, 2)\nprintln(\"After next\")\n\nsubscription2 = subscribe!(subject, logger(\"Actor 2\"))\n\nnext!(subject, 3)\n\n# Logs\n# Before next\n# After next\n# [Actor 1] Data: 1\n# [Actor 1] Data: 2\n# [Actor 1] Data: 3\n# [Actor 2] Data: 3\n","category":"page"},{"location":"operators/filtering/find_index/#operator_find_index","page":"find_index","title":"Find Index operator","text":"","category":"section"},{"location":"operators/filtering/find_index/","page":"find_index","title":"find_index","text":"find_index","category":"page"},{"location":"operators/filtering/find_index/#Rocket.find_index","page":"find_index","title":"Rocket.find_index","text":"find_index(conditionFn::F) where { F <: Function }\n\nCreates a find operator, which emits only the index of the first value emitted by the source Observable that meets some condition. Indices are 1-based.\n\nProducing\n\nStream of type <: Subscribable{L} where L refers to type of source stream\n\nArguments\n\nconditionFn::F: condition function with (data::T) -> Bool signature\n\nExamples\n\nusing Rocket\n\nsource = from([ 0, 1, 2, 3, 4, 5, 6, 7, 8 ])\nsubscribe!(source |> find_index((d) -> d !== 0 && d % 2 == 0), logger())\n;\n\n# output\n\n[LogActor] Data: 3\n[LogActor] Completed\n\nSee also: find, AbstractOperator, InferableOperator, ProxyObservable, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/filtering/find_index/#Description","page":"find_index","title":"Description","text":"","category":"section"},{"location":"operators/filtering/find_index/","page":"find_index","title":"find_index","text":"It's like find, but emits the index of the found value, not the value itself.","category":"page"},{"location":"operators/filtering/find_index/#See-also","page":"find_index","title":"See also","text":"","category":"section"},{"location":"operators/filtering/find_index/","page":"find_index","title":"find_index","text":"Operators, take","category":"page"},{"location":"api/subjects/#subjects_api","page":"Subjects","title":"Subjects API","text":"","category":"section"},{"location":"api/subjects/#Traits","page":"Subjects","title":"Traits","text":"","category":"section"},{"location":"api/subjects/","page":"Subjects","title":"Subjects","text":"SubjectTrait\nas_subject \nValidSubjectTrait\nInvalidSubjectTrait\nAbstractSubject","category":"page"},{"location":"api/subjects/#Rocket.SubjectTrait","page":"Subjects","title":"Rocket.SubjectTrait","text":"Abstract type for all possible subject traits\n\nSee also: ValidSubjectTrait, InvalidSubjectTrait, as_subject\n\n\n\n\n\n","category":"type"},{"location":"api/subjects/#Rocket.as_subject","page":"Subjects","title":"Rocket.as_subject","text":"as_subject(::Type)\n\nThis function checks subject trait behavior specification. Should be used explicitly to specify subject trait behavior for any object type.\n\nSee also: SubjectTrait\n\n\n\n\n\n","category":"function"},{"location":"api/subjects/#Rocket.ValidSubjectTrait","page":"Subjects","title":"Rocket.ValidSubjectTrait","text":"Valid subject trait behavior\n\nSee also: SubjectTrait\n\n\n\n\n\n","category":"type"},{"location":"api/subjects/#Rocket.InvalidSubjectTrait","page":"Subjects","title":"Rocket.InvalidSubjectTrait","text":"Default subject trait behavior for all types.\n\nSee also: SubjectTrait\n\n\n\n\n\n","category":"type"},{"location":"api/subjects/#Rocket.AbstractSubject","page":"Subjects","title":"Rocket.AbstractSubject","text":"Supertype for Subject types. Automatically specifies ValidSubject, SimpleSubscribableTrait and BaseActorTrait traits.\n\nSee also: Subject, ValidSubjectTrait, SimpleSubscribableTrait, BaseActorTrait\n\n\n\n\n\n","category":"type"},{"location":"api/subjects/#Factory","page":"Subjects","title":"Factory","text":"","category":"section"},{"location":"api/subjects/","page":"Subjects","title":"Subjects","text":"AbstractSubjectFactory\ncreate_subject","category":"page"},{"location":"api/subjects/#Rocket.AbstractSubjectFactory","page":"Subjects","title":"Rocket.AbstractSubjectFactory","text":"Abstract type for all possible subject factories\n\nSee also: SubjectTrait, ValidSubjectTrait, InvalidSubjectTrait\n\n\n\n\n\n","category":"type"},{"location":"api/subjects/#Rocket.create_subject","page":"Subjects","title":"Rocket.create_subject","text":"create_subject(::Type{L}, factory::F) where L where { F <: AbstractSubjectFactory }\n\nActor creator function for a given factory F. Should be implemented explicitly for any AbstractActorFactory object\n\nSee also: AbstractSubjectFactory, MissingCreateActorFactoryImplementationError\n\n\n\n\n\n","category":"function"},{"location":"api/subjects/#Errors","page":"Subjects","title":"Errors","text":"","category":"section"},{"location":"api/subjects/","page":"Subjects","title":"Subjects","text":"InvalidSubjectTraitUsageError\nInconsistentSubjectDataTypesError","category":"page"},{"location":"api/subjects/#Rocket.InvalidSubjectTraitUsageError","page":"Subjects","title":"Rocket.InvalidSubjectTraitUsageError","text":"InvalidSubject usage error\n\nSee also: as_subject\n\n\n\n\n\n","category":"type"},{"location":"api/subjects/#Rocket.InconsistentSubjectDataTypesError","page":"Subjects","title":"Rocket.InconsistentSubjectDataTypesError","text":"InconsistentSubjectDataTypesError\n\nSee also: as_subject\n\n\n\n\n\n","category":"type"},{"location":"operators/transformation/lowercase/#operator_lowercase","page":"lowercase","title":"Lowercase Operator","text":"","category":"section"},{"location":"operators/transformation/lowercase/","page":"lowercase","title":"lowercase","text":"lowercase","category":"page"},{"location":"operators/transformation/lowercase/#Base.Unicode.lowercase","page":"lowercase","title":"Base.Unicode.lowercase","text":"lowercase()\n\nCreates an lowercase operator, which forces each value to be in lower case\n\nProducing\n\nStream of type <: Subscribable{L} where L referes to type of data of input Observable\n\nExamples\n\nusing Rocket\n\nsource = of(\"Hello, world!\")\nsubscribe!(source |> lowercase(), logger())\n;\n\n# output\n\n[LogActor] Data: hello, world!\n[LogActor] Completed\n\nSee also: AbstractOperator, InferableOperator, ProxyObservable, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/transformation/lowercase/#See-also","page":"lowercase","title":"See also","text":"","category":"section"},{"location":"operators/transformation/lowercase/","page":"lowercase","title":"lowercase","text":"Operators, map, uppercase","category":"page"},{"location":"operators/transformation/merge_map/#operator_merge_map","page":"merge_map","title":"MergeMap Operator","text":"","category":"section"},{"location":"operators/transformation/merge_map/","page":"merge_map","title":"merge_map","text":"merge_map","category":"page"},{"location":"operators/transformation/merge_map/#Rocket.merge_map","page":"merge_map","title":"Rocket.merge_map","text":"merge_map(::Type{R}, mappingFn::F = identity; concurrent::Int = typemax(Int)) where { R, F <: Function }\n\nCreates a merge_map operator, which returns an Observable that emits the result of applying the projection function mappingFn to each item emitted by the source Observable and merging the results of the Observables obtained from this transformation.\n\nArguments\n\n::Type{R}: the type of data of output Observables after projection with mappingFn\nmappingFn::F: projection function with (data) -> Observable{R} signature\nconcurrent::Int: optional, default is typemax(Int), maximum number of input Observables being subscribed to concurrently\n\nProducing\n\nStream of type <: Subscribable{R}\n\nExamples\n\nusing Rocket\n\nsource = from([ 0, 0 ]) |> merge_map(Int, d -> from([ 1, 2, 3 ], scheduler = AsyncScheduler(0)))\nsubscribe!(source, logger())\n;\n\n# output\n\n[LogActor] Data: 1\n[LogActor] Data: 1\n[LogActor] Data: 2\n[LogActor] Data: 2\n[LogActor] Data: 3\n[LogActor] Data: 3\n[LogActor] Completed\n\nSee also: AbstractOperator, RightTypedOperator, ProxyObservable, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/transformation/merge_map/#See-also","page":"merge_map","title":"See also","text":"","category":"section"},{"location":"operators/transformation/merge_map/","page":"merge_map","title":"merge_map","text":"Operators","category":"page"},{"location":"teardown/types/void/#teardown_void","page":"Void","title":"Void Teardown","text":"","category":"section"},{"location":"teardown/types/void/","page":"Void","title":"Void","text":"VoidTeardown\nvoidTeardown","category":"page"},{"location":"teardown/types/void/#Rocket.VoidTeardown","page":"Void","title":"Rocket.VoidTeardown","text":"VoidTeardown()\n\nVoidTeardown object does nothing on unsubscription. It is usefull for synchronous observables and observables which cannot be cancelled after execution.\n\nSee also: Teardown, VoidTeardownLogic\n\n\n\n\n\n","category":"type"},{"location":"teardown/types/void/#Rocket.voidTeardown","page":"Void","title":"Rocket.voidTeardown","text":"voidTeardown\n\nAn instance of VoidTeardown singleton object.\n\nSee also: VoidTeardown\n\n\n\n\n\n","category":"constant"},{"location":"operators/transformation/substitute/#operator_substitute","page":"substitute","title":"Substitute Operator","text":"","category":"section"},{"location":"operators/transformation/substitute/","page":"substitute","title":"substitute","text":"substitute\nSubstituteHandler","category":"page"},{"location":"operators/transformation/substitute/#Rocket.substitute","page":"substitute","title":"Rocket.substitute","text":"substitute(::Type{T}, mapFn::F, handler::SubstituteHandler) where { T, F <: Function }\n\nThis operator forces observable to substitute each emmited value with the latest computed value with the corresponding handler and release! function. After release! on handler substitute operator computes new value with mapFn but does not emit it until next emission from source observable. Always calls mapFn on first value from source observable.\n\nProducing\n\nStream of type <: Subscribable{T} \n\nExamples\n\nusing Rocket\n\nsubject = Subject(Int)\n\nhandler = SubstituteHandler()\nsource = subject |> substitute(String, i -> string(\"i = \", i), handler)\n\nsubscription = subscribe!(source, logger())\n\nnext!(subject, 1)\nnext!(subject, 2)\nnext!(subject, 3)\n\nrelease!(handler)\n\nnext!(subject, 4)\nnext!(subject, 5)\nnext!(subject, 6)\n\nunsubscribe!(subscription)\n;\n\n# output\n\n[LogActor] Data: i = 1\n[LogActor] Data: i = 1\n[LogActor] Data: i = 1\n[LogActor] Data: i = 3\n[LogActor] Data: i = 3\n[LogActor] Data: i = 3\n\nSee also: SubstituteHandler\n\n\n\n\n\n","category":"function"},{"location":"operators/transformation/substitute/#Rocket.SubstituteHandler","page":"substitute","title":"Rocket.SubstituteHandler","text":"SubstituteHandler()\n\nhandler used to release! new values in substitute operator.\n\nSee also: substitute\n\n\n\n\n\n","category":"type"},{"location":"operators/transformation/substitute/#See-also","page":"substitute","title":"See also","text":"","category":"section"},{"location":"operators/transformation/substitute/","page":"substitute","title":"substitute","text":"Operators","category":"page"},{"location":"operators/mathematical/about/#Mathematical-and-Aggregate-category","page":"About mathematical operators","title":"Mathematical and Aggregate category","text":"","category":"section"},{"location":"operators/mathematical/about/","page":"About mathematical operators","title":"About mathematical operators","text":"There are operators for different purposes, and they may be categorized as: creation, transformation, filtering, joining, multicasting, error handling, utility, etc. In the following list you will find all the operators organized in mathematical and aggregate category.","category":"page"},{"location":"operators/mathematical/about/","page":"About mathematical operators","title":"About mathematical operators","text":"count\nmax\nmin\nreduce\nsum","category":"page"},{"location":"operators/mathematical/about/#See-also","page":"About mathematical operators","title":"See also","text":"","category":"section"},{"location":"operators/mathematical/about/","page":"About mathematical operators","title":"About mathematical operators","text":"Operators","category":"page"},{"location":"operators/utility/async/#operator_ref_async","page":"async","title":"Async Operator","text":"","category":"section"},{"location":"operators/utility/async/","page":"async","title":"async","text":"async","category":"page"},{"location":"operators/utility/async/#Rocket.async","page":"async","title":"Rocket.async","text":"async(size::Int = typemax(Int))\n\nCreates an async operator, which sends items from the source Observable asynchronously.\n\nArguments\n\nsize: Asynchronous messages buffer size, default is a typemax(Int)\n\nProducing\n\nStream of type <: Subscribable{L} where L refers to type of source stream\n\nSee also: AbstractOperator, InferableOperator, ProxyObservable\n\n\n\n\n\n","category":"function"},{"location":"operators/utility/async/#See-also","page":"async","title":"See also","text":"","category":"section"},{"location":"operators/utility/async/","page":"async","title":"async","text":"Operators","category":"page"},{"location":"operators/transformation/enumerate/#operator_enumerate","page":"enumerate","title":"Enumerate Operator","text":"","category":"section"},{"location":"operators/transformation/enumerate/","page":"enumerate","title":"enumerate","text":"enumerate","category":"page"},{"location":"operators/transformation/enumerate/#Base.Iterators.enumerate","page":"enumerate","title":"Base.Iterators.enumerate","text":"enumerate()\n\nCreates an enumerate operator, which converts each value emitted by the source Observable into a tuple of its order number and the value itself.\n\nThe enumerate operator is similar to scan(Tuple{Int, Int}, (d, c) -> (d, c[2] + 1), (0, 0)) (see scan).\n\nProducing\n\nStream of type <: Subscribable{Tuple{Int, L}} where L refers to type of source stream\n\nExamples\n\nusing Rocket\n\nsource = from([ 0 for _ in 1:3 ])\nsubscribe!(source |> enumerate(), logger())\n;\n\n# output\n\n[LogActor] Data: (1, 0)\n[LogActor] Data: (2, 0)\n[LogActor] Data: (3, 0)\n[LogActor] Completed\n\n\nSee also: AbstractOperator, InferableOperator, ProxyObservable, scan, map, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/transformation/enumerate/#Description","page":"enumerate","title":"Description","text":"","category":"section"},{"location":"operators/transformation/enumerate/","page":"enumerate","title":"enumerate","text":"enumerate returns an Observable that converts each value emitted by the source Observable into a tuple of its order number and the value itself.","category":"page"},{"location":"operators/transformation/enumerate/#Example","page":"enumerate","title":"Example","text":"","category":"section"},{"location":"operators/transformation/enumerate/","page":"enumerate","title":"enumerate","text":"Get a value from the source with its order number","category":"page"},{"location":"operators/transformation/enumerate/","page":"enumerate","title":"enumerate","text":"using Rocket\n\nsource = from([ 0.0, 0.2, 0.4, 0.6, 0.8, 1.0 ])\nsubscribe!(source |> enumerate(), logger())\n\n# output\n\n[LogActor] Data: (0.0, 1)\n[LogActor] Data: (0.2, 2)\n[LogActor] Data: (0.4, 3)\n[LogActor] Data: (0.6, 4)\n[LogActor] Data: (0.8, 5)\n[LogActor] Data: (1.0, 6)\n[LogActor] Completed","category":"page"},{"location":"operators/transformation/enumerate/#See-also","page":"enumerate","title":"See also","text":"","category":"section"},{"location":"operators/transformation/enumerate/","page":"enumerate","title":"enumerate","text":"Operators, scan","category":"page"},{"location":"actors/types/sync/#actor_sync","page":"Sync","title":"Sync actor","text":"","category":"section"},{"location":"actors/types/sync/","page":"Sync","title":"Sync","text":"sync","category":"page"},{"location":"actors/types/sync/#Rocket.sync","page":"Sync","title":"Rocket.sync","text":"sync(actor::A; withlock::Bool = true, timeout::Int = -1) where A\nsync(factory::F; withlock::Bool = true, timeout::Int = -1) where { F <: AbstractActorFactory }\n\nCreation operator for the SyncActor actor. Accepts optional named timeout argument which specifies maximum number of milliseconds to wait (throws SyncActorTimedOutException() on timeout). Also accepts optional withlock boolean flag indicating that every next!, error! and complete! event should be guarded with ReentrantLock.\n\nExamples\n\nusing Rocket\n\nactor = keep(Int)\nsynced = sync(actor)\n\nsubscribe!(from(0:5, scheduler = AsyncScheduler()), synced)\n\nyield()\n\nwait(synced)\nshow(synced.actor.values)\n\n# output\n[0, 1, 2, 3, 4, 5]\n\nCan also be used with an <: AbstractActorFactory as an argument. In this case sync function will return a special actor factory object, which will store all created actors in array and wrap them with a sync function. wait(sync_factory) method will wait for all of the created actors to be completed in the order of creation (but only once for each of them).\n\nusing Rocket\n\nvalues = Int[]\n\nfactory = lambda(on_next = (d) -> push!(values, d))\nsynced = sync(factory)\n\nsubscribe!(from(0:5, scheduler = AsyncScheduler()), synced)\n\nyield()\n\nwait(synced)\nshow(values)\n\n# output\n[0, 1, 2, 3, 4, 5]\n\nSee also: SyncActor, AbstractActor\n\n\n\n\n\n","category":"function"},{"location":"actors/types/sync/","page":"Sync","title":"Sync","text":"SyncActor","category":"page"},{"location":"actors/types/sync/#Rocket.SyncActor","page":"Sync","title":"Rocket.SyncActor","text":"SyncActor{T, A}(actor::A; withlock::Bool = true, timeout::Int = -1) where { T, A }\n\nSync actor provides a synchronized interface to wait for an actor to be notified with a complete event. By default creates a re-entrant lock for synchronizing next!, error! and complete! events.\n\nSee also: Actor, sync\n\n\n\n\n\n","category":"type"},{"location":"operators/utility/limit_subscribers/#operator_limit_subscribers","page":"limit_subscribers","title":"LimitSubscribers Operator","text":"","category":"section"},{"location":"operators/utility/limit_subscribers/","page":"limit_subscribers","title":"limit_subscribers","text":"LimitSubscribersGuard\nlimit_subscribers","category":"page"},{"location":"operators/utility/limit_subscribers/#Rocket.LimitSubscribersGuard","page":"limit_subscribers","title":"Rocket.LimitSubscribersGuard","text":"LimitSubscribersGuard(limit::Int = 1, exclusive = true)\n\nGuard structure used in limit_subscribers operator.\n\nArguments\n\nlimit: number of concurrent subscribers\nexclusive: boolean flag, which indicates whenever this guard can be shared with other observables in other limit_subscribers operator. If set to true, reusing this guard in a different limit_subscribers operator for other observable will result in automatic unsubscription of all present actors.\n\nNote\n\nThis structure is useful in Pluto.jl notebooks in particular, allowing for automatic subscription/unsubscription of observables.\n\nExample\n\n\n# Cell 1\nguard = LimitSubscribersGuard()\n\n# Cell 2\nsubscription = subscribe!(some_stream |> limit_subscribers(guard), logger())\n\nSee also: limit_subscribers, subscribe!\n\n\n\n\n\n","category":"type"},{"location":"operators/utility/limit_subscribers/#Rocket.limit_subscribers","page":"limit_subscribers","title":"Rocket.limit_subscribers","text":"limit_subscribers(limit::Int = 1, exclusive::Bool = true)\nlimit_subscribers(guard::LimitSubscribersGuard)\n\nCreates an operator that limits number of concurrent actors to the given observable. On new subscription, if limit is exceeded, oldest actor is automatically unsubscribed and receives a completion event.\n\nArguments\n\nlimit: number of concurrent subscribers\nexclusive: boolean flag, which indicates whenever this guard can be shared with other observables in other limit_subscribers operator. If set to true, reusing this guard in a different limit_subscribers operator for other observable will result in automatic unsubscription of all present actors.\n\nNote\n\nThis structure is useful in Pluto.jl notebooks in particular, allowing for automatic subscription/unsubscription of observables.\n\nExample\n\n\n# Cell 1\nguard = LimitSubscribersGuard()\n\n# Cell 2\nsubscription = subscribe!(some_stream |> limit_subscribers(guard), logger())\n\nSee also: LimitSubscribersGuard\n\n\n\n\n\n","category":"function"},{"location":"operators/utility/limit_subscribers/#See-also","page":"limit_subscribers","title":"See also","text":"","category":"section"},{"location":"operators/utility/limit_subscribers/","page":"limit_subscribers","title":"limit_subscribers","text":"Operators","category":"page"},{"location":"operators/utility/skip_error/#operator_skip_error","page":"skip_error","title":"SkipError Operator","text":"","category":"section"},{"location":"operators/utility/skip_error/","page":"skip_error","title":"skip_error","text":"skip_error","category":"page"},{"location":"operators/utility/skip_error/#Rocket.skip_error","page":"skip_error","title":"Rocket.skip_error","text":"skip_error()\n\nCreates a skip_error operator, which filters out error event by the source Observable by emitting only next and complete messages.\n\nProducing\n\nStream of type <: Subscribable{L} where L refers to type of source stream\n\nExamples\n\nusing Rocket\n\nsource = faulted(\"error\")\nsubscribe!(source |> skip_error(), logger())\n;\n\n# output\n\n\nSee also: AbstractOperator, InferableOperator, ProxyObservable, skip_error, skip_complete, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/utility/skip_error/#See-also","page":"skip_error","title":"See also","text":"","category":"section"},{"location":"operators/utility/skip_error/","page":"skip_error","title":"skip_error","text":"Operators","category":"page"},{"location":"api/observables/#observables_api","page":"Observables","title":"Observables API","text":"","category":"section"},{"location":"api/observables/","page":"Observables","title":"Observables","text":"Any observable-like should implement a valid subscribable logic.","category":"page"},{"location":"api/observables/#Traits","page":"Observables","title":"Traits","text":"","category":"section"},{"location":"api/observables/","page":"Observables","title":"Observables","text":"as_subscribable\nSubscribableTrait\nSimpleSubscribableTrait\nScheduledSubscribableTrait\nInvalidSubscribableTrait","category":"page"},{"location":"api/observables/#Rocket.as_subscribable","page":"Observables","title":"Rocket.as_subscribable","text":"as_subscribable(any)\n\nThis function checks subscribable trait behavior specification. Can be used explicitly to specify subscribable trait behavior for any object.\n\nSee also: SubscribableTrait\n\n\n\n\n\n","category":"function"},{"location":"api/observables/#Rocket.SubscribableTrait","page":"Observables","title":"Rocket.SubscribableTrait","text":"Abstract type for all possible subscribable traits\n\nSee also: SimpleSubscribableTrait, ScheduledSubscribableTrait, InvalidSubscribableTrait\n\n\n\n\n\n","category":"type"},{"location":"api/observables/#Rocket.SimpleSubscribableTrait","page":"Observables","title":"Rocket.SimpleSubscribableTrait","text":"Simple subscribable trait behavior. Simple subscribable can be used in subscribe! function and just executes on_subscribe! method for provided subscribable. SimpleSubscribableTrait is a subtype of SubscribableTrait.\n\nSee also: SubscribableTrait, Subscribable, subscribe!, on_subscribe!\n\n\n\n\n\n","category":"type"},{"location":"api/observables/#Rocket.ScheduledSubscribableTrait","page":"Observables","title":"Rocket.ScheduledSubscribableTrait","text":"Scheduled subscribable trait behavior. Scheduled subscribable can be used in subscribe! function and executes on_subscribe! method for provided subscribable with custom scheduling. ScheduledSubscribableTrait is a subtype of SubscribableTrait.\n\nSee also: SubscribableTrait, ScheduledSubscribable, subscribe!, on_subscribe!\n\n\n\n\n\n","category":"type"},{"location":"api/observables/#Rocket.InvalidSubscribableTrait","page":"Observables","title":"Rocket.InvalidSubscribableTrait","text":"Default subscribable trait behavior for all types. Invalid subscribable cannot be used in subscribe! function, doing so will throw an error. InvalidSubscribableTrait is a subtype of SubscribableTrait.\n\nSee also: SubscribableTrait, subscribe!\n\n\n\n\n\n","category":"type"},{"location":"api/observables/#Types","page":"Observables","title":"Types","text":"","category":"section"},{"location":"api/observables/","page":"Observables","title":"Observables","text":"AbstractSubscribable\nSubscribable\nScheduledSubscribable\nsubscribe!\non_subscribe!","category":"page"},{"location":"api/observables/#Rocket.AbstractSubscribable","page":"Observables","title":"Rocket.AbstractSubscribable","text":"Supertype type for Subscribable and ScheduledSubscribable types.\n\nSee also: Subscribable, ScheduledSubscribable\n\n\n\n\n\n","category":"type"},{"location":"api/observables/#Rocket.Subscribable","page":"Observables","title":"Rocket.Subscribable","text":"Super type for any simple subscribable object. Automatically specifies a SimpleSubscribableTrait trait behavior. Objects with specified SimpleSubscribableTrait subscribable trait must implement: on_subscribe!(subscribable, actor) method. Subscribable is a subtype of AbstractSubscribable type.\n\nExamples\n\nusing Rocket\n\nstruct MySubscribable <: Subscribable{String} end\n\nRocket.as_subscribable(MySubscribable)\n\n# output\n\nSimpleSubscribableTrait{String}()\n\nSee also: SubscribableTrait, SimpleSubscribableTrait\n\n\n\n\n\n","category":"type"},{"location":"api/observables/#Rocket.ScheduledSubscribable","page":"Observables","title":"Rocket.ScheduledSubscribable","text":"Super type for any scheduled subscribable object. Automatically specifies a ScheduledSubscribableTrait trait behavior. Objects with specified ScheduledSubscribableTrait subscribable trait must implement: on_subscribe!(subscribable, actor, scheduler) method. ScheduledSubscribable is a subtype of AbstractSubscribable type.\n\nExamples\n\nusing Rocket\n\nstruct MyScheduledSubscribable <: ScheduledSubscribable{String} end\n\nRocket.as_subscribable(MyScheduledSubscribable)\n\n# output\n\nScheduledSubscribableTrait{String}()\n\nSee also: SubscribableTrait, ScheduledSubscribableTrait\n\n\n\n\n\n","category":"type"},{"location":"api/observables/#Rocket.subscribe!","page":"Observables","title":"Rocket.subscribe!","text":"subscribe!(subscribable::T, actor::S) where { T, S }\nsubscribe!(subscribable::T, factory::F) where { T, F <: AbstractActorFactory }\nsubscribe!(subscriptions::Tuple)\nsubscribe!(subscriptions::AbstractVector)\n\nsubscribe! function is used to attach an actor to subscribable. It also checks types of subscribable and actors to be a valid Subscribable and Actor objects respectively. Passing not valid subscribable or/and actor object will throw an error. If the input argument to the subscribe! function is either a tuple or a vector, it will first check that all of the arguments are valid source and actor objects and if its true will subscribe for each of them individually. \n\nArguments\n\nsubscribable: valid subscribable object\nactor: valid actor object\n\nExamples\n\nusing Rocket\n\nsource = from((1, 2, 3))\nsubscribe!(source, logger())\n;\n\n# output\n\n[LogActor] Data: 1\n[LogActor] Data: 2\n[LogActor] Data: 3\n[LogActor] Completed\n\nusing Rocket\n\nsource = from((1, 2, 3))\nsubscribe!(source, 1)\n;\n\n# output\n\nERROR: Type Int64 is not a valid actor type.\n[...]\n\nusing Rocket\n\nsource = from((1, 2, 3))\nsubscribe!(1, logger())\n;\n\n# output\n\nERROR: Type Int64 is not a valid subscribable type.\n[...]\n\nSee also: on_subscribe!, as_subscribable\n\n\n\n\n\n","category":"function"},{"location":"api/observables/#Rocket.on_subscribe!","page":"Observables","title":"Rocket.on_subscribe!","text":"on_subscribe!(subscribable, actor)\non_subscribe!(subscribable, actor, scheduler)\n\nEvery valid subscribable object have to define its own method for on_subscribe! function which specifies subscription logic and has return a valid Teardown object.\n\nObjects with specified SimpleSubscribableTrait subscribable trait must implement: on_subscribe!(subscribable, actor) method. Objects with specified ScheduledSubscribableTrait subscribable trait must implement: on_subscribe!(subscribable, actor, scheduler) method.\n\nArguments\n\nsubscribable: Subscribable object\nactor: Actor object\nscheduler: Scheduler object (only for scheduled subscribables)\n\nExamples\n\nusing Rocket\n\nstruct MySubscribable <: Subscribable{Int} end\n\nfunction Rocket.on_subscribe!(subscribable::MySubscribable, actor)\n next!(actor, 0)\n complete!(actor)\n return voidTeardown\nend\n\nsubscribe!(MySubscribable(), logger())\n;\n\n# output\n\n[LogActor] Data: 0\n[LogActor] Completed\n\nusing Rocket\n\nstruct MyScheduledSubscribable <: ScheduledSubscribable{Int} end\n\nRocket.getscheduler(::MyScheduledSubscribable) = AsapScheduler()\n\nfunction Rocket.on_subscribe!(subscribable::MyScheduledSubscribable, actor, scheduler)\n next!(actor, 0, scheduler)\n complete!(actor, scheduler)\n return voidTeardown\nend\n\nsubscribe!(MyScheduledSubscribable(), logger())\n;\n\n# output\n\n[LogActor] Data: 0\n[LogActor] Completed\n\nSee also: Subscribable, ScheduledSubscribable, SimpleSubscribableTrait, ScheduledSubscribableTrait, Teardown, logger\n\n\n\n\n\n","category":"function"},{"location":"api/observables/#Errors","page":"Observables","title":"Errors","text":"","category":"section"},{"location":"api/observables/","page":"Observables","title":"Observables","text":"InvalidSubscribableTraitUsageError\nInconsistentActorWithSubscribableDataTypesError\nMissingOnSubscribeImplementationError\nMissingOnScheduledSubscribeImplementationError","category":"page"},{"location":"api/observables/#Rocket.InvalidSubscribableTraitUsageError","page":"Observables","title":"Rocket.InvalidSubscribableTraitUsageError","text":"This error will be thrown if subscribe! function is called with invalid subscribable object\n\nSee also: subscribe!\n\n\n\n\n\n","category":"type"},{"location":"api/observables/#Rocket.InconsistentActorWithSubscribableDataTypesError","page":"Observables","title":"Rocket.InconsistentActorWithSubscribableDataTypesError","text":"This error will be thrown if subscribe! function is called with inconsistent subscribable and actor objects\n\nSee also: subscribe!\n\n\n\n\n\n","category":"type"},{"location":"api/observables/#Rocket.MissingOnSubscribeImplementationError","page":"Observables","title":"Rocket.MissingOnSubscribeImplementationError","text":"This error will be thrown if Julia cannot find specific method of 'on_subscribe!()' function for given subscribable and actor\n\nSee also: on_subscribe!\n\n\n\n\n\n","category":"type"},{"location":"api/observables/#Rocket.MissingOnScheduledSubscribeImplementationError","page":"Observables","title":"Rocket.MissingOnScheduledSubscribeImplementationError","text":"This error will be thrown if Julia cannot find specific method of 'on_subscribe!()' function for given subscribable, actor and scheduler\n\nSee also: on_subscribe!\n\n\n\n\n\n","category":"type"},{"location":"operators/mathematical/sum/#operator_sum","page":"sum","title":"Sum Operator","text":"","category":"section"},{"location":"operators/mathematical/sum/","page":"sum","title":"sum","text":"sum","category":"page"},{"location":"operators/mathematical/sum/#Base.sum","page":"sum","title":"Base.sum","text":"sum(; from = nothing)\n\nCreates a sum operator, which applies a sum accumulator function over the source Observable, and returns the accumulated result when the source completes, given an optional initial value.\n\nThe sum operator is similar to reduce(T, T, +) (see reduce).\n\nArguments\n\nfrom: optional initial accumulation value, if nothing first value will be used instead\n\nProducing\n\nStream of type <: Subscribable{L} where L refers to type of source stream\n\nExamples\n\nusing Rocket\n\nsource = from([ i for i in 1:42 ])\nsubscribe!(source |> sum(), logger())\n;\n\n# output\n\n[LogActor] Data: 903\n[LogActor] Completed\n\n\nusing Rocket\n\nsource = from([ i for i in 1:42 ])\nsubscribe!(source |> sum(from = 97), logger())\n;\n\n# output\n\n[LogActor] Data: 1000\n[LogActor] Completed\n\n\nSee also: AbstractOperator, InferableOperator, ProxyObservable, reduce, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/mathematical/sum/#Description","page":"sum","title":"Description","text":"","category":"section"},{"location":"operators/mathematical/sum/","page":"sum","title":"sum","text":"sum operates on an Observable of objects on which + is defined. When the source Observable completes, it emits the sum of all previous items. The sum operator is similar to reduce(T, T, +) (see reduce).","category":"page"},{"location":"operators/mathematical/sum/#See-also","page":"sum","title":"See also","text":"","category":"section"},{"location":"operators/mathematical/sum/","page":"sum","title":"sum","text":"Operators, reduce","category":"page"},{"location":"actors/types/void/#actor_void","page":"Void","title":"Void actor","text":"","category":"section"},{"location":"actors/types/void/","page":"Void","title":"Void","text":"void","category":"page"},{"location":"actors/types/void/#Rocket.void","page":"Void","title":"Rocket.void","text":"void()\nvoid(::Type{T}) where T\n\nCreation operator for the VoidActor actor.\n\nExamples\n\nusing Rocket\n\nactor = void(Int)\nactor isa VoidActor{Int}\n\n# output\ntrue\n\n\nSee also: VoidActor, AbstractActor\n\n\n\n\n\n","category":"function"},{"location":"actors/types/void/","page":"Void","title":"Void","text":"VoidActor","category":"page"},{"location":"actors/types/void/#Rocket.VoidActor","page":"Void","title":"Rocket.VoidActor","text":"VoidActor{D}() where D\n\nVoid actor does nothing with input data, error and complete events, can be useful for debugging (e.g. to start side-effects with tap operator)\n\nExamples\n\nusing Rocket\n\nsource = from([ 0, 1, 2 ])\nactor = VoidActor{Int}()\n\nsubscribe!(source, actor)\n;\n\n# output\n\n\nSee also: Actor, void, tap\n\n\n\n\n\n","category":"type"},{"location":"observables/types/proxy/#observable_proxy","page":"Proxy","title":"Proxy Observable","text":"","category":"section"},{"location":"observables/types/proxy/","page":"Proxy","title":"Proxy","text":"ProxyObservable might help to create a custom operator. It wraps either source and/or actor with their proxied versions providing additional custom logic for on_subscribe! and/or for on_next!, on_error!, on_complete! methods.","category":"page"},{"location":"observables/types/proxy/","page":"Proxy","title":"Proxy","text":"proxy\nProxyObservable","category":"page"},{"location":"observables/types/proxy/#Rocket.proxy","page":"Proxy","title":"Rocket.proxy","text":"proxy(::Type{L}, source, proxy) where L\n\nCreation operator for the ProxyObservable with a given source and proxy objects.\n\nExample\n\nusing Rocket\n\nsource = from(1:5)\n\nstruct MyCustomProxy <: ActorProxy end\n\nstruct MyCustomActor{A} <: Actor{Int}\n actor :: A\nend\n\nRocket.on_next!(actor::MyCustomActor, data::Int) = next!(actor.actor, data ^ 2)\nRocket.on_error!(actor::MyCustomActor, err) = error!(actor.actor, err)\nRocket.on_complete!(actor::MyCustomActor) = complete!(actor.actor)\n\nRocket.actor_proxy!(::Type{Int}, proxy::MyCustomProxy, actor::A) where A = MyCustomActor{A}(actor)\n\nproxied = proxy(Int, source, MyCustomProxy())\n\nsubscribe!(proxied, logger())\n;\n\n# output\n\n[LogActor] Data: 1\n[LogActor] Data: 4\n[LogActor] Data: 9\n[LogActor] Data: 16\n[LogActor] Data: 25\n[LogActor] Completed\n\nSee also: ProxyObservable, ActorProxy, SourceProxy, ActorSourceProxy\n\n\n\n\n\n","category":"function"},{"location":"observables/types/proxy/#Rocket.ProxyObservable","page":"Proxy","title":"Rocket.ProxyObservable","text":"ProxyObservable{L, S, P}(proxied_source::S, proxy::P)\n\nAn interface for proxied Observables.\n\nSee also: proxy\n\n\n\n\n\n","category":"type"},{"location":"observables/types/proxy/","page":"Proxy","title":"Proxy","text":"ActorProxy\nSourceProxy\nActorSourceProxy","category":"page"},{"location":"observables/types/proxy/#Rocket.ActorProxy","page":"Proxy","title":"Rocket.ActorProxy","text":"ActorProxy\n\nCan be used as a super type for common proxy object. Automatically specifies ValidActorProxy trait behavior. Each ActorProxy must implement its own method for actor_proxy!(::Type, proxy, actor) function which have to return a valid actor object.\n\nSee also: proxy, actor_proxy!\n\n\n\n\n\n","category":"type"},{"location":"observables/types/proxy/#Rocket.SourceProxy","page":"Proxy","title":"Rocket.SourceProxy","text":"SourceProxy\n\nCan be used as a super type for common proxy object. Automatically specifies ValidSourceProxy trait behavior. Each SourceProxy must implement its own method for source_proxy!(::Type, proxy, source) function which have to return a valid subscribable object.\n\nSee also: proxy, source_proxy!\n\n\n\n\n\n","category":"type"},{"location":"observables/types/proxy/#Rocket.ActorSourceProxy","page":"Proxy","title":"Rocket.ActorSourceProxy","text":"ActorSourceProxy\n\nCan be used as a super type for common proxy object. Automatically specifies ValidActorSourceProxy trait behavior. Each ActorSourceProxy must implement its own method for source_proxy!(::Type, proxy, source) function which have to return a valid subscribable object and also for actor_proxy!(::Type, proxy, actor) function which have to return a valid actor object..\n\nSee also: proxy, actor_proxy!, source_proxy!\n\n\n\n\n\n","category":"type"},{"location":"observables/types/proxy/","page":"Proxy","title":"Proxy","text":"actor_proxy!\nsource_proxy!","category":"page"},{"location":"observables/types/proxy/#Rocket.actor_proxy!","page":"Proxy","title":"Rocket.actor_proxy!","text":"actor_proxy!(::Type, proxy, actor)\n\nThis is function is used to wrap an actor with its proxied version given a particular proxy object. Must return another actor. Each valid ActorProxy and ActorSourceProxy must implement its own method for actor_proxy! function. The first argument is the same as the type of data of the connected proxy observable.\n\nSee also: proxy, ActorProxy, ActorSourceProxy\n\n\n\n\n\n","category":"function"},{"location":"observables/types/proxy/#Rocket.source_proxy!","page":"Proxy","title":"Rocket.source_proxy!","text":"source_proxy!(::Type, proxy, source)\n\nThis is function is used to wrap a source with its proxied version given a particular proxy object. Must return another Observable. Each valid SourceProxy and ActorSourceProxy must implement its own method for source_proxy! function. The first argument is the same as the type of data of the connected proxy observable.\n\nSee also: proxy, SourceProxy, ActorSourceProxy\n\n\n\n\n\n","category":"function"},{"location":"operators/transformation/to_array/#operator_to_array","page":"to_array","title":"Uppercase Operator","text":"","category":"section"},{"location":"operators/transformation/to_array/","page":"to_array","title":"to_array","text":"to_array","category":"page"},{"location":"operators/transformation/to_array/#Rocket.to_array","page":"to_array","title":"Rocket.to_array","text":"to_array()\n\nCreates a to_array operator, which reduces all values into a single array and returns this result when the source completes.\n\nProducing\n\nStream of type <: Subscribable{Vector{L}} where L refers to type of source stream\n\nExamples\n\nusing Rocket\n\nsource = from([ 1, 2, 3 ])\nsubscribe!(source |> to_array(), logger())\n;\n\n# output\n\n[LogActor] Data: [1, 2, 3]\n[LogActor] Completed\n\n\nSee also: AbstractOperator, InferableOperator, ProxyObservable, logger\n\n\n\n\n\n","category":"function"},{"location":"operators/transformation/to_array/#See-also","page":"to_array","title":"See also","text":"","category":"section"},{"location":"operators/transformation/to_array/","page":"to_array","title":"to_array","text":"Operators, map, lowercase","category":"page"},{"location":"operators/transformation/about/#Transformation-category","page":"About transformation operators","title":"Transformation category","text":"","category":"section"},{"location":"operators/transformation/about/","page":"About transformation operators","title":"About transformation operators","text":"There are operators for different purposes, and they may be categorized as: creation, transformation, filtering, joining, multicasting, error handling, utility, etc. In the following list you will find all the operators organized in transformation category.","category":"page"},{"location":"operators/transformation/about/","page":"About transformation operators","title":"About transformation operators","text":"map\nmap_to\nscan\naccumulated\nenumerate\nuppercase\nlowercase\nto_array\nswitch_map\nswitch_map_to\nmerge_map\nconcat_map\nconcat_map_to\nexhaust_map\nstart_with\npairwise\nsubstitute\noverride","category":"page"},{"location":"operators/transformation/about/#See-also","page":"About transformation operators","title":"See also","text":"","category":"section"},{"location":"operators/transformation/about/","page":"About transformation operators","title":"About transformation operators","text":"Operators","category":"page"}] +} diff --git a/v1.8.0/siteinfo.js b/v1.8.0/siteinfo.js new file mode 100644 index 000000000..a76653a2b --- /dev/null +++ b/v1.8.0/siteinfo.js @@ -0,0 +1 @@ +var DOCUMENTER_CURRENT_VERSION = "v1.8.0"; diff --git a/v1.8.0/subjects/about/index.html b/v1.8.0/subjects/about/index.html new file mode 100644 index 000000000..28cb3ba05 --- /dev/null +++ b/v1.8.0/subjects/about/index.html @@ -0,0 +1,86 @@ + +Subject · Rocket.jl

      About subjects

      A Rocket.jl Subject is a special type of Observable that allows values to be multicasted to many Actors. While plain Observables are unicast (each subscribed Actor owns an independent execution of the Observable), Subjects are multicast.

      Note

      A Subject is like an Observable, but can multicast to many Actors. Subjects are like event emitters: they maintain a registry of many listeners.

      Every Subject is an Observable. Given a Subject, you can subscribe to it, providing an Actor, which will start receiving values normally. From the perspective of the Actor, it cannot tell whether the Observable execution is coming from a plain unicast Observable or a Subject.

      Internally to the Subject, subscribe! does not invoke a new execution that delivers values. Instead, it simply registers the given Actor in a list of Actors.

      Every Subject is an Actor itself. It is an object with the methods next!, error!, and complete!. Call next!(subject, theValue) to feed a new value to the Subject, and it will be multicasted to the Actors that listen to the Subject.

      In the example below, we have two Observers attached to a Subject, and we feed some values to the Subject:

      using Rocket
      +
      +source = Subject(Int)
      +
      +subscription1 = subscribe!(source, lambda(
      +    on_next = (d) -> println("Actor 1: $d")
      +))
      +
      +subscription2 = subscribe!(source, lambda(
      +    on_next = (d) -> println("Actor 2: $d")
      +))
      +
      +next!(source, 0)
      +
      +# Logs
      +# Actor 1: 0
      +# Actor 2: 0
      +
      +unsubscribe!(subscription1)
      +unsubscribe!(subscription2)
      +

      Since a Subject is an actor, this also means you may provide a Subject as the argument to the subscribe of any Observable:

      using Rocket
      +
      +source = Subject(Int)
      +
      +subscription1 = subscribe!(source, lambda(
      +    on_next = (d) -> println("Actor 1: $d")
      +))
      +
      +subscription2 = subscribe!(source, lambda(
      +    on_next = (d) -> println("Actor 2: $d")
      +))
      +
      +other_source = from([ 1, 2, 3 ])
      +subscribe!(other_source, source);
      +
      +# Logs
      +# Actor 1: 1
      +# Actor 2: 1
      +# Actor 1: 2
      +# Actor 2: 2
      +# Actor 1: 3
      +# Actor 2: 3

      Here, we essentially convert a unicast Observable execution to multicast, through the Subject. This demonstrates how Subjects offer a unique way to share Observable execution with multiple Observers.

      Schedulers

      A Subject (and some other observables) uses scheduler objects to schedule message delivery to their listeners.

      Synchronous scheduler

      One of the variants of schedulers is the AsapScheduler, which delivers every message synchronously. AsapScheduler is a default scheduler for all Subject objects.

      Rocket.AsapSchedulerType
      AsapScheduler

      AsapScheduler executes scheduled actions as soon as possible and does not introduce any additional logic. AsapScheduler is a default scheduler for almost all observables.

      source
      using Rocket
      +
      +subject = Subject(Int, scheduler = AsapScheduler())
      +
      +subscription1 = subscribe!(subject, logger("Actor 1"))
      +
      +println("Before next")
      +next!(subject, 1)
      +next!(subject, 2)
      +println("After next")
      +
      +subscription2 = subscribe!(subject, logger("Actor 2"))
      +
      +next!(subject, 3)
      +
      +# Logs
      +# Before next
      +# [Actor 1] Data: 1
      +# [Actor 1] Data: 2
      +# After next
      +# [Actor 1] Data: 3
      +# [Actor 2] Data: 3

      Asynchronous Scheduler

      An AsyncScheduler is similar to a AsapScheduler. Both allows for Subject to scheduler their messages for multiple listeners, but a AsyncScheduler delivers all messages asynchronously (but still ordered) using a Julia's built-in Task object.

      Rocket.AsyncSchedulerType
      AsyncScheduler

      AsyncScheduler executes scheduled actions asynchronously and uses Channel object to order different actions on a single asynchronous task

      source
      using Rocket
      +
      +subject = Subject(Int, scheduler = AsyncScheduler())
      +
      +subscription1 = subscribe!(subject, logger("Actor 1"))
      +
      +println("Before next")
      +next!(subject, 1)
      +next!(subject, 2)
      +println("After next")
      +
      +subscription2 = subscribe!(subject, logger("Actor 2"))
      +
      +next!(subject, 3)
      +
      +# Logs
      +# Before next
      +# After next
      +# [Actor 1] Data: 1
      +# [Actor 1] Data: 2
      +# [Actor 1] Data: 3
      +# [Actor 2] Data: 3
      +
      diff --git a/v1.8.0/subjects/types/behavior/index.html b/v1.8.0/subjects/types/behavior/index.html new file mode 100644 index 000000000..798a02a32 --- /dev/null +++ b/v1.8.0/subjects/types/behavior/index.html @@ -0,0 +1,28 @@ + +Behavior · Rocket.jl

      BehaviorSubject

      Rocket.BehaviorSubjectFunction
      BehaviorSubject(value::D) where D
      +BehaviorSubject(::Type{D}, value) where D
      +BehaviorSubject(::Type{D}, value, factory::F) where { D, F <: AbstractSubjectFactory }
      +BehaviorSubject(::Type{D}, value, subject::S) where { D, S }

      A variant of Subject that requires an initial value and emits its current value whenever it is subscribed to.

      See also: BehaviorSubjectFactory, Subject, SubjectFactory

      source

      Description

      One of the variants of Subjects is the BehaviorSubject, which has a notion of "the current value". It stores the latest value emitted to its consumers, and whenever a new Observer subscribes, it will immediately receive the "current value" from the BehaviorSubject.

      Note

      BehaviorSubjects are useful for representing "values over time". For instance, an event stream of birthdays is a Subject, but the stream of a person's age would be a BehaviorSubject.

      Examples

      In the following example, the BehaviorSubject is initialized with the value 0 which the first Observer receives when it subscribes. The second Observer receives the value 2 even though it subscribed after the value 2 was sent.

      using Rocket
      +
      +subject = BehaviorSubject(Int, 0)
      +
      +subscription1 = subscribe!(subject, logger("1"))
      +
      +next!(subject, 1)
      +next!(subject, 2)
      +
      +subscription2 = subscribe!(subject, logger("2"))
      +
      +next!(subject, 3)
      +
      +unsubscribe!(subscription1)
      +unsubscribe!(subscription2)
      +
      +// Logs
      +// [1] Data: 0
      +// [1] Data: 1
      +// [1] Data: 2
      +// [2] Data: 2
      +// [1] Data: 3
      +// [2] Data: 3
      diff --git a/v1.8.0/subjects/types/pending/index.html b/v1.8.0/subjects/types/pending/index.html new file mode 100644 index 000000000..2d347cdd1 --- /dev/null +++ b/v1.8.0/subjects/types/pending/index.html @@ -0,0 +1,27 @@ + +Pending · Rocket.jl

      PendingSubject

      Rocket.PendingSubjectFunction
      PendingSubject(::Type{D}) where D
      +PendingSubject(::Type{D}, factory::F) where { D, F <: AbstractFactory }
      +PendingSubject(::Type{D}, subject::S) where { D, S }

      A variant of Subject that emits its last value on completion. Reemits last value on further subscriptions and then completes.

      See also: PendingSubjectFactory, Subject, SubjectFactory

      source

      Description

      A variant of Subject that only emits a value when it completes. It will emit its latest value to all its observers on completion. It will reemit its latest value to all new observers on further subscription and then complete. It is not possible to overwrite last value after completion.

      Examples

      using Rocket
      +
      +subject = PendingSubject(Int)
      +
      +subscription1 = subscribe!(subject, logger("1"))
      +
      +next!(subject, 1) # Nothing is logged
      +next!(subject, 2) # Nothing is logged
      +
      +subscription2 = subscribe!(subject, logger("2"))
      +
      +next!(subject, 3) # Nothing is logged
      +
      +complete!(subject)
      +
      +subscription3 = subscribe!(subject, logger("3"))
      +
      +[1] Data: 3
      +[2] Data: 3
      +[1] Completed
      +[2] Completed
      +[3] Data: 3
      +[3] Completed
      diff --git a/v1.8.0/subjects/types/recent/index.html b/v1.8.0/subjects/types/recent/index.html new file mode 100644 index 000000000..bbdfc6ef4 --- /dev/null +++ b/v1.8.0/subjects/types/recent/index.html @@ -0,0 +1,26 @@ + +Recent · Rocket.jl

      RecentSubject

      Rocket.RecentSubjectFunction
      RecentSubject(::Type{D}) where D
      +RecentSubject(::Type{D}, factory::F) where { D, F <: AbstractSubjectFactory }
      +RecentSubject(::Type{D}, subject::S) where { D, S }

      A variant of Subject that emits its recent value whenever it is subscribed to.

      See also: RecentSubjectFactory, Subject, SubjectFactory

      source

      Description

      One of the variants of Subjects is the RecentSubject, which has a notion of "the recent value". It stores the latest value emitted to its consumers, and whenever a new Observer subscribes, it will immediately receive the "recent value" from the RecentSubject.

      Note

      RecentSubjects is a more efficient version of ReplaySubjects with replay size equal to one.

      Examples

      In the following example, after RecentSubject is initialized the first Observer receives nothing when it subscribes. The second Observer receives the value 2 even though it subscribed after the value 2 was sent.

      using Rocket
      +
      +subject = RecentSubject(Int)
      +
      +subscription1 = subscribe!(subject, logger("1"))
      +
      +next!(subject, 1)
      +next!(subject, 2)
      +
      +subscription2 = subscribe!(subject, logger("2"))
      +
      +next!(subject, 3)
      +
      +unsubscribe!(subscription1)
      +unsubscribe!(subscription2)
      +
      +// Logs
      +// [1] Data: 1
      +// [1] Data: 2
      +// [2] Data: 2
      +// [1] Data: 3
      +// [2] Data: 3
      diff --git a/v1.8.0/subjects/types/replay/index.html b/v1.8.0/subjects/types/replay/index.html new file mode 100644 index 000000000..f0cfd11dc --- /dev/null +++ b/v1.8.0/subjects/types/replay/index.html @@ -0,0 +1,32 @@ + +Replay · Rocket.jl

      ReplaySubject

      Rocket.ReplaySubjectFunction
      ReplaySubject(::Type{D}, size::Int) where D
      +ReplaySubject(::Type{D}, size::Int, factory::F) where { D, F <: AbstractSubjectFactory }
      +ReplaySubject(::Type{D}, size::Int, subject::S) where { D, S }

      A variant of Subject that "replays" or emits old values to new subscribers. It buffers a set number of values and will emit those values immediately to any new subscribers in addition to emitting new values to existing subscribers.

      See also: ReplaySubjectFactory, Subject, SubjectFactory

      source

      Description

      A ReplaySubject is similar to a BehaviorSubject in that it can send old values to new subscribers, but it can also record a part of the Observable execution.

      Note

      A ReplaySubject records multiple values from the Observable execution and replays them to new subscribers.

      Examples

      When creating a ReplaySubject, you can specify how many values to replay:

      using Rocket
      +
      +subject = ReplaySubject(Int, 3) # buffer 3 values for new subscribers
      +
      +subscription1 = subscribe!(subject, logger("1"))
      +
      +next!(subject, 1)
      +next!(subject, 2)
      +next!(subject, 3)
      +next!(subject, 4)
      +
      +subscription2 = subscribe!(subject, logger("2"))
      +
      +next!(subject, 5)
      +
      +unsubscribe!(subscription1)
      +unsubscribe!(subscription2)
      +
      +// Logs
      +// [1] Data: 1
      +// [1] Data: 2
      +// [1] Data: 3
      +// [1] Data: 4
      +// [2] Data: 2
      +// [2] Data: 3
      +// [2] Data: 4
      +// [1] Data: 5
      +// [2] Data: 5
      diff --git a/v1.8.0/subjects/types/subject/index.html b/v1.8.0/subjects/types/subject/index.html new file mode 100644 index 000000000..a954e3310 --- /dev/null +++ b/v1.8.0/subjects/types/subject/index.html @@ -0,0 +1,22 @@ + +Subject · Rocket.jl

      Subject

      Rocket.SubjectType
      Subject(::Type{D}; scheduler::H = AsapScheduler())

      A Subject is a special type of Observable that allows values to be multicasted to many Observers. Subjects are like EventEmitters. Every Subject is an Observable and an Actor. You can subscribe to a Subject, and you can call next! to feed values as well as error! and complete!.

      Note: By convention, every actor subscribed to a Subject observable is not allowed to throw exceptions during next!, error! and complete! calls. Doing so would lead to undefined behaviour. Use safe() operator to bypass this rule.

      See also: SubjectFactory, ReplaySubject, BehaviorSubject, safe

      source

      Description

      Every Subject is an Observable. Given a Subject, you can subscribe to it, providing an Actor, which will start receiving values normally. From the perspective of the Observer, it cannot tell whether the Observable execution is coming from a plain unicast Observable or a Subject.

      Internally to the Subject, subscribe does not invoke a new execution that delivers values. It simply registers the given Observer in a list of Observers.

      Every Subject is an Actor. It is an object with the methods next!, error!, and complete!. To feed a new value to the Subject, just call next!(subject, theValue), and it will be multicasted to the Actors registered to listen to the Subject.

      Note

      By convention, every actor subscribed to a Subject observable is not allowed to throw exceptions during next!, error! and complete! calls. Doing so would lead to undefined behaviour. Use safe() operator to bypass this rule.

      Examples

      In the following example, the BehaviorSubject is initialized with the value 0 which the first Observer receives when it subscribes. The second Observer receives the value 2 even though it subscribed after the value 2 was sent.

      using Rocket
      +
      +subject = Subject(Int)
      +
      +subscription1 = subscribe!(subject, logger("1"))
      +
      +next!(subject, 1)
      +next!(subject, 2)
      +
      +subscription2 = subscribe!(subject, logger("2"))
      +
      +next!(subject, 3)
      +
      +unsubscribe!(subscription1)
      +unsubscribe!(subscription2)
      +
      +// Logs
      +// [1] Data: 1
      +// [1] Data: 2
      +// [1] Data: 3
      +// [2] Data: 3
      diff --git a/v1.8.0/teardown/about/index.html b/v1.8.0/teardown/about/index.html new file mode 100644 index 000000000..b46d7fdb7 --- /dev/null +++ b/v1.8.0/teardown/about/index.html @@ -0,0 +1,24 @@ + +Subscription · Rocket.jl

      Subscription

      A Subscription represents a disposable resource, usually the execution of an Observable. A Subscription has one important method: unsubscribe!(teardown), which takes some teardown logic object as one argument and disposes the resource held by the subscription.

      using Rocket
      +
      +source = Subject(Int)
      +
      +next!(source, 0) # Logs nothing as there is no subscribers
      +
      +subscription = subscribe!(source, logger())
      +
      +next!(source, 1) # Logs [LogActor] Data: 1 into standard output
      +
      +unsubscribe!(subscription)
      +
      +next!(source, 2) # Logs nothing as a single one actor has unsubscribed
      Note

      A Subscription essentially just has its own specific method for unsubscribe!() function which releases resources or cancel Observable executions. Any Observable has to return a valid Teardown object.

      The unsubscribe! function also supports multiple unsubscriptions at once. If the input argument to the unsubscribe! function is either a tuple or a vector, it will first check that all of the arguments are valid subscription objects and if this is true it will unsubscribe from each of them individually.

      
      +source = Subject(Int)
      +
      +subscription1 = subscribe!(source, logger())
      +subscription2 = subscribe!(source, logger())
      +
      +unsubscribe!((subscription1, subscription2))
      +
      +# or similarly
      +# unsubscribe!([ subscription1, subscription2 ])
      +

      For more information about subscription and teardown logic see the API Section

      diff --git a/v1.8.0/teardown/types/void/index.html b/v1.8.0/teardown/types/void/index.html new file mode 100644 index 000000000..beb7d1880 --- /dev/null +++ b/v1.8.0/teardown/types/void/index.html @@ -0,0 +1,2 @@ + +Void · Rocket.jl
      diff --git a/v1.8.0/todo/index.html b/v1.8.0/todo/index.html new file mode 100644 index 000000000..6963d0d8b --- /dev/null +++ b/v1.8.0/todo/index.html @@ -0,0 +1,2 @@ + +TODO · Rocket.jl

      TODO

      This package in under development and some features of the reactive framework not yet implemented.

      diff --git a/v1.8.0/utils/index.html b/v1.8.0/utils/index.html new file mode 100644 index 000000000..5aca75a13 --- /dev/null +++ b/v1.8.0/utils/index.html @@ -0,0 +1,20 @@ + +Utils · Rocket.jl

      Utils

      Rocket.setTimeoutFunction
      setTimeout(f::Function, timeout::Int)

      Creates a Task which will asynchornously invoke fucntion f after specified timeout time in milliseconds.

      Arguments

      • f::Function, function to be invoked asynchronously
      • timeout::Int, timeout in milliseconds

      Examples

      using Rocket
      +using Dates
      +
      +println("Before: ", Dates.format(now(), "MM:SS"))
      +setTimeout(1000) do
      +    println("Inside: ", Dates.format(now(), "MM:SS"))
      +end
      +println("Right after: ", Dates.format(now(), "MM:SS"))
      +;
      +
      +# Logs
      +# Before: 20:59
      +# Right after: 20:59
      +# Inside: 21:00
      source
      Rocket.combined_typeFunction
      combined_type(sources)

      Returns a Tuple el-type of observable el-types in sources argument in the same order

      source
      Rocket.union_typeFunction
      union_type(sources)

      Returns a Union el-type of observable el-types in sources argument

      source

      Helpers

      Rocket.@MStorageMacro
      @MStorage(n::Int)

      Helper function to generate tuple-like structure MStorageN, but with mutable fields and empty constructor. It is possible then to take a snapshot(::MStorage) which returns a tuple with the same types and values from storage. Some operators and observables use pregenerated MStorage to instatiate uninitialized mutable storage in case when stream is allowed to not emit any values before completion.

      Generated structure layout

      struct MStorageN{V1, V2, ..., VN}
      +    v1 :: V1
      +    v2 :: V2
      +    ...
      +    vn :: VN
      +end

      See also: setstorage!

      source
      Rocket.setstorage!Function
      setstorage!(s, v, ::Val{I}) where I

      This function can be used to set a new value v for storage s with a given value v and index I. Using parametrized Val{I} for indexing ensures for index to be resolved at compile-time and if-else branch optimization.

      See also: @MStorage

      source
      diff --git a/versions.js b/versions.js index 205b024e6..2a795beb8 100644 --- a/versions.js +++ b/versions.js @@ -1,5 +1,6 @@ var DOC_VERSIONS = [ "stable", + "v1.8", "v1.7", "v1.6", "v1.5", @@ -8,5 +9,5 @@ var DOC_VERSIONS = [ "v1.2", "dev", ]; -var DOCUMENTER_NEWEST = "v1.7.2"; +var DOCUMENTER_NEWEST = "v1.8.0"; var DOCUMENTER_STABLE = "stable";